From 72a58fb36c2680d603009dea8eed22975e06333d Mon Sep 17 00:00:00 2001 From: Mohammed Shahnawaz <97173613+imshn@users.noreply.github.com> Date: Sun, 12 May 2024 12:19:42 +0000 Subject: [PATCH 1/6] Added server file --- app.js | 38 + digital-agency-html-template.jpg | Bin 67517 -> 0 bytes index-2.html | 978 -- index-3.html | 1019 -- node_modules/.bin/mime | 1 + node_modules/.package-lock.json | 1060 ++ .../ckeditor5-adapter-ckfinder/CHANGELOG.md | 161 + .../ckeditor5-adapter-ckfinder/LICENSE.md | 17 + .../ckeditor5-adapter-ckfinder/README.md | 18 + .../build/adapter-ckfinder.js | 4 + .../ckeditor5-metadata.json | 11 + .../ckeditor5-adapter-ckfinder/package.json | 37 + .../src/augmentation.d.ts | 10 + .../src/augmentation.js | 5 + .../ckeditor5-adapter-ckfinder/src/index.d.ts | 9 + .../ckeditor5-adapter-ckfinder/src/index.js | 9 + .../src/uploadadapter.d.ts | 33 + .../src/uploadadapter.js | 138 + .../ckeditor5-adapter-ckfinder/src/utils.d.ts | 18 + .../ckeditor5-adapter-ckfinder/src/utils.js | 58 + .../ckeditor5-autoformat/CHANGELOG.md | 208 + .../@ckeditor/ckeditor5-autoformat/LICENSE.md | 17 + .../@ckeditor/ckeditor5-autoformat/README.md | 20 + .../ckeditor5-autoformat/build/autoformat.js | 5 + .../build/translations/ar.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/es-co.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-metadata.json | 11 + .../ckeditor5-autoformat/lang/contexts.json | 3 + .../lang/translations/ar.po | 22 + .../lang/translations/bg.po | 22 + .../lang/translations/bn.po | 22 + .../lang/translations/ca.po | 22 + .../lang/translations/cs.po | 22 + .../lang/translations/da.po | 22 + .../lang/translations/de.po | 22 + .../lang/translations/el.po | 22 + .../lang/translations/en.po | 22 + .../lang/translations/es-co.po | 22 + .../lang/translations/es.po | 22 + .../lang/translations/et.po | 22 + .../lang/translations/fi.po | 22 + .../lang/translations/fr.po | 22 + .../lang/translations/he.po | 22 + .../lang/translations/hi.po | 22 + .../lang/translations/hr.po | 22 + .../lang/translations/hu.po | 22 + .../lang/translations/id.po | 22 + .../lang/translations/it.po | 22 + .../lang/translations/ja.po | 22 + .../lang/translations/ko.po | 22 + .../lang/translations/lt.po | 22 + .../lang/translations/lv.po | 22 + .../lang/translations/ms.po | 22 + .../lang/translations/nl.po | 22 + .../lang/translations/no.po | 22 + .../lang/translations/pl.po | 22 + .../lang/translations/pt-br.po | 22 + .../lang/translations/pt.po | 22 + .../lang/translations/ro.po | 22 + .../lang/translations/ru.po | 22 + .../lang/translations/sk.po | 22 + .../lang/translations/sr.po | 22 + .../lang/translations/sv.po | 22 + .../lang/translations/th.po | 22 + .../lang/translations/tr.po | 22 + .../lang/translations/uk.po | 22 + .../lang/translations/vi.po | 22 + .../lang/translations/zh-cn.po | 22 + .../lang/translations/zh.po | 22 + .../ckeditor5-autoformat/package.json | 37 + .../src/augmentation.d.ts | 10 + .../ckeditor5-autoformat/src/augmentation.js | 5 + .../ckeditor5-autoformat/src/autoformat.d.ts | 81 + .../ckeditor5-autoformat/src/autoformat.js | 200 + .../src/blockautoformatediting.d.ts | 57 + .../src/blockautoformatediting.js | 137 + .../ckeditor5-autoformat/src/index.d.ts | 9 + .../ckeditor5-autoformat/src/index.js | 9 + .../src/inlineautoformatediting.d.ts | 83 + .../src/inlineautoformatediting.js | 174 + .../ckeditor5-basic-styles/CHANGELOG.md | 247 + .../ckeditor5-basic-styles/LICENSE.md | 17 + .../ckeditor5-basic-styles/README.md | 20 + .../build/basic-styles.js | 5 + .../build/translations/af.js | 1 + .../build/translations/ar.js | 1 + .../build/translations/ast.js | 1 + .../build/translations/az.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/bs.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../build/translations/eo.js | 1 + .../build/translations/es-co.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/eu.js | 1 + .../build/translations/fa.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/gl.js | 1 + .../build/translations/gu.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/hy.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/jv.js | 1 + .../build/translations/km.js | 1 + .../build/translations/kn.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/ku.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/nb.js | 1 + .../build/translations/ne.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/oc.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/si.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sl.js | 1 + .../build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tk.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/tt.js | 1 + .../build/translations/ug.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/ur.js | 1 + .../build/translations/uz.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-metadata.json | 137 + .../ckeditor5-basic-styles/lang/contexts.json | 14 + .../lang/translations/af.po | 66 + .../lang/translations/ar.po | 66 + .../lang/translations/ast.po | 66 + .../lang/translations/az.po | 66 + .../lang/translations/bg.po | 66 + .../lang/translations/bn.po | 66 + .../lang/translations/bs.po | 66 + .../lang/translations/ca.po | 66 + .../lang/translations/cs.po | 66 + .../lang/translations/da.po | 66 + .../lang/translations/de-ch.po | 66 + .../lang/translations/de.po | 66 + .../lang/translations/el.po | 66 + .../lang/translations/en-au.po | 66 + .../lang/translations/en-gb.po | 66 + .../lang/translations/en.po | 66 + .../lang/translations/eo.po | 66 + .../lang/translations/es-co.po | 66 + .../lang/translations/es.po | 66 + .../lang/translations/et.po | 66 + .../lang/translations/eu.po | 66 + .../lang/translations/fa.po | 66 + .../lang/translations/fi.po | 66 + .../lang/translations/fr.po | 66 + .../lang/translations/gl.po | 66 + .../lang/translations/gu.po | 66 + .../lang/translations/he.po | 66 + .../lang/translations/hi.po | 66 + .../lang/translations/hr.po | 66 + .../lang/translations/hu.po | 66 + .../lang/translations/hy.po | 66 + .../lang/translations/id.po | 66 + .../lang/translations/it.po | 66 + .../lang/translations/ja.po | 66 + .../lang/translations/jv.po | 66 + .../lang/translations/km.po | 66 + .../lang/translations/kn.po | 66 + .../lang/translations/ko.po | 66 + .../lang/translations/ku.po | 66 + .../lang/translations/lt.po | 66 + .../lang/translations/lv.po | 66 + .../lang/translations/ms.po | 66 + .../lang/translations/nb.po | 66 + .../lang/translations/ne.po | 66 + .../lang/translations/nl.po | 66 + .../lang/translations/no.po | 66 + .../lang/translations/oc.po | 66 + .../lang/translations/pl.po | 66 + .../lang/translations/pt-br.po | 66 + .../lang/translations/pt.po | 66 + .../lang/translations/ro.po | 66 + .../lang/translations/ru.po | 66 + .../lang/translations/si.po | 66 + .../lang/translations/sk.po | 66 + .../lang/translations/sl.po | 66 + .../lang/translations/sq.po | 66 + .../lang/translations/sr-latn.po | 66 + .../lang/translations/sr.po | 66 + .../lang/translations/sv.po | 66 + .../lang/translations/th.po | 66 + .../lang/translations/tk.po | 66 + .../lang/translations/tr.po | 66 + .../lang/translations/tt.po | 66 + .../lang/translations/ug.po | 66 + .../lang/translations/uk.po | 66 + .../lang/translations/ur.po | 66 + .../lang/translations/uz.po | 66 + .../lang/translations/vi.po | 66 + .../lang/translations/zh-cn.po | 66 + .../lang/translations/zh.po | 66 + .../ckeditor5-basic-styles/package.json | 37 + .../src/attributecommand.d.ts | 74 + .../src/attributecommand.js | 105 + .../src/augmentation.d.ts | 40 + .../src/augmentation.js | 5 + .../ckeditor5-basic-styles/src/bold.d.ts | 29 + .../ckeditor5-basic-styles/src/bold.js | 33 + .../src/bold/boldediting.d.ts | 24 + .../src/bold/boldediting.js | 72 + .../src/bold/boldui.d.ts | 21 + .../ckeditor5-basic-styles/src/bold/boldui.js | 50 + .../ckeditor5-basic-styles/src/code.d.ts | 30 + .../ckeditor5-basic-styles/src/code.js | 34 + .../src/code/codeediting.d.ts | 29 + .../src/code/codeediting.js | 72 + .../src/code/codeui.d.ts | 22 + .../ckeditor5-basic-styles/src/code/codeui.js | 52 + .../ckeditor5-basic-styles/src/index.d.ts | 30 + .../ckeditor5-basic-styles/src/index.js | 29 + .../ckeditor5-basic-styles/src/italic.d.ts | 29 + .../ckeditor5-basic-styles/src/italic.js | 33 + .../src/italic/italicediting.d.ts | 24 + .../src/italic/italicediting.js | 62 + .../src/italic/italicui.d.ts | 21 + .../src/italic/italicui.js | 51 + .../src/strikethrough.d.ts | 29 + .../src/strikethrough.js | 33 + .../strikethrough/strikethroughediting.d.ts | 25 + .../src/strikethrough/strikethroughediting.js | 64 + .../src/strikethrough/strikethroughui.d.ts | 21 + .../src/strikethrough/strikethroughui.js | 52 + .../ckeditor5-basic-styles/src/subscript.d.ts | 26 + .../ckeditor5-basic-styles/src/subscript.js | 30 + .../src/subscript/subscriptediting.d.ts | 24 + .../src/subscript/subscriptediting.js | 50 + .../src/subscript/subscriptui.d.ts | 21 + .../src/subscript/subscriptui.js | 51 + .../src/superscript.d.ts | 26 + .../ckeditor5-basic-styles/src/superscript.js | 30 + .../src/superscript/superscriptediting.d.ts | 24 + .../src/superscript/superscriptediting.js | 50 + .../src/superscript/superscriptui.d.ts | 21 + .../src/superscript/superscriptui.js | 51 + .../ckeditor5-basic-styles/src/underline.d.ts | 29 + .../ckeditor5-basic-styles/src/underline.js | 33 + .../src/underline/underlineediting.d.ts | 24 + .../src/underline/underlineediting.js | 59 + .../src/underline/underlineui.d.ts | 21 + .../src/underline/underlineui.js | 51 + .../ckeditor5-basic-styles/src/utils.d.ts | 20 + .../ckeditor5-basic-styles/src/utils.js | 26 + .../ckeditor5-basic-styles/theme/code.css | 14 + .../theme/icons/code.svg | 1 + .../theme/icons/italic.svg | 1 + .../theme/icons/strikethrough.svg | 1 + .../theme/icons/subscript.svg | 1 + .../theme/icons/superscript.svg | 1 + .../theme/icons/underline.svg | 1 + .../ckeditor5-block-quote/CHANGELOG.md | 204 + .../ckeditor5-block-quote/LICENSE.md | 17 + .../@ckeditor/ckeditor5-block-quote/README.md | 20 + .../build/block-quote.js | 5 + .../build/translations/af.js | 1 + .../build/translations/ar.js | 1 + .../build/translations/az.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/bs.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../build/translations/es-co.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/eu.js | 1 + .../build/translations/fa.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/gl.js | 1 + .../build/translations/gu.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/km.js | 1 + .../build/translations/kn.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/ku.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/nb.js | 1 + .../build/translations/ne.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sl.js | 1 + .../build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tk.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/ug.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/ur.js | 1 + .../build/translations/uz.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-metadata.json | 23 + .../ckeditor5-block-quote/lang/contexts.json | 3 + .../lang/translations/af.po | 22 + .../lang/translations/ar.po | 22 + .../lang/translations/az.po | 22 + .../lang/translations/bg.po | 22 + .../lang/translations/bn.po | 22 + .../lang/translations/bs.po | 22 + .../lang/translations/ca.po | 22 + .../lang/translations/cs.po | 22 + .../lang/translations/da.po | 22 + .../lang/translations/de-ch.po | 22 + .../lang/translations/de.po | 22 + .../lang/translations/el.po | 22 + .../lang/translations/en-au.po | 22 + .../lang/translations/en-gb.po | 22 + .../lang/translations/en.po | 22 + .../lang/translations/es-co.po | 22 + .../lang/translations/es.po | 22 + .../lang/translations/et.po | 22 + .../lang/translations/eu.po | 22 + .../lang/translations/fa.po | 22 + .../lang/translations/fi.po | 22 + .../lang/translations/fr.po | 22 + .../lang/translations/gl.po | 22 + .../lang/translations/gu.po | 22 + .../lang/translations/he.po | 22 + .../lang/translations/hi.po | 22 + .../lang/translations/hr.po | 22 + .../lang/translations/hu.po | 22 + .../lang/translations/id.po | 22 + .../lang/translations/it.po | 22 + .../lang/translations/ja.po | 22 + .../lang/translations/km.po | 22 + .../lang/translations/kn.po | 22 + .../lang/translations/ko.po | 22 + .../lang/translations/ku.po | 22 + .../lang/translations/lt.po | 22 + .../lang/translations/lv.po | 22 + .../lang/translations/ms.po | 22 + .../lang/translations/nb.po | 22 + .../lang/translations/ne.po | 22 + .../lang/translations/nl.po | 22 + .../lang/translations/no.po | 22 + .../lang/translations/pl.po | 22 + .../lang/translations/pt-br.po | 22 + .../lang/translations/pt.po | 22 + .../lang/translations/ro.po | 22 + .../lang/translations/ru.po | 22 + .../lang/translations/sk.po | 22 + .../lang/translations/sl.po | 22 + .../lang/translations/sq.po | 22 + .../lang/translations/sr-latn.po | 22 + .../lang/translations/sr.po | 22 + .../lang/translations/sv.po | 22 + .../lang/translations/th.po | 22 + .../lang/translations/tk.po | 22 + .../lang/translations/tr.po | 22 + .../lang/translations/ug.po | 22 + .../lang/translations/uk.po | 22 + .../lang/translations/ur.po | 22 + .../lang/translations/uz.po | 22 + .../lang/translations/vi.po | 22 + .../lang/translations/zh-cn.po | 22 + .../lang/translations/zh.po | 22 + .../ckeditor5-block-quote/package.json | 37 + .../src/augmentation.d.ts | 15 + .../ckeditor5-block-quote/src/augmentation.js | 5 + .../ckeditor5-block-quote/src/blockquote.d.ts | 30 + .../ckeditor5-block-quote/src/blockquote.js | 34 + .../src/blockquotecommand.d.ts | 61 + .../src/blockquotecommand.js | 172 + .../src/blockquoteediting.d.ts | 31 + .../src/blockquoteediting.js | 118 + .../src/blockquoteui.d.ts | 30 + .../ckeditor5-block-quote/src/blockquoteui.js | 64 + .../ckeditor5-block-quote/src/index.d.ts | 12 + .../ckeditor5-block-quote/src/index.js | 11 + .../theme/blockquote.css | 23 + .../ckeditor5-build-classic/CHANGELOG.md | 1058 ++ .../ckeditor5-build-classic/LICENSE.md | 21 + .../ckeditor5-build-classic/README.md | 70 + .../build/ckeditor.d.ts | 39 + .../ckeditor5-build-classic/build/ckeditor.js | 7 + .../build/ckeditor.js.map | 1 + .../build/translations/af.js | 1 + .../build/translations/ar.js | 1 + .../build/translations/ast.js | 1 + .../build/translations/az.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/bs.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../build/translations/eo.js | 1 + .../build/translations/es-co.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/eu.js | 1 + .../build/translations/fa.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/gl.js | 1 + .../build/translations/gu.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/hy.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/jv.js | 1 + .../build/translations/km.js | 1 + .../build/translations/kn.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/ku.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/nb.js | 1 + .../build/translations/ne.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/oc.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/si.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sl.js | 1 + .../build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tk.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/tt.js | 1 + .../build/translations/ug.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/ur.js | 1 + .../build/translations/uz.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-build-classic/package.json | 61 + .../@ckeditor/ckeditor5-ckbox/CHANGELOG.md | 4 + .../@ckeditor/ckeditor5-ckbox/LICENSE.md | 21 + .../@ckeditor/ckeditor5-ckbox/README.md | 18 + .../@ckeditor/ckeditor5-ckbox/build/ckbox.js | 5 + .../ckeditor5-ckbox/build/translations/ar.js | 1 + .../ckeditor5-ckbox/build/translations/az.js | 1 + .../ckeditor5-ckbox/build/translations/bg.js | 1 + .../ckeditor5-ckbox/build/translations/bn.js | 1 + .../ckeditor5-ckbox/build/translations/ca.js | 1 + .../ckeditor5-ckbox/build/translations/cs.js | 1 + .../ckeditor5-ckbox/build/translations/da.js | 1 + .../ckeditor5-ckbox/build/translations/de.js | 1 + .../ckeditor5-ckbox/build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/es-co.js | 1 + .../ckeditor5-ckbox/build/translations/es.js | 1 + .../ckeditor5-ckbox/build/translations/et.js | 1 + .../ckeditor5-ckbox/build/translations/fa.js | 1 + .../ckeditor5-ckbox/build/translations/fi.js | 1 + .../ckeditor5-ckbox/build/translations/fr.js | 1 + .../ckeditor5-ckbox/build/translations/gl.js | 1 + .../ckeditor5-ckbox/build/translations/he.js | 1 + .../ckeditor5-ckbox/build/translations/hi.js | 1 + .../ckeditor5-ckbox/build/translations/hr.js | 1 + .../ckeditor5-ckbox/build/translations/hu.js | 1 + .../ckeditor5-ckbox/build/translations/id.js | 1 + .../ckeditor5-ckbox/build/translations/it.js | 1 + .../ckeditor5-ckbox/build/translations/ja.js | 1 + .../ckeditor5-ckbox/build/translations/ko.js | 1 + .../ckeditor5-ckbox/build/translations/lt.js | 1 + .../ckeditor5-ckbox/build/translations/lv.js | 1 + .../ckeditor5-ckbox/build/translations/ms.js | 1 + .../ckeditor5-ckbox/build/translations/nl.js | 1 + .../ckeditor5-ckbox/build/translations/no.js | 1 + .../ckeditor5-ckbox/build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../ckeditor5-ckbox/build/translations/pt.js | 1 + .../ckeditor5-ckbox/build/translations/ro.js | 1 + .../ckeditor5-ckbox/build/translations/ru.js | 1 + .../ckeditor5-ckbox/build/translations/sk.js | 1 + .../ckeditor5-ckbox/build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../ckeditor5-ckbox/build/translations/sr.js | 1 + .../ckeditor5-ckbox/build/translations/sv.js | 1 + .../ckeditor5-ckbox/build/translations/th.js | 1 + .../ckeditor5-ckbox/build/translations/tr.js | 1 + .../ckeditor5-ckbox/build/translations/ug.js | 1 + .../ckeditor5-ckbox/build/translations/uk.js | 1 + .../ckeditor5-ckbox/build/translations/ur.js | 1 + .../ckeditor5-ckbox/build/translations/uz.js | 1 + .../ckeditor5-ckbox/build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../ckeditor5-ckbox/build/translations/zh.js | 1 + .../ckeditor5-ckbox/ckeditor5-metadata.json | 58 + .../ckeditor5-ckbox/lang/contexts.json | 9 + .../ckeditor5-ckbox/lang/translations/ar.po | 46 + .../ckeditor5-ckbox/lang/translations/az.po | 46 + .../ckeditor5-ckbox/lang/translations/bg.po | 46 + .../ckeditor5-ckbox/lang/translations/bn.po | 46 + .../ckeditor5-ckbox/lang/translations/ca.po | 46 + .../ckeditor5-ckbox/lang/translations/cs.po | 46 + .../ckeditor5-ckbox/lang/translations/da.po | 46 + .../ckeditor5-ckbox/lang/translations/de.po | 46 + .../ckeditor5-ckbox/lang/translations/el.po | 46 + .../lang/translations/en-au.po | 46 + .../ckeditor5-ckbox/lang/translations/en.po | 46 + .../lang/translations/es-co.po | 46 + .../ckeditor5-ckbox/lang/translations/es.po | 46 + .../ckeditor5-ckbox/lang/translations/et.po | 46 + .../ckeditor5-ckbox/lang/translations/fa.po | 46 + .../ckeditor5-ckbox/lang/translations/fi.po | 46 + .../ckeditor5-ckbox/lang/translations/fr.po | 46 + .../ckeditor5-ckbox/lang/translations/gl.po | 46 + .../ckeditor5-ckbox/lang/translations/he.po | 46 + .../ckeditor5-ckbox/lang/translations/hi.po | 46 + .../ckeditor5-ckbox/lang/translations/hr.po | 46 + .../ckeditor5-ckbox/lang/translations/hu.po | 46 + .../ckeditor5-ckbox/lang/translations/id.po | 46 + .../ckeditor5-ckbox/lang/translations/it.po | 46 + .../ckeditor5-ckbox/lang/translations/ja.po | 46 + .../ckeditor5-ckbox/lang/translations/ko.po | 46 + .../ckeditor5-ckbox/lang/translations/lt.po | 46 + .../ckeditor5-ckbox/lang/translations/lv.po | 46 + .../ckeditor5-ckbox/lang/translations/ms.po | 46 + .../ckeditor5-ckbox/lang/translations/nl.po | 46 + .../ckeditor5-ckbox/lang/translations/no.po | 46 + .../ckeditor5-ckbox/lang/translations/pl.po | 46 + .../lang/translations/pt-br.po | 46 + .../ckeditor5-ckbox/lang/translations/pt.po | 46 + .../ckeditor5-ckbox/lang/translations/ro.po | 46 + .../ckeditor5-ckbox/lang/translations/ru.po | 46 + .../ckeditor5-ckbox/lang/translations/sk.po | 46 + .../ckeditor5-ckbox/lang/translations/sq.po | 46 + .../lang/translations/sr-latn.po | 46 + .../ckeditor5-ckbox/lang/translations/sr.po | 46 + .../ckeditor5-ckbox/lang/translations/sv.po | 46 + .../ckeditor5-ckbox/lang/translations/th.po | 46 + .../ckeditor5-ckbox/lang/translations/tr.po | 46 + .../ckeditor5-ckbox/lang/translations/ug.po | 46 + .../ckeditor5-ckbox/lang/translations/uk.po | 46 + .../ckeditor5-ckbox/lang/translations/ur.po | 46 + .../ckeditor5-ckbox/lang/translations/uz.po | 46 + .../ckeditor5-ckbox/lang/translations/vi.po | 46 + .../lang/translations/zh-cn.po | 46 + .../ckeditor5-ckbox/lang/translations/zh.po | 46 + .../@ckeditor/ckeditor5-ckbox/package.json | 39 + .../ckeditor5-ckbox/src/augmentation.d.ts | 32 + .../ckeditor5-ckbox/src/augmentation.js | 5 + .../@ckeditor/ckeditor5-ckbox/src/ckbox.d.ts | 33 + .../@ckeditor/ckeditor5-ckbox/src/ckbox.js | 37 + .../ckeditor5-ckbox/src/ckboxcommand.d.ts | 114 + .../ckeditor5-ckbox/src/ckboxcommand.js | 332 + .../ckeditor5-ckbox/src/ckboxconfig.d.ts | 325 + .../ckeditor5-ckbox/src/ckboxconfig.js | 5 + .../ckeditor5-ckbox/src/ckboxediting.d.ts | 54 + .../ckeditor5-ckbox/src/ckboxediting.js | 341 + .../ckeditor5-ckbox/src/ckboximageedit.d.ts | 24 + .../ckeditor5-ckbox/src/ckboximageedit.js | 28 + .../ckboximageedit/ckboximageeditcommand.d.ts | 97 + .../ckboximageedit/ckboximageeditcommand.js | 299 + .../ckboximageedit/ckboximageeditediting.d.ts | 28 + .../ckboximageedit/ckboximageeditediting.js | 36 + .../src/ckboximageedit/ckboximageeditui.d.ts | 24 + .../src/ckboximageedit/ckboximageeditui.js | 48 + .../src/ckboximageedit/utils.d.ts | 10 + .../src/ckboximageedit/utils.js | 48 + .../ckeditor5-ckbox/src/ckboxui.d.ts | 25 + .../@ckeditor/ckeditor5-ckbox/src/ckboxui.js | 85 + .../src/ckboxuploadadapter.d.ts | 33 + .../ckeditor5-ckbox/src/ckboxuploadadapter.js | 130 + .../ckeditor5-ckbox/src/ckboxutils.d.ts | 50 + .../ckeditor5-ckbox/src/ckboxutils.js | 183 + .../@ckeditor/ckeditor5-ckbox/src/index.d.ts | 17 + .../@ckeditor/ckeditor5-ckbox/src/index.js | 14 + .../@ckeditor/ckeditor5-ckbox/src/utils.d.ts | 63 + .../@ckeditor/ckeditor5-ckbox/src/utils.js | 175 + .../ckeditor5-ckbox/theme/ckboximageedit.css | 53 + .../theme/icons/ckbox-image-edit.svg | 1 + .../@ckeditor/ckeditor5-ckfinder/CHANGELOG.md | 95 + .../@ckeditor/ckeditor5-ckfinder/LICENSE.md | 17 + .../@ckeditor/ckeditor5-ckfinder/README.md | 18 + .../ckeditor5-ckfinder/build/ckfinder.js | 5 + .../build/translations/af.js | 1 + .../build/translations/ar.js | 1 + .../build/translations/az.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/bs.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../build/translations/es-co.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/fa.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/gl.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/jv.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/ku.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/ne.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sl.js | 1 + .../build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tk.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/ug.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/ur.js | 1 + .../build/translations/uz.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-metadata.json | 26 + .../ckeditor5-ckfinder/lang/contexts.json | 8 + .../lang/translations/af.po | 42 + .../lang/translations/ar.po | 42 + .../lang/translations/az.po | 42 + .../lang/translations/bg.po | 42 + .../lang/translations/bn.po | 42 + .../lang/translations/bs.po | 42 + .../lang/translations/ca.po | 42 + .../lang/translations/cs.po | 42 + .../lang/translations/da.po | 42 + .../lang/translations/de-ch.po | 42 + .../lang/translations/de.po | 42 + .../lang/translations/el.po | 42 + .../lang/translations/en-au.po | 42 + .../lang/translations/en-gb.po | 42 + .../lang/translations/en.po | 42 + .../lang/translations/es-co.po | 42 + .../lang/translations/es.po | 42 + .../lang/translations/et.po | 42 + .../lang/translations/fa.po | 42 + .../lang/translations/fi.po | 42 + .../lang/translations/fr.po | 42 + .../lang/translations/gl.po | 42 + .../lang/translations/he.po | 42 + .../lang/translations/hi.po | 42 + .../lang/translations/hr.po | 42 + .../lang/translations/hu.po | 42 + .../lang/translations/id.po | 42 + .../lang/translations/it.po | 42 + .../lang/translations/ja.po | 42 + .../lang/translations/jv.po | 42 + .../lang/translations/ko.po | 42 + .../lang/translations/ku.po | 42 + .../lang/translations/lt.po | 42 + .../lang/translations/lv.po | 42 + .../lang/translations/ms.po | 42 + .../lang/translations/ne.po | 42 + .../lang/translations/nl.po | 42 + .../lang/translations/no.po | 42 + .../lang/translations/pl.po | 42 + .../lang/translations/pt-br.po | 42 + .../lang/translations/pt.po | 42 + .../lang/translations/ro.po | 42 + .../lang/translations/ru.po | 42 + .../lang/translations/sk.po | 42 + .../lang/translations/sl.po | 42 + .../lang/translations/sq.po | 42 + .../lang/translations/sr-latn.po | 42 + .../lang/translations/sr.po | 42 + .../lang/translations/sv.po | 42 + .../lang/translations/th.po | 42 + .../lang/translations/tk.po | 42 + .../lang/translations/tr.po | 42 + .../lang/translations/ug.po | 42 + .../lang/translations/uk.po | 42 + .../lang/translations/ur.po | 42 + .../lang/translations/uz.po | 42 + .../lang/translations/vi.po | 42 + .../lang/translations/zh-cn.po | 42 + .../lang/translations/zh.po | 42 + .../@ckeditor/ckeditor5-ckfinder/package.json | 37 + .../ckeditor5-ckfinder/src/augmentation.d.ts | 22 + .../ckeditor5-ckfinder/src/augmentation.js | 5 + .../ckeditor5-ckfinder/src/ckfinder.d.ts | 36 + .../ckeditor5-ckfinder/src/ckfinder.js | 40 + .../src/ckfindercommand.d.ts | 36 + .../ckeditor5-ckfinder/src/ckfindercommand.js | 122 + .../src/ckfinderconfig.d.ts | 73 + .../ckeditor5-ckfinder/src/ckfinderconfig.js | 5 + .../src/ckfinderediting.d.ts | 26 + .../ckeditor5-ckfinder/src/ckfinderediting.js | 50 + .../ckeditor5-ckfinder/src/ckfinderui.d.ts | 25 + .../ckeditor5-ckfinder/src/ckfinderui.js | 86 + .../ckeditor5-ckfinder/src/index.d.ts | 13 + .../@ckeditor/ckeditor5-ckfinder/src/index.js | 11 + .../ckeditor5-clipboard/CHANGELOG.md | 180 + .../@ckeditor/ckeditor5-clipboard/LICENSE.md | 21 + .../@ckeditor/ckeditor5-clipboard/README.md | 16 + .../ckeditor5-clipboard/lang/contexts.json | 5 + .../lang/translations/ar.po | 30 + .../lang/translations/bg.po | 30 + .../lang/translations/bn.po | 30 + .../lang/translations/ca.po | 30 + .../lang/translations/cs.po | 30 + .../lang/translations/da.po | 30 + .../lang/translations/de.po | 30 + .../lang/translations/el.po | 30 + .../lang/translations/en.po | 30 + .../lang/translations/es-co.po | 30 + .../lang/translations/es.po | 30 + .../lang/translations/et.po | 30 + .../lang/translations/fi.po | 30 + .../lang/translations/fr.po | 30 + .../lang/translations/he.po | 30 + .../lang/translations/hi.po | 30 + .../lang/translations/hr.po | 30 + .../lang/translations/hu.po | 30 + .../lang/translations/id.po | 30 + .../lang/translations/it.po | 30 + .../lang/translations/ja.po | 30 + .../lang/translations/ko.po | 30 + .../lang/translations/lt.po | 30 + .../lang/translations/lv.po | 30 + .../lang/translations/ms.po | 30 + .../lang/translations/nl.po | 30 + .../lang/translations/no.po | 30 + .../lang/translations/pl.po | 30 + .../lang/translations/pt-br.po | 30 + .../lang/translations/pt.po | 30 + .../lang/translations/ro.po | 30 + .../lang/translations/ru.po | 30 + .../lang/translations/sk.po | 30 + .../lang/translations/sr.po | 30 + .../lang/translations/sv.po | 30 + .../lang/translations/th.po | 30 + .../lang/translations/tr.po | 30 + .../lang/translations/uk.po | 30 + .../lang/translations/vi.po | 30 + .../lang/translations/zh-cn.po | 30 + .../lang/translations/zh.po | 30 + .../ckeditor5-clipboard/package.json | 41 + .../ckeditor5-clipboard/src/augmentation.d.ts | 16 + .../ckeditor5-clipboard/src/augmentation.js | 5 + .../ckeditor5-clipboard/src/clipboard.d.ts | 36 + .../ckeditor5-clipboard/src/clipboard.js | 60 + .../src/clipboardmarkersutils.d.ts | 200 + .../src/clipboardmarkersutils.js | 499 + .../src/clipboardobserver.d.ts | 312 + .../src/clipboardobserver.js | 94 + .../src/clipboardpipeline.d.ts | 265 + .../src/clipboardpipeline.js | 277 + .../ckeditor5-clipboard/src/dragdrop.d.ts | 102 + .../ckeditor5-clipboard/src/dragdrop.js | 577 ++ .../src/dragdropblocktoolbar.d.ts | 47 + .../src/dragdropblocktoolbar.js | 121 + .../src/dragdroptarget.d.ts | 94 + .../ckeditor5-clipboard/src/dragdroptarget.js | 379 + .../ckeditor5-clipboard/src/index.d.ts | 17 + .../ckeditor5-clipboard/src/index.js | 15 + .../ckeditor5-clipboard/src/lineview.d.ts | 45 + .../ckeditor5-clipboard/src/lineview.js | 44 + .../src/pasteplaintext.d.ts | 28 + .../ckeditor5-clipboard/src/pasteplaintext.js | 82 + .../src/utils/normalizeclipboarddata.d.ts | 15 + .../src/utils/normalizeclipboarddata.js | 27 + .../src/utils/plaintexttohtml.d.ts | 14 + .../src/utils/plaintexttohtml.js | 39 + .../src/utils/viewtoplaintext.d.ts | 15 + .../src/utils/viewtoplaintext.js | 67 + .../ckeditor5-clipboard/theme/clipboard.css | 38 + .../ckeditor5-cloud-services/CHANGELOG.md | 129 + .../ckeditor5-cloud-services/LICENSE.md | 17 + .../ckeditor5-cloud-services/README.md | 16 + .../build/cloud-services.js | 4 + .../ckeditor5-metadata.json | 11 + .../ckeditor5-cloud-services/package.json | 36 + .../src/augmentation.d.ts | 19 + .../src/augmentation.js | 5 + .../src/cloudservices.d.ts | 84 + .../src/cloudservices.js | 103 + .../src/cloudservicesconfig.d.ts | 121 + .../src/cloudservicesconfig.js | 5 + .../src/cloudservicescore.d.ts | 36 + .../src/cloudservicescore.js | 41 + .../ckeditor5-cloud-services/src/index.d.ts | 14 + .../ckeditor5-cloud-services/src/index.js | 10 + .../src/token/token.d.ts | 96 + .../src/token/token.js | 171 + .../src/uploadgateway/fileuploader.d.ts | 94 + .../src/uploadgateway/fileuploader.js | 183 + .../src/uploadgateway/uploadgateway.d.ts | 47 + .../src/uploadgateway/uploadgateway.js | 60 + .../@ckeditor/ckeditor5-core/CHANGELOG.md | 311 + .../@ckeditor/ckeditor5-core/LICENSE.md | 21 + .../@ckeditor/ckeditor5-core/README.md | 18 + .../ckeditor5-core/lang/contexts.json | 29 + .../ckeditor5-core/lang/translations/af.po | 126 + .../ckeditor5-core/lang/translations/ar.po | 126 + .../ckeditor5-core/lang/translations/ast.po | 126 + .../ckeditor5-core/lang/translations/az.po | 126 + .../ckeditor5-core/lang/translations/bg.po | 126 + .../ckeditor5-core/lang/translations/bn.po | 126 + .../ckeditor5-core/lang/translations/bs.po | 126 + .../ckeditor5-core/lang/translations/ca.po | 126 + .../ckeditor5-core/lang/translations/cs.po | 126 + .../ckeditor5-core/lang/translations/da.po | 126 + .../ckeditor5-core/lang/translations/de-ch.po | 126 + .../ckeditor5-core/lang/translations/de.po | 126 + .../ckeditor5-core/lang/translations/el.po | 126 + .../ckeditor5-core/lang/translations/en-au.po | 126 + .../ckeditor5-core/lang/translations/en-gb.po | 126 + .../ckeditor5-core/lang/translations/en.po | 126 + .../ckeditor5-core/lang/translations/eo.po | 126 + .../ckeditor5-core/lang/translations/es-co.po | 126 + .../ckeditor5-core/lang/translations/es.po | 126 + .../ckeditor5-core/lang/translations/et.po | 126 + .../ckeditor5-core/lang/translations/eu.po | 126 + .../ckeditor5-core/lang/translations/fa.po | 126 + .../ckeditor5-core/lang/translations/fi.po | 126 + .../ckeditor5-core/lang/translations/fr.po | 126 + .../ckeditor5-core/lang/translations/gl.po | 126 + .../ckeditor5-core/lang/translations/gu.po | 126 + .../ckeditor5-core/lang/translations/he.po | 126 + .../ckeditor5-core/lang/translations/hi.po | 126 + .../ckeditor5-core/lang/translations/hr.po | 126 + .../ckeditor5-core/lang/translations/hu.po | 126 + .../ckeditor5-core/lang/translations/hy.po | 126 + .../ckeditor5-core/lang/translations/id.po | 126 + .../ckeditor5-core/lang/translations/it.po | 126 + .../ckeditor5-core/lang/translations/ja.po | 126 + .../ckeditor5-core/lang/translations/jv.po | 126 + .../ckeditor5-core/lang/translations/km.po | 126 + .../ckeditor5-core/lang/translations/kn.po | 126 + .../ckeditor5-core/lang/translations/ko.po | 126 + .../ckeditor5-core/lang/translations/ku.po | 126 + .../ckeditor5-core/lang/translations/lt.po | 126 + .../ckeditor5-core/lang/translations/lv.po | 126 + .../ckeditor5-core/lang/translations/ms.po | 126 + .../ckeditor5-core/lang/translations/nb.po | 126 + .../ckeditor5-core/lang/translations/ne.po | 126 + .../ckeditor5-core/lang/translations/nl.po | 126 + .../ckeditor5-core/lang/translations/no.po | 126 + .../ckeditor5-core/lang/translations/oc.po | 126 + .../ckeditor5-core/lang/translations/pl.po | 126 + .../ckeditor5-core/lang/translations/pt-br.po | 126 + .../ckeditor5-core/lang/translations/pt.po | 126 + .../ckeditor5-core/lang/translations/ro.po | 126 + .../ckeditor5-core/lang/translations/ru.po | 126 + .../ckeditor5-core/lang/translations/si.po | 126 + .../ckeditor5-core/lang/translations/sk.po | 126 + .../ckeditor5-core/lang/translations/sl.po | 126 + .../ckeditor5-core/lang/translations/sq.po | 126 + .../lang/translations/sr-latn.po | 126 + .../ckeditor5-core/lang/translations/sr.po | 126 + .../ckeditor5-core/lang/translations/sv.po | 126 + .../ckeditor5-core/lang/translations/th.po | 126 + .../ckeditor5-core/lang/translations/tk.po | 126 + .../ckeditor5-core/lang/translations/tr.po | 126 + .../ckeditor5-core/lang/translations/tt.po | 126 + .../ckeditor5-core/lang/translations/ug.po | 126 + .../ckeditor5-core/lang/translations/uk.po | 126 + .../ckeditor5-core/lang/translations/ur.po | 126 + .../ckeditor5-core/lang/translations/uz.po | 126 + .../ckeditor5-core/lang/translations/vi.po | 126 + .../ckeditor5-core/lang/translations/zh-cn.po | 126 + .../ckeditor5-core/lang/translations/zh.po | 126 + .../@ckeditor/ckeditor5-core/package.json | 49 + .../ckeditor5-core/src/accessibility.d.ts | 361 + .../ckeditor5-core/src/accessibility.js | 325 + .../ckeditor5-core/src/augmentation.d.ts | 10 + .../ckeditor5-core/src/augmentation.js | 5 + .../@ckeditor/ckeditor5-core/src/command.d.ts | 189 + .../@ckeditor/ckeditor5-core/src/command.js | 185 + .../ckeditor5-core/src/commandcollection.d.ts | 83 + .../ckeditor5-core/src/commandcollection.js | 83 + .../@ckeditor/ckeditor5-core/src/context.d.ts | 237 + .../@ckeditor/ckeditor5-core/src/context.js | 229 + .../ckeditor5-core/src/contextplugin.d.ts | 61 + .../ckeditor5-core/src/contextplugin.js | 43 + .../src/editingkeystrokehandler.d.ts | 56 + .../src/editingkeystrokehandler.js | 57 + .../ckeditor5-core/src/editor/editor.d.ts | 478 + .../ckeditor5-core/src/editor/editor.js | 378 + .../src/editor/editorconfig.d.ts | 932 ++ .../ckeditor5-core/src/editor/editorconfig.js | 5 + .../src/editor/utils/attachtoform.d.ts | 15 + .../src/editor/utils/attachtoform.js | 57 + .../src/editor/utils/dataapimixin.d.ts | 79 + .../src/editor/utils/dataapimixin.js | 12 + .../src/editor/utils/elementapimixin.d.ts | 35 + .../src/editor/utils/elementapimixin.js | 43 + .../src/editor/utils/securesourceelement.d.ts | 17 + .../src/editor/utils/securesourceelement.js | 35 + .../@ckeditor/ckeditor5-core/src/index.d.ts | 89 + .../@ckeditor/ckeditor5-core/src/index.js | 145 + .../ckeditor5-core/src/multicommand.d.ts | 66 + .../ckeditor5-core/src/multicommand.js | 82 + .../ckeditor5-core/src/pendingactions.d.ts | 117 + .../ckeditor5-core/src/pendingactions.js | 116 + .../@ckeditor/ckeditor5-core/src/plugin.d.ts | 274 + .../@ckeditor/ckeditor5-core/src/plugin.js | 106 + .../ckeditor5-core/src/plugincollection.d.ts | 117 + .../ckeditor5-core/src/plugincollection.js | 473 + .../@ckeditor/ckeditor5-core/src/typings.d.ts | 11 + .../@ckeditor/ckeditor5-core/src/typings.js | 5 + .../theme/icons/align-bottom.svg | 1 + .../theme/icons/align-center.svg | 1 + .../theme/icons/align-justify.svg | 1 + .../ckeditor5-core/theme/icons/align-left.svg | 1 + .../theme/icons/align-middle.svg | 1 + .../theme/icons/align-right.svg | 1 + .../ckeditor5-core/theme/icons/align-top.svg | 1 + .../ckeditor5-core/theme/icons/bold.svg | 1 + .../theme/icons/browse-files.svg | 1 + .../theme/icons/bulletedlist.svg | 1 + .../ckeditor5-core/theme/icons/cancel.svg | 1 + .../ckeditor5-core/theme/icons/caption.svg | 1 + .../ckeditor5-core/theme/icons/check.svg | 1 + .../ckeditor5-core/theme/icons/codeblock.svg | 1 + .../ckeditor5-core/theme/icons/cog.svg | 1 + .../theme/icons/color-palette.svg | 1 + .../theme/icons/drag-indicator.svg | 1 + .../ckeditor5-core/theme/icons/eraser.svg | 1 + .../ckeditor5-core/theme/icons/heading1.svg | 1 + .../ckeditor5-core/theme/icons/heading2.svg | 1 + .../ckeditor5-core/theme/icons/heading3.svg | 1 + .../ckeditor5-core/theme/icons/heading4.svg | 1 + .../ckeditor5-core/theme/icons/heading5.svg | 1 + .../ckeditor5-core/theme/icons/heading6.svg | 1 + .../ckeditor5-core/theme/icons/history.svg | 1 + .../theme/icons/horizontalline.svg | 1 + .../ckeditor5-core/theme/icons/html.svg | 1 + .../theme/icons/image-asset-manager.svg | 1 + .../theme/icons/image-upload.svg | 1 + .../ckeditor5-core/theme/icons/image-url.svg | 1 + .../ckeditor5-core/theme/icons/image.svg | 1 + .../theme/icons/importexport.svg | 1 + .../ckeditor5-core/theme/icons/indent.svg | 1 + .../ckeditor5-core/theme/icons/loupe.svg | 1 + .../ckeditor5-core/theme/icons/low-vision.svg | 1 + .../ckeditor5-core/theme/icons/next-arrow.svg | 1 + .../theme/icons/numberedlist.svg | 1 + .../theme/icons/object-center.svg | 1 + .../theme/icons/object-full-width.svg | 1 + .../theme/icons/object-inline-left.svg | 1 + .../theme/icons/object-inline-right.svg | 1 + .../theme/icons/object-inline.svg | 1 + .../theme/icons/object-left.svg | 1 + .../theme/icons/object-right.svg | 1 + .../theme/icons/object-size-full.svg | 1 + .../theme/icons/object-size-large.svg | 1 + .../theme/icons/object-size-medium.svg | 1 + .../theme/icons/object-size-small.svg | 1 + .../ckeditor5-core/theme/icons/outdent.svg | 1 + .../ckeditor5-core/theme/icons/paragraph.svg | 1 + .../ckeditor5-core/theme/icons/pencil.svg | 1 + .../ckeditor5-core/theme/icons/pilcrow.svg | 1 + .../ckeditor5-core/theme/icons/plus.svg | 1 + .../theme/icons/previous-arrow.svg | 1 + .../ckeditor5-core/theme/icons/quote.svg | 1 + .../ckeditor5-core/theme/icons/redo.svg | 1 + .../ckeditor5-core/theme/icons/table.svg | 1 + .../theme/icons/text-alternative.svg | 1 + .../ckeditor5-core/theme/icons/text.svg | 1 + .../theme/icons/three-vertical-dots.svg | 1 + .../ckeditor5-core/theme/icons/todolist.svg | 1 + .../ckeditor5-core/theme/icons/undo.svg | 1 + .../ckeditor5-easy-image/CHANGELOG.md | 134 + .../@ckeditor/ckeditor5-easy-image/LICENSE.md | 17 + .../@ckeditor/ckeditor5-easy-image/README.md | 24 + .../ckeditor5-easy-image/build/easy-image.js | 4 + .../ckeditor5-metadata.json | 19 + .../ckeditor5-easy-image/package.json | 37 + .../src/augmentation.d.ts | 11 + .../ckeditor5-easy-image/src/augmentation.js | 5 + .../src/cloudservicesuploadadapter.d.ts | 32 + .../src/cloudservicesuploadadapter.js | 67 + .../ckeditor5-easy-image/src/easyimage.d.ts | 47 + .../ckeditor5-easy-image/src/easyimage.js | 69 + .../ckeditor5-easy-image/src/index.d.ts | 10 + .../ckeditor5-easy-image/src/index.js | 10 + .../ckeditor5-editor-classic/CHANGELOG.md | 206 + .../ckeditor5-editor-classic/LICENSE.md | 21 + .../ckeditor5-editor-classic/README.md | 20 + .../build/editor-classic.js | 4 + .../ckeditor5-editor-classic/package.json | 37 + .../src/classiceditor.d.ts | 180 + .../src/classiceditor.js | 223 + .../src/classiceditorui.d.ts | 87 + .../src/classiceditorui.js | 213 + .../src/classiceditoruiview.d.ts | 52 + .../src/classiceditoruiview.js | 51 + .../ckeditor5-editor-classic/src/index.d.ts | 8 + .../ckeditor5-editor-classic/src/index.js | 8 + .../theme/classiceditor.css | 16 + .../@ckeditor/ckeditor5-engine/CHANGELOG.md | 823 ++ .../@ckeditor/ckeditor5-engine/LICENSE.md | 21 + .../@ckeditor/ckeditor5-engine/README.md | 30 + .../@ckeditor/ckeditor5-engine/package.json | 48 + .../src/controller/datacontroller.d.ts | 335 + .../src/controller/datacontroller.js | 481 + .../src/controller/editingcontroller.d.ts | 98 + .../src/controller/editingcontroller.js | 191 + .../src/conversion/conversion.d.ts | 478 + .../src/conversion/conversion.js | 601 ++ .../src/conversion/conversionhelpers.d.ts | 26 + .../src/conversion/conversionhelpers.js | 32 + .../src/conversion/downcastdispatcher.d.ts | 562 ++ .../src/conversion/downcastdispatcher.js | 548 ++ .../src/conversion/downcasthelpers.d.ts | 1190 +++ .../src/conversion/downcasthelpers.js | 2161 +++++ .../src/conversion/mapper.d.ts | 503 + .../ckeditor5-engine/src/conversion/mapper.js | 536 ++ .../src/conversion/modelconsumable.d.ts | 201 + .../src/conversion/modelconsumable.js | 333 + .../src/conversion/upcastdispatcher.d.ts | 492 + .../src/conversion/upcastdispatcher.js | 460 + .../src/conversion/upcasthelpers.d.ts | 499 + .../src/conversion/upcasthelpers.js | 950 ++ .../src/conversion/viewconsumable.d.ts | 369 + .../src/conversion/viewconsumable.js | 535 ++ .../src/dataprocessor/basichtmlwriter.d.ts | 18 + .../src/dataprocessor/basichtmlwriter.js | 20 + .../src/dataprocessor/dataprocessor.d.ts | 61 + .../src/dataprocessor/dataprocessor.js | 5 + .../src/dataprocessor/htmldataprocessor.d.ts | 76 + .../src/dataprocessor/htmldataprocessor.js | 96 + .../src/dataprocessor/htmlwriter.d.ts | 16 + .../src/dataprocessor/htmlwriter.js | 5 + .../src/dataprocessor/xmldataprocessor.d.ts | 90 + .../src/dataprocessor/xmldataprocessor.js | 108 + .../ckeditor5-engine/src/dev-utils/model.d.ts | 124 + .../ckeditor5-engine/src/dev-utils/model.js | 395 + .../src/dev-utils/operationreplayer.d.ts | 51 + .../src/dev-utils/operationreplayer.js | 112 + .../ckeditor5-engine/src/dev-utils/utils.d.ts | 37 + .../ckeditor5-engine/src/dev-utils/utils.js | 73 + .../ckeditor5-engine/src/dev-utils/view.d.ts | 319 + .../ckeditor5-engine/src/dev-utils/view.js | 967 ++ .../@ckeditor/ckeditor5-engine/src/index.d.ts | 113 + .../@ckeditor/ckeditor5-engine/src/index.js | 77 + .../ckeditor5-engine/src/model/batch.d.ts | 106 + .../ckeditor5-engine/src/model/batch.js | 96 + .../ckeditor5-engine/src/model/differ.d.ts | 415 + .../ckeditor5-engine/src/model/differ.js | 1152 +++ .../ckeditor5-engine/src/model/document.d.ts | 274 + .../ckeditor5-engine/src/model/document.js | 360 + .../src/model/documentfragment.d.ts | 200 + .../src/model/documentfragment.js | 306 + .../src/model/documentselection.d.ts | 420 + .../src/model/documentselection.js | 993 ++ .../ckeditor5-engine/src/model/element.d.ts | 165 + .../ckeditor5-engine/src/model/element.js | 281 + .../ckeditor5-engine/src/model/history.d.ts | 114 + .../ckeditor5-engine/src/model/history.js | 207 + .../ckeditor5-engine/src/model/item.d.ts | 14 + .../ckeditor5-engine/src/model/item.js | 5 + .../src/model/liveposition.d.ts | 77 + .../src/model/liveposition.js | 93 + .../ckeditor5-engine/src/model/liverange.d.ts | 102 + .../ckeditor5-engine/src/model/liverange.js | 120 + .../src/model/markercollection.d.ts | 335 + .../src/model/markercollection.js | 403 + .../ckeditor5-engine/src/model/model.d.ts | 919 ++ .../ckeditor5-engine/src/model/model.js | 842 ++ .../ckeditor5-engine/src/model/node.d.ts | 256 + .../ckeditor5-engine/src/model/node.js | 375 + .../ckeditor5-engine/src/model/nodelist.d.ts | 91 + .../ckeditor5-engine/src/model/nodelist.js | 163 + .../model/operation/attributeoperation.d.ts | 103 + .../src/model/operation/attributeoperation.js | 148 + .../src/model/operation/detachoperation.d.ts | 60 + .../src/model/operation/detachoperation.js | 77 + .../src/model/operation/insertoperation.d.ts | 90 + .../src/model/operation/insertoperation.js | 135 + .../src/model/operation/markeroperation.d.ts | 91 + .../src/model/operation/markeroperation.js | 107 + .../src/model/operation/mergeoperation.d.ts | 100 + .../src/model/operation/mergeoperation.js | 167 + .../src/model/operation/moveoperation.d.ts | 96 + .../src/model/operation/moveoperation.js | 164 + .../src/model/operation/nooperation.d.ts | 38 + .../src/model/operation/nooperation.js | 48 + .../src/model/operation/operation.d.ts | 96 + .../src/model/operation/operation.js | 59 + .../src/model/operation/operationfactory.d.ts | 18 + .../src/model/operation/operationfactory.js | 44 + .../src/model/operation/renameoperation.d.ts | 83 + .../src/model/operation/renameoperation.js | 115 + .../operation/rootattributeoperation.d.ts | 98 + .../model/operation/rootattributeoperation.js | 155 + .../src/model/operation/rootoperation.d.ts | 76 + .../src/model/operation/rootoperation.js | 90 + .../src/model/operation/splitoperation.d.ts | 109 + .../src/model/operation/splitoperation.js | 194 + .../src/model/operation/transform.d.ts | 100 + .../src/model/operation/transform.js | 2045 ++++ .../src/model/operation/utils.d.ts | 71 + .../src/model/operation/utils.js | 217 + .../ckeditor5-engine/src/model/position.d.ts | 539 ++ .../ckeditor5-engine/src/model/position.js | 979 ++ .../ckeditor5-engine/src/model/range.d.ts | 458 + .../ckeditor5-engine/src/model/range.js | 875 ++ .../src/model/rootelement.d.ts | 60 + .../ckeditor5-engine/src/model/rootelement.js | 74 + .../ckeditor5-engine/src/model/schema.d.ts | 1206 +++ .../ckeditor5-engine/src/model/schema.js | 1287 +++ .../ckeditor5-engine/src/model/selection.d.ts | 482 + .../ckeditor5-engine/src/model/selection.js | 789 ++ .../ckeditor5-engine/src/model/text.d.ts | 66 + .../ckeditor5-engine/src/model/text.js | 85 + .../ckeditor5-engine/src/model/textproxy.d.ts | 144 + .../ckeditor5-engine/src/model/textproxy.js | 189 + .../src/model/treewalker.d.ts | 186 + .../ckeditor5-engine/src/model/treewalker.js | 244 + .../src/model/typecheckable.d.ts | 285 + .../src/model/typecheckable.js | 16 + .../src/model/utils/autoparagraphing.d.ts | 37 + .../src/model/utils/autoparagraphing.js | 63 + .../src/model/utils/deletecontent.d.ts | 58 + .../src/model/utils/deletecontent.js | 488 + .../src/model/utils/getselectedcontent.d.ts | 30 + .../src/model/utils/getselectedcontent.js | 125 + .../src/model/utils/insertcontent.d.ts | 46 + .../src/model/utils/insertcontent.js | 705 ++ .../src/model/utils/insertobject.d.ts | 47 + .../src/model/utils/insertobject.js | 135 + .../src/model/utils/modifyselection.d.ts | 48 + .../src/model/utils/modifyselection.js | 186 + .../src/model/utils/selection-post-fixer.d.ts | 74 + .../src/model/utils/selection-post-fixer.js | 260 + .../ckeditor5-engine/src/model/writer.d.ts | 851 ++ .../ckeditor5-engine/src/model/writer.js | 1306 +++ .../src/view/attributeelement.d.ts | 108 + .../src/view/attributeelement.js | 185 + .../src/view/containerelement.d.ts | 49 + .../src/view/containerelement.js | 80 + .../src/view/datatransfer.d.ts | 79 + .../ckeditor5-engine/src/view/datatransfer.js | 98 + .../ckeditor5-engine/src/view/document.d.ts | 184 + .../ckeditor5-engine/src/view/document.js | 122 + .../src/view/documentfragment.d.ts | 153 + .../src/view/documentfragment.js | 234 + .../src/view/documentselection.d.ts | 306 + .../src/view/documentselection.js | 256 + .../src/view/domconverter.d.ts | 652 ++ .../ckeditor5-engine/src/view/domconverter.js | 1473 +++ .../src/view/downcastwriter.d.ts | 996 ++ .../src/view/downcastwriter.js | 1696 ++++ .../src/view/editableelement.d.ts | 62 + .../src/view/editableelement.js | 62 + .../ckeditor5-engine/src/view/element.d.ts | 468 + .../ckeditor5-engine/src/view/element.js | 724 ++ .../src/view/elementdefinition.d.ts | 87 + .../src/view/elementdefinition.js | 5 + .../src/view/emptyelement.d.ts | 41 + .../ckeditor5-engine/src/view/emptyelement.js | 73 + .../ckeditor5-engine/src/view/filler.d.ts | 111 + .../ckeditor5-engine/src/view/filler.js | 150 + .../ckeditor5-engine/src/view/item.d.ts | 14 + .../ckeditor5-engine/src/view/item.js | 5 + .../ckeditor5-engine/src/view/matcher.d.ts | 486 + .../ckeditor5-engine/src/view/matcher.js | 507 + .../ckeditor5-engine/src/view/node.d.ts | 163 + .../ckeditor5-engine/src/view/node.js | 228 + .../src/view/observer/arrowkeysobserver.d.ts | 45 + .../src/view/observer/arrowkeysobserver.js | 40 + .../view/observer/bubblingemittermixin.d.ts | 166 + .../src/view/observer/bubblingemittermixin.js | 172 + .../src/view/observer/bubblingeventinfo.d.ts | 47 + .../src/view/observer/bubblingeventinfo.js | 37 + .../src/view/observer/clickobserver.d.ts | 43 + .../src/view/observer/clickobserver.js | 29 + .../view/observer/compositionobserver.d.ts | 82 + .../src/view/observer/compositionobserver.js | 60 + .../src/view/observer/domeventdata.d.ts | 50 + .../src/view/observer/domeventdata.js | 47 + .../src/view/observer/domeventobserver.d.ts | 73 + .../src/view/observer/domeventobserver.js | 79 + .../view/observer/fakeselectionobserver.d.ts | 47 + .../view/observer/fakeselectionobserver.js | 91 + .../src/view/observer/focusobserver.d.ts | 82 + .../src/view/observer/focusobserver.js | 86 + .../src/view/observer/inputobserver.d.ts | 86 + .../src/view/observer/inputobserver.js | 164 + .../src/view/observer/keyobserver.d.ts | 66 + .../src/view/observer/keyobserver.js | 39 + .../src/view/observer/mouseobserver.d.ts | 89 + .../src/view/observer/mouseobserver.js | 29 + .../src/view/observer/mutationobserver.d.ts | 86 + .../src/view/observer/mutationobserver.js | 206 + .../src/view/observer/observer.d.ts | 89 + .../src/view/observer/observer.js | 84 + .../src/view/observer/selectionobserver.d.ts | 148 + .../src/view/observer/selectionobserver.js | 202 + .../src/view/observer/tabobserver.d.ts | 46 + .../src/view/observer/tabobserver.js | 42 + .../src/view/placeholder.d.ts | 96 + .../ckeditor5-engine/src/view/placeholder.js | 267 + .../ckeditor5-engine/src/view/position.d.ts | 189 + .../ckeditor5-engine/src/view/position.js | 324 + .../ckeditor5-engine/src/view/range.d.ts | 279 + .../ckeditor5-engine/src/view/range.js | 430 + .../ckeditor5-engine/src/view/rawelement.d.ts | 73 + .../ckeditor5-engine/src/view/rawelement.js | 105 + .../ckeditor5-engine/src/view/renderer.d.ts | 265 + .../ckeditor5-engine/src/view/renderer.js | 1000 ++ .../src/view/rooteditableelement.d.ts | 41 + .../src/view/rooteditableelement.js | 69 + .../ckeditor5-engine/src/view/selection.d.ts | 375 + .../ckeditor5-engine/src/view/selection.js | 559 ++ .../src/view/styles/background.d.ts | 33 + .../src/view/styles/background.js | 74 + .../src/view/styles/border.d.ts | 43 + .../src/view/styles/border.js | 316 + .../src/view/styles/margin.d.ts | 29 + .../src/view/styles/margin.js | 34 + .../src/view/styles/padding.d.ts | 29 + .../src/view/styles/padding.js | 34 + .../src/view/styles/utils.d.ts | 93 + .../ckeditor5-engine/src/view/styles/utils.js | 219 + .../ckeditor5-engine/src/view/stylesmap.d.ts | 673 ++ .../ckeditor5-engine/src/view/stylesmap.js | 763 ++ .../ckeditor5-engine/src/view/text.d.ts | 74 + .../ckeditor5-engine/src/view/text.js | 93 + .../ckeditor5-engine/src/view/textproxy.d.ts | 97 + .../ckeditor5-engine/src/view/textproxy.js | 124 + .../ckeditor5-engine/src/view/treewalker.d.ts | 195 + .../ckeditor5-engine/src/view/treewalker.js | 327 + .../src/view/typecheckable.d.ts | 448 + .../src/view/typecheckable.js | 19 + .../ckeditor5-engine/src/view/uielement.d.ts | 96 + .../ckeditor5-engine/src/view/uielement.js | 183 + .../src/view/upcastwriter.d.ts | 417 + .../ckeditor5-engine/src/view/upcastwriter.js | 359 + .../ckeditor5-engine/src/view/view.d.ts | 487 + .../ckeditor5-engine/src/view/view.js | 546 ++ .../ckeditor5-engine/theme/placeholder.css | 36 + .../ckeditor5-engine/theme/renderer.css | 9 + .../@ckeditor/ckeditor5-enter/CHANGELOG.md | 172 + .../@ckeditor/ckeditor5-enter/LICENSE.md | 17 + .../@ckeditor/ckeditor5-enter/README.md | 16 + .../ckeditor5-enter/lang/contexts.json | 4 + .../ckeditor5-enter/lang/translations/ar.po | 26 + .../ckeditor5-enter/lang/translations/bg.po | 26 + .../ckeditor5-enter/lang/translations/bn.po | 26 + .../ckeditor5-enter/lang/translations/ca.po | 26 + .../ckeditor5-enter/lang/translations/cs.po | 26 + .../ckeditor5-enter/lang/translations/da.po | 26 + .../ckeditor5-enter/lang/translations/de.po | 26 + .../ckeditor5-enter/lang/translations/el.po | 26 + .../ckeditor5-enter/lang/translations/en.po | 26 + .../ckeditor5-enter/lang/translations/es.po | 26 + .../ckeditor5-enter/lang/translations/et.po | 26 + .../ckeditor5-enter/lang/translations/fi.po | 26 + .../ckeditor5-enter/lang/translations/fr.po | 26 + .../ckeditor5-enter/lang/translations/he.po | 26 + .../ckeditor5-enter/lang/translations/hi.po | 26 + .../ckeditor5-enter/lang/translations/hr.po | 26 + .../ckeditor5-enter/lang/translations/hu.po | 26 + .../ckeditor5-enter/lang/translations/id.po | 26 + .../ckeditor5-enter/lang/translations/it.po | 26 + .../ckeditor5-enter/lang/translations/ja.po | 26 + .../ckeditor5-enter/lang/translations/ko.po | 26 + .../ckeditor5-enter/lang/translations/lt.po | 26 + .../ckeditor5-enter/lang/translations/lv.po | 26 + .../ckeditor5-enter/lang/translations/ms.po | 26 + .../ckeditor5-enter/lang/translations/nl.po | 26 + .../ckeditor5-enter/lang/translations/no.po | 26 + .../ckeditor5-enter/lang/translations/pl.po | 26 + .../lang/translations/pt-br.po | 26 + .../ckeditor5-enter/lang/translations/pt.po | 26 + .../ckeditor5-enter/lang/translations/ro.po | 26 + .../ckeditor5-enter/lang/translations/ru.po | 26 + .../ckeditor5-enter/lang/translations/sk.po | 26 + .../ckeditor5-enter/lang/translations/sr.po | 26 + .../ckeditor5-enter/lang/translations/sv.po | 26 + .../ckeditor5-enter/lang/translations/th.po | 26 + .../ckeditor5-enter/lang/translations/tr.po | 26 + .../ckeditor5-enter/lang/translations/uk.po | 26 + .../ckeditor5-enter/lang/translations/vi.po | 26 + .../lang/translations/zh-cn.po | 26 + .../ckeditor5-enter/lang/translations/zh.po | 26 + .../@ckeditor/ckeditor5-enter/package.json | 38 + .../ckeditor5-enter/src/augmentation.d.ts | 15 + .../ckeditor5-enter/src/augmentation.js | 5 + .../@ckeditor/ckeditor5-enter/src/enter.d.ts | 22 + .../@ckeditor/ckeditor5-enter/src/enter.js | 55 + .../ckeditor5-enter/src/entercommand.d.ts | 52 + .../ckeditor5-enter/src/entercommand.js | 96 + .../ckeditor5-enter/src/enterobserver.d.ts | 44 + .../ckeditor5-enter/src/enterobserver.js | 61 + .../@ckeditor/ckeditor5-enter/src/index.d.ts | 13 + .../@ckeditor/ckeditor5-enter/src/index.js | 10 + .../ckeditor5-enter/src/shiftenter.d.ts | 19 + .../ckeditor5-enter/src/shiftenter.js | 73 + .../src/shiftentercommand.d.ts | 34 + .../ckeditor5-enter/src/shiftentercommand.js | 118 + .../@ckeditor/ckeditor5-enter/src/utils.d.ts | 18 + .../@ckeditor/ckeditor5-enter/src/utils.js | 20 + .../ckeditor5-essentials/CHANGELOG.md | 159 + .../@ckeditor/ckeditor5-essentials/LICENSE.md | 17 + .../@ckeditor/ckeditor5-essentials/README.md | 24 + .../ckeditor5-essentials/build/essentials.js | 4 + .../ckeditor5-metadata.json | 15 + .../ckeditor5-essentials/package.json | 37 + .../src/augmentation.d.ts | 10 + .../ckeditor5-essentials/src/augmentation.js | 5 + .../ckeditor5-essentials/src/essentials.d.ts | 40 + .../ckeditor5-essentials/src/essentials.js | 44 + .../ckeditor5-essentials/src/index.d.ts | 9 + .../ckeditor5-essentials/src/index.js | 9 + .../@ckeditor/ckeditor5-heading/CHANGELOG.md | 267 + .../@ckeditor/ckeditor5-heading/LICENSE.md | 17 + .../@ckeditor/ckeditor5-heading/README.md | 20 + .../ckeditor5-heading/build/heading.js | 5 + .../build/translations/ar.js | 1 + .../build/translations/az.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/bs.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../build/translations/eo.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/eu.js | 1 + .../build/translations/fa.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/gl.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/hy.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/jv.js | 1 + .../build/translations/km.js | 1 + .../build/translations/kn.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/ku.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/nb.js | 1 + .../build/translations/ne.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sl.js | 1 + .../build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tk.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/ug.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/ur.js | 1 + .../build/translations/uz.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-heading/ckeditor5-metadata.json | 46 + .../ckeditor5-heading/lang/contexts.json | 13 + .../ckeditor5-heading/lang/translations/ar.po | 62 + .../ckeditor5-heading/lang/translations/az.po | 62 + .../ckeditor5-heading/lang/translations/bg.po | 62 + .../ckeditor5-heading/lang/translations/bn.po | 62 + .../ckeditor5-heading/lang/translations/bs.po | 62 + .../ckeditor5-heading/lang/translations/ca.po | 62 + .../ckeditor5-heading/lang/translations/cs.po | 62 + .../ckeditor5-heading/lang/translations/da.po | 62 + .../lang/translations/de-ch.po | 62 + .../ckeditor5-heading/lang/translations/de.po | 62 + .../ckeditor5-heading/lang/translations/el.po | 62 + .../lang/translations/en-au.po | 62 + .../lang/translations/en-gb.po | 62 + .../ckeditor5-heading/lang/translations/en.po | 62 + .../ckeditor5-heading/lang/translations/eo.po | 62 + .../ckeditor5-heading/lang/translations/es.po | 62 + .../ckeditor5-heading/lang/translations/et.po | 62 + .../ckeditor5-heading/lang/translations/eu.po | 62 + .../ckeditor5-heading/lang/translations/fa.po | 62 + .../ckeditor5-heading/lang/translations/fi.po | 62 + .../ckeditor5-heading/lang/translations/fr.po | 62 + .../ckeditor5-heading/lang/translations/gl.po | 62 + .../ckeditor5-heading/lang/translations/he.po | 62 + .../ckeditor5-heading/lang/translations/hi.po | 62 + .../ckeditor5-heading/lang/translations/hr.po | 62 + .../ckeditor5-heading/lang/translations/hu.po | 62 + .../ckeditor5-heading/lang/translations/hy.po | 62 + .../ckeditor5-heading/lang/translations/id.po | 62 + .../ckeditor5-heading/lang/translations/it.po | 62 + .../ckeditor5-heading/lang/translations/ja.po | 62 + .../ckeditor5-heading/lang/translations/jv.po | 62 + .../ckeditor5-heading/lang/translations/km.po | 62 + .../ckeditor5-heading/lang/translations/kn.po | 62 + .../ckeditor5-heading/lang/translations/ko.po | 62 + .../ckeditor5-heading/lang/translations/ku.po | 62 + .../ckeditor5-heading/lang/translations/lt.po | 62 + .../ckeditor5-heading/lang/translations/lv.po | 62 + .../ckeditor5-heading/lang/translations/ms.po | 62 + .../ckeditor5-heading/lang/translations/nb.po | 62 + .../ckeditor5-heading/lang/translations/ne.po | 62 + .../ckeditor5-heading/lang/translations/nl.po | 62 + .../ckeditor5-heading/lang/translations/no.po | 62 + .../ckeditor5-heading/lang/translations/pl.po | 62 + .../lang/translations/pt-br.po | 62 + .../ckeditor5-heading/lang/translations/pt.po | 62 + .../ckeditor5-heading/lang/translations/ro.po | 62 + .../ckeditor5-heading/lang/translations/ru.po | 62 + .../ckeditor5-heading/lang/translations/sk.po | 62 + .../ckeditor5-heading/lang/translations/sl.po | 62 + .../ckeditor5-heading/lang/translations/sq.po | 62 + .../lang/translations/sr-latn.po | 62 + .../ckeditor5-heading/lang/translations/sr.po | 62 + .../ckeditor5-heading/lang/translations/sv.po | 62 + .../ckeditor5-heading/lang/translations/th.po | 62 + .../ckeditor5-heading/lang/translations/tk.po | 62 + .../ckeditor5-heading/lang/translations/tr.po | 62 + .../ckeditor5-heading/lang/translations/ug.po | 62 + .../ckeditor5-heading/lang/translations/uk.po | 62 + .../ckeditor5-heading/lang/translations/ur.po | 62 + .../ckeditor5-heading/lang/translations/uz.po | 62 + .../ckeditor5-heading/lang/translations/vi.po | 62 + .../lang/translations/zh-cn.po | 62 + .../ckeditor5-heading/lang/translations/zh.po | 62 + .../@ckeditor/ckeditor5-heading/package.json | 37 + .../ckeditor5-heading/src/augmentation.d.ts | 30 + .../ckeditor5-heading/src/augmentation.js | 5 + .../ckeditor5-heading/src/heading.d.ts | 32 + .../ckeditor5-heading/src/heading.js | 36 + .../src/headingbuttonsui.d.ts | 51 + .../ckeditor5-heading/src/headingbuttonsui.js | 83 + .../ckeditor5-heading/src/headingcommand.d.ts | 48 + .../ckeditor5-heading/src/headingcommand.js | 65 + .../ckeditor5-heading/src/headingconfig.d.ts | 145 + .../ckeditor5-heading/src/headingconfig.js | 5 + .../ckeditor5-heading/src/headingediting.d.ts | 42 + .../ckeditor5-heading/src/headingediting.js | 101 + .../ckeditor5-heading/src/headingui.d.ts | 22 + .../ckeditor5-heading/src/headingui.js | 165 + .../ckeditor5-heading/src/index.d.ts | 16 + .../@ckeditor/ckeditor5-heading/src/index.js | 13 + .../ckeditor5-heading/src/title.d.ts | 115 + .../@ckeditor/ckeditor5-heading/src/title.js | 460 + .../ckeditor5-heading/src/utils.d.ts | 18 + .../@ckeditor/ckeditor5-heading/src/utils.js | 31 + .../ckeditor5-heading/theme/heading.css | 20 + .../@ckeditor/ckeditor5-image/CHANGELOG.md | 423 + .../@ckeditor/ckeditor5-image/LICENSE.md | 21 + .../@ckeditor/ckeditor5-image/README.md | 20 + .../@ckeditor/ckeditor5-image/build/image.js | 5 + .../ckeditor5-image/build/translations/ar.js | 1 + .../ckeditor5-image/build/translations/ast.js | 1 + .../ckeditor5-image/build/translations/az.js | 1 + .../ckeditor5-image/build/translations/bg.js | 1 + .../ckeditor5-image/build/translations/bn.js | 1 + .../ckeditor5-image/build/translations/bs.js | 1 + .../ckeditor5-image/build/translations/ca.js | 1 + .../ckeditor5-image/build/translations/cs.js | 1 + .../ckeditor5-image/build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../ckeditor5-image/build/translations/de.js | 1 + .../ckeditor5-image/build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../ckeditor5-image/build/translations/eo.js | 1 + .../build/translations/es-co.js | 1 + .../ckeditor5-image/build/translations/es.js | 1 + .../ckeditor5-image/build/translations/et.js | 1 + .../ckeditor5-image/build/translations/eu.js | 1 + .../ckeditor5-image/build/translations/fa.js | 1 + .../ckeditor5-image/build/translations/fi.js | 1 + .../ckeditor5-image/build/translations/fr.js | 1 + .../ckeditor5-image/build/translations/gl.js | 1 + .../ckeditor5-image/build/translations/he.js | 1 + .../ckeditor5-image/build/translations/hi.js | 1 + .../ckeditor5-image/build/translations/hr.js | 1 + .../ckeditor5-image/build/translations/hu.js | 1 + .../ckeditor5-image/build/translations/id.js | 1 + .../ckeditor5-image/build/translations/it.js | 1 + .../ckeditor5-image/build/translations/ja.js | 1 + .../ckeditor5-image/build/translations/jv.js | 1 + .../ckeditor5-image/build/translations/km.js | 1 + .../ckeditor5-image/build/translations/kn.js | 1 + .../ckeditor5-image/build/translations/ko.js | 1 + .../ckeditor5-image/build/translations/ku.js | 1 + .../ckeditor5-image/build/translations/lt.js | 1 + .../ckeditor5-image/build/translations/lv.js | 1 + .../ckeditor5-image/build/translations/ms.js | 1 + .../ckeditor5-image/build/translations/nb.js | 1 + .../ckeditor5-image/build/translations/ne.js | 1 + .../ckeditor5-image/build/translations/nl.js | 1 + .../ckeditor5-image/build/translations/no.js | 1 + .../ckeditor5-image/build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../ckeditor5-image/build/translations/pt.js | 1 + .../ckeditor5-image/build/translations/ro.js | 1 + .../ckeditor5-image/build/translations/ru.js | 1 + .../ckeditor5-image/build/translations/si.js | 1 + .../ckeditor5-image/build/translations/sk.js | 1 + .../ckeditor5-image/build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../ckeditor5-image/build/translations/sr.js | 1 + .../ckeditor5-image/build/translations/sv.js | 1 + .../ckeditor5-image/build/translations/th.js | 1 + .../ckeditor5-image/build/translations/tk.js | 1 + .../ckeditor5-image/build/translations/tr.js | 1 + .../ckeditor5-image/build/translations/tt.js | 1 + .../ckeditor5-image/build/translations/ug.js | 1 + .../ckeditor5-image/build/translations/uk.js | 1 + .../ckeditor5-image/build/translations/ur.js | 1 + .../ckeditor5-image/build/translations/uz.js | 1 + .../ckeditor5-image/build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../ckeditor5-image/build/translations/zh.js | 1 + .../ckeditor5-image/ckeditor5-metadata.json | 256 + .../ckeditor5-image/lang/contexts.json | 34 + .../ckeditor5-image/lang/translations/ar.po | 146 + .../ckeditor5-image/lang/translations/ast.po | 146 + .../ckeditor5-image/lang/translations/az.po | 146 + .../ckeditor5-image/lang/translations/bg.po | 146 + .../ckeditor5-image/lang/translations/bn.po | 146 + .../ckeditor5-image/lang/translations/bs.po | 146 + .../ckeditor5-image/lang/translations/ca.po | 146 + .../ckeditor5-image/lang/translations/cs.po | 146 + .../ckeditor5-image/lang/translations/da.po | 146 + .../lang/translations/de-ch.po | 146 + .../ckeditor5-image/lang/translations/de.po | 146 + .../ckeditor5-image/lang/translations/el.po | 146 + .../lang/translations/en-au.po | 146 + .../lang/translations/en-gb.po | 146 + .../ckeditor5-image/lang/translations/en.po | 146 + .../ckeditor5-image/lang/translations/eo.po | 146 + .../lang/translations/es-co.po | 146 + .../ckeditor5-image/lang/translations/es.po | 146 + .../ckeditor5-image/lang/translations/et.po | 146 + .../ckeditor5-image/lang/translations/eu.po | 146 + .../ckeditor5-image/lang/translations/fa.po | 146 + .../ckeditor5-image/lang/translations/fi.po | 146 + .../ckeditor5-image/lang/translations/fr.po | 146 + .../ckeditor5-image/lang/translations/gl.po | 146 + .../ckeditor5-image/lang/translations/he.po | 146 + .../ckeditor5-image/lang/translations/hi.po | 146 + .../ckeditor5-image/lang/translations/hr.po | 146 + .../ckeditor5-image/lang/translations/hu.po | 146 + .../ckeditor5-image/lang/translations/id.po | 146 + .../ckeditor5-image/lang/translations/it.po | 146 + .../ckeditor5-image/lang/translations/ja.po | 146 + .../ckeditor5-image/lang/translations/jv.po | 146 + .../ckeditor5-image/lang/translations/km.po | 146 + .../ckeditor5-image/lang/translations/kn.po | 146 + .../ckeditor5-image/lang/translations/ko.po | 146 + .../ckeditor5-image/lang/translations/ku.po | 146 + .../ckeditor5-image/lang/translations/lt.po | 146 + .../ckeditor5-image/lang/translations/lv.po | 146 + .../ckeditor5-image/lang/translations/ms.po | 146 + .../ckeditor5-image/lang/translations/nb.po | 146 + .../ckeditor5-image/lang/translations/ne.po | 146 + .../ckeditor5-image/lang/translations/nl.po | 146 + .../ckeditor5-image/lang/translations/no.po | 146 + .../ckeditor5-image/lang/translations/pl.po | 146 + .../lang/translations/pt-br.po | 146 + .../ckeditor5-image/lang/translations/pt.po | 146 + .../ckeditor5-image/lang/translations/ro.po | 146 + .../ckeditor5-image/lang/translations/ru.po | 146 + .../ckeditor5-image/lang/translations/si.po | 146 + .../ckeditor5-image/lang/translations/sk.po | 146 + .../ckeditor5-image/lang/translations/sq.po | 146 + .../lang/translations/sr-latn.po | 146 + .../ckeditor5-image/lang/translations/sr.po | 146 + .../ckeditor5-image/lang/translations/sv.po | 146 + .../ckeditor5-image/lang/translations/th.po | 146 + .../ckeditor5-image/lang/translations/tk.po | 146 + .../ckeditor5-image/lang/translations/tr.po | 146 + .../ckeditor5-image/lang/translations/tt.po | 146 + .../ckeditor5-image/lang/translations/ug.po | 146 + .../ckeditor5-image/lang/translations/uk.po | 146 + .../ckeditor5-image/lang/translations/ur.po | 146 + .../ckeditor5-image/lang/translations/uz.po | 146 + .../ckeditor5-image/lang/translations/vi.po | 146 + .../lang/translations/zh-cn.po | 146 + .../ckeditor5-image/lang/translations/zh.po | 146 + .../@ckeditor/ckeditor5-image/package.json | 39 + .../ckeditor5-image/src/augmentation.d.ts | 56 + .../ckeditor5-image/src/augmentation.js | 5 + .../ckeditor5-image/src/autoimage.d.ts | 52 + .../ckeditor5-image/src/autoimage.js | 132 + .../@ckeditor/ckeditor5-image/src/image.d.ts | 34 + .../@ckeditor/ckeditor5-image/src/image.js | 38 + .../ckeditor5-image/src/image/converters.d.ts | 66 + .../ckeditor5-image/src/image/converters.js | 232 + .../src/image/imageblockediting.d.ts | 59 + .../src/image/imageblockediting.js | 153 + .../src/image/imageediting.d.ts | 30 + .../ckeditor5-image/src/image/imageediting.js | 63 + .../src/image/imageinlineediting.d.ts | 60 + .../src/image/imageinlineediting.js | 177 + .../src/image/imageloadobserver.d.ts | 48 + .../src/image/imageloadobserver.js | 52 + .../src/image/imageplaceholder.d.ts | 39 + .../src/image/imageplaceholder.js | 113 + .../src/image/imagetypecommand.d.ts | 44 + .../src/image/imagetypecommand.js | 80 + .../src/image/insertimagecommand.d.ts | 66 + .../src/image/insertimagecommand.js | 120 + .../src/image/replaceimagesourcecommand.d.ts | 51 + .../src/image/replaceimagesourcecommand.js | 75 + .../ckeditor5-image/src/image/ui/utils.d.ts | 25 + .../ckeditor5-image/src/image/ui/utils.js | 44 + .../ckeditor5-image/src/image/utils.d.ts | 64 + .../ckeditor5-image/src/image/utils.js | 121 + .../ckeditor5-image/src/imageblock.d.ts | 34 + .../ckeditor5-image/src/imageblock.js | 38 + .../ckeditor5-image/src/imagecaption.d.ts | 26 + .../ckeditor5-image/src/imagecaption.js | 30 + .../src/imagecaption/imagecaptionediting.d.ts | 89 + .../src/imagecaption/imagecaptionediting.js | 225 + .../src/imagecaption/imagecaptionui.d.ts | 26 + .../src/imagecaption/imagecaptionui.js | 61 + .../src/imagecaption/imagecaptionutils.d.ts | 38 + .../src/imagecaption/imagecaptionutils.js | 62 + .../toggleimagecaptioncommand.d.ts | 66 + .../imagecaption/toggleimagecaptioncommand.js | 138 + .../ckeditor5-image/src/imageconfig.d.ts | 712 ++ .../ckeditor5-image/src/imageconfig.js | 5 + .../ckeditor5-image/src/imageinline.d.ts | 34 + .../ckeditor5-image/src/imageinline.js | 38 + .../ckeditor5-image/src/imageinsert.d.ts | 33 + .../ckeditor5-image/src/imageinsert.js | 37 + .../src/imageinsert/imageinsertui.d.ts | 74 + .../src/imageinsert/imageinsertui.js | 174 + .../src/imageinsert/imageinsertviaurlui.d.ts | 44 + .../src/imageinsert/imageinsertviaurlui.js | 121 + .../imageinsert/ui/imageinsertformview.d.ts | 56 + .../src/imageinsert/ui/imageinsertformview.js | 112 + .../imageinsert/ui/imageinserturlview.d.ts | 107 + .../src/imageinsert/ui/imageinserturlview.js | 156 + .../src/imageinsertviaurl.d.ts | 31 + .../ckeditor5-image/src/imageinsertviaurl.js | 35 + .../ckeditor5-image/src/imageresize.d.ts | 27 + .../ckeditor5-image/src/imageresize.js | 31 + .../src/imageresize/imageresizebuttons.d.ts | 67 + .../src/imageresize/imageresizebuttons.js | 217 + .../src/imageresize/imageresizeediting.d.ts | 41 + .../src/imageresize/imageresizeediting.js | 170 + .../src/imageresize/imageresizehandles.d.ts | 31 + .../src/imageresize/imageresizehandles.js | 113 + .../src/imageresize/resizeimagecommand.d.ts | 42 + .../src/imageresize/resizeimagecommand.js | 63 + .../src/imagesizeattributes.d.ts | 34 + .../src/imagesizeattributes.js | 142 + .../ckeditor5-image/src/imagestyle.d.ts | 32 + .../ckeditor5-image/src/imagestyle.js | 36 + .../src/imagestyle/converters.d.ts | 24 + .../src/imagestyle/converters.js | 79 + .../src/imagestyle/imagestylecommand.d.ts | 68 + .../src/imagestyle/imagestylecommand.js | 107 + .../src/imagestyle/imagestyleediting.d.ts | 50 + .../src/imagestyle/imagestyleediting.js | 108 + .../src/imagestyle/imagestyleui.d.ts | 56 + .../src/imagestyle/imagestyleui.js | 192 + .../ckeditor5-image/src/imagestyle/utils.d.ts | 101 + .../ckeditor5-image/src/imagestyle/utils.js | 329 + .../src/imagetextalternative.d.ts | 29 + .../src/imagetextalternative.js | 33 + .../imagetextalternativecommand.d.ts | 34 + .../imagetextalternativecommand.js | 44 + .../imagetextalternativeediting.d.ts | 28 + .../imagetextalternativeediting.js | 35 + .../imagetextalternativeui.d.ts | 68 + .../imagetextalternativeui.js | 173 + .../ui/textalternativeformview.d.ts | 90 + .../ui/textalternativeformview.js | 121 + .../ckeditor5-image/src/imagetoolbar.d.ts | 35 + .../ckeditor5-image/src/imagetoolbar.js | 57 + .../ckeditor5-image/src/imageupload.d.ts | 32 + .../ckeditor5-image/src/imageupload.js | 36 + .../src/imageupload/imageuploadediting.d.ts | 111 + .../src/imageupload/imageuploadediting.js | 337 + .../src/imageupload/imageuploadprogress.d.ts | 42 + .../src/imageupload/imageuploadprogress.js | 211 + .../src/imageupload/imageuploadui.d.ts | 30 + .../src/imageupload/imageuploadui.js | 101 + .../src/imageupload/uploadimagecommand.d.ts | 60 + .../src/imageupload/uploadimagecommand.js | 100 + .../src/imageupload/utils.d.ts | 33 + .../ckeditor5-image/src/imageupload/utils.js | 112 + .../ckeditor5-image/src/imageutils.d.ts | 125 + .../ckeditor5-image/src/imageutils.js | 306 + .../@ckeditor/ckeditor5-image/src/index.d.ts | 48 + .../@ckeditor/ckeditor5-image/src/index.js | 39 + .../ckeditor5-image/src/pictureediting.d.ts | 88 + .../ckeditor5-image/src/pictureediting.js | 130 + .../@ckeditor/ckeditor5-image/theme/image.css | 143 + .../ckeditor5-image/theme/imagecaption.css | 37 + .../ckeditor5-image/theme/imageinsert.css | 11 + .../theme/imageplaceholder.css | 10 + .../ckeditor5-image/theme/imageresize.css | 53 + .../ckeditor5-image/theme/imagestyle.css | 107 + .../ckeditor5-image/theme/imageuploadicon.css | 23 + .../theme/imageuploadloader.css | 18 + .../theme/imageuploadprogress.css | 19 + .../theme/textalternativeform.css | 32 + .../@ckeditor/ckeditor5-indent/CHANGELOG.md | 71 + .../@ckeditor/ckeditor5-indent/LICENSE.md | 17 + .../@ckeditor/ckeditor5-indent/README.md | 20 + .../ckeditor5-indent/build/indent.js | 5 + .../ckeditor5-indent/build/translations/ar.js | 1 + .../ckeditor5-indent/build/translations/az.js | 1 + .../ckeditor5-indent/build/translations/bg.js | 1 + .../ckeditor5-indent/build/translations/bn.js | 1 + .../ckeditor5-indent/build/translations/ca.js | 1 + .../ckeditor5-indent/build/translations/cs.js | 1 + .../ckeditor5-indent/build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../ckeditor5-indent/build/translations/de.js | 1 + .../ckeditor5-indent/build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../ckeditor5-indent/build/translations/es.js | 1 + .../ckeditor5-indent/build/translations/et.js | 1 + .../ckeditor5-indent/build/translations/fa.js | 1 + .../ckeditor5-indent/build/translations/fi.js | 1 + .../ckeditor5-indent/build/translations/fr.js | 1 + .../ckeditor5-indent/build/translations/gl.js | 1 + .../ckeditor5-indent/build/translations/he.js | 1 + .../ckeditor5-indent/build/translations/hi.js | 1 + .../ckeditor5-indent/build/translations/hr.js | 1 + .../ckeditor5-indent/build/translations/hu.js | 1 + .../ckeditor5-indent/build/translations/id.js | 1 + .../ckeditor5-indent/build/translations/it.js | 1 + .../ckeditor5-indent/build/translations/ja.js | 1 + .../ckeditor5-indent/build/translations/ko.js | 1 + .../ckeditor5-indent/build/translations/ku.js | 1 + .../ckeditor5-indent/build/translations/lt.js | 1 + .../ckeditor5-indent/build/translations/lv.js | 1 + .../ckeditor5-indent/build/translations/ms.js | 1 + .../ckeditor5-indent/build/translations/ne.js | 1 + .../ckeditor5-indent/build/translations/nl.js | 1 + .../ckeditor5-indent/build/translations/no.js | 1 + .../ckeditor5-indent/build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../ckeditor5-indent/build/translations/pt.js | 1 + .../ckeditor5-indent/build/translations/ro.js | 1 + .../ckeditor5-indent/build/translations/ru.js | 1 + .../ckeditor5-indent/build/translations/sk.js | 1 + .../build/translations/sr-latn.js | 1 + .../ckeditor5-indent/build/translations/sr.js | 1 + .../ckeditor5-indent/build/translations/sv.js | 1 + .../ckeditor5-indent/build/translations/th.js | 1 + .../ckeditor5-indent/build/translations/tk.js | 1 + .../ckeditor5-indent/build/translations/tr.js | 1 + .../ckeditor5-indent/build/translations/ug.js | 1 + .../ckeditor5-indent/build/translations/uk.js | 1 + .../ckeditor5-indent/build/translations/ur.js | 1 + .../ckeditor5-indent/build/translations/uz.js | 1 + .../ckeditor5-indent/build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../ckeditor5-indent/build/translations/zh.js | 1 + .../ckeditor5-indent/ckeditor5-metadata.json | 49 + .../ckeditor5-indent/lang/contexts.json | 4 + .../ckeditor5-indent/lang/translations/ar.po | 26 + .../ckeditor5-indent/lang/translations/az.po | 26 + .../ckeditor5-indent/lang/translations/bg.po | 26 + .../ckeditor5-indent/lang/translations/bn.po | 26 + .../ckeditor5-indent/lang/translations/ca.po | 26 + .../ckeditor5-indent/lang/translations/cs.po | 26 + .../ckeditor5-indent/lang/translations/da.po | 26 + .../lang/translations/de-ch.po | 26 + .../ckeditor5-indent/lang/translations/de.po | 26 + .../ckeditor5-indent/lang/translations/el.po | 26 + .../lang/translations/en-au.po | 26 + .../lang/translations/en-gb.po | 26 + .../ckeditor5-indent/lang/translations/en.po | 26 + .../ckeditor5-indent/lang/translations/es.po | 26 + .../ckeditor5-indent/lang/translations/et.po | 26 + .../ckeditor5-indent/lang/translations/fa.po | 26 + .../ckeditor5-indent/lang/translations/fi.po | 26 + .../ckeditor5-indent/lang/translations/fr.po | 26 + .../ckeditor5-indent/lang/translations/gl.po | 26 + .../ckeditor5-indent/lang/translations/he.po | 26 + .../ckeditor5-indent/lang/translations/hi.po | 26 + .../ckeditor5-indent/lang/translations/hr.po | 26 + .../ckeditor5-indent/lang/translations/hu.po | 26 + .../ckeditor5-indent/lang/translations/id.po | 26 + .../ckeditor5-indent/lang/translations/it.po | 26 + .../ckeditor5-indent/lang/translations/ja.po | 26 + .../ckeditor5-indent/lang/translations/ko.po | 26 + .../ckeditor5-indent/lang/translations/ku.po | 26 + .../ckeditor5-indent/lang/translations/lt.po | 26 + .../ckeditor5-indent/lang/translations/lv.po | 26 + .../ckeditor5-indent/lang/translations/ms.po | 26 + .../ckeditor5-indent/lang/translations/ne.po | 26 + .../ckeditor5-indent/lang/translations/nl.po | 26 + .../ckeditor5-indent/lang/translations/no.po | 26 + .../ckeditor5-indent/lang/translations/pl.po | 26 + .../lang/translations/pt-br.po | 26 + .../ckeditor5-indent/lang/translations/pt.po | 26 + .../ckeditor5-indent/lang/translations/ro.po | 26 + .../ckeditor5-indent/lang/translations/ru.po | 26 + .../ckeditor5-indent/lang/translations/sk.po | 26 + .../lang/translations/sr-latn.po | 26 + .../ckeditor5-indent/lang/translations/sr.po | 26 + .../ckeditor5-indent/lang/translations/sv.po | 26 + .../ckeditor5-indent/lang/translations/th.po | 26 + .../ckeditor5-indent/lang/translations/tk.po | 26 + .../ckeditor5-indent/lang/translations/tr.po | 26 + .../ckeditor5-indent/lang/translations/ug.po | 26 + .../ckeditor5-indent/lang/translations/uk.po | 26 + .../ckeditor5-indent/lang/translations/ur.po | 26 + .../ckeditor5-indent/lang/translations/uz.po | 26 + .../ckeditor5-indent/lang/translations/vi.po | 26 + .../lang/translations/zh-cn.po | 26 + .../ckeditor5-indent/lang/translations/zh.po | 26 + .../@ckeditor/ckeditor5-indent/package.json | 37 + .../ckeditor5-indent/src/augmentation.d.ts | 24 + .../ckeditor5-indent/src/augmentation.js | 5 + .../ckeditor5-indent/src/indent.d.ts | 40 + .../@ckeditor/ckeditor5-indent/src/indent.js | 44 + .../ckeditor5-indent/src/indentblock.d.ts | 42 + .../ckeditor5-indent/src/indentblock.js | 147 + .../src/indentblockcommand.d.ts | 56 + .../src/indentblockcommand.js | 98 + .../indentcommandbehavior/indentbehavior.d.ts | 25 + .../indentcommandbehavior/indentbehavior.js | 5 + .../indentusingclasses.d.ts | 39 + .../indentusingclasses.js | 39 + .../indentusingoffset.d.ts | 45 + .../indentusingoffset.js | 42 + .../ckeditor5-indent/src/indentconfig.d.ts | 72 + .../ckeditor5-indent/src/indentconfig.js | 5 + .../ckeditor5-indent/src/indentediting.d.ts | 26 + .../ckeditor5-indent/src/indentediting.js | 32 + .../ckeditor5-indent/src/indentui.d.ts | 31 + .../ckeditor5-indent/src/indentui.js | 72 + .../@ckeditor/ckeditor5-indent/src/index.d.ts | 14 + .../@ckeditor/ckeditor5-indent/src/index.js | 12 + .../@ckeditor/ckeditor5-link/CHANGELOG.md | 313 + .../@ckeditor/ckeditor5-link/LICENSE.md | 21 + .../@ckeditor/ckeditor5-link/README.md | 20 + .../@ckeditor/ckeditor5-link/build/link.js | 5 + .../ckeditor5-link/build/translations/ar.js | 1 + .../ckeditor5-link/build/translations/ast.js | 1 + .../ckeditor5-link/build/translations/az.js | 1 + .../ckeditor5-link/build/translations/bg.js | 1 + .../ckeditor5-link/build/translations/bn.js | 1 + .../ckeditor5-link/build/translations/ca.js | 1 + .../ckeditor5-link/build/translations/cs.js | 1 + .../ckeditor5-link/build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../ckeditor5-link/build/translations/de.js | 1 + .../ckeditor5-link/build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../ckeditor5-link/build/translations/eo.js | 1 + .../ckeditor5-link/build/translations/es.js | 1 + .../ckeditor5-link/build/translations/et.js | 1 + .../ckeditor5-link/build/translations/eu.js | 1 + .../ckeditor5-link/build/translations/fa.js | 1 + .../ckeditor5-link/build/translations/fi.js | 1 + .../ckeditor5-link/build/translations/fr.js | 1 + .../ckeditor5-link/build/translations/gl.js | 1 + .../ckeditor5-link/build/translations/he.js | 1 + .../ckeditor5-link/build/translations/hi.js | 1 + .../ckeditor5-link/build/translations/hr.js | 1 + .../ckeditor5-link/build/translations/hu.js | 1 + .../ckeditor5-link/build/translations/hy.js | 1 + .../ckeditor5-link/build/translations/id.js | 1 + .../ckeditor5-link/build/translations/it.js | 1 + .../ckeditor5-link/build/translations/ja.js | 1 + .../ckeditor5-link/build/translations/km.js | 1 + .../ckeditor5-link/build/translations/kn.js | 1 + .../ckeditor5-link/build/translations/ko.js | 1 + .../ckeditor5-link/build/translations/ku.js | 1 + .../ckeditor5-link/build/translations/lt.js | 1 + .../ckeditor5-link/build/translations/lv.js | 1 + .../ckeditor5-link/build/translations/ms.js | 1 + .../ckeditor5-link/build/translations/nb.js | 1 + .../ckeditor5-link/build/translations/ne.js | 1 + .../ckeditor5-link/build/translations/nl.js | 1 + .../ckeditor5-link/build/translations/no.js | 1 + .../ckeditor5-link/build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../ckeditor5-link/build/translations/pt.js | 1 + .../ckeditor5-link/build/translations/ro.js | 1 + .../ckeditor5-link/build/translations/ru.js | 1 + .../ckeditor5-link/build/translations/sk.js | 1 + .../ckeditor5-link/build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../ckeditor5-link/build/translations/sr.js | 1 + .../ckeditor5-link/build/translations/sv.js | 1 + .../ckeditor5-link/build/translations/th.js | 1 + .../ckeditor5-link/build/translations/tk.js | 1 + .../ckeditor5-link/build/translations/tr.js | 1 + .../ckeditor5-link/build/translations/tt.js | 1 + .../ckeditor5-link/build/translations/ug.js | 1 + .../ckeditor5-link/build/translations/uk.js | 1 + .../ckeditor5-link/build/translations/ur.js | 1 + .../ckeditor5-link/build/translations/uz.js | 1 + .../ckeditor5-link/build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../ckeditor5-link/build/translations/zh.js | 1 + .../ckeditor5-link/ckeditor5-metadata.json | 78 + .../ckeditor5-link/lang/contexts.json | 13 + .../ckeditor5-link/lang/translations/ar.po | 62 + .../ckeditor5-link/lang/translations/ast.po | 62 + .../ckeditor5-link/lang/translations/az.po | 62 + .../ckeditor5-link/lang/translations/bg.po | 62 + .../ckeditor5-link/lang/translations/bn.po | 64 + .../ckeditor5-link/lang/translations/ca.po | 62 + .../ckeditor5-link/lang/translations/cs.po | 62 + .../ckeditor5-link/lang/translations/da.po | 62 + .../ckeditor5-link/lang/translations/de-ch.po | 62 + .../ckeditor5-link/lang/translations/de.po | 62 + .../ckeditor5-link/lang/translations/el.po | 62 + .../ckeditor5-link/lang/translations/en-au.po | 62 + .../ckeditor5-link/lang/translations/en-gb.po | 62 + .../ckeditor5-link/lang/translations/en.po | 62 + .../ckeditor5-link/lang/translations/eo.po | 62 + .../ckeditor5-link/lang/translations/es.po | 62 + .../ckeditor5-link/lang/translations/et.po | 62 + .../ckeditor5-link/lang/translations/eu.po | 62 + .../ckeditor5-link/lang/translations/fa.po | 62 + .../ckeditor5-link/lang/translations/fi.po | 62 + .../ckeditor5-link/lang/translations/fr.po | 62 + .../ckeditor5-link/lang/translations/gl.po | 62 + .../ckeditor5-link/lang/translations/he.po | 62 + .../ckeditor5-link/lang/translations/hi.po | 62 + .../ckeditor5-link/lang/translations/hr.po | 62 + .../ckeditor5-link/lang/translations/hu.po | 62 + .../ckeditor5-link/lang/translations/hy.po | 62 + .../ckeditor5-link/lang/translations/id.po | 62 + .../ckeditor5-link/lang/translations/it.po | 62 + .../ckeditor5-link/lang/translations/ja.po | 62 + .../ckeditor5-link/lang/translations/km.po | 62 + .../ckeditor5-link/lang/translations/kn.po | 62 + .../ckeditor5-link/lang/translations/ko.po | 62 + .../ckeditor5-link/lang/translations/ku.po | 62 + .../ckeditor5-link/lang/translations/lt.po | 62 + .../ckeditor5-link/lang/translations/lv.po | 62 + .../ckeditor5-link/lang/translations/ms.po | 62 + .../ckeditor5-link/lang/translations/nb.po | 62 + .../ckeditor5-link/lang/translations/ne.po | 62 + .../ckeditor5-link/lang/translations/nl.po | 62 + .../ckeditor5-link/lang/translations/no.po | 62 + .../ckeditor5-link/lang/translations/pl.po | 62 + .../ckeditor5-link/lang/translations/pt-br.po | 62 + .../ckeditor5-link/lang/translations/pt.po | 62 + .../ckeditor5-link/lang/translations/ro.po | 62 + .../ckeditor5-link/lang/translations/ru.po | 62 + .../ckeditor5-link/lang/translations/sk.po | 62 + .../ckeditor5-link/lang/translations/sq.po | 62 + .../lang/translations/sr-latn.po | 62 + .../ckeditor5-link/lang/translations/sr.po | 62 + .../ckeditor5-link/lang/translations/sv.po | 62 + .../ckeditor5-link/lang/translations/th.po | 62 + .../ckeditor5-link/lang/translations/tk.po | 62 + .../ckeditor5-link/lang/translations/tr.po | 62 + .../ckeditor5-link/lang/translations/tt.po | 62 + .../ckeditor5-link/lang/translations/ug.po | 62 + .../ckeditor5-link/lang/translations/uk.po | 62 + .../ckeditor5-link/lang/translations/ur.po | 62 + .../ckeditor5-link/lang/translations/uz.po | 62 + .../ckeditor5-link/lang/translations/vi.po | 62 + .../ckeditor5-link/lang/translations/zh-cn.po | 62 + .../ckeditor5-link/lang/translations/zh.po | 62 + .../@ckeditor/ckeditor5-link/package.json | 39 + .../ckeditor5-link/src/augmentation.d.ts | 30 + .../ckeditor5-link/src/augmentation.js | 5 + .../ckeditor5-link/src/autolink.d.ts | 75 + .../@ckeditor/ckeditor5-link/src/autolink.js | 284 + .../@ckeditor/ckeditor5-link/src/index.d.ts | 18 + .../@ckeditor/ckeditor5-link/src/index.js | 17 + .../@ckeditor/ckeditor5-link/src/link.d.ts | 27 + .../@ckeditor/ckeditor5-link/src/link.js | 31 + .../ckeditor5-link/src/linkcommand.d.ts | 132 + .../ckeditor5-link/src/linkcommand.js | 285 + .../ckeditor5-link/src/linkconfig.d.ts | 290 + .../ckeditor5-link/src/linkconfig.js | 5 + .../ckeditor5-link/src/linkediting.d.ts | 70 + .../ckeditor5-link/src/linkediting.js | 280 + .../ckeditor5-link/src/linkimage.d.ts | 27 + .../@ckeditor/ckeditor5-link/src/linkimage.js | 31 + .../ckeditor5-link/src/linkimageediting.d.ts | 39 + .../ckeditor5-link/src/linkimageediting.js | 245 + .../ckeditor5-link/src/linkimageui.d.ts | 40 + .../ckeditor5-link/src/linkimageui.js | 96 + .../@ckeditor/ckeditor5-link/src/linkui.d.ts | 169 + .../@ckeditor/ckeditor5-link/src/linkui.js | 617 ++ .../src/ui/linkactionsview.d.ts | 103 + .../ckeditor5-link/src/ui/linkactionsview.js | 157 + .../ckeditor5-link/src/ui/linkformview.d.ts | 141 + .../ckeditor5-link/src/ui/linkformview.js | 232 + .../ckeditor5-link/src/unlinkcommand.d.ts | 31 + .../ckeditor5-link/src/unlinkcommand.js | 66 + .../@ckeditor/ckeditor5-link/src/utils.d.ts | 80 + .../@ckeditor/ckeditor5-link/src/utils.js | 135 + .../src/utils/automaticdecorators.d.ts | 45 + .../src/utils/automaticdecorators.js | 140 + .../src/utils/manualdecorator.d.ts | 72 + .../src/utils/manualdecorator.js | 47 + .../ckeditor5-link/theme/icons/link.svg | 1 + .../ckeditor5-link/theme/icons/unlink.svg | 1 + .../@ckeditor/ckeditor5-link/theme/link.css | 10 + .../ckeditor5-link/theme/linkactions.css | 32 + .../ckeditor5-link/theme/linkform.css | 45 + .../ckeditor5-link/theme/linkimage.css | 16 + .../@ckeditor/ckeditor5-list/CHANGELOG.md | 272 + .../@ckeditor/ckeditor5-list/LICENSE.md | 17 + .../@ckeditor/ckeditor5-list/README.md | 20 + .../@ckeditor/ckeditor5-list/build/list.js | 5 + .../ckeditor5-list/build/translations/ar.js | 1 + .../ckeditor5-list/build/translations/ast.js | 1 + .../ckeditor5-list/build/translations/az.js | 1 + .../ckeditor5-list/build/translations/bg.js | 1 + .../ckeditor5-list/build/translations/bn.js | 1 + .../ckeditor5-list/build/translations/ca.js | 1 + .../ckeditor5-list/build/translations/cs.js | 1 + .../ckeditor5-list/build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../ckeditor5-list/build/translations/de.js | 1 + .../ckeditor5-list/build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../ckeditor5-list/build/translations/eo.js | 1 + .../ckeditor5-list/build/translations/es.js | 1 + .../ckeditor5-list/build/translations/et.js | 1 + .../ckeditor5-list/build/translations/eu.js | 1 + .../ckeditor5-list/build/translations/fa.js | 1 + .../ckeditor5-list/build/translations/fi.js | 1 + .../ckeditor5-list/build/translations/fr.js | 1 + .../ckeditor5-list/build/translations/gl.js | 1 + .../ckeditor5-list/build/translations/he.js | 1 + .../ckeditor5-list/build/translations/hi.js | 1 + .../ckeditor5-list/build/translations/hr.js | 1 + .../ckeditor5-list/build/translations/hu.js | 1 + .../ckeditor5-list/build/translations/id.js | 1 + .../ckeditor5-list/build/translations/it.js | 1 + .../ckeditor5-list/build/translations/ja.js | 1 + .../ckeditor5-list/build/translations/jv.js | 1 + .../ckeditor5-list/build/translations/km.js | 1 + .../ckeditor5-list/build/translations/kn.js | 1 + .../ckeditor5-list/build/translations/ko.js | 1 + .../ckeditor5-list/build/translations/ku.js | 1 + .../ckeditor5-list/build/translations/lt.js | 1 + .../ckeditor5-list/build/translations/lv.js | 1 + .../ckeditor5-list/build/translations/ms.js | 1 + .../ckeditor5-list/build/translations/nb.js | 1 + .../ckeditor5-list/build/translations/ne.js | 1 + .../ckeditor5-list/build/translations/nl.js | 1 + .../ckeditor5-list/build/translations/no.js | 1 + .../ckeditor5-list/build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../ckeditor5-list/build/translations/pt.js | 1 + .../ckeditor5-list/build/translations/ro.js | 1 + .../ckeditor5-list/build/translations/ru.js | 1 + .../ckeditor5-list/build/translations/si.js | 1 + .../ckeditor5-list/build/translations/sk.js | 1 + .../ckeditor5-list/build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../ckeditor5-list/build/translations/sr.js | 1 + .../ckeditor5-list/build/translations/sv.js | 1 + .../ckeditor5-list/build/translations/th.js | 1 + .../ckeditor5-list/build/translations/tk.js | 1 + .../ckeditor5-list/build/translations/tr.js | 1 + .../ckeditor5-list/build/translations/tt.js | 1 + .../ckeditor5-list/build/translations/ug.js | 1 + .../ckeditor5-list/build/translations/uk.js | 1 + .../ckeditor5-list/build/translations/ur.js | 1 + .../ckeditor5-list/build/translations/uz.js | 1 + .../ckeditor5-list/build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../ckeditor5-list/build/translations/zh.js | 1 + .../ckeditor5-list/ckeditor5-metadata.json | 193 + .../ckeditor5-list/lang/contexts.json | 33 + .../ckeditor5-list/lang/translations/ar.po | 142 + .../ckeditor5-list/lang/translations/ast.po | 142 + .../ckeditor5-list/lang/translations/az.po | 142 + .../ckeditor5-list/lang/translations/bg.po | 142 + .../ckeditor5-list/lang/translations/bn.po | 142 + .../ckeditor5-list/lang/translations/ca.po | 142 + .../ckeditor5-list/lang/translations/cs.po | 142 + .../ckeditor5-list/lang/translations/da.po | 142 + .../ckeditor5-list/lang/translations/de-ch.po | 142 + .../ckeditor5-list/lang/translations/de.po | 142 + .../ckeditor5-list/lang/translations/el.po | 142 + .../ckeditor5-list/lang/translations/en-au.po | 142 + .../ckeditor5-list/lang/translations/en-gb.po | 142 + .../ckeditor5-list/lang/translations/en.po | 142 + .../ckeditor5-list/lang/translations/eo.po | 142 + .../ckeditor5-list/lang/translations/es.po | 142 + .../ckeditor5-list/lang/translations/et.po | 142 + .../ckeditor5-list/lang/translations/eu.po | 142 + .../ckeditor5-list/lang/translations/fa.po | 142 + .../ckeditor5-list/lang/translations/fi.po | 142 + .../ckeditor5-list/lang/translations/fr.po | 142 + .../ckeditor5-list/lang/translations/gl.po | 142 + .../ckeditor5-list/lang/translations/he.po | 142 + .../ckeditor5-list/lang/translations/hi.po | 142 + .../ckeditor5-list/lang/translations/hr.po | 142 + .../ckeditor5-list/lang/translations/hu.po | 142 + .../ckeditor5-list/lang/translations/id.po | 142 + .../ckeditor5-list/lang/translations/it.po | 142 + .../ckeditor5-list/lang/translations/ja.po | 142 + .../ckeditor5-list/lang/translations/jv.po | 142 + .../ckeditor5-list/lang/translations/km.po | 142 + .../ckeditor5-list/lang/translations/kn.po | 142 + .../ckeditor5-list/lang/translations/ko.po | 142 + .../ckeditor5-list/lang/translations/ku.po | 142 + .../ckeditor5-list/lang/translations/lt.po | 142 + .../ckeditor5-list/lang/translations/lv.po | 142 + .../ckeditor5-list/lang/translations/ms.po | 142 + .../ckeditor5-list/lang/translations/nb.po | 142 + .../ckeditor5-list/lang/translations/ne.po | 142 + .../ckeditor5-list/lang/translations/nl.po | 142 + .../ckeditor5-list/lang/translations/no.po | 142 + .../ckeditor5-list/lang/translations/pl.po | 142 + .../ckeditor5-list/lang/translations/pt-br.po | 142 + .../ckeditor5-list/lang/translations/pt.po | 142 + .../ckeditor5-list/lang/translations/ro.po | 142 + .../ckeditor5-list/lang/translations/ru.po | 142 + .../ckeditor5-list/lang/translations/si.po | 142 + .../ckeditor5-list/lang/translations/sk.po | 142 + .../ckeditor5-list/lang/translations/sq.po | 142 + .../lang/translations/sr-latn.po | 142 + .../ckeditor5-list/lang/translations/sr.po | 142 + .../ckeditor5-list/lang/translations/sv.po | 142 + .../ckeditor5-list/lang/translations/th.po | 142 + .../ckeditor5-list/lang/translations/tk.po | 142 + .../ckeditor5-list/lang/translations/tr.po | 142 + .../ckeditor5-list/lang/translations/tt.po | 142 + .../ckeditor5-list/lang/translations/ug.po | 142 + .../ckeditor5-list/lang/translations/uk.po | 142 + .../ckeditor5-list/lang/translations/ur.po | 142 + .../ckeditor5-list/lang/translations/uz.po | 142 + .../ckeditor5-list/lang/translations/vi.po | 142 + .../ckeditor5-list/lang/translations/zh-cn.po | 142 + .../ckeditor5-list/lang/translations/zh.po | 142 + .../@ckeditor/ckeditor5-list/package.json | 37 + .../ckeditor5-list/src/augmentation.d.ts | 53 + .../ckeditor5-list/src/augmentation.js | 5 + .../ckeditor5-list/src/documentlist.d.ts | 28 + .../ckeditor5-list/src/documentlist.js | 41 + .../src/documentlistproperties.d.ts | 28 + .../src/documentlistproperties.js | 41 + .../@ckeditor/ckeditor5-list/src/index.d.ts | 45 + .../@ckeditor/ckeditor5-list/src/index.js | 39 + .../ckeditor5-list/src/legacylist.d.ts | 26 + .../ckeditor5-list/src/legacylist.js | 30 + .../src/legacylist/legacyconverters.d.ts | 196 + .../src/legacylist/legacyconverters.js | 905 ++ .../src/legacylist/legacyindentcommand.d.ts | 37 + .../src/legacylist/legacyindentcommand.js | 107 + .../src/legacylist/legacylistcommand.d.ts | 56 + .../src/legacylist/legacylistcommand.js | 274 + .../src/legacylist/legacylistediting.d.ts | 32 + .../src/legacylist/legacylistediting.js | 161 + .../src/legacylist/legacylistutils.d.ts | 41 + .../src/legacylist/legacylistutils.js | 46 + .../src/legacylist/legacyutils.d.ts | 101 + .../src/legacylist/legacyutils.js | 347 + .../src/legacylistproperties.d.ts | 27 + .../src/legacylistproperties.js | 31 + .../legacylistpropertiesediting.d.ts | 72 + .../legacylistpropertiesediting.js | 696 ++ .../legacylistreversedcommand.d.ts | 38 + .../legacylistreversedcommand.js | 52 + .../legacyliststartcommand.d.ts | 37 + .../legacyliststartcommand.js | 51 + .../legacyliststylecommand.d.ts | 67 + .../legacyliststylecommand.js | 100 + .../ckeditor5-list/src/legacytodolist.d.ts | 27 + .../ckeditor5-list/src/legacytodolist.js | 31 + .../legacychecktodolistcommand.d.ts | 52 + .../legacychecktodolistcommand.js | 76 + .../legacytodolistconverters.d.ts | 83 + .../legacytodolistconverters.js | 261 + .../legacytodolist/legacytodolistediting.d.ts | 39 + .../legacytodolist/legacytodolistediting.js | 161 + .../@ckeditor/ckeditor5-list/src/list.d.ts | 26 + .../@ckeditor/ckeditor5-list/src/list.js | 30 + .../src/list/adjacentlistssupport.d.ts | 15 + .../src/list/adjacentlistssupport.js | 81 + .../ckeditor5-list/src/list/converters.d.ts | 73 + .../ckeditor5-list/src/list/converters.js | 515 + .../ckeditor5-list/src/list/listcommand.d.ts | 92 + .../ckeditor5-list/src/list/listcommand.js | 163 + .../ckeditor5-list/src/list/listediting.d.ts | 222 + .../ckeditor5-list/src/list/listediting.js | 674 ++ .../src/list/listindentcommand.d.ts | 62 + .../src/list/listindentcommand.js | 129 + .../src/list/listmergecommand.d.ts | 76 + .../src/list/listmergecommand.js | 174 + .../src/list/listsplitcommand.d.ts | 67 + .../src/list/listsplitcommand.js | 70 + .../ckeditor5-list/src/list/listui.d.ts | 19 + .../ckeditor5-list/src/list/listui.js | 30 + .../ckeditor5-list/src/list/listutils.d.ts | 52 + .../ckeditor5-list/src/list/listutils.js | 56 + .../ckeditor5-list/src/list/utils.d.ts | 18 + .../ckeditor5-list/src/list/utils.js | 44 + .../src/list/utils/listwalker.d.ts | 142 + .../src/list/utils/listwalker.js | 182 + .../ckeditor5-list/src/list/utils/model.d.ts | 209 + .../ckeditor5-list/src/list/utils/model.js | 464 + .../src/list/utils/postfixers.d.ts | 37 + .../src/list/utils/postfixers.js | 126 + .../ckeditor5-list/src/list/utils/view.d.ts | 82 + .../ckeditor5-list/src/list/utils/view.js | 117 + .../ckeditor5-list/src/listconfig.d.ts | 132 + .../ckeditor5-list/src/listconfig.js | 5 + .../ckeditor5-list/src/listproperties.d.ts | 27 + .../ckeditor5-list/src/listproperties.js | 31 + .../src/listproperties/converters.d.ts | 19 + .../src/listproperties/converters.js | 43 + .../listproperties/listpropertiesediting.d.ts | 88 + .../listproperties/listpropertiesediting.js | 267 + .../src/listproperties/listpropertiesui.d.ts | 23 + .../src/listproperties/listpropertiesui.js | 362 + .../listproperties/listpropertiesutils.d.ts | 33 + .../src/listproperties/listpropertiesutils.js | 44 + .../listproperties/listreversedcommand.d.ts | 36 + .../src/listproperties/listreversedcommand.js | 55 + .../src/listproperties/liststartcommand.d.ts | 38 + .../src/listproperties/liststartcommand.js | 60 + .../src/listproperties/liststylecommand.d.ts | 72 + .../src/listproperties/liststylecommand.js | 113 + .../listproperties/ui/listpropertiesview.d.ts | 156 + .../listproperties/ui/listpropertiesview.js | 301 + .../src/listproperties/utils/style.d.ts | 20 + .../src/listproperties/utils/style.js | 54 + .../ckeditor5-list/src/tododocumentlist.d.ts | 28 + .../ckeditor5-list/src/tododocumentlist.js | 41 + .../ckeditor5-list/src/todolist.d.ts | 27 + .../@ckeditor/ckeditor5-list/src/todolist.js | 31 + .../src/todolist/checktodolistcommand.d.ts | 49 + .../src/todolist/checktodolistcommand.js | 82 + .../todolist/todocheckboxchangeobserver.d.ts | 41 + .../todolist/todocheckboxchangeobserver.js | 37 + .../src/todolist/todolistediting.d.ts | 38 + .../src/todolist/todolistediting.js | 391 + .../src/todolist/todolistui.d.ts | 19 + .../ckeditor5-list/src/todolist/todolistui.js | 28 + .../ckeditor5-list/theme/documentlist.css | 8 + .../theme/icons/liststylecircle.svg | 1 + .../theme/icons/liststyledecimal.svg | 1 + .../icons/liststyledecimalleadingzero.svg | 1 + .../theme/icons/liststyledisc.svg | 1 + .../theme/icons/liststylelowerlatin.svg | 1 + .../theme/icons/liststylelowerroman.svg | 1 + .../theme/icons/liststylesquare.svg | 1 + .../theme/icons/liststyleupperlatin.svg | 1 + .../theme/icons/liststyleupperroman.svg | 1 + .../@ckeditor/ckeditor5-list/theme/list.css | 40 + .../ckeditor5-list/theme/listproperties.css | 10 + .../ckeditor5-list/theme/liststyles.css | 8 + .../ckeditor5-list/theme/todolist.css | 136 + .../ckeditor5-media-embed/CHANGELOG.md | 129 + .../ckeditor5-media-embed/LICENSE.md | 17 + .../@ckeditor/ckeditor5-media-embed/README.md | 20 + .../build/media-embed.js | 5 + .../build/translations/ar.js | 1 + .../build/translations/az.js | 1 + .../build/translations/bg.js | 1 + .../build/translations/bn.js | 1 + .../build/translations/ca.js | 1 + .../build/translations/cs.js | 1 + .../build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../build/translations/de.js | 1 + .../build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../build/translations/es.js | 1 + .../build/translations/et.js | 1 + .../build/translations/fa.js | 1 + .../build/translations/fi.js | 1 + .../build/translations/fr.js | 1 + .../build/translations/gl.js | 1 + .../build/translations/he.js | 1 + .../build/translations/hi.js | 1 + .../build/translations/hr.js | 1 + .../build/translations/hu.js | 1 + .../build/translations/id.js | 1 + .../build/translations/it.js | 1 + .../build/translations/ja.js | 1 + .../build/translations/ko.js | 1 + .../build/translations/ku.js | 1 + .../build/translations/lt.js | 1 + .../build/translations/lv.js | 1 + .../build/translations/ms.js | 1 + .../build/translations/ne.js | 1 + .../build/translations/nl.js | 1 + .../build/translations/no.js | 1 + .../build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../build/translations/pt.js | 1 + .../build/translations/ro.js | 1 + .../build/translations/ru.js | 1 + .../build/translations/sk.js | 1 + .../build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../build/translations/sr.js | 1 + .../build/translations/sv.js | 1 + .../build/translations/th.js | 1 + .../build/translations/tk.js | 1 + .../build/translations/tr.js | 1 + .../build/translations/uk.js | 1 + .../build/translations/ur.js | 1 + .../build/translations/uz.js | 1 + .../build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../build/translations/zh.js | 1 + .../ckeditor5-metadata.json | 89 + .../ckeditor5-media-embed/lang/contexts.json | 11 + .../lang/translations/ar.po | 54 + .../lang/translations/az.po | 54 + .../lang/translations/bg.po | 54 + .../lang/translations/bn.po | 54 + .../lang/translations/ca.po | 54 + .../lang/translations/cs.po | 54 + .../lang/translations/da.po | 54 + .../lang/translations/de-ch.po | 54 + .../lang/translations/de.po | 54 + .../lang/translations/el.po | 54 + .../lang/translations/en-au.po | 54 + .../lang/translations/en-gb.po | 54 + .../lang/translations/en.po | 54 + .../lang/translations/es.po | 54 + .../lang/translations/et.po | 54 + .../lang/translations/fa.po | 54 + .../lang/translations/fi.po | 54 + .../lang/translations/fr.po | 54 + .../lang/translations/gl.po | 54 + .../lang/translations/he.po | 54 + .../lang/translations/hi.po | 54 + .../lang/translations/hr.po | 54 + .../lang/translations/hu.po | 54 + .../lang/translations/id.po | 54 + .../lang/translations/it.po | 54 + .../lang/translations/ja.po | 54 + .../lang/translations/ko.po | 54 + .../lang/translations/ku.po | 54 + .../lang/translations/lt.po | 54 + .../lang/translations/lv.po | 54 + .../lang/translations/ms.po | 54 + .../lang/translations/ne.po | 54 + .../lang/translations/nl.po | 54 + .../lang/translations/no.po | 54 + .../lang/translations/pl.po | 54 + .../lang/translations/pt-br.po | 54 + .../lang/translations/pt.po | 54 + .../lang/translations/ro.po | 54 + .../lang/translations/ru.po | 54 + .../lang/translations/sk.po | 54 + .../lang/translations/sq.po | 54 + .../lang/translations/sr-latn.po | 54 + .../lang/translations/sr.po | 54 + .../lang/translations/sv.po | 54 + .../lang/translations/th.po | 54 + .../lang/translations/tk.po | 54 + .../lang/translations/tr.po | 54 + .../lang/translations/uk.po | 54 + .../lang/translations/ur.po | 54 + .../lang/translations/uz.po | 54 + .../lang/translations/vi.po | 54 + .../lang/translations/zh-cn.po | 54 + .../lang/translations/zh.po | 54 + .../ckeditor5-media-embed/package.json | 38 + .../src/augmentation.d.ts | 25 + .../ckeditor5-media-embed/src/augmentation.js | 5 + .../src/automediaembed.d.ts | 51 + .../src/automediaembed.js | 131 + .../ckeditor5-media-embed/src/converters.d.ts | 38 + .../ckeditor5-media-embed/src/converters.js | 53 + .../ckeditor5-media-embed/src/index.d.ts | 15 + .../ckeditor5-media-embed/src/index.js | 13 + .../ckeditor5-media-embed/src/mediaembed.d.ts | 34 + .../ckeditor5-media-embed/src/mediaembed.js | 38 + .../src/mediaembedcommand.d.ts | 36 + .../src/mediaembedcommand.js | 71 + .../src/mediaembedconfig.d.ts | 278 + .../src/mediaembedconfig.js | 5 + .../src/mediaembedediting.d.ts | 31 + .../src/mediaembedediting.js | 234 + .../src/mediaembedtoolbar.d.ts | 30 + .../src/mediaembedtoolbar.js | 44 + .../src/mediaembedui.d.ts | 27 + .../ckeditor5-media-embed/src/mediaembedui.js | 99 + .../src/mediaregistry.d.ts | 66 + .../src/mediaregistry.js | 232 + .../src/ui/mediaformview.d.ts | 115 + .../src/ui/mediaformview.js | 194 + .../ckeditor5-media-embed/src/utils.d.ts | 67 + .../ckeditor5-media-embed/src/utils.js | 85 + .../theme/icons/media-placeholder.svg | 1 + .../theme/icons/media.svg | 1 + .../theme/icons/media/twitter.svg | 20 + .../theme/mediaembed.css | 23 + .../theme/mediaembedediting.css | 48 + .../ckeditor5-media-embed/theme/mediaform.css | 33 + .../ckeditor5-paragraph/CHANGELOG.md | 175 + .../@ckeditor/ckeditor5-paragraph/LICENSE.md | 17 + .../@ckeditor/ckeditor5-paragraph/README.md | 16 + .../ckeditor5-metadata.json | 17 + .../ckeditor5-paragraph/package.json | 38 + .../ckeditor5-paragraph/src/augmentation.d.ts | 14 + .../ckeditor5-paragraph/src/augmentation.js | 5 + .../ckeditor5-paragraph/src/index.d.ts | 12 + .../ckeditor5-paragraph/src/index.js | 10 + .../src/insertparagraphcommand.d.ts | 45 + .../src/insertparagraphcommand.js | 90 + .../ckeditor5-paragraph/src/paragraph.d.ts | 61 + .../ckeditor5-paragraph/src/paragraph.js | 107 + .../src/paragraphbuttonui.d.ts | 36 + .../src/paragraphbuttonui.js | 57 + .../src/paragraphcommand.d.ts | 38 + .../src/paragraphcommand.js | 64 + .../ckeditor5-paste-from-office/CHANGELOG.md | 94 + .../ckeditor5-paste-from-office/LICENSE.md | 17 + .../ckeditor5-paste-from-office/README.md | 22 + .../build/paste-from-office.js | 4 + .../ckeditor5-metadata.json | 11 + .../ckeditor5-paste-from-office/package.json | 37 + .../src/augmentation.d.ts | 10 + .../src/augmentation.js | 5 + .../src/filters/br.d.ts | 14 + .../src/filters/br.js | 65 + .../src/filters/image.d.ts | 24 + .../src/filters/image.js | 253 + .../src/filters/list.d.ts | 26 + .../src/filters/list.js | 439 + .../src/filters/parse.d.ts | 35 + .../src/filters/parse.js | 96 + .../src/filters/removeboldwrapper.d.ts | 14 + .../src/filters/removeboldwrapper.js | 18 + .../src/filters/removegooglesheetstag.d.ts | 14 + .../src/filters/removegooglesheetstag.js | 18 + .../src/filters/removeinvalidtablewidth.d.ts | 14 + .../src/filters/removeinvalidtablewidth.js | 16 + .../src/filters/removemsattributes.d.ts | 14 + .../src/filters/removemsattributes.js | 43 + .../src/filters/removestyleblock.d.ts | 14 + .../src/filters/removestyleblock.js | 16 + .../src/filters/removexmlns.d.ts | 14 + .../src/filters/removexmlns.js | 16 + .../src/filters/space.d.ts | 25 + .../src/filters/space.js | 60 + .../src/filters/utils.d.ts | 25 + .../src/filters/utils.js | 52 + .../src/index.d.ts | 12 + .../ckeditor5-paste-from-office/src/index.js | 11 + .../src/normalizer.d.ts | 30 + .../src/normalizer.js | 5 + .../src/normalizers/googledocsnormalizer.d.ts | 29 + .../src/normalizers/googledocsnormalizer.js | 42 + .../normalizers/googlesheetsnormalizer.d.ts | 29 + .../src/normalizers/googlesheetsnormalizer.js | 44 + .../src/normalizers/mswordnormalizer.d.ts | 27 + .../src/normalizers/mswordnormalizer.js | 42 + .../src/pastefromoffice.d.ts | 36 + .../src/pastefromoffice.js | 71 + .../ckeditor5-select-all/CHANGELOG.md | 10 + .../@ckeditor/ckeditor5-select-all/LICENSE.md | 17 + .../@ckeditor/ckeditor5-select-all/README.md | 21 + .../ckeditor5-metadata.json | 18 + .../ckeditor5-select-all/lang/contexts.json | 3 + .../lang/translations/ar.po | 22 + .../lang/translations/bg.po | 22 + .../lang/translations/bn.po | 22 + .../lang/translations/ca.po | 22 + .../lang/translations/cs.po | 22 + .../lang/translations/da.po | 22 + .../lang/translations/de-ch.po | 22 + .../lang/translations/de.po | 22 + .../lang/translations/el.po | 22 + .../lang/translations/en-au.po | 22 + .../lang/translations/en.po | 22 + .../lang/translations/es.po | 22 + .../lang/translations/et.po | 22 + .../lang/translations/fa.po | 22 + .../lang/translations/fi.po | 22 + .../lang/translations/fr.po | 22 + .../lang/translations/gl.po | 22 + .../lang/translations/he.po | 22 + .../lang/translations/hi.po | 22 + .../lang/translations/hr.po | 22 + .../lang/translations/hu.po | 22 + .../lang/translations/id.po | 22 + .../lang/translations/it.po | 22 + .../lang/translations/ja.po | 22 + .../lang/translations/ko.po | 22 + .../lang/translations/lt.po | 22 + .../lang/translations/lv.po | 22 + .../lang/translations/ms.po | 22 + .../lang/translations/nl.po | 22 + .../lang/translations/no.po | 22 + .../lang/translations/pl.po | 22 + .../lang/translations/pt-br.po | 22 + .../lang/translations/pt.po | 22 + .../lang/translations/ro.po | 22 + .../lang/translations/ru.po | 22 + .../lang/translations/sk.po | 22 + .../lang/translations/sq.po | 22 + .../lang/translations/sr-latn.po | 22 + .../lang/translations/sr.po | 22 + .../lang/translations/sv.po | 22 + .../lang/translations/th.po | 22 + .../lang/translations/tk.po | 22 + .../lang/translations/tr.po | 22 + .../lang/translations/ug.po | 22 + .../lang/translations/uk.po | 22 + .../lang/translations/ur.po | 22 + .../lang/translations/uz.po | 22 + .../lang/translations/vi.po | 22 + .../lang/translations/zh-cn.po | 22 + .../lang/translations/zh.po | 22 + .../ckeditor5-select-all/package.json | 38 + .../src/augmentation.d.ts | 15 + .../ckeditor5-select-all/src/augmentation.js | 5 + .../ckeditor5-select-all/src/index.d.ts | 12 + .../ckeditor5-select-all/src/index.js | 11 + .../ckeditor5-select-all/src/selectall.d.ts | 28 + .../ckeditor5-select-all/src/selectall.js | 32 + .../src/selectallcommand.d.ts | 32 + .../src/selectallcommand.js | 64 + .../src/selectallediting.d.ts | 24 + .../src/selectallediting.js | 50 + .../ckeditor5-select-all/src/selectallui.d.ts | 29 + .../ckeditor5-select-all/src/selectallui.js | 63 + .../theme/icons/select-all.svg | 1 + .../@ckeditor/ckeditor5-table/CHANGELOG.md | 261 + .../@ckeditor/ckeditor5-table/LICENSE.md | 21 + .../@ckeditor/ckeditor5-table/README.md | 20 + .../@ckeditor/ckeditor5-table/build/table.js | 5 + .../ckeditor5-table/build/translations/ar.js | 1 + .../ckeditor5-table/build/translations/az.js | 1 + .../ckeditor5-table/build/translations/bg.js | 1 + .../ckeditor5-table/build/translations/bn.js | 1 + .../ckeditor5-table/build/translations/ca.js | 1 + .../ckeditor5-table/build/translations/cs.js | 1 + .../ckeditor5-table/build/translations/da.js | 1 + .../build/translations/de-ch.js | 1 + .../ckeditor5-table/build/translations/de.js | 1 + .../ckeditor5-table/build/translations/el.js | 1 + .../build/translations/en-au.js | 1 + .../build/translations/en-gb.js | 1 + .../ckeditor5-table/build/translations/es.js | 1 + .../ckeditor5-table/build/translations/et.js | 1 + .../ckeditor5-table/build/translations/fa.js | 1 + .../ckeditor5-table/build/translations/fi.js | 1 + .../ckeditor5-table/build/translations/fr.js | 1 + .../ckeditor5-table/build/translations/gl.js | 1 + .../ckeditor5-table/build/translations/he.js | 1 + .../ckeditor5-table/build/translations/hi.js | 1 + .../ckeditor5-table/build/translations/hr.js | 1 + .../ckeditor5-table/build/translations/hu.js | 1 + .../ckeditor5-table/build/translations/hy.js | 1 + .../ckeditor5-table/build/translations/id.js | 1 + .../ckeditor5-table/build/translations/it.js | 1 + .../ckeditor5-table/build/translations/ja.js | 1 + .../ckeditor5-table/build/translations/ko.js | 1 + .../ckeditor5-table/build/translations/ku.js | 1 + .../ckeditor5-table/build/translations/lt.js | 1 + .../ckeditor5-table/build/translations/lv.js | 1 + .../ckeditor5-table/build/translations/ms.js | 1 + .../ckeditor5-table/build/translations/nb.js | 1 + .../ckeditor5-table/build/translations/ne.js | 1 + .../ckeditor5-table/build/translations/nl.js | 1 + .../ckeditor5-table/build/translations/no.js | 1 + .../ckeditor5-table/build/translations/pl.js | 1 + .../build/translations/pt-br.js | 1 + .../ckeditor5-table/build/translations/pt.js | 1 + .../ckeditor5-table/build/translations/ro.js | 1 + .../ckeditor5-table/build/translations/ru.js | 1 + .../ckeditor5-table/build/translations/sk.js | 1 + .../ckeditor5-table/build/translations/sl.js | 1 + .../ckeditor5-table/build/translations/sq.js | 1 + .../build/translations/sr-latn.js | 1 + .../ckeditor5-table/build/translations/sr.js | 1 + .../ckeditor5-table/build/translations/sv.js | 1 + .../ckeditor5-table/build/translations/th.js | 1 + .../ckeditor5-table/build/translations/tk.js | 1 + .../ckeditor5-table/build/translations/tr.js | 1 + .../ckeditor5-table/build/translations/tt.js | 1 + .../ckeditor5-table/build/translations/ug.js | 1 + .../ckeditor5-table/build/translations/uk.js | 1 + .../ckeditor5-table/build/translations/ur.js | 1 + .../ckeditor5-table/build/translations/uz.js | 1 + .../ckeditor5-table/build/translations/vi.js | 1 + .../build/translations/zh-cn.js | 1 + .../ckeditor5-table/build/translations/zh.js | 1 + .../ckeditor5-table/ckeditor5-metadata.json | 193 + .../ckeditor5-table/lang/contexts.json | 67 + .../ckeditor5-table/lang/translations/ar.po | 278 + .../ckeditor5-table/lang/translations/az.po | 278 + .../ckeditor5-table/lang/translations/bg.po | 278 + .../ckeditor5-table/lang/translations/bn.po | 280 + .../ckeditor5-table/lang/translations/ca.po | 278 + .../ckeditor5-table/lang/translations/cs.po | 278 + .../ckeditor5-table/lang/translations/da.po | 278 + .../lang/translations/de-ch.po | 278 + .../ckeditor5-table/lang/translations/de.po | 278 + .../ckeditor5-table/lang/translations/el.po | 278 + .../lang/translations/en-au.po | 278 + .../lang/translations/en-gb.po | 278 + .../ckeditor5-table/lang/translations/en.po | 278 + .../ckeditor5-table/lang/translations/es.po | 278 + .../ckeditor5-table/lang/translations/et.po | 278 + .../ckeditor5-table/lang/translations/fa.po | 278 + .../ckeditor5-table/lang/translations/fi.po | 278 + .../ckeditor5-table/lang/translations/fr.po | 278 + .../ckeditor5-table/lang/translations/gl.po | 278 + .../ckeditor5-table/lang/translations/he.po | 278 + .../ckeditor5-table/lang/translations/hi.po | 278 + .../ckeditor5-table/lang/translations/hr.po | 278 + .../ckeditor5-table/lang/translations/hu.po | 278 + .../ckeditor5-table/lang/translations/hy.po | 278 + .../ckeditor5-table/lang/translations/id.po | 278 + .../ckeditor5-table/lang/translations/it.po | 278 + .../ckeditor5-table/lang/translations/ja.po | 278 + .../ckeditor5-table/lang/translations/ko.po | 278 + .../ckeditor5-table/lang/translations/ku.po | 278 + .../ckeditor5-table/lang/translations/lt.po | 278 + .../ckeditor5-table/lang/translations/lv.po | 278 + .../ckeditor5-table/lang/translations/ms.po | 278 + .../ckeditor5-table/lang/translations/nb.po | 278 + .../ckeditor5-table/lang/translations/ne.po | 278 + .../ckeditor5-table/lang/translations/nl.po | 278 + .../ckeditor5-table/lang/translations/no.po | 278 + .../ckeditor5-table/lang/translations/pl.po | 278 + .../lang/translations/pt-br.po | 278 + .../ckeditor5-table/lang/translations/pt.po | 278 + .../ckeditor5-table/lang/translations/ro.po | 278 + .../ckeditor5-table/lang/translations/ru.po | 278 + .../ckeditor5-table/lang/translations/sk.po | 278 + .../ckeditor5-table/lang/translations/sl.po | 278 + .../ckeditor5-table/lang/translations/sq.po | 278 + .../lang/translations/sr-latn.po | 278 + .../ckeditor5-table/lang/translations/sr.po | 278 + .../ckeditor5-table/lang/translations/sv.po | 278 + .../ckeditor5-table/lang/translations/th.po | 278 + .../ckeditor5-table/lang/translations/tk.po | 278 + .../ckeditor5-table/lang/translations/tr.po | 278 + .../ckeditor5-table/lang/translations/tt.po | 278 + .../ckeditor5-table/lang/translations/ug.po | 278 + .../ckeditor5-table/lang/translations/uk.po | 278 + .../ckeditor5-table/lang/translations/ur.po | 278 + .../ckeditor5-table/lang/translations/uz.po | 278 + .../ckeditor5-table/lang/translations/vi.po | 278 + .../lang/translations/zh-cn.po | 278 + .../ckeditor5-table/lang/translations/zh.po | 278 + .../@ckeditor/ckeditor5-table/package.json | 38 + .../ckeditor5-table/src/augmentation.d.ts | 76 + .../ckeditor5-table/src/augmentation.js | 5 + .../src/commands/insertcolumncommand.d.ts | 55 + .../src/commands/insertcolumncommand.js | 67 + .../src/commands/insertrowcommand.d.ts | 54 + .../src/commands/insertrowcommand.js | 66 + .../src/commands/inserttablecommand.d.ts | 44 + .../src/commands/inserttablecommand.js | 69 + .../src/commands/mergecellcommand.d.ts | 68 + .../src/commands/mergecellcommand.js | 198 + .../src/commands/mergecellscommand.d.ts | 28 + .../src/commands/mergecellscommand.js | 94 + .../src/commands/removecolumncommand.d.ts | 29 + .../src/commands/removecolumncommand.js | 109 + .../src/commands/removerowcommand.d.ts | 29 + .../src/commands/removerowcommand.js | 82 + .../src/commands/selectcolumncommand.d.ts | 33 + .../src/commands/selectcolumncommand.js | 60 + .../src/commands/selectrowcommand.d.ts | 33 + .../src/commands/selectrowcommand.js | 56 + .../src/commands/setheadercolumncommand.d.ts | 50 + .../src/commands/setheadercolumncommand.js | 71 + .../src/commands/setheaderrowcommand.d.ts | 53 + .../src/commands/setheaderrowcommand.js | 79 + .../src/commands/splitcellcommand.d.ts | 43 + .../src/commands/splitcellcommand.js | 54 + .../src/converters/downcast.d.ts | 63 + .../src/converters/downcast.js | 146 + .../converters/table-caption-post-fixer.d.ts | 20 + .../converters/table-caption-post-fixer.js | 53 + .../table-cell-paragraph-post-fixer.d.ts | 32 + .../table-cell-paragraph-post-fixer.js | 107 + .../table-cell-refresh-handler.d.ts | 18 + .../converters/table-cell-refresh-handler.js | 45 + .../table-headings-refresh-handler.d.ts | 17 + .../table-headings-refresh-handler.js | 49 + .../converters/table-layout-post-fixer.d.ts | 226 + .../src/converters/table-layout-post-fixer.js | 367 + .../src/converters/tableproperties.d.ts | 54 + .../src/converters/tableproperties.js | 159 + .../src/converters/upcasttable.d.ts | 49 + .../src/converters/upcasttable.js | 243 + .../@ckeditor/ckeditor5-table/src/index.d.ts | 60 + .../@ckeditor/ckeditor5-table/src/index.js | 30 + .../ckeditor5-table/src/plaintableoutput.d.ts | 26 + .../ckeditor5-table/src/plaintableoutput.js | 123 + .../@ckeditor/ckeditor5-table/src/table.d.ts | 40 + .../@ckeditor/ckeditor5-table/src/table.js | 44 + .../ckeditor5-table/src/tablecaption.d.ts | 24 + .../ckeditor5-table/src/tablecaption.js | 28 + .../src/tablecaption/tablecaptionediting.d.ts | 63 + .../src/tablecaption/tablecaptionediting.js | 122 + .../src/tablecaption/tablecaptionui.d.ts | 21 + .../src/tablecaption/tablecaptionui.js | 57 + .../toggletablecaptioncommand.d.ts | 68 + .../tablecaption/toggletablecaptioncommand.js | 105 + .../src/tablecaption/utils.d.ts | 38 + .../ckeditor5-table/src/tablecaption/utils.js | 57 + .../src/tablecellproperties.d.ts | 30 + .../src/tablecellproperties.js | 34 + .../tablecellbackgroundcolorcommand.d.ts | 32 + .../tablecellbackgroundcolorcommand.js | 30 + .../commands/tablecellbordercolorcommand.d.ts | 37 + .../commands/tablecellbordercolorcommand.js | 44 + .../commands/tablecellborderstylecommand.d.ts | 37 + .../commands/tablecellborderstylecommand.js | 44 + .../commands/tablecellborderwidthcommand.d.ts | 51 + .../commands/tablecellborderwidthcommand.js | 64 + .../commands/tablecellheightcommand.d.ts | 46 + .../commands/tablecellheightcommand.js | 51 + .../tablecellhorizontalalignmentcommand.d.ts | 32 + .../tablecellhorizontalalignmentcommand.js | 30 + .../commands/tablecellpaddingcommand.d.ts | 51 + .../commands/tablecellpaddingcommand.js | 64 + .../commands/tablecellpropertycommand.d.ts | 62 + .../commands/tablecellpropertycommand.js | 92 + .../tablecellverticalalignmentcommand.d.ts | 40 + .../tablecellverticalalignmentcommand.js | 38 + .../tablecellpropertiesediting.d.ts | 43 + .../tablecellpropertiesediting.js | 241 + .../tablecellpropertiesui.d.ts | 112 + .../tablecellpropertiesui.js | 330 + .../ui/tablecellpropertiesview.d.ts | 228 + .../ui/tablecellpropertiesview.js | 548 ++ .../commands/tablecellwidthcommand.d.ts | 46 + .../commands/tablecellwidthcommand.js | 51 + .../tablecellwidth/tablecellwidthediting.d.ts | 29 + .../tablecellwidth/tablecellwidthediting.js | 45 + .../ckeditor5-table/src/tableclipboard.d.ts | 70 + .../ckeditor5-table/src/tableclipboard.js | 467 + .../src/tablecolumnresize.d.ts | 26 + .../ckeditor5-table/src/tablecolumnresize.js | 30 + .../src/tablecolumnresize/constants.d.ts | 20 + .../src/tablecolumnresize/constants.js | 20 + .../src/tablecolumnresize/converters.d.ts | 18 + .../src/tablecolumnresize/converters.js | 46 + .../tablecolumnresizeediting.d.ts | 139 + .../tablecolumnresizeediting.js | 583 ++ .../tablecolumnresize/tablewidthscommand.d.ts | 38 + .../tablecolumnresize/tablewidthscommand.js | 61 + .../src/tablecolumnresize/utils.d.ts | 148 + .../src/tablecolumnresize/utils.js | 358 + .../ckeditor5-table/src/tableconfig.d.ts | 343 + .../ckeditor5-table/src/tableconfig.js | 5 + .../ckeditor5-table/src/tableediting.d.ts | 98 + .../ckeditor5-table/src/tableediting.js | 191 + .../ckeditor5-table/src/tablekeyboard.d.ts | 68 + .../ckeditor5-table/src/tablekeyboard.js | 304 + .../ckeditor5-table/src/tablemouse.d.ts | 48 + .../ckeditor5-table/src/tablemouse.js | 172 + .../src/tablemouse/mouseeventsobserver.d.ts | 62 + .../src/tablemouse/mouseeventsobserver.js | 35 + .../ckeditor5-table/src/tableproperties.d.ts | 30 + .../ckeditor5-table/src/tableproperties.js | 34 + .../commands/tablealignmentcommand.d.ts | 32 + .../commands/tablealignmentcommand.js | 30 + .../commands/tablebackgroundcolorcommand.d.ts | 32 + .../commands/tablebackgroundcolorcommand.js | 30 + .../commands/tablebordercolorcommand.d.ts | 37 + .../commands/tablebordercolorcommand.js | 44 + .../commands/tableborderstylecommand.d.ts | 37 + .../commands/tableborderstylecommand.js | 44 + .../commands/tableborderwidthcommand.d.ts | 51 + .../commands/tableborderwidthcommand.js | 64 + .../commands/tableheightcommand.d.ts | 46 + .../commands/tableheightcommand.js | 54 + .../commands/tablepropertycommand.d.ts | 61 + .../commands/tablepropertycommand.js | 81 + .../commands/tablewidthcommand.d.ts | 46 + .../commands/tablewidthcommand.js | 54 + .../tablepropertiesediting.d.ts | 40 + .../tableproperties/tablepropertiesediting.js | 206 + .../tableproperties/tablepropertiesui.d.ts | 114 + .../src/tableproperties/tablepropertiesui.js | 321 + .../ui/tablepropertiesview.d.ts | 207 + .../tableproperties/ui/tablepropertiesview.js | 466 + .../ckeditor5-table/src/tableselection.d.ts | 107 + .../ckeditor5-table/src/tableselection.js | 297 + .../ckeditor5-table/src/tabletoolbar.d.ts | 32 + .../ckeditor5-table/src/tabletoolbar.js | 57 + .../ckeditor5-table/src/tableui.d.ts | 54 + .../@ckeditor/ckeditor5-table/src/tableui.js | 331 + .../ckeditor5-table/src/tableutils.d.ts | 448 + .../ckeditor5-table/src/tableutils.js | 1058 ++ .../ckeditor5-table/src/tablewalker.d.ts | 362 + .../ckeditor5-table/src/tablewalker.js | 393 + .../src/ui/colorinputview.d.ts | 140 + .../ckeditor5-table/src/ui/colorinputview.js | 271 + .../ckeditor5-table/src/ui/formrowview.d.ts | 61 + .../ckeditor5-table/src/ui/formrowview.js | 57 + .../src/ui/inserttableview.d.ts | 81 + .../ckeditor5-table/src/ui/inserttableview.js | 178 + .../ckeditor5-table/src/utils/common.d.ts | 46 + .../ckeditor5-table/src/utils/common.js | 68 + .../ckeditor5-table/src/utils/structure.d.ts | 245 + .../ckeditor5-table/src/utils/structure.js | 426 + .../src/utils/table-properties.d.ts | 67 + .../src/utils/table-properties.js | 86 + .../src/utils/ui/contextualballoon.d.ts | 34 + .../src/utils/ui/contextualballoon.js | 110 + .../src/utils/ui/table-properties.d.ts | 195 + .../src/utils/ui/table-properties.js | 362 + .../ckeditor5-table/src/utils/ui/widget.d.ts | 20 + .../ckeditor5-table/src/utils/ui/widget.js | 48 + .../ckeditor5-table/theme/colorinput.css | 39 + .../@ckeditor/ckeditor5-table/theme/form.css | 11 + .../ckeditor5-table/theme/formrow.css | 23 + .../theme/icons/table-cell-properties.svg | 1 + .../theme/icons/table-column.svg | 1 + .../theme/icons/table-merge-cell.svg | 1 + .../theme/icons/table-properties.svg | 1 + .../ckeditor5-table/theme/icons/table-row.svg | 1 + .../ckeditor5-table/theme/inserttable.css | 10 + .../@ckeditor/ckeditor5-table/theme/table.css | 67 + .../ckeditor5-table/theme/tablecaption.css | 53 + .../theme/tablecellproperties.css | 28 + .../theme/tablecolumnresize.css | 67 + .../ckeditor5-table/theme/tableediting.css | 10 + .../ckeditor5-table/theme/tableform.css | 59 + .../ckeditor5-table/theme/tableproperties.css | 18 + .../ckeditor5-table/theme/tableselection.css | 10 + .../@ckeditor/ckeditor5-typing/CHANGELOG.md | 236 + .../@ckeditor/ckeditor5-typing/LICENSE.md | 21 + .../@ckeditor/ckeditor5-typing/README.md | 16 + .../ckeditor5-typing/ckeditor5-metadata.json | 11 + .../@ckeditor/ckeditor5-typing/package.json | 39 + .../ckeditor5-typing/src/augmentation.d.ts | 27 + .../ckeditor5-typing/src/augmentation.js | 5 + .../ckeditor5-typing/src/delete.d.ts | 32 + .../@ckeditor/ckeditor5-typing/src/delete.js | 82 + .../ckeditor5-typing/src/deletecommand.d.ts | 83 + .../ckeditor5-typing/src/deletecommand.js | 201 + .../ckeditor5-typing/src/deleteobserver.d.ts | 55 + .../ckeditor5-typing/src/deleteobserver.js | 261 + .../@ckeditor/ckeditor5-typing/src/index.d.ts | 24 + .../@ckeditor/ckeditor5-typing/src/index.js | 18 + .../@ckeditor/ckeditor5-typing/src/input.d.ts | 21 + .../@ckeditor/ckeditor5-typing/src/input.js | 141 + .../src/inserttextcommand.d.ts | 76 + .../ckeditor5-typing/src/inserttextcommand.js | 83 + .../src/inserttextobserver.d.ts | 59 + .../src/inserttextobserver.js | 108 + .../src/texttransformation.d.ts | 33 + .../src/texttransformation.js | 228 + .../ckeditor5-typing/src/textwatcher.d.ts | 138 + .../ckeditor5-typing/src/textwatcher.js | 105 + .../src/twostepcaretmovement.d.ts | 232 + .../src/twostepcaretmovement.js | 622 ++ .../ckeditor5-typing/src/typing.d.ts | 23 + .../@ckeditor/ckeditor5-typing/src/typing.js | 27 + .../ckeditor5-typing/src/typingconfig.d.ts | 204 + .../ckeditor5-typing/src/typingconfig.js | 5 + .../src/utils/changebuffer.d.ts | 103 + .../src/utils/changebuffer.js | 123 + .../src/utils/findattributerange.d.ts | 33 + .../src/utils/findattributerange.js | 41 + .../src/utils/getlasttextline.d.ts | 49 + .../src/utils/getlasttextline.js | 43 + .../src/utils/inlinehighlight.d.ts | 33 + .../src/utils/inlinehighlight.js | 74 + .../@ckeditor/ckeditor5-ui/CHANGELOG.md | 542 ++ .../@ckeditor/ckeditor5-ui/LICENSE.md | 21 + node_modules/@ckeditor/ckeditor5-ui/README.md | 20 + .../ckeditor5-ui/ckeditor5-metadata.json | 25 + .../@ckeditor/ckeditor5-ui/lang/contexts.json | 50 + .../ckeditor5-ui/lang/translations/af.po | 210 + .../ckeditor5-ui/lang/translations/ar.po | 210 + .../ckeditor5-ui/lang/translations/ast.po | 210 + .../ckeditor5-ui/lang/translations/az.po | 210 + .../ckeditor5-ui/lang/translations/bg.po | 210 + .../ckeditor5-ui/lang/translations/bn.po | 210 + .../ckeditor5-ui/lang/translations/bs.po | 210 + .../ckeditor5-ui/lang/translations/ca.po | 210 + .../ckeditor5-ui/lang/translations/cs.po | 210 + .../ckeditor5-ui/lang/translations/da.po | 210 + .../ckeditor5-ui/lang/translations/de-ch.po | 210 + .../ckeditor5-ui/lang/translations/de.po | 210 + .../ckeditor5-ui/lang/translations/el.po | 210 + .../ckeditor5-ui/lang/translations/en-au.po | 210 + .../ckeditor5-ui/lang/translations/en-gb.po | 210 + .../ckeditor5-ui/lang/translations/en.po | 210 + .../ckeditor5-ui/lang/translations/eo.po | 210 + .../ckeditor5-ui/lang/translations/es-co.po | 210 + .../ckeditor5-ui/lang/translations/es.po | 210 + .../ckeditor5-ui/lang/translations/et.po | 210 + .../ckeditor5-ui/lang/translations/eu.po | 210 + .../ckeditor5-ui/lang/translations/fa.po | 210 + .../ckeditor5-ui/lang/translations/fi.po | 210 + .../ckeditor5-ui/lang/translations/fr.po | 210 + .../ckeditor5-ui/lang/translations/gl.po | 210 + .../ckeditor5-ui/lang/translations/he.po | 210 + .../ckeditor5-ui/lang/translations/hi.po | 210 + .../ckeditor5-ui/lang/translations/hr.po | 210 + .../ckeditor5-ui/lang/translations/hu.po | 210 + .../ckeditor5-ui/lang/translations/id.po | 210 + .../ckeditor5-ui/lang/translations/it.po | 210 + .../ckeditor5-ui/lang/translations/ja.po | 210 + .../ckeditor5-ui/lang/translations/jv.po | 210 + .../ckeditor5-ui/lang/translations/km.po | 210 + .../ckeditor5-ui/lang/translations/kn.po | 210 + .../ckeditor5-ui/lang/translations/ko.po | 210 + .../ckeditor5-ui/lang/translations/ku.po | 210 + .../ckeditor5-ui/lang/translations/lt.po | 210 + .../ckeditor5-ui/lang/translations/lv.po | 210 + .../ckeditor5-ui/lang/translations/ms.po | 210 + .../ckeditor5-ui/lang/translations/nb.po | 210 + .../ckeditor5-ui/lang/translations/ne.po | 210 + .../ckeditor5-ui/lang/translations/nl.po | 210 + .../ckeditor5-ui/lang/translations/no.po | 210 + .../ckeditor5-ui/lang/translations/pl.po | 210 + .../ckeditor5-ui/lang/translations/pt-br.po | 210 + .../ckeditor5-ui/lang/translations/pt.po | 210 + .../ckeditor5-ui/lang/translations/ro.po | 210 + .../ckeditor5-ui/lang/translations/ru.po | 210 + .../ckeditor5-ui/lang/translations/sk.po | 210 + .../ckeditor5-ui/lang/translations/sl.po | 210 + .../ckeditor5-ui/lang/translations/sq.po | 210 + .../ckeditor5-ui/lang/translations/sr-latn.po | 210 + .../ckeditor5-ui/lang/translations/sr.po | 210 + .../ckeditor5-ui/lang/translations/sv.po | 210 + .../ckeditor5-ui/lang/translations/th.po | 210 + .../ckeditor5-ui/lang/translations/tk.po | 210 + .../ckeditor5-ui/lang/translations/tr.po | 210 + .../ckeditor5-ui/lang/translations/tt.po | 210 + .../ckeditor5-ui/lang/translations/ug.po | 210 + .../ckeditor5-ui/lang/translations/uk.po | 210 + .../ckeditor5-ui/lang/translations/ur.po | 210 + .../ckeditor5-ui/lang/translations/uz.po | 210 + .../ckeditor5-ui/lang/translations/vi.po | 210 + .../ckeditor5-ui/lang/translations/zh-cn.po | 210 + .../ckeditor5-ui/lang/translations/zh.po | 210 + .../@ckeditor/ckeditor5-ui/package.json | 40 + .../ckeditor5-ui/src/arialiveannouncer.d.ts | 98 + .../ckeditor5-ui/src/arialiveannouncer.js | 116 + .../ckeditor5-ui/src/augmentation.d.ts | 88 + .../ckeditor5-ui/src/augmentation.js | 5 + .../src/autocomplete/autocompleteview.d.ts | 81 + .../src/autocomplete/autocompleteview.js | 154 + .../bindings/addkeyboardhandlingforgrid.d.ts | 27 + .../bindings/addkeyboardhandlingforgrid.js | 107 + .../src/bindings/clickoutsidehandler.d.ts | 28 + .../src/bindings/clickoutsidehandler.js | 36 + .../bindings/csstransitiondisablermixin.d.ts | 40 + .../bindings/csstransitiondisablermixin.js | 55 + .../src/bindings/draggableviewmixin.d.ts | 46 + .../src/bindings/draggableviewmixin.js | 144 + .../bindings/injectcsstransitiondisabler.d.ts | 59 + .../bindings/injectcsstransitiondisabler.js | 71 + .../src/bindings/preventdefault.d.ts | 33 + .../src/bindings/preventdefault.js | 34 + .../src/bindings/submithandler.d.ts | 57 + .../src/bindings/submithandler.js | 47 + .../ckeditor5-ui/src/button/button.d.ts | 181 + .../ckeditor5-ui/src/button/button.js | 5 + .../ckeditor5-ui/src/button/buttonlabel.d.ts | 34 + .../ckeditor5-ui/src/button/buttonlabel.js | 5 + .../src/button/buttonlabelview.d.ts | 31 + .../src/button/buttonlabelview.js | 42 + .../ckeditor5-ui/src/button/buttonview.d.ts | 185 + .../ckeditor5-ui/src/button/buttonview.js | 218 + .../src/button/filedialogbuttonview.d.ts | 80 + .../src/button/filedialogbuttonview.js | 103 + .../src/button/switchbuttonview.d.ts | 45 + .../src/button/switchbuttonview.js | 75 + .../src/collapsible/collapsibleview.d.ts | 70 + .../src/collapsible/collapsibleview.js | 95 + .../src/colorgrid/colorgridview.d.ts | 132 + .../src/colorgrid/colorgridview.js | 124 + .../src/colorgrid/colortileview.d.ts | 28 + .../src/colorgrid/colortileview.js | 40 + .../ckeditor5-ui/src/colorgrid/utils.d.ts | 47 + .../ckeditor5-ui/src/colorgrid/utils.js | 84 + .../src/colorpicker/colorpickerview.d.ts | 142 + .../src/colorpicker/colorpickerview.js | 272 + .../ckeditor5-ui/src/colorpicker/utils.d.ts | 48 + .../ckeditor5-ui/src/colorpicker/utils.js | 108 + .../colorselector/colorgridsfragmentview.d.ts | 195 + .../colorselector/colorgridsfragmentview.js | 288 + .../colorpickerfragmentview.d.ts | 129 + .../colorselector/colorpickerfragmentview.js | 204 + .../src/colorselector/colorselectorview.d.ts | 242 + .../src/colorselector/colorselectorview.js | 256 + .../documentcolorcollection.d.ts | 70 + .../colorselector/documentcolorcollection.js | 42 + .../ckeditor5-ui/src/componentfactory.d.ts | 81 + .../ckeditor5-ui/src/componentfactory.js | 104 + .../ckeditor5-ui/src/dialog/dialog.d.ts | 273 + .../ckeditor5-ui/src/dialog/dialog.js | 271 + .../src/dialog/dialogactionsview.d.ts | 69 + .../src/dialog/dialogactionsview.js | 98 + .../src/dialog/dialogcontentview.d.ts | 27 + .../src/dialog/dialogcontentview.js | 35 + .../ckeditor5-ui/src/dialog/dialogview.d.ts | 256 + .../ckeditor5-ui/src/dialog/dialogview.js | 466 + .../src/dropdown/button/dropdownbutton.d.ts | 25 + .../src/dropdown/button/dropdownbutton.js | 5 + .../dropdown/button/dropdownbuttonview.d.ts | 48 + .../src/dropdown/button/dropdownbuttonview.js | 66 + .../src/dropdown/button/splitbuttonview.d.ts | 162 + .../src/dropdown/button/splitbuttonview.js | 154 + .../src/dropdown/dropdownpanelfocusable.d.ts | 21 + .../src/dropdown/dropdownpanelfocusable.js | 5 + .../src/dropdown/dropdownpanelview.d.ts | 62 + .../src/dropdown/dropdownpanelview.js | 97 + .../src/dropdown/dropdownview.d.ts | 315 + .../ckeditor5-ui/src/dropdown/dropdownview.js | 380 + .../ckeditor5-ui/src/dropdown/utils.d.ts | 235 + .../ckeditor5-ui/src/dropdown/utils.js | 459 + .../src/editableui/editableuiview.d.ts | 72 + .../src/editableui/editableuiview.js | 112 + .../inline/inlineeditableuiview.d.ts | 40 + .../editableui/inline/inlineeditableuiview.js | 48 + .../accessibilityhelp/accessibilityhelp.d.ts | 51 + .../accessibilityhelp/accessibilityhelp.js | 127 + .../accessibilityhelpcontentview.d.ts | 35 + .../accessibilityhelpcontentview.js | 112 + .../src/editorui/bodycollection.d.ts | 55 + .../src/editorui/bodycollection.js | 84 + .../src/editorui/boxed/boxededitoruiview.d.ts | 40 + .../src/editorui/boxed/boxededitoruiview.js | 81 + .../ckeditor5-ui/src/editorui/editorui.d.ts | 288 + .../ckeditor5-ui/src/editorui/editorui.js | 412 + .../src/editorui/editoruiview.d.ts | 39 + .../ckeditor5-ui/src/editorui/editoruiview.js | 38 + .../ckeditor5-ui/src/editorui/poweredby.d.ts | 71 + .../ckeditor5-ui/src/editorui/poweredby.js | 276 + .../ckeditor5-ui/src/focuscycler.d.ts | 245 + .../@ckeditor/ckeditor5-ui/src/focuscycler.js | 274 + .../src/formheader/formheaderview.d.ts | 59 + .../src/formheader/formheaderview.js | 70 + .../highlightedtext/highlightedtextview.d.ts | 38 + .../highlightedtext/highlightedtextview.js | 102 + .../ckeditor5-ui/src/icon/iconview.d.ts | 88 + .../ckeditor5-ui/src/icon/iconview.js | 115 + .../ckeditor5-ui/src/iframe/iframeview.d.ts | 50 + .../ckeditor5-ui/src/iframe/iframeview.js | 63 + .../@ckeditor/ckeditor5-ui/src/index.d.ts | 83 + .../@ckeditor/ckeditor5-ui/src/index.js | 79 + .../ckeditor5-ui/src/input/inputbase.d.ts | 119 + .../ckeditor5-ui/src/input/inputbase.js | 114 + .../ckeditor5-ui/src/input/inputview.d.ts | 36 + .../ckeditor5-ui/src/input/inputview.js | 24 + .../src/inputnumber/inputnumberview.d.ts | 49 + .../src/inputnumber/inputnumberview.js | 40 + .../src/inputtext/inputtextview.d.ts | 18 + .../src/inputtext/inputtextview.js | 27 + .../ckeditor5-ui/src/label/labelview.d.ts | 36 + .../ckeditor5-ui/src/label/labelview.js | 41 + .../src/labeledfield/labeledfieldview.d.ts | 187 + .../src/labeledfield/labeledfieldview.js | 157 + .../ckeditor5-ui/src/labeledfield/utils.d.ts | 123 + .../ckeditor5-ui/src/labeledfield/utils.js | 176 + .../src/labeledinput/labeledinputview.d.ts | 125 + .../src/labeledinput/labeledinputview.js | 125 + .../src/list/listitemgroupview.d.ts | 59 + .../src/list/listitemgroupview.js | 67 + .../ckeditor5-ui/src/list/listitemview.d.ts | 36 + .../ckeditor5-ui/src/list/listitemview.js | 42 + .../src/list/listseparatorview.d.ts | 18 + .../src/list/listseparatorview.js | 28 + .../ckeditor5-ui/src/list/listview.d.ts | 124 + .../ckeditor5-ui/src/list/listview.js | 188 + .../src/menubar/menubarmenubuttonview.d.ts | 35 + .../src/menubar/menubarmenubuttonview.js | 64 + .../menubarmenulistitembuttonview.d.ts | 21 + .../menubar/menubarmenulistitembuttonview.js | 30 + ...nubarmenulistitemfiledialogbuttonview.d.ts | 23 + ...menubarmenulistitemfiledialogbuttonview.js | 32 + .../src/menubar/menubarmenulistitemview.d.ts | 25 + .../src/menubar/menubarmenulistitemview.js | 34 + .../src/menubar/menubarmenulistview.d.ts | 24 + .../src/menubar/menubarmenulistview.js | 23 + .../src/menubar/menubarmenupanelview.d.ts | 53 + .../src/menubar/menubarmenupanelview.js | 60 + .../src/menubar/menubarmenuview.d.ts | 109 + .../src/menubar/menubarmenuview.js | 159 + .../ckeditor5-ui/src/menubar/menubarview.d.ts | 164 + .../ckeditor5-ui/src/menubar/menubarview.js | 254 + .../ckeditor5-ui/src/menubar/utils.d.ts | 432 + .../ckeditor5-ui/src/menubar/utils.js | 1320 +++ .../@ckeditor/ckeditor5-ui/src/model.d.ts | 22 + .../@ckeditor/ckeditor5-ui/src/model.js | 31 + .../src/notification/notification.d.ts | 211 + .../src/notification/notification.js | 187 + .../src/panel/balloon/balloonpanelview.d.ts | 685 ++ .../src/panel/balloon/balloonpanelview.js | 1011 ++ .../src/panel/balloon/contextualballoon.d.ts | 299 + .../src/panel/balloon/contextualballoon.js | 570 ++ .../src/panel/sticky/stickypanelview.d.ts | 156 + .../src/panel/sticky/stickypanelview.js | 234 + .../ckeditor5-ui/src/search/filteredview.d.ts | 31 + .../ckeditor5-ui/src/search/filteredview.js | 5 + .../src/search/searchinfoview.d.ts | 45 + .../ckeditor5-ui/src/search/searchinfoview.js | 59 + .../src/search/searchresultsview.d.ts | 54 + .../src/search/searchresultsview.js | 65 + .../src/search/text/searchtextqueryview.d.ts | 76 + .../src/search/text/searchtextqueryview.js | 75 + .../src/search/text/searchtextview.d.ts | 219 + .../src/search/text/searchtextview.js | 201 + .../ckeditor5-ui/src/spinner/spinnerview.d.ts | 25 + .../ckeditor5-ui/src/spinner/spinnerview.js | 38 + .../@ckeditor/ckeditor5-ui/src/template.d.ts | 942 ++ .../@ckeditor/ckeditor5-ui/src/template.js | 1294 +++ .../src/textarea/textareaview.d.ts | 104 + .../ckeditor5-ui/src/textarea/textareaview.js | 182 + .../src/toolbar/balloon/balloontoolbar.d.ts | 117 + .../src/toolbar/balloon/balloontoolbar.js | 297 + .../src/toolbar/block/blockbuttonview.d.ts | 35 + .../src/toolbar/block/blockbuttonview.js | 41 + .../src/toolbar/block/blocktoolbar.d.ts | 153 + .../src/toolbar/block/blocktoolbar.js | 390 + .../src/toolbar/normalizetoolbarconfig.d.ts | 40 + .../src/toolbar/normalizetoolbarconfig.js | 52 + .../src/toolbar/toolbarlinebreakview.d.ts | 18 + .../src/toolbar/toolbarlinebreakview.js | 28 + .../src/toolbar/toolbarseparatorview.d.ts | 18 + .../src/toolbar/toolbarseparatorview.js | 28 + .../ckeditor5-ui/src/toolbar/toolbarview.d.ts | 267 + .../ckeditor5-ui/src/toolbar/toolbarview.js | 722 ++ .../ckeditor5-ui/src/tooltipmanager.d.ts | 195 + .../ckeditor5-ui/src/tooltipmanager.js | 413 + .../@ckeditor/ckeditor5-ui/src/view.d.ts | 422 + .../@ckeditor/ckeditor5-ui/src/view.js | 396 + .../ckeditor5-ui/src/viewcollection.d.ts | 139 + .../ckeditor5-ui/src/viewcollection.js | 206 + .../arialiveannouncer/arialiveannouncer.css | 10 + .../components/autocomplete/autocomplete.css | 22 + .../theme/components/button/button.css | 39 + .../theme/components/button/switchbutton.css | 14 + .../components/collapsible/collapsible.css | 10 + .../theme/components/colorgrid/colorgrid.css | 8 + .../components/colorpicker/colorpicker.css | 34 + .../colorselector/colorselector.css | 35 + .../theme/components/dialog/dialog.css | 39 + .../theme/components/dialog/dialogactions.css | 11 + .../theme/components/dropdown/dropdown.css | 95 + .../components/dropdown/listdropdown.css | 10 + .../theme/components/dropdown/splitbutton.css | 14 + .../components/dropdown/toolbardropdown.css | 20 + .../components/editorui/accessibilityhelp.css | 10 + .../theme/components/editorui/editorui.css | 10 + .../components/formheader/formheader.css | 16 + .../highlightedtext/highlightedtext.css | 12 + .../theme/components/icon/icon.css | 8 + .../theme/components/input/input.css | 10 + .../theme/components/label/label.css | 12 + .../labeledfield/labeledfieldview.css | 16 + .../components/labeledinput/labeledinput.css | 10 + .../theme/components/list/list.css | 26 + .../theme/components/menubar/menubar.css | 10 + .../theme/components/menubar/menubarmenu.css | 9 + .../components/menubar/menubarmenubutton.css | 11 + .../menubar/menubarmenulistitem.css | 10 + .../menubar/menubarmenulistitembutton.css | 10 + .../components/menubar/menubarmenupanel.css | 62 + .../theme/components/panel/balloonpanel.css | 56 + .../theme/components/panel/balloonrotator.css | 17 + .../theme/components/panel/fakepanel.css | 23 + .../theme/components/panel/stickypanel.css | 17 + .../responsive-form/responsiveform.css | 42 + .../theme/components/search/search.css | 43 + .../theme/components/spinner/spinner.css | 23 + .../theme/components/textarea/textarea.css | 10 + .../theme/components/toolbar/blocktoolbar.css | 9 + .../theme/components/toolbar/toolbar.css | 58 + .../theme/components/tooltip/tooltip.css | 8 + .../ckeditor5-ui/theme/globals/_hidden.css | 13 + .../ckeditor5-ui/theme/globals/_poweredby.css | 72 + .../ckeditor5-ui/theme/globals/_reset.css | 13 + .../theme/globals/_transition.css | 12 + .../ckeditor5-ui/theme/globals/_zindex.css | 10 + .../ckeditor5-ui/theme/globals/globals.css | 10 + .../theme/icons/accessibility.svg | 1 + .../theme/icons/color-tile-check.svg | 1 + .../theme/icons/dropdown-arrow.svg | 1 + .../ckeditor5-ui/theme/icons/project-logo.svg | 1 + .../ckeditor5-ui/theme/mixins/_dir.css | 10 + .../ckeditor5-ui/theme/mixins/_rwd.css | 10 + .../theme/mixins/_unselectable.css | 14 + .../@ckeditor/ckeditor5-undo/CHANGELOG.md | 204 + .../@ckeditor/ckeditor5-undo/LICENSE.md | 17 + .../@ckeditor/ckeditor5-undo/README.md | 16 + .../ckeditor5-undo/ckeditor5-metadata.json | 23 + .../ckeditor5-undo/lang/contexts.json | 4 + .../ckeditor5-undo/lang/translations/ar.po | 26 + .../ckeditor5-undo/lang/translations/ast.po | 26 + .../ckeditor5-undo/lang/translations/az.po | 26 + .../ckeditor5-undo/lang/translations/bg.po | 26 + .../ckeditor5-undo/lang/translations/bn.po | 26 + .../ckeditor5-undo/lang/translations/ca.po | 26 + .../ckeditor5-undo/lang/translations/cs.po | 26 + .../ckeditor5-undo/lang/translations/da.po | 26 + .../ckeditor5-undo/lang/translations/de-ch.po | 26 + .../ckeditor5-undo/lang/translations/de.po | 26 + .../ckeditor5-undo/lang/translations/el.po | 26 + .../ckeditor5-undo/lang/translations/en-au.po | 26 + .../ckeditor5-undo/lang/translations/en-gb.po | 26 + .../ckeditor5-undo/lang/translations/en.po | 26 + .../ckeditor5-undo/lang/translations/eo.po | 26 + .../ckeditor5-undo/lang/translations/es.po | 26 + .../ckeditor5-undo/lang/translations/et.po | 26 + .../ckeditor5-undo/lang/translations/eu.po | 26 + .../ckeditor5-undo/lang/translations/fa.po | 26 + .../ckeditor5-undo/lang/translations/fi.po | 26 + .../ckeditor5-undo/lang/translations/fr.po | 26 + .../ckeditor5-undo/lang/translations/gl.po | 26 + .../ckeditor5-undo/lang/translations/he.po | 26 + .../ckeditor5-undo/lang/translations/hi.po | 26 + .../ckeditor5-undo/lang/translations/hr.po | 26 + .../ckeditor5-undo/lang/translations/hu.po | 26 + .../ckeditor5-undo/lang/translations/id.po | 26 + .../ckeditor5-undo/lang/translations/it.po | 26 + .../ckeditor5-undo/lang/translations/ja.po | 26 + .../ckeditor5-undo/lang/translations/km.po | 26 + .../ckeditor5-undo/lang/translations/kn.po | 26 + .../ckeditor5-undo/lang/translations/ko.po | 26 + .../ckeditor5-undo/lang/translations/ku.po | 26 + .../ckeditor5-undo/lang/translations/lt.po | 26 + .../ckeditor5-undo/lang/translations/lv.po | 26 + .../ckeditor5-undo/lang/translations/ms.po | 26 + .../ckeditor5-undo/lang/translations/nb.po | 26 + .../ckeditor5-undo/lang/translations/ne.po | 26 + .../ckeditor5-undo/lang/translations/nl.po | 26 + .../ckeditor5-undo/lang/translations/no.po | 26 + .../ckeditor5-undo/lang/translations/pl.po | 26 + .../ckeditor5-undo/lang/translations/pt-br.po | 26 + .../ckeditor5-undo/lang/translations/pt.po | 26 + .../ckeditor5-undo/lang/translations/ro.po | 26 + .../ckeditor5-undo/lang/translations/ru.po | 26 + .../ckeditor5-undo/lang/translations/si.po | 26 + .../ckeditor5-undo/lang/translations/sk.po | 26 + .../ckeditor5-undo/lang/translations/sq.po | 26 + .../lang/translations/sr-latn.po | 26 + .../ckeditor5-undo/lang/translations/sr.po | 26 + .../ckeditor5-undo/lang/translations/sv.po | 26 + .../ckeditor5-undo/lang/translations/th.po | 26 + .../ckeditor5-undo/lang/translations/tk.po | 26 + .../ckeditor5-undo/lang/translations/tr.po | 26 + .../ckeditor5-undo/lang/translations/tt.po | 26 + .../ckeditor5-undo/lang/translations/ug.po | 26 + .../ckeditor5-undo/lang/translations/uk.po | 26 + .../ckeditor5-undo/lang/translations/ur.po | 26 + .../ckeditor5-undo/lang/translations/uz.po | 26 + .../ckeditor5-undo/lang/translations/vi.po | 26 + .../ckeditor5-undo/lang/translations/zh-cn.po | 26 + .../ckeditor5-undo/lang/translations/zh.po | 26 + .../@ckeditor/ckeditor5-undo/package.json | 38 + .../ckeditor5-undo/src/augmentation.d.ts | 16 + .../ckeditor5-undo/src/augmentation.js | 5 + .../ckeditor5-undo/src/basecommand.d.ts | 72 + .../ckeditor5-undo/src/basecommand.js | 192 + .../@ckeditor/ckeditor5-undo/src/index.d.ts | 13 + .../@ckeditor/ckeditor5-undo/src/index.js | 11 + .../ckeditor5-undo/src/redocommand.d.ts | 27 + .../ckeditor5-undo/src/redocommand.js | 40 + .../@ckeditor/ckeditor5-undo/src/undo.d.ts | 117 + .../@ckeditor/ckeditor5-undo/src/undo.js | 121 + .../ckeditor5-undo/src/undocommand.d.ts | 37 + .../ckeditor5-undo/src/undocommand.js | 44 + .../ckeditor5-undo/src/undoediting.d.ts | 37 + .../ckeditor5-undo/src/undoediting.js | 96 + .../@ckeditor/ckeditor5-undo/src/undoui.d.ts | 34 + .../@ckeditor/ckeditor5-undo/src/undoui.js | 73 + .../@ckeditor/ckeditor5-upload/CHANGELOG.md | 251 + .../@ckeditor/ckeditor5-upload/LICENSE.md | 17 + .../@ckeditor/ckeditor5-upload/README.md | 16 + .../ckeditor5-upload/ckeditor5-metadata.json | 18 + .../ckeditor5-upload/lang/contexts.json | 3 + .../ckeditor5-upload/lang/translations/ar.po | 22 + .../ckeditor5-upload/lang/translations/az.po | 22 + .../ckeditor5-upload/lang/translations/bg.po | 22 + .../ckeditor5-upload/lang/translations/bn.po | 22 + .../ckeditor5-upload/lang/translations/ca.po | 22 + .../ckeditor5-upload/lang/translations/cs.po | 22 + .../ckeditor5-upload/lang/translations/da.po | 22 + .../lang/translations/de-ch.po | 22 + .../ckeditor5-upload/lang/translations/de.po | 22 + .../ckeditor5-upload/lang/translations/el.po | 22 + .../lang/translations/en-au.po | 22 + .../lang/translations/en-gb.po | 22 + .../ckeditor5-upload/lang/translations/en.po | 22 + .../lang/translations/es-co.po | 22 + .../ckeditor5-upload/lang/translations/es.po | 22 + .../ckeditor5-upload/lang/translations/et.po | 22 + .../ckeditor5-upload/lang/translations/fa.po | 22 + .../ckeditor5-upload/lang/translations/fi.po | 22 + .../ckeditor5-upload/lang/translations/fr.po | 22 + .../ckeditor5-upload/lang/translations/gl.po | 22 + .../ckeditor5-upload/lang/translations/he.po | 22 + .../ckeditor5-upload/lang/translations/hi.po | 22 + .../ckeditor5-upload/lang/translations/hr.po | 22 + .../ckeditor5-upload/lang/translations/hu.po | 22 + .../ckeditor5-upload/lang/translations/id.po | 22 + .../ckeditor5-upload/lang/translations/it.po | 22 + .../ckeditor5-upload/lang/translations/ja.po | 22 + .../ckeditor5-upload/lang/translations/ko.po | 22 + .../ckeditor5-upload/lang/translations/ku.po | 22 + .../ckeditor5-upload/lang/translations/lt.po | 22 + .../ckeditor5-upload/lang/translations/lv.po | 22 + .../ckeditor5-upload/lang/translations/ms.po | 22 + .../ckeditor5-upload/lang/translations/nb.po | 22 + .../ckeditor5-upload/lang/translations/ne.po | 22 + .../ckeditor5-upload/lang/translations/nl.po | 22 + .../ckeditor5-upload/lang/translations/no.po | 22 + .../ckeditor5-upload/lang/translations/pl.po | 22 + .../lang/translations/pt-br.po | 22 + .../ckeditor5-upload/lang/translations/pt.po | 22 + .../ckeditor5-upload/lang/translations/ro.po | 22 + .../ckeditor5-upload/lang/translations/ru.po | 22 + .../ckeditor5-upload/lang/translations/sk.po | 22 + .../ckeditor5-upload/lang/translations/sq.po | 22 + .../lang/translations/sr-latn.po | 22 + .../ckeditor5-upload/lang/translations/sr.po | 22 + .../ckeditor5-upload/lang/translations/sv.po | 22 + .../ckeditor5-upload/lang/translations/th.po | 22 + .../ckeditor5-upload/lang/translations/tk.po | 22 + .../ckeditor5-upload/lang/translations/tr.po | 22 + .../ckeditor5-upload/lang/translations/ug.po | 22 + .../ckeditor5-upload/lang/translations/uk.po | 22 + .../ckeditor5-upload/lang/translations/ur.po | 22 + .../ckeditor5-upload/lang/translations/uz.po | 22 + .../ckeditor5-upload/lang/translations/vi.po | 22 + .../lang/translations/zh-cn.po | 22 + .../ckeditor5-upload/lang/translations/zh.po | 22 + .../@ckeditor/ckeditor5-upload/package.json | 36 + .../src/adapters/base64uploadadapter.d.ts | 33 + .../src/adapters/base64uploadadapter.js | 81 + .../src/adapters/simpleuploadadapter.d.ts | 48 + .../src/adapters/simpleuploadadapter.js | 175 + .../ckeditor5-upload/src/augmentation.d.ts | 20 + .../ckeditor5-upload/src/augmentation.js | 5 + .../ckeditor5-upload/src/filereader.d.ts | 56 + .../ckeditor5-upload/src/filereader.js | 71 + .../ckeditor5-upload/src/filerepository.d.ts | 342 + .../ckeditor5-upload/src/filerepository.js | 383 + .../@ckeditor/ckeditor5-upload/src/index.d.ts | 12 + .../@ckeditor/ckeditor5-upload/src/index.js | 11 + .../ckeditor5-upload/src/uploadconfig.d.ts | 90 + .../ckeditor5-upload/src/uploadconfig.js | 5 + .../@ckeditor/ckeditor5-utils/CHANGELOG.md | 324 + .../@ckeditor/ckeditor5-utils/LICENSE.md | 21 + .../@ckeditor/ckeditor5-utils/README.md | 16 + .../@ckeditor/ckeditor5-utils/package.json | 35 + .../src/abortabledebounce.d.ts | 17 + .../ckeditor5-utils/src/abortabledebounce.js | 22 + .../src/areconnectedthroughproperties.d.ts | 11 + .../src/areconnectedthroughproperties.js | 73 + .../ckeditor5-utils/src/ckeditorerror.d.ts | 123 + .../ckeditor5-utils/src/ckeditorerror.js | 176 + .../ckeditor5-utils/src/collection.d.ts | 433 + .../ckeditor5-utils/src/collection.js | 583 ++ .../ckeditor5-utils/src/comparearrays.d.ts | 30 + .../ckeditor5-utils/src/comparearrays.js | 47 + .../@ckeditor/ckeditor5-utils/src/config.d.ts | 163 + .../@ckeditor/ckeditor5-utils/src/config.js | 163 + .../@ckeditor/ckeditor5-utils/src/count.d.ts | 18 + .../@ckeditor/ckeditor5-utils/src/count.js | 24 + .../@ckeditor/ckeditor5-utils/src/delay.d.ts | 19 + .../@ckeditor/ckeditor5-utils/src/delay.js | 26 + .../@ckeditor/ckeditor5-utils/src/diff.d.ts | 31 + .../@ckeditor/ckeditor5-utils/src/diff.js | 115 + .../ckeditor5-utils/src/difftochanges.d.ts | 59 + .../ckeditor5-utils/src/difftochanges.js | 79 + .../src/dom/createelement.d.ts | 57 + .../ckeditor5-utils/src/dom/createelement.js | 40 + .../ckeditor5-utils/src/dom/emittermixin.d.ts | 142 + .../ckeditor5-utils/src/dom/emittermixin.js | 239 + .../dom/findclosestscrollableancestor.d.ts | 11 + .../src/dom/findclosestscrollableancestor.js | 31 + .../ckeditor5-utils/src/dom/getancestors.d.ts | 17 + .../ckeditor5-utils/src/dom/getancestors.js | 27 + .../src/dom/getborderwidths.d.ts | 24 + .../src/dom/getborderwidths.js | 24 + .../src/dom/getcommonancestor.d.ts | 12 + .../src/dom/getcommonancestor.js | 25 + .../src/dom/getdatafromelement.d.ts | 14 + .../src/dom/getdatafromelement.js | 20 + .../src/dom/getpositionedancestor.d.ts | 10 + .../src/dom/getpositionedancestor.js | 22 + .../ckeditor5-utils/src/dom/global.d.ts | 32 + .../ckeditor5-utils/src/dom/global.js | 35 + .../ckeditor5-utils/src/dom/indexof.d.ts | 14 + .../ckeditor5-utils/src/dom/indexof.js | 21 + .../ckeditor5-utils/src/dom/insertat.d.ts | 15 + .../ckeditor5-utils/src/dom/insertat.js | 17 + .../ckeditor5-utils/src/dom/iscomment.d.ts | 11 + .../ckeditor5-utils/src/dom/iscomment.js | 14 + .../ckeditor5-utils/src/dom/isnode.d.ts | 11 + .../ckeditor5-utils/src/dom/isnode.js | 21 + .../ckeditor5-utils/src/dom/isrange.d.ts | 11 + .../ckeditor5-utils/src/dom/isrange.js | 13 + .../ckeditor5-utils/src/dom/istext.d.ts | 11 + .../ckeditor5-utils/src/dom/istext.js | 13 + .../src/dom/isvalidattributename.d.ts | 10 + .../src/dom/isvalidattributename.js | 22 + .../ckeditor5-utils/src/dom/isvisible.d.ts | 18 + .../ckeditor5-utils/src/dom/isvisible.js | 20 + .../ckeditor5-utils/src/dom/iswindow.d.ts | 11 + .../ckeditor5-utils/src/dom/iswindow.js | 22 + .../ckeditor5-utils/src/dom/position.d.ts | 211 + .../ckeditor5-utils/src/dom/position.js | 313 + .../ckeditor5-utils/src/dom/rect.d.ts | 195 + .../@ckeditor/ckeditor5-utils/src/dom/rect.js | 474 + .../ckeditor5-utils/src/dom/remove.d.ts | 13 + .../ckeditor5-utils/src/dom/remove.js | 18 + .../src/dom/resizeobserver.d.ts | 74 + .../ckeditor5-utils/src/dom/resizeobserver.js | 127 + .../ckeditor5-utils/src/dom/scroll.d.ts | 73 + .../ckeditor5-utils/src/dom/scroll.js | 383 + .../src/dom/setdatainelement.d.ts | 14 + .../src/dom/setdatainelement.js | 20 + .../ckeditor5-utils/src/dom/tounit.d.ts | 22 + .../ckeditor5-utils/src/dom/tounit.js | 16 + .../ckeditor5-utils/src/elementreplacer.d.ts | 31 + .../ckeditor5-utils/src/elementreplacer.js | 43 + .../ckeditor5-utils/src/emittermixin.d.ts | 312 + .../ckeditor5-utils/src/emittermixin.js | 453 + .../@ckeditor/ckeditor5-utils/src/env.d.ts | 117 + .../@ckeditor/ckeditor5-utils/src/env.js | 122 + .../ckeditor5-utils/src/eventinfo.d.ts | 58 + .../ckeditor5-utils/src/eventinfo.js | 26 + .../ckeditor5-utils/src/fastdiff.d.ts | 112 + .../@ckeditor/ckeditor5-utils/src/fastdiff.js | 248 + .../@ckeditor/ckeditor5-utils/src/first.d.ts | 11 + .../@ckeditor/ckeditor5-utils/src/first.js | 17 + .../ckeditor5-utils/src/focustracker.d.ts | 75 + .../ckeditor5-utils/src/focustracker.js | 95 + .../@ckeditor/ckeditor5-utils/src/index.d.ts | 64 + .../@ckeditor/ckeditor5-utils/src/index.js | 63 + .../src/inserttopriorityarray.d.ts | 30 + .../src/inserttopriorityarray.js | 21 + .../ckeditor5-utils/src/isiterable.d.ts | 14 + .../ckeditor5-utils/src/isiterable.js | 16 + .../ckeditor5-utils/src/keyboard.d.ts | 126 + .../@ckeditor/ckeditor5-utils/src/keyboard.js | 251 + .../ckeditor5-utils/src/keystrokehandler.d.ts | 87 + .../ckeditor5-utils/src/keystrokehandler.js | 122 + .../ckeditor5-utils/src/language.d.ts | 17 + .../@ckeditor/ckeditor5-utils/src/language.js | 20 + .../@ckeditor/ckeditor5-utils/src/locale.d.ts | 141 + .../@ckeditor/ckeditor5-utils/src/locale.js | 78 + .../ckeditor5-utils/src/mapsequal.d.ts | 15 + .../ckeditor5-utils/src/mapsequal.js | 27 + .../@ckeditor/ckeditor5-utils/src/mix.d.ts | 85 + .../@ckeditor/ckeditor5-utils/src/mix.js | 50 + .../@ckeditor/ckeditor5-utils/src/nth.d.ts | 16 + .../@ckeditor/ckeditor5-utils/src/nth.js | 24 + .../ckeditor5-utils/src/objecttomap.d.ts | 23 + .../ckeditor5-utils/src/objecttomap.js | 27 + .../ckeditor5-utils/src/observablemixin.d.ts | 560 ++ .../ckeditor5-utils/src/observablemixin.js | 580 ++ .../ckeditor5-utils/src/priorities.d.ts | 33 + .../ckeditor5-utils/src/priorities.js | 23 + .../@ckeditor/ckeditor5-utils/src/retry.d.ts | 33 + .../@ckeditor/ckeditor5-utils/src/retry.js | 47 + .../ckeditor5-utils/src/splicearray.d.ts | 26 + .../ckeditor5-utils/src/splicearray.js | 40 + .../@ckeditor/ckeditor5-utils/src/spy.d.ts | 21 + .../@ckeditor/ckeditor5-utils/src/spy.js | 22 + .../ckeditor5-utils/src/toarray.d.ts | 25 + .../@ckeditor/ckeditor5-utils/src/toarray.js | 7 + .../@ckeditor/ckeditor5-utils/src/tomap.d.ts | 19 + .../@ckeditor/ckeditor5-utils/src/tomap.js | 29 + .../src/translation-service.d.ts | 174 + .../src/translation-service.js | 209 + .../@ckeditor/ckeditor5-utils/src/uid.d.ts | 15 + .../@ckeditor/ckeditor5-utils/src/uid.js | 57 + .../ckeditor5-utils/src/unicode.d.ts | 54 + .../@ckeditor/ckeditor5-utils/src/unicode.js | 85 + .../ckeditor5-utils/src/verifylicense.d.ts | 15 + .../ckeditor5-utils/src/verifylicense.js | 87 + .../ckeditor5-utils/src/version.d.ts | 10 + .../@ckeditor/ckeditor5-utils/src/version.js | 153 + .../@ckeditor/ckeditor5-utils/src/wait.d.ts | 16 + .../@ckeditor/ckeditor5-utils/src/wait.js | 29 + .../@ckeditor/ckeditor5-watchdog/CHANGELOG.md | 75 + .../@ckeditor/ckeditor5-watchdog/LICENSE.md | 21 + .../@ckeditor/ckeditor5-watchdog/README.md | 16 + .../ckeditor5-metadata.json | 11 + .../@ckeditor/ckeditor5-watchdog/package.json | 35 + .../ckeditor5-watchdog/src/augmentation.d.ts | 15 + .../ckeditor5-watchdog/src/augmentation.js | 5 + .../src/contextwatchdog.d.ts | 333 + .../ckeditor5-watchdog/src/contextwatchdog.js | 410 + .../src/editorwatchdog.d.ts | 191 + .../ckeditor5-watchdog/src/editorwatchdog.js | 436 + .../ckeditor5-watchdog/src/index.d.ts | 11 + .../@ckeditor/ckeditor5-watchdog/src/index.js | 11 + .../utils/areconnectedthroughproperties.d.ts | 8 + .../utils/areconnectedthroughproperties.js | 58 + .../src/utils/getsubnodes.d.ts | 8 + .../src/utils/getsubnodes.js | 78 + .../ckeditor5-watchdog/src/watchdog.d.ts | 229 + .../ckeditor5-watchdog/src/watchdog.js | 185 + .../@ckeditor/ckeditor5-widget/CHANGELOG.md | 260 + .../@ckeditor/ckeditor5-widget/LICENSE.md | 21 + .../@ckeditor/ckeditor5-widget/README.md | 16 + .../ckeditor5-widget/lang/contexts.json | 11 + .../ckeditor5-widget/lang/translations/ar.po | 54 + .../ckeditor5-widget/lang/translations/az.po | 54 + .../ckeditor5-widget/lang/translations/bg.po | 54 + .../ckeditor5-widget/lang/translations/bn.po | 54 + .../ckeditor5-widget/lang/translations/ca.po | 54 + .../ckeditor5-widget/lang/translations/cs.po | 54 + .../ckeditor5-widget/lang/translations/da.po | 54 + .../lang/translations/de-ch.po | 54 + .../ckeditor5-widget/lang/translations/de.po | 54 + .../ckeditor5-widget/lang/translations/el.po | 54 + .../lang/translations/en-au.po | 54 + .../ckeditor5-widget/lang/translations/en.po | 54 + .../ckeditor5-widget/lang/translations/es.po | 54 + .../ckeditor5-widget/lang/translations/et.po | 54 + .../ckeditor5-widget/lang/translations/fa.po | 54 + .../ckeditor5-widget/lang/translations/fi.po | 54 + .../ckeditor5-widget/lang/translations/fr.po | 54 + .../ckeditor5-widget/lang/translations/gl.po | 54 + .../ckeditor5-widget/lang/translations/he.po | 54 + .../ckeditor5-widget/lang/translations/hi.po | 54 + .../ckeditor5-widget/lang/translations/hr.po | 54 + .../ckeditor5-widget/lang/translations/hu.po | 54 + .../ckeditor5-widget/lang/translations/id.po | 54 + .../ckeditor5-widget/lang/translations/it.po | 54 + .../ckeditor5-widget/lang/translations/ja.po | 54 + .../ckeditor5-widget/lang/translations/ko.po | 54 + .../ckeditor5-widget/lang/translations/ku.po | 54 + .../ckeditor5-widget/lang/translations/lt.po | 54 + .../ckeditor5-widget/lang/translations/lv.po | 54 + .../ckeditor5-widget/lang/translations/ms.po | 54 + .../ckeditor5-widget/lang/translations/nl.po | 54 + .../ckeditor5-widget/lang/translations/no.po | 54 + .../ckeditor5-widget/lang/translations/pl.po | 54 + .../lang/translations/pt-br.po | 54 + .../ckeditor5-widget/lang/translations/pt.po | 54 + .../ckeditor5-widget/lang/translations/ro.po | 54 + .../ckeditor5-widget/lang/translations/ru.po | 54 + .../ckeditor5-widget/lang/translations/sk.po | 54 + .../ckeditor5-widget/lang/translations/sq.po | 54 + .../lang/translations/sr-latn.po | 54 + .../ckeditor5-widget/lang/translations/sr.po | 54 + .../ckeditor5-widget/lang/translations/sv.po | 54 + .../ckeditor5-widget/lang/translations/th.po | 54 + .../ckeditor5-widget/lang/translations/tk.po | 54 + .../ckeditor5-widget/lang/translations/tr.po | 54 + .../ckeditor5-widget/lang/translations/uk.po | 54 + .../ckeditor5-widget/lang/translations/ur.po | 54 + .../ckeditor5-widget/lang/translations/uz.po | 54 + .../ckeditor5-widget/lang/translations/vi.po | 54 + .../lang/translations/zh-cn.po | 54 + .../ckeditor5-widget/lang/translations/zh.po | 54 + .../@ckeditor/ckeditor5-widget/package.json | 41 + .../ckeditor5-widget/src/augmentation.d.ts | 13 + .../ckeditor5-widget/src/augmentation.js | 5 + .../ckeditor5-widget/src/highlightstack.d.ts | 74 + .../ckeditor5-widget/src/highlightstack.js | 129 + .../@ckeditor/ckeditor5-widget/src/index.d.ts | 13 + .../@ckeditor/ckeditor5-widget/src/index.js | 13 + .../@ckeditor/ckeditor5-widget/src/utils.d.ts | 198 + .../@ckeditor/ckeditor5-widget/src/utils.js | 348 + .../src/verticalnavigation.d.ts | 15 + .../src/verticalnavigation.js | 196 + .../ckeditor5-widget/src/widget.d.ts | 103 + .../@ckeditor/ckeditor5-widget/src/widget.js | 537 ++ .../ckeditor5-widget/src/widgetresize.d.ts | 125 + .../ckeditor5-widget/src/widgetresize.js | 188 + .../src/widgetresize/resizer.d.ts | 177 + .../src/widgetresize/resizer.js | 372 + .../src/widgetresize/resizerstate.d.ts | 125 + .../src/widgetresize/resizerstate.js | 150 + .../src/widgetresize/sizeview.d.ts | 55 + .../src/widgetresize/sizeview.js | 63 + .../src/widgettoolbarrepository.d.ts | 94 + .../src/widgettoolbarrepository.js | 268 + .../src/widgettypearound/utils.d.ts | 38 + .../src/widgettypearound/utils.js | 52 + .../widgettypearound/widgettypearound.d.ts | 229 + .../src/widgettypearound/widgettypearound.js | 773 ++ .../theme/icons/drag-handle.svg | 1 + .../theme/icons/return-arrow.svg | 1 + .../ckeditor5-widget/theme/widget.css | 91 + .../ckeditor5-widget/theme/widgetresize.css | 43 + .../theme/widgettypearound.css | 113 + node_modules/accepts/HISTORY.md | 243 + node_modules/accepts/LICENSE | 23 + node_modules/accepts/README.md | 140 + node_modules/accepts/index.js | 238 + node_modules/accepts/package.json | 47 + node_modules/array-flatten/LICENSE | 21 + node_modules/array-flatten/README.md | 43 + node_modules/array-flatten/array-flatten.js | 64 + node_modules/array-flatten/package.json | 39 + node_modules/blurhash/CHANGELOG.md | 24 + node_modules/blurhash/README.md | 78 + node_modules/blurhash/dist/esm/index.js | 2 + node_modules/blurhash/dist/esm/index.js.map | 1 + node_modules/blurhash/dist/index.d.ts | 13 + node_modules/blurhash/dist/index.js | 2 + node_modules/blurhash/dist/index.js.map | 1 + node_modules/blurhash/dist/index.mjs | 2 + node_modules/blurhash/dist/index.mjs.map | 1 + node_modules/blurhash/package.json | 57 + node_modules/body-parser/HISTORY.md | 665 ++ node_modules/body-parser/LICENSE | 23 + node_modules/body-parser/README.md | 465 + node_modules/body-parser/SECURITY.md | 25 + node_modules/body-parser/index.js | 156 + node_modules/body-parser/lib/read.js | 205 + node_modules/body-parser/lib/types/json.js | 247 + node_modules/body-parser/lib/types/raw.js | 101 + node_modules/body-parser/lib/types/text.js | 121 + .../body-parser/lib/types/urlencoded.js | 284 + node_modules/body-parser/package.json | 56 + node_modules/bytes/History.md | 97 + node_modules/bytes/LICENSE | 23 + node_modules/bytes/Readme.md | 152 + node_modules/bytes/index.js | 170 + node_modules/bytes/package.json | 42 + node_modules/call-bind/.eslintignore | 1 + node_modules/call-bind/.eslintrc | 16 + node_modules/call-bind/.github/FUNDING.yml | 12 + node_modules/call-bind/.nycrc | 9 + node_modules/call-bind/CHANGELOG.md | 93 + node_modules/call-bind/LICENSE | 21 + node_modules/call-bind/README.md | 64 + node_modules/call-bind/callBound.js | 15 + node_modules/call-bind/index.js | 35 + node_modules/call-bind/package.json | 95 + node_modules/call-bind/test/callBound.js | 54 + node_modules/call-bind/test/index.js | 80 + node_modules/ckeditor5/CHANGELOG.md | 610 ++ node_modules/ckeditor5/LICENSE.md | 28 + node_modules/ckeditor5/README.md | 158 + node_modules/ckeditor5/build/ckeditor5-dll.js | 5 + .../build/ckeditor5-dll.manifest.json | 420 + .../ckeditor5/build/translations/af.js | 1 + .../ckeditor5/build/translations/ar.js | 1 + .../ckeditor5/build/translations/ast.js | 1 + .../ckeditor5/build/translations/az.js | 1 + .../ckeditor5/build/translations/bg.js | 1 + .../ckeditor5/build/translations/bn.js | 1 + .../ckeditor5/build/translations/bs.js | 1 + .../ckeditor5/build/translations/ca.js | 1 + .../ckeditor5/build/translations/cs.js | 1 + .../ckeditor5/build/translations/da.js | 1 + .../ckeditor5/build/translations/de-ch.js | 1 + .../ckeditor5/build/translations/de.js | 1 + .../ckeditor5/build/translations/el.js | 1 + .../ckeditor5/build/translations/en-au.js | 1 + .../ckeditor5/build/translations/en-gb.js | 1 + .../ckeditor5/build/translations/eo.js | 1 + .../ckeditor5/build/translations/es-co.js | 1 + .../ckeditor5/build/translations/es.js | 1 + .../ckeditor5/build/translations/et.js | 1 + .../ckeditor5/build/translations/eu.js | 1 + .../ckeditor5/build/translations/fa.js | 1 + .../ckeditor5/build/translations/fi.js | 1 + .../ckeditor5/build/translations/fr.js | 1 + .../ckeditor5/build/translations/gl.js | 1 + .../ckeditor5/build/translations/gu.js | 1 + .../ckeditor5/build/translations/he.js | 1 + .../ckeditor5/build/translations/hi.js | 1 + .../ckeditor5/build/translations/hr.js | 1 + .../ckeditor5/build/translations/hu.js | 1 + .../ckeditor5/build/translations/hy.js | 1 + .../ckeditor5/build/translations/id.js | 1 + .../ckeditor5/build/translations/it.js | 1 + .../ckeditor5/build/translations/ja.js | 1 + .../ckeditor5/build/translations/jv.js | 1 + .../ckeditor5/build/translations/km.js | 1 + .../ckeditor5/build/translations/kn.js | 1 + .../ckeditor5/build/translations/ko.js | 1 + .../ckeditor5/build/translations/ku.js | 1 + .../ckeditor5/build/translations/lt.js | 1 + .../ckeditor5/build/translations/lv.js | 1 + .../ckeditor5/build/translations/ms.js | 1 + .../ckeditor5/build/translations/nb.js | 1 + .../ckeditor5/build/translations/ne.js | 1 + .../ckeditor5/build/translations/nl.js | 1 + .../ckeditor5/build/translations/no.js | 1 + .../ckeditor5/build/translations/oc.js | 1 + .../ckeditor5/build/translations/pl.js | 1 + .../ckeditor5/build/translations/pt-br.js | 1 + .../ckeditor5/build/translations/pt.js | 1 + .../ckeditor5/build/translations/ro.js | 1 + .../ckeditor5/build/translations/ru.js | 1 + .../ckeditor5/build/translations/si.js | 1 + .../ckeditor5/build/translations/sk.js | 1 + .../ckeditor5/build/translations/sl.js | 1 + .../ckeditor5/build/translations/sq.js | 1 + .../ckeditor5/build/translations/sr-latn.js | 1 + .../ckeditor5/build/translations/sr.js | 1 + .../ckeditor5/build/translations/sv.js | 1 + .../ckeditor5/build/translations/th.js | 1 + .../ckeditor5/build/translations/tk.js | 1 + .../ckeditor5/build/translations/tr.js | 1 + .../ckeditor5/build/translations/tt.js | 1 + .../ckeditor5/build/translations/ug.js | 1 + .../ckeditor5/build/translations/uk.js | 1 + .../ckeditor5/build/translations/ur.js | 1 + .../ckeditor5/build/translations/uz.js | 1 + .../ckeditor5/build/translations/vi.js | 1 + .../ckeditor5/build/translations/zh-cn.js | 1 + .../ckeditor5/build/translations/zh.js | 1 + node_modules/ckeditor5/package.json | 56 + node_modules/ckeditor5/src/clipboard.d.ts | 8 + node_modules/ckeditor5/src/clipboard.js | 8 + node_modules/ckeditor5/src/core.d.ts | 8 + node_modules/ckeditor5/src/core.js | 8 + node_modules/ckeditor5/src/engine.d.ts | 8 + node_modules/ckeditor5/src/engine.js | 8 + node_modules/ckeditor5/src/enter.d.ts | 8 + node_modules/ckeditor5/src/enter.js | 8 + node_modules/ckeditor5/src/paragraph.d.ts | 8 + node_modules/ckeditor5/src/paragraph.js | 8 + node_modules/ckeditor5/src/select-all.d.ts | 8 + node_modules/ckeditor5/src/select-all.js | 8 + node_modules/ckeditor5/src/typing.d.ts | 8 + node_modules/ckeditor5/src/typing.js | 8 + node_modules/ckeditor5/src/ui.d.ts | 8 + node_modules/ckeditor5/src/ui.js | 8 + node_modules/ckeditor5/src/undo.d.ts | 8 + node_modules/ckeditor5/src/undo.js | 8 + node_modules/ckeditor5/src/upload.d.ts | 8 + node_modules/ckeditor5/src/upload.js | 8 + node_modules/ckeditor5/src/utils.d.ts | 8 + node_modules/ckeditor5/src/utils.js | 8 + node_modules/ckeditor5/src/watchdog.d.ts | 8 + node_modules/ckeditor5/src/watchdog.js | 8 + node_modules/ckeditor5/src/widget.d.ts | 8 + node_modules/ckeditor5/src/widget.js | 8 + node_modules/color-convert/CHANGELOG.md | 54 + node_modules/color-convert/LICENSE | 21 + node_modules/color-convert/README.md | 68 + node_modules/color-convert/conversions.js | 839 ++ node_modules/color-convert/index.js | 81 + node_modules/color-convert/package.json | 48 + node_modules/color-convert/route.js | 97 + node_modules/color-name/LICENSE | 8 + node_modules/color-name/README.md | 11 + node_modules/color-name/index.js | 152 + node_modules/color-name/package.json | 28 + node_modules/color-parse/.travis.yml | 3 + node_modules/color-parse/LICENSE | 21 + node_modules/color-parse/index.js | 171 + node_modules/color-parse/index.mjs | 168 + node_modules/color-parse/package.json | 37 + node_modules/color-parse/readme.md | 58 + node_modules/color-parse/test.mjs | 444 + node_modules/content-disposition/HISTORY.md | 60 + node_modules/content-disposition/LICENSE | 22 + node_modules/content-disposition/README.md | 142 + node_modules/content-disposition/index.js | 458 + node_modules/content-disposition/package.json | 44 + node_modules/content-type/HISTORY.md | 29 + node_modules/content-type/LICENSE | 22 + node_modules/content-type/README.md | 94 + node_modules/content-type/index.js | 225 + node_modules/content-type/package.json | 42 + node_modules/cookie-signature/.npmignore | 4 + node_modules/cookie-signature/History.md | 38 + node_modules/cookie-signature/Readme.md | 42 + node_modules/cookie-signature/index.js | 51 + node_modules/cookie-signature/package.json | 18 + node_modules/cookie/HISTORY.md | 147 + node_modules/cookie/LICENSE | 24 + node_modules/cookie/README.md | 317 + node_modules/cookie/SECURITY.md | 25 + node_modules/cookie/index.js | 274 + node_modules/cookie/package.json | 44 + node_modules/debug/.coveralls.yml | 1 + node_modules/debug/.eslintrc | 11 + node_modules/debug/.npmignore | 9 + node_modules/debug/.travis.yml | 14 + node_modules/debug/CHANGELOG.md | 362 + node_modules/debug/LICENSE | 19 + node_modules/debug/Makefile | 50 + node_modules/debug/README.md | 312 + node_modules/debug/component.json | 19 + node_modules/debug/karma.conf.js | 70 + node_modules/debug/node.js | 1 + node_modules/debug/package.json | 49 + node_modules/debug/src/browser.js | 185 + node_modules/debug/src/debug.js | 202 + node_modules/debug/src/index.js | 10 + node_modules/debug/src/inspector-log.js | 15 + node_modules/debug/src/node.js | 248 + node_modules/define-data-property/.eslintrc | 24 + .../define-data-property/.github/FUNDING.yml | 12 + node_modules/define-data-property/.nycrc | 13 + .../define-data-property/CHANGELOG.md | 70 + node_modules/define-data-property/LICENSE | 21 + node_modules/define-data-property/README.md | 67 + node_modules/define-data-property/index.d.ts | 12 + node_modules/define-data-property/index.js | 56 + .../define-data-property/package.json | 106 + .../define-data-property/test/index.js | 392 + .../define-data-property/tsconfig.json | 59 + node_modules/depd/History.md | 103 + node_modules/depd/LICENSE | 22 + node_modules/depd/Readme.md | 280 + node_modules/depd/index.js | 538 ++ node_modules/depd/lib/browser/index.js | 77 + node_modules/depd/package.json | 45 + node_modules/destroy/LICENSE | 23 + node_modules/destroy/README.md | 63 + node_modules/destroy/index.js | 209 + node_modules/destroy/package.json | 48 + node_modules/ee-first/LICENSE | 22 + node_modules/ee-first/README.md | 80 + node_modules/ee-first/index.js | 95 + node_modules/ee-first/package.json | 29 + node_modules/encodeurl/HISTORY.md | 14 + node_modules/encodeurl/LICENSE | 22 + node_modules/encodeurl/README.md | 128 + node_modules/encodeurl/index.js | 60 + node_modules/encodeurl/package.json | 40 + node_modules/es-define-property/.eslintrc | 13 + .../es-define-property/.github/FUNDING.yml | 12 + node_modules/es-define-property/.nycrc | 9 + node_modules/es-define-property/CHANGELOG.md | 15 + node_modules/es-define-property/LICENSE | 21 + node_modules/es-define-property/README.md | 49 + node_modules/es-define-property/index.d.ts | 3 + node_modules/es-define-property/index.js | 16 + node_modules/es-define-property/package.json | 81 + node_modules/es-define-property/test/index.js | 55 + node_modules/es-define-property/tsconfig.json | 50 + node_modules/es-errors/.eslintrc | 5 + node_modules/es-errors/.github/FUNDING.yml | 12 + node_modules/es-errors/CHANGELOG.md | 40 + node_modules/es-errors/LICENSE | 21 + node_modules/es-errors/README.md | 55 + node_modules/es-errors/eval.d.ts | 3 + node_modules/es-errors/eval.js | 4 + node_modules/es-errors/index.d.ts | 3 + node_modules/es-errors/index.js | 4 + node_modules/es-errors/package.json | 80 + node_modules/es-errors/range.d.ts | 3 + node_modules/es-errors/range.js | 4 + node_modules/es-errors/ref.d.ts | 3 + node_modules/es-errors/ref.js | 4 + node_modules/es-errors/syntax.d.ts | 3 + node_modules/es-errors/syntax.js | 4 + node_modules/es-errors/test/index.js | 19 + node_modules/es-errors/tsconfig.json | 49 + node_modules/es-errors/type.d.ts | 3 + node_modules/es-errors/type.js | 4 + node_modules/es-errors/uri.d.ts | 3 + node_modules/es-errors/uri.js | 4 + node_modules/escape-html/LICENSE | 24 + node_modules/escape-html/Readme.md | 43 + node_modules/escape-html/index.js | 78 + node_modules/escape-html/package.json | 24 + node_modules/etag/HISTORY.md | 83 + node_modules/etag/LICENSE | 22 + node_modules/etag/README.md | 159 + node_modules/etag/index.js | 131 + node_modules/etag/package.json | 47 + node_modules/express/History.md | 3615 +++++++ node_modules/express/LICENSE | 24 + node_modules/express/Readme.md | 166 + node_modules/express/index.js | 11 + node_modules/express/lib/application.js | 661 ++ node_modules/express/lib/express.js | 116 + node_modules/express/lib/middleware/init.js | 43 + node_modules/express/lib/middleware/query.js | 47 + node_modules/express/lib/request.js | 525 + node_modules/express/lib/response.js | 1178 +++ node_modules/express/lib/router/index.js | 673 ++ node_modules/express/lib/router/layer.js | 181 + node_modules/express/lib/router/route.js | 230 + node_modules/express/lib/utils.js | 303 + node_modules/express/lib/view.js | 182 + node_modules/express/package.json | 98 + node_modules/finalhandler/HISTORY.md | 195 + node_modules/finalhandler/LICENSE | 22 + node_modules/finalhandler/README.md | 147 + node_modules/finalhandler/SECURITY.md | 25 + node_modules/finalhandler/index.js | 336 + node_modules/finalhandler/package.json | 46 + node_modules/forwarded/HISTORY.md | 21 + node_modules/forwarded/LICENSE | 22 + node_modules/forwarded/README.md | 57 + node_modules/forwarded/index.js | 90 + node_modules/forwarded/package.json | 45 + node_modules/fresh/HISTORY.md | 70 + node_modules/fresh/LICENSE | 23 + node_modules/fresh/README.md | 119 + node_modules/fresh/index.js | 137 + node_modules/fresh/package.json | 46 + node_modules/function-bind/.eslintrc | 21 + .../function-bind/.github/FUNDING.yml | 12 + .../function-bind/.github/SECURITY.md | 3 + node_modules/function-bind/.nycrc | 13 + node_modules/function-bind/CHANGELOG.md | 136 + node_modules/function-bind/LICENSE | 20 + node_modules/function-bind/README.md | 46 + node_modules/function-bind/implementation.js | 84 + node_modules/function-bind/index.js | 5 + node_modules/function-bind/package.json | 87 + node_modules/function-bind/test/.eslintrc | 9 + node_modules/function-bind/test/index.js | 252 + node_modules/get-intrinsic/.eslintrc | 38 + .../get-intrinsic/.github/FUNDING.yml | 12 + node_modules/get-intrinsic/.nycrc | 9 + node_modules/get-intrinsic/CHANGELOG.md | 143 + node_modules/get-intrinsic/LICENSE | 21 + node_modules/get-intrinsic/README.md | 71 + node_modules/get-intrinsic/index.js | 359 + node_modules/get-intrinsic/package.json | 93 + .../get-intrinsic/test/GetIntrinsic.js | 274 + node_modules/gopd/.eslintrc | 16 + node_modules/gopd/.github/FUNDING.yml | 12 + node_modules/gopd/CHANGELOG.md | 25 + node_modules/gopd/LICENSE | 21 + node_modules/gopd/README.md | 40 + node_modules/gopd/index.js | 16 + node_modules/gopd/package.json | 71 + node_modules/gopd/test/index.js | 35 + .../has-property-descriptors/.eslintrc | 13 + .../.github/FUNDING.yml | 12 + node_modules/has-property-descriptors/.nycrc | 9 + .../has-property-descriptors/CHANGELOG.md | 35 + node_modules/has-property-descriptors/LICENSE | 21 + .../has-property-descriptors/README.md | 43 + .../has-property-descriptors/index.js | 22 + .../has-property-descriptors/package.json | 77 + .../has-property-descriptors/test/index.js | 57 + node_modules/has-proto/.eslintrc | 5 + node_modules/has-proto/.github/FUNDING.yml | 12 + node_modules/has-proto/CHANGELOG.md | 38 + node_modules/has-proto/LICENSE | 21 + node_modules/has-proto/README.md | 38 + node_modules/has-proto/index.d.ts | 3 + node_modules/has-proto/index.js | 15 + node_modules/has-proto/package.json | 78 + node_modules/has-proto/test/index.js | 19 + node_modules/has-proto/tsconfig.json | 49 + node_modules/has-symbols/.eslintrc | 11 + node_modules/has-symbols/.github/FUNDING.yml | 12 + node_modules/has-symbols/.nycrc | 9 + node_modules/has-symbols/CHANGELOG.md | 75 + node_modules/has-symbols/LICENSE | 21 + node_modules/has-symbols/README.md | 46 + node_modules/has-symbols/index.js | 13 + node_modules/has-symbols/package.json | 101 + node_modules/has-symbols/shams.js | 42 + node_modules/has-symbols/test/index.js | 22 + .../has-symbols/test/shams/core-js.js | 28 + .../test/shams/get-own-property-symbols.js | 28 + node_modules/has-symbols/test/tests.js | 56 + node_modules/hasown/.eslintrc | 5 + node_modules/hasown/.github/FUNDING.yml | 12 + node_modules/hasown/.nycrc | 13 + node_modules/hasown/CHANGELOG.md | 40 + node_modules/hasown/LICENSE | 21 + node_modules/hasown/README.md | 40 + node_modules/hasown/index.d.ts | 3 + node_modules/hasown/index.js | 8 + node_modules/hasown/package.json | 92 + node_modules/hasown/tsconfig.json | 6 + node_modules/http-errors/HISTORY.md | 180 + node_modules/http-errors/LICENSE | 23 + node_modules/http-errors/README.md | 169 + node_modules/http-errors/index.js | 289 + node_modules/http-errors/package.json | 50 + node_modules/iconv-lite/Changelog.md | 162 + node_modules/iconv-lite/LICENSE | 21 + node_modules/iconv-lite/README.md | 156 + .../iconv-lite/encodings/dbcs-codec.js | 555 ++ .../iconv-lite/encodings/dbcs-data.js | 176 + node_modules/iconv-lite/encodings/index.js | 22 + node_modules/iconv-lite/encodings/internal.js | 188 + .../iconv-lite/encodings/sbcs-codec.js | 72 + .../encodings/sbcs-data-generated.js | 451 + .../iconv-lite/encodings/sbcs-data.js | 174 + .../encodings/tables/big5-added.json | 122 + .../iconv-lite/encodings/tables/cp936.json | 264 + .../iconv-lite/encodings/tables/cp949.json | 273 + .../iconv-lite/encodings/tables/cp950.json | 177 + .../iconv-lite/encodings/tables/eucjp.json | 182 + .../encodings/tables/gb18030-ranges.json | 1 + .../encodings/tables/gbk-added.json | 55 + .../iconv-lite/encodings/tables/shiftjis.json | 125 + node_modules/iconv-lite/encodings/utf16.js | 177 + node_modules/iconv-lite/encodings/utf7.js | 290 + node_modules/iconv-lite/lib/bom-handling.js | 52 + node_modules/iconv-lite/lib/extend-node.js | 217 + node_modules/iconv-lite/lib/index.d.ts | 24 + node_modules/iconv-lite/lib/index.js | 153 + node_modules/iconv-lite/lib/streams.js | 121 + node_modules/iconv-lite/package.json | 46 + node_modules/inherits/LICENSE | 16 + node_modules/inherits/README.md | 42 + node_modules/inherits/inherits.js | 9 + node_modules/inherits/inherits_browser.js | 27 + node_modules/inherits/package.json | 29 + node_modules/ipaddr.js/LICENSE | 19 + node_modules/ipaddr.js/README.md | 233 + node_modules/ipaddr.js/ipaddr.min.js | 1 + node_modules/ipaddr.js/lib/ipaddr.js | 673 ++ node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 68 + node_modules/ipaddr.js/package.json | 35 + node_modules/lodash-es/LICENSE | 47 + node_modules/lodash-es/README.md | 10 + node_modules/lodash-es/_DataView.js | 7 + node_modules/lodash-es/_Hash.js | 32 + node_modules/lodash-es/_LazyWrapper.js | 28 + node_modules/lodash-es/_ListCache.js | 32 + node_modules/lodash-es/_LodashWrapper.js | 22 + node_modules/lodash-es/_Map.js | 7 + node_modules/lodash-es/_MapCache.js | 32 + node_modules/lodash-es/_Promise.js | 7 + node_modules/lodash-es/_Set.js | 7 + node_modules/lodash-es/_SetCache.js | 27 + node_modules/lodash-es/_Stack.js | 27 + node_modules/lodash-es/_Symbol.js | 6 + node_modules/lodash-es/_Uint8Array.js | 6 + node_modules/lodash-es/_WeakMap.js | 7 + node_modules/lodash-es/_addMapEntry.js | 15 + node_modules/lodash-es/_addSetEntry.js | 15 + node_modules/lodash-es/_apply.js | 21 + node_modules/lodash-es/_arrayAggregator.js | 22 + node_modules/lodash-es/_arrayEach.js | 22 + node_modules/lodash-es/_arrayEachRight.js | 21 + node_modules/lodash-es/_arrayEvery.js | 23 + node_modules/lodash-es/_arrayFilter.js | 25 + node_modules/lodash-es/_arrayIncludes.js | 17 + node_modules/lodash-es/_arrayIncludesWith.js | 22 + node_modules/lodash-es/_arrayLikeKeys.js | 49 + node_modules/lodash-es/_arrayMap.js | 21 + node_modules/lodash-es/_arrayPush.js | 20 + node_modules/lodash-es/_arrayReduce.js | 26 + node_modules/lodash-es/_arrayReduceRight.js | 24 + node_modules/lodash-es/_arraySample.js | 15 + node_modules/lodash-es/_arraySampleSize.js | 17 + node_modules/lodash-es/_arrayShuffle.js | 15 + node_modules/lodash-es/_arraySome.js | 23 + node_modules/lodash-es/_asciiSize.js | 12 + node_modules/lodash-es/_asciiToArray.js | 12 + node_modules/lodash-es/_asciiWords.js | 15 + node_modules/lodash-es/_assignMergeValue.js | 20 + node_modules/lodash-es/_assignValue.js | 28 + node_modules/lodash-es/_assocIndexOf.js | 21 + node_modules/lodash-es/_baseAggregator.js | 21 + node_modules/lodash-es/_baseAssign.js | 17 + node_modules/lodash-es/_baseAssignIn.js | 17 + node_modules/lodash-es/_baseAssignValue.js | 25 + node_modules/lodash-es/_baseAt.js | 23 + node_modules/lodash-es/_baseClamp.js | 22 + node_modules/lodash-es/_baseClone.js | 166 + node_modules/lodash-es/_baseConforms.js | 18 + node_modules/lodash-es/_baseConformsTo.js | 27 + node_modules/lodash-es/_baseCreate.js | 30 + node_modules/lodash-es/_baseDelay.js | 21 + node_modules/lodash-es/_baseDifference.js | 67 + node_modules/lodash-es/_baseEach.js | 14 + node_modules/lodash-es/_baseEachRight.js | 14 + node_modules/lodash-es/_baseEvery.js | 21 + node_modules/lodash-es/_baseExtremum.js | 32 + node_modules/lodash-es/_baseFill.js | 32 + node_modules/lodash-es/_baseFilter.js | 21 + node_modules/lodash-es/_baseFindIndex.js | 24 + node_modules/lodash-es/_baseFindKey.js | 23 + node_modules/lodash-es/_baseFlatten.js | 38 + node_modules/lodash-es/_baseFor.js | 16 + node_modules/lodash-es/_baseForOwn.js | 16 + node_modules/lodash-es/_baseForOwnRight.js | 16 + node_modules/lodash-es/_baseForRight.js | 15 + node_modules/lodash-es/_baseFunctions.js | 19 + node_modules/lodash-es/_baseGet.js | 24 + node_modules/lodash-es/_baseGetAllKeys.js | 20 + node_modules/lodash-es/_baseGetTag.js | 28 + node_modules/lodash-es/_baseGt.js | 14 + node_modules/lodash-es/_baseHas.js | 19 + node_modules/lodash-es/_baseHasIn.js | 13 + node_modules/lodash-es/_baseInRange.js | 18 + node_modules/lodash-es/_baseIndexOf.js | 20 + node_modules/lodash-es/_baseIndexOfWith.js | 23 + node_modules/lodash-es/_baseIntersection.js | 74 + node_modules/lodash-es/_baseInverter.js | 21 + node_modules/lodash-es/_baseInvoke.js | 24 + node_modules/lodash-es/_baseIsArguments.js | 18 + node_modules/lodash-es/_baseIsArrayBuffer.js | 17 + node_modules/lodash-es/_baseIsDate.js | 18 + node_modules/lodash-es/_baseIsEqual.js | 28 + node_modules/lodash-es/_baseIsEqualDeep.js | 83 + node_modules/lodash-es/_baseIsMap.js | 18 + node_modules/lodash-es/_baseIsMatch.js | 62 + node_modules/lodash-es/_baseIsNaN.js | 12 + node_modules/lodash-es/_baseIsNative.js | 47 + node_modules/lodash-es/_baseIsRegExp.js | 18 + node_modules/lodash-es/_baseIsSet.js | 18 + node_modules/lodash-es/_baseIsTypedArray.js | 60 + node_modules/lodash-es/_baseIteratee.js | 31 + node_modules/lodash-es/_baseKeys.js | 30 + node_modules/lodash-es/_baseKeysIn.js | 33 + node_modules/lodash-es/_baseLodash.js | 10 + node_modules/lodash-es/_baseLt.js | 14 + node_modules/lodash-es/_baseMap.js | 22 + node_modules/lodash-es/_baseMatches.js | 22 + .../lodash-es/_baseMatchesProperty.js | 33 + node_modules/lodash-es/_baseMean.js | 20 + node_modules/lodash-es/_baseMerge.js | 42 + node_modules/lodash-es/_baseMergeDeep.js | 94 + node_modules/lodash-es/_baseNth.js | 20 + node_modules/lodash-es/_baseOrderBy.js | 49 + node_modules/lodash-es/_basePick.js | 19 + node_modules/lodash-es/_basePickBy.js | 30 + node_modules/lodash-es/_baseProperty.js | 14 + node_modules/lodash-es/_basePropertyDeep.js | 16 + node_modules/lodash-es/_basePropertyOf.js | 14 + node_modules/lodash-es/_basePullAll.js | 51 + node_modules/lodash-es/_basePullAt.js | 37 + node_modules/lodash-es/_baseRandom.js | 18 + node_modules/lodash-es/_baseRange.js | 28 + node_modules/lodash-es/_baseReduce.js | 23 + node_modules/lodash-es/_baseRepeat.js | 35 + node_modules/lodash-es/_baseRest.js | 17 + node_modules/lodash-es/_baseSample.js | 15 + node_modules/lodash-es/_baseSampleSize.js | 18 + node_modules/lodash-es/_baseSet.js | 51 + node_modules/lodash-es/_baseSetData.js | 17 + node_modules/lodash-es/_baseSetToString.js | 22 + node_modules/lodash-es/_baseShuffle.js | 15 + node_modules/lodash-es/_baseSlice.js | 31 + node_modules/lodash-es/_baseSome.js | 22 + node_modules/lodash-es/_baseSortBy.js | 21 + node_modules/lodash-es/_baseSortedIndex.js | 42 + node_modules/lodash-es/_baseSortedIndexBy.js | 67 + node_modules/lodash-es/_baseSortedUniq.js | 30 + node_modules/lodash-es/_baseSum.js | 24 + node_modules/lodash-es/_baseTimes.js | 20 + node_modules/lodash-es/_baseToNumber.js | 24 + node_modules/lodash-es/_baseToPairs.js | 18 + node_modules/lodash-es/_baseToString.js | 37 + node_modules/lodash-es/_baseTrim.js | 19 + node_modules/lodash-es/_baseUnary.js | 14 + node_modules/lodash-es/_baseUniq.js | 72 + node_modules/lodash-es/_baseUnset.js | 20 + node_modules/lodash-es/_baseUpdate.js | 18 + node_modules/lodash-es/_baseValues.js | 19 + node_modules/lodash-es/_baseWhile.js | 26 + node_modules/lodash-es/_baseWrapperValue.js | 25 + node_modules/lodash-es/_baseXor.js | 36 + node_modules/lodash-es/_baseZipObject.js | 23 + node_modules/lodash-es/_cacheHas.js | 13 + .../lodash-es/_castArrayLikeObject.js | 14 + node_modules/lodash-es/_castFunction.js | 14 + node_modules/lodash-es/_castPath.js | 21 + node_modules/lodash-es/_castRest.js | 14 + node_modules/lodash-es/_castSlice.js | 18 + node_modules/lodash-es/_charsEndIndex.js | 19 + node_modules/lodash-es/_charsStartIndex.js | 20 + node_modules/lodash-es/_cloneArrayBuffer.js | 16 + node_modules/lodash-es/_cloneBuffer.js | 35 + node_modules/lodash-es/_cloneDataView.js | 16 + node_modules/lodash-es/_cloneMap.js | 22 + node_modules/lodash-es/_cloneRegExp.js | 17 + node_modules/lodash-es/_cloneSet.js | 22 + node_modules/lodash-es/_cloneSymbol.js | 18 + node_modules/lodash-es/_cloneTypedArray.js | 16 + node_modules/lodash-es/_compareAscending.js | 41 + node_modules/lodash-es/_compareMultiple.js | 44 + node_modules/lodash-es/_composeArgs.js | 39 + node_modules/lodash-es/_composeArgsRight.js | 41 + node_modules/lodash-es/_copyArray.js | 20 + node_modules/lodash-es/_copyObject.js | 40 + node_modules/lodash-es/_copySymbols.js | 16 + node_modules/lodash-es/_copySymbolsIn.js | 16 + node_modules/lodash-es/_coreJsData.js | 6 + node_modules/lodash-es/_countHolders.js | 21 + node_modules/lodash-es/_createAggregator.js | 23 + node_modules/lodash-es/_createAssigner.js | 37 + node_modules/lodash-es/_createBaseEach.js | 32 + node_modules/lodash-es/_createBaseFor.js | 25 + node_modules/lodash-es/_createBind.js | 28 + node_modules/lodash-es/_createCaseFirst.js | 33 + node_modules/lodash-es/_createCompounder.js | 24 + node_modules/lodash-es/_createCtor.js | 37 + node_modules/lodash-es/_createCurry.js | 46 + node_modules/lodash-es/_createFind.js | 25 + node_modules/lodash-es/_createFlow.js | 78 + node_modules/lodash-es/_createHybrid.js | 92 + node_modules/lodash-es/_createInverter.js | 17 + .../lodash-es/_createMathOperation.js | 38 + node_modules/lodash-es/_createOver.js | 27 + node_modules/lodash-es/_createPadding.js | 33 + node_modules/lodash-es/_createPartial.js | 43 + node_modules/lodash-es/_createRange.js | 30 + node_modules/lodash-es/_createRecurry.js | 56 + .../lodash-es/_createRelationalOperation.js | 20 + node_modules/lodash-es/_createRound.js | 35 + node_modules/lodash-es/_createSet.js | 19 + node_modules/lodash-es/_createToPairs.js | 30 + node_modules/lodash-es/_createWrap.js | 106 + .../lodash-es/_customDefaultsAssignIn.js | 29 + .../lodash-es/_customDefaultsMerge.js | 28 + node_modules/lodash-es/_customOmitClone.js | 16 + node_modules/lodash-es/_deburrLetter.js | 71 + node_modules/lodash-es/_defineProperty.js | 11 + node_modules/lodash-es/_equalArrays.js | 84 + node_modules/lodash-es/_equalByTag.js | 112 + node_modules/lodash-es/_equalObjects.js | 90 + node_modules/lodash-es/_escapeHtmlChar.js | 21 + node_modules/lodash-es/_escapeStringChar.js | 22 + node_modules/lodash-es/_flatRest.js | 16 + node_modules/lodash-es/_freeGlobal.js | 4 + node_modules/lodash-es/_getAllKeys.js | 16 + node_modules/lodash-es/_getAllKeysIn.js | 17 + node_modules/lodash-es/_getData.js | 15 + node_modules/lodash-es/_getFuncName.js | 31 + node_modules/lodash-es/_getHolder.js | 13 + node_modules/lodash-es/_getMapData.js | 18 + node_modules/lodash-es/_getMatchData.js | 24 + node_modules/lodash-es/_getNative.js | 17 + node_modules/lodash-es/_getPrototype.js | 6 + node_modules/lodash-es/_getRawTag.js | 46 + node_modules/lodash-es/_getSymbols.js | 30 + node_modules/lodash-es/_getSymbolsIn.js | 25 + node_modules/lodash-es/_getTag.js | 58 + node_modules/lodash-es/_getValue.js | 13 + node_modules/lodash-es/_getView.js | 33 + node_modules/lodash-es/_getWrapDetails.js | 17 + node_modules/lodash-es/_hasPath.js | 39 + node_modules/lodash-es/_hasUnicode.js | 26 + node_modules/lodash-es/_hasUnicodeWord.js | 15 + node_modules/lodash-es/_hashClear.js | 15 + node_modules/lodash-es/_hashDelete.js | 17 + node_modules/lodash-es/_hashGet.js | 30 + node_modules/lodash-es/_hashHas.js | 23 + node_modules/lodash-es/_hashSet.js | 23 + node_modules/lodash-es/_initCloneArray.js | 26 + node_modules/lodash-es/_initCloneByTag.js | 77 + node_modules/lodash-es/_initCloneObject.js | 18 + node_modules/lodash-es/_insertWrapDetails.js | 23 + node_modules/lodash-es/_isFlattenable.js | 20 + node_modules/lodash-es/_isIndex.js | 25 + node_modules/lodash-es/_isIterateeCall.js | 30 + node_modules/lodash-es/_isKey.js | 29 + node_modules/lodash-es/_isKeyable.js | 15 + node_modules/lodash-es/_isLaziable.js | 28 + node_modules/lodash-es/_isMaskable.js | 14 + node_modules/lodash-es/_isMasked.js | 20 + node_modules/lodash-es/_isPrototype.js | 18 + node_modules/lodash-es/_isStrictComparable.js | 15 + node_modules/lodash-es/_iteratorToArray.js | 18 + node_modules/lodash-es/_lazyClone.js | 23 + node_modules/lodash-es/_lazyReverse.js | 23 + node_modules/lodash-es/_lazyValue.js | 69 + node_modules/lodash-es/_listCacheClear.js | 13 + node_modules/lodash-es/_listCacheDelete.js | 35 + node_modules/lodash-es/_listCacheGet.js | 19 + node_modules/lodash-es/_listCacheHas.js | 16 + node_modules/lodash-es/_listCacheSet.js | 26 + node_modules/lodash-es/_mapCacheClear.js | 21 + node_modules/lodash-es/_mapCacheDelete.js | 18 + node_modules/lodash-es/_mapCacheGet.js | 16 + node_modules/lodash-es/_mapCacheHas.js | 16 + node_modules/lodash-es/_mapCacheSet.js | 22 + node_modules/lodash-es/_mapToArray.js | 18 + .../lodash-es/_matchesStrictComparable.js | 20 + node_modules/lodash-es/_memoizeCapped.js | 26 + node_modules/lodash-es/_mergeData.js | 90 + node_modules/lodash-es/_metaMap.js | 6 + node_modules/lodash-es/_nativeCreate.js | 6 + node_modules/lodash-es/_nativeKeys.js | 6 + node_modules/lodash-es/_nativeKeysIn.js | 20 + node_modules/lodash-es/_nodeUtil.js | 30 + node_modules/lodash-es/_objectToString.js | 22 + node_modules/lodash-es/_overArg.js | 15 + node_modules/lodash-es/_overRest.js | 36 + node_modules/lodash-es/_parent.js | 16 + node_modules/lodash-es/_reEscape.js | 4 + node_modules/lodash-es/_reEvaluate.js | 4 + node_modules/lodash-es/_reInterpolate.js | 4 + node_modules/lodash-es/_realNames.js | 4 + node_modules/lodash-es/_reorder.js | 29 + node_modules/lodash-es/_replaceHolders.js | 29 + node_modules/lodash-es/_root.js | 9 + node_modules/lodash-es/_safeGet.js | 21 + node_modules/lodash-es/_setCacheAdd.js | 19 + node_modules/lodash-es/_setCacheHas.js | 14 + node_modules/lodash-es/_setData.js | 20 + node_modules/lodash-es/_setToArray.js | 18 + node_modules/lodash-es/_setToPairs.js | 18 + node_modules/lodash-es/_setToString.js | 14 + node_modules/lodash-es/_setWrapToString.js | 21 + node_modules/lodash-es/_shortOut.js | 37 + node_modules/lodash-es/_shuffleSelf.js | 28 + node_modules/lodash-es/_stackClear.js | 15 + node_modules/lodash-es/_stackDelete.js | 18 + node_modules/lodash-es/_stackGet.js | 14 + node_modules/lodash-es/_stackHas.js | 14 + node_modules/lodash-es/_stackSet.js | 34 + node_modules/lodash-es/_strictIndexOf.js | 23 + node_modules/lodash-es/_strictLastIndexOf.js | 21 + node_modules/lodash-es/_stringSize.js | 18 + node_modules/lodash-es/_stringToArray.js | 18 + node_modules/lodash-es/_stringToPath.js | 27 + node_modules/lodash-es/_toKey.js | 21 + node_modules/lodash-es/_toSource.js | 26 + node_modules/lodash-es/_trimmedEndIndex.js | 19 + node_modules/lodash-es/_unescapeHtmlChar.js | 21 + node_modules/lodash-es/_unicodeSize.js | 44 + node_modules/lodash-es/_unicodeToArray.js | 40 + node_modules/lodash-es/_unicodeWords.js | 69 + node_modules/lodash-es/_updateWrapDetails.js | 46 + node_modules/lodash-es/_wrapperClone.js | 23 + node_modules/lodash-es/add.js | 22 + node_modules/lodash-es/after.js | 42 + node_modules/lodash-es/array.default.js | 81 + node_modules/lodash-es/array.js | 66 + node_modules/lodash-es/ary.js | 29 + node_modules/lodash-es/assign.js | 58 + node_modules/lodash-es/assignIn.js | 40 + node_modules/lodash-es/assignInWith.js | 38 + node_modules/lodash-es/assignWith.js | 37 + node_modules/lodash-es/at.js | 23 + node_modules/lodash-es/attempt.js | 35 + node_modules/lodash-es/before.js | 40 + node_modules/lodash-es/bind.js | 57 + node_modules/lodash-es/bindAll.js | 41 + node_modules/lodash-es/bindKey.js | 68 + node_modules/lodash-es/camelCase.js | 29 + node_modules/lodash-es/capitalize.js | 23 + node_modules/lodash-es/castArray.js | 44 + node_modules/lodash-es/ceil.js | 26 + node_modules/lodash-es/chain.js | 38 + node_modules/lodash-es/chunk.js | 50 + node_modules/lodash-es/clamp.js | 39 + node_modules/lodash-es/clone.js | 36 + node_modules/lodash-es/cloneDeep.js | 29 + node_modules/lodash-es/cloneDeepWith.js | 40 + node_modules/lodash-es/cloneWith.js | 42 + node_modules/lodash-es/collection.default.js | 37 + node_modules/lodash-es/collection.js | 29 + node_modules/lodash-es/commit.js | 33 + node_modules/lodash-es/compact.js | 31 + node_modules/lodash-es/concat.js | 43 + node_modules/lodash-es/cond.js | 60 + node_modules/lodash-es/conforms.js | 35 + node_modules/lodash-es/conformsTo.js | 32 + node_modules/lodash-es/constant.js | 26 + node_modules/lodash-es/countBy.js | 40 + node_modules/lodash-es/create.js | 43 + node_modules/lodash-es/curry.js | 57 + node_modules/lodash-es/curryRight.js | 54 + node_modules/lodash-es/date.default.js | 5 + node_modules/lodash-es/date.js | 2 + node_modules/lodash-es/debounce.js | 191 + node_modules/lodash-es/deburr.js | 45 + node_modules/lodash-es/defaultTo.js | 25 + node_modules/lodash-es/defaults.js | 64 + node_modules/lodash-es/defaultsDeep.js | 30 + node_modules/lodash-es/defer.js | 26 + node_modules/lodash-es/delay.js | 28 + node_modules/lodash-es/difference.js | 33 + node_modules/lodash-es/differenceBy.js | 44 + node_modules/lodash-es/differenceWith.js | 40 + node_modules/lodash-es/divide.js | 22 + node_modules/lodash-es/drop.js | 38 + node_modules/lodash-es/dropRight.js | 39 + node_modules/lodash-es/dropRightWhile.js | 45 + node_modules/lodash-es/dropWhile.js | 45 + node_modules/lodash-es/each.js | 1 + node_modules/lodash-es/eachRight.js | 1 + node_modules/lodash-es/endsWith.js | 43 + node_modules/lodash-es/entries.js | 1 + node_modules/lodash-es/entriesIn.js | 1 + node_modules/lodash-es/eq.js | 37 + node_modules/lodash-es/escape.js | 43 + node_modules/lodash-es/escapeRegExp.js | 32 + node_modules/lodash-es/every.js | 56 + node_modules/lodash-es/extend.js | 1 + node_modules/lodash-es/extendWith.js | 1 + node_modules/lodash-es/fill.js | 45 + node_modules/lodash-es/filter.js | 52 + node_modules/lodash-es/find.js | 42 + node_modules/lodash-es/findIndex.js | 55 + node_modules/lodash-es/findKey.js | 44 + node_modules/lodash-es/findLast.js | 25 + node_modules/lodash-es/findLastIndex.js | 59 + node_modules/lodash-es/findLastKey.js | 44 + node_modules/lodash-es/first.js | 1 + node_modules/lodash-es/flake.lock | 40 + node_modules/lodash-es/flake.nix | 20 + node_modules/lodash-es/flatMap.js | 29 + node_modules/lodash-es/flatMapDeep.js | 31 + node_modules/lodash-es/flatMapDepth.js | 31 + node_modules/lodash-es/flatten.js | 22 + node_modules/lodash-es/flattenDeep.js | 25 + node_modules/lodash-es/flattenDepth.js | 33 + node_modules/lodash-es/flip.js | 28 + node_modules/lodash-es/floor.js | 26 + node_modules/lodash-es/flow.js | 27 + node_modules/lodash-es/flowRight.js | 26 + node_modules/lodash-es/forEach.js | 41 + node_modules/lodash-es/forEachRight.js | 31 + node_modules/lodash-es/forIn.js | 39 + node_modules/lodash-es/forInRight.js | 37 + node_modules/lodash-es/forOwn.js | 36 + node_modules/lodash-es/forOwnRight.js | 34 + node_modules/lodash-es/fromPairs.js | 28 + node_modules/lodash-es/function.default.js | 31 + node_modules/lodash-es/function.js | 24 + node_modules/lodash-es/functions.js | 31 + node_modules/lodash-es/functionsIn.js | 31 + node_modules/lodash-es/get.js | 33 + node_modules/lodash-es/groupBy.js | 41 + node_modules/lodash-es/gt.js | 29 + node_modules/lodash-es/gte.js | 30 + node_modules/lodash-es/has.js | 35 + node_modules/lodash-es/hasIn.js | 34 + node_modules/lodash-es/head.js | 23 + node_modules/lodash-es/identity.js | 21 + node_modules/lodash-es/inRange.js | 55 + node_modules/lodash-es/includes.js | 53 + node_modules/lodash-es/indexOf.js | 42 + node_modules/lodash-es/initial.js | 22 + node_modules/lodash-es/intersection.js | 30 + node_modules/lodash-es/intersectionBy.js | 45 + node_modules/lodash-es/intersectionWith.js | 41 + node_modules/lodash-es/invert.js | 42 + node_modules/lodash-es/invertBy.js | 56 + node_modules/lodash-es/invoke.js | 24 + node_modules/lodash-es/invokeMap.js | 41 + node_modules/lodash-es/isArguments.js | 36 + node_modules/lodash-es/isArray.js | 26 + node_modules/lodash-es/isArrayBuffer.js | 27 + node_modules/lodash-es/isArrayLike.js | 33 + node_modules/lodash-es/isArrayLikeObject.js | 33 + node_modules/lodash-es/isBoolean.js | 29 + node_modules/lodash-es/isBuffer.js | 38 + node_modules/lodash-es/isDate.js | 27 + node_modules/lodash-es/isElement.js | 25 + node_modules/lodash-es/isEmpty.js | 77 + node_modules/lodash-es/isEqual.js | 35 + node_modules/lodash-es/isEqualWith.js | 41 + node_modules/lodash-es/isError.js | 36 + node_modules/lodash-es/isFinite.js | 36 + node_modules/lodash-es/isFunction.js | 37 + node_modules/lodash-es/isInteger.js | 33 + node_modules/lodash-es/isLength.js | 35 + node_modules/lodash-es/isMap.js | 27 + node_modules/lodash-es/isMatch.js | 36 + node_modules/lodash-es/isMatchWith.js | 41 + node_modules/lodash-es/isNaN.js | 38 + node_modules/lodash-es/isNative.js | 40 + node_modules/lodash-es/isNil.js | 25 + node_modules/lodash-es/isNull.js | 22 + node_modules/lodash-es/isNumber.js | 38 + node_modules/lodash-es/isObject.js | 31 + node_modules/lodash-es/isObjectLike.js | 29 + node_modules/lodash-es/isPlainObject.js | 62 + node_modules/lodash-es/isRegExp.js | 27 + node_modules/lodash-es/isSafeInteger.js | 37 + node_modules/lodash-es/isSet.js | 27 + node_modules/lodash-es/isString.js | 30 + node_modules/lodash-es/isSymbol.js | 29 + node_modules/lodash-es/isTypedArray.js | 27 + node_modules/lodash-es/isUndefined.js | 22 + node_modules/lodash-es/isWeakMap.js | 28 + node_modules/lodash-es/isWeakSet.js | 28 + node_modules/lodash-es/iteratee.js | 53 + node_modules/lodash-es/join.js | 26 + node_modules/lodash-es/kebabCase.js | 28 + node_modules/lodash-es/keyBy.js | 36 + node_modules/lodash-es/keys.js | 37 + node_modules/lodash-es/keysIn.js | 32 + node_modules/lodash-es/lang.default.js | 71 + node_modules/lodash-es/lang.js | 57 + node_modules/lodash-es/last.js | 20 + node_modules/lodash-es/lastIndexOf.js | 46 + node_modules/lodash-es/lodash.default.js | 643 ++ node_modules/lodash-es/lodash.js | 331 + node_modules/lodash-es/lowerCase.js | 27 + node_modules/lodash-es/lowerFirst.js | 22 + node_modules/lodash-es/lt.js | 29 + node_modules/lodash-es/lte.js | 30 + node_modules/lodash-es/map.js | 53 + node_modules/lodash-es/mapKeys.js | 36 + node_modules/lodash-es/mapValues.js | 43 + node_modules/lodash-es/matches.js | 46 + node_modules/lodash-es/matchesProperty.js | 44 + node_modules/lodash-es/math.default.js | 21 + node_modules/lodash-es/math.js | 16 + node_modules/lodash-es/max.js | 29 + node_modules/lodash-es/maxBy.js | 34 + node_modules/lodash-es/mean.js | 22 + node_modules/lodash-es/meanBy.js | 31 + node_modules/lodash-es/memoize.js | 73 + node_modules/lodash-es/merge.js | 39 + node_modules/lodash-es/mergeWith.js | 39 + node_modules/lodash-es/method.js | 34 + node_modules/lodash-es/methodOf.js | 33 + node_modules/lodash-es/min.js | 29 + node_modules/lodash-es/minBy.js | 34 + node_modules/lodash-es/mixin.js | 74 + node_modules/lodash-es/multiply.js | 22 + node_modules/lodash-es/negate.js | 40 + node_modules/lodash-es/next.js | 35 + node_modules/lodash-es/noop.js | 17 + node_modules/lodash-es/now.js | 23 + node_modules/lodash-es/nth.js | 29 + node_modules/lodash-es/nthArg.js | 32 + node_modules/lodash-es/number.default.js | 7 + node_modules/lodash-es/number.js | 4 + node_modules/lodash-es/object.default.js | 60 + node_modules/lodash-es/object.js | 48 + node_modules/lodash-es/omit.js | 57 + node_modules/lodash-es/omitBy.js | 29 + node_modules/lodash-es/once.js | 25 + node_modules/lodash-es/orderBy.js | 47 + node_modules/lodash-es/over.js | 24 + node_modules/lodash-es/overArgs.js | 61 + node_modules/lodash-es/overEvery.js | 34 + node_modules/lodash-es/overSome.js | 37 + node_modules/lodash-es/package.json | 21 + node_modules/lodash-es/pad.js | 49 + node_modules/lodash-es/padEnd.js | 39 + node_modules/lodash-es/padStart.js | 39 + node_modules/lodash-es/parseInt.js | 43 + node_modules/lodash-es/partial.js | 50 + node_modules/lodash-es/partialRight.js | 49 + node_modules/lodash-es/partition.js | 43 + node_modules/lodash-es/pick.js | 25 + node_modules/lodash-es/pickBy.js | 37 + node_modules/lodash-es/plant.js | 48 + node_modules/lodash-es/property.js | 32 + node_modules/lodash-es/propertyOf.js | 30 + node_modules/lodash-es/pull.js | 29 + node_modules/lodash-es/pullAll.js | 29 + node_modules/lodash-es/pullAllBy.js | 33 + node_modules/lodash-es/pullAllWith.js | 32 + node_modules/lodash-es/pullAt.js | 43 + node_modules/lodash-es/random.js | 82 + node_modules/lodash-es/range.js | 46 + node_modules/lodash-es/rangeRight.js | 41 + node_modules/lodash-es/rearg.js | 33 + node_modules/lodash-es/reduce.js | 51 + node_modules/lodash-es/reduceRight.js | 36 + node_modules/lodash-es/reject.js | 46 + node_modules/lodash-es/release.md | 48 + node_modules/lodash-es/remove.js | 53 + node_modules/lodash-es/repeat.js | 37 + node_modules/lodash-es/replace.js | 29 + node_modules/lodash-es/rest.js | 40 + node_modules/lodash-es/result.js | 56 + node_modules/lodash-es/reverse.js | 34 + node_modules/lodash-es/round.js | 26 + node_modules/lodash-es/sample.js | 24 + node_modules/lodash-es/sampleSize.js | 37 + node_modules/lodash-es/seq.default.js | 20 + node_modules/lodash-es/seq.js | 15 + node_modules/lodash-es/set.js | 35 + node_modules/lodash-es/setWith.js | 32 + node_modules/lodash-es/shuffle.js | 25 + node_modules/lodash-es/size.js | 46 + node_modules/lodash-es/slice.js | 37 + node_modules/lodash-es/snakeCase.js | 28 + node_modules/lodash-es/some.js | 51 + node_modules/lodash-es/sortBy.js | 48 + node_modules/lodash-es/sortedIndex.js | 24 + node_modules/lodash-es/sortedIndexBy.js | 33 + node_modules/lodash-es/sortedIndexOf.js | 31 + node_modules/lodash-es/sortedLastIndex.js | 25 + node_modules/lodash-es/sortedLastIndexBy.js | 33 + node_modules/lodash-es/sortedLastIndexOf.js | 31 + node_modules/lodash-es/sortedUniq.js | 24 + node_modules/lodash-es/sortedUniqBy.js | 26 + node_modules/lodash-es/split.js | 52 + node_modules/lodash-es/spread.js | 63 + node_modules/lodash-es/startCase.js | 29 + node_modules/lodash-es/startsWith.js | 39 + node_modules/lodash-es/string.default.js | 41 + node_modules/lodash-es/string.js | 32 + node_modules/lodash-es/stubArray.js | 23 + node_modules/lodash-es/stubFalse.js | 18 + node_modules/lodash-es/stubObject.js | 23 + node_modules/lodash-es/stubString.js | 18 + node_modules/lodash-es/stubTrue.js | 18 + node_modules/lodash-es/subtract.js | 22 + node_modules/lodash-es/sum.js | 24 + node_modules/lodash-es/sumBy.js | 33 + node_modules/lodash-es/tail.js | 22 + node_modules/lodash-es/take.js | 37 + node_modules/lodash-es/takeRight.js | 39 + node_modules/lodash-es/takeRightWhile.js | 45 + node_modules/lodash-es/takeWhile.js | 45 + node_modules/lodash-es/tap.js | 29 + node_modules/lodash-es/template.js | 272 + node_modules/lodash-es/templateSettings.js | 67 + node_modules/lodash-es/throttle.js | 69 + node_modules/lodash-es/thru.js | 28 + node_modules/lodash-es/times.js | 51 + node_modules/lodash-es/toArray.js | 58 + node_modules/lodash-es/toFinite.js | 42 + node_modules/lodash-es/toInteger.js | 36 + node_modules/lodash-es/toIterator.js | 23 + node_modules/lodash-es/toJSON.js | 1 + node_modules/lodash-es/toLength.js | 38 + node_modules/lodash-es/toLower.js | 28 + node_modules/lodash-es/toNumber.js | 64 + node_modules/lodash-es/toPairs.js | 30 + node_modules/lodash-es/toPairsIn.js | 30 + node_modules/lodash-es/toPath.js | 33 + node_modules/lodash-es/toPlainObject.js | 32 + node_modules/lodash-es/toSafeInteger.js | 37 + node_modules/lodash-es/toString.js | 28 + node_modules/lodash-es/toUpper.js | 28 + node_modules/lodash-es/transform.js | 65 + node_modules/lodash-es/trim.js | 47 + node_modules/lodash-es/trimEnd.js | 41 + node_modules/lodash-es/trimStart.js | 43 + node_modules/lodash-es/truncate.js | 111 + node_modules/lodash-es/unary.js | 22 + node_modules/lodash-es/unescape.js | 34 + node_modules/lodash-es/union.js | 26 + node_modules/lodash-es/unionBy.js | 39 + node_modules/lodash-es/unionWith.js | 34 + node_modules/lodash-es/uniq.js | 25 + node_modules/lodash-es/uniqBy.js | 31 + node_modules/lodash-es/uniqWith.js | 28 + node_modules/lodash-es/uniqueId.js | 28 + node_modules/lodash-es/unset.js | 34 + node_modules/lodash-es/unzip.js | 45 + node_modules/lodash-es/unzipWith.js | 39 + node_modules/lodash-es/update.js | 35 + node_modules/lodash-es/updateWith.js | 33 + node_modules/lodash-es/upperCase.js | 27 + node_modules/lodash-es/upperFirst.js | 22 + node_modules/lodash-es/util.default.js | 42 + node_modules/lodash-es/util.js | 33 + node_modules/lodash-es/value.js | 1 + node_modules/lodash-es/valueOf.js | 1 + node_modules/lodash-es/values.js | 34 + node_modules/lodash-es/valuesIn.js | 32 + node_modules/lodash-es/without.js | 31 + node_modules/lodash-es/words.js | 35 + node_modules/lodash-es/wrap.js | 30 + node_modules/lodash-es/wrapperAt.js | 48 + node_modules/lodash-es/wrapperChain.js | 34 + node_modules/lodash-es/wrapperLodash.js | 147 + node_modules/lodash-es/wrapperReverse.js | 44 + node_modules/lodash-es/wrapperValue.js | 21 + node_modules/lodash-es/xor.js | 28 + node_modules/lodash-es/xorBy.js | 39 + node_modules/lodash-es/xorWith.js | 34 + node_modules/lodash-es/zip.js | 22 + node_modules/lodash-es/zipObject.js | 24 + node_modules/lodash-es/zipObjectDeep.js | 23 + node_modules/lodash-es/zipWith.js | 32 + node_modules/media-typer/HISTORY.md | 22 + node_modules/media-typer/LICENSE | 22 + node_modules/media-typer/README.md | 81 + node_modules/media-typer/index.js | 270 + node_modules/media-typer/package.json | 26 + node_modules/merge-descriptors/HISTORY.md | 21 + node_modules/merge-descriptors/LICENSE | 23 + node_modules/merge-descriptors/README.md | 48 + node_modules/merge-descriptors/index.js | 60 + node_modules/merge-descriptors/package.json | 32 + node_modules/methods/HISTORY.md | 29 + node_modules/methods/LICENSE | 24 + node_modules/methods/README.md | 51 + node_modules/methods/index.js | 69 + node_modules/methods/package.json | 36 + node_modules/mime-db/HISTORY.md | 507 + node_modules/mime-db/LICENSE | 23 + node_modules/mime-db/README.md | 100 + node_modules/mime-db/db.json | 8519 +++++++++++++++++ node_modules/mime-db/index.js | 12 + node_modules/mime-db/package.json | 60 + node_modules/mime-types/HISTORY.md | 397 + node_modules/mime-types/LICENSE | 23 + node_modules/mime-types/README.md | 113 + node_modules/mime-types/index.js | 188 + node_modules/mime-types/package.json | 44 + node_modules/mime/.npmignore | 0 node_modules/mime/CHANGELOG.md | 164 + node_modules/mime/LICENSE | 21 + node_modules/mime/README.md | 90 + node_modules/mime/cli.js | 8 + node_modules/mime/mime.js | 108 + node_modules/mime/package.json | 44 + node_modules/mime/src/build.js | 53 + node_modules/mime/src/test.js | 60 + node_modules/mime/types.json | 1 + node_modules/ms/index.js | 152 + node_modules/ms/license.md | 21 + node_modules/ms/package.json | 37 + node_modules/ms/readme.md | 51 + node_modules/negotiator/HISTORY.md | 108 + node_modules/negotiator/LICENSE | 24 + node_modules/negotiator/README.md | 203 + node_modules/negotiator/index.js | 82 + node_modules/negotiator/lib/charset.js | 169 + node_modules/negotiator/lib/encoding.js | 184 + node_modules/negotiator/lib/language.js | 179 + node_modules/negotiator/lib/mediaType.js | 294 + node_modules/negotiator/package.json | 42 + node_modules/object-inspect/.eslintrc | 53 + .../object-inspect/.github/FUNDING.yml | 12 + node_modules/object-inspect/.nycrc | 13 + node_modules/object-inspect/CHANGELOG.md | 389 + node_modules/object-inspect/LICENSE | 21 + node_modules/object-inspect/example/all.js | 23 + .../object-inspect/example/circular.js | 6 + node_modules/object-inspect/example/fn.js | 5 + .../object-inspect/example/inspect.js | 10 + node_modules/object-inspect/index.js | 524 + .../object-inspect/package-support.json | 20 + node_modules/object-inspect/package.json | 99 + node_modules/object-inspect/readme.markdown | 86 + node_modules/object-inspect/test-core-js.js | 26 + node_modules/object-inspect/test/bigint.js | 58 + .../object-inspect/test/browser/dom.js | 15 + node_modules/object-inspect/test/circular.js | 16 + node_modules/object-inspect/test/deep.js | 12 + node_modules/object-inspect/test/element.js | 53 + node_modules/object-inspect/test/err.js | 48 + node_modules/object-inspect/test/fakes.js | 29 + node_modules/object-inspect/test/fn.js | 76 + node_modules/object-inspect/test/global.js | 17 + node_modules/object-inspect/test/has.js | 15 + node_modules/object-inspect/test/holes.js | 15 + .../object-inspect/test/indent-option.js | 271 + node_modules/object-inspect/test/inspect.js | 139 + node_modules/object-inspect/test/lowbyte.js | 12 + node_modules/object-inspect/test/number.js | 58 + .../object-inspect/test/quoteStyle.js | 17 + .../object-inspect/test/toStringTag.js | 40 + node_modules/object-inspect/test/undef.js | 12 + node_modules/object-inspect/test/values.js | 211 + node_modules/object-inspect/util.inspect.js | 1 + node_modules/on-finished/HISTORY.md | 98 + node_modules/on-finished/LICENSE | 23 + node_modules/on-finished/README.md | 162 + node_modules/on-finished/index.js | 234 + node_modules/on-finished/package.json | 39 + node_modules/parseurl/HISTORY.md | 58 + node_modules/parseurl/LICENSE | 24 + node_modules/parseurl/README.md | 133 + node_modules/parseurl/index.js | 158 + node_modules/parseurl/package.json | 40 + node_modules/path-to-regexp/History.md | 36 + node_modules/path-to-regexp/LICENSE | 21 + node_modules/path-to-regexp/Readme.md | 35 + node_modules/path-to-regexp/index.js | 129 + node_modules/path-to-regexp/package.json | 30 + node_modules/proxy-addr/HISTORY.md | 161 + node_modules/proxy-addr/LICENSE | 22 + node_modules/proxy-addr/README.md | 139 + node_modules/proxy-addr/index.js | 327 + node_modules/proxy-addr/package.json | 47 + node_modules/qs/.editorconfig | 43 + node_modules/qs/.eslintrc | 38 + node_modules/qs/.github/FUNDING.yml | 12 + node_modules/qs/.nycrc | 13 + node_modules/qs/CHANGELOG.md | 546 ++ node_modules/qs/LICENSE.md | 29 + node_modules/qs/README.md | 625 ++ node_modules/qs/dist/qs.js | 2054 ++++ node_modules/qs/lib/formats.js | 23 + node_modules/qs/lib/index.js | 11 + node_modules/qs/lib/parse.js | 263 + node_modules/qs/lib/stringify.js | 326 + node_modules/qs/lib/utils.js | 252 + node_modules/qs/package.json | 77 + node_modules/qs/test/parse.js | 855 ++ node_modules/qs/test/stringify.js | 909 ++ node_modules/qs/test/utils.js | 136 + node_modules/range-parser/HISTORY.md | 56 + node_modules/range-parser/LICENSE | 23 + node_modules/range-parser/README.md | 84 + node_modules/range-parser/index.js | 162 + node_modules/range-parser/package.json | 44 + node_modules/raw-body/HISTORY.md | 308 + node_modules/raw-body/LICENSE | 22 + node_modules/raw-body/README.md | 223 + node_modules/raw-body/SECURITY.md | 24 + node_modules/raw-body/index.d.ts | 87 + node_modules/raw-body/index.js | 336 + node_modules/raw-body/package.json | 49 + node_modules/safe-buffer/LICENSE | 21 + node_modules/safe-buffer/README.md | 584 ++ node_modules/safe-buffer/index.d.ts | 187 + node_modules/safe-buffer/index.js | 65 + node_modules/safe-buffer/package.json | 51 + node_modules/safer-buffer/LICENSE | 21 + node_modules/safer-buffer/Porting-Buffer.md | 268 + node_modules/safer-buffer/Readme.md | 156 + node_modules/safer-buffer/dangerous.js | 58 + node_modules/safer-buffer/package.json | 34 + node_modules/safer-buffer/safer.js | 77 + node_modules/safer-buffer/tests.js | 406 + node_modules/send/HISTORY.md | 521 + node_modules/send/LICENSE | 23 + node_modules/send/README.md | 327 + node_modules/send/SECURITY.md | 24 + node_modules/send/index.js | 1143 +++ node_modules/send/node_modules/ms/index.js | 162 + node_modules/send/node_modules/ms/license.md | 21 + .../send/node_modules/ms/package.json | 38 + node_modules/send/node_modules/ms/readme.md | 59 + node_modules/send/package.json | 62 + node_modules/serve-static/HISTORY.md | 471 + node_modules/serve-static/LICENSE | 25 + node_modules/serve-static/README.md | 257 + node_modules/serve-static/index.js | 210 + node_modules/serve-static/package.json | 42 + node_modules/set-function-length/.eslintrc | 27 + .../set-function-length/.github/FUNDING.yml | 12 + node_modules/set-function-length/.nycrc | 13 + node_modules/set-function-length/CHANGELOG.md | 70 + node_modules/set-function-length/LICENSE | 21 + node_modules/set-function-length/README.md | 56 + node_modules/set-function-length/env.d.ts | 9 + node_modules/set-function-length/env.js | 25 + node_modules/set-function-length/index.d.ts | 7 + node_modules/set-function-length/index.js | 42 + node_modules/set-function-length/package.json | 102 + .../set-function-length/tsconfig.json | 9 + node_modules/setprototypeof/LICENSE | 13 + node_modules/setprototypeof/README.md | 31 + node_modules/setprototypeof/index.d.ts | 2 + node_modules/setprototypeof/index.js | 17 + node_modules/setprototypeof/package.json | 38 + node_modules/setprototypeof/test/index.js | 24 + node_modules/side-channel/.editorconfig | 9 + node_modules/side-channel/.eslintrc | 11 + node_modules/side-channel/.github/FUNDING.yml | 12 + node_modules/side-channel/.nycrc | 13 + node_modules/side-channel/CHANGELOG.md | 95 + node_modules/side-channel/LICENSE | 21 + node_modules/side-channel/README.md | 2 + node_modules/side-channel/index.d.ts | 27 + node_modules/side-channel/index.js | 129 + node_modules/side-channel/package.json | 84 + node_modules/side-channel/test/index.js | 83 + node_modules/side-channel/tsconfig.json | 50 + node_modules/statuses/HISTORY.md | 82 + node_modules/statuses/LICENSE | 23 + node_modules/statuses/README.md | 136 + node_modules/statuses/codes.json | 65 + node_modules/statuses/index.js | 146 + node_modules/statuses/package.json | 49 + node_modules/toidentifier/HISTORY.md | 9 + node_modules/toidentifier/LICENSE | 21 + node_modules/toidentifier/README.md | 61 + node_modules/toidentifier/index.js | 32 + node_modules/toidentifier/package.json | 38 + node_modules/type-is/HISTORY.md | 259 + node_modules/type-is/LICENSE | 23 + node_modules/type-is/README.md | 170 + node_modules/type-is/index.js | 266 + node_modules/type-is/package.json | 45 + node_modules/unpipe/HISTORY.md | 4 + node_modules/unpipe/LICENSE | 22 + node_modules/unpipe/README.md | 43 + node_modules/unpipe/index.js | 69 + node_modules/unpipe/package.json | 27 + node_modules/utils-merge/.npmignore | 9 + node_modules/utils-merge/LICENSE | 20 + node_modules/utils-merge/README.md | 34 + node_modules/utils-merge/index.js | 23 + node_modules/utils-merge/package.json | 40 + node_modules/vanilla-colorful/ACKNOWLEDGMENTS | 6 + node_modules/vanilla-colorful/LICENSE | 21 + node_modules/vanilla-colorful/README.md | 282 + .../vanilla-colorful/custom-elements.json | 4616 +++++++++ .../hex-alpha-color-picker.d.ts | 26 + .../hex-alpha-color-picker.d.ts.map | 1 + .../hex-alpha-color-picker.js | 22 + .../hex-alpha-color-picker.js.map | 1 + .../vanilla-colorful/hex-color-picker.d.ts | 24 + .../hex-color-picker.d.ts.map | 1 + .../vanilla-colorful/hex-color-picker.js | 20 + .../vanilla-colorful/hex-color-picker.js.map | 1 + node_modules/vanilla-colorful/hex-input.d.ts | 25 + .../vanilla-colorful/hex-input.d.ts.map | 1 + node_modules/vanilla-colorful/hex-input.js | 21 + .../vanilla-colorful/hex-input.js.map | 1 + .../vanilla-colorful/hsl-color-picker.d.ts | 24 + .../hsl-color-picker.d.ts.map | 1 + .../vanilla-colorful/hsl-color-picker.js | 19 + .../vanilla-colorful/hsl-color-picker.js.map | 1 + .../hsl-string-color-picker.d.ts | 24 + .../hsl-string-color-picker.d.ts.map | 1 + .../hsl-string-color-picker.js | 20 + .../hsl-string-color-picker.js.map | 1 + .../vanilla-colorful/hsla-color-picker.d.ts | 26 + .../hsla-color-picker.d.ts.map | 1 + .../vanilla-colorful/hsla-color-picker.js | 21 + .../vanilla-colorful/hsla-color-picker.js.map | 1 + .../hsla-string-color-picker.d.ts | 26 + .../hsla-string-color-picker.d.ts.map | 1 + .../hsla-string-color-picker.js | 22 + .../hsla-string-color-picker.js.map | 1 + .../vanilla-colorful/hsv-color-picker.d.ts | 24 + .../hsv-color-picker.d.ts.map | 1 + .../vanilla-colorful/hsv-color-picker.js | 19 + .../vanilla-colorful/hsv-color-picker.js.map | 1 + .../hsv-string-color-picker.d.ts | 24 + .../hsv-string-color-picker.d.ts.map | 1 + .../hsv-string-color-picker.js | 20 + .../hsv-string-color-picker.js.map | 1 + .../vanilla-colorful/hsva-color-picker.d.ts | 26 + .../hsva-color-picker.d.ts.map | 1 + .../vanilla-colorful/hsva-color-picker.js | 21 + .../vanilla-colorful/hsva-color-picker.js.map | 1 + .../hsva-string-color-picker.d.ts | 26 + .../hsva-string-color-picker.d.ts.map | 1 + .../hsva-string-color-picker.js | 22 + .../hsva-string-color-picker.js.map | 1 + .../lib/components/alpha-color-picker.d.ts | 7 + .../components/alpha-color-picker.d.ts.map | 1 + .../lib/components/alpha-color-picker.js | 12 + .../lib/components/alpha-color-picker.js.map | 1 + .../lib/components/alpha.d.ts | 9 + .../lib/components/alpha.d.ts.map | 1 + .../vanilla-colorful/lib/components/alpha.js | 31 + .../lib/components/alpha.js.map | 1 + .../lib/components/color-picker.d.ts | 29 + .../lib/components/color-picker.d.ts.map | 1 + .../lib/components/color-picker.js | 82 + .../lib/components/color-picker.js.map | 1 + .../vanilla-colorful/lib/components/hue.d.ts | 9 + .../lib/components/hue.d.ts.map | 1 + .../vanilla-colorful/lib/components/hue.js | 23 + .../lib/components/hue.js.map | 1 + .../lib/components/saturation.d.ts | 9 + .../lib/components/saturation.d.ts.map | 1 + .../lib/components/saturation.js | 30 + .../lib/components/saturation.js.map | 1 + .../lib/components/slider.d.ts | 17 + .../lib/components/slider.d.ts.map | 1 + .../vanilla-colorful/lib/components/slider.js | 104 + .../lib/components/slider.js.map | 1 + .../lib/entrypoints/hex-alpha.d.ts | 10 + .../lib/entrypoints/hex-alpha.d.ts.map | 1 + .../lib/entrypoints/hex-alpha.js | 16 + .../lib/entrypoints/hex-alpha.js.map | 1 + .../lib/entrypoints/hex-input.d.ts | 34 + .../lib/entrypoints/hex-input.d.ts.map | 1 + .../lib/entrypoints/hex-input.js | 145 + .../lib/entrypoints/hex-input.js.map | 1 + .../vanilla-colorful/lib/entrypoints/hex.d.ts | 10 + .../lib/entrypoints/hex.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/hex.js | 16 + .../lib/entrypoints/hex.js.map | 1 + .../lib/entrypoints/hsl-string.d.ts | 10 + .../lib/entrypoints/hsl-string.d.ts.map | 1 + .../lib/entrypoints/hsl-string.js | 16 + .../lib/entrypoints/hsl-string.js.map | 1 + .../vanilla-colorful/lib/entrypoints/hsl.d.ts | 10 + .../lib/entrypoints/hsl.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/hsl.js | 16 + .../lib/entrypoints/hsl.js.map | 1 + .../lib/entrypoints/hsla-string.d.ts | 10 + .../lib/entrypoints/hsla-string.d.ts.map | 1 + .../lib/entrypoints/hsla-string.js | 16 + .../lib/entrypoints/hsla-string.js.map | 1 + .../lib/entrypoints/hsla.d.ts | 10 + .../lib/entrypoints/hsla.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/hsla.js | 16 + .../lib/entrypoints/hsla.js.map | 1 + .../lib/entrypoints/hsv-string.d.ts | 10 + .../lib/entrypoints/hsv-string.d.ts.map | 1 + .../lib/entrypoints/hsv-string.js | 16 + .../lib/entrypoints/hsv-string.js.map | 1 + .../vanilla-colorful/lib/entrypoints/hsv.d.ts | 10 + .../lib/entrypoints/hsv.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/hsv.js | 16 + .../lib/entrypoints/hsv.js.map | 1 + .../lib/entrypoints/hsva-string.d.ts | 10 + .../lib/entrypoints/hsva-string.d.ts.map | 1 + .../lib/entrypoints/hsva-string.js | 16 + .../lib/entrypoints/hsva-string.js.map | 1 + .../lib/entrypoints/hsva.d.ts | 10 + .../lib/entrypoints/hsva.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/hsva.js | 16 + .../lib/entrypoints/hsva.js.map | 1 + .../lib/entrypoints/rgb-string.d.ts | 10 + .../lib/entrypoints/rgb-string.d.ts.map | 1 + .../lib/entrypoints/rgb-string.js | 16 + .../lib/entrypoints/rgb-string.js.map | 1 + .../vanilla-colorful/lib/entrypoints/rgb.d.ts | 10 + .../lib/entrypoints/rgb.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/rgb.js | 16 + .../lib/entrypoints/rgb.js.map | 1 + .../lib/entrypoints/rgba-string.d.ts | 10 + .../lib/entrypoints/rgba-string.d.ts.map | 1 + .../lib/entrypoints/rgba-string.js | 16 + .../lib/entrypoints/rgba-string.js.map | 1 + .../lib/entrypoints/rgba.d.ts | 10 + .../lib/entrypoints/rgba.d.ts.map | 1 + .../vanilla-colorful/lib/entrypoints/rgba.js | 16 + .../lib/entrypoints/rgba.js.map | 1 + .../vanilla-colorful/lib/styles/alpha.d.ts | 3 + .../lib/styles/alpha.d.ts.map | 1 + .../vanilla-colorful/lib/styles/alpha.js | 2 + .../vanilla-colorful/lib/styles/alpha.js.map | 1 + .../lib/styles/color-picker.d.ts | 3 + .../lib/styles/color-picker.d.ts.map | 1 + .../lib/styles/color-picker.js | 2 + .../lib/styles/color-picker.js.map | 1 + .../vanilla-colorful/lib/styles/hue.d.ts | 3 + .../vanilla-colorful/lib/styles/hue.d.ts.map | 1 + .../vanilla-colorful/lib/styles/hue.js | 2 + .../vanilla-colorful/lib/styles/hue.js.map | 1 + .../lib/styles/saturation.d.ts | 3 + .../lib/styles/saturation.d.ts.map | 1 + .../vanilla-colorful/lib/styles/saturation.js | 2 + .../lib/styles/saturation.js.map | 1 + node_modules/vanilla-colorful/lib/types.d.ts | 46 + .../vanilla-colorful/lib/types.d.ts.map | 1 + node_modules/vanilla-colorful/lib/types.js | 2 + .../vanilla-colorful/lib/types.js.map | 1 + .../vanilla-colorful/lib/utils/compare.d.ts | 5 + .../lib/utils/compare.d.ts.map | 1 + .../vanilla-colorful/lib/utils/compare.js | 26 + .../vanilla-colorful/lib/utils/compare.js.map | 1 + .../vanilla-colorful/lib/utils/convert.d.ts | 27 + .../lib/utils/convert.d.ts.map | 1 + .../vanilla-colorful/lib/utils/convert.js | 165 + .../vanilla-colorful/lib/utils/convert.js.map | 1 + .../vanilla-colorful/lib/utils/dom.d.ts | 3 + .../vanilla-colorful/lib/utils/dom.d.ts.map | 1 + .../vanilla-colorful/lib/utils/dom.js | 17 + .../vanilla-colorful/lib/utils/dom.js.map | 1 + .../vanilla-colorful/lib/utils/math.d.ts | 3 + .../vanilla-colorful/lib/utils/math.d.ts.map | 1 + .../vanilla-colorful/lib/utils/math.js | 10 + .../vanilla-colorful/lib/utils/math.js.map | 1 + .../vanilla-colorful/lib/utils/validate.d.ts | 2 + .../lib/utils/validate.d.ts.map | 1 + .../vanilla-colorful/lib/utils/validate.js | 11 + .../lib/utils/validate.js.map | 1 + node_modules/vanilla-colorful/package.json | 215 + .../vanilla-colorful/rgb-color-picker.d.ts | 24 + .../rgb-color-picker.d.ts.map | 1 + .../vanilla-colorful/rgb-color-picker.js | 19 + .../vanilla-colorful/rgb-color-picker.js.map | 1 + .../rgb-string-color-picker.d.ts | 24 + .../rgb-string-color-picker.d.ts.map | 1 + .../rgb-string-color-picker.js | 20 + .../rgb-string-color-picker.js.map | 1 + .../vanilla-colorful/rgba-color-picker.d.ts | 26 + .../rgba-color-picker.d.ts.map | 1 + .../vanilla-colorful/rgba-color-picker.js | 21 + .../vanilla-colorful/rgba-color-picker.js.map | 1 + .../rgba-string-color-picker.d.ts | 26 + .../rgba-string-color-picker.d.ts.map | 1 + .../rgba-string-color-picker.js | 22 + .../rgba-string-color-picker.js.map | 1 + node_modules/vanilla-colorful/web-types.json | 498 + .../vanilla-colorful/web-types.lit.json | 349 + node_modules/vary/HISTORY.md | 39 + node_modules/vary/LICENSE | 22 + node_modules/vary/README.md | 101 + node_modules/vary/index.js | 149 + node_modules/vary/package.json | 43 + onepage-index-1.html | 869 -- onepage-index-2.html | 921 -- onepage-index-3.html | 982 -- package-lock.json | 1069 +++ package.json | 19 + project-details.html | 392 - project.html | 463 - 404.html => public/404.html | 0 about.html => public/about.html | 0 {assets => public/assets}/css/default.css | 0 {assets => public/assets}/css/responsive.css | 0 {assets => public/assets}/css/style.css | 0 .../assets}/fonts/flaticon/flaticon.css | 0 .../assets}/fonts/flaticon/flaticon.eot | Bin .../assets}/fonts/flaticon/flaticon.html | 0 .../assets}/fonts/flaticon/flaticon.scss | 0 .../assets}/fonts/flaticon/flaticon.svg | 0 .../assets}/fonts/flaticon/flaticon.ttf | Bin .../assets}/fonts/flaticon/flaticon.woff | Bin .../assets}/fonts/flaticon/flaticon.woff2 | Bin .../assets}/fonts/fontawesome/css/all.min.css | 0 .../fontawesome/webfonts/fa-brands-400.eot | Bin .../fontawesome/webfonts/fa-brands-400.ttf | Bin .../fontawesome/webfonts/fa-brands-400.woff | Bin .../fontawesome/webfonts/fa-brands-400.woff2 | Bin .../fontawesome/webfonts/fa-light-300.eot | Bin .../fontawesome/webfonts/fa-light-300.ttf | Bin .../fontawesome/webfonts/fa-light-300.woff | Bin .../fontawesome/webfonts/fa-light-300.woff2 | Bin .../fontawesome/webfonts/fa-regular-400.eot | Bin .../fontawesome/webfonts/fa-regular-400.ttf | Bin .../fontawesome/webfonts/fa-regular-400.woff | Bin .../fontawesome/webfonts/fa-regular-400.woff2 | Bin .../fontawesome/webfonts/fa-solid-900.eot | Bin .../fontawesome/webfonts/fa-solid-900.ttf | Bin .../fontawesome/webfonts/fa-solid-900.woff | Bin .../fontawesome/webfonts/fa-solid-900.woff2 | Bin .../assets}/images/about/2 persons.png | Bin .../assets}/images/about/3 persons.png | Bin .../assets}/images/about/about-1.jpg | Bin .../assets}/images/about/about-2.png | Bin .../assets}/images/about/about-3.jpg | Bin .../assets}/images/about/about-4.png | Bin .../assets}/images/about/growth.png | Bin .../assets}/images/about/hands.png | Bin .../assets}/images/about/illustration 4.png | Bin .../assets}/images/about/img-4.jpg | Bin .../assets}/images/about/img-5.png | Bin .../assets}/images/about/img-6.png | Bin {assets => public/assets}/images/agri.png | Bin {assets => public/assets}/images/bar.png | Bin .../assets}/images/blog/author-1.jpg | Bin .../assets}/images/blog/blog-bg-1.jpg | Bin .../assets}/images/blog/blog-single-1.jpg | Bin .../assets}/images/blog/blog-single-2.jpg | Bin .../assets}/images/blog/comment-1.jpg | Bin .../assets}/images/blog/comment-2.jpg | Bin .../assets}/images/blog/comment-3.jpg | Bin .../assets}/images/blog/img-1.jpg | Bin .../assets}/images/blog/img-2.jpg | Bin .../assets}/images/blog/img-3.jpg | Bin .../assets}/images/blog/standard-1.jpg | Bin .../assets}/images/blog/standard-2.jpg | Bin .../assets}/images/blog/standard-3.jpg | Bin .../assets}/images/blog/standard-4.jpg | Bin {assets => public/assets}/images/border-1.png | Bin {assets => public/assets}/images/border-2.png | Bin .../images/breadcrumb/3 personssss.png | Bin .../assets}/images/breadcrumb/img-1.jpg | Bin .../assets}/images/breadcrumb/img-2.jpg | Bin .../assets}/images/breadcrumb/img-3.jpg | Bin .../assets}/images/breadcrumb/laptopppp.png | Bin .../assets}/images/contact/conatct man.png | Bin .../assets}/images/contact/contact-1.jpg | Bin .../assets}/images/cta/3......png | Bin .../assets}/images/cta/img-1.jpg | Bin .../assets}/images/cta/img-2.png | Bin {assets => public/assets}/images/dot.png | Bin {assets => public/assets}/images/favicon.ico | Bin .../images/footer/footer-page-bg-1.png | Bin .../images/footer/footer-page-bg-2.png | Bin .../assets}/images/hero/dot-pattern.png | Bin .../images/hero/hereeeeeeeeeeeeeeeeeeeee.png | Bin .../assets}/images/hero/hero-.jpeg | Bin .../assets}/images/hero/hero-one-img-1.jpg | Bin .../assets}/images/hero/hero-one-img-2.jpg | Bin .../assets}/images/hero/hero-one-img.jpg | Bin .../assets}/images/hero/hero-pattern.png | Bin .../images/hero/hero-three-img-1-1.png | Bin .../assets}/images/hero/hero-two-img-1.png | Bin .../assets}/images/hero/hero-two-shape-1.png | Bin .../assets}/images/hero/hero-two-shape-2.png | Bin .../assets}/images/hero/hero-two-shape-3.png | Bin .../assets}/images/hero/shape-1.png | Bin .../assets}/images/hero/shape-2.png | Bin .../assets}/images/icon/icon-1.png | Bin .../assets}/images/icon/icon-10.png | Bin .../assets}/images/icon/icon-11.png | Bin .../assets}/images/icon/icon-12.png | Bin .../assets}/images/icon/icon-13.png | Bin .../assets}/images/icon/icon-14.png | Bin .../assets}/images/icon/icon-15.png | Bin .../assets}/images/icon/icon-16.png | Bin .../assets}/images/icon/icon-17.png | Bin .../assets}/images/icon/icon-18.png | Bin .../assets}/images/icon/icon-19.png | Bin .../assets}/images/icon/icon-2.png | Bin .../assets}/images/icon/icon-20.png | Bin .../assets}/images/icon/icon-21.png | Bin .../assets}/images/icon/icon-22.png | Bin .../assets}/images/icon/icon-3.png | Bin .../assets}/images/icon/icon-4.png | Bin .../assets}/images/icon/icon-5.png | Bin .../assets}/images/icon/icon-6.png | Bin .../assets}/images/icon/icon-7.png | Bin .../assets}/images/icon/icon-8.png | Bin .../assets}/images/icon/icon-9.png | Bin {assets => public/assets}/images/line.png | Bin .../images/logo/Heading-removebg-preview.png | Bin .../logo/Untitled_design-removebg-preview.png | Bin .../assets}/images/logo/footer-logo-1.png | Bin .../assets}/images/logo/footer-logo-2.png | Bin .../assets}/images/logo/logo-1.png | Bin {assets => public/assets}/images/map.png | Bin .../assets}/images/partners/img-1.png | Bin .../assets}/images/partners/img-10.png | Bin .../assets}/images/partners/img-11.png | Bin .../assets}/images/partners/img-12.png | Bin .../assets}/images/partners/img-13.png | Bin .../assets}/images/partners/img-14.png | Bin .../assets}/images/partners/img-15.png | Bin .../assets}/images/partners/img-16.png | Bin .../assets}/images/partners/img-2.png | Bin .../assets}/images/partners/img-3.png | Bin .../assets}/images/partners/img-4.png | Bin .../assets}/images/partners/img-5.png | Bin .../assets}/images/partners/img-6.png | Bin .../assets}/images/partners/img-7.png | Bin .../assets}/images/partners/img-8.png | Bin .../assets}/images/partners/img-9.png | Bin .../assets}/images/portfolio/agri.png | Bin .../assets}/images/portfolio/atoz.png | Bin .../assets}/images/portfolio/humbee.png | Bin .../assets}/images/portfolio/icon-1.png | Bin .../assets}/images/portfolio/img-1.jpg | Bin .../assets}/images/portfolio/img-10.jpg | Bin .../assets}/images/portfolio/img-11.jpg | Bin .../assets}/images/portfolio/img-12.jpg | Bin .../assets}/images/portfolio/img-13.jpg | Bin .../assets}/images/portfolio/img-14.jpg | Bin .../assets}/images/portfolio/img-15.jpg | Bin .../assets}/images/portfolio/img-16.jpg | Bin .../assets}/images/portfolio/img-17.jpg | Bin .../assets}/images/portfolio/img-18.jpg | Bin .../assets}/images/portfolio/img-19.jpg | Bin .../assets}/images/portfolio/img-2.jpg | Bin .../assets}/images/portfolio/img-20.jpg | Bin .../assets}/images/portfolio/img-3.jpg | Bin .../assets}/images/portfolio/img-4.jpg | Bin .../assets}/images/portfolio/img-5.jpg | Bin .../assets}/images/portfolio/img-6.jpg | Bin .../assets}/images/portfolio/img-7.jpg | Bin .../assets}/images/portfolio/img-8.jpg | Bin .../assets}/images/portfolio/img-9.jpg | Bin .../assets}/images/portfolio/luxiee.png | Bin .../assets}/images/portfolio/panind.png | Bin .../assets}/images/portfolio/single-img-1.jpg | Bin .../assets}/images/portfolio/thumb-1.jpg | Bin .../assets}/images/portfolio/thumb-2.jpg | Bin .../assets}/images/portfolio/videostar.png | Bin .../assets}/images/shape/bg-shape-1.png | Bin .../assets}/images/shape/bg-shape-2.png | Bin .../assets}/images/shape/circle-logo-1.png | Bin .../assets}/images/shape/circle-logo-2.png | Bin .../assets}/images/shape/line-2.png | Bin .../assets}/images/shape/line-3.png | Bin .../assets}/images/shape/line.png | Bin .../assets}/images/shape/pattern-shape-1.png | Bin .../assets}/images/shape/pattern-shape-2.png | Bin .../assets}/images/shape/shape-1.png | Bin .../assets}/images/shape/shape-10.png | Bin .../assets}/images/shape/shape-11.png | Bin .../assets}/images/shape/shape-12.png | Bin .../assets}/images/shape/shape-13.png | Bin .../assets}/images/shape/shape-14.png | Bin .../assets}/images/shape/shape-15.png | Bin .../assets}/images/shape/shape-16.png | Bin .../assets}/images/shape/shape-17.png | Bin .../assets}/images/shape/shape-18.png | Bin .../assets}/images/shape/shape-19.png | Bin .../assets}/images/shape/shape-2.png | Bin .../assets}/images/shape/shape-20.png | Bin .../assets}/images/shape/shape-3.png | Bin .../assets}/images/shape/shape-4.png | Bin .../assets}/images/shape/shape-5.png | Bin .../assets}/images/shape/shape-6.png | Bin .../assets}/images/shape/shape-7.png | Bin .../assets}/images/shape/shape-8.png | Bin .../assets}/images/shape/shape-9.png | Bin .../assets}/images/skill/img-1.jpg | Bin .../assets}/images/skill/img-2.jpg | Bin .../assets}/images/team/img-1.jpg | Bin .../assets}/images/team/img-10.jpg | Bin .../assets}/images/team/img-11.jpg | Bin .../assets}/images/team/img-2.jpg | Bin .../assets}/images/team/img-3.jpg | Bin .../assets}/images/team/img-4.jpg | Bin .../assets}/images/team/img-5.jpg | Bin .../assets}/images/team/img-6.jpg | Bin .../assets}/images/team/img-7.jpg | Bin .../assets}/images/team/img-8.jpg | Bin .../assets}/images/team/img-9.jpg | Bin .../assets}/images/team/single-img-1.jpg | Bin .../assets}/images/team/team-img.png | Bin .../assets}/images/testimonial/happy girl.png | Bin .../assets}/images/testimonial/img-1.jpg | Bin .../assets}/images/testimonial/img-2.jpg | Bin .../assets}/images/testimonial/img-3.jpg | Bin .../assets}/images/testimonial/img-4.png | Bin .../assets}/images/testimonial/thumb-1.jpg | Bin .../assets}/images/testimonial/thumb-2.jpg | Bin .../images/testimonial/working mann.png | Bin .../assets}/images/video/img-1.jpg | Bin .../assets}/images/widget/contact-1.jpg | Bin .../assets}/images/widget/contact-2.png | Bin .../assets}/images/widget/news-1.jpg | Bin .../assets}/images/widget/news-2.jpg | Bin .../assets}/images/widget/news-3.jpg | Bin {assets => public/assets}/js/theme.js | 0 {assets => public/assets}/vendor/animate.css | 0 .../vendor/bootstrap/css/bootstrap.min.css | 0 .../vendor/bootstrap/js/bootstrap.min.js | 0 .../assets}/vendor/imagesloaded.min.js | 0 .../assets}/vendor/isotope.min.js | 0 .../assets}/vendor/jquery-3.6.0.min.js | 0 .../assets}/vendor/jquery.counterup.min.js | 0 .../assets}/vendor/jquery.waypoints.js | 0 .../dist/jquery.magnific-popup.min.js | 0 .../magnific-popup/dist/magnific-popup.css | 0 .../vendor/nice-select/css/nice-select.css | 0 .../nice-select/js/jquery.nice-select.min.js | 0 .../assets}/vendor/parallax.min.js | 0 .../assets}/vendor/popper/popper.min.js | 0 .../assets}/vendor/slick/slick.css | 0 .../assets}/vendor/slick/slick.min.js | 0 {assets => public/assets}/vendor/wow.min.js | 0 blog-details.html => public/blog-details.html | 0 blogs.html => public/blogs.html | 0 contact.html => public/contact.html | 0 {css => public/css}/bootstrap.min.css | 0 {css => public/css}/style.css | 0 {img => public/img}/Agri Fiance.png | Bin {img => public/img}/AtoZ (2).png | Bin {img => public/img}/Atoz.png | Bin {img => public/img}/Atoz1.png | Bin {img => public/img}/PAN.png | Bin {img => public/img}/Videostar.png | Bin {img => public/img}/WEBBB (1) (1).png | Bin .../img}/about-us illustration.jpeg | Bin {img => public/img}/about.png | Bin {img => public/img}/bg-bottom.png | Bin {img => public/img}/bg-top.png | Bin {img => public/img}/blob-bottom-left.png | Bin {img => public/img}/blob-bottom-right.png | Bin {img => public/img}/blob-center.png | Bin {img => public/img}/blob-primary.png | Bin {img => public/img}/blob-secondary.png | Bin {img => public/img}/blob-top-left.png | Bin {img => public/img}/blob-top-right.png | Bin {img => public/img}/blob-white.png | Bin {img => public/img}/card1.png | Bin {img => public/img}/hero.png | Bin {img => public/img}/logo-for.jpeg | Bin {img => public/img}/logoNS.png | Bin {img => public/img}/map.png | Bin {img => public/img}/portfolio-1.jpg | Bin {img => public/img}/portfolio-2.jpg | Bin {img => public/img}/portfolio-3.jpg | Bin {img => public/img}/portfolio-4.jpg | Bin {img => public/img}/portfolio-5.jpg | Bin {img => public/img}/portfolio-6.jpg | Bin {img => public/img}/sand.png | Bin {img => public/img}/service-1.png | Bin {img => public/img}/service-2.png | Bin {img => public/img}/service-3.png | Bin {img => public/img}/service-4.png | Bin {img => public/img}/team-1.jpg | Bin {img => public/img}/team-2.jpg | Bin {img => public/img}/team-3.jpg | Bin {img => public/img}/testimonial-1.jpg | Bin {img => public/img}/testimonial-2.jpg | Bin {img => public/img}/testimonial-3.jpg | Bin {img => public/img}/testimonial-4.jpg | Bin {img => public/img}/user.png | Bin .../img}/webGenixIcon-removebg-preview.ico | Bin .../img}/webGenixLogo-removebg-preview.ico | Bin index.html => public/index.html | 0 {js => public/js}/main.js | 0 {lib => public/lib}/animate/animate.css | 0 {lib => public/lib}/animate/animate.min.css | 0 .../lib}/counterup/counterup.min.js | 0 {lib => public/lib}/easing/easing.js | 0 {lib => public/lib}/easing/easing.min.js | 0 {lib => public/lib}/isotope/isotope.pkgd.js | 0 .../lib}/isotope/isotope.pkgd.min.js | 0 {lib => public/lib}/lightbox/css/lightbox.css | 0 .../lib}/lightbox/css/lightbox.min.css | 0 {lib => public/lib}/lightbox/images/close.png | Bin .../lib}/lightbox/images/loading.gif | Bin {lib => public/lib}/lightbox/images/next.png | Bin {lib => public/lib}/lightbox/images/prev.png | Bin {lib => public/lib}/lightbox/js/lightbox.js | 0 .../lib}/lightbox/js/lightbox.min.js | 0 {lib => public/lib}/lightbox/links.php | 0 {lib => public/lib}/owlcarousel/LICENSE | 0 .../lib}/owlcarousel/assets/ajax-loader.gif | Bin .../lib}/owlcarousel/assets/owl.carousel.css | 0 .../owlcarousel/assets/owl.carousel.min.css | 0 .../owlcarousel/assets/owl.theme.default.css | 0 .../assets/owl.theme.default.min.css | 0 .../owlcarousel/assets/owl.theme.green.css | 0 .../assets/owl.theme.green.min.css | 0 .../owlcarousel/assets/owl.video.play.png | Bin .../lib}/owlcarousel/owl.carousel.js | 0 .../lib}/owlcarousel/owl.carousel.min.js | 0 {lib => public/lib}/waypoints/links.php | 0 .../lib}/waypoints/waypoints.min.js | 0 {lib => public/lib}/wow/wow.js | 0 {lib => public/lib}/wow/wow.min.js | 0 projects.html => public/projects.html | 0 {scss => public/scss}/bootstrap.scss | 0 .../scss}/bootstrap/scss/_accordion.scss | 0 .../scss}/bootstrap/scss/_alert.scss | 0 .../scss}/bootstrap/scss/_badge.scss | 0 .../scss}/bootstrap/scss/_breadcrumb.scss | 0 .../scss}/bootstrap/scss/_button-group.scss | 0 .../scss}/bootstrap/scss/_buttons.scss | 0 .../scss}/bootstrap/scss/_card.scss | 0 .../scss}/bootstrap/scss/_carousel.scss | 0 .../scss}/bootstrap/scss/_close.scss | 0 .../scss}/bootstrap/scss/_containers.scss | 0 .../scss}/bootstrap/scss/_dropdown.scss | 0 .../scss}/bootstrap/scss/_forms.scss | 0 .../scss}/bootstrap/scss/_functions.scss | 0 .../scss}/bootstrap/scss/_grid.scss | 0 .../scss}/bootstrap/scss/_helpers.scss | 0 .../scss}/bootstrap/scss/_images.scss | 0 .../scss}/bootstrap/scss/_list-group.scss | 0 .../scss}/bootstrap/scss/_mixins.scss | 0 .../scss}/bootstrap/scss/_modal.scss | 0 .../scss}/bootstrap/scss/_nav.scss | 0 .../scss}/bootstrap/scss/_navbar.scss | 0 .../scss}/bootstrap/scss/_offcanvas.scss | 0 .../scss}/bootstrap/scss/_pagination.scss | 0 .../scss}/bootstrap/scss/_popover.scss | 0 .../scss}/bootstrap/scss/_progress.scss | 0 .../scss}/bootstrap/scss/_reboot.scss | 0 .../scss}/bootstrap/scss/_root.scss | 0 .../scss}/bootstrap/scss/_spinners.scss | 0 .../scss}/bootstrap/scss/_tables.scss | 0 .../scss}/bootstrap/scss/_toasts.scss | 0 .../scss}/bootstrap/scss/_tooltip.scss | 0 .../scss}/bootstrap/scss/_transitions.scss | 0 .../scss}/bootstrap/scss/_type.scss | 0 .../scss}/bootstrap/scss/_utilities.scss | 0 .../scss}/bootstrap/scss/_variables.scss | 0 .../scss}/bootstrap/scss/bootstrap-grid.scss | 0 .../bootstrap/scss/bootstrap-reboot.scss | 0 .../bootstrap/scss/bootstrap-utilities.scss | 0 .../scss}/bootstrap/scss/bootstrap.scss | 0 .../scss/forms/_floating-labels.scss | 0 .../bootstrap/scss/forms/_form-check.scss | 0 .../bootstrap/scss/forms/_form-control.scss | 0 .../bootstrap/scss/forms/_form-range.scss | 0 .../bootstrap/scss/forms/_form-select.scss | 0 .../bootstrap/scss/forms/_form-text.scss | 0 .../bootstrap/scss/forms/_input-group.scss | 0 .../scss}/bootstrap/scss/forms/_labels.scss | 0 .../bootstrap/scss/forms/_validation.scss | 0 .../bootstrap/scss/helpers/_clearfix.scss | 0 .../scss/helpers/_colored-links.scss | 0 .../bootstrap/scss/helpers/_position.scss | 0 .../scss}/bootstrap/scss/helpers/_ratio.scss | 0 .../scss/helpers/_stretched-link.scss | 0 .../scss/helpers/_text-truncation.scss | 0 .../scss/helpers/_visually-hidden.scss | 0 .../scss}/bootstrap/scss/mixins/_alert.scss | 0 .../bootstrap/scss/mixins/_border-radius.scss | 0 .../bootstrap/scss/mixins/_box-shadow.scss | 0 .../bootstrap/scss/mixins/_breakpoints.scss | 0 .../scss}/bootstrap/scss/mixins/_buttons.scss | 0 .../scss}/bootstrap/scss/mixins/_caret.scss | 0 .../bootstrap/scss/mixins/_clearfix.scss | 0 .../bootstrap/scss/mixins/_color-scheme.scss | 0 .../bootstrap/scss/mixins/_container.scss | 0 .../bootstrap/scss/mixins/_deprecate.scss | 0 .../scss}/bootstrap/scss/mixins/_forms.scss | 0 .../bootstrap/scss/mixins/_gradients.scss | 0 .../scss}/bootstrap/scss/mixins/_grid.scss | 0 .../scss}/bootstrap/scss/mixins/_image.scss | 0 .../bootstrap/scss/mixins/_list-group.scss | 0 .../scss}/bootstrap/scss/mixins/_lists.scss | 0 .../bootstrap/scss/mixins/_pagination.scss | 0 .../bootstrap/scss/mixins/_reset-text.scss | 0 .../scss}/bootstrap/scss/mixins/_resize.scss | 0 .../scss/mixins/_table-variants.scss | 0 .../bootstrap/scss/mixins/_text-truncate.scss | 0 .../bootstrap/scss/mixins/_transition.scss | 0 .../bootstrap/scss/mixins/_utilities.scss | 0 .../scss/mixins/_visually-hidden.scss | 0 .../scss}/bootstrap/scss/utilities/_api.scss | 0 .../scss}/bootstrap/scss/vendor/_rfs.scss | 0 .../service-details.html | 0 service.html => public/service.html | 0 team.html => public/team.html | 0 services.html | 633 -- team-details.html | 393 - testimonial.html | 248 - 5636 files changed, 387575 insertions(+), 6898 deletions(-) create mode 100644 app.js delete mode 100644 digital-agency-html-template.jpg delete mode 100644 index-2.html delete mode 100644 index-3.html create mode 120000 node_modules/.bin/mime create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/autoformat.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/af.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hy.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/si.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hy.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/code.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/code.css create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg create mode 100644 node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/block-quote.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/af.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bs.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gu.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sl.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/af.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js.map create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/af.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ast.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/bs.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/eo.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/gu.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/hy.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/jv.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/oc.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/si.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/sl.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/tt.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-build-classic/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/ckbox.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckbox.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckbox.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/ckboximageeditcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/ckboximageeditcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/ckboximageeditediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/ckboximageeditediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/ckboximageeditui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/ckboximageeditui.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboximageedit/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxui.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxuploadadapter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxuploadadapter.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/ckboxutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/theme/ckboximageedit.css create mode 100644 node_modules/@ckeditor/ckeditor5-ckbox/theme/icons/ckbox-image-edit.svg create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/ckfinder.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/af.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/bs.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/jv.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/sl.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/af.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinder.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinder.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfindercommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfindercommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinderconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinderconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinderediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinderediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinderui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/ckfinderui.js create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ckfinder/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboard.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardmarkersutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardmarkersutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/clipboardpipeline.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/dragdrop.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/dragdropblocktoolbar.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/dragdropblocktoolbar.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/dragdroptarget.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/dragdroptarget.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/lineview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/lineview.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/pasteplaintext.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/utils/normalizeclipboarddata.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/utils/plaintexttohtml.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/src/utils/viewtoplaintext.js create mode 100644 node_modules/@ckeditor/ckeditor5-clipboard/theme/clipboard.css create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/build/cloud-services.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservices.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservices.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservicesconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservicesconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservicescore.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/cloudservicescore.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/token/token.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/token/token.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/uploadgateway/fileuploader.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/uploadgateway/fileuploader.js create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/uploadgateway/uploadgateway.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-cloud-services/src/uploadgateway/uploadgateway.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-core/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-core/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/af.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/gu.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/hy.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/oc.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/si.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-core/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/accessibility.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/accessibility.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/command.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/command.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/commandcollection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/commandcollection.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/context.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/context.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/contextplugin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/contextplugin.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editingkeystrokehandler.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/editor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/editor.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/editorconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/editorconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/attachtoform.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/attachtoform.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/dataapimixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/dataapimixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/elementapimixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/elementapimixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/securesourceelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/editor/utils/securesourceelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/multicommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/multicommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/pendingactions.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/pendingactions.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/plugin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/plugin.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/plugincollection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/plugincollection.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/typings.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-core/src/typings.js create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-bottom.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-center.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-justify.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-left.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-middle.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-right.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/align-top.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/bold.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/browse-files.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/bulletedlist.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/cancel.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/caption.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/check.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/codeblock.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/cog.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/color-palette.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/drag-indicator.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/eraser.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/heading1.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/heading2.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/heading3.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/heading4.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/heading5.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/heading6.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/history.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/horizontalline.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/html.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/image-asset-manager.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/image-upload.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/image-url.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/image.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/importexport.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/indent.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/loupe.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/low-vision.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/next-arrow.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/numberedlist.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-center.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-full-width.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-inline-left.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-inline-right.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-inline.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-left.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-right.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-full.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-large.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-medium.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/object-size-small.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/outdent.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/paragraph.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/pencil.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/pilcrow.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/plus.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/previous-arrow.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/quote.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/redo.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/table.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/text-alternative.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/text.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/three-vertical-dots.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/todolist.svg create mode 100644 node_modules/@ckeditor/ckeditor5-core/theme/icons/undo.svg create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/build/easy-image.js create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/cloudservicesuploadadapter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/cloudservicesuploadadapter.js create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/easyimage.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/easyimage.js create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-easy-image/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/build/editor-classic.js create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditor.js create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditorui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditorui.js create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditoruiview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/classiceditoruiview.js create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-editor-classic/theme/classiceditor.css create mode 100644 node_modules/@ckeditor/ckeditor5-engine/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-engine/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-engine/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-engine/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/controller/datacontroller.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/controller/datacontroller.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/controller/editingcontroller.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/controller/editingcontroller.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/conversion.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/conversion.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/conversionhelpers.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/conversionhelpers.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/downcastdispatcher.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/downcastdispatcher.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/downcasthelpers.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/downcasthelpers.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/mapper.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/mapper.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/modelconsumable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/modelconsumable.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/upcastdispatcher.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/upcastdispatcher.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/upcasthelpers.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/upcasthelpers.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/viewconsumable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/conversion/viewconsumable.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/basichtmlwriter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/basichtmlwriter.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/dataprocessor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/dataprocessor.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/htmldataprocessor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/htmldataprocessor.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/htmlwriter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/htmlwriter.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/xmldataprocessor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dataprocessor/xmldataprocessor.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/model.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/model.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/operationreplayer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/operationreplayer.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/view.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/dev-utils/view.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/batch.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/batch.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/differ.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/differ.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/document.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/document.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/documentfragment.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/documentfragment.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/documentselection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/documentselection.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/element.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/element.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/history.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/history.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/item.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/item.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/liveposition.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/liveposition.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/liverange.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/liverange.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/markercollection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/markercollection.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/model.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/model.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/node.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/node.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/nodelist.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/nodelist.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/attributeoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/attributeoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/detachoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/detachoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/insertoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/insertoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/markeroperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/markeroperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/mergeoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/mergeoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/moveoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/moveoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/nooperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/nooperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/operation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/operation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/operationfactory.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/operationfactory.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/renameoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/renameoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/rootattributeoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/rootattributeoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/rootoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/rootoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/splitoperation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/splitoperation.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/transform.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/transform.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/operation/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/position.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/position.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/range.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/range.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/rootelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/rootelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/schema.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/schema.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/selection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/selection.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/text.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/text.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/textproxy.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/textproxy.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/treewalker.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/treewalker.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/typecheckable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/typecheckable.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/autoparagraphing.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/autoparagraphing.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/deletecontent.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/deletecontent.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/getselectedcontent.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/getselectedcontent.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/insertcontent.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/insertcontent.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/insertobject.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/insertobject.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/modifyselection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/modifyselection.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/selection-post-fixer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/utils/selection-post-fixer.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/writer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/model/writer.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/attributeelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/attributeelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/containerelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/containerelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/datatransfer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/datatransfer.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/document.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/document.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/documentfragment.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/documentfragment.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/documentselection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/documentselection.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/domconverter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/domconverter.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/downcastwriter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/downcastwriter.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/editableelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/editableelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/element.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/element.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/elementdefinition.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/elementdefinition.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/emptyelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/emptyelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/filler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/filler.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/item.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/item.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/matcher.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/matcher.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/node.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/node.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/arrowkeysobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/arrowkeysobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/bubblingemittermixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/bubblingemittermixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/bubblingeventinfo.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/bubblingeventinfo.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/clickobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/clickobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/compositionobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/compositionobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/domeventdata.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/domeventdata.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/domeventobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/domeventobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/fakeselectionobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/fakeselectionobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/focusobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/focusobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/inputobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/inputobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/keyobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/keyobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/mouseobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/mouseobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/mutationobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/mutationobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/observer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/observer.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/selectionobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/selectionobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/tabobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/observer/tabobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/placeholder.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/placeholder.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/position.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/position.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/range.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/range.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/rawelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/rawelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/renderer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/renderer.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/rooteditableelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/rooteditableelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/selection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/selection.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/background.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/background.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/border.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/border.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/margin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/margin.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/padding.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/padding.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/styles/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/stylesmap.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/stylesmap.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/text.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/text.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/textproxy.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/textproxy.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/treewalker.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/treewalker.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/typecheckable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/typecheckable.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/uielement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/uielement.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/upcastwriter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/upcastwriter.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/view.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-engine/src/view/view.js create mode 100644 node_modules/@ckeditor/ckeditor5-engine/theme/placeholder.css create mode 100644 node_modules/@ckeditor/ckeditor5-engine/theme/renderer.css create mode 100644 node_modules/@ckeditor/ckeditor5-enter/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-enter/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-enter/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-enter/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/enter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/enter.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/entercommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/entercommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/enterobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/enterobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/shiftenter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/shiftenter.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/shiftentercommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/shiftentercommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-enter/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/build/essentials.js create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/src/essentials.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/src/essentials.js create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-essentials/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-heading/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-heading/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/heading.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/bs.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/eo.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/hy.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/jv.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/sl.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/hy.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-heading/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/heading.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/heading.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingbuttonsui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingbuttonsui.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/headingui.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/title.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/title.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-heading/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-heading/theme/heading.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-image/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-image/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/image.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ast.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/bs.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/eo.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/es-co.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/jv.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/si.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/tt.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/si.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-image/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/autoimage.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/autoimage.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/converters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/converters.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageblockediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageblockediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageinlineediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageinlineediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageloadobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageloadobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageplaceholder.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imageplaceholder.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imagetypecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/imagetypecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/insertimagecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/insertimagecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/replaceimagesourcecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/replaceimagesourcecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/ui/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/ui/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/image/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageblock.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageblock.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionui.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/imagecaptionutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/toggleimagecaptioncommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagecaption/toggleimagecaptioncommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinline.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinline.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/imageinsertui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/imageinsertui.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/imageinsertviaurlui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/imageinsertviaurlui.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/ui/imageinsertformview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/ui/imageinsertformview.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/ui/imageinserturlview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsert/ui/imageinserturlview.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsertviaurl.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageinsertviaurl.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizebuttons.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizebuttons.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizeediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizeediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizehandles.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/imageresizehandles.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/resizeimagecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageresize/resizeimagecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagesizeattributes.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagesizeattributes.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/converters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/converters.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestylecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestylecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestyleediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestyleediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestyleui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/imagestyleui.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagestyle/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativeediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativeediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativeui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/imagetextalternativeui.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/ui/textalternativeformview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetextalternative/ui/textalternativeformview.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetoolbar.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imagetoolbar.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadprogress.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadprogress.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/imageuploadui.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/uploadimagecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/uploadimagecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageupload/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/imageutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/pictureediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-image/src/pictureediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/image.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imagecaption.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imageinsert.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imageplaceholder.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imageresize.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imagestyle.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imageuploadicon.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imageuploadloader.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/imageuploadprogress.css create mode 100644 node_modules/@ckeditor/ckeditor5-image/theme/textalternativeform.css create mode 100644 node_modules/@ckeditor/ckeditor5-indent/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-indent/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-indent/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/indent.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-indent/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indent.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indent.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentblock.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentblock.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentblockcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentblockcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentbehavior.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentbehavior.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentusingclasses.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentusingclasses.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentusingoffset.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentcommandbehavior/indentusingoffset.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/indentui.js create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-indent/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-link/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-link/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/link.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ast.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/eo.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/hy.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/tt.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/hy.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-link/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/autolink.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/autolink.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/link.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/link.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkimage.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkimage.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkimageediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkimageediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkimageui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkimageui.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/linkui.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/ui/linkactionsview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/ui/linkactionsview.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/ui/linkformview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/ui/linkformview.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/unlinkcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/unlinkcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/utils/automaticdecorators.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/utils/automaticdecorators.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/utils/manualdecorator.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-link/src/utils/manualdecorator.js create mode 100644 node_modules/@ckeditor/ckeditor5-link/theme/icons/link.svg create mode 100644 node_modules/@ckeditor/ckeditor5-link/theme/icons/unlink.svg create mode 100644 node_modules/@ckeditor/ckeditor5-link/theme/link.css create mode 100644 node_modules/@ckeditor/ckeditor5-link/theme/linkactions.css create mode 100644 node_modules/@ckeditor/ckeditor5-link/theme/linkform.css create mode 100644 node_modules/@ckeditor/ckeditor5-link/theme/linkimage.css create mode 100644 node_modules/@ckeditor/ckeditor5-list/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-list/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-list/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/list.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ast.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/eo.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/eu.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/jv.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/km.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/kn.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/si.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/tt.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/si.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-list/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/documentlist.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/documentlist.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/documentlistproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/documentlistproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacyconverters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacyconverters.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacyindentcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacyindentcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacylistcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacylistcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacylistediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacylistediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacylistutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacylistutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacyutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylist/legacyutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacylistpropertiesediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacylistpropertiesediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacylistreversedcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacylistreversedcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacyliststartcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacyliststartcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacyliststylecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacylistproperties/legacyliststylecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist/legacychecktodolistcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist/legacychecktodolistcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist/legacytodolistconverters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist/legacytodolistconverters.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist/legacytodolistediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/legacytodolist/legacytodolistediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/adjacentlistssupport.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/adjacentlistssupport.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/converters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/converters.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listindentcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listindentcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listmergecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listmergecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listsplitcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listsplitcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listui.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/listutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/listwalker.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/listwalker.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/model.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/model.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/postfixers.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/postfixers.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/view.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/list/utils/view.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/converters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/converters.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesui.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listpropertiesutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listreversedcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/listreversedcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/liststartcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/liststartcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/liststylecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/liststylecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/ui/listpropertiesview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/ui/listpropertiesview.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/utils/style.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/listproperties/utils/style.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/tododocumentlist.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/tododocumentlist.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/checktodolistcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/checktodolistcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/todocheckboxchangeobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/todocheckboxchangeobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/todolistediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/todolistediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/todolistui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-list/src/todolist/todolistui.js create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/documentlist.css create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylecircle.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyledecimal.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyledecimalleadingzero.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyledisc.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylelowerlatin.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylelowerroman.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststylesquare.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyleupperlatin.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/icons/liststyleupperroman.svg create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/list.css create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/listproperties.css create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/liststyles.css create mode 100644 node_modules/@ckeditor/ckeditor5-list/theme/todolist.css create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/media-embed.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/automediaembed.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/automediaembed.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/converters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/converters.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembed.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembed.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedtoolbar.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedtoolbar.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaembedui.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaregistry.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/mediaregistry.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/ui/mediaformview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/ui/mediaformview.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/theme/icons/media-placeholder.svg create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/theme/icons/media.svg create mode 100755 node_modules/@ckeditor/ckeditor5-media-embed/theme/icons/media/twitter.svg create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css create mode 100644 node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.js create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/br.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/br.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/image.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/image.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/list.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/list.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/parse.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/parse.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removeboldwrapper.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removeboldwrapper.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removegooglesheetstag.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removegooglesheetstag.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removeinvalidtablewidth.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removeinvalidtablewidth.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removemsattributes.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removemsattributes.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removestyleblock.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removestyleblock.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removexmlns.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/removexmlns.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/space.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/space.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/filters/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizer.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/googledocsnormalizer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/googledocsnormalizer.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/googlesheetsnormalizer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/googlesheetsnormalizer.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/mswordnormalizer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/normalizers/mswordnormalizer.js create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-paste-from-office/src/pastefromoffice.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectall.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectall.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectallcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectallcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectallediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectallediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectallui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/src/selectallui.js create mode 100644 node_modules/@ckeditor/ckeditor5-select-all/theme/icons/select-all.svg create mode 100644 node_modules/@ckeditor/ckeditor5-table/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-table/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-table/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/table.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ar.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/az.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/bg.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/bn.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ca.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/cs.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/da.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/de-ch.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/de.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/el.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/en-au.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/en-gb.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/es.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/et.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/fa.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/fi.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/fr.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/gl.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/he.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/hi.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/hr.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/hu.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/hy.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/id.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/it.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ja.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ko.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ku.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/lt.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/lv.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ms.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/nb.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ne.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/nl.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/no.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/pl.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/pt-br.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/pt.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ro.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ru.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/sk.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/sl.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/sq.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/sr-latn.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/sr.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/sv.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/th.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/tk.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/tr.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/tt.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ug.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/uk.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/ur.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/uz.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/vi.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/zh-cn.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/build/translations/zh.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/hy.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-table/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/insertcolumncommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/insertcolumncommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/insertrowcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/insertrowcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/inserttablecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/inserttablecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/mergecellcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/mergecellcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/mergecellscommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/mergecellscommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/removecolumncommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/removecolumncommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/removerowcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/removerowcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/selectcolumncommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/selectcolumncommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/selectrowcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/selectrowcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/setheadercolumncommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/setheadercolumncommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/setheaderrowcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/setheaderrowcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/splitcellcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/commands/splitcellcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/downcast.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/downcast.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-caption-post-fixer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-caption-post-fixer.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-cell-paragraph-post-fixer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-cell-paragraph-post-fixer.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-cell-refresh-handler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-cell-refresh-handler.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-headings-refresh-handler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-headings-refresh-handler.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-layout-post-fixer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/table-layout-post-fixer.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/tableproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/tableproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/upcasttable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/converters/upcasttable.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/plaintableoutput.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/plaintableoutput.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/table.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/table.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/tablecaptionediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/tablecaptionediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/tablecaptionui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/tablecaptionui.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/toggletablecaptioncommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/toggletablecaptioncommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecaption/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellbordercolorcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellbordercolorcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellborderstylecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellborderstylecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellborderwidthcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellborderwidthcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellheightcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellheightcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellpaddingcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellpaddingcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellpropertycommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellpropertycommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/tablecellpropertiesediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/tablecellpropertiesediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/tablecellpropertiesui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/tablecellpropertiesui.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/ui/tablecellpropertiesview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellproperties/ui/tablecellpropertiesview.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellwidth/commands/tablecellwidthcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellwidth/commands/tablecellwidthcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellwidth/tablecellwidthediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecellwidth/tablecellwidthediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableclipboard.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableclipboard.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/constants.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/constants.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/converters.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/converters.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/tablecolumnresizeediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/tablecolumnresizeediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/tablewidthscommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/tablewidthscommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablecolumnresize/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablekeyboard.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablekeyboard.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablemouse.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablemouse.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablemouse/mouseeventsobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablemouse/mouseeventsobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablealignmentcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablealignmentcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablebackgroundcolorcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablebackgroundcolorcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablebordercolorcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablebordercolorcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tableborderstylecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tableborderstylecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tableborderwidthcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tableborderwidthcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tableheightcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tableheightcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablepropertycommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablepropertycommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablewidthcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/commands/tablewidthcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/tablepropertiesediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/tablepropertiesediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/tablepropertiesui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/tablepropertiesui.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/ui/tablepropertiesview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableproperties/ui/tablepropertiesview.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableselection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableselection.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tabletoolbar.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tabletoolbar.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableui.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableutils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tableutils.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablewalker.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/tablewalker.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/ui/colorinputview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/ui/colorinputview.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/ui/formrowview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/ui/formrowview.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/ui/inserttableview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/ui/inserttableview.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/common.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/common.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/structure.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/structure.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/table-properties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/table-properties.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/ui/contextualballoon.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/ui/contextualballoon.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/ui/table-properties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/ui/table-properties.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/ui/widget.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-table/src/utils/ui/widget.js create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/colorinput.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/form.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/formrow.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/icons/table-cell-properties.svg create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/icons/table-column.svg create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/icons/table-merge-cell.svg create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/icons/table-properties.svg create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/icons/table-row.svg create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/inserttable.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/table.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tablecaption.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tablecellproperties.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tablecolumnresize.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tableediting.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tableform.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tableproperties.css create mode 100644 node_modules/@ckeditor/ckeditor5-table/theme/tableselection.css create mode 100644 node_modules/@ckeditor/ckeditor5-typing/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-typing/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-typing/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-typing/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-typing/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/delete.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/delete.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/deletecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/deletecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/input.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/input.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/typing.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/typing.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-ui/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-ui/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/af.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/bs.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/jv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/sl.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-ui/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/button.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/button.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/dropdown/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editableui/editableuiview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editableui/editableuiview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editableui/inline/inlineeditableuiview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editableui/inline/inlineeditableuiview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/accessibilityhelp/accessibilityhelp.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/accessibilityhelp/accessibilityhelp.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/accessibilityhelp/accessibilityhelpcontentview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/accessibilityhelp/accessibilityhelpcontentview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/input/inputbase.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/input/inputbase.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/input/inputview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/input/inputview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/inputnumber/inputnumberview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/inputnumber/inputnumberview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/inputtext/inputtextview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/inputtext/inputtextview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/label/labelview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/label/labelview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/labeledfield/labeledfieldview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/labeledfield/labeledfieldview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/labeledfield/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/labeledfield/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/labeledinput/labeledinputview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/labeledinput/labeledinputview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listitemgroupview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listitemgroupview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listitemview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listitemview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listseparatorview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listseparatorview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/list/listview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenubuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenubuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistitembuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistitembuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistitemfiledialogbuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistitemfiledialogbuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistitemview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistitemview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenulistview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenupanelview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenupanelview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenuview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarmenuview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/menubarview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/menubar/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/model.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/model.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/notification/notification.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/notification/notification.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/panel/balloon/balloonpanelview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/panel/balloon/balloonpanelview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/panel/balloon/contextualballoon.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/panel/balloon/contextualballoon.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/panel/sticky/stickypanelview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/panel/sticky/stickypanelview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/filteredview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/filteredview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/searchinfoview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/searchinfoview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/searchresultsview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/searchresultsview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/text/searchtextqueryview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/text/searchtextqueryview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/text/searchtextview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/search/text/searchtextview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/spinner/spinnerview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/spinner/spinnerview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/template.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/template.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/view.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/view.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.js create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/arialiveannouncer/arialiveannouncer.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/autocomplete/autocomplete.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/collapsible/collapsible.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/colorselector/colorselector.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialog.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialogactions.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/listdropdown.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/accessibilityhelp.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/editorui.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/highlightedtext/highlightedtext.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/input/input.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledinput/labeledinput.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubar.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenu.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenubutton.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitem.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitembutton.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenupanel.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/search/search.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/spinner/spinner.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/textarea/textarea.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/globals/_poweredby.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/globals/globals.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/icons/accessibility.svg create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/icons/color-tile-check.svg create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/icons/dropdown-arrow.svg create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/icons/project-logo.svg create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_dir.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css create mode 100644 node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css create mode 100644 node_modules/@ckeditor/ckeditor5-undo/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-undo/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-undo/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-undo/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ast.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/eo.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/eu.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/km.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/kn.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/si.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/tt.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-undo/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/basecommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/basecommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/redocommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/redocommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undo.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undo.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undocommand.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undocommand.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undoediting.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undoediting.js create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undoui.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-undo/src/undoui.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-upload/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-upload/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-upload/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-gb.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/es-co.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/nb.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ne.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ug.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-upload/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/filereader.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/filereader.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/filerepository.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/filerepository.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-utils/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-utils/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-utils/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/collection.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/collection.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/config.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/config.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/count.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/count.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/delay.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/delay.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/diff.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/diff.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/global.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/global.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/position.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/position.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/setdatainelement.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/setdatainelement.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/tounit.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/dom/tounit.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/elementreplacer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/elementreplacer.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/emittermixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/emittermixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/env.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/env.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/eventinfo.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/eventinfo.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/fastdiff.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/fastdiff.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/first.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/first.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/focustracker.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/focustracker.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/inserttopriorityarray.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/inserttopriorityarray.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/isiterable.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/isiterable.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/keyboard.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/keyboard.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/keystrokehandler.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/keystrokehandler.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/language.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/language.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/locale.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/locale.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/mapsequal.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/mapsequal.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/mix.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/mix.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/nth.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/nth.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/objecttomap.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/objecttomap.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/observablemixin.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/observablemixin.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/priorities.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/priorities.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/retry.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/retry.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/splicearray.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/splicearray.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/spy.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/spy.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/toarray.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/toarray.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/tomap.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/tomap.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/translation-service.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/translation-service.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/uid.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/uid.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/unicode.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/unicode.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/verifylicense.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/verifylicense.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/version.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/version.js create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/wait.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-utils/src/wait.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/ckeditor5-metadata.json create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/contextwatchdog.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/contextwatchdog.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/editorwatchdog.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/editorwatchdog.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/utils/areconnectedthroughproperties.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/utils/areconnectedthroughproperties.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/utils/getsubnodes.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/utils/getsubnodes.js create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/watchdog.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-watchdog/src/watchdog.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/CHANGELOG.md create mode 100644 node_modules/@ckeditor/ckeditor5-widget/LICENSE.md create mode 100644 node_modules/@ckeditor/ckeditor5-widget/README.md create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/contexts.json create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ar.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/az.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/bg.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/bn.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ca.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/cs.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/da.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/de-ch.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/de.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/el.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/en-au.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/en.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/es.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/et.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/fa.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/fi.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/fr.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/gl.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/he.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/hi.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/hr.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/hu.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/id.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/it.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ja.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ko.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ku.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/lt.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/lv.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ms.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/nl.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/no.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/pl.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/pt-br.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/pt.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ro.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ru.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/sk.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/sq.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/sr-latn.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/sr.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/sv.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/th.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/tk.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/tr.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/uk.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/ur.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/uz.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/vi.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/zh-cn.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/lang/translations/zh.po create mode 100644 node_modules/@ckeditor/ckeditor5-widget/package.json create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/augmentation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/augmentation.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/highlightstack.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/highlightstack.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/index.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/index.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/verticalnavigation.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/verticalnavigation.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widget.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widget.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/resizer.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/resizer.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/resizerstate.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/resizerstate.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/sizeview.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgetresize/sizeview.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgettoolbarrepository.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgettoolbarrepository.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgettypearound/utils.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgettypearound/utils.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgettypearound/widgettypearound.d.ts create mode 100644 node_modules/@ckeditor/ckeditor5-widget/src/widgettypearound/widgettypearound.js create mode 100644 node_modules/@ckeditor/ckeditor5-widget/theme/icons/drag-handle.svg create mode 100644 node_modules/@ckeditor/ckeditor5-widget/theme/icons/return-arrow.svg create mode 100644 node_modules/@ckeditor/ckeditor5-widget/theme/widget.css create mode 100644 node_modules/@ckeditor/ckeditor5-widget/theme/widgetresize.css create mode 100644 node_modules/@ckeditor/ckeditor5-widget/theme/widgettypearound.css create mode 100644 node_modules/accepts/HISTORY.md create mode 100644 node_modules/accepts/LICENSE create mode 100644 node_modules/accepts/README.md create mode 100644 node_modules/accepts/index.js create mode 100644 node_modules/accepts/package.json create mode 100644 node_modules/array-flatten/LICENSE create mode 100644 node_modules/array-flatten/README.md create mode 100644 node_modules/array-flatten/array-flatten.js create mode 100644 node_modules/array-flatten/package.json create mode 100644 node_modules/blurhash/CHANGELOG.md create mode 100644 node_modules/blurhash/README.md create mode 100644 node_modules/blurhash/dist/esm/index.js create mode 100644 node_modules/blurhash/dist/esm/index.js.map create mode 100644 node_modules/blurhash/dist/index.d.ts create mode 100644 node_modules/blurhash/dist/index.js create mode 100644 node_modules/blurhash/dist/index.js.map create mode 100644 node_modules/blurhash/dist/index.mjs create mode 100644 node_modules/blurhash/dist/index.mjs.map create mode 100644 node_modules/blurhash/package.json create mode 100644 node_modules/body-parser/HISTORY.md create mode 100644 node_modules/body-parser/LICENSE create mode 100644 node_modules/body-parser/README.md create mode 100644 node_modules/body-parser/SECURITY.md create mode 100644 node_modules/body-parser/index.js create mode 100644 node_modules/body-parser/lib/read.js create mode 100644 node_modules/body-parser/lib/types/json.js create mode 100644 node_modules/body-parser/lib/types/raw.js create mode 100644 node_modules/body-parser/lib/types/text.js create mode 100644 node_modules/body-parser/lib/types/urlencoded.js create mode 100644 node_modules/body-parser/package.json create mode 100644 node_modules/bytes/History.md create mode 100644 node_modules/bytes/LICENSE create mode 100644 node_modules/bytes/Readme.md create mode 100644 node_modules/bytes/index.js create mode 100644 node_modules/bytes/package.json create mode 100644 node_modules/call-bind/.eslintignore create mode 100644 node_modules/call-bind/.eslintrc create mode 100644 node_modules/call-bind/.github/FUNDING.yml create mode 100644 node_modules/call-bind/.nycrc create mode 100644 node_modules/call-bind/CHANGELOG.md create mode 100644 node_modules/call-bind/LICENSE create mode 100644 node_modules/call-bind/README.md create mode 100644 node_modules/call-bind/callBound.js create mode 100644 node_modules/call-bind/index.js create mode 100644 node_modules/call-bind/package.json create mode 100644 node_modules/call-bind/test/callBound.js create mode 100644 node_modules/call-bind/test/index.js create mode 100644 node_modules/ckeditor5/CHANGELOG.md create mode 100644 node_modules/ckeditor5/LICENSE.md create mode 100644 node_modules/ckeditor5/README.md create mode 100644 node_modules/ckeditor5/build/ckeditor5-dll.js create mode 100644 node_modules/ckeditor5/build/ckeditor5-dll.manifest.json create mode 100644 node_modules/ckeditor5/build/translations/af.js create mode 100644 node_modules/ckeditor5/build/translations/ar.js create mode 100644 node_modules/ckeditor5/build/translations/ast.js create mode 100644 node_modules/ckeditor5/build/translations/az.js create mode 100644 node_modules/ckeditor5/build/translations/bg.js create mode 100644 node_modules/ckeditor5/build/translations/bn.js create mode 100644 node_modules/ckeditor5/build/translations/bs.js create mode 100644 node_modules/ckeditor5/build/translations/ca.js create mode 100644 node_modules/ckeditor5/build/translations/cs.js create mode 100644 node_modules/ckeditor5/build/translations/da.js create mode 100644 node_modules/ckeditor5/build/translations/de-ch.js create mode 100644 node_modules/ckeditor5/build/translations/de.js create mode 100644 node_modules/ckeditor5/build/translations/el.js create mode 100644 node_modules/ckeditor5/build/translations/en-au.js create mode 100644 node_modules/ckeditor5/build/translations/en-gb.js create mode 100644 node_modules/ckeditor5/build/translations/eo.js create mode 100644 node_modules/ckeditor5/build/translations/es-co.js create mode 100644 node_modules/ckeditor5/build/translations/es.js create mode 100644 node_modules/ckeditor5/build/translations/et.js create mode 100644 node_modules/ckeditor5/build/translations/eu.js create mode 100644 node_modules/ckeditor5/build/translations/fa.js create mode 100644 node_modules/ckeditor5/build/translations/fi.js create mode 100644 node_modules/ckeditor5/build/translations/fr.js create mode 100644 node_modules/ckeditor5/build/translations/gl.js create mode 100644 node_modules/ckeditor5/build/translations/gu.js create mode 100644 node_modules/ckeditor5/build/translations/he.js create mode 100644 node_modules/ckeditor5/build/translations/hi.js create mode 100644 node_modules/ckeditor5/build/translations/hr.js create mode 100644 node_modules/ckeditor5/build/translations/hu.js create mode 100644 node_modules/ckeditor5/build/translations/hy.js create mode 100644 node_modules/ckeditor5/build/translations/id.js create mode 100644 node_modules/ckeditor5/build/translations/it.js create mode 100644 node_modules/ckeditor5/build/translations/ja.js create mode 100644 node_modules/ckeditor5/build/translations/jv.js create mode 100644 node_modules/ckeditor5/build/translations/km.js create mode 100644 node_modules/ckeditor5/build/translations/kn.js create mode 100644 node_modules/ckeditor5/build/translations/ko.js create mode 100644 node_modules/ckeditor5/build/translations/ku.js create mode 100644 node_modules/ckeditor5/build/translations/lt.js create mode 100644 node_modules/ckeditor5/build/translations/lv.js create mode 100644 node_modules/ckeditor5/build/translations/ms.js create mode 100644 node_modules/ckeditor5/build/translations/nb.js create mode 100644 node_modules/ckeditor5/build/translations/ne.js create mode 100644 node_modules/ckeditor5/build/translations/nl.js create mode 100644 node_modules/ckeditor5/build/translations/no.js create mode 100644 node_modules/ckeditor5/build/translations/oc.js create mode 100644 node_modules/ckeditor5/build/translations/pl.js create mode 100644 node_modules/ckeditor5/build/translations/pt-br.js create mode 100644 node_modules/ckeditor5/build/translations/pt.js create mode 100644 node_modules/ckeditor5/build/translations/ro.js create mode 100644 node_modules/ckeditor5/build/translations/ru.js create mode 100644 node_modules/ckeditor5/build/translations/si.js create mode 100644 node_modules/ckeditor5/build/translations/sk.js create mode 100644 node_modules/ckeditor5/build/translations/sl.js create mode 100644 node_modules/ckeditor5/build/translations/sq.js create mode 100644 node_modules/ckeditor5/build/translations/sr-latn.js create mode 100644 node_modules/ckeditor5/build/translations/sr.js create mode 100644 node_modules/ckeditor5/build/translations/sv.js create mode 100644 node_modules/ckeditor5/build/translations/th.js create mode 100644 node_modules/ckeditor5/build/translations/tk.js create mode 100644 node_modules/ckeditor5/build/translations/tr.js create mode 100644 node_modules/ckeditor5/build/translations/tt.js create mode 100644 node_modules/ckeditor5/build/translations/ug.js create mode 100644 node_modules/ckeditor5/build/translations/uk.js create mode 100644 node_modules/ckeditor5/build/translations/ur.js create mode 100644 node_modules/ckeditor5/build/translations/uz.js create mode 100644 node_modules/ckeditor5/build/translations/vi.js create mode 100644 node_modules/ckeditor5/build/translations/zh-cn.js create mode 100644 node_modules/ckeditor5/build/translations/zh.js create mode 100644 node_modules/ckeditor5/package.json create mode 100644 node_modules/ckeditor5/src/clipboard.d.ts create mode 100644 node_modules/ckeditor5/src/clipboard.js create mode 100644 node_modules/ckeditor5/src/core.d.ts create mode 100644 node_modules/ckeditor5/src/core.js create mode 100644 node_modules/ckeditor5/src/engine.d.ts create mode 100644 node_modules/ckeditor5/src/engine.js create mode 100644 node_modules/ckeditor5/src/enter.d.ts create mode 100644 node_modules/ckeditor5/src/enter.js create mode 100644 node_modules/ckeditor5/src/paragraph.d.ts create mode 100644 node_modules/ckeditor5/src/paragraph.js create mode 100644 node_modules/ckeditor5/src/select-all.d.ts create mode 100644 node_modules/ckeditor5/src/select-all.js create mode 100644 node_modules/ckeditor5/src/typing.d.ts create mode 100644 node_modules/ckeditor5/src/typing.js create mode 100644 node_modules/ckeditor5/src/ui.d.ts create mode 100644 node_modules/ckeditor5/src/ui.js create mode 100644 node_modules/ckeditor5/src/undo.d.ts create mode 100644 node_modules/ckeditor5/src/undo.js create mode 100644 node_modules/ckeditor5/src/upload.d.ts create mode 100644 node_modules/ckeditor5/src/upload.js create mode 100644 node_modules/ckeditor5/src/utils.d.ts create mode 100644 node_modules/ckeditor5/src/utils.js create mode 100644 node_modules/ckeditor5/src/watchdog.d.ts create mode 100644 node_modules/ckeditor5/src/watchdog.js create mode 100644 node_modules/ckeditor5/src/widget.d.ts create mode 100644 node_modules/ckeditor5/src/widget.js create mode 100644 node_modules/color-convert/CHANGELOG.md create mode 100644 node_modules/color-convert/LICENSE create mode 100644 node_modules/color-convert/README.md create mode 100644 node_modules/color-convert/conversions.js create mode 100644 node_modules/color-convert/index.js create mode 100644 node_modules/color-convert/package.json create mode 100644 node_modules/color-convert/route.js create mode 100644 node_modules/color-name/LICENSE create mode 100644 node_modules/color-name/README.md create mode 100644 node_modules/color-name/index.js create mode 100644 node_modules/color-name/package.json create mode 100644 node_modules/color-parse/.travis.yml create mode 100644 node_modules/color-parse/LICENSE create mode 100644 node_modules/color-parse/index.js create mode 100644 node_modules/color-parse/index.mjs create mode 100644 node_modules/color-parse/package.json create mode 100644 node_modules/color-parse/readme.md create mode 100644 node_modules/color-parse/test.mjs create mode 100644 node_modules/content-disposition/HISTORY.md create mode 100644 node_modules/content-disposition/LICENSE create mode 100644 node_modules/content-disposition/README.md create mode 100644 node_modules/content-disposition/index.js create mode 100644 node_modules/content-disposition/package.json create mode 100644 node_modules/content-type/HISTORY.md create mode 100644 node_modules/content-type/LICENSE create mode 100644 node_modules/content-type/README.md create mode 100644 node_modules/content-type/index.js create mode 100644 node_modules/content-type/package.json create mode 100644 node_modules/cookie-signature/.npmignore create mode 100644 node_modules/cookie-signature/History.md create mode 100644 node_modules/cookie-signature/Readme.md create mode 100644 node_modules/cookie-signature/index.js create mode 100644 node_modules/cookie-signature/package.json create mode 100644 node_modules/cookie/HISTORY.md create mode 100644 node_modules/cookie/LICENSE create mode 100644 node_modules/cookie/README.md create mode 100644 node_modules/cookie/SECURITY.md create mode 100644 node_modules/cookie/index.js create mode 100644 node_modules/cookie/package.json create mode 100644 node_modules/debug/.coveralls.yml create mode 100644 node_modules/debug/.eslintrc create mode 100644 node_modules/debug/.npmignore create mode 100644 node_modules/debug/.travis.yml create mode 100644 node_modules/debug/CHANGELOG.md create mode 100644 node_modules/debug/LICENSE create mode 100644 node_modules/debug/Makefile create mode 100644 node_modules/debug/README.md create mode 100644 node_modules/debug/component.json create mode 100644 node_modules/debug/karma.conf.js create mode 100644 node_modules/debug/node.js create mode 100644 node_modules/debug/package.json create mode 100644 node_modules/debug/src/browser.js create mode 100644 node_modules/debug/src/debug.js create mode 100644 node_modules/debug/src/index.js create mode 100644 node_modules/debug/src/inspector-log.js create mode 100644 node_modules/debug/src/node.js create mode 100644 node_modules/define-data-property/.eslintrc create mode 100644 node_modules/define-data-property/.github/FUNDING.yml create mode 100644 node_modules/define-data-property/.nycrc create mode 100644 node_modules/define-data-property/CHANGELOG.md create mode 100644 node_modules/define-data-property/LICENSE create mode 100644 node_modules/define-data-property/README.md create mode 100644 node_modules/define-data-property/index.d.ts create mode 100644 node_modules/define-data-property/index.js create mode 100644 node_modules/define-data-property/package.json create mode 100644 node_modules/define-data-property/test/index.js create mode 100644 node_modules/define-data-property/tsconfig.json create mode 100644 node_modules/depd/History.md create mode 100644 node_modules/depd/LICENSE create mode 100644 node_modules/depd/Readme.md create mode 100644 node_modules/depd/index.js create mode 100644 node_modules/depd/lib/browser/index.js create mode 100644 node_modules/depd/package.json create mode 100644 node_modules/destroy/LICENSE create mode 100644 node_modules/destroy/README.md create mode 100644 node_modules/destroy/index.js create mode 100644 node_modules/destroy/package.json create mode 100644 node_modules/ee-first/LICENSE create mode 100644 node_modules/ee-first/README.md create mode 100644 node_modules/ee-first/index.js create mode 100644 node_modules/ee-first/package.json create mode 100644 node_modules/encodeurl/HISTORY.md create mode 100644 node_modules/encodeurl/LICENSE create mode 100644 node_modules/encodeurl/README.md create mode 100644 node_modules/encodeurl/index.js create mode 100644 node_modules/encodeurl/package.json create mode 100644 node_modules/es-define-property/.eslintrc create mode 100644 node_modules/es-define-property/.github/FUNDING.yml create mode 100644 node_modules/es-define-property/.nycrc create mode 100644 node_modules/es-define-property/CHANGELOG.md create mode 100644 node_modules/es-define-property/LICENSE create mode 100644 node_modules/es-define-property/README.md create mode 100644 node_modules/es-define-property/index.d.ts create mode 100644 node_modules/es-define-property/index.js create mode 100644 node_modules/es-define-property/package.json create mode 100644 node_modules/es-define-property/test/index.js create mode 100644 node_modules/es-define-property/tsconfig.json create mode 100644 node_modules/es-errors/.eslintrc create mode 100644 node_modules/es-errors/.github/FUNDING.yml create mode 100644 node_modules/es-errors/CHANGELOG.md create mode 100644 node_modules/es-errors/LICENSE create mode 100644 node_modules/es-errors/README.md create mode 100644 node_modules/es-errors/eval.d.ts create mode 100644 node_modules/es-errors/eval.js create mode 100644 node_modules/es-errors/index.d.ts create mode 100644 node_modules/es-errors/index.js create mode 100644 node_modules/es-errors/package.json create mode 100644 node_modules/es-errors/range.d.ts create mode 100644 node_modules/es-errors/range.js create mode 100644 node_modules/es-errors/ref.d.ts create mode 100644 node_modules/es-errors/ref.js create mode 100644 node_modules/es-errors/syntax.d.ts create mode 100644 node_modules/es-errors/syntax.js create mode 100644 node_modules/es-errors/test/index.js create mode 100644 node_modules/es-errors/tsconfig.json create mode 100644 node_modules/es-errors/type.d.ts create mode 100644 node_modules/es-errors/type.js create mode 100644 node_modules/es-errors/uri.d.ts create mode 100644 node_modules/es-errors/uri.js create mode 100644 node_modules/escape-html/LICENSE create mode 100644 node_modules/escape-html/Readme.md create mode 100644 node_modules/escape-html/index.js create mode 100644 node_modules/escape-html/package.json create mode 100644 node_modules/etag/HISTORY.md create mode 100644 node_modules/etag/LICENSE create mode 100644 node_modules/etag/README.md create mode 100644 node_modules/etag/index.js create mode 100644 node_modules/etag/package.json create mode 100644 node_modules/express/History.md create mode 100644 node_modules/express/LICENSE create mode 100644 node_modules/express/Readme.md create mode 100644 node_modules/express/index.js create mode 100644 node_modules/express/lib/application.js create mode 100644 node_modules/express/lib/express.js create mode 100644 node_modules/express/lib/middleware/init.js create mode 100644 node_modules/express/lib/middleware/query.js create mode 100644 node_modules/express/lib/request.js create mode 100644 node_modules/express/lib/response.js create mode 100644 node_modules/express/lib/router/index.js create mode 100644 node_modules/express/lib/router/layer.js create mode 100644 node_modules/express/lib/router/route.js create mode 100644 node_modules/express/lib/utils.js create mode 100644 node_modules/express/lib/view.js create mode 100644 node_modules/express/package.json create mode 100644 node_modules/finalhandler/HISTORY.md create mode 100644 node_modules/finalhandler/LICENSE create mode 100644 node_modules/finalhandler/README.md create mode 100644 node_modules/finalhandler/SECURITY.md create mode 100644 node_modules/finalhandler/index.js create mode 100644 node_modules/finalhandler/package.json create mode 100644 node_modules/forwarded/HISTORY.md create mode 100644 node_modules/forwarded/LICENSE create mode 100644 node_modules/forwarded/README.md create mode 100644 node_modules/forwarded/index.js create mode 100644 node_modules/forwarded/package.json create mode 100644 node_modules/fresh/HISTORY.md create mode 100644 node_modules/fresh/LICENSE create mode 100644 node_modules/fresh/README.md create mode 100644 node_modules/fresh/index.js create mode 100644 node_modules/fresh/package.json create mode 100644 node_modules/function-bind/.eslintrc create mode 100644 node_modules/function-bind/.github/FUNDING.yml create mode 100644 node_modules/function-bind/.github/SECURITY.md create mode 100644 node_modules/function-bind/.nycrc create mode 100644 node_modules/function-bind/CHANGELOG.md create mode 100644 node_modules/function-bind/LICENSE create mode 100644 node_modules/function-bind/README.md create mode 100644 node_modules/function-bind/implementation.js create mode 100644 node_modules/function-bind/index.js create mode 100644 node_modules/function-bind/package.json create mode 100644 node_modules/function-bind/test/.eslintrc create mode 100644 node_modules/function-bind/test/index.js create mode 100644 node_modules/get-intrinsic/.eslintrc create mode 100644 node_modules/get-intrinsic/.github/FUNDING.yml create mode 100644 node_modules/get-intrinsic/.nycrc create mode 100644 node_modules/get-intrinsic/CHANGELOG.md create mode 100644 node_modules/get-intrinsic/LICENSE create mode 100644 node_modules/get-intrinsic/README.md create mode 100644 node_modules/get-intrinsic/index.js create mode 100644 node_modules/get-intrinsic/package.json create mode 100644 node_modules/get-intrinsic/test/GetIntrinsic.js create mode 100644 node_modules/gopd/.eslintrc create mode 100644 node_modules/gopd/.github/FUNDING.yml create mode 100644 node_modules/gopd/CHANGELOG.md create mode 100644 node_modules/gopd/LICENSE create mode 100644 node_modules/gopd/README.md create mode 100644 node_modules/gopd/index.js create mode 100644 node_modules/gopd/package.json create mode 100644 node_modules/gopd/test/index.js create mode 100644 node_modules/has-property-descriptors/.eslintrc create mode 100644 node_modules/has-property-descriptors/.github/FUNDING.yml create mode 100644 node_modules/has-property-descriptors/.nycrc create mode 100644 node_modules/has-property-descriptors/CHANGELOG.md create mode 100644 node_modules/has-property-descriptors/LICENSE create mode 100644 node_modules/has-property-descriptors/README.md create mode 100644 node_modules/has-property-descriptors/index.js create mode 100644 node_modules/has-property-descriptors/package.json create mode 100644 node_modules/has-property-descriptors/test/index.js create mode 100644 node_modules/has-proto/.eslintrc create mode 100644 node_modules/has-proto/.github/FUNDING.yml create mode 100644 node_modules/has-proto/CHANGELOG.md create mode 100644 node_modules/has-proto/LICENSE create mode 100644 node_modules/has-proto/README.md create mode 100644 node_modules/has-proto/index.d.ts create mode 100644 node_modules/has-proto/index.js create mode 100644 node_modules/has-proto/package.json create mode 100644 node_modules/has-proto/test/index.js create mode 100644 node_modules/has-proto/tsconfig.json create mode 100644 node_modules/has-symbols/.eslintrc create mode 100644 node_modules/has-symbols/.github/FUNDING.yml create mode 100644 node_modules/has-symbols/.nycrc create mode 100644 node_modules/has-symbols/CHANGELOG.md create mode 100644 node_modules/has-symbols/LICENSE create mode 100644 node_modules/has-symbols/README.md create mode 100644 node_modules/has-symbols/index.js create mode 100644 node_modules/has-symbols/package.json create mode 100644 node_modules/has-symbols/shams.js create mode 100644 node_modules/has-symbols/test/index.js create mode 100644 node_modules/has-symbols/test/shams/core-js.js create mode 100644 node_modules/has-symbols/test/shams/get-own-property-symbols.js create mode 100644 node_modules/has-symbols/test/tests.js create mode 100644 node_modules/hasown/.eslintrc create mode 100644 node_modules/hasown/.github/FUNDING.yml create mode 100644 node_modules/hasown/.nycrc create mode 100644 node_modules/hasown/CHANGELOG.md create mode 100644 node_modules/hasown/LICENSE create mode 100644 node_modules/hasown/README.md create mode 100644 node_modules/hasown/index.d.ts create mode 100644 node_modules/hasown/index.js create mode 100644 node_modules/hasown/package.json create mode 100644 node_modules/hasown/tsconfig.json create mode 100644 node_modules/http-errors/HISTORY.md create mode 100644 node_modules/http-errors/LICENSE create mode 100644 node_modules/http-errors/README.md create mode 100644 node_modules/http-errors/index.js create mode 100644 node_modules/http-errors/package.json create mode 100644 node_modules/iconv-lite/Changelog.md create mode 100644 node_modules/iconv-lite/LICENSE create mode 100644 node_modules/iconv-lite/README.md create mode 100644 node_modules/iconv-lite/encodings/dbcs-codec.js create mode 100644 node_modules/iconv-lite/encodings/dbcs-data.js create mode 100644 node_modules/iconv-lite/encodings/index.js create mode 100644 node_modules/iconv-lite/encodings/internal.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-codec.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-data-generated.js create mode 100644 node_modules/iconv-lite/encodings/sbcs-data.js create mode 100644 node_modules/iconv-lite/encodings/tables/big5-added.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp936.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp949.json create mode 100644 node_modules/iconv-lite/encodings/tables/cp950.json create mode 100644 node_modules/iconv-lite/encodings/tables/eucjp.json create mode 100644 node_modules/iconv-lite/encodings/tables/gb18030-ranges.json create mode 100644 node_modules/iconv-lite/encodings/tables/gbk-added.json create mode 100644 node_modules/iconv-lite/encodings/tables/shiftjis.json create mode 100644 node_modules/iconv-lite/encodings/utf16.js create mode 100644 node_modules/iconv-lite/encodings/utf7.js create mode 100644 node_modules/iconv-lite/lib/bom-handling.js create mode 100644 node_modules/iconv-lite/lib/extend-node.js create mode 100644 node_modules/iconv-lite/lib/index.d.ts create mode 100644 node_modules/iconv-lite/lib/index.js create mode 100644 node_modules/iconv-lite/lib/streams.js create mode 100644 node_modules/iconv-lite/package.json create mode 100644 node_modules/inherits/LICENSE create mode 100644 node_modules/inherits/README.md create mode 100644 node_modules/inherits/inherits.js create mode 100644 node_modules/inherits/inherits_browser.js create mode 100644 node_modules/inherits/package.json create mode 100644 node_modules/ipaddr.js/LICENSE create mode 100644 node_modules/ipaddr.js/README.md create mode 100644 node_modules/ipaddr.js/ipaddr.min.js create mode 100644 node_modules/ipaddr.js/lib/ipaddr.js create mode 100644 node_modules/ipaddr.js/lib/ipaddr.js.d.ts create mode 100644 node_modules/ipaddr.js/package.json create mode 100644 node_modules/lodash-es/LICENSE create mode 100644 node_modules/lodash-es/README.md create mode 100644 node_modules/lodash-es/_DataView.js create mode 100644 node_modules/lodash-es/_Hash.js create mode 100644 node_modules/lodash-es/_LazyWrapper.js create mode 100644 node_modules/lodash-es/_ListCache.js create mode 100644 node_modules/lodash-es/_LodashWrapper.js create mode 100644 node_modules/lodash-es/_Map.js create mode 100644 node_modules/lodash-es/_MapCache.js create mode 100644 node_modules/lodash-es/_Promise.js create mode 100644 node_modules/lodash-es/_Set.js create mode 100644 node_modules/lodash-es/_SetCache.js create mode 100644 node_modules/lodash-es/_Stack.js create mode 100644 node_modules/lodash-es/_Symbol.js create mode 100644 node_modules/lodash-es/_Uint8Array.js create mode 100644 node_modules/lodash-es/_WeakMap.js create mode 100644 node_modules/lodash-es/_addMapEntry.js create mode 100644 node_modules/lodash-es/_addSetEntry.js create mode 100644 node_modules/lodash-es/_apply.js create mode 100644 node_modules/lodash-es/_arrayAggregator.js create mode 100644 node_modules/lodash-es/_arrayEach.js create mode 100644 node_modules/lodash-es/_arrayEachRight.js create mode 100644 node_modules/lodash-es/_arrayEvery.js create mode 100644 node_modules/lodash-es/_arrayFilter.js create mode 100644 node_modules/lodash-es/_arrayIncludes.js create mode 100644 node_modules/lodash-es/_arrayIncludesWith.js create mode 100644 node_modules/lodash-es/_arrayLikeKeys.js create mode 100644 node_modules/lodash-es/_arrayMap.js create mode 100644 node_modules/lodash-es/_arrayPush.js create mode 100644 node_modules/lodash-es/_arrayReduce.js create mode 100644 node_modules/lodash-es/_arrayReduceRight.js create mode 100644 node_modules/lodash-es/_arraySample.js create mode 100644 node_modules/lodash-es/_arraySampleSize.js create mode 100644 node_modules/lodash-es/_arrayShuffle.js create mode 100644 node_modules/lodash-es/_arraySome.js create mode 100644 node_modules/lodash-es/_asciiSize.js create mode 100644 node_modules/lodash-es/_asciiToArray.js create mode 100644 node_modules/lodash-es/_asciiWords.js create mode 100644 node_modules/lodash-es/_assignMergeValue.js create mode 100644 node_modules/lodash-es/_assignValue.js create mode 100644 node_modules/lodash-es/_assocIndexOf.js create mode 100644 node_modules/lodash-es/_baseAggregator.js create mode 100644 node_modules/lodash-es/_baseAssign.js create mode 100644 node_modules/lodash-es/_baseAssignIn.js create mode 100644 node_modules/lodash-es/_baseAssignValue.js create mode 100644 node_modules/lodash-es/_baseAt.js create mode 100644 node_modules/lodash-es/_baseClamp.js create mode 100644 node_modules/lodash-es/_baseClone.js create mode 100644 node_modules/lodash-es/_baseConforms.js create mode 100644 node_modules/lodash-es/_baseConformsTo.js create mode 100644 node_modules/lodash-es/_baseCreate.js create mode 100644 node_modules/lodash-es/_baseDelay.js create mode 100644 node_modules/lodash-es/_baseDifference.js create mode 100644 node_modules/lodash-es/_baseEach.js create mode 100644 node_modules/lodash-es/_baseEachRight.js create mode 100644 node_modules/lodash-es/_baseEvery.js create mode 100644 node_modules/lodash-es/_baseExtremum.js create mode 100644 node_modules/lodash-es/_baseFill.js create mode 100644 node_modules/lodash-es/_baseFilter.js create mode 100644 node_modules/lodash-es/_baseFindIndex.js create mode 100644 node_modules/lodash-es/_baseFindKey.js create mode 100644 node_modules/lodash-es/_baseFlatten.js create mode 100644 node_modules/lodash-es/_baseFor.js create mode 100644 node_modules/lodash-es/_baseForOwn.js create mode 100644 node_modules/lodash-es/_baseForOwnRight.js create mode 100644 node_modules/lodash-es/_baseForRight.js create mode 100644 node_modules/lodash-es/_baseFunctions.js create mode 100644 node_modules/lodash-es/_baseGet.js create mode 100644 node_modules/lodash-es/_baseGetAllKeys.js create mode 100644 node_modules/lodash-es/_baseGetTag.js create mode 100644 node_modules/lodash-es/_baseGt.js create mode 100644 node_modules/lodash-es/_baseHas.js create mode 100644 node_modules/lodash-es/_baseHasIn.js create mode 100644 node_modules/lodash-es/_baseInRange.js create mode 100644 node_modules/lodash-es/_baseIndexOf.js create mode 100644 node_modules/lodash-es/_baseIndexOfWith.js create mode 100644 node_modules/lodash-es/_baseIntersection.js create mode 100644 node_modules/lodash-es/_baseInverter.js create mode 100644 node_modules/lodash-es/_baseInvoke.js create mode 100644 node_modules/lodash-es/_baseIsArguments.js create mode 100644 node_modules/lodash-es/_baseIsArrayBuffer.js create mode 100644 node_modules/lodash-es/_baseIsDate.js create mode 100644 node_modules/lodash-es/_baseIsEqual.js create mode 100644 node_modules/lodash-es/_baseIsEqualDeep.js create mode 100644 node_modules/lodash-es/_baseIsMap.js create mode 100644 node_modules/lodash-es/_baseIsMatch.js create mode 100644 node_modules/lodash-es/_baseIsNaN.js create mode 100644 node_modules/lodash-es/_baseIsNative.js create mode 100644 node_modules/lodash-es/_baseIsRegExp.js create mode 100644 node_modules/lodash-es/_baseIsSet.js create mode 100644 node_modules/lodash-es/_baseIsTypedArray.js create mode 100644 node_modules/lodash-es/_baseIteratee.js create mode 100644 node_modules/lodash-es/_baseKeys.js create mode 100644 node_modules/lodash-es/_baseKeysIn.js create mode 100644 node_modules/lodash-es/_baseLodash.js create mode 100644 node_modules/lodash-es/_baseLt.js create mode 100644 node_modules/lodash-es/_baseMap.js create mode 100644 node_modules/lodash-es/_baseMatches.js create mode 100644 node_modules/lodash-es/_baseMatchesProperty.js create mode 100644 node_modules/lodash-es/_baseMean.js create mode 100644 node_modules/lodash-es/_baseMerge.js create mode 100644 node_modules/lodash-es/_baseMergeDeep.js create mode 100644 node_modules/lodash-es/_baseNth.js create mode 100644 node_modules/lodash-es/_baseOrderBy.js create mode 100644 node_modules/lodash-es/_basePick.js create mode 100644 node_modules/lodash-es/_basePickBy.js create mode 100644 node_modules/lodash-es/_baseProperty.js create mode 100644 node_modules/lodash-es/_basePropertyDeep.js create mode 100644 node_modules/lodash-es/_basePropertyOf.js create mode 100644 node_modules/lodash-es/_basePullAll.js create mode 100644 node_modules/lodash-es/_basePullAt.js create mode 100644 node_modules/lodash-es/_baseRandom.js create mode 100644 node_modules/lodash-es/_baseRange.js create mode 100644 node_modules/lodash-es/_baseReduce.js create mode 100644 node_modules/lodash-es/_baseRepeat.js create mode 100644 node_modules/lodash-es/_baseRest.js create mode 100644 node_modules/lodash-es/_baseSample.js create mode 100644 node_modules/lodash-es/_baseSampleSize.js create mode 100644 node_modules/lodash-es/_baseSet.js create mode 100644 node_modules/lodash-es/_baseSetData.js create mode 100644 node_modules/lodash-es/_baseSetToString.js create mode 100644 node_modules/lodash-es/_baseShuffle.js create mode 100644 node_modules/lodash-es/_baseSlice.js create mode 100644 node_modules/lodash-es/_baseSome.js create mode 100644 node_modules/lodash-es/_baseSortBy.js create mode 100644 node_modules/lodash-es/_baseSortedIndex.js create mode 100644 node_modules/lodash-es/_baseSortedIndexBy.js create mode 100644 node_modules/lodash-es/_baseSortedUniq.js create mode 100644 node_modules/lodash-es/_baseSum.js create mode 100644 node_modules/lodash-es/_baseTimes.js create mode 100644 node_modules/lodash-es/_baseToNumber.js create mode 100644 node_modules/lodash-es/_baseToPairs.js create mode 100644 node_modules/lodash-es/_baseToString.js create mode 100644 node_modules/lodash-es/_baseTrim.js create mode 100644 node_modules/lodash-es/_baseUnary.js create mode 100644 node_modules/lodash-es/_baseUniq.js create mode 100644 node_modules/lodash-es/_baseUnset.js create mode 100644 node_modules/lodash-es/_baseUpdate.js create mode 100644 node_modules/lodash-es/_baseValues.js create mode 100644 node_modules/lodash-es/_baseWhile.js create mode 100644 node_modules/lodash-es/_baseWrapperValue.js create mode 100644 node_modules/lodash-es/_baseXor.js create mode 100644 node_modules/lodash-es/_baseZipObject.js create mode 100644 node_modules/lodash-es/_cacheHas.js create mode 100644 node_modules/lodash-es/_castArrayLikeObject.js create mode 100644 node_modules/lodash-es/_castFunction.js create mode 100644 node_modules/lodash-es/_castPath.js create mode 100644 node_modules/lodash-es/_castRest.js create mode 100644 node_modules/lodash-es/_castSlice.js create mode 100644 node_modules/lodash-es/_charsEndIndex.js create mode 100644 node_modules/lodash-es/_charsStartIndex.js create mode 100644 node_modules/lodash-es/_cloneArrayBuffer.js create mode 100644 node_modules/lodash-es/_cloneBuffer.js create mode 100644 node_modules/lodash-es/_cloneDataView.js create mode 100644 node_modules/lodash-es/_cloneMap.js create mode 100644 node_modules/lodash-es/_cloneRegExp.js create mode 100644 node_modules/lodash-es/_cloneSet.js create mode 100644 node_modules/lodash-es/_cloneSymbol.js create mode 100644 node_modules/lodash-es/_cloneTypedArray.js create mode 100644 node_modules/lodash-es/_compareAscending.js create mode 100644 node_modules/lodash-es/_compareMultiple.js create mode 100644 node_modules/lodash-es/_composeArgs.js create mode 100644 node_modules/lodash-es/_composeArgsRight.js create mode 100644 node_modules/lodash-es/_copyArray.js create mode 100644 node_modules/lodash-es/_copyObject.js create mode 100644 node_modules/lodash-es/_copySymbols.js create mode 100644 node_modules/lodash-es/_copySymbolsIn.js create mode 100644 node_modules/lodash-es/_coreJsData.js create mode 100644 node_modules/lodash-es/_countHolders.js create mode 100644 node_modules/lodash-es/_createAggregator.js create mode 100644 node_modules/lodash-es/_createAssigner.js create mode 100644 node_modules/lodash-es/_createBaseEach.js create mode 100644 node_modules/lodash-es/_createBaseFor.js create mode 100644 node_modules/lodash-es/_createBind.js create mode 100644 node_modules/lodash-es/_createCaseFirst.js create mode 100644 node_modules/lodash-es/_createCompounder.js create mode 100644 node_modules/lodash-es/_createCtor.js create mode 100644 node_modules/lodash-es/_createCurry.js create mode 100644 node_modules/lodash-es/_createFind.js create mode 100644 node_modules/lodash-es/_createFlow.js create mode 100644 node_modules/lodash-es/_createHybrid.js create mode 100644 node_modules/lodash-es/_createInverter.js create mode 100644 node_modules/lodash-es/_createMathOperation.js create mode 100644 node_modules/lodash-es/_createOver.js create mode 100644 node_modules/lodash-es/_createPadding.js create mode 100644 node_modules/lodash-es/_createPartial.js create mode 100644 node_modules/lodash-es/_createRange.js create mode 100644 node_modules/lodash-es/_createRecurry.js create mode 100644 node_modules/lodash-es/_createRelationalOperation.js create mode 100644 node_modules/lodash-es/_createRound.js create mode 100644 node_modules/lodash-es/_createSet.js create mode 100644 node_modules/lodash-es/_createToPairs.js create mode 100644 node_modules/lodash-es/_createWrap.js create mode 100644 node_modules/lodash-es/_customDefaultsAssignIn.js create mode 100644 node_modules/lodash-es/_customDefaultsMerge.js create mode 100644 node_modules/lodash-es/_customOmitClone.js create mode 100644 node_modules/lodash-es/_deburrLetter.js create mode 100644 node_modules/lodash-es/_defineProperty.js create mode 100644 node_modules/lodash-es/_equalArrays.js create mode 100644 node_modules/lodash-es/_equalByTag.js create mode 100644 node_modules/lodash-es/_equalObjects.js create mode 100644 node_modules/lodash-es/_escapeHtmlChar.js create mode 100644 node_modules/lodash-es/_escapeStringChar.js create mode 100644 node_modules/lodash-es/_flatRest.js create mode 100644 node_modules/lodash-es/_freeGlobal.js create mode 100644 node_modules/lodash-es/_getAllKeys.js create mode 100644 node_modules/lodash-es/_getAllKeysIn.js create mode 100644 node_modules/lodash-es/_getData.js create mode 100644 node_modules/lodash-es/_getFuncName.js create mode 100644 node_modules/lodash-es/_getHolder.js create mode 100644 node_modules/lodash-es/_getMapData.js create mode 100644 node_modules/lodash-es/_getMatchData.js create mode 100644 node_modules/lodash-es/_getNative.js create mode 100644 node_modules/lodash-es/_getPrototype.js create mode 100644 node_modules/lodash-es/_getRawTag.js create mode 100644 node_modules/lodash-es/_getSymbols.js create mode 100644 node_modules/lodash-es/_getSymbolsIn.js create mode 100644 node_modules/lodash-es/_getTag.js create mode 100644 node_modules/lodash-es/_getValue.js create mode 100644 node_modules/lodash-es/_getView.js create mode 100644 node_modules/lodash-es/_getWrapDetails.js create mode 100644 node_modules/lodash-es/_hasPath.js create mode 100644 node_modules/lodash-es/_hasUnicode.js create mode 100644 node_modules/lodash-es/_hasUnicodeWord.js create mode 100644 node_modules/lodash-es/_hashClear.js create mode 100644 node_modules/lodash-es/_hashDelete.js create mode 100644 node_modules/lodash-es/_hashGet.js create mode 100644 node_modules/lodash-es/_hashHas.js create mode 100644 node_modules/lodash-es/_hashSet.js create mode 100644 node_modules/lodash-es/_initCloneArray.js create mode 100644 node_modules/lodash-es/_initCloneByTag.js create mode 100644 node_modules/lodash-es/_initCloneObject.js create mode 100644 node_modules/lodash-es/_insertWrapDetails.js create mode 100644 node_modules/lodash-es/_isFlattenable.js create mode 100644 node_modules/lodash-es/_isIndex.js create mode 100644 node_modules/lodash-es/_isIterateeCall.js create mode 100644 node_modules/lodash-es/_isKey.js create mode 100644 node_modules/lodash-es/_isKeyable.js create mode 100644 node_modules/lodash-es/_isLaziable.js create mode 100644 node_modules/lodash-es/_isMaskable.js create mode 100644 node_modules/lodash-es/_isMasked.js create mode 100644 node_modules/lodash-es/_isPrototype.js create mode 100644 node_modules/lodash-es/_isStrictComparable.js create mode 100644 node_modules/lodash-es/_iteratorToArray.js create mode 100644 node_modules/lodash-es/_lazyClone.js create mode 100644 node_modules/lodash-es/_lazyReverse.js create mode 100644 node_modules/lodash-es/_lazyValue.js create mode 100644 node_modules/lodash-es/_listCacheClear.js create mode 100644 node_modules/lodash-es/_listCacheDelete.js create mode 100644 node_modules/lodash-es/_listCacheGet.js create mode 100644 node_modules/lodash-es/_listCacheHas.js create mode 100644 node_modules/lodash-es/_listCacheSet.js create mode 100644 node_modules/lodash-es/_mapCacheClear.js create mode 100644 node_modules/lodash-es/_mapCacheDelete.js create mode 100644 node_modules/lodash-es/_mapCacheGet.js create mode 100644 node_modules/lodash-es/_mapCacheHas.js create mode 100644 node_modules/lodash-es/_mapCacheSet.js create mode 100644 node_modules/lodash-es/_mapToArray.js create mode 100644 node_modules/lodash-es/_matchesStrictComparable.js create mode 100644 node_modules/lodash-es/_memoizeCapped.js create mode 100644 node_modules/lodash-es/_mergeData.js create mode 100644 node_modules/lodash-es/_metaMap.js create mode 100644 node_modules/lodash-es/_nativeCreate.js create mode 100644 node_modules/lodash-es/_nativeKeys.js create mode 100644 node_modules/lodash-es/_nativeKeysIn.js create mode 100644 node_modules/lodash-es/_nodeUtil.js create mode 100644 node_modules/lodash-es/_objectToString.js create mode 100644 node_modules/lodash-es/_overArg.js create mode 100644 node_modules/lodash-es/_overRest.js create mode 100644 node_modules/lodash-es/_parent.js create mode 100644 node_modules/lodash-es/_reEscape.js create mode 100644 node_modules/lodash-es/_reEvaluate.js create mode 100644 node_modules/lodash-es/_reInterpolate.js create mode 100644 node_modules/lodash-es/_realNames.js create mode 100644 node_modules/lodash-es/_reorder.js create mode 100644 node_modules/lodash-es/_replaceHolders.js create mode 100644 node_modules/lodash-es/_root.js create mode 100644 node_modules/lodash-es/_safeGet.js create mode 100644 node_modules/lodash-es/_setCacheAdd.js create mode 100644 node_modules/lodash-es/_setCacheHas.js create mode 100644 node_modules/lodash-es/_setData.js create mode 100644 node_modules/lodash-es/_setToArray.js create mode 100644 node_modules/lodash-es/_setToPairs.js create mode 100644 node_modules/lodash-es/_setToString.js create mode 100644 node_modules/lodash-es/_setWrapToString.js create mode 100644 node_modules/lodash-es/_shortOut.js create mode 100644 node_modules/lodash-es/_shuffleSelf.js create mode 100644 node_modules/lodash-es/_stackClear.js create mode 100644 node_modules/lodash-es/_stackDelete.js create mode 100644 node_modules/lodash-es/_stackGet.js create mode 100644 node_modules/lodash-es/_stackHas.js create mode 100644 node_modules/lodash-es/_stackSet.js create mode 100644 node_modules/lodash-es/_strictIndexOf.js create mode 100644 node_modules/lodash-es/_strictLastIndexOf.js create mode 100644 node_modules/lodash-es/_stringSize.js create mode 100644 node_modules/lodash-es/_stringToArray.js create mode 100644 node_modules/lodash-es/_stringToPath.js create mode 100644 node_modules/lodash-es/_toKey.js create mode 100644 node_modules/lodash-es/_toSource.js create mode 100644 node_modules/lodash-es/_trimmedEndIndex.js create mode 100644 node_modules/lodash-es/_unescapeHtmlChar.js create mode 100644 node_modules/lodash-es/_unicodeSize.js create mode 100644 node_modules/lodash-es/_unicodeToArray.js create mode 100644 node_modules/lodash-es/_unicodeWords.js create mode 100644 node_modules/lodash-es/_updateWrapDetails.js create mode 100644 node_modules/lodash-es/_wrapperClone.js create mode 100644 node_modules/lodash-es/add.js create mode 100644 node_modules/lodash-es/after.js create mode 100644 node_modules/lodash-es/array.default.js create mode 100644 node_modules/lodash-es/array.js create mode 100644 node_modules/lodash-es/ary.js create mode 100644 node_modules/lodash-es/assign.js create mode 100644 node_modules/lodash-es/assignIn.js create mode 100644 node_modules/lodash-es/assignInWith.js create mode 100644 node_modules/lodash-es/assignWith.js create mode 100644 node_modules/lodash-es/at.js create mode 100644 node_modules/lodash-es/attempt.js create mode 100644 node_modules/lodash-es/before.js create mode 100644 node_modules/lodash-es/bind.js create mode 100644 node_modules/lodash-es/bindAll.js create mode 100644 node_modules/lodash-es/bindKey.js create mode 100644 node_modules/lodash-es/camelCase.js create mode 100644 node_modules/lodash-es/capitalize.js create mode 100644 node_modules/lodash-es/castArray.js create mode 100644 node_modules/lodash-es/ceil.js create mode 100644 node_modules/lodash-es/chain.js create mode 100644 node_modules/lodash-es/chunk.js create mode 100644 node_modules/lodash-es/clamp.js create mode 100644 node_modules/lodash-es/clone.js create mode 100644 node_modules/lodash-es/cloneDeep.js create mode 100644 node_modules/lodash-es/cloneDeepWith.js create mode 100644 node_modules/lodash-es/cloneWith.js create mode 100644 node_modules/lodash-es/collection.default.js create mode 100644 node_modules/lodash-es/collection.js create mode 100644 node_modules/lodash-es/commit.js create mode 100644 node_modules/lodash-es/compact.js create mode 100644 node_modules/lodash-es/concat.js create mode 100644 node_modules/lodash-es/cond.js create mode 100644 node_modules/lodash-es/conforms.js create mode 100644 node_modules/lodash-es/conformsTo.js create mode 100644 node_modules/lodash-es/constant.js create mode 100644 node_modules/lodash-es/countBy.js create mode 100644 node_modules/lodash-es/create.js create mode 100644 node_modules/lodash-es/curry.js create mode 100644 node_modules/lodash-es/curryRight.js create mode 100644 node_modules/lodash-es/date.default.js create mode 100644 node_modules/lodash-es/date.js create mode 100644 node_modules/lodash-es/debounce.js create mode 100644 node_modules/lodash-es/deburr.js create mode 100644 node_modules/lodash-es/defaultTo.js create mode 100644 node_modules/lodash-es/defaults.js create mode 100644 node_modules/lodash-es/defaultsDeep.js create mode 100644 node_modules/lodash-es/defer.js create mode 100644 node_modules/lodash-es/delay.js create mode 100644 node_modules/lodash-es/difference.js create mode 100644 node_modules/lodash-es/differenceBy.js create mode 100644 node_modules/lodash-es/differenceWith.js create mode 100644 node_modules/lodash-es/divide.js create mode 100644 node_modules/lodash-es/drop.js create mode 100644 node_modules/lodash-es/dropRight.js create mode 100644 node_modules/lodash-es/dropRightWhile.js create mode 100644 node_modules/lodash-es/dropWhile.js create mode 100644 node_modules/lodash-es/each.js create mode 100644 node_modules/lodash-es/eachRight.js create mode 100644 node_modules/lodash-es/endsWith.js create mode 100644 node_modules/lodash-es/entries.js create mode 100644 node_modules/lodash-es/entriesIn.js create mode 100644 node_modules/lodash-es/eq.js create mode 100644 node_modules/lodash-es/escape.js create mode 100644 node_modules/lodash-es/escapeRegExp.js create mode 100644 node_modules/lodash-es/every.js create mode 100644 node_modules/lodash-es/extend.js create mode 100644 node_modules/lodash-es/extendWith.js create mode 100644 node_modules/lodash-es/fill.js create mode 100644 node_modules/lodash-es/filter.js create mode 100644 node_modules/lodash-es/find.js create mode 100644 node_modules/lodash-es/findIndex.js create mode 100644 node_modules/lodash-es/findKey.js create mode 100644 node_modules/lodash-es/findLast.js create mode 100644 node_modules/lodash-es/findLastIndex.js create mode 100644 node_modules/lodash-es/findLastKey.js create mode 100644 node_modules/lodash-es/first.js create mode 100644 node_modules/lodash-es/flake.lock create mode 100644 node_modules/lodash-es/flake.nix create mode 100644 node_modules/lodash-es/flatMap.js create mode 100644 node_modules/lodash-es/flatMapDeep.js create mode 100644 node_modules/lodash-es/flatMapDepth.js create mode 100644 node_modules/lodash-es/flatten.js create mode 100644 node_modules/lodash-es/flattenDeep.js create mode 100644 node_modules/lodash-es/flattenDepth.js create mode 100644 node_modules/lodash-es/flip.js create mode 100644 node_modules/lodash-es/floor.js create mode 100644 node_modules/lodash-es/flow.js create mode 100644 node_modules/lodash-es/flowRight.js create mode 100644 node_modules/lodash-es/forEach.js create mode 100644 node_modules/lodash-es/forEachRight.js create mode 100644 node_modules/lodash-es/forIn.js create mode 100644 node_modules/lodash-es/forInRight.js create mode 100644 node_modules/lodash-es/forOwn.js create mode 100644 node_modules/lodash-es/forOwnRight.js create mode 100644 node_modules/lodash-es/fromPairs.js create mode 100644 node_modules/lodash-es/function.default.js create mode 100644 node_modules/lodash-es/function.js create mode 100644 node_modules/lodash-es/functions.js create mode 100644 node_modules/lodash-es/functionsIn.js create mode 100644 node_modules/lodash-es/get.js create mode 100644 node_modules/lodash-es/groupBy.js create mode 100644 node_modules/lodash-es/gt.js create mode 100644 node_modules/lodash-es/gte.js create mode 100644 node_modules/lodash-es/has.js create mode 100644 node_modules/lodash-es/hasIn.js create mode 100644 node_modules/lodash-es/head.js create mode 100644 node_modules/lodash-es/identity.js create mode 100644 node_modules/lodash-es/inRange.js create mode 100644 node_modules/lodash-es/includes.js create mode 100644 node_modules/lodash-es/indexOf.js create mode 100644 node_modules/lodash-es/initial.js create mode 100644 node_modules/lodash-es/intersection.js create mode 100644 node_modules/lodash-es/intersectionBy.js create mode 100644 node_modules/lodash-es/intersectionWith.js create mode 100644 node_modules/lodash-es/invert.js create mode 100644 node_modules/lodash-es/invertBy.js create mode 100644 node_modules/lodash-es/invoke.js create mode 100644 node_modules/lodash-es/invokeMap.js create mode 100644 node_modules/lodash-es/isArguments.js create mode 100644 node_modules/lodash-es/isArray.js create mode 100644 node_modules/lodash-es/isArrayBuffer.js create mode 100644 node_modules/lodash-es/isArrayLike.js create mode 100644 node_modules/lodash-es/isArrayLikeObject.js create mode 100644 node_modules/lodash-es/isBoolean.js create mode 100644 node_modules/lodash-es/isBuffer.js create mode 100644 node_modules/lodash-es/isDate.js create mode 100644 node_modules/lodash-es/isElement.js create mode 100644 node_modules/lodash-es/isEmpty.js create mode 100644 node_modules/lodash-es/isEqual.js create mode 100644 node_modules/lodash-es/isEqualWith.js create mode 100644 node_modules/lodash-es/isError.js create mode 100644 node_modules/lodash-es/isFinite.js create mode 100644 node_modules/lodash-es/isFunction.js create mode 100644 node_modules/lodash-es/isInteger.js create mode 100644 node_modules/lodash-es/isLength.js create mode 100644 node_modules/lodash-es/isMap.js create mode 100644 node_modules/lodash-es/isMatch.js create mode 100644 node_modules/lodash-es/isMatchWith.js create mode 100644 node_modules/lodash-es/isNaN.js create mode 100644 node_modules/lodash-es/isNative.js create mode 100644 node_modules/lodash-es/isNil.js create mode 100644 node_modules/lodash-es/isNull.js create mode 100644 node_modules/lodash-es/isNumber.js create mode 100644 node_modules/lodash-es/isObject.js create mode 100644 node_modules/lodash-es/isObjectLike.js create mode 100644 node_modules/lodash-es/isPlainObject.js create mode 100644 node_modules/lodash-es/isRegExp.js create mode 100644 node_modules/lodash-es/isSafeInteger.js create mode 100644 node_modules/lodash-es/isSet.js create mode 100644 node_modules/lodash-es/isString.js create mode 100644 node_modules/lodash-es/isSymbol.js create mode 100644 node_modules/lodash-es/isTypedArray.js create mode 100644 node_modules/lodash-es/isUndefined.js create mode 100644 node_modules/lodash-es/isWeakMap.js create mode 100644 node_modules/lodash-es/isWeakSet.js create mode 100644 node_modules/lodash-es/iteratee.js create mode 100644 node_modules/lodash-es/join.js create mode 100644 node_modules/lodash-es/kebabCase.js create mode 100644 node_modules/lodash-es/keyBy.js create mode 100644 node_modules/lodash-es/keys.js create mode 100644 node_modules/lodash-es/keysIn.js create mode 100644 node_modules/lodash-es/lang.default.js create mode 100644 node_modules/lodash-es/lang.js create mode 100644 node_modules/lodash-es/last.js create mode 100644 node_modules/lodash-es/lastIndexOf.js create mode 100644 node_modules/lodash-es/lodash.default.js create mode 100644 node_modules/lodash-es/lodash.js create mode 100644 node_modules/lodash-es/lowerCase.js create mode 100644 node_modules/lodash-es/lowerFirst.js create mode 100644 node_modules/lodash-es/lt.js create mode 100644 node_modules/lodash-es/lte.js create mode 100644 node_modules/lodash-es/map.js create mode 100644 node_modules/lodash-es/mapKeys.js create mode 100644 node_modules/lodash-es/mapValues.js create mode 100644 node_modules/lodash-es/matches.js create mode 100644 node_modules/lodash-es/matchesProperty.js create mode 100644 node_modules/lodash-es/math.default.js create mode 100644 node_modules/lodash-es/math.js create mode 100644 node_modules/lodash-es/max.js create mode 100644 node_modules/lodash-es/maxBy.js create mode 100644 node_modules/lodash-es/mean.js create mode 100644 node_modules/lodash-es/meanBy.js create mode 100644 node_modules/lodash-es/memoize.js create mode 100644 node_modules/lodash-es/merge.js create mode 100644 node_modules/lodash-es/mergeWith.js create mode 100644 node_modules/lodash-es/method.js create mode 100644 node_modules/lodash-es/methodOf.js create mode 100644 node_modules/lodash-es/min.js create mode 100644 node_modules/lodash-es/minBy.js create mode 100644 node_modules/lodash-es/mixin.js create mode 100644 node_modules/lodash-es/multiply.js create mode 100644 node_modules/lodash-es/negate.js create mode 100644 node_modules/lodash-es/next.js create mode 100644 node_modules/lodash-es/noop.js create mode 100644 node_modules/lodash-es/now.js create mode 100644 node_modules/lodash-es/nth.js create mode 100644 node_modules/lodash-es/nthArg.js create mode 100644 node_modules/lodash-es/number.default.js create mode 100644 node_modules/lodash-es/number.js create mode 100644 node_modules/lodash-es/object.default.js create mode 100644 node_modules/lodash-es/object.js create mode 100644 node_modules/lodash-es/omit.js create mode 100644 node_modules/lodash-es/omitBy.js create mode 100644 node_modules/lodash-es/once.js create mode 100644 node_modules/lodash-es/orderBy.js create mode 100644 node_modules/lodash-es/over.js create mode 100644 node_modules/lodash-es/overArgs.js create mode 100644 node_modules/lodash-es/overEvery.js create mode 100644 node_modules/lodash-es/overSome.js create mode 100644 node_modules/lodash-es/package.json create mode 100644 node_modules/lodash-es/pad.js create mode 100644 node_modules/lodash-es/padEnd.js create mode 100644 node_modules/lodash-es/padStart.js create mode 100644 node_modules/lodash-es/parseInt.js create mode 100644 node_modules/lodash-es/partial.js create mode 100644 node_modules/lodash-es/partialRight.js create mode 100644 node_modules/lodash-es/partition.js create mode 100644 node_modules/lodash-es/pick.js create mode 100644 node_modules/lodash-es/pickBy.js create mode 100644 node_modules/lodash-es/plant.js create mode 100644 node_modules/lodash-es/property.js create mode 100644 node_modules/lodash-es/propertyOf.js create mode 100644 node_modules/lodash-es/pull.js create mode 100644 node_modules/lodash-es/pullAll.js create mode 100644 node_modules/lodash-es/pullAllBy.js create mode 100644 node_modules/lodash-es/pullAllWith.js create mode 100644 node_modules/lodash-es/pullAt.js create mode 100644 node_modules/lodash-es/random.js create mode 100644 node_modules/lodash-es/range.js create mode 100644 node_modules/lodash-es/rangeRight.js create mode 100644 node_modules/lodash-es/rearg.js create mode 100644 node_modules/lodash-es/reduce.js create mode 100644 node_modules/lodash-es/reduceRight.js create mode 100644 node_modules/lodash-es/reject.js create mode 100644 node_modules/lodash-es/release.md create mode 100644 node_modules/lodash-es/remove.js create mode 100644 node_modules/lodash-es/repeat.js create mode 100644 node_modules/lodash-es/replace.js create mode 100644 node_modules/lodash-es/rest.js create mode 100644 node_modules/lodash-es/result.js create mode 100644 node_modules/lodash-es/reverse.js create mode 100644 node_modules/lodash-es/round.js create mode 100644 node_modules/lodash-es/sample.js create mode 100644 node_modules/lodash-es/sampleSize.js create mode 100644 node_modules/lodash-es/seq.default.js create mode 100644 node_modules/lodash-es/seq.js create mode 100644 node_modules/lodash-es/set.js create mode 100644 node_modules/lodash-es/setWith.js create mode 100644 node_modules/lodash-es/shuffle.js create mode 100644 node_modules/lodash-es/size.js create mode 100644 node_modules/lodash-es/slice.js create mode 100644 node_modules/lodash-es/snakeCase.js create mode 100644 node_modules/lodash-es/some.js create mode 100644 node_modules/lodash-es/sortBy.js create mode 100644 node_modules/lodash-es/sortedIndex.js create mode 100644 node_modules/lodash-es/sortedIndexBy.js create mode 100644 node_modules/lodash-es/sortedIndexOf.js create mode 100644 node_modules/lodash-es/sortedLastIndex.js create mode 100644 node_modules/lodash-es/sortedLastIndexBy.js create mode 100644 node_modules/lodash-es/sortedLastIndexOf.js create mode 100644 node_modules/lodash-es/sortedUniq.js create mode 100644 node_modules/lodash-es/sortedUniqBy.js create mode 100644 node_modules/lodash-es/split.js create mode 100644 node_modules/lodash-es/spread.js create mode 100644 node_modules/lodash-es/startCase.js create mode 100644 node_modules/lodash-es/startsWith.js create mode 100644 node_modules/lodash-es/string.default.js create mode 100644 node_modules/lodash-es/string.js create mode 100644 node_modules/lodash-es/stubArray.js create mode 100644 node_modules/lodash-es/stubFalse.js create mode 100644 node_modules/lodash-es/stubObject.js create mode 100644 node_modules/lodash-es/stubString.js create mode 100644 node_modules/lodash-es/stubTrue.js create mode 100644 node_modules/lodash-es/subtract.js create mode 100644 node_modules/lodash-es/sum.js create mode 100644 node_modules/lodash-es/sumBy.js create mode 100644 node_modules/lodash-es/tail.js create mode 100644 node_modules/lodash-es/take.js create mode 100644 node_modules/lodash-es/takeRight.js create mode 100644 node_modules/lodash-es/takeRightWhile.js create mode 100644 node_modules/lodash-es/takeWhile.js create mode 100644 node_modules/lodash-es/tap.js create mode 100644 node_modules/lodash-es/template.js create mode 100644 node_modules/lodash-es/templateSettings.js create mode 100644 node_modules/lodash-es/throttle.js create mode 100644 node_modules/lodash-es/thru.js create mode 100644 node_modules/lodash-es/times.js create mode 100644 node_modules/lodash-es/toArray.js create mode 100644 node_modules/lodash-es/toFinite.js create mode 100644 node_modules/lodash-es/toInteger.js create mode 100644 node_modules/lodash-es/toIterator.js create mode 100644 node_modules/lodash-es/toJSON.js create mode 100644 node_modules/lodash-es/toLength.js create mode 100644 node_modules/lodash-es/toLower.js create mode 100644 node_modules/lodash-es/toNumber.js create mode 100644 node_modules/lodash-es/toPairs.js create mode 100644 node_modules/lodash-es/toPairsIn.js create mode 100644 node_modules/lodash-es/toPath.js create mode 100644 node_modules/lodash-es/toPlainObject.js create mode 100644 node_modules/lodash-es/toSafeInteger.js create mode 100644 node_modules/lodash-es/toString.js create mode 100644 node_modules/lodash-es/toUpper.js create mode 100644 node_modules/lodash-es/transform.js create mode 100644 node_modules/lodash-es/trim.js create mode 100644 node_modules/lodash-es/trimEnd.js create mode 100644 node_modules/lodash-es/trimStart.js create mode 100644 node_modules/lodash-es/truncate.js create mode 100644 node_modules/lodash-es/unary.js create mode 100644 node_modules/lodash-es/unescape.js create mode 100644 node_modules/lodash-es/union.js create mode 100644 node_modules/lodash-es/unionBy.js create mode 100644 node_modules/lodash-es/unionWith.js create mode 100644 node_modules/lodash-es/uniq.js create mode 100644 node_modules/lodash-es/uniqBy.js create mode 100644 node_modules/lodash-es/uniqWith.js create mode 100644 node_modules/lodash-es/uniqueId.js create mode 100644 node_modules/lodash-es/unset.js create mode 100644 node_modules/lodash-es/unzip.js create mode 100644 node_modules/lodash-es/unzipWith.js create mode 100644 node_modules/lodash-es/update.js create mode 100644 node_modules/lodash-es/updateWith.js create mode 100644 node_modules/lodash-es/upperCase.js create mode 100644 node_modules/lodash-es/upperFirst.js create mode 100644 node_modules/lodash-es/util.default.js create mode 100644 node_modules/lodash-es/util.js create mode 100644 node_modules/lodash-es/value.js create mode 100644 node_modules/lodash-es/valueOf.js create mode 100644 node_modules/lodash-es/values.js create mode 100644 node_modules/lodash-es/valuesIn.js create mode 100644 node_modules/lodash-es/without.js create mode 100644 node_modules/lodash-es/words.js create mode 100644 node_modules/lodash-es/wrap.js create mode 100644 node_modules/lodash-es/wrapperAt.js create mode 100644 node_modules/lodash-es/wrapperChain.js create mode 100644 node_modules/lodash-es/wrapperLodash.js create mode 100644 node_modules/lodash-es/wrapperReverse.js create mode 100644 node_modules/lodash-es/wrapperValue.js create mode 100644 node_modules/lodash-es/xor.js create mode 100644 node_modules/lodash-es/xorBy.js create mode 100644 node_modules/lodash-es/xorWith.js create mode 100644 node_modules/lodash-es/zip.js create mode 100644 node_modules/lodash-es/zipObject.js create mode 100644 node_modules/lodash-es/zipObjectDeep.js create mode 100644 node_modules/lodash-es/zipWith.js create mode 100644 node_modules/media-typer/HISTORY.md create mode 100644 node_modules/media-typer/LICENSE create mode 100644 node_modules/media-typer/README.md create mode 100644 node_modules/media-typer/index.js create mode 100644 node_modules/media-typer/package.json create mode 100644 node_modules/merge-descriptors/HISTORY.md create mode 100644 node_modules/merge-descriptors/LICENSE create mode 100644 node_modules/merge-descriptors/README.md create mode 100644 node_modules/merge-descriptors/index.js create mode 100644 node_modules/merge-descriptors/package.json create mode 100644 node_modules/methods/HISTORY.md create mode 100644 node_modules/methods/LICENSE create mode 100644 node_modules/methods/README.md create mode 100644 node_modules/methods/index.js create mode 100644 node_modules/methods/package.json create mode 100644 node_modules/mime-db/HISTORY.md create mode 100644 node_modules/mime-db/LICENSE create mode 100644 node_modules/mime-db/README.md create mode 100644 node_modules/mime-db/db.json create mode 100644 node_modules/mime-db/index.js create mode 100644 node_modules/mime-db/package.json create mode 100644 node_modules/mime-types/HISTORY.md create mode 100644 node_modules/mime-types/LICENSE create mode 100644 node_modules/mime-types/README.md create mode 100644 node_modules/mime-types/index.js create mode 100644 node_modules/mime-types/package.json create mode 100644 node_modules/mime/.npmignore create mode 100644 node_modules/mime/CHANGELOG.md create mode 100644 node_modules/mime/LICENSE create mode 100644 node_modules/mime/README.md create mode 100755 node_modules/mime/cli.js create mode 100644 node_modules/mime/mime.js create mode 100644 node_modules/mime/package.json create mode 100755 node_modules/mime/src/build.js create mode 100644 node_modules/mime/src/test.js create mode 100644 node_modules/mime/types.json create mode 100644 node_modules/ms/index.js create mode 100644 node_modules/ms/license.md create mode 100644 node_modules/ms/package.json create mode 100644 node_modules/ms/readme.md create mode 100644 node_modules/negotiator/HISTORY.md create mode 100644 node_modules/negotiator/LICENSE create mode 100644 node_modules/negotiator/README.md create mode 100644 node_modules/negotiator/index.js create mode 100644 node_modules/negotiator/lib/charset.js create mode 100644 node_modules/negotiator/lib/encoding.js create mode 100644 node_modules/negotiator/lib/language.js create mode 100644 node_modules/negotiator/lib/mediaType.js create mode 100644 node_modules/negotiator/package.json create mode 100644 node_modules/object-inspect/.eslintrc create mode 100644 node_modules/object-inspect/.github/FUNDING.yml create mode 100644 node_modules/object-inspect/.nycrc create mode 100644 node_modules/object-inspect/CHANGELOG.md create mode 100644 node_modules/object-inspect/LICENSE create mode 100644 node_modules/object-inspect/example/all.js create mode 100644 node_modules/object-inspect/example/circular.js create mode 100644 node_modules/object-inspect/example/fn.js create mode 100644 node_modules/object-inspect/example/inspect.js create mode 100644 node_modules/object-inspect/index.js create mode 100644 node_modules/object-inspect/package-support.json create mode 100644 node_modules/object-inspect/package.json create mode 100644 node_modules/object-inspect/readme.markdown create mode 100644 node_modules/object-inspect/test-core-js.js create mode 100644 node_modules/object-inspect/test/bigint.js create mode 100644 node_modules/object-inspect/test/browser/dom.js create mode 100644 node_modules/object-inspect/test/circular.js create mode 100644 node_modules/object-inspect/test/deep.js create mode 100644 node_modules/object-inspect/test/element.js create mode 100644 node_modules/object-inspect/test/err.js create mode 100644 node_modules/object-inspect/test/fakes.js create mode 100644 node_modules/object-inspect/test/fn.js create mode 100644 node_modules/object-inspect/test/global.js create mode 100644 node_modules/object-inspect/test/has.js create mode 100644 node_modules/object-inspect/test/holes.js create mode 100644 node_modules/object-inspect/test/indent-option.js create mode 100644 node_modules/object-inspect/test/inspect.js create mode 100644 node_modules/object-inspect/test/lowbyte.js create mode 100644 node_modules/object-inspect/test/number.js create mode 100644 node_modules/object-inspect/test/quoteStyle.js create mode 100644 node_modules/object-inspect/test/toStringTag.js create mode 100644 node_modules/object-inspect/test/undef.js create mode 100644 node_modules/object-inspect/test/values.js create mode 100644 node_modules/object-inspect/util.inspect.js create mode 100644 node_modules/on-finished/HISTORY.md create mode 100644 node_modules/on-finished/LICENSE create mode 100644 node_modules/on-finished/README.md create mode 100644 node_modules/on-finished/index.js create mode 100644 node_modules/on-finished/package.json create mode 100644 node_modules/parseurl/HISTORY.md create mode 100644 node_modules/parseurl/LICENSE create mode 100644 node_modules/parseurl/README.md create mode 100644 node_modules/parseurl/index.js create mode 100644 node_modules/parseurl/package.json create mode 100644 node_modules/path-to-regexp/History.md create mode 100644 node_modules/path-to-regexp/LICENSE create mode 100644 node_modules/path-to-regexp/Readme.md create mode 100644 node_modules/path-to-regexp/index.js create mode 100644 node_modules/path-to-regexp/package.json create mode 100644 node_modules/proxy-addr/HISTORY.md create mode 100644 node_modules/proxy-addr/LICENSE create mode 100644 node_modules/proxy-addr/README.md create mode 100644 node_modules/proxy-addr/index.js create mode 100644 node_modules/proxy-addr/package.json create mode 100644 node_modules/qs/.editorconfig create mode 100644 node_modules/qs/.eslintrc create mode 100644 node_modules/qs/.github/FUNDING.yml create mode 100644 node_modules/qs/.nycrc create mode 100644 node_modules/qs/CHANGELOG.md create mode 100644 node_modules/qs/LICENSE.md create mode 100644 node_modules/qs/README.md create mode 100644 node_modules/qs/dist/qs.js create mode 100644 node_modules/qs/lib/formats.js create mode 100644 node_modules/qs/lib/index.js create mode 100644 node_modules/qs/lib/parse.js create mode 100644 node_modules/qs/lib/stringify.js create mode 100644 node_modules/qs/lib/utils.js create mode 100644 node_modules/qs/package.json create mode 100644 node_modules/qs/test/parse.js create mode 100644 node_modules/qs/test/stringify.js create mode 100644 node_modules/qs/test/utils.js create mode 100644 node_modules/range-parser/HISTORY.md create mode 100644 node_modules/range-parser/LICENSE create mode 100644 node_modules/range-parser/README.md create mode 100644 node_modules/range-parser/index.js create mode 100644 node_modules/range-parser/package.json create mode 100644 node_modules/raw-body/HISTORY.md create mode 100644 node_modules/raw-body/LICENSE create mode 100644 node_modules/raw-body/README.md create mode 100644 node_modules/raw-body/SECURITY.md create mode 100644 node_modules/raw-body/index.d.ts create mode 100644 node_modules/raw-body/index.js create mode 100644 node_modules/raw-body/package.json create mode 100644 node_modules/safe-buffer/LICENSE create mode 100644 node_modules/safe-buffer/README.md create mode 100644 node_modules/safe-buffer/index.d.ts create mode 100644 node_modules/safe-buffer/index.js create mode 100644 node_modules/safe-buffer/package.json create mode 100644 node_modules/safer-buffer/LICENSE create mode 100644 node_modules/safer-buffer/Porting-Buffer.md create mode 100644 node_modules/safer-buffer/Readme.md create mode 100644 node_modules/safer-buffer/dangerous.js create mode 100644 node_modules/safer-buffer/package.json create mode 100644 node_modules/safer-buffer/safer.js create mode 100644 node_modules/safer-buffer/tests.js create mode 100644 node_modules/send/HISTORY.md create mode 100644 node_modules/send/LICENSE create mode 100644 node_modules/send/README.md create mode 100644 node_modules/send/SECURITY.md create mode 100644 node_modules/send/index.js create mode 100644 node_modules/send/node_modules/ms/index.js create mode 100644 node_modules/send/node_modules/ms/license.md create mode 100644 node_modules/send/node_modules/ms/package.json create mode 100644 node_modules/send/node_modules/ms/readme.md create mode 100644 node_modules/send/package.json create mode 100644 node_modules/serve-static/HISTORY.md create mode 100644 node_modules/serve-static/LICENSE create mode 100644 node_modules/serve-static/README.md create mode 100644 node_modules/serve-static/index.js create mode 100644 node_modules/serve-static/package.json create mode 100644 node_modules/set-function-length/.eslintrc create mode 100644 node_modules/set-function-length/.github/FUNDING.yml create mode 100644 node_modules/set-function-length/.nycrc create mode 100644 node_modules/set-function-length/CHANGELOG.md create mode 100644 node_modules/set-function-length/LICENSE create mode 100644 node_modules/set-function-length/README.md create mode 100644 node_modules/set-function-length/env.d.ts create mode 100644 node_modules/set-function-length/env.js create mode 100644 node_modules/set-function-length/index.d.ts create mode 100644 node_modules/set-function-length/index.js create mode 100644 node_modules/set-function-length/package.json create mode 100644 node_modules/set-function-length/tsconfig.json create mode 100644 node_modules/setprototypeof/LICENSE create mode 100644 node_modules/setprototypeof/README.md create mode 100644 node_modules/setprototypeof/index.d.ts create mode 100644 node_modules/setprototypeof/index.js create mode 100644 node_modules/setprototypeof/package.json create mode 100644 node_modules/setprototypeof/test/index.js create mode 100644 node_modules/side-channel/.editorconfig create mode 100644 node_modules/side-channel/.eslintrc create mode 100644 node_modules/side-channel/.github/FUNDING.yml create mode 100644 node_modules/side-channel/.nycrc create mode 100644 node_modules/side-channel/CHANGELOG.md create mode 100644 node_modules/side-channel/LICENSE create mode 100644 node_modules/side-channel/README.md create mode 100644 node_modules/side-channel/index.d.ts create mode 100644 node_modules/side-channel/index.js create mode 100644 node_modules/side-channel/package.json create mode 100644 node_modules/side-channel/test/index.js create mode 100644 node_modules/side-channel/tsconfig.json create mode 100644 node_modules/statuses/HISTORY.md create mode 100644 node_modules/statuses/LICENSE create mode 100644 node_modules/statuses/README.md create mode 100644 node_modules/statuses/codes.json create mode 100644 node_modules/statuses/index.js create mode 100644 node_modules/statuses/package.json create mode 100644 node_modules/toidentifier/HISTORY.md create mode 100644 node_modules/toidentifier/LICENSE create mode 100644 node_modules/toidentifier/README.md create mode 100644 node_modules/toidentifier/index.js create mode 100644 node_modules/toidentifier/package.json create mode 100644 node_modules/type-is/HISTORY.md create mode 100644 node_modules/type-is/LICENSE create mode 100644 node_modules/type-is/README.md create mode 100644 node_modules/type-is/index.js create mode 100644 node_modules/type-is/package.json create mode 100644 node_modules/unpipe/HISTORY.md create mode 100644 node_modules/unpipe/LICENSE create mode 100644 node_modules/unpipe/README.md create mode 100644 node_modules/unpipe/index.js create mode 100644 node_modules/unpipe/package.json create mode 100644 node_modules/utils-merge/.npmignore create mode 100644 node_modules/utils-merge/LICENSE create mode 100644 node_modules/utils-merge/README.md create mode 100644 node_modules/utils-merge/index.js create mode 100644 node_modules/utils-merge/package.json create mode 100644 node_modules/vanilla-colorful/ACKNOWLEDGMENTS create mode 100644 node_modules/vanilla-colorful/LICENSE create mode 100644 node_modules/vanilla-colorful/README.md create mode 100644 node_modules/vanilla-colorful/custom-elements.json create mode 100644 node_modules/vanilla-colorful/hex-alpha-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hex-alpha-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hex-alpha-color-picker.js create mode 100644 node_modules/vanilla-colorful/hex-alpha-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hex-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hex-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hex-color-picker.js create mode 100644 node_modules/vanilla-colorful/hex-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hex-input.d.ts create mode 100644 node_modules/vanilla-colorful/hex-input.d.ts.map create mode 100644 node_modules/vanilla-colorful/hex-input.js create mode 100644 node_modules/vanilla-colorful/hex-input.js.map create mode 100644 node_modules/vanilla-colorful/hsl-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsl-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsl-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsl-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsl-string-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsl-string-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsl-string-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsl-string-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsla-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsla-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsla-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsla-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsla-string-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsla-string-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsla-string-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsla-string-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsv-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsv-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsv-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsv-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsv-string-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsv-string-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsv-string-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsv-string-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsva-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsva-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsva-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsva-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/hsva-string-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/hsva-string-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/hsva-string-color-picker.js create mode 100644 node_modules/vanilla-colorful/hsva-string-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/lib/components/alpha-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/lib/components/alpha-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/components/alpha-color-picker.js create mode 100644 node_modules/vanilla-colorful/lib/components/alpha-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/lib/components/alpha.d.ts create mode 100644 node_modules/vanilla-colorful/lib/components/alpha.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/components/alpha.js create mode 100644 node_modules/vanilla-colorful/lib/components/alpha.js.map create mode 100644 node_modules/vanilla-colorful/lib/components/color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/lib/components/color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/components/color-picker.js create mode 100644 node_modules/vanilla-colorful/lib/components/color-picker.js.map create mode 100644 node_modules/vanilla-colorful/lib/components/hue.d.ts create mode 100644 node_modules/vanilla-colorful/lib/components/hue.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/components/hue.js create mode 100644 node_modules/vanilla-colorful/lib/components/hue.js.map create mode 100644 node_modules/vanilla-colorful/lib/components/saturation.d.ts create mode 100644 node_modules/vanilla-colorful/lib/components/saturation.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/components/saturation.js create mode 100644 node_modules/vanilla-colorful/lib/components/saturation.js.map create mode 100644 node_modules/vanilla-colorful/lib/components/slider.d.ts create mode 100644 node_modules/vanilla-colorful/lib/components/slider.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/components/slider.js create mode 100644 node_modules/vanilla-colorful/lib/components/slider.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-alpha.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-alpha.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-alpha.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-alpha.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-input.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-input.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-input.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex-input.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hex.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl-string.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl-string.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl-string.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl-string.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsl.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla-string.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla-string.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla-string.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla-string.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsla.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv-string.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv-string.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv-string.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv-string.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsv.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva-string.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva-string.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva-string.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva-string.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/hsva.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb-string.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb-string.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb-string.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb-string.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgb.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba-string.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba-string.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba-string.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba-string.js.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba.d.ts create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba.js create mode 100644 node_modules/vanilla-colorful/lib/entrypoints/rgba.js.map create mode 100644 node_modules/vanilla-colorful/lib/styles/alpha.d.ts create mode 100644 node_modules/vanilla-colorful/lib/styles/alpha.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/styles/alpha.js create mode 100644 node_modules/vanilla-colorful/lib/styles/alpha.js.map create mode 100644 node_modules/vanilla-colorful/lib/styles/color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/lib/styles/color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/styles/color-picker.js create mode 100644 node_modules/vanilla-colorful/lib/styles/color-picker.js.map create mode 100644 node_modules/vanilla-colorful/lib/styles/hue.d.ts create mode 100644 node_modules/vanilla-colorful/lib/styles/hue.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/styles/hue.js create mode 100644 node_modules/vanilla-colorful/lib/styles/hue.js.map create mode 100644 node_modules/vanilla-colorful/lib/styles/saturation.d.ts create mode 100644 node_modules/vanilla-colorful/lib/styles/saturation.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/styles/saturation.js create mode 100644 node_modules/vanilla-colorful/lib/styles/saturation.js.map create mode 100644 node_modules/vanilla-colorful/lib/types.d.ts create mode 100644 node_modules/vanilla-colorful/lib/types.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/types.js create mode 100644 node_modules/vanilla-colorful/lib/types.js.map create mode 100644 node_modules/vanilla-colorful/lib/utils/compare.d.ts create mode 100644 node_modules/vanilla-colorful/lib/utils/compare.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/utils/compare.js create mode 100644 node_modules/vanilla-colorful/lib/utils/compare.js.map create mode 100644 node_modules/vanilla-colorful/lib/utils/convert.d.ts create mode 100644 node_modules/vanilla-colorful/lib/utils/convert.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/utils/convert.js create mode 100644 node_modules/vanilla-colorful/lib/utils/convert.js.map create mode 100644 node_modules/vanilla-colorful/lib/utils/dom.d.ts create mode 100644 node_modules/vanilla-colorful/lib/utils/dom.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/utils/dom.js create mode 100644 node_modules/vanilla-colorful/lib/utils/dom.js.map create mode 100644 node_modules/vanilla-colorful/lib/utils/math.d.ts create mode 100644 node_modules/vanilla-colorful/lib/utils/math.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/utils/math.js create mode 100644 node_modules/vanilla-colorful/lib/utils/math.js.map create mode 100644 node_modules/vanilla-colorful/lib/utils/validate.d.ts create mode 100644 node_modules/vanilla-colorful/lib/utils/validate.d.ts.map create mode 100644 node_modules/vanilla-colorful/lib/utils/validate.js create mode 100644 node_modules/vanilla-colorful/lib/utils/validate.js.map create mode 100644 node_modules/vanilla-colorful/package.json create mode 100644 node_modules/vanilla-colorful/rgb-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/rgb-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/rgb-color-picker.js create mode 100644 node_modules/vanilla-colorful/rgb-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/rgb-string-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/rgb-string-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/rgb-string-color-picker.js create mode 100644 node_modules/vanilla-colorful/rgb-string-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/rgba-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/rgba-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/rgba-color-picker.js create mode 100644 node_modules/vanilla-colorful/rgba-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/rgba-string-color-picker.d.ts create mode 100644 node_modules/vanilla-colorful/rgba-string-color-picker.d.ts.map create mode 100644 node_modules/vanilla-colorful/rgba-string-color-picker.js create mode 100644 node_modules/vanilla-colorful/rgba-string-color-picker.js.map create mode 100644 node_modules/vanilla-colorful/web-types.json create mode 100644 node_modules/vanilla-colorful/web-types.lit.json create mode 100644 node_modules/vary/HISTORY.md create mode 100644 node_modules/vary/LICENSE create mode 100644 node_modules/vary/README.md create mode 100644 node_modules/vary/index.js create mode 100644 node_modules/vary/package.json delete mode 100644 onepage-index-1.html delete mode 100644 onepage-index-2.html delete mode 100644 onepage-index-3.html create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 project-details.html delete mode 100644 project.html rename 404.html => public/404.html (100%) rename about.html => public/about.html (100%) rename {assets => public/assets}/css/default.css (100%) rename {assets => public/assets}/css/responsive.css (100%) rename {assets => public/assets}/css/style.css (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.css (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.eot (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.html (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.scss (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.svg (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.ttf (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.woff (100%) rename {assets => public/assets}/fonts/flaticon/flaticon.woff2 (100%) rename {assets => public/assets}/fonts/fontawesome/css/all.min.css (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-brands-400.eot (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-brands-400.ttf (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-brands-400.woff (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-brands-400.woff2 (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-light-300.eot (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-light-300.ttf (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-light-300.woff (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-light-300.woff2 (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-regular-400.eot (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-regular-400.ttf (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-regular-400.woff (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-regular-400.woff2 (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-solid-900.eot (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-solid-900.ttf (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-solid-900.woff (100%) rename {assets => public/assets}/fonts/fontawesome/webfonts/fa-solid-900.woff2 (100%) rename {assets => public/assets}/images/about/2 persons.png (100%) rename {assets => public/assets}/images/about/3 persons.png (100%) rename {assets => public/assets}/images/about/about-1.jpg (100%) rename {assets => public/assets}/images/about/about-2.png (100%) rename {assets => public/assets}/images/about/about-3.jpg (100%) rename {assets => public/assets}/images/about/about-4.png (100%) rename {assets => public/assets}/images/about/growth.png (100%) rename {assets => public/assets}/images/about/hands.png (100%) rename {assets => public/assets}/images/about/illustration 4.png (100%) rename {assets => public/assets}/images/about/img-4.jpg (100%) rename {assets => public/assets}/images/about/img-5.png (100%) rename {assets => public/assets}/images/about/img-6.png (100%) rename {assets => public/assets}/images/agri.png (100%) rename {assets => public/assets}/images/bar.png (100%) rename {assets => public/assets}/images/blog/author-1.jpg (100%) rename {assets => public/assets}/images/blog/blog-bg-1.jpg (100%) rename {assets => public/assets}/images/blog/blog-single-1.jpg (100%) rename {assets => public/assets}/images/blog/blog-single-2.jpg (100%) rename {assets => public/assets}/images/blog/comment-1.jpg (100%) rename {assets => public/assets}/images/blog/comment-2.jpg (100%) rename {assets => public/assets}/images/blog/comment-3.jpg (100%) rename {assets => public/assets}/images/blog/img-1.jpg (100%) rename {assets => public/assets}/images/blog/img-2.jpg (100%) rename {assets => public/assets}/images/blog/img-3.jpg (100%) rename {assets => public/assets}/images/blog/standard-1.jpg (100%) rename {assets => public/assets}/images/blog/standard-2.jpg (100%) rename {assets => public/assets}/images/blog/standard-3.jpg (100%) rename {assets => public/assets}/images/blog/standard-4.jpg (100%) rename {assets => public/assets}/images/border-1.png (100%) rename {assets => public/assets}/images/border-2.png (100%) rename {assets => public/assets}/images/breadcrumb/3 personssss.png (100%) rename {assets => public/assets}/images/breadcrumb/img-1.jpg (100%) rename {assets => public/assets}/images/breadcrumb/img-2.jpg (100%) rename {assets => public/assets}/images/breadcrumb/img-3.jpg (100%) rename {assets => public/assets}/images/breadcrumb/laptopppp.png (100%) rename {assets => public/assets}/images/contact/conatct man.png (100%) rename {assets => public/assets}/images/contact/contact-1.jpg (100%) rename {assets => public/assets}/images/cta/3......png (100%) rename {assets => public/assets}/images/cta/img-1.jpg (100%) rename {assets => public/assets}/images/cta/img-2.png (100%) rename {assets => public/assets}/images/dot.png (100%) rename {assets => public/assets}/images/favicon.ico (100%) rename {assets => public/assets}/images/footer/footer-page-bg-1.png (100%) rename {assets => public/assets}/images/footer/footer-page-bg-2.png (100%) rename {assets => public/assets}/images/hero/dot-pattern.png (100%) rename {assets => public/assets}/images/hero/hereeeeeeeeeeeeeeeeeeeee.png (100%) rename {assets => public/assets}/images/hero/hero-.jpeg (100%) rename {assets => public/assets}/images/hero/hero-one-img-1.jpg (100%) rename {assets => public/assets}/images/hero/hero-one-img-2.jpg (100%) rename {assets => public/assets}/images/hero/hero-one-img.jpg (100%) rename {assets => public/assets}/images/hero/hero-pattern.png (100%) rename {assets => public/assets}/images/hero/hero-three-img-1-1.png (100%) rename {assets => public/assets}/images/hero/hero-two-img-1.png (100%) rename {assets => public/assets}/images/hero/hero-two-shape-1.png (100%) rename {assets => public/assets}/images/hero/hero-two-shape-2.png (100%) rename {assets => public/assets}/images/hero/hero-two-shape-3.png (100%) rename {assets => public/assets}/images/hero/shape-1.png (100%) rename {assets => public/assets}/images/hero/shape-2.png (100%) rename {assets => public/assets}/images/icon/icon-1.png (100%) rename {assets => public/assets}/images/icon/icon-10.png (100%) rename {assets => public/assets}/images/icon/icon-11.png (100%) rename {assets => public/assets}/images/icon/icon-12.png (100%) rename {assets => public/assets}/images/icon/icon-13.png (100%) rename {assets => public/assets}/images/icon/icon-14.png (100%) rename {assets => public/assets}/images/icon/icon-15.png (100%) rename {assets => public/assets}/images/icon/icon-16.png (100%) rename {assets => public/assets}/images/icon/icon-17.png (100%) rename {assets => public/assets}/images/icon/icon-18.png (100%) rename {assets => public/assets}/images/icon/icon-19.png (100%) rename {assets => public/assets}/images/icon/icon-2.png (100%) rename {assets => public/assets}/images/icon/icon-20.png (100%) rename {assets => public/assets}/images/icon/icon-21.png (100%) rename {assets => public/assets}/images/icon/icon-22.png (100%) rename {assets => public/assets}/images/icon/icon-3.png (100%) rename {assets => public/assets}/images/icon/icon-4.png (100%) rename {assets => public/assets}/images/icon/icon-5.png (100%) rename {assets => public/assets}/images/icon/icon-6.png (100%) rename {assets => public/assets}/images/icon/icon-7.png (100%) rename {assets => public/assets}/images/icon/icon-8.png (100%) rename {assets => public/assets}/images/icon/icon-9.png (100%) rename {assets => public/assets}/images/line.png (100%) rename {assets => public/assets}/images/logo/Heading-removebg-preview.png (100%) rename {assets => public/assets}/images/logo/Untitled_design-removebg-preview.png (100%) rename {assets => public/assets}/images/logo/footer-logo-1.png (100%) rename {assets => public/assets}/images/logo/footer-logo-2.png (100%) rename {assets => public/assets}/images/logo/logo-1.png (100%) rename {assets => public/assets}/images/map.png (100%) rename {assets => public/assets}/images/partners/img-1.png (100%) rename {assets => public/assets}/images/partners/img-10.png (100%) rename {assets => public/assets}/images/partners/img-11.png (100%) rename {assets => public/assets}/images/partners/img-12.png (100%) rename {assets => public/assets}/images/partners/img-13.png (100%) rename {assets => public/assets}/images/partners/img-14.png (100%) rename {assets => public/assets}/images/partners/img-15.png (100%) rename {assets => public/assets}/images/partners/img-16.png (100%) rename {assets => public/assets}/images/partners/img-2.png (100%) rename {assets => public/assets}/images/partners/img-3.png (100%) rename {assets => public/assets}/images/partners/img-4.png (100%) rename {assets => public/assets}/images/partners/img-5.png (100%) rename {assets => public/assets}/images/partners/img-6.png (100%) rename {assets => public/assets}/images/partners/img-7.png (100%) rename {assets => public/assets}/images/partners/img-8.png (100%) rename {assets => public/assets}/images/partners/img-9.png (100%) rename {assets => public/assets}/images/portfolio/agri.png (100%) rename {assets => public/assets}/images/portfolio/atoz.png (100%) rename {assets => public/assets}/images/portfolio/humbee.png (100%) rename {assets => public/assets}/images/portfolio/icon-1.png (100%) rename {assets => public/assets}/images/portfolio/img-1.jpg (100%) rename {assets => public/assets}/images/portfolio/img-10.jpg (100%) rename {assets => public/assets}/images/portfolio/img-11.jpg (100%) rename {assets => public/assets}/images/portfolio/img-12.jpg (100%) rename {assets => public/assets}/images/portfolio/img-13.jpg (100%) rename {assets => public/assets}/images/portfolio/img-14.jpg (100%) rename {assets => public/assets}/images/portfolio/img-15.jpg (100%) rename {assets => public/assets}/images/portfolio/img-16.jpg (100%) rename {assets => public/assets}/images/portfolio/img-17.jpg (100%) rename {assets => public/assets}/images/portfolio/img-18.jpg (100%) rename {assets => public/assets}/images/portfolio/img-19.jpg (100%) rename {assets => public/assets}/images/portfolio/img-2.jpg (100%) rename {assets => public/assets}/images/portfolio/img-20.jpg (100%) rename {assets => public/assets}/images/portfolio/img-3.jpg (100%) rename {assets => public/assets}/images/portfolio/img-4.jpg (100%) rename {assets => public/assets}/images/portfolio/img-5.jpg (100%) rename {assets => public/assets}/images/portfolio/img-6.jpg (100%) rename {assets => public/assets}/images/portfolio/img-7.jpg (100%) rename {assets => public/assets}/images/portfolio/img-8.jpg (100%) rename {assets => public/assets}/images/portfolio/img-9.jpg (100%) rename {assets => public/assets}/images/portfolio/luxiee.png (100%) rename {assets => public/assets}/images/portfolio/panind.png (100%) rename {assets => public/assets}/images/portfolio/single-img-1.jpg (100%) rename {assets => public/assets}/images/portfolio/thumb-1.jpg (100%) rename {assets => public/assets}/images/portfolio/thumb-2.jpg (100%) rename {assets => public/assets}/images/portfolio/videostar.png (100%) rename {assets => public/assets}/images/shape/bg-shape-1.png (100%) rename {assets => public/assets}/images/shape/bg-shape-2.png (100%) rename {assets => public/assets}/images/shape/circle-logo-1.png (100%) rename {assets => public/assets}/images/shape/circle-logo-2.png (100%) rename {assets => public/assets}/images/shape/line-2.png (100%) rename {assets => public/assets}/images/shape/line-3.png (100%) rename {assets => public/assets}/images/shape/line.png (100%) rename {assets => public/assets}/images/shape/pattern-shape-1.png (100%) rename {assets => public/assets}/images/shape/pattern-shape-2.png (100%) rename {assets => public/assets}/images/shape/shape-1.png (100%) rename {assets => public/assets}/images/shape/shape-10.png (100%) rename {assets => public/assets}/images/shape/shape-11.png (100%) rename {assets => public/assets}/images/shape/shape-12.png (100%) rename {assets => public/assets}/images/shape/shape-13.png (100%) rename {assets => public/assets}/images/shape/shape-14.png (100%) rename {assets => public/assets}/images/shape/shape-15.png (100%) rename {assets => public/assets}/images/shape/shape-16.png (100%) rename {assets => public/assets}/images/shape/shape-17.png (100%) rename {assets => public/assets}/images/shape/shape-18.png (100%) rename {assets => public/assets}/images/shape/shape-19.png (100%) rename {assets => public/assets}/images/shape/shape-2.png (100%) rename {assets => public/assets}/images/shape/shape-20.png (100%) rename {assets => public/assets}/images/shape/shape-3.png (100%) rename {assets => public/assets}/images/shape/shape-4.png (100%) rename {assets => public/assets}/images/shape/shape-5.png (100%) rename {assets => public/assets}/images/shape/shape-6.png (100%) rename {assets => public/assets}/images/shape/shape-7.png (100%) rename {assets => public/assets}/images/shape/shape-8.png (100%) rename {assets => public/assets}/images/shape/shape-9.png (100%) rename {assets => public/assets}/images/skill/img-1.jpg (100%) rename {assets => public/assets}/images/skill/img-2.jpg (100%) rename {assets => public/assets}/images/team/img-1.jpg (100%) rename {assets => public/assets}/images/team/img-10.jpg (100%) rename {assets => public/assets}/images/team/img-11.jpg (100%) rename {assets => public/assets}/images/team/img-2.jpg (100%) rename {assets => public/assets}/images/team/img-3.jpg (100%) rename {assets => public/assets}/images/team/img-4.jpg (100%) rename {assets => public/assets}/images/team/img-5.jpg (100%) rename {assets => public/assets}/images/team/img-6.jpg (100%) rename {assets => public/assets}/images/team/img-7.jpg (100%) rename {assets => public/assets}/images/team/img-8.jpg (100%) rename {assets => public/assets}/images/team/img-9.jpg (100%) rename {assets => public/assets}/images/team/single-img-1.jpg (100%) rename {assets => public/assets}/images/team/team-img.png (100%) rename {assets => public/assets}/images/testimonial/happy girl.png (100%) rename {assets => public/assets}/images/testimonial/img-1.jpg (100%) rename {assets => public/assets}/images/testimonial/img-2.jpg (100%) rename {assets => public/assets}/images/testimonial/img-3.jpg (100%) rename {assets => public/assets}/images/testimonial/img-4.png (100%) rename {assets => public/assets}/images/testimonial/thumb-1.jpg (100%) rename {assets => public/assets}/images/testimonial/thumb-2.jpg (100%) rename {assets => public/assets}/images/testimonial/working mann.png (100%) rename {assets => public/assets}/images/video/img-1.jpg (100%) rename {assets => public/assets}/images/widget/contact-1.jpg (100%) rename {assets => public/assets}/images/widget/contact-2.png (100%) rename {assets => public/assets}/images/widget/news-1.jpg (100%) rename {assets => public/assets}/images/widget/news-2.jpg (100%) rename {assets => public/assets}/images/widget/news-3.jpg (100%) rename {assets => public/assets}/js/theme.js (100%) rename {assets => public/assets}/vendor/animate.css (100%) rename {assets => public/assets}/vendor/bootstrap/css/bootstrap.min.css (100%) rename {assets => public/assets}/vendor/bootstrap/js/bootstrap.min.js (100%) rename {assets => public/assets}/vendor/imagesloaded.min.js (100%) rename {assets => public/assets}/vendor/isotope.min.js (100%) rename {assets => public/assets}/vendor/jquery-3.6.0.min.js (100%) rename {assets => public/assets}/vendor/jquery.counterup.min.js (100%) rename {assets => public/assets}/vendor/jquery.waypoints.js (100%) rename {assets => public/assets}/vendor/magnific-popup/dist/jquery.magnific-popup.min.js (100%) rename {assets => public/assets}/vendor/magnific-popup/dist/magnific-popup.css (100%) rename {assets => public/assets}/vendor/nice-select/css/nice-select.css (100%) rename {assets => public/assets}/vendor/nice-select/js/jquery.nice-select.min.js (100%) rename {assets => public/assets}/vendor/parallax.min.js (100%) rename {assets => public/assets}/vendor/popper/popper.min.js (100%) rename {assets => public/assets}/vendor/slick/slick.css (100%) rename {assets => public/assets}/vendor/slick/slick.min.js (100%) rename {assets => public/assets}/vendor/wow.min.js (100%) rename blog-details.html => public/blog-details.html (100%) rename blogs.html => public/blogs.html (100%) rename contact.html => public/contact.html (100%) rename {css => public/css}/bootstrap.min.css (100%) rename {css => public/css}/style.css (100%) rename {img => public/img}/Agri Fiance.png (100%) rename {img => public/img}/AtoZ (2).png (100%) rename {img => public/img}/Atoz.png (100%) rename {img => public/img}/Atoz1.png (100%) rename {img => public/img}/PAN.png (100%) rename {img => public/img}/Videostar.png (100%) rename {img => public/img}/WEBBB (1) (1).png (100%) rename {img => public/img}/about-us illustration.jpeg (100%) rename {img => public/img}/about.png (100%) rename {img => public/img}/bg-bottom.png (100%) rename {img => public/img}/bg-top.png (100%) rename {img => public/img}/blob-bottom-left.png (100%) rename {img => public/img}/blob-bottom-right.png (100%) rename {img => public/img}/blob-center.png (100%) rename {img => public/img}/blob-primary.png (100%) rename {img => public/img}/blob-secondary.png (100%) rename {img => public/img}/blob-top-left.png (100%) rename {img => public/img}/blob-top-right.png (100%) rename {img => public/img}/blob-white.png (100%) rename {img => public/img}/card1.png (100%) rename {img => public/img}/hero.png (100%) rename {img => public/img}/logo-for.jpeg (100%) rename {img => public/img}/logoNS.png (100%) rename {img => public/img}/map.png (100%) rename {img => public/img}/portfolio-1.jpg (100%) rename {img => public/img}/portfolio-2.jpg (100%) rename {img => public/img}/portfolio-3.jpg (100%) rename {img => public/img}/portfolio-4.jpg (100%) rename {img => public/img}/portfolio-5.jpg (100%) rename {img => public/img}/portfolio-6.jpg (100%) rename {img => public/img}/sand.png (100%) rename {img => public/img}/service-1.png (100%) rename {img => public/img}/service-2.png (100%) rename {img => public/img}/service-3.png (100%) rename {img => public/img}/service-4.png (100%) rename {img => public/img}/team-1.jpg (100%) rename {img => public/img}/team-2.jpg (100%) rename {img => public/img}/team-3.jpg (100%) rename {img => public/img}/testimonial-1.jpg (100%) rename {img => public/img}/testimonial-2.jpg (100%) rename {img => public/img}/testimonial-3.jpg (100%) rename {img => public/img}/testimonial-4.jpg (100%) rename {img => public/img}/user.png (100%) rename {img => public/img}/webGenixIcon-removebg-preview.ico (100%) rename {img => public/img}/webGenixLogo-removebg-preview.ico (100%) rename index.html => public/index.html (100%) rename {js => public/js}/main.js (100%) rename {lib => public/lib}/animate/animate.css (100%) rename {lib => public/lib}/animate/animate.min.css (100%) rename {lib => public/lib}/counterup/counterup.min.js (100%) rename {lib => public/lib}/easing/easing.js (100%) rename {lib => public/lib}/easing/easing.min.js (100%) rename {lib => public/lib}/isotope/isotope.pkgd.js (100%) rename {lib => public/lib}/isotope/isotope.pkgd.min.js (100%) rename {lib => public/lib}/lightbox/css/lightbox.css (100%) rename {lib => public/lib}/lightbox/css/lightbox.min.css (100%) rename {lib => public/lib}/lightbox/images/close.png (100%) rename {lib => public/lib}/lightbox/images/loading.gif (100%) rename {lib => public/lib}/lightbox/images/next.png (100%) rename {lib => public/lib}/lightbox/images/prev.png (100%) rename {lib => public/lib}/lightbox/js/lightbox.js (100%) rename {lib => public/lib}/lightbox/js/lightbox.min.js (100%) rename {lib => public/lib}/lightbox/links.php (100%) rename {lib => public/lib}/owlcarousel/LICENSE (100%) rename {lib => public/lib}/owlcarousel/assets/ajax-loader.gif (100%) rename {lib => public/lib}/owlcarousel/assets/owl.carousel.css (100%) rename {lib => public/lib}/owlcarousel/assets/owl.carousel.min.css (100%) rename {lib => public/lib}/owlcarousel/assets/owl.theme.default.css (100%) rename {lib => public/lib}/owlcarousel/assets/owl.theme.default.min.css (100%) rename {lib => public/lib}/owlcarousel/assets/owl.theme.green.css (100%) rename {lib => public/lib}/owlcarousel/assets/owl.theme.green.min.css (100%) rename {lib => public/lib}/owlcarousel/assets/owl.video.play.png (100%) rename {lib => public/lib}/owlcarousel/owl.carousel.js (100%) rename {lib => public/lib}/owlcarousel/owl.carousel.min.js (100%) rename {lib => public/lib}/waypoints/links.php (100%) rename {lib => public/lib}/waypoints/waypoints.min.js (100%) rename {lib => public/lib}/wow/wow.js (100%) rename {lib => public/lib}/wow/wow.min.js (100%) rename projects.html => public/projects.html (100%) rename {scss => public/scss}/bootstrap.scss (100%) rename {scss => public/scss}/bootstrap/scss/_accordion.scss (100%) rename {scss => public/scss}/bootstrap/scss/_alert.scss (100%) rename {scss => public/scss}/bootstrap/scss/_badge.scss (100%) rename {scss => public/scss}/bootstrap/scss/_breadcrumb.scss (100%) rename {scss => public/scss}/bootstrap/scss/_button-group.scss (100%) rename {scss => public/scss}/bootstrap/scss/_buttons.scss (100%) rename {scss => public/scss}/bootstrap/scss/_card.scss (100%) rename {scss => public/scss}/bootstrap/scss/_carousel.scss (100%) rename {scss => public/scss}/bootstrap/scss/_close.scss (100%) rename {scss => public/scss}/bootstrap/scss/_containers.scss (100%) rename {scss => public/scss}/bootstrap/scss/_dropdown.scss (100%) rename {scss => public/scss}/bootstrap/scss/_forms.scss (100%) rename {scss => public/scss}/bootstrap/scss/_functions.scss (100%) rename {scss => public/scss}/bootstrap/scss/_grid.scss (100%) rename {scss => public/scss}/bootstrap/scss/_helpers.scss (100%) rename {scss => public/scss}/bootstrap/scss/_images.scss (100%) rename {scss => public/scss}/bootstrap/scss/_list-group.scss (100%) rename {scss => public/scss}/bootstrap/scss/_mixins.scss (100%) rename {scss => public/scss}/bootstrap/scss/_modal.scss (100%) rename {scss => public/scss}/bootstrap/scss/_nav.scss (100%) rename {scss => public/scss}/bootstrap/scss/_navbar.scss (100%) rename {scss => public/scss}/bootstrap/scss/_offcanvas.scss (100%) rename {scss => public/scss}/bootstrap/scss/_pagination.scss (100%) rename {scss => public/scss}/bootstrap/scss/_popover.scss (100%) rename {scss => public/scss}/bootstrap/scss/_progress.scss (100%) rename {scss => public/scss}/bootstrap/scss/_reboot.scss (100%) rename {scss => public/scss}/bootstrap/scss/_root.scss (100%) rename {scss => public/scss}/bootstrap/scss/_spinners.scss (100%) rename {scss => public/scss}/bootstrap/scss/_tables.scss (100%) rename {scss => public/scss}/bootstrap/scss/_toasts.scss (100%) rename {scss => public/scss}/bootstrap/scss/_tooltip.scss (100%) rename {scss => public/scss}/bootstrap/scss/_transitions.scss (100%) rename {scss => public/scss}/bootstrap/scss/_type.scss (100%) rename {scss => public/scss}/bootstrap/scss/_utilities.scss (100%) rename {scss => public/scss}/bootstrap/scss/_variables.scss (100%) rename {scss => public/scss}/bootstrap/scss/bootstrap-grid.scss (100%) rename {scss => public/scss}/bootstrap/scss/bootstrap-reboot.scss (100%) rename {scss => public/scss}/bootstrap/scss/bootstrap-utilities.scss (100%) rename {scss => public/scss}/bootstrap/scss/bootstrap.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_floating-labels.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_form-check.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_form-control.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_form-range.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_form-select.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_form-text.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_input-group.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_labels.scss (100%) rename {scss => public/scss}/bootstrap/scss/forms/_validation.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_clearfix.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_colored-links.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_position.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_ratio.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_stretched-link.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_text-truncation.scss (100%) rename {scss => public/scss}/bootstrap/scss/helpers/_visually-hidden.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_alert.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_border-radius.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_box-shadow.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_breakpoints.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_buttons.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_caret.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_clearfix.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_color-scheme.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_container.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_deprecate.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_forms.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_gradients.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_grid.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_image.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_list-group.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_lists.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_pagination.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_reset-text.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_resize.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_table-variants.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_text-truncate.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_transition.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_utilities.scss (100%) rename {scss => public/scss}/bootstrap/scss/mixins/_visually-hidden.scss (100%) rename {scss => public/scss}/bootstrap/scss/utilities/_api.scss (100%) rename {scss => public/scss}/bootstrap/scss/vendor/_rfs.scss (100%) rename service-details.html => public/service-details.html (100%) rename service.html => public/service.html (100%) rename team.html => public/team.html (100%) delete mode 100644 services.html delete mode 100644 team-details.html delete mode 100644 testimonial.html diff --git a/app.js b/app.js new file mode 100644 index 0000000..6ede19f --- /dev/null +++ b/app.js @@ -0,0 +1,38 @@ +const express = require('express'); +const path = require("path") +const app = express(); +const port = 3000; + +app.use(express.static(path.join(__dirname, 'public'))); +// Define routes + +app.get('/', (req, res) => { + res.sendFile("index.html", { root: path.join(__dirname, 'public') }) +}); + +app.get("/service", (req, res) => { + res.sendFile("service.html", { root: path.join(__dirname, 'public') }) +}) + +app.get("/about", (req, res) => { + res.sendFile("about.html", { root: path.join(__dirname, 'public') }) +}) + +app.get("/contact", (req, res) => { + res.sendFile("contact.html", { root: path.join(__dirname, 'public') }) +}) + +app.get("/blogs", (req, res) => { + res.sendFile("blogs.html", { root: path.join(__dirname, 'public') }) +}) + +app.get("/*", (req, res) => { + // res.redirect("/") + + res.sendFile("/", { root: path.join(__dirname, 'public') }) +}) + +// Start the server +app.listen(port, () => { + console.log(`Server is running on http://localhost:${port}`); +}); diff --git a/digital-agency-html-template.jpg b/digital-agency-html-template.jpg deleted file mode 100644 index 27f0e5c3d4f570f24c9077c499cbd20ebfa53c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67517 zcmbrl1yEf}uqe8b;K5ykySo$I2_d+JjcnZABe=UmfZ*=#9xP~ZcXyY!A?KWb>(%>J zzuq4xW>)t|cTd|4Ydz0AuK-YGC1oT55D)+W1o#K=JP-H|fc~$*z`TKhfrAAXI3)O& zf`oyDj0FD0K*K~uLB&KP#=*kEAtoatAR?oqq@?3u;}93uf%tDc^#9!i&z%4?IEV|V zcTf;y07x_lC^U%YZUE5>iEkiYX#KZ9LqffQfrWsBf1U%t{Y7kW7`6id>P#F-96$2G z{a`kQp6bHy=d+DZHFi>P6GD4?XSx@JxTZU)mW646A5=aFwCVT=T);+W>ZM##E?P)$ zd^Sp`!oLC$u{lE-PoBj%6#;BAvNZ4;GJ1S0oWdetb7j*)3l*OMUnZ?LY$up)?xu^p zow+vBo^Efcn7vTW{Ur7C&OCxajz_es9#-RzXA8W%+N?{yU>R2}Cw&jNyf&P-(;6)a zw^t*9uvm;X*Tc~+sgze}^_B^XU@Zm?M{xW15@0=oFfC(PT-z87ZH!+ShH$%rHD6$z zK3dSM;TQLPTSqI(h@puTbW7z{bx_YJK6_=UR(WnRXfc=Ek^<~7M|7P}VtE-z0(5Ta zlL&!Qn6W5op1@9nW?p(;POg+NT@w0S4D-Nn$Nm$llu_2VYSes?t>$~ z^50uH^Qq)a91R5;ajCpq-hY5t}?6My+!5GmKZM1ryPm|!Y)e}OEm`# zY+9VW5>~7&g}M(t!shf4(?6c**U7B9uRwg;;075K#8uSn-za5TfBVa#{pePOXYvnf z9SotWBQ2)Y!~Fwpnxsi;Z!=)u3q6ToX%GXh+XYWhY!{vZn?fvH!Zw5*XT`NLAhFwK#P{^dHtPyn^Pg@qEGKdcFt&FjgR9y3U^gu{Z6rr7G(2N3)GB z=wk54GWT;#Nu|1fD$ksYjq#rj8@yc|#$Lo}@*;lh+ibr_kBOKSA;S$}4ac81C<(4U zvuSw$PBm8|TV>BVAIqBf^`R`YwV}t%y;>$=bMrJlYj}T|>EXu<_o40JselW4+ss9E zpKg$qdxRnvVpe!bhTHTH57J3qGzw~NwQI8Y#eWaNvXl+qCVYbNtK5Pirek+b+8a7mBPSEdT)eWA^^YRDJJF(Y`sg zku`L^FrwEtZ*R#Jg;peO{oC_hncWloZNS|}drz2}cJGA5fz{h*z@Vo$*1K8n);maP z(>7{b1Q9m{y|3~y`-&6wi+SycSGy;WkDq%w+QsTx^V~{>g@jnfKuyg(VTI> zKjKT?tt&U-%!eEqNbWknZDH#p*-Bg-Z82_#O-yuYUtzsE9J?;>bzE{mhed_4^GoXU}I7&Jw+SxN~2{xFQJqYL0NeGNI6k?Q&fX zw=J(e9u{JU|5e$+-3%HYmR@WY0Ofl@)cg6R1pu%tJlV*k=xPyZYE zO$gS#wL;S87u4%Cv=`tOiqz}uEQCrP^2$EdcGJ{_N*E=pNX~o zE=Omw3FLJkLv9=7(^*41wc9+5byLDR=5psQhKl#QUN{dyZ-qE`1}Js67!u#KVO?(q zv67u1hupdRzW49)e24+$HChl5^77o{WS{*Os0h1z1{~OhWrf*$VX4MnQwJ9^&~xYx zGb{AI@7S2O+Snd>rOrws<=pQX@H0P`7?$*$8Tyg7?SO{_Z>{*!yKd5kB>J;{l4?P; zX&Yz(RO1$M;bus1`3#s@$10R4EON0_uQMsfZ*ktg?rSPO6nkr*KTc~@d;dx8`JRvyI@;M@MY`Olg2cu;s{@uklc)ueax(U~Dtg2JBJ{L#-NF zxSR9X?VHot0&R)ei_Yz0*G#jTW|crogs?x3xLEPAk)4IBHtiOcA%r)4%H1DrIXsz1 z_|>IHo$j|c5(&1aIaQL+ZVe|gJcCf(EC?=-XV#c~(boW~WHivpFIyOfo36yK+~vIV z#W3}JIAiN*cWJ9HXJ(4qREKfV0f_eFhPR5fclW$;q* zv~jS)M(o?Dd+sS0Wvg~x|IU2%JUDIO7kNz^?&c3rUk1F8%b|6yRAeJpVFQJLy-Z~( zYkQ;Q+;nb}L7C+X0Gv^k%nE^(?jIeNC_*(G^kC{~;yGrAub>4oZN%7sdx7Kj)k;OJ*IySR!E?g%||f_a!9tB z%MZLDU#-iaRHjW=1pH)6{H=cI1q`8-KKa)=7_;TCrsi?zwX+VnAqKdSw%-hj@28+5 zL;ZGnjegK>aJ4pKX+VWhuUE1<&OjQsU9?gA0*l_Q5&33KU@1+TYtzViS9&L>XVv?6S^K|n_%ile#pT>%+{C+ z^8fJVb$MGc%g>xGx2n~;I?MeV0{^n`(1ZLpIL}C#0JA-Lt1h)&Y1DP@ z5hIskQ~a3G29^GxKOm_3yESCtl9;xyL{)-_|H3Q(ROZ@lX18=OQ{XDOd0%TDFFo+w z>%||kSg6vSZH7$V>egr$t)(kBS$f;IoU?r!xqkaK^Hw6TU+r|cHE=hIS7}s$El5@S zs?GfTPkMgCUE_8eqx=z@o5>fCU2iG(AuD$Km8{!ORBTFV4^mgIs+R>yJcQ zt#BRHr=YOmbH-$2OyH?__*!!cFBSs&AK7~M z6Xq>l9wHx-x;ATflP|O}H%mQ&{9FY2@qjoDmSu_kuKQTRTB+At>K-Gz3yLTc0?9{m z>I8Ts*P5~i zbp}F-oTIOkO2l*OilExE;WS*hs`E?Q6T+Trn@$kCRigKSjSMr~4VS|nf_L*E5jz`_ z91R#zrmtAz1&0K3^+Q!(#)Xhm5c{^a4a@T7@B~^WpZwFnrT=eXD%)CNO=v69)W`)6(pK+Tr8bK86ElR5>(`BPf z%vYnsc%zxlLdzAf8zaQdq9N%TS&}Nm%5cTMNGq~k5r60~mlwLCK zg))#Tusgk9nn9u0?WSM%Aj#IkS7!R#DaWUTnmdcj5Lo9yJxUvtJYzX9;GkV`&U?>h zfAeCfNG3>SmH?QFst2g+>p}1Vz&rPhuvE_FWf%DxgWh0^`(d}h)+j6ZlqfL>x}I%_ z^;H{L#!lucl7OAlw{sWe5#^s==ZhkMz71ZNUq0SD+IrHj%$ln<7Br|=lwaJsNu_(l zgwchtRebt$H`%p=VOAqVDEAEDo>1j_-suGK0Lpit-;uT3j`z-H2820_jtJm&97Srz3F18MVIJoi%e0YEGKCy}F_I>CBS7W|Ssj*Xaqmth zO+Rqo;XFNMTF9X$$^_>C=YYmH4s#)qh`OGm{*e&dEP}s%0?g3EIMJ zTjrV|$y^5Sx?i(ra(n4d3F+V{o1fRP{c}stfZD3@t0S9{I`r|=r@r}Chdy*vggx<3 zf%!G#9=-s;?FfGGf4JXe6msz8g~{3%>oSTRp($u%=31}VC1 z;@t<%#M79BNbOaD0$Vb1>0pFx?aD$%+eB?^-nmdJ?}TZPPzCup^kut9%3| zBUIu}8GWprv|*4M_ZLp>rkuWz6QGW#06=5lhb}A(*4NTAO4Tj`uz7{R6iU8ex zoGKD7_YCSUdk?CGm5y;5gPWf_0KA z@`xXEil#NPL=|*WJM=I<)m5h6YKPBcC zT@>abv|29ftJ%EhJI$`xj7FOQFr!u< zf9W`Ix)Wq>yEPx&I5O`xryr{$_v%J6a{A65)|i=A8S@B~8OEXQxGXs{!c~*~&PP=E z%;jOpIfI6*6u)EceA|*fF)|5&2cT8We}rWIwPw0$oR_uVd?*4)z2`&AFnpf@5^WN! z-8^x~=8|4n9y$12*0^@PMF=`!adjwmATL09`z8 z_7Lno_?CWSwETD%SE%)~+w!U%0Gn1~57#0gGn}EwzC8vS&CyMt=^E`waIu6WcCSRL z|BgW+gRbVnO|2x(<<48va8t|eY-esNLIseIqLKOVqNcBf@oy8uT|^Me_l={QS=um< zqU}3`t1GK#0JD^_)ki$(T8f;@CJ+qry{GKvxndjK<@6kRD{Q@JRUJ%m*(K9v? zf`TORGw!0zD^>^OVqkqoyyB>?Io%%22{AODkA%Q?2d`KGX6R*M$Zi?f-J6zUvx(bda9Rxc831r{XI5Epz5yHQ%J0I(w7;|TihZCch*Y2sM%?WP|N9+%O*Hk;) z1voHh0cUDJ#um-XX*>F(YnP3BN)28uijQGQU+^FFn6}la5(sj37Mm}trx)6&h1%@@ zxHUTkso^Q(`M%+~b-BcU^k_=zRuuFw9;>}l;zE1l>j=V*qz}J2wjdfhWo3J(lycta z+|_kHK_WZ7i%nV8o9pJ@&!1%MWl|uL~TLNZc15OD7oIgM?a~tT|lw3XV#w^-NhOsQwdmU6*6*f z9WMfWBrSvsq9-oXq-H0I-srzSXWR8@8#I_`X1IxwAmsQFGEJcAd0Z8<8(_%2{L4QF zduiopQ;zGG+LuIUu{c}oNdFM$pf#Y^VIv-U-u%S4kiHm4lJWp{nnd;=zk^y*b?+|i zTjByP+OvA$V3Sq~S2yXzII?E|G#n9IMaz#`PM}*8xqw92414o|{J~AS4|^+RWD~^l zftfjR_hTHSUY2v=DUf4c8cqz-_ng zc-IV_^X^Jm5tq6*KarmSBKG#!^jJllh8OMcK88qNbZ5hbFl3AY;AI(%KWOpP2|~rh zuo5b(qc2?W(qt@DX+8tQxvfK3B81%>u9XKU$_iCwo&jA5VF<~riL&hOEb%2epWm{pFy!}z%v35Y5x%y!DXXkF9#QE zS~@$$U!-O^H}7`SYv0X>u~>b~O3!7fHSa-a7;PG0;Cv0Pji=LIu|>c2*6hNFN0TQkBJ*t_OQ|xr4-5W&Xv$nY85h#sHr99EWQ)ERx0U zoUaVORFX-*;vv!XOMQ}+XAQORi9bHd(_mgoB598GK9hPIMZ~JzO`OVVqrOyrl?xkd zXxb@tom_OpEETt^r|##b^=4B8C+@SJ>K8Y)|GTChw#3N-!_RgyW9!I?iM+dDVG}HL zERGUrKUT>jNpYRj;jvs|ZN*1d64uyG_bg`G!P(lv?V^&=MGaLa2dKCaV2_yreE*MZ z0(SXxgR_PYF$st;c~KkbVxBn1@)1k2*dyx7?S1^oH^HU8{u7-aIkkW&*tM8X=c-;k z59cZj`pv?>zWNOc8rTG!;(Yw<8p&nazD^AWW^LUe-7I^`+i>zY1?PFyc2NdHlO(f_8e)!(Eeqjx{?-vMQvvfF|DDPmqsl z8Y#;&CPHc1Te&v#2YiI->aq_Lb4!(aQ;+=-J*bvVnLqMA zzPS7$k4PrRCb~w3L7KI2YO~gckby!W#Z)Nd{nkNRP*XaN5jnX>T!W0W{*FN+#fQLQ zD=r2~*Fv^B*_Pj9f(K;7)GjtTQU{$`qTz%?X_h59wYAgZGaveXRH+!GL=TXi_^l## zs(&wo(?c!zxG6tC)#y#WynB^%Spc}{x<6ydO@X8v)MDCI|Szsp|3{R@M#HdIvq+A z&tkPY1Lo#_$2+rAxEgwog@$SZPWs;7OV(f)6VrDqPIUdZDXO_BXSLzOocL<)a=`{t z@2{aIUdhkhqevymE=h7Xo^Q3RvYf4lb>dcY6uI5gW_#jy8IHF~K>-})TFzoxKdKG2 zupKUQY1X>C!uqV341T!M>R?5@8g5N`m9X@mJVq@)=781BIw&g<)Uy>034tCiJSp2R zxA^Se1T<)*s(@nIn5;l_34!wcEz0f?_}o4MMAaO`W&7`?zn7bv4!ZbF^Gp604gu z$%b8b!NFm)Z+_xrYj#V#!6i>{6l-j#s(Z3CCr_zxb;GU$c3o^_=O~I`5Q~w?6-1#gkurJEN|bN+y*9j?>AYVq z-tqFxa@n*>0VdD0LG@Ru>L0p2zy!2q_Q5{xV0X#p&Z|#WWU7uHmy;`Ds%{+LO`%xZ zmn)$FH^CK?UnLm%xA}@>F0jvED4}%m39w+n73U#8uAWf(PFQQHDD>uC-LD(OY7b>> zcio-2D*h>IbCNR{YEIjV57B4+)>18#3ChvO})j8hn9O%~W+t3fW!%HevG*Xk8z z`&Wwice8=A1rgpK&OkZ^o&$vmzZ%38K4nlF6mBRE6k?aq6ya7iotY#Tv=%oQn(Y4~ zmhQ5wZbPC*!MCkQGB= z&l+kxNi`xmWVBy7%4;A%IghCO?PK8ud9W;Y6837m+A(A2+>|jU0txq3A9o8Hm>QlU zv`IHAZ&PB1YPcy2E-^lucnSZIpW^Ub&K&R8E0yf&f-f7=3ko9GMR!7r-2S=DFTNQa z>agHEz95W%$^v7U&_qiC=le6-FVRX3@0~`D-p7p}ORp}RWShjAXNjKD-reb}>iun? zZL>rLT+s5jd+l)U-~sp+x*?1)H_$hvZYfm1!60XFUq%YaPeoAknM58HtBJmAs12tN z!NlO|k$2XGqan!ao7n9)4v6)Z~ zt=Z;j0(%69nGQ~7@%p=6aZFbJcx+vB>jpO1+72}ZIxnnyZJ7>}yOQt{Yz4IXC zxKEDOl{DGZ!&hY5XpDjJ-Eu%mj(4mCVU0QFJvVvqd2-;G6n}yo<4Wmi)*^ z#0xvNDuzk?bViwNd~$7!=&+S)#_;LyY&Ck1!50Y9Yd68TUm@B)PR2}fV(D1tvrNzR zr6vs`2d~7AFWv>rVp}dVHDFh1ZD?)m)C_by7Kdk?O6L`Ok4X~Tg{hL6iQLp(V6ZIx?x&TV_bfL|fmF5~1-SiUmNEJ2RlSV$UQ=^A-& zLxR(T#SaPl0L6H-<0QrLP+(%WJS}(FEG1V{>E@SpL9b;}3hkN5xKF*yrLe?*>oeS$ z{6C}|{ns3U$<=6c{U>3TikC>SA3o<&JsbA%tzlUG-6lUYl#yUE{*@-EhP?wL_bZne z?zg6LmygC#TMKp0zuKfU|9HvqII=TO)XHZh?DUiQ&3`zMtR?^3?UKZrLX>Rd1JKb@ zrUnP+st%nL!hwgCj>~8+0PKD!L?O3qfuAhXCk1@|r#xuy8)MM@d3#~q0ETY*8ToTH zf_q;T-w;*|@vU71I4Z?kZ%3%wB)YuGUUX?wZX{UDrw~;hBmUaOzDU7CM=xIS; z@1;R+PKdA>@x$zOrs2Ld0&L<@CN=YE{~S5g z73b|bjk+6ewAZvH?~OKghJvdQUbUOR`biJhbw(Ga&$NwSj!lIjd^g?JnGX(S3?to( zw)qi&3gW(%|IrD?jxne)r8?+J*(PV_mIRY)RS^2=Mt95q#_vO{xg^^T#VZQsJ@^c+ ze6?;;%(dnUidfBE9MQ-MN5#!rd754~FUBEr%?nx0G;>JiS^o}0Q;%b^ZvOLs06X8| zuC3lk=4zC=wuWgrTN4Lgv=WuUNLd2Nu~9GPI(Ozli!CRY$+u}PAds`qN<>z|3zaCJ0|_q6$M;@IbLV5l=q1W$wkE`Q8&F68$sH-t znS{F4$A2f?=50p6aYqtVRaKKP_F-3>WYL$UiYQFhgVymNlnJ(plpijRpd1wa6%u38 zz=tAbN8^SG&XPN}g}tG4rC;diS8X*>iFLnfge6L*^L7Rz=4!UScR%LL#`-g!dQ~p?F{uz#cyx2!h5_ZCDQe1dnYffc+3i}XTvVDpU<6}mgQZ?$&|>x0Ov|6-@Cgy z7CNpfPT?+YsA80FYnHb(<%Ei=`m4TRwZ{5UNZ|CSmj9`CRwHB8cJDH$ot5XF3ni#& zBkRTmmAL_>>qDL9{#b#^0rUM(me|E&43|tF$8f?4N*yHd8KBE%QW2XV$^vU7UIA=OROV`Zlwc;20 zCky<$>&`oa|L#6m2@;@G7}%GEFNLp@!~^af{@)(e+<&VS|NokQ5t?;x{2+#h>XSN+D$l*su2{eU>Dz_AI zslHLYLMbSouF@K|;Qaqq$(y7OqoLo(Ec4$!BFUk~N42Al_2_j(&Rq!CjbAg$I&jj} z!c0Q&oLV3Jd~jz}7*tDl-Z})uOr#dKk7uC%rIQ%%-;{LT-{K_~{hNdi|Cf>4sI;98 zc#?zvhcecqHKt7!&OkRgisk>Z#wC*&MRPbVy9l~UN{EXw_4-)Q_JI7`HXBBp?+s@o zu-$?$TjD3|vhIME{k~0A4lO6JLQuXQ*70%K-+Xwlx=%HEx=82kuLY3^(7MOc-iD9$aHfarha=3c%Fz?OC!xg*;`5z6lmDhuMJq1X^HSzH|llis` z1GW^XlOftaDj#IwKTTjJsGfqBc)VBy}#w@!?|<|GI#U@rONE8IzWl(L5wOf zYHv9Ws#}kVVIr;Lz+RoQz!S)Xq9O*N&}%EkPSMp#x=$^)!5sZk>VpcV19`H?+jjnJ&nm}(cuKhG zv}!|)205+zaCa#VqKPM0Pc>_S@>U{>s6OZ-EX0YfLLE4H+fxVhao`UBBP%+a0Z~xZ zfTcouTm`ey*l4_81>0=gMP9H=znqC`1>H;nX9crr1(&;8_fnl=E9!BeyG+$^d?NIj z=u}45BY)Y1ar7he&>-F8dyu-IqE2nzkd&Mm=qekH>NX`|{MI|wy|~C*Ki<3S&Sj8c z-$it)aTlUgeCREB2mNSzj-qaDqLwcX+7wX=j8z+jcOQ3eEi;5C%szzb%Ch`bXH1{i zUuGetX>VCtlMe+y+l9mX+fMfL7c}t=+eCR#1qLfe>*%o|NtI}BaAC*6I?8bdjRl|v z`R>dzpH8Hkq#uL@sDuk90)x;acCQYL?@K_7@I5i0QpyIB^-qG>^)ay)_Arx)KXwAU zsOBf-H18JqZp2zi_XlDG26>%~5_5*llen!LxM8nO2BNlx&)5g2%o7TyxD=B%A2tT5 z6kc=@kBvJjW5XqZvQQ`9{^EVf<1IJfAL{jE2Ng@70d-Uo)Wa$26}jDWqVFR$zVjCl za8Z54R!+w0?}*nd3v8SzmTk4l<{%pL{uIs5I1{L=+f}G|HzobKxSiF(;H)ad8n+78 zC(nPvV!E?I2=+UQ)QJGKK+NYvu_m^&E!^fNf3~wL{N@(_GG>FK!Fu2etihj|$snZD zwxC!}5f5TLT6%d>ZWZ|^An$*;+P`tO4e@^i<>H9X{u7P=tNbee;puS^!&^0grUYJK zj!@fPTa?$-qQY#1kF_6-SDI+z+R0kLZ!y;yqg1Z4Z-f*->!QT3)=ccApZ}z>58{|* z0A6}<)9mSeszii*Y3Ew`TpyD7NATspUOjbub*6xjNo(_{ms|SXx!~oN$NtdupQPh5 z_GLZLf8YxrG<_;6;z#}QorF%o<7a@%Gr%oYTIJdshwhxE9{TcBkO6`i&0YObf{%3~ z#46GS>hV*xwU8f7 z+>-oO+^jDK?az$@R6@+(FOO}y;lyp|sm8gfscvej#~J_MHr1n|Jh{oq+utU1U8JYX zkKRSRxPpwP6Vl09#+>R0u}1IX_7oNV*LGXBF^8Lwr&t^K#;$zS^BFMt8pJRkmje`w zTXh!H6$kSGV0U=3JC!h)61+R>bL{J))Rm{E&ty%XXZ#Fkg;>7b%GCh1`t11}vjrh| zKd@mtIGe6xM8EHM;w^zF*<1ndwKpC+FF%r9(7-z*h9iX^xW6Rd_mP6A(ZX41k=Te7 z|3dzqNN$MXmT}rU-v|hzENIJo1~mVo5T4uu-;~r%a zVx>4TGIT%%Z36jKdU)8cUz_2E7jCm4oI5g0QIu(Dox*5?d~dsCl(a_{Hjya1f})}m zg(5Gs*_s(`-S)6mECR-|M{m=D@reYy7Fa`ke!7vPqcP!UQ?qDgV&E=|xJdqnGO>ir zFiVB@UFUXwE0%&X_LmU-x82lzZUwe`I(fmpSSL-{(ApTf-N*|yctwUE9AL3=uvYoc z=ci6ln2=V9xplT<4f8^fw)uOu(B~jga6GA?bXvJQ2&c4gTY&x_y3GWp%ja1?Pco=g zX^xJ$pv{BuXEf#=Xv2g-za}T(22?SW`1^FztBWO>Gue5XP{(^RemXw`9&OZLQ>Pe= z&fv?!X-rpV8szz?Ro5SZ))L)bXd*`>cOz8Y=fY9>h@|{0#FkW^#ZeGBYvm4Sa z5B;hUJJe{WCJfEc2t6#Uba0O*8xT9jHc=0q#Mv)L{Vn9IdmC7ZP%gG9>^2)H6G^Gy z-5S$0ZNzHNO0Bbv8XAj_MkuHl-d`xZDC<)~=SsB4xuyWY+erIpd9K*VH2bQ6iApr+ zlc_S@4OarVuJ6PgJa3skZwkZzm=D(BitQmCSarlrO!&4s1VsQq`pg&O2 zzOxAJF#D8^_STbaxYFzE?R%fN0IpyuW|utF?t^pZtPpPMNrm2ccKdkw{52;V?wdz- zJHBdyhq{WC1P2lY0kuP>$gWcXFWv~2)t1RN43Xg{M2*FJL2Nl@2?4E3ZfsN&2u(CF>^`FU8Pr;=K>r&@PrH8i$m^cqCxVNgV&EM8HD|WB>GcptFP*6kITMnw# z=u{CA7cJi+7PRm-@$*dF_%FQ8?Z!PK;IYx zRet~NVnUszIUtH~<#O(Q5mo)&F5x8&^Lt)d@)UlP@$?zqd?T}tOH)|O$iTk6=4U`z zqu(P+2Ff!aJS8tD=23pyLa3w<_c0|CyjAPu^5?OLH(`>Jo@qF|qFXsTe!R&qtC--6IM`<(&849)RwArj3F+ZhxcY-9orQ#e;lv*Q(`rA{de z!e!+rbCb>6+2)olg|2#`1QS8Y8oA6T{fKC7b$$j@g)8yf=|O#r3zAc?fuFm#YX-*? ztz=5+GC9z{kFoacwA|kh#Jnrut-=r_U|d||a>4v8w&j&*NLc=TTY;MRm zj*17Ydx#nq9ROMG@*kGThmFzAC}_w_BC>r?Y?a1!<+{jjR8~xDy$3r#;n`iHQPF9? zDBPQ>*7GLHQtBoB;TA_v1;rZFVH)#roxlm%_L6pRMCs2dRYxp zxQpYRIhha6#n^rw3u8;?u|kA8UikwTY`RToesBd0(={!RBrBY7fSe%Z+fY$YXZU39 zM`xFowDtR}rNAmlhJ!h=)m3Gau;R|<>FLa9U_Fs5e#)A6g@0~S-D+D$sg641QYiSjpHKEy5J-wZ0uk%x#*ibnb9+VYI5J)I|S(BY+S{p zS^8IuHtq8~@3g6oj*`i#OhBQ@@-g=oCl$|t(2_1|Wo)xI!?6KexuN82v|OWN;`i2I z^P%&A(DfTimlRIsPLRwl$3PPuIZja3`sgOx(Zn7T{S0^yz6t_o4~iRdw%FxHBct=X z0u>R8FnsMDK!~4NlDCMZi)e~(11xPL6~C(%hoc}L-sl2H$$xjI7C!Z3j;8v5Ns$l# zY3o28j=Yg+WfxWGOAd#6#|)N$H8MK8xKfRf8)Ly8Eu@Cm+^8>nYZ^0A*^sYQ6#fH4 z9FBqE$W(4crYaZySOGq%i5&*o^l?~Zl-d|}>Y$3*_{eeI>6w#0^U4`$pq|^Cr|)3- z8zBm6507>xTr(NE!3n=KH519_bXC%dbYQX1Iz3I8?@Tbr@67ew5f;c)EaAb5 zprFkP!5L(k4)-Hu6KFcy*mN;YU`)QvjBpor{T#)@smNH+{FP zz3*jHa@p!HKk;4sNO2J_<@=?ul8*y&P)>v9$O66<5OU#XfWD7Ext3V_NrFNAFrEqA zMuk8oq5asXRkmB}K?qW?j3t2tqZ=IwGc(f%B%@D7#37OSUDhlx7y6Hn8w&_9a4S)q zp0j_Lj%xW&4PXb=Cf!VGvj(}Wd89>7GwhsO5$%2vgv3#tw3_T8NI@IJi9e*N{`%y-5NAA~rt|tI%;+-{B)vK2Sm$FcP@ALYbJiwn@YMH9$(OMuU!q4~3%&Cng#U78)Zexup5*sA6P z4ZQf_uM}({rH}TukhQwbT>NGjmu>)Q%+PW;cyVxb0AB!D>w}?gLU*N&Q55TH9^5)P zA-C5Cc0BbQCZduI&lH1)14yDj}M;z)< z$1jVim6JD9+jcG$&K}kTGn6zoT3i*Y^)6}({;Q=2gB>S5*8T)q)NvJsSo<9xhXe@P zFb=|d-o>lM_#lx^X4M2hHHo|WNiWNU-F+8j;E5wsmIGe~Q(slmWBSX8U!U|LO{$fz zOw}-vf5fqiw3%cx!0s;K3m1uX>eWpWOonuTI5r3$lBL(MH8+hwEyCj=0Aemwv#fCp zNHI7d*GCn^;~i&=gMuumBJ^k$vA5`I)MERCLP`#FZGih8IAGwH zgGm0FH7w_2B~x$mGKz#Bb3Br=IXXW>v&loVZh?X7y>{Wj=*37*YZrJ}t_TL@`sm;< zYpKXc5W7eMILc1>AF4ZwC;7uZpiKE(U&q)Qa-qXa9*hixCZ%e~&jw2Q=UUPHgtbiZ z_YuY0DkGPJjaUomtB_cq$vQny)od_XWu0AFyvZ=;W;v$Hm}Vs)-SSIBZAl6H$c}igDLqXXLA_NKsp25d07pE4dbEpq+IyIDW@4Gx#1>cFl%6r=14im~Gk*?B z)+I~l8K`cRU;HbH35Jt)zPwW%PS;ZWX7#u41AlWHpp|42H-(pIs^!n$$1%fsL5{qwSUVNYWYKIQ{ zFdo1Ah&%&qP_mUqk{Y>5E{*;Y_Mo6glN;P_Ql*)@cknCDv`{S=*C)-bP2Y*7a(qyZ zkzS6Gq58GOP+jt0>mR_s)o*Y|hD1#t@Y{ki;I{>#AfVsC!$88qfw#aQD_BH705dzt$KHsj*k@IaW3qoTjEP+p`+9Q9@lE`*(LXN` z!V5z_dS(v@m(A>>dVef-YA)>4{#DQrzOYJ|Q3=YUmurH|+5{E-96xH$ufHl1)TP2P zjQm8XnqG$To$pIk53wm5??C63?3hIH)9(@BO0E;gS8@+l`CGp0wAInhgb7x83570B!_vl@N-mrzkDMo`&ASPkEGufXk#i~r&IaB2 zi3XYRpzn0m)v(3Lo2N?0{vwn$Mw}a`hH6m$iC5FH5asQ>QJ@TY0X$5ZLZGbr780(X zY(>?Cn1_zR@B~bfyket9?vYG1`2%aO+vc&fP%viAnlYuEC7wvx$GEr~n|wgd#x9?^ zOv&bVU<1#ZoGs73M7osTy~>jd@wR=ZXR*>iWotojHQb%m!7}j^{_mxjGMh0LYV=e( z!9@UDcwJ|SsxJX^oMp*2-5>1{m4#~?yL82DFJ2Smb@(ZyUhC92*%_ZiRdevStK|h> zng@PUQQ5LaJBd*c>NY(C%yTT+9z=`Og&+Oo-)<>>vBluaWmC+z?`|R#zABu427D;2 zX`7_`Y|}UU#rXy#ZK8~0#v#NU9&XQ%VVG)sb!`f>*yivPh9;sD-Dw+=N(yMH4~7x} z=5wxDZE>^65)&*AMx=mN^9Lw4cE6h(Tep~?2v6U)`GwT@YxkMZ*2yIj^G9?whHYBQ z1ichLxKF9piE$to)Z(KxELb~)Z}onEA21N*#D65JAebo#_ORq)3i_dH>HLY@y0lj_ zft^HMx6S+wtuQm{?T5O>J5+#d`OSq{)x>yjHpLG~gFG7_lbNHXEP%@n&%KD9S#_5n z;3z;`7v{kEEQl`9!L8#X;kcc772Bnbjx}Mkik$^e%y4y4^3MKP47j(A;N*YX=N`lQ z#dEOkiZK@&nuV8f@XF6fHlmPWEw!D0B2mgf8)46D`blBNrKsJS9P~9ULunXUVW~4a zyG7LnOS#)+=aVhbUQzj>lHD;MmTr%#3+6T2oSPzDQGH?fT458-=-=hU%^OkNOOk%A zsIro5`l%={zms&5^B+>{B5`W){#^q8W_Wnf3Eer7aJg|r!)9H8yaIB(sad?c3>Abt*g|y)R?cZsMeUBtE$xJkZfH? z^nUzEzCbokWW@UEu~ci6H&J`~5K&hVLTk?!VOGUgtuYm{W^x6qG!IbX#Pi0Ypq>67 zDmDP`Fvp57nM?G9Q ztfVm-y4^={Uk)`F^{Z*eoYZU!5fOD3s7~kM668dtyMM5FcQZR;FfDZ((idE7Pj3(} zfC!@qR|RIFXrz#hV>)<;1D3kRY_waU&b@0u9{vvjQwWAnm*U_T9ccYZ3E(2kCT;SV zF8l1wh?=I}>CS!d&(r_8JL$;ls2$H%$JC(2fM?L4%EZn@d$&3(>Rn;`1#Zo{J*zqA(f(%wMYAdH;VC~_p{*H=>62?hO`Q9Jg1m}7k4;^9aiFZ^hz zwX)ppv>=Orz0lba^2Ho|zgy?J97FJzCZod_^0&&gmHU265FAkpi3j#w9DUNGNHK~V zX3G}Ljgc;EFvs8TM;hTf$(%i~mkaG0?QI^;K6tf1Sx#Tu9BtS*_!~fdjL<>R2Z0%) zug#+-3%0lC$1-i+-6?zqbe52G7Ci$H${y&(9_ZRm3KMcFqKmJ*_iEMFO5*B^R5gh* zwFG`mL9Wn=NL%PH^;4(do)+!m}~ z&&|bx46WCjsiB;{Oc4t1RiGFDv5GT0w=VK{I}URJ7deK(i}IP}GxKWyeOZ^bZR!WI zH0twS_#vx9oy{Ajp7MA0vjsd?)%2Y2d~B(>zgAVcgrbb0-@#f>UlB2ZwaQ%QHqQPX zy~+);C>px`W`P6YRA#$qjj->=|6=Vez~X40e$m}!SsWI3cXubSI0O$aA-E;Mg9ay9 za0%}29z3`N*Wd(q*AOIk^S=M@obT#$&vWnY?9B8`Z%=o1b=9w@tE;KWRL2e4*M!TZ z{bRK4+<`+*ST23xGgYzrT4|wt%;jB$pJI-x@NJb%ycszW?5=qAMc9m!iAS+_j@`R+ zU45NQ0a(7H$`(;il@Wi(IVXVE9_9DO&8I8Zq1_#W*S{k95iC>@@_#blrOX7(JcZwA zlVI6u>+h=0GE$i$w{s-pvXl#zRbH`FZk7o~l#Mg}sxa6No zgIV0dgfevpM72r!V*(JPX}$8+F?$r0xmFq@I@rU02zl#9-)?EK3()u`iM?%PZ$3EVlt>4+y~@C*c0w(zKHP-xpUWtx z<}Ky%Yc>0w?W{^;f;?Nc$2NZeVLA~}F17^1>!}>AB;?s`M2PmKf_CT($89v=hq_J$ zF~ZCNv+J!GJ10Q{aK@-NWxDL-vV_b#p>dXUG%{ot{+#cbhv_PLZ*exc9E9gotc1ei zNSb`=m9mcg--JC^w@UDnCGK@=^foZ8i@|$#Q{BM$o5hhS6Ap1S!REH;7>#e)r1uSW z_3X`z^%13Nqh*?N_epYQ%Zp`+kHdvx#e^&k4?9{#Ji=#c)~Q;>yV}efr0&HtS1gH- zLqV&<66Bjk?ifQ#IbCbo1T&%1FzlZ^!SRkjbV2@wvedFqV#UQKI{0WGluy*YZ8RnD zDj$3xJ-Fyhm(S>=z==`}wzIyLy|)m|*A&Cw9J)x=-Bo=fV<(4=mH~2%`aZ`%C={i1 zvB8?r0W?k(^pq>-p9p2;RP~;*j~`_`j1Vc@C9G!HJ`m3cAz2yr+1(WLgyc6auDE(d zUH_seKOOnm>V{}5wq-=BDYnAspeS&n<2o>YQDEQ7|Felaz+mjwincJ)JmURQWcQYJ zNL;J=>j$R=d^3z!j%$$X=E2v*l*gP5PK^Or;BbaewH%Y>*h zW7ws}Ob#eHSUT6|`(`4u+nudB?ElsS!fX|!{9C_5VPg9T*j_K;bA}6}(yPgp%$i%g zf!a_cp$7TDz6_(SR1t$O{#0a_VFbzYJq5TS zA+TUx^TWKLX)k$3x&c9#@khtMEn(?p;+~VLJKjr)lIai1W~6C#vx}i#^}10Zhw$AU zl*Wzh`dv~cF_aG9x{}C@RFs~3^VA}eQEp5R>Qy#kOvZ~b(xG3ju;?yks{i(0piG-+ z6Xl2f31zx`IR#5$4|=(@GdF@=1K-x%_NXA<2Q=A*m9h|+@R?4lQ)ugLT5 z1rjU|5(Z=*0#6}(=OvgSI(3BI-w#m{X%x6)nbw`TJ7;U9j$`g=>I?XO45rvAUsJT9E?8&gX7wZTxvP0C98Lf z&U-17UPOmrI7=>m5$<_g$)`6`m{-mFEAu0-(ZY`b1tFz~3VtIaj@6Y5iU`lax{OWa zFQa|lrt}(O+O+-u?ta4&X82}F7EAKnD=}@#YNjNa3#}OZe|GXm`BygI=*2vxJT8MT zc2J8a+2(AlwZbX2^}oT&1&8ph?m-PQHwM6&3Vm;WTPIvm$m`+hhw+I#j-Dete7-^D5!y_x+W<;^3)hwCla5nCDF->Fd2uoF#Ol47RkqmXmGtmZLhu|C1gJEt< zK_L&s_j~0caee}7QfFpg(;Dp}Z6~BKx1o|?s3fK&eI&D} zf~ptM>EGL6=r6*te=wVunt7U-R5Rz|Pvy6&9FocQ1nUR=+75^sIqob`BhDpjE4a(u zT7+NMvlcVIuis&+CM@iRpXee!h#o}Q_7Cx#^sJD>720|kALfp_Ws4Ts-{`na;M>vS zpp_T?|KtT0h)fko7V!7EeB%G)ehc(+L%u> z1tASqFB?GrTz>qC0&gCY)pQSCCXCGTS|}{dwzyP#fmM?mHN~M{&E&1J6r(?g&MVc( z>(J}IRozOf`Vp7Hym2xt-xMdcPrEB|9#*WML-vM#c|)nC4&eJd#{3=tbQpCnJJ~bT z;d)^6tap`wga1nA_fVkCkz2X;VfCo5VXm3pQSQ@w&h*78mxsWLVV@wqvYXdkERE@# zsEvHLV)A+Q%}o_!rq@r_C97zN`mr3VsZn+5STy#T2{mPSNepgelL&2U_Nb|W_eDbq zfzOwxRJX@kOl8V9FyP|JBJH7QQrQiAmvjPx-irV9yQol`Q=RnLCLs8(2vXYuELbGP zob<*ox_L1MRr9iWOBze^MzFTvb^9^-4u$8_8%JN;+{zU&1`Fu!b+a&qXL`pqRm@y# z(7Mcjv?bB`%mci3T+Dm4!@62c1iOI&{~y8M$tw2!u~pX7?SAm$So_(M=X! z#J1?(MokQQS^oBM^SLff?sU`+LefsjVi~1y@6^{X#d-kMPG1h@xg1b({Vs|aBUk=K zjpX*lwtYshQyh70O#k$@O+u^GwOrciSSRHCKU-Y4h$rQT;mOtecmMl~EU$%FrL9{G zNW1^D$q{dK5KrEF5|IgFGglS(N{7xFdej;cQ?{0UtG1S5Q8D*M`s%>w}*=er(fP z!e8ub9mDu~trOI?i9d8Io0&p0jw;5-@#~W_qchw3XCbDnF|^vHzqb-r;GwB|U)*{3 z>VfAs!8fZ%7oEu)FWkKz9d>@HyfV*m z61T-Sf$i;hPTytx;Cu!6RN&ZM9!M{ z@bGYC!O^D)pXG7lkQ~{QP%b&_V?#k=FYG$kwBFC>E_K8VA+1+wuo11nS~y|0{C1w6 zVs2x*raqJU6nh*q)g>4+C)aMhQNOc3uEbkZEkBFXs598goKtwlttqd|apV1YY^&vS z;d0&=C#sE_e1<@|a7Alxm!t!|BQ9C4_ZUZ5fY(H!4F)%LOY<+5yU$)KLs23p7TW^Z zi2Bv!=`Z}BRI0B0dh#yaVs|9h=wG>bE$pTpoZWWrJY8Sf#FxpKA|Z6^5W;L3P1;R$ z-}#NQ9G~?Vqea$;HgJ$S(+MO=3*Lr8->dycJYO!Pb7I8uNd$l0U>%8CA0i0tv8ZP4D9)^;JajNEu9dU}7CCX@QrJg|f(lMi6Pj66 zSK|wgMe%t>lNcRuC3bwS-SQk=NlVPD&CsUV(Au0$-;FKaN0RCYgQ9{|Za+}wW8okNROM^bb0!^p& z0XZ5xVRIixFnc4}m6bw-GH{D@W=_aI)F_3GgDj2dHOnR1wMCk569?~y%^!ETpPf_w z0ECtOGKwU|H7WO)W3K+*d2coQmXmPYP@rOIbB&_+vAVOz>-1*IeM8Jd+(O2!T=cav z`amBE@VwvZin}eDMrvGPYiO~A(!=+3j+PB`3=*Uq)rPvv?`ZIoLj5+WF_-u%qb^y^KSnJ4r1>g1^#5Og@v+?SW5ldj zS>e&VfPMBqg;Y3IbH~^IEfc+?{itny&@r4J(=GmwhRKtO9N3oKNLdQY9OhGqOQVr9 zx1-TAgSP!BamOq@}=XDX{%R5sZnKKo&RN&2$R7bS(Ro4E>~)~bP3G~YH!9k3?lQhwj+79oULi<6u8~+uS4sFR(C{_2queXVJH7 zNEt6k%+V!IwS-&Ms`>nfIRKsVF8IuPhco3~ds`j7K+=!e-u-jsukhpr^c^+1Xoc5W zj^_O8qYML&H3zMF1B(oGDp`dWKlcksXg}pimnr!d`wZ|q3JZGW9nIOb&!V?lqyhN0 z>Mjw_KESOQm6{~+l(UB1P;P>h_OGfOi#=O@woz>U0qo8Ea8Z7{`T}JM?t6+SAxEVBJZQ38t3xJHxgHW%x8!i3L6Q$EfRqv+g?dq(z2JFMXsq;FIK#*-6Th*ee*yk?^ibwKD)eWSH-DpVqVQnC8 z?}AV>YkY+(d+#imO9;mV`(b2+2M-FAMu0^!`80@}HP4g{zR{G8Zb5lX)*sDX{Q&&5?59DDw)(9OT znq{8&nWqxmtz|CnR@Jb|MED(eOCIH!aH-6y9968r#4ar^A8|{S2Ml!uyInp)agI8* zT>{&>U#|ywux8+oqwXQ5=Sl^`I=*s|A0F7B=SoFkCCkka#a9YhR2sVIq;gfhoN4Pe zNGfKV%M(PjLqN1$j%a+@Xo)%(J^QfQ>MhT46H95V9?fc%{3{}RtUy6@axZl`D9PS- zxy+=TD|(PsMc}TP=5YL8j_hRw+r5{OM#Asx*Cm#XTFompxb*ya2hF>Kii^WOx7)oE$Wv*6mCFddtD<{h=z7p-|Ldf;;EP z@2Y{SSo5$mwf1w#!CKx6mWH*#ysV=>>qfB<62kK%d|bGJN1pT;qa^W0glEfGZ`F>mTk55ilSQN!E$>t9u>nU~Iv5sVWcc?Nvu90uf*5AFG2-37vLswTI8VU~pn2b7 z7|{39X0TC^*7dGvkkwIzoVDd-jE98Q{(4PkoGUegC{h`3O=s9G6m8j$T`SIh%BkQz1T zU64~3zqcjtOf{}j51i{vXxmF@zaKG8vULDevaf3wwxc#Q1?YS^XPI6@G%)NcSMtEO z0Vj}Zs0v-Wy0`~=zF)Tzxa802UwvKENY?G@#o6cR;lgQNQ=H(Ix$X_@*KU)%Su6qD zjmv5xWj1Qtg41&}SNo9{H=~wkH)0kjmlqm)i9CDjE`~*ul;%ZVgioKU1XFVThjfx; z>tD9g-Zq!1cHl0RiUt;Wa+)Vn{Q;C^Vrfl_4r2s;VG`uxUHc^FYXSMHZVB>Eph&q< zoOagAB;8W0T2uQ2$e(1$KEs^IxMfIXTYWb4hQ4_5Q?!lnmzTuI_m-@TU_v=>)Y%uQ zMag70F^jKS4n=>|>se-r-ofd{>CyL)-+rvk2|^rySDw4t3|{UNQ5}*81P=wQ{zEel zHR2u*`Neijl{`Yt)A}LzEY)n$Yq9KSmCQc?Bj{}YuZgE6kKCt?Y8_v*odFRgVuC{{V2@yd#{phE6UbN*~{@olMelr+s*# zE?25%&(<(ImdERm_*SdF0CGYF?+U-(b*073B zDWBhpt>YBk;G?!b&x`c~mfmr-_AS>ZTn;||N{kg!c=5xVLbmsCmt(induvVRMJ`TW zl<=L3$}?K$;ou_ZH`5?9x8_sTkZauStd3mnFCJP|G`eIY#TO%5l?YgrXs`d@ZKY!F zpOkQiS5ix!yCe2PCnAOuRz7n24HuU!Azu9fxH|LdaqVT0X}=oWQn^$0i73w)a5Zp7 zyG`h$KEoTCz_TNWUXY^bVhsEPC{@-X?>Bo0I@E0i{D&#t&bSMo27UIPv(x)HT*=8( zt`@_(CETqG=U9YRKBmTPA=wR<37M~_ruqCT1zlRppZo5UQqu-?h!Y{5HVC(_8TMCcV5G^ zY|z2Ays$FZh27S6gkGh>d_PoL1|>c?RL4Y26Tx#S2omN$H!oj6@iT9%XX9L*<^=CF z!xX#lnWp&4x#mk#fjJ-qWAs#|%PP&pdKhz2szA+3LF+u2@-XtTXNX)07CL$Q#FetjG(trwe#w! zA8&3Zt~sY}9sW7|_Yf;$_EY!sClk1&ZAn?0G`i&nr@x1;AAXNkRlC?s)uY)G> z5cGuFZT$z}=$EU<_6Kl^b^V|JNu`sEADwM<*P_uooZOi6ND0z@pL#*hZZc3ot;6WhvaYY_?sr6*DnVTwbb} z&G@x(m^|h`3=bajKiUb|o0t7C)lcb6t~gqhqIPnlf-$t8rzDI-ycI@S&O^ z8YL<+54v5a;VPoH>078@Djb~c#r3-!pSAW!w|WtAG{**hmoPk$Wpn?~x}E$fKR zb8I`7=+k<3@NZ`f-rn9m&%*XEYl) zvjVDEa^&i0G$=KLbqzO838{JxQfIxtBT+q@W#+z9{@i08eILmR6e79aG|{jAD$L{O46a|PV;~p!;r6( z@pl}ovE;vAE$mFT4Td=7{&1*S`KbbO{+at%H$e~Uy?dp-NNQgcWWybIJ80f_8pAEt zSfBt92#5ee{2vRO0I>no+>#omP$#N@xZDe_+U}|I4RzRm`LvUumbOvHkP!%b4_%^e zkhTe#!pI~2e-6UXwW!|X+UN;Jp3NewTEZAYkvzsPGPgtr+#}D3*Ld5l|KA4@1Groy z4R2<)r&D-MI<`cI&o*d9u>8okfHbH#%k7hlT@w}7DdQI@6EgSn-@%e`8ya*Na{<|J zFzu(#uV=%%rr5|kUGx}x?>5GkyI^n8d?dfQOCkS`3PmL>V?b&U)FBJasAv)j+T{Dm zLeS5)W}{7YOT4ZDcoAl#sq(*u+57aKz?+ zQ4ys!4De@LN2-jmQD?DOMJ^7rV+ZGsXC??bi1aKLMn+zk^yAbM-&v)7ju43))x$ws@3tJO=%txd?d3 zxDKFtNGxF96zUdY`xCGS6<uw;)^?f+%7X`(oY1&Qy}~eI8%N84bGLwL-BTUOqibXhbAQ$ zktvz!5!Ta-Ayw!}V&p3Tr0{U?v>^(#-x$;Z8OL?=0c4OXK=5)H71wsHCIOpH^R(sc zy77p(S0tG-kW-tx2M1wuE8kx^6r(?49{XBXAF}vbkx21xeiH|x%LtY&`e>MNR0#2Y zi`}}XB$wf42(Z%=i-2PU(NHL@Ka?$5pJk7&*#cq;WKmChuf$D};&v6e=xgbQWE4zY z7R^_FoBvP=W2{36*eA07vagsG$mRWM0KW{$=csS!Wc}7?x`JZgv6m{&7Zcx~9smOb z>lQ+a-i@j(44j|%!$2??Uo)v3nv$*x^ajKPLH5s+X3Ss~XpwnWO+86`Xuc+~!=0aN zR`Ef6DhClQXL^&Khf1J1RRs{2XGy`0?~F%HG1HnOp#VemNa-No^}T;w-D`iEbROq>6 z!U`%=P!@x1%#-j9_Zj77%G6|mRA@p5N-{6AMKL!$of7M@sP$nt==+EOne}9T5ekcX={`8G40c~>jO^jf2`jrhtm($4v`JPKWtO2h%56#}1ojEKil!p}WFLpkJ_ zl(!>ja7Pu7Yrw2HHg7q8;DHcKO}chdv@SLA;HDWCv>JW%aJQ}8tMp9b;yK0=wU`5h z&l~$)6UQeTPVYNSgEK6a2Ec59QS^XH%vkiWR)PUh2D!xJE8{q>%|W!#fYDeP)xNe4 z(s6gHvo@P4uzrxd{rOjdwl+mMa$^&z%L%{SG-7{ooYy}|26`3jPHOxLT|1@)GVA$1 zS8%M-M*1-DxjHCWpgo&^WV|iD&3z7Le>V3%@0;IO!5a6IV1E2qe0Q1sbJ&lP`SGzB zcRH8&~v-M8IB(|%VPI*LfxqTw%T8#8_aOT%7 zP(sHpRz8CM5SN`NcPzew0D%6I1Irimk`IgV%2$BT6&a8o7mM~oEV9>ZU@wf9C*Ohz zfem8!qC!nXisw3^?(3SvpbS8sqyURGR2?o2jBB^mA;$x;ab^G)jT0@PVD1k(e@zSv zj3OsqH-AMIJJ?4fE(ZfJ$D0x!WOP!$NIDCIc5iB!*a1^+FNTGEtJTTPg%GwpbBV-C zFjRTnhjuC;dvUpE@ErQ%K@7PoN!dm&Z&M^UZXas+Z4$gK3R-uE28G8;>TNf?hc=`% zgm(whoyoA%%42Hwe%6}OTi6oB>z&tI(9ILDmHeR|KOj|6yi>y~_bUy%^1 zzXG2lr{WrdV3ZW=y=6;H?|!9BP5F}(GZ;red5#aw10sTrQ33-*TT;1l@!zB9;e_lT zZ?FKJM&R>&Jax~9`Se|yAqCJm0wz$DiSU7>smxfD% z31Q1C5Gr{J9;5Ct3?{MAvi}0d{b4BL#vC?zAolm>`1eXSV}ksN8YUJM0A zMYvA8yjZ&r`9bh=*4T6xy%2&K#=sXL92kpE&Du{jQs4|Y(d|ha= zuNC>&S9R`yaHjyD5)f?D`+XTb77|JC4B7*`P;K!buFzHQ`Cm8#@xOg8# zJv3hj%ha$%V{|h=7ps3jTjG<9%jsHmKm~~B6>7ASJVB*<)YcoZe-Z1h`4_-2E|x^% zY9C132gn)YjjC2YH zKEE?F7ggIa;bOksjHv+o|90+@_FsWeaw6iV%yxQoAjmlQpaPxS0sA+|zu@)V6EO&yRQF^XgkP2fksOevU;@XC8^88>DInP4nWFvJMBc|Npo?ahWb{}Zfh5-N> zE-gNg=0kG<{vc|$h6MTT^Ak=BD0h=&0sd{o!f(!N+D|IpTFtr(nJg0;Ctr%IPgg5ar!iqJ-e)c-layx>`oxA9jP zW89ver8wZUd;Ozw1_X7%?+9I3Bjrwz$)Ta*sO#q6GWG05P&*UUlS%VnoE%`NcjLCM zyTMrb`FWPeXr)Yrkm?_jH}drSLh!ywO--*i2m^3K6jj+8g!~axDhGqya|Ck;6=^bb z*N92BJ~XVJfX@TQIzxx#x2ihy_l{_C%9%5(_xZWGs z=g$P*h=h9~VZ6o)kD`3|>0WMxZ4-BEf=iC$f{@+NVd=+XTKoy?i3l^UA^a+9flt(A8f@sDzP!yb&S;R;QxS5W-CQ$zXxFNxMA$(jL`q;5n=7Uq$J#EJ;yI!fIH@vBb*1WUh)}F5x3FYI&4 zI09)&klf_cXw^4=eEB0LfO*Xa9-4W*HM0eDP9wg6s12uWzM7lxl+UtZhS82F$di3z zp%S{MJ$xH1*!N4WPs48#V+&|VKTNwrY}NPU#waGF?5q)l?Eaf8ugcf-Ovpxp#6O;F9L7^Or|#W zpvMY!cS*$azc$!IK79bi9TLt6DJMZgG+dwg1BTZLP-kUOJbF5BfFvY-=V*eKL#g4BJxwMPEy0pWxrZi8Qlfj;lf9Am^8MU0-me9{ar%$6f7T=s$(uwl|G2-|pP}MEdJ>$qBh4y>CRys}ID$pJ z1-n3?I|fTjDS}m*mbfz2joq+Q5D#X;uJ;0M;8E&&i7%{9HXl0FB??Gk z{xG`#_GB2h*;j}W+W+fm)~9OPDtL9_ zXgpRI9r`$7?twrU*;~1YtLJ{`RK|YjN|>$>X-wSkZm!hkbzAYdK$-|Pu`)KwG^?nd zEv!1M@_jHqHc(yr04q`s(oD|FL>M&_EM7tz-~jbvzy3U$l>?kTAxHv(2{$QmBB=Q9 zf|{wI|K|C1e)k-Fg0g@V-!B111&BgTyWt#K^bQg7X9`cgAga&E9$8E3SN*KZ{Ch46 zm?eR*4}Z1E>Jk*4+GF8r;lV;t-xUVE0wN4~eD+UvJLTPDTAqY@zTH7i36?|-nwU0s zx<+_|bnTWVLc+j#psg(@h=EIZT~?N#$_TF|AV7J{-W*IFtMAcaN&rHSm`J!naF+zN zWnQ6Ov$E87b3C{gcDiUFcPBSzE;Pyobt5pyx+ z-(%9z;Zb@M^7%;pp!&cpluD3-Kgugz{EXFx#6?cHhXxq9%uoUtR44LDF%mb05z&x< z-zJ(yW_bkY;cCnXy(D|3=l7CJ=i^mZ`egeVb|HEfnmz-UHp6TLofJPgdGnjctF&g2 z=OKL;&W9ahGnz7ep(tbqqInENFM>y^X(>S7U)^vkkt`kPD~09p=<`hOT_-&q?Xe!iY5TNY5MNBf~gyz$O;)a1L+xQHH<8P6d&VV8iFrF zemv3fTcjM~4Gmzx43#rjCRVPB77G(Hc_yqcqJP#WfFqPvBRxvI|uNO446Gim= z`uzo90+hG(S7w{v`wcV1JZ# zd~IS~``EdIEC1y5KN2asA3_O$uO=A}2fhEs+YbleyaefIDSjs5=432LUFo3;wu_Yq z!+5%yGcZ6;$c*anV<^3BvN1~vy`AtPOD~zgO zEer#QW-R9FNtOddWe-7R*C9N%DR;-GMBH!ktQ}IR2}oa*oSHWX40(uA>g}6Y-WK33|94-CNw0OZoHe36Vh7{FJLA;v`(IJ8vGyfv+d?X0N)qjC; zlg;Vx6ughv_1%VF$MZtIpZjE^xF)_BRs1%96r1vy$IpDf zYy7c$v0n=!_VXAOONVxm*qnR8Mgn5pr$PZ%HLePs1S3)dsn}1^=|sM5UK-=W|nnC8q5q99bTG z1aM>eiNEh3tg2fgquSJ#DhzGYYcr|(drOr=8XMlpD|$^1fk>?IAgFYid)14F;!>P2 z_g`{2fI37JkSo>8x3t(7KTSsoPzNg5_YezagD@lwcOTUmu-`F(AqEiaQZk0F5^t)s z0?hF^1Oj>F_;1qKCG4?G4UFEw#Q37fA8Abl^$t=maODH|yd*2s$KZHsW7I2r38r-nqDL>HViSS zX|cBy-Iq$Maq}gXBWV)YHnqXB(*erpvJ=7%bZo#ja~+u}ELu2p8ChBKV&*SnMc^D_ zH!C36nBX@+4Y18Ou7wW6a$$=rO0(2^`sdRmW`_x8MKWVcy7?SbJVH5=J8%yo0a$G1 z{v^Z4j^s_L!*AH@J4$YO1s#fuQh~^%Nk)uh28-;XxtKfqSpFe>w%*MwoF(6J2?1dI z_*^gcvnVfsIK%`!J03LSR0p!X?WXiVR=+WLvZBJ>2)N2pI-2Di)q}XEHnLin$A=u4 zzH4X(N~L&eo}i(cNTTnQD7evln8w_dxwHpZFqux&Ln>l0C%GMy#k0sw=!x)3L0c?Bp2 zXy5b&jwVn!LoyPWUymFIjCSXo6>yVBZ&0s=F9uazYQ<2}SD`%}-Nej6faBaA`{MoTI8p)3g!ykff;EPc-(i20LV>LwJm<+g z1jRwYD+6DzUJ7s+`sWmr_)J0owkO2xbk$4DHgbfTdfXD#eka&ZZ5Erk{sJQ`5f_uCa=JSA-$f0-f z#De_RGrwKjszXm4*Bi;-IPuEkYyzoBYmC*^b2q_a%py`n#9u{S|Ko6CQCa?Z+hOE3dkC~ zgd=KrwJOD7GYKpY#IBq2k%h>iwjCksZ=Su-Qg-LfW*C{!*hbg+8{~C}B9or;`dGTFC ziVCHY;2GlkcU&dAR7DFPItv$hB}Yjx5i)b)YTfj^-V@_6d~< zl{XkC;uqVX8;atJS$d$zexhLCp!W9wSp!E3bx!IpW#}jhSgr3#2&l7}pxBH-*1g#> zk=bAEb~!xa`KKyqA{Z6*xKNpnLZ4;K6zKIyM_F7C3fpq7QBA_anAr~=pVq1T z!*CpGTfw}NZSi71-p%&?5U=g{&}q%C1zjPB z;vm;={F;p6AZErA*@qQF;^{mN{r8PYJQ>4WPS z{cX|CbTe}Wb2UD4@7y&lH2=FkY|<^A4b!L}&z-8m2LuXt0(m1JV|ybUM+|y)rdUw; z^?ClbdP(@=(vjNuUBOeV@8-;Eul)C(HTZCgq{;d(13wyQr~vbu97mp+H6`jcq`Q(5 z#&cmGbt}0gDeChcP%fLq2vky5w~i3%^j#0kPeo(sFNpw9{|_1d0CH}lLr+9aA|S&` zz5!5tOt(J0=C8drFg_V77?-Jr(d;|xF%)8?pBOm|OB5X5y6=gn#pt&qNAnhX=6dmc zt0rz%BFqW@Yon z&&l2g!@tT;?S@aHQ~$|t7V%wfZt7F#>~r=ZtJ+pO($=J&%YFD`9|mF_-rE{jJ|0mG zwnR$ysM;a@myLh=Z0&TrkYT4i9J?TjU0p!BX#j%FEt3lqlNvu~9x5;@d5;t5QWmDW zvuMxk)&W4SW|FiKPdhq8p5f}()AM&iCMp5Pb5n=$^|6&}gn@{UuPAT;T+UQBnk@KX z3+1Mh%h<9tfrNNYv@Y`{;r|&CMiQdWin zYe6tDyPO)HF&RFlWf@0Vr6O(4nQvIy4i=#o&dht%ibIeZb!v`&ND(dM)?fN-2#el1 z&oG}2X-S^nmdK+TUzPYUO=6ip;-+YEhIINq9Qf!f&FmiMsO2lzW&72T&`qpCFK61C z$8KZ75;JNOU+84nL(dpf^0aq@kmxjs139_`>L0$Jw@Pi5cuC5XvM5Cb*qYHsX$CAw+{ogJP}pif=iglb1(aX5Rxw=NIE_EymPF-7u1D=$ z)oEf|jk=}ACe4tGFkte5^K=uMP>$V=E3c|I(bWE`#J&Gb3yGEA#Aznnau62Nf<`H= zl??zIp}^&_QGXB1pa#qG3CkP~TXMa4H0rlVr>fQ;fH^(vi%bp3j6D=T)a|lRn!Eb?yg6PM9Q0$)=uW7>Ds-WjRp8{~Uam%p1#QAFvs zbKxAShNnuTqX_};Z_|lvh6)z~8SW@zUf%8msXzX=htL5tl;NYqqzShl#g#}ZOO_z5 zkNw1VAt6Iz^s|z7vKo=0*uj~#sC5$%=H*SwQ4b019^y)PY5e#%zo%XpZ5Darr&;0} zCEAjlZsVOm;KFmzZ?)2p*cDc^_azu9)J}-ZS!IGn5z_LmNGTXiC*}9HQBNYB?jSA@ zqbm|CVBy4b>=}l06Nb`z1_>QobR=+Y1xw3)uNi*&_)8=*Y$ZEY3n9@e+(H&2Dp#;j z^P(1ZQd>6+b54U*5eSfi<^hb9$PXpt1?5xwe`aHekrq}0Eg-S1V@kd!H}D$xF&Ksd z6otK?lG8k**pCz|rtIbFF+re`8UyJA(J1a?V(7e4b%yOBAh=V=1Gi_6=v zArqz`w<8Znn_&=*(WhfRzw*K@^KI#u7}IN|#RGMKg(fVsXb2Lm5@iXRG|g?uv!^&N zfg{D%;E(JV(wy{2y55z@N4Nk|o73CK6)939V2hjxtXNucu=NBr;{Gq)i0AwbYVuj2 zTxN|FA5LD1=(xWVM}8nxu=lDPGI<|+7V~{6>wQG=f*0{a{5-!mL!SgjWooCV%rlKS98$Db(ujGa= z7y!bX@#pyRF9{g1lWGA^;Y$n-*v&V)28kf%u`-yZ`u+jzzl{C?aGZ-j1-bnJO#c1^ zo$-RMU!f;KnGY1teeHh>%r5d_b_-F%1PjxP-m(vVhF8#v2B@olVQ_Yvd z+jHghEpSPdQyfEL^fEzHR-$n9n=V!K+e``1yfk@*J@zlm6 zHwE+7w9Ien`UGcl101{UBtauNE&y>@VOR!*mX##|aue^gz!5j}ZLBn{M0^N^)ypixL^3Xe(Ng;mxE1jU zRgWSBWP{E($9|PuoY>DRR9SRfa0NR`4@*XLh%T|9ZsOiwTP1<`LM`dG8aT57ED|w~ zSeL-5q{LJYnN~rDeUQNdm4>gYApWbNX;d4~$Go8D5K2D}U*hlIR@x|vRpus@4pwb* z{j#a|YuJH>hb2!OfSj}(Ef?_=TIt&dt-WG;zg-Je~49_m(tL z$p1ca-w+w=WDzW;7x`=FLy%=M;*Gd{(Cshjm+z1u&BxF~)VF3B?IL%-8{tJl2PBgW zNagzLaCbcoqd&I5@P^?O)^Gw!aRL4Qa17`m1#AcgBN9LYIFAJE*KXuS6^~9zV8=(4 z!kQXw1;e2(3t2&n1RBV2D6lC5AqMl18qo>-Mo_rP-Q5MuB7a+ zv!9F4L29tTYiaCg3*5F~H~>E$FI4daDpDbN9{_u72mT4>4zlol_1Oa0;18HGUWXC| zPlvYq!iUCPCZ7%}>`7L!wv&(jOFD_`Hv6QZGt1jxt?Q$Dsu58W&9^ghJkTx#M*6I| z2lq7o^)Am;fAp?U=#2*5Q`j5ve+Q8_;+z4sD9D-z4By`6rM3K1z};2M{NLSWcWmxv z(I=xHyT2_Xv-xdRVzDGbDIX68-E)MbiRmMss=R)C0FG=~zc_}Y$dAZ3-=Z`CX!_s< ziBIg~^f6B_6np1KAc+uK6!vybiN&%O!phZpQ#Pqfi$NySLkhEDq?`WfEm;Y`XzME*>Sdrny^k3JoVWkA#$lmU~FiECMf|MQCbM^EU0kCBC$p$CZq> zS@GOodjS|AP#j3g{MA<}ZrwB5?{wVB=E7vPLW|l@SZlUoV^rI(D3hnM&pWGT%fA16 z+yg56QJIVRydDc+Zl`AurPAKbWSgK7rMHRJ?550>q2d*(6O*Pq7y}uknK9(P8*2x6#VchuMsEK-oti`n- z*OIUIM%I2ApH2JMdTSq^%#83tRIKmiK$KzP_>9uD;q^&&C4;rBFRJYHvBXDeqQ}Jj z0>J_`-&5wH5ViIZO%6X{I5n87PgFF$6h;&3u_XavCT=O#LsdsDAvvZ~kKCx=A2+pkF_ zcbya(a0!vZ@uXuS!6~86Mxm2MV)%jVvLmIDgfLJ-WmB3Gj&l)CO9lNLvrmQB7NPQ#s{TGjb#iwD^Cj19`Tf}bO%yqVeSP}@~$ zaAxt}Fa7ufs10m#5I&}mkgk^KsLb!4?WE^?Et~Mblg+qEe6w$4km`XtTEOtyebHPv z#}mw)7CyyzB+E5RP@~MGj`3(q|19rb(QFy$^s05Q{C>J{qF_AX>GPB3DpwzW5VJqM zz|Zgd@2p0iSD&j+vwq}?r;DYM+}K|KfBgi{NuJ{2oz-yn?dKa6s@8>^V-eBx3*w75 z^8}W`@>9x|aUJ(o4f|Fx^#W^Ar)|OI0ns0fhGlmPF!|bC)}i!;P+M|}T7$c95ef1Y zBcuV0Zbn|%X*fPQD~&&RShOZmmA3Ad{#_&7OJ{3=V2y5&hJ58=)XYqZbXIzYR&DI| z>2Nh}K68IOJQo>*k;rx-W%HZa%xBY3KN6a%vIO`}2GVd<(T6ssC+5 zsG(M7A`EWdEFqZJct2?5WN)OP!Z|fmQ?*{2NS9EwLl%Md5}ZZk@5!+l2vg=l z!_3!;Gv3k72kE>KEf?|cO=kZ^Z$aV_H=_+{#{MOq*q_Hll0}vAI~|=-{+;=u?38{b z)r^8VZz0h0mAL!7zGd2)em!PwmP&_DCpsA7;OUs&5zg52)~WZTl>r9PIY2>LCRy|#DU_V5{`9*L7myAAt~yC3kga3}FH;e|Q=V$A*oJvEOp0SAp{x z?~e#(SBawN%57&dlYGaK4Jw0>xL)givHSsaFkEju$>uw*v{f&~y>Z5w}IBZDkmrhBSptK7K1rnB!RCD{pF?wML7uRu}ivd_c4UN-AB z;F}-x6NKpT)~zpi2u*maEjB<_SQS@>ijq1;&dD+u_P6wehY#<(3lp8er_gGrm^Imv zO+L5QcEJ`orV3@fJEPOi)W$-u^}lU0NT)X|PT2cEEdt#&@d^3i^r;2v^NZk2$Qcui zUwnp~9V3)&&AS_G;4!?pYbhP_=@zf=X!QpL)C%&}@X+b(lifx5?U39KZW>jw%6sz! zi6~a4+~eu?RTbANzJ#5;TgZtx<7d`Us}0R>b$nf(aQiK#K9=?!5<8waC4}N~Hp&w= zO4FM#X(Iv!GlYoA5OK!MIO)u{&Zhqrd-u1ZP0;5CSbtL(GDxYj2^7g=%!dEH;^ zO&Oa`M`^J(7Se@WsjFrqb-NvVSFeHpRgE`_4+%bNoEz&q9KL*bG0BYTV(#|MC7$KM z7KmBY$?~NdBwcy3e*g%V4Km6xN~z2Axy%BJb_kSy#ZYc_twObTCaLEy&5y;Mls8ne z+i+{8Jyk0=&;?LAvz2%aGcj01aIaF>O}=tKKK|{LX0C&wEyS0q>QJDX^la&R0bk50 z!I+~q0=6uS>?o85_++JgKP!5Yzwi9SD+FVnMvN_a@-{H=HZhF5T%Cxl=nd1emFflj zgoTBM4S1TrH4;fpp7i(&%CaY9I~BIj{X-s3Oc;lmjMS^R>KC}9sI%4dtwHRSGr}K2 zzm`4giM}vk?XtHEeZ?H4bB@uErF+ZU6Fa-S855i3GtzZN2x8=T+1I*ENy;bN@>!^o zr;=AkAx4VvcfLQQkau;SsdRxP>+Q11i~ET)8aGjfsNJ1gl@2eq-?S=sdf2ZW1c4N2 zQyktQs4iru6|)5N$(lk4+h_~Q_J1xm1qt%FgSDnw-#N)lcd)Ne8`)}qkuv|S==BGH ze2p;dCWB~hqQIcAjWpQzoN@^f-*c%@fwRdOiq7w(q@$4)G^eprbBaYzmTYF^ zmqi!@ui}zWhyBkiss2^`ip9K#z;0YFhW54ZHgl~ELsfO2uX#itm&soy=Hmjt1cH8H zN98GsqFlK(;2v&qCVk0KY{84Ym09Q{F{^|#K~eqm$-mS*BU!$}S7wa`Tm_e7AqFYZ zWF;=Y{>r!e0#@b}Twap3KM2Yx@#0QrLScq;#;fH&HdfH!!xnBwnZ>VsP5j_5Cie{px2F(EF>e$z9Bq4b5$3+rS|_@- zxB8;%?wY0_6wDHDGyCBYrpsJbpgt^dDuI@GiOinVRxXcfI9QgO*fE|bSnX(*SnwSp z?tDm@vA#m5H{rVXL2b>ArQ2FTbHjAPSLa^?&tvO4KWZta5=LD+A`6Z-|3p$&(Z)m>tNaw8%l;hbWb>*^A6@1xaN$}1(xeigh zYVl)*U{AVC^A{Wfc^5v&$QzUmX4q)Tl46&h#7Rx?xDd>o;du;{ImqZ=R|i_NRcG>6 zvY17TbM9s?K;C&w&(UdECt+o)ArT(ZF7G257|CmRQh4hdQoRFIYTyn4Z5qT$P^+;9)UQJ=Gql5mBR5~gJ-8{I5^z^Lg z%o#qH4F@UH7Wx_yqd5vf6I#RDE=G&kQ@FNjqGZT7tw*ca^K8nvH2x5&iD|F6K0)QY zlorl)rN(i^;}x-4DOB#GDz*}!-c-|Ad2+}8_umSUhLQ@^a;Ze+USJI#WaM7#^pZK% z`ea~RVtBOJom5zS9?}UGopse0&`Gd~T6eI}F24&NR(&#y4PDCd?Ntcw0&oye1&%pl z_~EL)Rs;+8a+o2tW?d@m0A|Y2{rcrJnusF9#$3R}iKU#hkx++CwB?4Jm(OgHfxy_{ z58zj{jd8Z;hIM1|^k(hwkIzdPA_EN zg*aGnc#arjazoRR`Vgj1(0=N8yc3at*zq8&^in|NfOIlHl_bY9$)nlQW6B-FTiL}g zQS#e(!gsDQp;fMqpF)Tt^th1O?IMLE+;R4tmMvmsHY7c$lP~jQZ8$WED5OpaVhepc zO`G#n0ts!V`lg)fxoUK;n8-kYFa{df33nyI|{=_GL4uuBev!(KhV-k#`1m{j0~ z%)<&rdA@x^F=bghIF3wz`A#VKuiMx8WyD zi}vs(Yfv@CZ!`n$)Q)8%`?vws?dTb07oz9K_a1I8CUtTJ?dejvndYdt8fri+j!-gi zgQpQfMoYTR@nQwK+M3UMz-pBO!T2y)G2M)zJ(4=Jh6axB)50>EF9U>gHyo6dvqbLv zj;@qZjdm%tuQI%diI3RqNECgpfAH!wYeV_N+h$8It|RjCgoV*k=-Nt?Jo(?*<~-<( z;St0ImMO+Q99k!!cf=QbW;rLbsB{wZs$7gI5Vf!>UQX3^IP>o~O8xYmueg&;J8Snc zjB`JQ{faMd=U2nkPT+2(T7vL`?Hj7#BxAmYPYU^BV-VVpB1vW{$Id8a606Z}y(6Z_ zFwzZz(F@;KVL|cLQt}lbcukZb9}5 z^p?~4`;eFNG@SkSVtv}3G;>c7q?Yn(=jChIG>YETf@K8MgyZVG%U+C7Cplid|uHsFpB( z8e)&~y3Eo#B%HJcxCUAj;agYYqLhb5HszaeF|O5dhKugs?Isp3Gj0J?gDsAGa25%) z4+|<&7tJ2auiqNtzT9+; zL_kwvVG#!IhngK|ZJHgL)*?xh)*_)K0-wr+)9vj&3;+y#Y%A-+=jA!{z4T}oAn~-~ z!_Bobgea;9or?`~=rmdbOT*dS%X!|1a<0dTmBxByXEGC$JUAh@)OqiTtMh)n=(U1X zK&TaYNe3;Lias{2vfgZ_Mtp)?ge&{2<=g*_FHfu^cg4D0ENtv} zQlNUHheO&3;Vyfh_y_P@F2#CURPrTBApHymJ%^+?^yzhS)raB{PAl{14`2~KVNQRS zkk!#t(1q>8kQZZ5m#uTm>mG&1;QSA%MVpriievXgf}W5wYl*Sk1u!!*-9rV}0=hM- zWO>j+-FwUmoy4lD`nRXGe*lcWFL0(@T@HfP5$bK1!sKyhyu4-&A0Dy=G3iLB1K-lj z38&jx7R(T{d#d(eBbDUbzOB#t^5~U zk`zha8W*Qbp0~wNd7qi!t*;jtT6A)~dDThi0+X1w?vm6Qu-&o!a^{o>BXS7gSW~h%?-> zmYwsn+D=jqCZuvt_H)SK%(lNQle1t~mlKpmhSup@LQQ+R9p9f!iryeoPoEZZ#9M2} z5a2HJZKSr%h~o_KkF2sbLoP_BydW+wHhs~rbeqqA0NaS2eLY>%<9nG}oqqs;CZ5U1Sy^kaf;OF!^3Ywc^C$DdCr9m9$#E`==9(=miF&lEdxGO1Y9E zsO1IMYtD_tgenBRAOgcikqU|O#}5+$QSS}b-SaEq{PQb zrT$9xRl98*S(|aCj(kk>?MErYLEJdqjyX=#K0d?3`B9?61w-rtXLBAG8eP5FpWD4Z zOWC*;k9>;t+`D%_;@0Kqrk@(>jlJ;;^*kfXn@v97toAM98Ts`xZ)?9y7tlRGq$eID z9H{>4RJ8p{qxsd;hwDaLG%&+t{BXm1z#!lkTlpV=mOFhuuu|2TBZobe`Bsf)J;LEK}*(w-XH&LHS1y!kjl3_N(gmilo*FI=$&X}p9IxjPc1ntX_eo8?cvrW;nh zrwrDQllX6}<0!ble#*8Ooof1jzDPb};}zeBP((n{;qHtL?gIkR+};>2+shp*fRP%b zjL961R8H;#8fqT(DZW%^jN6Cn$VZcUQE2DyI+hnodZ6o<(&RmF1oIXmmsC=SI zIehPGG9B?9Tb>4^Q$&6d-L)U&{X5n&+^#| zA%OkBza{C~>$|ZEX6B`7(&j`3)kh`5o3*?q*aPgyw|sG}(j0c8hASs|mtj=qvv{vG z*C3CZGxClq%Q)*zBp-Rn7BvkyjLdl}-!LWt86;|#vQ{P{m+oKpS#qAp4a=7f`8$dr z;bty7;pm%cb}nJt2HaTz=>^kp9=)@;x<=cOP3@5}gVB4XTvOf?h;WBhoz{r8tn5;Q z4XSo&AbQrweNGNqj^s`qzrv{t{j3f3O_$f0wgJgo*!K9?+&1x2D!N!(ZpN*T95wI{ z#Gj3(wZ26hU*m%~w+tU8gc(ND38~ec2ccshYehKapjagFK?<=Od%_ z=iph^FS462I&3)y-=38qYKH}q{$q31i+R&{71|v&0&Rv?=$|K%3J_2l5jE?6wAa|S z6gpx$H4u6^W}{ie6WN+D+y3wqRqztjb^oX0^n8hUv?zY*wpdZ}4->FVihD+Z0|smu zEutxmv#EytXu;BwGlM~xYK>Og$M|S@Vp0RCQI&e!u6L*is^mq41@Q8BtB$cR6X>Jj z+BhE~Hf~jLH|p&}YCYb=`Y<=xO{~e>OhGn2mQB~UFlVbVgu-^E$8wXJ$Xytm*@U>R z@CUZ6I#qP_-e;hw2HL`JxDP40h!xA}(f_y-V>c8Jfl+5vu~L1TE$ z{g{EKT~Fe8uc!WM_%S(_!R8Q(O#w%d_T#=5DTt{+35H_AHl=;2=55MgT#_Fv;}gkV zW69q8%&)H9%L38GT-yWQ*-?H~hDwDF42ji4!{%g1bpkh&y!R&jks+FkDt2~Y$TXtL zl;hWBl!)`o1yU|G2NaML%cCWa=B74;|Abpl_v4J@H7w8Ns z$HD+%5MW@S(&@kCTC9Hool&|a7hQ%laSlkRUCnO)7tk5#tf$DDe7@yAzpv%&rQ-dW zNRa*7Z`B_V@7MV+|GSwpY$~_;DC$EH4PVPzH<1fp0r(!G!ao3Y1L0jRp zW4M@cXWgS$f9N}!j3SVCg}qD~JS)AF4y=Ly+LB!>+q~-3#{70{EfCIjE$oSm11S;j ztG#$isVEDLA^90w81_US^AhhD>nO%`*3V7qOYQ>Tub!m?;y`joC}tph_0C)iM%YuR zY;aY|jeV`0vu6Y(lc`9{EBwo5bzSTB3CgCoF-EPR&EDdId2oPXJGdB3HBDk-Zh8yD zE?JVIC*htE$F{j|wAC8V@)@os9d!m!wwS2~tc`Z&qw(3xw!OeO_x(Y=MR~W2emj%N zL}r*9mh+0{Q@mKV+($S;f}i9!jl0JbN|+^TXGb}RAk7Lp+vZ-*U#6Nsf$2H(8z}~5 z3`CP({zYU*kd{d)z=_l;y=XL>|sGi$8BK3F^C|Ga-r4IdP;k<2aRH_J$1$q1{uVM{JW)YFr+2u~25 zjWp-YX3WwnkDE)^LwqHP#hT-)JwYSER$s>A+#W%_7}29_(qwI^qIY{OmJI7Cbgbnk z6LUG?{+RbxJ0@!z^I7kc?iF6)x7u$m=T{=HoHoT9L@x1PWj;y8GowQfbG&Z(t^W*U;Fic+oO@;b&Nxo*vz+A6aU2aN*zEvMxx<`^) zFE8TDDB>)UNPgOZ4YAof>YwQ$re3;<#h=Igui<;YUf2Mc={eU8jh0`_L)y&MgJa>p6l< zQC-`xbYf_%LSs1Nex9?|-clik_`)4_Qxqdl zF&0H#{1Pt>`wA{NQg^=;^qMCA8?NlPhPmPFEbI9lNPaqc=gmev0Ua7mxJ3yC7mEE2 zcAh*<=1J&EtA%p&oLh6y;JZipD>tSrKF_xaa)^XSM}CEusjt}Dp|M9@uYmj2m+Bao zdk>x6Tt9e)I6|t+G3;jr_n}VBnf2^Adk8~>hkn6;LDy2tF4_~ z#w0BVH=!E<9}b4`W2}^|dN9*R4Ye6IbJtFQ4_q@J^=1&?&n@#DagVtZm7wUbCNvInE&hMPV)`Z)k4EBX@{-HMN$i@)N!l%*U1=>Kwd>C%4Nm7YeD^;VNVO7S6Jgn$lyH8GJxVZZ$&}w zE}1wFM*)Dlw#R6;0U?WZyf$n>bL|wE*u~ErMFwa3i6bq40Po=5EZ5@cQECc}eCV%SIt;Jt znzAk3LDBQo&YVc6SxAb=im$Dr4DD)9#9sRBto2yNwxJY`OIC2r z`r)k$bxEnpMwQH+o&s!8)t>$wE#s!};o*=|B&erU)C5{KE{wt@D1n|2ZgTt%3jX`I z^j+G5hQWJ%V;(w$#KL3KfBrtwDM)i?v%`W%DR;=)I#uI|hK^W!TGH8#?-r^1I=Hcm z`b=t*>XH%W=PS6N(PX%D~Qa<6sjmGU1h}_dzVn7 z9GqBv7aW3wrg`z$61GX`R!nk8lH1wHyrOE!(%W4|#IW{!1@E^&JOW&9YVNzEc4~!sqSQWEDk@wXrxyoynS>FINx;6uTmY zUTR<|cndHfM+3S1mf^3oO%1_wDO;|NKCLK%y2JeDw963+^kRiqIgCs%hM!s4)Jruq z86U7H#&;YyO+|*D<>GQ_kc!BQbfEaU5297~erVNBO;4fQe=A;i(~{GR`18rzZN|4@ zOYKc*J*ySWdW@4b84g0frgf3|kAbY{6`&kRYxow1UGUs#MA=O9+V$aaljTWq-72@$)q)%E*% z5_!T@MEa+^=&0+oZ^V6Hg7ulf{CAbzm}{uifZA$U3ssSpMc_s`VqNBbn3rkgqLmV} zJ98yq^@PoWOJn>3PfLUjfg!lHbpXkNJf1{p+AiT8ZfKJP+^mx!o=(Qk-1}tf`BzI$ ze;H|sGgFm;WI4tF>S8p;C%l;_7~qTj*E8uY64g3A)O(%RO24K1EC?h%ab@^^Vmi(? zN}huxA%h=s=Rm$+{_Yq#`jnwjYH1H1V_%tY@dugu)z5%snK@p{G)b8oUTFIa!q8S1U zs#LmX|F+ktW3~iYY}Zk&k?5P^sX-BxA&`{IO5tTB33o=)uH`M!FWnvDVFso1Ymcld zX!Iw5e(0=of2z@2Vjcp9Be6(TZ)OLBfRsgMx+Us-#OusXPEmR`^Stw`P?;kStPRe8 zxK@&pDDrSBCo-Jkl|ea>Sq}UIxU%Q_h&g?I4r_K6zxRdv(%ZLAhsM{=`j}IT9YCb- z#}{Ms>vPA<7qE@oN=U7E1{p5Ly_xM4(|B-{#M#`eA0IZM1C5}!wq{M5N52U1y^nWF zVd7E>3Y!j>^luEL=HlhwrbK98=4$pY1sD zM|Lf3iSf>zGLIRGB%jDlI}dZ@!r4;z!F+OpYY^f!V_(VY;^&QU`Xt<8!=rK(P$f<6 znA-VX+M}eu=!lRF|t1>@Qila92irfBZu1lSuq20cxNv|O=dwEQ;X z26Z~OABdiHE zo+?@n*@*ULdpC90C1=k_R2%F0pa=pBd(w$AYa==WUtwum?+>XrsR%l#B@C!Fpr0k6 zngOFI>}GLIm3eh^E>FH1d}$5FjR)qMcW+X4`=5WX+tZwF#^-uwFxg+00TxVqt!%f(`HpqNlzi(`9&A{*5}W_`*^;>HCgD|Qq<(o-~2RFc|JaHLW`hNyP?Ay1AnWmPzg_Lg2d zO=!>xAY%Xkvyd6$BO#@{O*zBITN<>Fldhy%c|!OULcaDE1Wa;ONnQJ7ltQO+CAcjfNP`1$O z63^R@g{0R=TM5+(^Rw51p$?A}x%*=>n&vXie4ZBEu8oX)Q!O;anjMDTl|bSS)1=X` zFb%x3bxX`N2e3g?=vBntj>ONU#pDcKPA52%vj|U#%@FK_Fef}zqhTd(yN@F=wc$9D z3I$D7^K7_wd@09jpEC&e)A;yWoMZ#z-@0CoVhbo_1?ZDPMj*Mzv-k%KmB(Mc)N;5o zO8SlpDc}JNi-9%Qb|Cd0y8OPrZW}o6ndjusN$NV7?r%&VfM<#LpQIKKLHwPkOAt7F z3V43Se52m8r@vwo=1rgU*PZQ0_HUuNpV7}-kI3_}z5B@qb+yJX zt|PK$Y1n~@d2HI`dX!hOtiORXlB}m34g+faP81jCNHSr_btk>`vmx3EG}npui&ckD z(t6ccY{zWtG<(oU;xs3M&UI;MeCQ&SE*YbmLW-lGNUgJn2{?nX1VH3)%M5RElZx0I zU<-3(pqecz3`Z!e(k2`*hAMtN1>GCd79=}Jav~FiWo);+tWfGaw#)L5*P&}Np@$Zo z%JgF+4w0rwFFw8d585^lTbM6QP)GHQ3;6Bbpz?ce=+{T&oUy>%lrqkdKJ zV{oEAMK#HSX|V_P6Tzsc#t-z<(2tT$5V47yE_hiC!DYKc-`9UJ$t1EQQ*O=JY>8wA z5b4!9zN5AAt^752P2_LX%c0BE&VPaZY8GJ>yktGyOGVaUvzO*UPzmAj|+PBs#7TA||;UlZ- z$YxiZC6Ajt%>pyU9VZ`*apY%SNl3mGiFhs#ilwM3E`m|`KLPbArav!;=casx=5uJsi$-}56cgC^B3ZWPeu+w&NjY&QNt7RNypcHDsrQkys6I&7qGqX;4Hq;(xj@Xm-Yw5UJ zGtUB;P39uzpTvTBzj7PPp#0tXUX%uT{~k4!QC~602Y{H@)vee3hH7k zW>dDzC;O7(a-5ZV_&cLZNoq9QW%Ro=elvUl(v4dxST}z(;)m?wi9*)2Pt^^&SvpKi zYPWcWQ>COQk^#gfnW%6x^JwZwDC85Gk5f!e)x&lj1-7H~xgN}ebFWCDLSyFDH6~5e zquSsl1l?#_B5S5g-2HShCWaDXQt&s<)k_Q}zYEwSetXFaSt6KPcPiV*=$= zBoxz7dEUv_x?vlZG4+!6vt}|A2k5m9Kt6SUbSH4Y)wwlGx9CSIC#?&?^ZhJQxvr+Z z&U9JlL^`3)4G$>`H>X23KxvF_k1fG#@X?-nfm^&37kGL1x2uG2z*HXRK&28T8-RSBu@6i?yhwZs5Ti7TK zKR-qrWYLl2S6NVpYNEp;Yeu${qDB}>2zG~ekHk2)5!3UoGiGOad;yU)ciF6lX-Oi1 zm)+Z+M~&pTIo_a$9xVN@VLO8Te|`8Awd83y05$X?a>tk?w2 zjDW3&I79IPB|=)Sxu}eJK`msXnoIvSDg-VVmvN!kmDj+H%REX&CG_=sp}6!{f>O6N z&EUARaE^n1KXKNp0CZ8PYkQ7qtnbUfy=RZFo5Qo~FFyapRtOT&>~zOx+S<(HdTu#ZyH* zOEKSbTzo@CJnS_L`8Y;xk0X`c`o{2DEqZqq{*8-6{c$v73n(xSd0c_qe->5PVjOVy5$|@;7u6n68bA;dLtj{&0y9G1~PDAl`>A^b` zS{rlmb-;J%XAwu-Jb4cuz2e}UUW8DSpikiQIol-%qQz!Le~C=*^xwnc(v4$@I2NnO z*Z>ngbKy$oPjR5Sd4yLlB(&#M?bfK}5t3Wn?Q0EXCvdD#KZjAp)rJupz zwjV6IOmYjzW;@GFI?x+x0=lpW!3SJ)Eq@>XU&?5cSKb6hg=!o}#L#S_-XZ{$2wc(C zi1O&Q6g}MH_jB<`lxnM?6&g(bxO`Wj*GX5_nga``#+$$e6_E4^0cDg~VP=)Wa39|Y zZJqj+0W)Q4Kbw80Ll}1dpa~GNWyh$B%`jW3s~nFP3I-|_5ioZ&{4;OD=>4iesw1uX ze1?8hDlC8><^4$=r~CSS=@39!m z{dw&7VbwF|gAXc2FLog2^vu@VNM>}tcMD>wH|HO?<`O7=eC7~teWIQIAEmu@R2)m! zH#*25gFC?`zyLG2li-#Cg1ftGaLWLJ;7M=^2`+=XJ0y5;_W;3zdpLK_Ip6cH=l#}Q z_n+Idda7!7^;A!F*{=QDdsk5D$$3gho1)Pg5*JGe(@R`@DB=IDkyK0c${<`%3%Rlo z7p?JXxXfZbp5IQ<3yoAo^!&($>fU#C|3UI8N{xu115MbbO?!hl8hQbpmOKyUQ$M3t zq3AYU4%DP!>I#Pt5vsD+`RTTmK!Yo&mg+ZZVXo&zOEGTko>%TDwtBsNuCU@$-y5Do zUmI#LEUuSLnU|RM3?#IXjw6#MA<79coLVxf>ID*y`6TE>Sox?k$<(7W!cFcV!7Hf|N-|=Ctv6K*CR$ zd-8L|2wbh!lisxyYHBna?;i33kA}S;ynK-fYG>NLNJUe{e1JNpW$_5pp;mb~DMY%# z%<)}y8)~uanu|U{fFD&3QErCUq}@vt^i{48nN_OvZ15NR39byn=$Wt%$`6~wgR5im z5+8Sz7JY{-oi@$V84TN&3K|PIF4{!tJvNfXY^%D@x^6A{l>6ju<@D^P;9)9wU*hs> zfLaIJ+DFqNt>3Tyo5rA7nfmvYr2iq$M9Uo`ml5+wr3I~!d2QrWzx?;6&i_X`=@+d? zEUHd7!Ic2K$RjDoHzVr?&!Nnfe+25D`J8EX1V-x-V zcH!^r`Q4s<@~;1#{eS()8#m5>D(8_>{-a?`>p=Fai0|ENg|c7xWy|=ER0q+)HHHv< zo;^GiqAdE)9Yg)OB76*JLbVj>SM!a%jjq$A!InPG!PDrXcvAMPKPltg&V%P4!Z{Ca zzM4G!ntt1IxqcEX{P0!v|7Rk*|IZutKV5z`ErThnH)$ys>nu0@t)M12N`tMafxQuy zB-anM6sXzfc9unyue&LcNgvOHO8;~!eA#E8(2}c1drwm)3rAFPg_TTiGx!##{L^5g z>qE0YAN{fu7hN15rwS)>AgTLLx_2j%`Q7VrpEv(f@X&*@fT~(%+lRb>q~zNtqhFme zKlB$bq-~e$by>wNC(0u@wrXb0SbwOcVTx+hrn62AYEYJ!4eHUe4S!wUb_besn=WV< zI6fDa@POp-DtwlPX$^+1ebGDiMsAV^RiQ}P(AzV&SoHKm5q!=;f&u)$UJ%-kqUh@u zis^zhyO*u?ptrBz3Ru|sC2z^$uK8>97J zmaZO;9nC8%L)-oSqaH@a7pI2$pY#J;?%q>WqB6ns(2I5SThkQ0dTOht87DHP!7w)4 z=K{6nL>*jpq90CC;CQ85MH6KL14 zop-fYU!9H|Cx$@=luLOMTX!px=@&wfB6TQLtu7Ob7OAb8OZCx*2VzJgmnWh=g~ZUm zvx&iQh-T<%gE!8zq!HxAOt2u@ec#o{IKo@D;Mlh1Z50=-r;Gc^cagD<^U-5(2(U@T zLyHsXU6X4YHbyW=*)Pu#8=W6n3UZi1>J>A!Tnb~$st%1?L-?c~>WWGm9+SJs#$Ok1 z#R44QJ1(e3$*yY5bHOSHm~I$&NLZomD7hB%XL5Z>Z`86 z^GqV&Pwjmy8BCY~{$_ssnbk5Q@W7o<%2IMOl!<7 zaRabu_J~3?Fz8KsHIT?*pn=jexDZx#ATRUk{yL&~dD#2$*o5WA{|E#ApO+BTzx%;z$Fnr)G8d_8SX7GOJ93%8;Sl+Q4BgE+cYa z!2fyahj*_$J*`*U)`nx2(LdJ3>)N4fSU_gnz?%Ovyv4+LGgTkxO9Rr6;R_1g-*%k? zJ0@XPX%eO5Fwu+VH;wFl5$;Hxt9-Tv)R`(&-FQV3bvF77TM@Xa0OybypgE*-< zZtX~Gl=0A;i;`m=S(aYo12IFNnJm&@zI>*pUEx(((Z%mK?##XnEc+%KODlo^(9$Ar z+fVHb+)=yK-en6x4OSs z&P5AKkrT!;m5CPafQmu$3S=fsHhv!yu~j!y`l>+#jl93o25!Eu+}R4)*H(J}LtweUqum%8Yg>s5#XHxP3J^&6@%Y|l9`NiUzWp)6QI>D_tF zAxbYC^KGJWoxGzjHS;gw$6{aml$=FZF0Fa)Zc2>vB+x`|;F~32{c-~>xQFAiP`AjS zdaU0hRLVVa4kIxp*UrWRI~zEU#`zevG9h(7ay~-4w4cl!Mdybh1kNSsULEo0hSUZn zxHK*XD<`3gT|1%ju};^Snlhv_d}lv>EbE4hFR%HmT{PZgH?<#k{Brp%?&iN7*e^tP zrnjv1e^LLF6+Vbzk&V3^_@DIux^-0JKjXPZOL0xQpND!!>m^4kYyj%Gr)`FB)0V?F zY@t+Ur-;d*3Js-WY1BsA|)12AnLPb){2+pOdy)8U=e>HgfB zzc?~zSNB7Sf@d-5%-D2$QisDQhH}0saT!!E;Kzf;UYS&=hBLyNJJBegx`fgw^5gfM z`tzT@*+IucAR#7A{Kf964+EzeYMcl=G1p>`%;}asjX-m=Nmt48cW!1M3k^D)o}02W7PN zu_z{f=f40fUDG|oL2s}4|5=$y=!F$bP1KXuVV~j_7rZ4h6vlNj8b1zw|6MO%;!V#j zM#vs7JJS8!qJHS0K{EVUp+7;e3^8N5KCIJYo}w(dXt2>8aMubOMktkN;E!x*kz& zb+XPUdz$P)N*dKDwF4k972f3bcTN0)b86{-$j5-hk!q2}sq|R^Sagre*OMdyx0IC2 zn_!CfNX4(J0Y1!onkl55q4Myl=%2nKCDM|-kBNDQN6kJk5(bYcddEk>DMp5(g-|AO z-b$t`I3mon+z|9k-bX2i56Hu}2A?^DVx)1yk_1ue2uhSE9m^DY&tLaoy~;iB=E{{n z^#r2y#&<7YmP}z;*W2i@fFs8XXn~alLo?Z7gac1+{#{o8ALc;9nDshw0{0%>lA&Ia zvj#NY)!Da&iXa@A4^OMVQxa5xq>{^U?xCQwxDaXt5H^qaYF7>jZYK-k9=&$elzrIN3gE?(zv7D#NjYhi_5)Rpb1c6;<_Z?rd>r}SJ!r`PN4%I)ElwYBHoR?bcYZ$y1qN^fYvgug$f1>z%MJxM< zSzue|^|P+N{u-I*vbeK2T;6O{UOGL)@|D)*U)*~K{0f8KgHh&O*pX!^P2!TF_=Ku& z=@B1ugjo@>qdRq8&b0x5V~6^3pvdQTW4$FPu) zH2zQHep{e^#ivsWR{VSd*aVhJhjEHGHvohLXA#}=HLpSm;*IbkMC~-u#;!CY+Iv3We(EF24qaXQ2XZht$Sp<$1vhP$PG~lR5SVvefi}CCuq(mjEZ{MpqmUjxEJ%7?^2FW0%<|<;1bG>7 zl6bsSU}_1cgi#yI^xHK|k)BaW_pUzNVG0lGV5hIERBg$Eh>@=D8cCjmV zmo}QbV?PNkSx;$unVC2;<*U_zkMPoz!#7*XA%@4XKFl9g$Oebnv%w_*KfZvcK4~hK zTZU`#WGnq4(V@KJHTpywN{&&I<~P2JYN{+kU8qcyG6_qFD74?XSRN&XkWW%mvhe)E zc9|0iEi#Cyu=3S!kf7lC4VSB1bLg3?;hfU#kB;$hQP->^{Irz$vCbEPLmq(2q0d)< zxEeD>=;wy#R^*5O-8i~1B>ixmuL||fcVZNT)%v$SNF&;jzy-?aWhyxjs6EnPa1H6H zPvE$B%{0gdCkdAkqu>8UAqgvyTQHlNycuhT@a4Pluk!Q`6-IWwq;J7H)VRWTQ3WmR zBNU(^xSm12IxqkoY*mX%EPmZZBDA>1bSAKkikb5k|KF~4E(UY(I(Ymx;q_?_rIVcy zWP#=g91<9ouybLd(0M}f*lEU-E6o~L-B4+toUyS|gCR`jNCQxoL+1&Pj(FOvS@L9-ryedliOPR*h(`ibOY}2G7o?7MG1xdUfKW;-IwAF z?4=AV6XNAmxuQ|Uo>pP|MZSq|x9QcAoT6!@j3@OiI%OuJY^7L%1iPv&HzK^@Q(!H! zn5=~X%LyacO;}in?1z?aeEhWVe2fIeC?Yv8R~baaWMJ}m(wZkz^cM4Ag0g{9VDvxx zEosi}*Ask1$5iAc0XyNkXCHG?5{hV?9W^S9@e+k`)?`169uflg zTHSIum?r#7Qxra%mrQzi@PO>{HdKXXFrOnXNvKBzTnjMbMlav%wc>3;{{k%V4aTI& z`ZRgQq&QGbP&%m;*zNsB#4OA}6Dzjr z2{~12_{KDsI`Jp>8{NVt0o5+&zapuIz#7Rs)9e9AcM6nd;F<7}!M-fx#-!<}w@5(4 z$ha~&_Fa0hBOG&SGo0Dx>=Wtc>M!3vSa7bD_bHy8&!+v-^{{HwTKH`@9f@aO7lVlx z6>BY*67yVzW=`eZias#2H?DfZ_X+taKJkm3MPkm4o%R4-FuA7$yx@- zq#8Rrr$}PC7{ZD|(Nn7nanH;9aq~tXUoGah1hrXr8T%SkwP%FJK4&o(86ONHWRr96 z#Pjr2O^Us!0gt1`FlexsP*Rn zUN&Iq9F_t>kwcBvDZy$|$yMai<{AH#D+J)wkMdW4M|6jz8x!%G z>s^%7?A5!92y*7Z#5wPyGTmq|3URBkZx9j9($w^3iX0|A1|Dwil;W&2Z+vOG0-nKG z9L=R>RE{WLDcCc)oS>9-VPfD#iNMrL8JB)OTXA0848|m0m-5AoMz_Sq_!$>}-ukWg zAJ(rv2pXl>aR`EDhTJ2xu%?zd@5d?ql%>J%4zvf4X5&m;gPN^0as&x@3jvO$x)YRb zks!7O?-5gVZG3KBaG8^{Dyq`lcL(R#1!3z~&Y71ojH4<|p79k0uN-mYHhZv`VI1+( z@^Op%8@?2r*huLGhV}wH+jGD*|0=QbodePaYcVM&XkJ0F_jTt+u+@;(J(|QeYE0DSWI~lcaS@s{tHQdg-`8dHNz<~ zgJJyGD#H%%_)_TL^3(~ZI6Az}15CSVmirF$LQjO6>D=GrpUGX;aXN_)!!^jva@48H z2WSUk6%GUREwCb*U8?*IM!s-)s@J0%-8p!qQPLc25cml(kWL2dT1T+Cze8=Y_;A|2 zam&q#EC7!o_l$!l-O46jNUB^YLia5$kCi=y@~7sW=w*~PdVgoNaFkrRdgUKRv2`lY_863Cllnjz`J<2AytP?^9-72$bIIRNJ^O|ZxO?JVmAtWBq`dv&VOO8t zSXwTQqlqbW&uF|toQh?$j2m`)S=rj^F&T@zsz^3ZkZQKk{1QX$eAJYnQi)h$Mv*sF zufd4iDLbcb#0wIkb(6icZ~>^uRyqd!vb; zD}7>;!`+i>4E0dMPVYd;feCy!NN)gM-&m1jm~f&UUXl|>obhFZmwp!KUozBj zbn+XgZgRz#-u4+y2wHb~tuul|ys~)WIbX#OECS6ahn(HFIPrMCUW=as(qR0aH&H@H@R&oJ}402 zj#q<6$mDktM{2&ldP`}Km^1AB#ByKV#aUo)a?1IAqaBI;tP1Z%nc@)BAkFnzXetq% zhG2|wrKLI3bv748ZIbYQb(wy4P3s;b099qRPa|irqpLX|ct*>9K%_-L76Hk1VJ26A zEWY_@Qkv3}pP1WcRfKD)iT?%DLRum_jKQyY4rV;qkWqcbWcp2J(GY5H9Nv<^6ls9T zz{@Y{#}wAgF>qF5Z@uaid_6FGtd;qnp|gE4U4&VC*b?>mAzeWcQ7huoz{jWBUGULH zDTl-^lxOMSAmxo+%?Sso;b)uIDBv-sEY9!uWMH{RG2JJ5ozX zlfYN&(jsQxXA)Z{V=npVDkph3epuEl%1ETDW4I2bs9=3F&QGm1=R$aMgA+%rHW@*> z4(v~KeZH~_5*szhqV1-;x#t+MKsPV#eB+OS>cpdlxm{+jn`vObju^#e*AL68Y#q(W^N#{ z9%d27L2{dZWP~M~7naGgi}P%$hd~Liu9=*HkuG*wc#{&zTSWNY*)2DH*WspXD@!-f zKN4n?soKS28}%1JN9T`I9FH{28=;Q^U}MWPoQQkCZ}B19GaC1>_QFVxfrMA}qbBb! zPZ#iLaX|UVD9w{}qjsUnX#K8Hj9@C z^Ck8Hd4B=iG)i>pYE&gl0RSKhEpM{wzp|d3J?J0uW?R3bHXfw#0^l+st{jcn6Em%J zJA>%gSPsOJLli?O31mT{rBI!e2Ba1rpareBjb3J@W>N+#1~0VMs+2VNQZ_=jDeU0P zX0Z!MU5Kgs2iu2|e!Ki*n>Fdz@!+ZMbDO2Sl~OerWy+2VemS9%H0h>yp|D4UcesaQ zfNQ1tntodifhBHcosHH~{&q1%=ImY8>8WJPYJguG7{_{@DwRFshj!si&XVZw?qo;E zDRaT$X5jB*>SQb-aO;r4OvB5Ga=N*0Xl$4kIXc+&ba!+LiwaR9?c_n-a{a+Rpu@ zc_ov*(STi1-9w;9Ss#kw_>b+zWqlZ?9EvJ9Dz`y>B#5}#HdaxCmt=4vj0)J?@Q zpCHqg`8nlnTLht44)nOPew`|`_qJN>jKgXkK%PX(*DWLXi*D5TU%iy4w!KQz=FYHn z0!q<0>CDZe#EB7DJ%#2Q3H@=TCEs&8bWdeu@Q|9D!-7sx=xqM$7Qn(ykDGvsnr#8JT{;ouv@xiZ2=tvcz_yAtR+r6h8#C zsQwJ*Fy~0q9Lp9(9ryK!(~aPA80C;7nNh#;&lQWu)ZZZltzuQ)VVu181G;O*CMVc@jF(`78ZlgtF@V91+)E- z@8#z`;ohGd3~lBqKHY9&Fun>!PHY#3rl87?C{;(cm-qYQQT!#+sRZ~PGGWqq!}2)n z{HS7+E>N2A$e>!fvlXP@=baTi%M}vZb5_%68B1Sz)eo0MyjpXA6btcLd}&~Ws)pDl zbjmn|*}zZjhDHrut*8Ag+Qy_t&V9rUVKpNxcC+-p+)S{R(%g`Dc}p8|&k-r;3?97X zg5e(_QYF^NIt_bbyzUF;e3kyF_0JvykWK9TIPtG`Gk zgU@;>iIrGrc#1E`GzEwnP9@;SKm_rT$;1Y}Qq+E@M2Gnjfhl8#XJEHGA@RP4M88zV z&S{Y!og<+`p3w{~O`Vx%lcN*=y?9(7Z=uuGt4_Xy->6Qt7{CfrJfCoNxQJ1c5^@NT z{^i!!JvCdO;$1V*lJMucVwGkZESVzsx;$NzPX;~D4VR-fUftN)nSIsVQ=GZV6`vM| z?Sm&YY|9`py@&xc;B?mEjK8@=P4ek;I*Vf{1%`6r^KaW=qE&ZpB{b zDjxJah80a|$B~f*j_vY%ZU=CNcAR|M4Ex($A#~YDk_KlUXn8d(Q`pE^K@Sg6W*Q)0gy*3sYds!qJ;H z{-L9?2=%tAO}D-tBp!{pGS_QHD^8_Hvl$6aOYZiF&NK%jw5E{pVVinvNn8?HFp(hX z=`A;Tb7L1)hwP-}uj0qc#rx?eR94g1@CYf;Aj&~q>2=_E@#1f>uXgQ9&CKK<=F1O) zznse9xo9}614LW?0-#84usxy^X;lvW6K5zEhN-asJ6g=9Zcd)M!|G%q?YU zpzIbalbJ%lZXp}S`Ly<`=7s|YDVOvq2GC}hkSU6Ps3treO$*48Nm%~z2q3a@z4!S7 z-R8XeQoDucFvjT8CG1uoQ0pz~!C|!N;2enmEP-4EPteW{PrC8MeLy$WZ37*k-Wa`_G8GfiY?4Usf&E#IKWbLTIo)Rs>6&X(4v%i8TH5C_y6rkA;mcG~WWF$qNs|+) zSF%?!uV$=}+%b!tuL+hdR|?3XsX{xyK*rnWFMu2ps%SDlB5lcf6>4zohgO600he{( z5z7{VR);$Oc$4x*5{-A>FZXCY^qIkXax26I;}$ax&!@CgCMG6k1uMGEgFf9yqD9NM zNcDG4BBc5|3K}X99jX2P-|Fv#9t=o(PN%swJ!d>plbh=1|6{nD5C@u(I$~2(R1VFD zA|thnj+929yBrM5jNO@mHe=T;Oxsh449C}GYbaaK@#{CQ%91_6TN?ePsWU5WPQWd3 zHw8r8iwg=LB1S^PeCDxdp*gLN9gz+@nIkvyL;+5Cj7lN~`G4P$A9YeDOofPvX}a3# z_Qd-lcNby>$Q3cCDlRL8QOJ0pl&N?g^d8g5d<+P$f(NV|oq`s>n9nAj3t7=(y-eN7 zQ6`n5?&rl=vM+Xx=x6P?Yaed@t+AOe9r*|t=9omkPctn zA%kc)(V;2;0bKOEPOH2LV`aS)wU;N-ULo5#jwm3uZ+`*!civ{4NsgK^k+EX<|MmnM zEDFE4X`w{@684g)z_HTs?MH**ITZiBxV{w6=|@INr`%kBc(p+!VyF04d0E~9Eqzr` zuc6l~wZe?KxZo&CDw$L+@avoVE|Sq#%q|UC@V=muoU|D#tY?k_Sp80u{9hyTVqJ28 zh|g0_b2(&3i#}S@hq}q(>~Vb5n7Di%#?~RD_f|P-Kd!%WKdPlYv5g?zsP7wSpi?a8HT`l)CFGge~0@9YP??ML6}F?PEl2fM!{tPM0Fww`D%+l<;wXQKW?bW%nUllUWl@I;Xs8s5SrzrrStW~E2D4beLQR3tq^T#4DH0EB0{P5&KPG@i0D zvi~_aIJY=BxWTzJH8s%-3JS1ay;8#)Dto?&um(7wjV34Lt`&B zI1Vn^Uon|GU5QtRUcwJ`j$M-vofUPl<2sdBDyqKGF7K+Ii?5EucEp?3p6#+Pzt>x7 zeN>ZR*bor(YB`nMrg>HAb}QgVfbvM8N8b`#B5S!5Y;PRzsK4k}Fk1>qzChV;QJq%x zme;`-%heQ)ikIcFX-v^{GIa+~n&Y=&VD3)G8M5zBNIa^;a)1X^9U*LA@sRF6%|0l? zPieUyD1y{@%4w%z?IW(ADjq3X3LPN33o z3%&9@6dVTf3KU-LlitcvWC8~?K|@Y*At)00?Cm{? z&zm&Xr5=ioe(6e;wFm2y@ozdH+8bqYFk#YerRNXHeYR=EEv!P@+UkIEN|+vJ{q|S6 z$AX~52~%cMVW3>!*M}4)WmX{M&M##{InO_7_bw(YRHLdwN0}vY$aKRvk-}Jy+kvJ2XWw8nbn6PTpmkz& z%|THTq9>I8S_4QpmvJpFGW-j$4V+$k8v6$vKlL{n{-3W$kzMf8xF#@CD1CD~13=IG z?Y+Fu7ejxCo#NF09i&u#jIgL$K8>De5-5tGJP<=auAnPlYpY=9U@XraN^{N1M%{c4 zHK_yaak?gNdfQxjodSnhU@Ts~Fc!ORda6Dp;M|S=Y-)97eoW@IF#{$Lk?c+D9WWp! ztFBMYahGNRTQqp22Q*-v1b1z`5dT7AY4s+d zfnQ_3cU8p1awhBfIZ@p&ncF4}#paC5NRFWye=9 zClpXY71<~7uR+VZM1#UB`IB zG<)d`B1afV6(@KCue;K8Fq9Yv_oikUxARi$&ycJjlP$GNs+!i(cuRhs5_O zKG4-*#WPdsmeziw6pG*G`xbEu6Me#MQ$EkwvWx!0R?u1RPwd$E%!gTrrph~Zh{Y1( z&z`Z{#|$*j8FehD*-Vv4Z;ZV9rFLYsGv4r|9Iy;MEorlFIH2uF{g*cnD~xI^AyFrkR1Zs(zx+)Hs&$&3AKVovhQ7Av)U7{pr51cQ z#R%6AH<<1cF8w{lKNQ;k#?lquSXvZX95p{T8F8 zCwI@gYj6re7^-#@m!0(7A9RE^tyH>=nshSma>aM!ZF$U9*nZ3I6O})y=^a|zt>T-^ zIHT=SyE1D$m4Yx`e%&~*^I}@rl%~7o8*7z+xO&Wrhf0Tjq4A3MpKt^j**rj#yr`82afnh zHhhM|u%4rVp47`3$suFN+E5!&u8&S-zqV@O`N+!H9 z&~YFgQI(qT1}`|(i~D`Bwt2a8;&`Lx;d%G2A@af&>(~)0CXv3=I1vE!zQt#b#i=vp z<|U^lTc$Wf&qdVXzu3}}pI2y1NHwLu@QlDdX>_ubsL@(?Oi;^beUB?Tg#?x?c>Q%Y3n5UjAj1pjWdl086+B56k$Y1JPm$?F6kw#&0 zFV%&!dHQ9|Wckrd^ex2cCig4W1xb9nUK6br<2DBU1rS+(mCRrwt-F|(U$)*Il@e=Y zufB(xD?kH&D=mqpl*tcGy#Ri*sa>BseD&BnU z+gMdCZVDA@@^t3O$0YnJnxfc6pVRMb3W2-C<6O1lD*+>-v+nRxYa)mrv~Y!IjwL}= zgg2$g$D$@xRA9r;tk6Wv0o{`~Thcnbg#T`;xYL4#X@*30GwUs`vessVE_^yQWb&!_ zkp2J}HHAOoWoH;|3#$x-3R5l53cI8 zf${*wpLbFwP>MGSF6g9}0VllnW7h_xg_$(>mEA{&A2cj!-Jg9p++J9RvQ(eG`9>C7 z7WiYMSKVxJp5c+I&+o!*S3UxpV?>fwyeWKxhg^x7$;u3vQjxTLX)A3Ev zj|72996i0#tjuF+CE`!Kf}Yh{uTM2}*qk#JOZ5BF2<1phJ#U#XvZQiY#CwiJetr3F zN$omB*sEmflK$afbzI`^T@zjHvfs~q=pTIUiF|p|Hm5bigZ6d)p9!2LdZ#MDm^)J{ z(6{LK3&*6sp)Uh!2=^gth?md|42q99$5^O?pb7%NcsP(s4x{G5^K06NPQR5-3NAC8 zH15j}o>)i;;;vLAQuzS1~|p&e#@=#$K2HqG8W|$r*g*{7|3lHW1et~q*rw5f!4sWj{BiF=# zbc7Vp?zrE5rFZ)Mg>d1y%YRsnZ$@*8CQ~bj^Om3?e#R|9gj5!a$QSbw`9K!$Kg%oAJO=N3+*Y9YRZK+{6eSRM#`&m!Bxt+e`c&29y%nL*z^+eSy*J0XwDODT zLVA?}58Wf9k!wuG!MEEt^xO7e9YHtI*BYu?Kg@LSr#C$_(Tly$L>xDR`Ks)t?b`!9 ziG-CIndKLYF;ntfJ&=uI5flRNc$9apF|Ed3oG!1>i9@ps*tYw2k2&S9yI`$hfezK( z>Obu6TqQf~2j=VYy=#dNf)Ot8?mn_yD<7pTV#3W#A-C(2QunKrQwR&zifLS8p?8*4 z-%E7{@_L)*7+e}}$)rn+snj*cn)lK;cEQoz@FJa|$5@P~j=^}z~S$p4&+>uJ2BBbBXIf&nBGs_Hj z>DG3>PpI=*!|7O6q|1L3={L-6s&3gH6<9^KtP&(rAPXU>0J19^Lpj>cm@_5p{=jna zY~_?kvF|*v*_g^pa)e8j{!7in6BQvIoScq@T;;5iqS6P>r>yqES*Cew0BZOI7dpmQ z9^3o!a6x7yZrCD{o#dRCBqOwx^YyyB&aY#)=YVGF)*0^lT1v8=(3yaKVIv2PGSZ#^ zG1h*!DRn}aqA;WnHiHswR5lxZSXaxI6suFRgkfzqdaznYBuxi~mmfYcnIrry4s}OO zV2`#=0O4%+b|Pnsy}Gj7HQ*>;-pd2DJSt8q!oDkbVGc$aFP@O8KFDb=ptevu&0*8I zfMt%0mlEr~XOqJ6xuE)-uxChToB>9X^!^p046rBIoS`v!9}BXjQ&m97)F7l-&Y(4u zJfmGg=EJ((5O8k`@XC5TyM9ktl3t;;hGTFYp+W!3Nc;Qq{?5uR$3I*}e2fMlc9+YT zIeqg3J*99*B5x1kkQG4YOXkMN0^_ga2(IUp4nq$36?NVUZ+ z#b?h}Gb-+ILBV-br{VZ=>84u-Ti*ch(_B~}+DCU;Wb;_)v%-rL;!yz! zx!cx~Uy^F_;r;IM%v@+W7*H%SnAgr#GW&QCN<|f3)PREJFq{F0)m~z4<50A0Y1zb4 zZHzmV4lMB9d7wE&b1f=HaGuz-wO$JQUaOpP&Rvb;af zqaTl+e7Kv$BYj?oK0bfqKllZzU9IHS5k25~-(NO^+3P3B4sX@GOwYBDDC}z=Ro!`( zH-FxEj(eGru|Ze7t8FP7A7kk!t5 zRiCBw6XoE?0m=Qlr(Ce(SizENF;w=Lo8(sArPOO(1VpZX8=T2N4g?Bb_*{8i1;7L8je;J%B2{N8GiJyFpPuIOY{Io)%i*&<%EYbDX G;{O8 - - - - - - - - - Pixlab - Creative Agency HTML Template - - - - - - - - - - -
- -
-
-
-
-
-
- - -
-
-
- -
-
About Us
-

- Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore ipsam alias quae cupiditate quas, neque eum magni impedit asperiores. -

-
-
-
Contact Us
- -
- -
-
- -
- - -
- -
-
-
-
-
-
-
-
-
- Welcome to Pixlab -

Brand,Design - & Development - Agency

-

Sit amet consectetur adipiscing elit sed do eiusmod tem - porincididunt ut labore dolore magna aliqua.

- Discover More -
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-

Creative Design Solutions

-

Professional Design Agency to provide solutions

-
-
-
-
-
-
-
- -
-
-

Strategy

-
    -
  • Product Management
  • -
  • MVP Definition
  • -
  • Product Strategy
  • -
- Read More -
-
-
-
-
-
- -
-
-

Product Design

-
    -
  • Product Management
  • -
  • MVP Definition
  • -
  • Product Strategy
  • -
- Read More -
-
-
-
-
-
- -
-
-

Development

-
    -
  • Product Management
  • -
  • MVP Definition
  • -
  • Product Strategy
  • -
- Read More -
-
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-

We’re Creative - Agency Since 1993

-

Professional Design Agency provide solutions

-
-

On the other hand denounce with righteous indigna see - tion and dislike men who are beguiled and demoralizedes - by the charms of pleasure of the moment, so blinded - desire that they cannot foresee.

-
    -
  • Digital Creative Agency
  • -
  • Professional Problem Solutions
  • -
  • Web Design & Development
  • -
- Learn More Us -
-
-
-
-
- -
-
-
-
-
-

Professional Experience

-

Professional Design Agency to provide solutions

-
-
-
-
-
-
-
    -
  • Show All
  • -
  • Design
  • -
  • Branding
  • -
  • Development
  • -
  • SEO
  • -
  • UX/UI Design
  • -
-
-
-
-
-
-
-
- Img -
- -
-
-
-
-
-
-
- Img -
- -
-
-
-
-
-
-
- Img -
- -
-
-
-
-
-
-
- Img -
- -
-
-
-
-
-
-
- Img -
- -
-
-
-
-
-
-
- Img -
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-

Have Any Project - On Minds!

-

On the other hand denounce righteous indigna - tion and dislike men who are beguiled and demra - charms of pleasure of the moment

-
-
- -
-
-
Email Us
-

support@gmail.com

-
-
-
-
- -
-
-
Phone Us
-

+012 (345) 6789

-
-
-
-
-
-
-

Get Consultation - Say Hello!

-
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-

Why People’s Like Us

-

Professional Design Agency to provide solutions

-
-
-
-
-
-
-
- -
-
-

256+

-

Project Complate

-
-
-
-
-
-
- -
-
-

783+

-

Project Complate

-
-
-
-
-
-
- -
-
-

97+

-

Awards Winning

-
-
-
-
-
-
- -
-
-

35+

-

Years Of Experience

-
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-

We’ve 1534+ Global Partners

-

Professional Design Agency to provide solutions

-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
-
-
- -
-
    -
  • Best Quality
  • -
  • -
  • -
  • -
  • -
  • -
-
-

Sit amet consecte adipiscing - elit sed do eiusmod temporinc - idunt labore et dolore magnas aliqua. Quis ipsum susendise - sltrices gravida. Risus commo - verra maece lacusvel.

-
-

Dustin A. McPherson

-

Senior Manager

-
-
-
-
-
-
-
- -
-
    -
  • Best Quality
  • -
  • -
  • -
  • -
  • -
  • -
-
-

Sit amet consecte adipiscing - elit sed do eiusmod temporinc - idunt labore et dolore magnas aliqua. Quis ipsum susendise - sltrices gravida. Risus commo - verra maece lacusvel.

-
-

Dustin A. McPherson

-

Senior Manager

-
-
-
-
-
-
-
- -
-
    -
  • Best Quality
  • -
  • -
  • -
  • -
  • -
  • -
-
-

Sit amet consecte adipiscing - elit sed do eiusmod temporinc - idunt labore et dolore magnas aliqua. Quis ipsum susendise - sltrices gravida. Risus commo - verra maece lacusvel.

-
-

Dustin A. McPherson

-

Senior Manager

-
-
-
-
-
-
-
- -
-
    -
  • Best Quality
  • -
  • -
  • -
  • -
  • -
  • -
-
-

Sit amet consecte adipiscing - elit sed do eiusmod temporinc - idunt labore et dolore magnas aliqua. Quis ipsum susendise - sltrices gravida. Risus commo - verra maece lacusvel.

-
-

Dustin A. McPherson

-

Senior Manager

-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-

Pricing Package

-

Professional Design Agency to provide solutions

-
-
-
-
-
-
-
- Basic Plan -

$16.95

-
-
-

Sit amet consectetur adiising seddo eiusmod teme

-
    -
  • Web Design
  • -
  • Web Development
  • -
  • SEO Optimizations
  • -
  • Online Support
  • -
  • Domain & Hosting
  • -
- Choose Plan -
-
-
-
-
-
Popular
-
- Standard Plan -

$46.95

-
-
-

Sit amet consectetur adiising seddo eiusmod teme

-
    -
  • Web Design
  • -
  • Web Development
  • -
  • SEO Optimizations
  • -
  • Online Support
  • -
  • Domain & Hosting
  • -
- Choose Plan -
-
-
-
-
-
- Silver Plan -

$96.95

-
-
-

Sit amet consectetur adiising seddo eiusmod teme

-
    -
  • Web Design
  • -
  • Web Development
  • -
  • SEO Optimizations
  • -
  • Online Support
  • -
  • Domain & Hosting
  • -
- Choose Plan -
-
-
-
-
-
-
- -
-
-
-
-
-
-

Read Latest - News & Blogs

-

Professional Design Agency to - provide solutions

-
- View More News -
-
-
-
-
-
-
- Branding -

Web Frame Worksen Solve Vanilla Alter

-

On the other hand, we denounce righteou indignation and dislik men who are so beguiled and demo

- Read More -
-
-
-
-
-
- Branding -

Web Frame Worksen Solve Vanilla Alter

-

On the other hand, we denounce righteou indignation and dislik men who are so beguiled and demo

- Read More -
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-

Need Any Projects?

-

Professional Design Agency to provide solutions

-
-
-
- -
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/index-3.html b/index-3.html deleted file mode 100644 index 3fcbaf1..0000000 --- a/index-3.html +++ /dev/null @@ -1,1019 +0,0 @@ - - - - - - - - - - Pixlab - Creative Agency HTML Template - - - - - - - - - - -
- -
-
-
-
-
-
- - -
-
-
- -
-
About Us
-

- Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore ipsam alias quae cupiditate quas, neque eum magni impedit asperiores. -

-
-
-
Contact Us
- -
- -
-
- -
- - -
- -
-
-
-
-
-
-
-
-
-
-
-
- -

We’re Digital Web - Design Agency

-

Sed ut perspiciatis unde omnis iste natus error siluptatem accu - santium doloremque laudantium totam rem

- - View Services -
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-

Creative Design

-

Sed ut perspiciatis unde omnisy natus error volupt cusantium

- Read More -
-
-
-
-
-
- -
-
-

Marketing Strategy

-

Sed ut perspiciatis unde omnisy natus error volupt cusantium

- Read More -
-
-
-
-
-
- -
-
-

Design Strategy

-

Sed ut perspiciatis unde omnisy natus error volupt cusantium

- Read More -
-
-
-
-
-
- -
-
-

Web Development

-

Sed ut perspiciatis unde omnisy natus error volupt cusantium

- Read More -
-
-
-
-
-
- -
-
-

SEO Optimization

-

Sed ut perspiciatis unde omnisy natus error volupt cusantium

- Read More -
-
-
-
-
-
- -
-
-

IT & Technology

-

Sed ut perspiciatis unde omnisy natus error volupt cusantium

- Read More -
-
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- About Company -

We Provide Best Web - Design Solutions

-
-

On the other handwe denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment so blinded by desire that the cannot foresee the pain and trouble that are bound

-
-
-
-
- -
-
-
Web Design - Solutions
-
-
-
-
-
-
- -
-
-
Technology - Solutions
-
-
-
-
-
-
- -
-
-
Marketing - Strategy
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
We Have 25632+ Global Clients
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- Latest Project -

We Have Lot’s Of Project That We - Recently Complated

-
-
-
-
-
-
-
    -
  • Show All
  • -
  • Design
  • -
  • Branding
  • -
  • Development
  • -
  • SEO
  • -
  • UX/UI Design
  • -
-
-
-
-
-
-
-
- portfolio - -
-
-
-
-
-
- portfolio - -
-
-
-
-
-
- portfolio - -
-
-
-
-
-
- portfolio - -
-
-
-
-
-
- portfolio - -
-
-
-
-
- -
-
-
- -
-
-
-
-
-
-
- Company Statices -

Something Know About - Our Achievment

-
-
-
-
-
-
-
- -
-
-

3654+

-

Project Done

-
-
-
-
-
-
- -
-
-

9634+

-

Global Parterns

-
-
-
-
-
-
- -
-
-

7856+

-

Awards Winning

-
-
-
-
-
-
- -
-
-

7851+

-

Creative Teams

-
-
-
-
-
-
- -
-
-
-
-
- Our Testimonials -

What Our Clients Say About - Our Solutions

-
-
-
-
-
-
- -
-
-
-
-
-
-
-

Sit amet consectetur adipiscing elitsed - eiusmod tempor incididunt ut labore ets dolore magna aliqua spendisse ultricesy gravida. Risus commodo viverra maece - nas accumsan lacus facilisis.

-
-
- -
-
-

Robert A. Greening

-

Senior Manager

-
-
-
-
-
-
-

Sit amet consectetur adipiscing elitsed - eiusmod tempor incididunt ut labore ets dolore magna aliqua spendisse ultricesy gravida. Risus commodo viverra maece - nas accumsan lacus facilisis.

-
-
- -
-
-

Robert A. Greening

-

Senior Manager

-
-
-
-
-
-
-

Sit amet consectetur adipiscing elitsed - eiusmod tempor incididunt ut labore ets dolore magna aliqua spendisse ultricesy gravida. Risus commodo viverra maece - nas accumsan lacus facilisis.

-
-
- -
-
-

Robert A. Greening

-

Senior Manager

-
-
-
-
-
-
-

Sit amet consectetur adipiscing elitsed - eiusmod tempor incididunt ut labore ets dolore magna aliqua spendisse ultricesy gravida. Risus commodo viverra maece - nas accumsan lacus facilisis.

-
-
- -
-
-

Robert A. Greening

-

Senior Manager

-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- Pricing Plan -

Best Pricing For Create - Amazing Web Design

-
-
-
- -
-
-
-
-
-
-
-
- Basic Plan -

$29.57/Monthly

- -
-
-
    -
  • Unique Websites Design
  • -
  • Automate Busy Work
  • -
  • Optimize Your Efforts
  • -
  • Web Developments
  • -
  • UX/UI Design Strategy
  • -
- Choose Plan -
-
-
-
-
-
- Standard Plan -

$49.57/Monthly

- -
-
-
    -
  • Unique Websites Design
  • -
  • Automate Busy Work
  • -
  • Optimize Your Efforts
  • -
  • Web Developments
  • -
  • UX/UI Design Strategy
  • -
- Choose Plan -
-
-
-
-
-
- Golden Plan -

$99.57/Monthly

- -
-
-
    -
  • Unique Websites Design
  • -
  • Automate Busy Work
  • -
  • Optimize Your Efforts
  • -
  • Web Developments
  • -
  • UX/UI Design Strategy
  • -
- Choose Plan -
-
-
-
-
-
-
-
-
-
- Basic Plan -

$129.57/Yearly

- -
-
-
    -
  • Unique Websites Design
  • -
  • Automate Busy Work
  • -
  • Optimize Your Efforts
  • -
  • Web Developments
  • -
  • UX/UI Design Strategy
  • -
- Choose Plan -
-
-
-
-
-
- Standard Plan -

$149.57/Yearly

- -
-
-
    -
  • Unique Websites Design
  • -
  • Automate Busy Work
  • -
  • Optimize Your Efforts
  • -
  • Web Developments
  • -
  • UX/UI Design Strategy
  • -
- Choose Plan -
-
-
-
-
-
- Golden Plan -

$199.57/Yearly

- -
-
-
    -
  • Unique Websites Design
  • -
  • Automate Busy Work
  • -
  • Optimize Your Efforts
  • -
  • Web Developments
  • -
  • UX/UI Design Strategy
  • -
- Choose Plan -
-
-
-
-
-
-
-
- -
-
-
-
-
- Our News & Blog -

Get Every Sigle Update - Latest News & Tips

-
-
-
-
-
-
-
- post image -
-
- -

Guide To Newly Suppored Modern CSS Pseudo

-

Sit amet consecte adeiscin eiusme - tempor incididunt labore dolore

- -
-
-
-
-
-
- post image -
-
- -

Guide To Newly Suppored Modern CSS Pseudo

-

Sit amet consecte adeiscin eiusme - tempor incididunt labore dolore

- -
-
-
-
-
-
- post image -
-
- -

Guide To Newly Suppored Modern CSS Pseudo

-

Sit amet consecte adeiscin eiusme - tempor incididunt labore dolore

- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
- Work Together -

Have Any Project On - Your Minds?

-
- Contact Us -
-
-
-
- -
-
-
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime new file mode 120000 index 0000000..fbb7ee0 --- /dev/null +++ b/node_modules/.bin/mime @@ -0,0 +1 @@ +../mime/cli.js \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..607c22b --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,1060 @@ +{ + "name": "webgenix", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@ckeditor/ckeditor5-adapter-ckfinder": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-41.3.1.tgz", + "integrity": "sha512-7KvvYRxK6w0qn/KW54pXJMC/aNVQdqMcaEKcAZ2GbqcKr9TNoi23JYXsRmCg9WTc/XQPSMZx7a1m4pkw5/wx0Q==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-autoformat": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-41.3.1.tgz", + "integrity": "sha512-0QklAfIeUxo/gfuGT9rC0WhDuqTbpcfvinkJOH7fcqcu81TB4WqLjI1qfXL9In6uih8c39te2x74yZZ+f/M4iQ==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-basic-styles": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-41.3.1.tgz", + "integrity": "sha512-vr0UR5JdQtHUhXFVF+7yebaQ/iEugmXIH2eC+pC5BNJuBwuFt1Hxt6U6qRh7f7ve4UFBky3MZ84lGuGsheirCA==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-block-quote": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-41.3.1.tgz", + "integrity": "sha512-iRm6MthhcyRbUpPxjjXhLuZpNGGNnUqp8RurN8rSzX3KcBXKHm/vfxOugk06ebF2FFbP0u5aiL3K7fIniuo2pQ==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-build-classic": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-41.3.1.tgz", + "integrity": "sha512-eeaED7PBenWwEXJsi8cjgafNSeBUAJ2ZqgiQOjaOeugT6yJACSif32TG0OGW4bq/W4PporsCiRaq6wscq4DZig==", + "dependencies": { + "@ckeditor/ckeditor5-adapter-ckfinder": "41.3.1", + "@ckeditor/ckeditor5-autoformat": "41.3.1", + "@ckeditor/ckeditor5-basic-styles": "41.3.1", + "@ckeditor/ckeditor5-block-quote": "41.3.1", + "@ckeditor/ckeditor5-ckbox": "41.3.1", + "@ckeditor/ckeditor5-ckfinder": "41.3.1", + "@ckeditor/ckeditor5-cloud-services": "41.3.1", + "@ckeditor/ckeditor5-easy-image": "41.3.1", + "@ckeditor/ckeditor5-editor-classic": "41.3.1", + "@ckeditor/ckeditor5-essentials": "41.3.1", + "@ckeditor/ckeditor5-heading": "41.3.1", + "@ckeditor/ckeditor5-image": "41.3.1", + "@ckeditor/ckeditor5-indent": "41.3.1", + "@ckeditor/ckeditor5-link": "41.3.1", + "@ckeditor/ckeditor5-list": "41.3.1", + "@ckeditor/ckeditor5-media-embed": "41.3.1", + "@ckeditor/ckeditor5-paragraph": "41.3.1", + "@ckeditor/ckeditor5-paste-from-office": "41.3.1", + "@ckeditor/ckeditor5-table": "41.3.1", + "@ckeditor/ckeditor5-typing": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-ckbox": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-41.3.1.tgz", + "integrity": "sha512-TwAbnnJmvAje5UvnZkAmH4MxxrFJwDF4pROjY9hrFb7eSnGSnXEnESiXOit8scHQZUzu1oEopIP5550lRkHZ0w==", + "dependencies": { + "blurhash": "2.0.5", + "ckeditor5": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-ckfinder": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-41.3.1.tgz", + "integrity": "sha512-jMS8zhONHiPtrx9IlGGiFs1VrNOShLGtr1mvzaFEkVOK9aJquop+4EZX1x12FYm0cjzUawjFH5RLS6xBGXFvAg==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-clipboard": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-41.3.1.tgz", + "integrity": "sha512-6S7tq6FlnHYZmPACeqdf135Jx2bTKHVY8mHQ+CHC8ZZu0XVm62vVeeSLS2IcdtYmHjf4ced1G7suTUBHlfBCLw==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "@ckeditor/ckeditor5-widget": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-cloud-services": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-41.3.1.tgz", + "integrity": "sha512-24JLTt0d2cKkY7rtl2bKxI7MYZjlwqBLoTgePwBC1EtgRJ/2gd1CM1bMwiKJPgJ34NnLtnV8R/W0yuz5RQjJsA==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-core": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-41.3.1.tgz", + "integrity": "sha512-h+PgPtCpS2vjO3HbKMYtddRPW+B3AJx9qpixmHJnUZMiFCmRjUZjXATjpi3j+kSQISs4L2Yghq+lsAQxyGHb+A==", + "dependencies": { + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-easy-image": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-41.3.1.tgz", + "integrity": "sha512-M/9f3Y35hRC/lbNRMjorKTKxCLZxV4CUguA2jghHIS8WNnQUI41C0dcfkK+y/nijRWsWCfg92RiZsNn913LdiQ==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-editor-classic": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-41.3.1.tgz", + "integrity": "sha512-DBP2F0A50BpDwnbCfsz0DBp+NVW7xrXp4lH5SJHax8B58Z1uY1rw/N6Wf2O91tzo5obcUSpoj8WlzIsxDYPd+A==", + "dependencies": { + "ckeditor5": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-engine": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-41.3.1.tgz", + "integrity": "sha512-Me4cnkCrknDH50db/jPczuhgzaxUhHbkh2gv8N8Ypken9ZnOPvMD9W1gCFFTLaxikpPmBQwk3u1BSjOKk3r6kw==", + "dependencies": { + "@ckeditor/ckeditor5-utils": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-enter": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-41.3.1.tgz", + "integrity": "sha512-iwhvJpfsutqcv/bf8QPMKhMolb7GtShaOT+UIDW3OXjMZaBKZOTyR8OceijwgBmZeillTaXQq9y2e9lbJd46xg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-essentials": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-41.3.1.tgz", + "integrity": "sha512-Tr8fIhRith4OVg5yYm8UbbRUjuj15AQ27H3AiwOzRMRr+EYCI07ni5quqBwOMlkOQQ2H9U21gS8mYKqkqU5osw==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-heading": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-41.3.1.tgz", + "integrity": "sha512-WFu/zYXHqJ4Q6UI/IM7/WwmXCwKFVBDhuOeYnlRY1vgmFciaVtrbJW/tECBr+2TBVR4lANvmivWMFDLpN0fW+g==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-image": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-41.3.1.tgz", + "integrity": "sha512-v8lcXET3TDP/yPKhdUCmIcukMQ6GNdTyVAjkTip5JhVKFv8bFWBp5Xn616L6T+8OeQ6DggF9QVGcskmTiGQv7g==", + "dependencies": { + "@ckeditor/ckeditor5-ui": "41.3.1", + "ckeditor5": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-indent": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-41.3.1.tgz", + "integrity": "sha512-JYXF/Clfw+j06wt1+qo43n+y3fmVKPSaN5NXzw4a5Rce0dMaWctH53X8KP3tIuOfEzW9xPhsTUQBJI8rsc+f9g==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-link": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-41.3.1.tgz", + "integrity": "sha512-tl+vnEWUKP0cK/4g+KkQt1YujklG9aUb2NxkkF0HSo7/0m6JnKf+1LVwY1OP2702FLCJO1vdC09oY0JDXGmkfg==", + "dependencies": { + "@ckeditor/ckeditor5-ui": "41.3.1", + "ckeditor5": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-list": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-41.3.1.tgz", + "integrity": "sha512-X1PDaqNnQUTlqYgTYASirJuityG25hxthrGlnEvqPZIxivbxDcefWxkBlNXvmnHOy/EUES0cEZ2H0GUr6CPz2g==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-media-embed": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-41.3.1.tgz", + "integrity": "sha512-3yXePmVPR2WmzeT+fj6WotMbEIJ6lYka0aUG02LxZV0oCL5LU8nF1wFIFhk77wrQVlQtjmLVtvaPcSdNIz/+pA==", + "dependencies": { + "@ckeditor/ckeditor5-ui": "41.3.1", + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paragraph": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-41.3.1.tgz", + "integrity": "sha512-weRPLyO/1Z8PpU9+lET4gYgJ8adDuCjYiREup81URSuS1DDQ8vb3D29xA+4Ov7lwg8BaNAMCpTBdp07GHHzv6w==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-paste-from-office": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-41.3.1.tgz", + "integrity": "sha512-bvDNGQXIUVCiAgmIcvnOw461XWAG8lscQrJaZFXNfayJJah73zvDbOJDkv5hm/N/jYaPTsTnSv1jg5xM9XqfCw==", + "dependencies": { + "ckeditor5": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-select-all": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-41.3.1.tgz", + "integrity": "sha512-a/LAPO+O9fwHjQ/8s3UNtyrqQRieAnpnPw2IhLlGqOS7nxPKMR2vkb6WnG2LUdO+wYqkCzxUDpBlfVkjkQEI0w==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-table": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-41.3.1.tgz", + "integrity": "sha512-Lx2xnWdeuiekXOuRERjvf1I3zhTZwK/IRna9FgTW/ldj6rBH9fVqhY+z/Y/nIpI1LgWee3R0DWZBGXgj1QNFcQ==", + "dependencies": { + "ckeditor5": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-typing": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-41.3.1.tgz", + "integrity": "sha512-4Oeafc3if6fTITOest1ILQ573fnkzE9/tn5eNm3zWnHVYR79mRCYxaha9yUlKVQiqaxZ48EVo2FjHiouXmn9+Q==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-ui": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-41.3.1.tgz", + "integrity": "sha512-xN7OAiRp7ALKYXUp6Qe/AjkjrhyLuoz9nxq7Jdsnsyb/XXfsXDloMcOuvNRoUgr4gIFHMOoZZxsIn8qegBvcYA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "color-convert": "2.0.1", + "color-parse": "1.4.2", + "lodash-es": "4.17.21", + "vanilla-colorful": "0.7.2" + } + }, + "node_modules/@ckeditor/ckeditor5-undo": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-41.3.1.tgz", + "integrity": "sha512-PElWTnlIwuQ94mvdhuH7Mno99oocSnOWPMHi9UuWe6+zVgznQwn0f0diBZvX3l5y8hFgK6q/pQ/CCmbvvYnovA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-upload": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-41.3.1.tgz", + "integrity": "sha512-ugTgGEgA9qsSl5+qptTmawdfYaONr6b3uTG4byZ76JMdf0qiniZjBF/TtGAVmBkCipcVWFoaZKteiz0fhQMHjA==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1" + } + }, + "node_modules/@ckeditor/ckeditor5-utils": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-41.3.1.tgz", + "integrity": "sha512-jJu9ndn6Y7+ffBYdDCRXX7OnV9Ddgms2HSF1pmhjZN0uoL96XworuUOn8hx3Zs/KBPjJEwbtYWJMjG9aohrgaQ==", + "dependencies": { + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-watchdog": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-41.3.1.tgz", + "integrity": "sha512-iDwdYxC8euSKxfRq4y5vVOX9GVUbEbC9z6glkXpxa1BogqYh39+fywjt+s4o3Ub3b8FJ/EUYuNc+/vK+CzEg4g==", + "dependencies": { + "lodash-es": "4.17.21" + } + }, + "node_modules/@ckeditor/ckeditor5-widget": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-41.3.1.tgz", + "integrity": "sha512-rdBxGS3bxWNhp+yxyBYkcbRV6/mdTDab+konDVhZ/ME1jVZ5cf8OBZcgHUqAxzuWt4XMEdzKINbo1OnSDwApUg==", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-enter": "41.3.1", + "@ckeditor/ckeditor5-typing": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "lodash-es": "4.17.21" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ckeditor5": { + "version": "41.3.1", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-41.3.1.tgz", + "integrity": "sha512-pBK1YZV9Sy4R53XG70TEeLFOvTFC7tg8AmS6d6zizegtwkH8seblkcERkykcNuvmfzZ/2h9JbafJ4kisZOwiUQ==", + "dependencies": { + "@ckeditor/ckeditor5-clipboard": "41.3.1", + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-enter": "41.3.1", + "@ckeditor/ckeditor5-paragraph": "41.3.1", + "@ckeditor/ckeditor5-select-all": "41.3.1", + "@ckeditor/ckeditor5-typing": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1", + "@ckeditor/ckeditor5-undo": "41.3.1", + "@ckeditor/ckeditor5-upload": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "@ckeditor/ckeditor5-watchdog": "41.3.1", + "@ckeditor/ckeditor5-widget": "41.3.1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-parse": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz", + "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==", + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vanilla-colorful": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz", + "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md new file mode 100644 index 0000000..4d4470e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/CHANGELOG.md @@ -0,0 +1,161 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v18.0.0...v19.0.0) (April 29, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v16.0.0...v17.0.0) (February 18, 2020) + +### Other changes + +* Updated translations. ([b3bc679](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/b3bc679)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Other changes + +* Updated translations. ([5249150](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/5249150)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.5...v15.0.0) (October 23, 2019) + +### Other changes + +* Updated translations. ([b7ae885](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/b7ae885)) ([f03c652](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/f03c652)) + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.4...v11.0.5) (August 26, 2019) + +### Other changes + +* Changed the URL under bugs key in package.json file. Now we have one issue tracker. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([7edd73b](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/7edd73b)) +* Updated translations. ([8fb4cc2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/8fb4cc2)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.3...v11.0.4) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.2...v11.0.3) (July 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.1...v11.0.2) (June 6, 2019) + +### Other changes + +* Updated translations. ([7d00af1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/7d00af1)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v11.0.0...v11.0.1) (April 4, 2019) + +### Other changes + +* Updated translations. ([3a0fe51](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/3a0fe51)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.4...v11.0.0) (February 28, 2019) + +### Other changes + +* Updated translations. ([0e55853](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/0e55853)) ([818eeae](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/818eeae)) ([707fa21](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/707fa21)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.3...v10.0.4) (December 5, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.2...v10.0.3) (October 8, 2018) + +### Other changes + +* Updated translations. ([896412d](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/896412d)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.1...v10.0.2) (July 18, 2018) + +### Other changes + +* Updated translations. ([69db8e3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/69db8e3)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v10.0.0...v10.0.1) (June 21, 2018) + +### Other changes + +* Updated translations. ([6360b78](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/6360b78)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([06caac5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/06caac5)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +### Other changes + +* Updated translations. ([02712bb](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/02712bb)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Other changes + +* Updated translations. ([7f80868](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/7f80868)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v0.1.1...v1.0.0-alpha.1) (October 3, 2017) + +### Other changes + +* The plugin will not log a warning when `config.ckfinder.uploadUrl` is not specified (because `FileRepository` will do it itself). Closes [#5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/issues/5). ([1a15688](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/1a15688)) + + +## [0.1.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/compare/v0.1.0...v0.1.1) (September 3, 2017) + +### Other changes + +* Aligned the implementation to changes in the image upload. ([eb456ac](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/commit/eb456ac)) + + +## 0.1.0 (May 8, 2017) + +### Features + +* Initial implementation. Closes [#1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/issues/1). diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md new file mode 100644 index 0000000..ec09034 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 CKFinder adapter** – https://github.com/ckeditor/ckeditor5-adapter-ckfinder
+Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/README.md b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/README.md new file mode 100644 index 0000000..9bb071f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/README.md @@ -0,0 +1,18 @@ +CKEditor 5 CKFinder adapter +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-adapter-ckfinder.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements a CKEditor 5 upload adapter compatible with the [CKFinder file manager and uploader](https://ckeditor.com/ckfinder/)'s server–side connector. + +## Documentation + +See the ["CKFinder integration" guide](https://ckeditor.com/docs/ckeditor5/latest/features/ckfinder.html) and the [plugin documentation](https://ckeditor.com/docs/ckeditor5/latest/api/adapter-ckfinder.html) to learn how to configure the adapter. + +Check out the {@link features/image-upload/image-upload comprehensive "Image upload overview"} to learn about other ways to upload images into CKEditor 5. + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js new file mode 100644 index 0000000..6470db5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/build/adapter-ckfinder.js @@ -0,0 +1,4 @@ +/*! + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var e={782:(e,t,r)=>{e.exports=r(237)("./src/core.js")},260:(e,t,r)=>{e.exports=r(237)("./src/upload.js")},237:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function r(o){var n=t[o];if(void 0!==n)return n.exports;var s=t[o]={exports:{}};return e[o](s,s.exports,r),s.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};(()=>{"use strict";r.r(o),r.d(o,{CKFinderUploadAdapter:()=>d});var e=r(782),t=r(260);const n="ckCsrfToken",s="abcdefghijklmnopqrstuvwxyz0123456789";function i(){let e=function(e){e=e.toLowerCase();const t=document.cookie.split(";");for(const r of t){const t=r.split("=");if(decodeURIComponent(t[0].trim().toLowerCase())===e)return decodeURIComponent(t[1])}return null}(n);var t,r;return e&&40==e.length||(e=function(e){let t="";const r=new Uint8Array(e);window.crypto.getRandomValues(r);for(let e=0;e.5?o.toUpperCase():o}return t}(40),t=n,r=e,document.cookie=encodeURIComponent(t)+"="+encodeURIComponent(r)+";path=/"),e}class d extends e.Plugin{static get requires(){return[t.FileRepository]}static get pluginName(){return"CKFinderUploadAdapter"}init(){const e=this.editor.config.get("ckfinder.uploadUrl");e&&(this.editor.plugins.get(t.FileRepository).createUploadAdapter=t=>new a(t,e,this.editor.t))}}class a{constructor(e,t,r){this.loader=e,this.url=t,this.t=r}upload(){return this.loader.file.then((e=>new Promise(((t,r)=>{this._initRequest(),this._initListeners(t,r,e),this._sendRequest(e)}))))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const e=this.xhr=new XMLHttpRequest;e.open("POST",this.url,!0),e.responseType="json"}_initListeners(e,t,r){const o=this.xhr,n=this.loader,s=(0,this.t)("Cannot upload file:")+` ${r.name}.`;o.addEventListener("error",(()=>t(s))),o.addEventListener("abort",(()=>t())),o.addEventListener("load",(()=>{const r=o.response;if(!r||!r.uploaded)return t(r&&r.error&&r.error.message?r.error.message:s);e({default:r.url})})),o.upload&&o.upload.addEventListener("progress",(e=>{e.lengthComputable&&(n.uploadTotal=e.total,n.uploaded=e.loaded)}))}_sendRequest(e){const t=new FormData;t.append("upload",e),t.append("ckCsrfToken",i()),this.xhr.send(t)}}})(),(window.CKEditor5=window.CKEditor5||{}).adapterCkfinder=o})(); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json new file mode 100644 index 0000000..9e25827 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/ckeditor5-metadata.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + { + "name": "CKFinder upload adapter", + "className": "CKFinderUploadAdapter", + "path": "src/uploadadapter.js", + "description": "Implements the CKEditor 5 upload adapter compatible with the CKFinder file manager and uploader's server–side connector.", + "docs": "features/images/image-upload/image-upload.html#ckfinder" + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/package.json b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/package.json new file mode 100644 index 0000000..11a8d5b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/package.json @@ -0,0 +1,37 @@ +{ + "name": "@ckeditor/ckeditor5-adapter-ckfinder", + "version": "41.3.1", + "description": "CKFinder adapter for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "ckeditor5": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-adapter-ckfinder" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.d.ts new file mode 100644 index 0000000..76ca056 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.d.ts @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { CKFinderUploadAdapter } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface PluginsMap { + [CKFinderUploadAdapter.pluginName]: CKFinderUploadAdapter; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.d.ts new file mode 100644 index 0000000..7588975 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.d.ts @@ -0,0 +1,9 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module adapter-ckfinder + */ +export { default as CKFinderUploadAdapter } from './uploadadapter.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js new file mode 100644 index 0000000..7588975 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/index.js @@ -0,0 +1,9 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module adapter-ckfinder + */ +export { default as CKFinderUploadAdapter } from './uploadadapter.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.d.ts b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.d.ts new file mode 100644 index 0000000..3222ed3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.d.ts @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module adapter-ckfinder/uploadadapter + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { FileRepository } from 'ckeditor5/src/upload.js'; +/** + * A plugin that enables file uploads in CKEditor 5 using the CKFinder server–side connector. + * + * See the {@glink features/file-management/ckfinder "CKFinder file manager integration"} guide to learn how to configure + * and use this feature as well as find out more about the full integration with the file manager + * provided by the {@link module:ckfinder/ckfinder~CKFinder} plugin. + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} guide to learn + * about other ways to upload images into CKEditor 5. + */ +export default class CKFinderUploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof FileRepository]; + /** + * @inheritDoc + */ + static get pluginName(): "CKFinderUploadAdapter"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js new file mode 100644 index 0000000..f138ebe --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter.js @@ -0,0 +1,138 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals XMLHttpRequest, FormData */ +/** + * @module adapter-ckfinder/uploadadapter + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { FileRepository } from 'ckeditor5/src/upload.js'; +import { getCsrfToken } from './utils.js'; +/** + * A plugin that enables file uploads in CKEditor 5 using the CKFinder server–side connector. + * + * See the {@glink features/file-management/ckfinder "CKFinder file manager integration"} guide to learn how to configure + * and use this feature as well as find out more about the full integration with the file manager + * provided by the {@link module:ckfinder/ckfinder~CKFinder} plugin. + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} guide to learn + * about other ways to upload images into CKEditor 5. + */ +export default class CKFinderUploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [FileRepository]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'CKFinderUploadAdapter'; + } + /** + * @inheritDoc + */ + init() { + const url = this.editor.config.get('ckfinder.uploadUrl'); + if (!url) { + return; + } + // Register CKFinderAdapter + this.editor.plugins.get(FileRepository).createUploadAdapter = loader => new UploadAdapter(loader, url, this.editor.t); + } +} +/** + * Upload adapter for CKFinder. + */ +class UploadAdapter { + /** + * Creates a new adapter instance. + */ + constructor(loader, url, t) { + this.loader = loader; + this.url = url; + this.t = t; + } + /** + * Starts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#upload + */ + upload() { + return this.loader.file.then(file => { + return new Promise((resolve, reject) => { + this._initRequest(); + this._initListeners(resolve, reject, file); + this._sendRequest(file); + }); + }); + } + /** + * Aborts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#abort + */ + abort() { + if (this.xhr) { + this.xhr.abort(); + } + } + /** + * Initializes the XMLHttpRequest object. + */ + _initRequest() { + const xhr = this.xhr = new XMLHttpRequest(); + xhr.open('POST', this.url, true); + xhr.responseType = 'json'; + } + /** + * Initializes XMLHttpRequest listeners. + * + * @param resolve Callback function to be called when the request is successful. + * @param reject Callback function to be called when the request cannot be completed. + * @param file File instance to be uploaded. + */ + _initListeners(resolve, reject, file) { + const xhr = this.xhr; + const loader = this.loader; + const t = this.t; + const genericError = t('Cannot upload file:') + ` ${file.name}.`; + xhr.addEventListener('error', () => reject(genericError)); + xhr.addEventListener('abort', () => reject()); + xhr.addEventListener('load', () => { + const response = xhr.response; + if (!response || !response.uploaded) { + return reject(response && response.error && response.error.message ? response.error.message : genericError); + } + resolve({ + default: response.url + }); + }); + // Upload progress when it's supported. + /* istanbul ignore else -- @preserve */ + if (xhr.upload) { + xhr.upload.addEventListener('progress', evt => { + if (evt.lengthComputable) { + loader.uploadTotal = evt.total; + loader.uploaded = evt.loaded; + } + }); + } + } + /** + * Prepares the data and sends the request. + * + * @param file File instance to be uploaded. + */ + _sendRequest(file) { + // Prepare form data. + const data = new FormData(); + data.append('upload', file); + data.append('ckCsrfToken', getCsrfToken()); + // Send request. + this.xhr.send(data); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.d.ts b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.d.ts new file mode 100644 index 0000000..bdbacda --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.d.ts @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns the CSRF token value. The value is a hash stored in `document.cookie` + * under the `ckCsrfToken` key. The CSRF token can be used to secure the communication + * between the web browser and the CKFinder server. + */ +export declare function getCsrfToken(): string; +/** + * Returns the value of the cookie with a given name or `null` if the cookie is not found. + */ +export declare function getCookie(name: string): string | null; +/** + * Sets the value of the cookie with a given name. + */ +export declare function setCookie(name: string, value: string): void; diff --git a/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js new file mode 100644 index 0000000..b9fc0c4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-adapter-ckfinder/src/utils.js @@ -0,0 +1,58 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals window, document */ +/** + * @module adapter-ckfinder/utils + */ +const TOKEN_COOKIE_NAME = 'ckCsrfToken'; +const TOKEN_LENGTH = 40; +const tokenCharset = 'abcdefghijklmnopqrstuvwxyz0123456789'; +/** + * Returns the CSRF token value. The value is a hash stored in `document.cookie` + * under the `ckCsrfToken` key. The CSRF token can be used to secure the communication + * between the web browser and the CKFinder server. + */ +export function getCsrfToken() { + let token = getCookie(TOKEN_COOKIE_NAME); + if (!token || token.length != TOKEN_LENGTH) { + token = generateToken(TOKEN_LENGTH); + setCookie(TOKEN_COOKIE_NAME, token); + } + return token; +} +/** + * Returns the value of the cookie with a given name or `null` if the cookie is not found. + */ +export function getCookie(name) { + name = name.toLowerCase(); + const parts = document.cookie.split(';'); + for (const part of parts) { + const pair = part.split('='); + const key = decodeURIComponent(pair[0].trim().toLowerCase()); + if (key === name) { + return decodeURIComponent(pair[1]); + } + } + return null; +} +/** + * Sets the value of the cookie with a given name. + */ +export function setCookie(name, value) { + document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';path=/'; +} +/** + * Generates the CSRF token with the given length. + */ +function generateToken(length) { + let result = ''; + const randValues = new Uint8Array(length); + window.crypto.getRandomValues(randValues); + for (let j = 0; j < randValues.length; j++) { + const character = tokenCharset.charAt(randValues[j] % tokenCharset.length); + result += Math.random() > 0.5 ? character.toUpperCase() : character; + } + return result; +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-autoformat/CHANGELOG.md new file mode 100644 index 0000000..c42a808 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/CHANGELOG.md @@ -0,0 +1,208 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v18.0.0...v19.0.0) (April 29, 2020) + +### Features + +* Added autoformat integration with the strikethrough using `~~` string. Closes [ckeditor/ckeditor5#6412](https://github.com/ckeditor/ckeditor5/issues/6412). ([9c3fd3e](https://github.com/ckeditor/ckeditor5-autoformat/commit/9c3fd3e)) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v16.0.0...v17.0.0) (February 18, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Features + +* Enabled code block autoformatting with the `` ``` `` sequence. Closes [ckeditor/ckeditor5#5672](https://github.com/ckeditor/ckeditor5/issues/5672). ([fb2d1b5](https://github.com/ckeditor/ckeditor5-autoformat/commit/fb2d1b5)) + +### Bug fixes + +* `BlockAutoformat` should not react to text typed after an inline element. Closes [ckeditor/ckeditor5#5671](https://github.com/ckeditor/ckeditor5/issues/5671). ([241c294](https://github.com/ckeditor/ckeditor5-autoformat/commit/241c294)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.5...v15.0.0) (October 23, 2019) + +### Bug fixes + +* Autoformat transformations in blocks containing inline elements. Closes [ckeditor/ckeditor5#1955](https://github.com/ckeditor/ckeditor5/issues/1955). ([133c647](https://github.com/ckeditor/ckeditor5-autoformat/commit/133c647)) + +### Other changes + +* Add `pluginName` property to editing plugins. ([44fcbc7](https://github.com/ckeditor/ckeditor5-autoformat/commit/44fcbc7)) + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.4...v11.0.5) (August 26, 2019) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([65f5d11](https://github.com/ckeditor/ckeditor5-autoformat/commit/65f5d11)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.3...v11.0.4) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.2...v11.0.3) (July 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.1...v11.0.2) (June 6, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v11.0.0...v11.0.1) (April 4, 2019) + +### Other changes + +* Any digit followed by a dot will not trigger the numbered list. Now, only `1` is supported by the `Autoformat` plugin. Closes [#60](https://github.com/ckeditor/ckeditor5-autoformat/issues/60). ([c7c4662](https://github.com/ckeditor/ckeditor5-autoformat/commit/c7c4662)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.4...v11.0.0) (February 28, 2019) + +### Features + +* `BlockAutoformatEditing` will not format the text if the command is disabled. `InlineAutoformatEditing` will not format the text if the callback returned `false`. Closes [#64](https://github.com/ckeditor/ckeditor5-autoformat/issues/64). ([cc7f454](https://github.com/ckeditor/ckeditor5-autoformat/commit/cc7f454)) +* Cancel `BlockAutoformatEditing` autoformatting if given callback returned `false`. Closes [#66](https://github.com/ckeditor/ckeditor5-autoformat/issues/66). ([9b066f1](https://github.com/ckeditor/ckeditor5-autoformat/commit/9b066f1)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.3...v10.0.4) (December 5, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.2...v10.0.3) (October 8, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.1...v10.0.2) (July 18, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v10.0.0...v10.0.1) (June 21, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([a9a514a](https://github.com/ckeditor/ckeditor5-autoformat/commit/a9a514a)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +### Bug fixes + +* Autoformat should ignore transparent batches. Closes [#56](https://github.com/ckeditor/ckeditor5-autoformat/issues/56). ([e42f987](https://github.com/ckeditor/ckeditor5-autoformat/commit/e42f987)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Bug fixes + +* Fixed integration with undo. Closes [#53](https://github.com/ckeditor/ckeditor5-autoformat/issues/53). ([f5d68f4](https://github.com/ckeditor/ckeditor5-autoformat/commit/f5d68f4)) +* An ordered list will now be triggered by a number and `.` or `)`. Closes [#42](https://github.com/ckeditor/ckeditor5-autoformat/issues/42). ([bcc4e3b](https://github.com/ckeditor/ckeditor5-autoformat/commit/bcc4e3b)) + + Thanks to [@vladikoff](https://github.com/vladikoff)! + +### Other changes + +* Aligned feature class naming to the new scheme. ([5f5b4a9](https://github.com/ckeditor/ckeditor5-autoformat/commit/5f5b4a9)) + + +## 0.0.1 (October 27, 2017) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-autoformat/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Bug fixes + +* `LiveRanges` used by `InlineAutoFormatEngine` are now properly detached. Closes [#39](https://github.com/ckeditor/ckeditor5-autoformat/issues/39). ([5f24ae8](https://github.com/ckeditor/ckeditor5-autoformat/commit/5f24ae8)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.6.0...v1.0.0-alpha.1) (October 3, 2017) + +### Features + +* Added support for backticks which apply `` to the wrapped fragment of text. Closes [#35](https://github.com/ckeditor/ckeditor5-autoformat/issues/35). ([3e93bf6](https://github.com/ckeditor/ckeditor5-autoformat/commit/3e93bf6)) + + +## [0.6.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.5.1...v0.6.0) (September 3, 2017) + +### Bug fixes + +* The `Autoformat` plugin should not require other features. Closes [#5](https://github.com/ckeditor/ckeditor5-autoformat/issues/5) and [#17](https://github.com/ckeditor/ckeditor5-autoformat/issues/17). ([d22c5b6](https://github.com/ckeditor/ckeditor5-autoformat/commit/d22c5b6)) +* Autoformatting will not be triggered if the batch with changes is `transparent` (for example, it represents other user's changes). ([f1131bc](https://github.com/ckeditor/ckeditor5-autoformat/commit/f1131bc)) + +### Features + +* Added support for block quotes. Closes [#26](https://github.com/ckeditor/ckeditor5-autoformat/issues/26). ([4c1e83e](https://github.com/ckeditor/ckeditor5-autoformat/commit/4c1e83e)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([f20ef7d](https://github.com/ckeditor/ckeditor5-autoformat/commit/f20ef7d)) +* The autoformat feature will not depend on the configuration of the heading feature but it will use the available `heading*` commands. Closes [#29](https://github.com/ckeditor/ckeditor5-autoformat/issues/29). ([d0cee1f](https://github.com/ckeditor/ckeditor5-autoformat/commit/d0cee1f)) + +### BREAKING CHANGES + +* The command API has been changed. + +### Note + +* The Autoformat feature does not require Bold, Italic, Heading, etc. any longer. To make the most of the plugin, make sure that relevant features are loaded in your editor. + + +## [0.5.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.5.0...v0.5.1) (May 7, 2017) + +Internal changes only (updated dependencies, documentation, etc.). + +## [0.5.0](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.4.1...v0.5.0) (April 5, 2017) + +### Features + +* Named existing plugin(s). ([e043947](https://github.com/ckeditor/ckeditor5-autoformat/commit/e043947)) + +### Other changes + +* Updated command names to match the latest API of the Heading feature. Closes [#22](https://github.com/ckeditor/ckeditor5-autoformat/issues/22). ([10b5561](https://github.com/ckeditor/ckeditor5-autoformat/commit/10b5561)) + + +## [0.4.1](https://github.com/ckeditor/ckeditor5-autoformat/compare/v0.4.0...v0.4.1) (March 6, 2017) + +### Other changes + +* Aligned the use of the `heading` command to the changes in the `ckeditor5-heading` package. Closes [#20](https://github.com/ckeditor/ckeditor5/issues/20). ([6b8b759](https://github.com/ckeditor/ckeditor5-autoformat/commit/6b8b759)) diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/LICENSE.md b/node_modules/@ckeditor/ckeditor5-autoformat/LICENSE.md new file mode 100644 index 0000000..bff55b9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 autoformat feature** – https://github.com/ckeditor/ckeditor5-autoformat
+Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/README.md b/node_modules/@ckeditor/ckeditor5-autoformat/README.md new file mode 100644 index 0000000..0647a22 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/README.md @@ -0,0 +1,20 @@ +CKEditor 5 autoformat feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-autoformat.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements the autoformatting feature for CKEditor 5. It allows styling text by typing sequences like `**bold this**`. + +## Demo + +Check out the [demo in the autoformat feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/autoformat.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-autoformat` package](https://ckeditor.com/docs/ckeditor5/latest/api/autoformat.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/autoformat.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/autoformat.js new file mode 100644 index 0000000..b844494 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/autoformat.js @@ -0,0 +1,5 @@ +!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"Revert autoformatting action":"Revert autoformatting action"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var t={782:(t,e,o)=>{t.exports=o(237)("./src/core.js")},783:(t,e,o)=>{t.exports=o(237)("./src/engine.js")},834:(t,e,o)=>{t.exports=o(237)("./src/typing.js")},584:(t,e,o)=>{t.exports=o(237)("./src/utils.js")},237:t=>{"use strict";t.exports=CKEditor5.dll}},e={};function o(i){var s=e[i];if(void 0!==s)return s.exports;var n=e[i]={exports:{}};return t[i](n,n.exports,o),n.exports}o.d=(t,e)=>{for(var i in e)o.o(e,i)&&!o.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};(()=>{"use strict";o.r(i),o.d(i,{Autoformat:()=>c});var t=o(782),e=o(834),s=o(783),n=o(584);function r(t,e,o,i){let r,a=null;"function"==typeof i?r=i:(a=t.commands.get(i),r=()=>{t.execute(i)}),t.model.document.on("change:data",((d,c)=>{if(a&&!a.isEnabled||!e.isEnabled)return;const l=(0,n.first)(t.model.document.selection.getRanges());if(!l.isCollapsed)return;if(c.isUndo||!c.isLocal)return;const u=Array.from(t.model.document.differ.getChanges()),g=u[0];if(1!=u.length||"insert"!==g.type||"$text"!=g.name||1!=g.length)return;const h=g.position.parent;if(h.is("element","codeBlock"))return;if(h.is("element","listItem")&&"function"!=typeof i&&!["numberedList","bulletedList","todoList"].includes(i))return;if(a&&!0===a.value)return;const m=h.getChild(0),f=t.model.createRangeOn(m);if(!f.containsRange(l)&&!l.end.isEqual(f.end))return;const p=o.exec(m.data.substr(0,l.end.offset));p&&t.model.enqueueChange((e=>{const o=e.createPositionAt(h,0),i=e.createPositionAt(h,p[0].length),n=new s.LiveRange(o,i);if(!1!==r({match:p})){e.remove(n);const o=t.model.document.selection.getFirstRange(),i=e.createRangeIn(h);!h.isEmpty||i.isEqual(o)||i.containsRange(o,!0)||e.remove(h)}n.detach(),t.model.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function a(t,e,o,i){let s,n;o instanceof RegExp?s=o:n=o,n=n||(t=>{let e;const o=[],i=[];for(;null!==(e=s.exec(t))&&!(e&&e.length<4);){let{index:t,1:s,2:n,3:r}=e;const a=s+n+r;t+=e[0].length-a.length;const d=[t,t+s.length],c=[t+s.length+n.length,t+s.length+n.length+r.length];o.push(d),o.push(c),i.push([t+s.length,t+s.length+n.length])}return{remove:o,format:i}}),t.model.document.on("change:data",((o,s)=>{if(s.isUndo||!s.isLocal||!e.isEnabled)return;const r=t.model,a=r.document.selection;if(!a.isCollapsed)return;const c=Array.from(r.document.differ.getChanges()),l=c[0];if(1!=c.length||"insert"!==l.type||"$text"!=l.name||1!=l.length)return;const u=a.focus,g=u.parent,{text:h,range:m}=function(t,e){let o=t.start;const i=Array.from(t.getItems()).reduce(((t,i)=>!i.is("$text")&&!i.is("$textProxy")||i.getAttribute("code")?(o=e.createPositionAfter(i),""):t+i.data),"");return{text:i,range:e.createRange(o,t.end)}}(r.createRange(r.createPositionAt(g,0),u),r),f=n(h),p=d(m.start,f.format,r),b=d(m.start,f.remove,r);p.length&&b.length&&r.enqueueChange((e=>{if(!1!==i(e,p)){for(const t of b.reverse())e.remove(t);r.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function d(t,e,o){return e.filter((t=>void 0!==t[0]&&void 0!==t[1])).map((e=>o.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1]))))}class c extends t.Plugin{static get requires(){return[e.Delete]}static get pluginName(){return"Autoformat"}afterInit(){const t=this.editor,e=this.editor.t;this._addListAutoformats(),this._addBasicStylesAutoformats(),this._addHeadingAutoformats(),this._addBlockQuoteAutoformats(),this._addCodeBlockAutoformats(),this._addHorizontalLineAutoformats(),t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Revert autoformatting action"),keystroke:"Backspace"}]})}_addListAutoformats(){const t=this.editor.commands;t.get("bulletedList")&&r(this.editor,this,/^[*-]\s$/,"bulletedList"),t.get("numberedList")&&r(this.editor,this,/^1[.|)]\s$/,"numberedList"),t.get("todoList")&&r(this.editor,this,/^\[\s?\]\s$/,"todoList"),t.get("checkTodoList")&&r(this.editor,this,/^\[\s?x\s?\]\s$/,(()=>{this.editor.execute("todoList"),this.editor.execute("checkTodoList")}))}_addBasicStylesAutoformats(){const t=this.editor.commands;if(t.get("bold")){const t=l(this.editor,"bold");a(this.editor,this,/(?:^|\s)(\*\*)([^*]+)(\*\*)$/g,t),a(this.editor,this,/(?:^|\s)(__)([^_]+)(__)$/g,t)}if(t.get("italic")){const t=l(this.editor,"italic");a(this.editor,this,/(?:^|\s)(\*)([^*_]+)(\*)$/g,t),a(this.editor,this,/(?:^|\s)(_)([^_]+)(_)$/g,t)}if(t.get("code")){const t=l(this.editor,"code");a(this.editor,this,/(`)([^`]+)(`)$/g,t)}if(t.get("strikethrough")){const t=l(this.editor,"strikethrough");a(this.editor,this,/(~~)([^~]+)(~~)$/g,t)}}_addHeadingAutoformats(){const t=this.editor.commands.get("heading");t&&t.modelElements.filter((t=>t.match(/^heading[1-6]$/))).forEach((e=>{const o=e[7],i=new RegExp(`^(#{${o}})\\s$`);r(this.editor,this,i,(()=>{if(!t.isEnabled||t.value===e)return!1;this.editor.execute("heading",{value:e})}))}))}_addBlockQuoteAutoformats(){this.editor.commands.get("blockQuote")&&r(this.editor,this,/^>\s$/,"blockQuote")}_addCodeBlockAutoformats(){const t=this.editor,e=t.model.document.selection;t.commands.get("codeBlock")&&r(t,this,/^```$/,(()=>{if(e.getFirstPosition().parent.is("element","listItem"))return!1;this.editor.execute("codeBlock",{usePreviousLanguageChoice:!0})}))}_addHorizontalLineAutoformats(){this.editor.commands.get("horizontalLine")&&r(this.editor,this,/^---$/,"horizontalLine")}}function l(t,e){return(o,i)=>{if(!t.commands.get(e).isEnabled)return!1;const s=t.model.schema.getValidRanges(i,e);for(const t of s)o.setAttribute(e,!0,t);o.removeSelectionAttribute(e)}}})(),(window.CKEditor5=window.CKEditor5||{}).autoformat=i})(); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ar.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ar.js new file mode 100644 index 0000000..2f91e43 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ar.js @@ -0,0 +1 @@ +!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"العودة إلى إجراء التنسيق التلقائي"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bg.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bg.js new file mode 100644 index 0000000..d5a496e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bg.js @@ -0,0 +1 @@ +!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"Отмяна на действие за автоматично форматиране"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bn.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bn.js new file mode 100644 index 0000000..bca515e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/bn.js @@ -0,0 +1 @@ +!function(n){const i=n.bn=n.bn||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"অটো ফরম্যাটিংয়ের কাজটি পূর্বাবস্থায় ফিরিয়ে আনুন"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ca.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ca.js new file mode 100644 index 0000000..4dc0f52 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ca.js @@ -0,0 +1 @@ +!function(a){const i=a.ca=a.ca||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Desfés l'acció d'autoformatació"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/cs.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/cs.js new file mode 100644 index 0000000..6805882 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/cs.js @@ -0,0 +1 @@ +!function(t){const o=t.cs=t.cs||{};o.dictionary=Object.assign(o.dictionary||{},{"Revert autoformatting action":"Vzít zpět akci automatického formátování"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/da.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/da.js new file mode 100644 index 0000000..8e8245d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/da.js @@ -0,0 +1 @@ +!function(t){const o=t.da=t.da||{};o.dictionary=Object.assign(o.dictionary||{},{"Revert autoformatting action":"Fortryd autoformatering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/de.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/de.js new file mode 100644 index 0000000..0d1dda9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/de.js @@ -0,0 +1 @@ +!function(n){const i=n.de=n.de||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Automatischen Formatierungsvorgang rückgängig machen"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/el.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/el.js new file mode 100644 index 0000000..69f8b67 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/el.js @@ -0,0 +1 @@ +!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"Επαναφορά ενέργειας αυτόματης μορφοποίησης"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es-co.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es-co.js new file mode 100644 index 0000000..ab2bd58 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es-co.js @@ -0,0 +1 @@ +!function(o){const t=o["es-co"]=o["es-co"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Revertir la acción de formato automático"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es.js new file mode 100644 index 0000000..d7dfca8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/es.js @@ -0,0 +1 @@ +!function(t){const i=t.es=t.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Revierte la acción de formato automático"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/et.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/et.js new file mode 100644 index 0000000..a2eaea5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/et.js @@ -0,0 +1 @@ +!function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Kustuta automaatse vorminduse toiming"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fi.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fi.js new file mode 100644 index 0000000..9e3c4dd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fi.js @@ -0,0 +1 @@ +!function(t){const i=t.fi=t.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Peruuta automaattimuokkaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fr.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fr.js new file mode 100644 index 0000000..1b072b3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/fr.js @@ -0,0 +1 @@ +!function(t){const n=t.fr=t.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"Annuler l'action de formatage automatique"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/he.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/he.js new file mode 100644 index 0000000..5ebd401 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/he.js @@ -0,0 +1 @@ +!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"ביטול פעולת העיצוב האוטומטי"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hi.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hi.js new file mode 100644 index 0000000..267e5c8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hi.js @@ -0,0 +1 @@ +!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"ऑटोफ़ॉर्मैटिंग एक्शन को रिवर्ट करें"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hr.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hr.js new file mode 100644 index 0000000..49007d0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hr.js @@ -0,0 +1 @@ +!function(t){const a=t.hr=t.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Revert autoformatting action":"Vrati radnju automatskog formatiranja"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hu.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hu.js new file mode 100644 index 0000000..71a6406 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/hu.js @@ -0,0 +1 @@ +!function(t){const i=t.hu=t.hu||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Automatikus formázási művelet visszaállítása"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/id.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/id.js new file mode 100644 index 0000000..3b3c510 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/id.js @@ -0,0 +1 @@ +!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"Kembalikan tindakan pemformatan otomatis"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/it.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/it.js new file mode 100644 index 0000000..c8c2003 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/it.js @@ -0,0 +1 @@ +!function(i){const t=i.it=i.it||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Annulla l'azione di formattazione automatica"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ja.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ja.js new file mode 100644 index 0000000..4efe30f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ja.js @@ -0,0 +1 @@ +!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"オートフォーマットによる変更を元に戻す"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ko.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ko.js new file mode 100644 index 0000000..a7da419 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ko.js @@ -0,0 +1 @@ +!function(o){const i=o.ko=o.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"자동 서식 작업 되돌리기"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lt.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lt.js new file mode 100644 index 0000000..68ce823 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lt.js @@ -0,0 +1 @@ +!function(i){const t=i.lt=i.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Sugrąžinti automatinio formatavimo veiksmą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lv.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lv.js new file mode 100644 index 0000000..324eaef --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/lv.js @@ -0,0 +1 @@ +!function(t){const a=t.lv=t.lv||{};a.dictionary=Object.assign(a.dictionary||{},{"Revert autoformatting action":"Atjaunot automātiskās formatēšanas darbību"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ms.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ms.js new file mode 100644 index 0000000..cf90a21 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ms.js @@ -0,0 +1 @@ +!function(n){const t=n.ms=n.ms||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Pulihkan tindakan pemformatan automatik"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/nl.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/nl.js new file mode 100644 index 0000000..fc8ccc4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/nl.js @@ -0,0 +1 @@ +!function(n){const t=n.nl=n.nl||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Maak automatisch formattering ongedaan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/no.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/no.js new file mode 100644 index 0000000..fcdee70 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/no.js @@ -0,0 +1 @@ +!function(n){const o=n.no=n.no||{};o.dictionary=Object.assign(o.dictionary||{},{"Revert autoformatting action":"Angre autoformatering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pl.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pl.js new file mode 100644 index 0000000..a70b696 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pl.js @@ -0,0 +1 @@ +!function(o){const t=o.pl=o.pl||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Cofa automatyczne formatowanie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt-br.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt-br.js new file mode 100644 index 0000000..93708cf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt-br.js @@ -0,0 +1 @@ +!function(t){const o=t["pt-br"]=t["pt-br"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Revert autoformatting action":"Reverter ação de autoformatação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt.js new file mode 100644 index 0000000..85424ec --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/pt.js @@ -0,0 +1 @@ +!function(t){const o=t.pt=t.pt||{};o.dictionary=Object.assign(o.dictionary||{},{"Revert autoformatting action":"Reverter ação de formatação automática"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ro.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ro.js new file mode 100644 index 0000000..d23717a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ro.js @@ -0,0 +1 @@ +!function(a){const o=a.ro=a.ro||{};o.dictionary=Object.assign(o.dictionary||{},{"Revert autoformatting action":"Anulează acțiunea de formatare automată"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ru.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ru.js new file mode 100644 index 0000000..f89e8ab --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/ru.js @@ -0,0 +1 @@ +!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"Отменить действие автоформатирования"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sk.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sk.js new file mode 100644 index 0000000..9c5eff7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sk.js @@ -0,0 +1 @@ +!function(t){const i=t.sk=t.sk||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Vrátiť späť automatické formátovanie"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sr.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sr.js new file mode 100644 index 0000000..0100756 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sr.js @@ -0,0 +1 @@ +!function(t){const a=t.sr=t.sr||{};a.dictionary=Object.assign(a.dictionary||{},{"Revert autoformatting action":"Vrati na automatsko formatiranje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sv.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sv.js new file mode 100644 index 0000000..060d7c8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/sv.js @@ -0,0 +1 @@ +!function(t){const i=t.sv=t.sv||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"Ångra automatisk formatering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/th.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/th.js new file mode 100644 index 0000000..15f6ce5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/th.js @@ -0,0 +1 @@ +!function(t){const i=t.th=t.th||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"ยกเลิกการดำเนินการจัดรูปแบบอัตโนมัติ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/tr.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/tr.js new file mode 100644 index 0000000..5df18e5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/tr.js @@ -0,0 +1 @@ +!function(i){const t=i.tr=i.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Otomatik biçimlendirme işlemini geri al"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/uk.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/uk.js new file mode 100644 index 0000000..c528d09 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/uk.js @@ -0,0 +1 @@ +!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"Скасувати дію автоформатування"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/vi.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/vi.js new file mode 100644 index 0000000..2a7a577 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/vi.js @@ -0,0 +1 @@ +!function(n){const t=n.vi=n.vi||{};t.dictionary=Object.assign(t.dictionary||{},{"Revert autoformatting action":"Hoàn nguyên thao tác tự động định dạng"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh-cn.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh-cn.js new file mode 100644 index 0000000..5dd5372 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh-cn.js @@ -0,0 +1 @@ +!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Revert autoformatting action":"恢复自动格式化操作"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh.js b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh.js new file mode 100644 index 0000000..9e6d088 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/build/translations/zh.js @@ -0,0 +1 @@ +!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Revert autoformatting action":"復原自動格式化操作"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json new file mode 100644 index 0000000..73fa5b5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/ckeditor5-metadata.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + { + "name": "Autoformat", + "className": "Autoformat", + "description": "Enables a set of predefined autoformatting actions. It allows for formatting text by typing sequences like **bold this**.", + "docs": "features/autoformat.html", + "path": "src/autoformat.js" + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/contexts.json b/node_modules/@ckeditor/ckeditor5-autoformat/lang/contexts.json new file mode 100644 index 0000000..011e968 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/contexts.json @@ -0,0 +1,3 @@ +{ + "Revert autoformatting action": "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ar.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ar.po new file mode 100644 index 0000000..d6d565c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ar.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "العودة إلى إجراء التنسيق التلقائي" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bg.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bg.po new file mode 100644 index 0000000..fb0992f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bg.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Отмяна на действие за автоматично форматиране" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bn.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bn.po new file mode 100644 index 0000000..d5523b4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/bn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "অটো ফরম্যাটিংয়ের কাজটি পূর্বাবস্থায় ফিরিয়ে আনুন" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ca.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ca.po new file mode 100644 index 0000000..e6eadb8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ca.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Desfés l'acció d'autoformatació" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/cs.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/cs.po new file mode 100644 index 0000000..ae2897a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/cs.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Vzít zpět akci automatického formátování" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/da.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/da.po new file mode 100644 index 0000000..6f06dcd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/da.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Fortryd autoformatering" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/de.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/de.po new file mode 100644 index 0000000..5f3cee6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/de.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Automatischen Formatierungsvorgang rückgängig machen" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/el.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/el.po new file mode 100644 index 0000000..5bc38ad --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/el.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Επαναφορά ενέργειας αυτόματης μορφοποίησης" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/en.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/en.po new file mode 100644 index 0000000..f55f63f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/en.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Revert autoformatting action" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es-co.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es-co.po new file mode 100644 index 0000000..ebbaf65 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es-co.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Revertir la acción de formato automático" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es.po new file mode 100644 index 0000000..313160b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/es.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Revierte la acción de formato automático" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/et.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/et.po new file mode 100644 index 0000000..2b34a02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/et.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Kustuta automaatse vorminduse toiming" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fi.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fi.po new file mode 100644 index 0000000..61f0fad --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Peruuta automaattimuokkaus" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fr.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fr.po new file mode 100644 index 0000000..b0845d1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/fr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Annuler l'action de formatage automatique" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/he.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/he.po new file mode 100644 index 0000000..67bacb3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/he.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "ביטול פעולת העיצוב האוטומטי" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hi.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hi.po new file mode 100644 index 0000000..48ae026 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "ऑटोफ़ॉर्मैटिंग एक्शन को रिवर्ट करें" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hr.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hr.po new file mode 100644 index 0000000..64c2e62 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Vrati radnju automatskog formatiranja" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hu.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hu.po new file mode 100644 index 0000000..8de2875 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/hu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Automatikus formázási művelet visszaállítása" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/id.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/id.po new file mode 100644 index 0000000..1100f4f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/id.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Kembalikan tindakan pemformatan otomatis" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/it.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/it.po new file mode 100644 index 0000000..ead0b51 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/it.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Annulla l'azione di formattazione automatica" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ja.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ja.po new file mode 100644 index 0000000..b60b4de --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ja.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "オートフォーマットによる変更を元に戻す" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ko.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ko.po new file mode 100644 index 0000000..fa4dfa0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ko.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "자동 서식 작업 되돌리기" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lt.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lt.po new file mode 100644 index 0000000..2c031b7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Sugrąžinti automatinio formatavimo veiksmą" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lv.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lv.po new file mode 100644 index 0000000..81e1e58 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/lv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Atjaunot automātiskās formatēšanas darbību" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ms.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ms.po new file mode 100644 index 0000000..219dade --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ms.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Pulihkan tindakan pemformatan automatik" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/nl.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/nl.po new file mode 100644 index 0000000..4261ef0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/nl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Maak automatisch formattering ongedaan" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/no.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/no.po new file mode 100644 index 0000000..c34a9df --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/no.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Angre autoformatering" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pl.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pl.po new file mode 100644 index 0000000..840f3ec --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Cofa automatyczne formatowanie" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt-br.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt-br.po new file mode 100644 index 0000000..ea5a231 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt-br.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Reverter ação de autoformatação" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt.po new file mode 100644 index 0000000..5310974 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/pt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Reverter ação de formatação automática" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ro.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ro.po new file mode 100644 index 0000000..4f29df7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ro.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Anulează acțiunea de formatare automată" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ru.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ru.po new file mode 100644 index 0000000..52f9fe0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/ru.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Отменить действие автоформатирования" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sk.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sk.po new file mode 100644 index 0000000..361b733 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Vrátiť späť automatické formátovanie" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sr.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sr.po new file mode 100644 index 0000000..da5258e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Vrati na automatsko formatiranje" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sv.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sv.po new file mode 100644 index 0000000..0d91354 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/sv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Ångra automatisk formatering" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/th.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/th.po new file mode 100644 index 0000000..678471a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/th.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "ยกเลิกการดำเนินการจัดรูปแบบอัตโนมัติ" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/tr.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/tr.po new file mode 100644 index 0000000..acdde98 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/tr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Otomatik biçimlendirme işlemini geri al" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/uk.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/uk.po new file mode 100644 index 0000000..1ec2de7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/uk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Скасувати дію автоформатування" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/vi.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/vi.po new file mode 100644 index 0000000..626f49d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/vi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "Hoàn nguyên thao tác tự động định dạng" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh-cn.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh-cn.po new file mode 100644 index 0000000..1e17685 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh-cn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "恢复自动格式化操作" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh.po b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh.po new file mode 100644 index 0000000..92ad259 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/lang/translations/zh.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Keystroke description for assistive technologies: keystroke for reverting autoformatting action." +msgid "Revert autoformatting action" +msgstr "復原自動格式化操作" diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/package.json b/node_modules/@ckeditor/ckeditor5-autoformat/package.json new file mode 100644 index 0000000..b56ab9c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/package.json @@ -0,0 +1,37 @@ +{ + "name": "@ckeditor/ckeditor5-autoformat", + "version": "41.3.1", + "description": "Autoformatting feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "ckeditor5": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-autoformat" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.d.ts new file mode 100644 index 0000000..2208f12 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.d.ts @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Autoformat } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface PluginsMap { + [Autoformat.pluginName]: Autoformat; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.d.ts b/node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.d.ts new file mode 100644 index 0000000..8604a88 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.d.ts @@ -0,0 +1,81 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { Delete } from 'ckeditor5/src/typing.js'; +/** + * Enables a set of predefined autoformatting actions. + * + * For a detailed overview, check the {@glink features/autoformat Autoformatting} feature guide + * and the {@glink api/autoformat package page}. + */ +export default class Autoformat extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof Delete]; + /** + * @inheritDoc + */ + static get pluginName(): "Autoformat"; + /** + * @inheritDoc + */ + afterInit(): void; + /** + * Adds autoformatting related to the {@link module:list/list~List}. + * + * When typed: + * - `* ` or `- ` – A paragraph will be changed into a bulleted list. + * - `1. ` or `1) ` – A paragraph will be changed into a numbered list ("1" can be any digit or a list of digits). + * - `[] ` or `[ ] ` – A paragraph will be changed into a to-do list. + * - `[x] ` or `[ x ] ` – A paragraph will be changed into a checked to-do list. + */ + private _addListAutoformats; + /** + * Adds autoformatting related to the {@link module:basic-styles/bold~Bold}, + * {@link module:basic-styles/italic~Italic}, {@link module:basic-styles/code~Code} + * and {@link module:basic-styles/strikethrough~Strikethrough} + * + * When typed: + * - `**foobar**` – `**` characters are removed and `foobar` is set to bold, + * - `__foobar__` – `__` characters are removed and `foobar` is set to bold, + * - `*foobar*` – `*` characters are removed and `foobar` is set to italic, + * - `_foobar_` – `_` characters are removed and `foobar` is set to italic, + * - ``` `foobar` – ``` ` ``` characters are removed and `foobar` is set to code, + * - `~~foobar~~` – `~~` characters are removed and `foobar` is set to strikethrough. + */ + private _addBasicStylesAutoformats; + /** + * Adds autoformatting related to {@link module:heading/heading~Heading}. + * + * It is using a number at the end of the command name to associate it with the proper trigger: + * + * * `heading` with a `heading1` value will be executed when typing `#`, + * * `heading` with a `heading2` value will be executed when typing `##`, + * * ... up to `heading6` for `######`. + */ + private _addHeadingAutoformats; + /** + * Adds autoformatting related to {@link module:block-quote/blockquote~BlockQuote}. + * + * When typed: + * * `> ` – A paragraph will be changed to a block quote. + */ + private _addBlockQuoteAutoformats; + /** + * Adds autoformatting related to {@link module:code-block/codeblock~CodeBlock}. + * + * When typed: + * - `` ``` `` – A paragraph will be changed to a code block. + */ + private _addCodeBlockAutoformats; + /** + * Adds autoformatting related to {@link module:horizontal-line/horizontalline~HorizontalLine}. + * + * When typed: + * - `` --- `` – Will be replaced with a horizontal line. + */ + private _addHorizontalLineAutoformats; +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js b/node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js new file mode 100644 index 0000000..95a550d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/autoformat.js @@ -0,0 +1,200 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { Delete } from 'ckeditor5/src/typing.js'; +import blockAutoformatEditing from './blockautoformatediting.js'; +import inlineAutoformatEditing from './inlineautoformatediting.js'; +/** + * Enables a set of predefined autoformatting actions. + * + * For a detailed overview, check the {@glink features/autoformat Autoformatting} feature guide + * and the {@glink api/autoformat package page}. + */ +export default class Autoformat extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [Delete]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Autoformat'; + } + /** + * @inheritDoc + */ + afterInit() { + const editor = this.editor; + const t = this.editor.t; + this._addListAutoformats(); + this._addBasicStylesAutoformats(); + this._addHeadingAutoformats(); + this._addBlockQuoteAutoformats(); + this._addCodeBlockAutoformats(); + this._addHorizontalLineAutoformats(); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Revert autoformatting action'), + keystroke: 'Backspace' + } + ] + }); + } + /** + * Adds autoformatting related to the {@link module:list/list~List}. + * + * When typed: + * - `* ` or `- ` – A paragraph will be changed into a bulleted list. + * - `1. ` or `1) ` – A paragraph will be changed into a numbered list ("1" can be any digit or a list of digits). + * - `[] ` or `[ ] ` – A paragraph will be changed into a to-do list. + * - `[x] ` or `[ x ] ` – A paragraph will be changed into a checked to-do list. + */ + _addListAutoformats() { + const commands = this.editor.commands; + if (commands.get('bulletedList')) { + blockAutoformatEditing(this.editor, this, /^[*-]\s$/, 'bulletedList'); + } + if (commands.get('numberedList')) { + blockAutoformatEditing(this.editor, this, /^1[.|)]\s$/, 'numberedList'); + } + if (commands.get('todoList')) { + blockAutoformatEditing(this.editor, this, /^\[\s?\]\s$/, 'todoList'); + } + if (commands.get('checkTodoList')) { + blockAutoformatEditing(this.editor, this, /^\[\s?x\s?\]\s$/, () => { + this.editor.execute('todoList'); + this.editor.execute('checkTodoList'); + }); + } + } + /** + * Adds autoformatting related to the {@link module:basic-styles/bold~Bold}, + * {@link module:basic-styles/italic~Italic}, {@link module:basic-styles/code~Code} + * and {@link module:basic-styles/strikethrough~Strikethrough} + * + * When typed: + * - `**foobar**` – `**` characters are removed and `foobar` is set to bold, + * - `__foobar__` – `__` characters are removed and `foobar` is set to bold, + * - `*foobar*` – `*` characters are removed and `foobar` is set to italic, + * - `_foobar_` – `_` characters are removed and `foobar` is set to italic, + * - ``` `foobar` – ``` ` ``` characters are removed and `foobar` is set to code, + * - `~~foobar~~` – `~~` characters are removed and `foobar` is set to strikethrough. + */ + _addBasicStylesAutoformats() { + const commands = this.editor.commands; + if (commands.get('bold')) { + const boldCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'bold'); + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(\*\*)([^*]+)(\*\*)$/g, boldCallback); + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(__)([^_]+)(__)$/g, boldCallback); + } + if (commands.get('italic')) { + const italicCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'italic'); + // The italic autoformatter cannot be triggered by the bold markers, so we need to check the + // text before the pattern (e.g. `(?:^|[^\*])`). + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(\*)([^*_]+)(\*)$/g, italicCallback); + inlineAutoformatEditing(this.editor, this, /(?:^|\s)(_)([^_]+)(_)$/g, italicCallback); + } + if (commands.get('code')) { + const codeCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'code'); + inlineAutoformatEditing(this.editor, this, /(`)([^`]+)(`)$/g, codeCallback); + } + if (commands.get('strikethrough')) { + const strikethroughCallback = getCallbackFunctionForInlineAutoformat(this.editor, 'strikethrough'); + inlineAutoformatEditing(this.editor, this, /(~~)([^~]+)(~~)$/g, strikethroughCallback); + } + } + /** + * Adds autoformatting related to {@link module:heading/heading~Heading}. + * + * It is using a number at the end of the command name to associate it with the proper trigger: + * + * * `heading` with a `heading1` value will be executed when typing `#`, + * * `heading` with a `heading2` value will be executed when typing `##`, + * * ... up to `heading6` for `######`. + */ + _addHeadingAutoformats() { + const command = this.editor.commands.get('heading'); + if (command) { + command.modelElements + .filter(name => name.match(/^heading[1-6]$/)) + .forEach(modelName => { + const level = modelName[7]; + const pattern = new RegExp(`^(#{${level}})\\s$`); + blockAutoformatEditing(this.editor, this, pattern, () => { + // Should only be active if command is enabled and heading style associated with pattern is inactive. + if (!command.isEnabled || command.value === modelName) { + return false; + } + this.editor.execute('heading', { value: modelName }); + }); + }); + } + } + /** + * Adds autoformatting related to {@link module:block-quote/blockquote~BlockQuote}. + * + * When typed: + * * `> ` – A paragraph will be changed to a block quote. + */ + _addBlockQuoteAutoformats() { + if (this.editor.commands.get('blockQuote')) { + blockAutoformatEditing(this.editor, this, /^>\s$/, 'blockQuote'); + } + } + /** + * Adds autoformatting related to {@link module:code-block/codeblock~CodeBlock}. + * + * When typed: + * - `` ``` `` – A paragraph will be changed to a code block. + */ + _addCodeBlockAutoformats() { + const editor = this.editor; + const selection = editor.model.document.selection; + if (editor.commands.get('codeBlock')) { + blockAutoformatEditing(editor, this, /^```$/, () => { + if (selection.getFirstPosition().parent.is('element', 'listItem')) { + return false; + } + this.editor.execute('codeBlock', { + usePreviousLanguageChoice: true + }); + }); + } + } + /** + * Adds autoformatting related to {@link module:horizontal-line/horizontalline~HorizontalLine}. + * + * When typed: + * - `` --- `` – Will be replaced with a horizontal line. + */ + _addHorizontalLineAutoformats() { + if (this.editor.commands.get('horizontalLine')) { + blockAutoformatEditing(this.editor, this, /^---$/, 'horizontalLine'); + } + } +} +/** + * Helper function for getting `inlineAutoformatEditing` callbacks that checks if command is enabled. + */ +function getCallbackFunctionForInlineAutoformat(editor, attributeKey) { + return (writer, rangesToFormat) => { + const command = editor.commands.get(attributeKey); + if (!command.isEnabled) { + return false; + } + const validRanges = editor.model.schema.getValidRanges(rangesToFormat, attributeKey); + for (const range of validRanges) { + writer.setAttribute(attributeKey, true, range); + } + // After applying attribute to the text, remove given attribute from the selection. + // This way user is able to type a text without attribute used by auto formatter. + writer.removeSelectionAttribute(attributeKey); + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.d.ts b/node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.d.ts new file mode 100644 index 0000000..c27e02b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.d.ts @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Editor } from 'ckeditor5/src/core.js'; +import type Autoformat from './autoformat.js'; +/** + * The block autoformatting engine. It allows to format various block patterns. For example, + * it can be configured to turn a paragraph starting with `*` and followed by a space into a list item. + * + * The autoformatting operation is integrated with the undo manager, + * so the autoformatting step can be undone if the user's intention was not to format the text. + * + * See the {@link module:autoformat/blockautoformatediting~blockAutoformatEditing `blockAutoformatEditing`} documentation + * to learn how to create custom block autoformatters. You can also use + * the {@link module:autoformat/autoformat~Autoformat} feature which enables a set of default autoformatters + * (lists, headings, bold and italic). + * + * @module autoformat/blockautoformatediting + */ +/** + * Creates a listener triggered on {@link module:engine/model/document~Document#event:change:data `change:data`} event in the document. + * Calls the callback when inserted text matches the regular expression or the command name + * if provided instead of the callback. + * + * Examples of usage: + * + * To convert a paragraph into heading 1 when `- ` is typed, using just the command name: + * + * ```ts + * blockAutoformatEditing( editor, plugin, /^\- $/, 'heading1' ); + * ``` + * + * To convert a paragraph into heading 1 when `- ` is typed, using just the callback: + * + * ```ts + * blockAutoformatEditing( editor, plugin, /^\- $/, ( context ) => { + * const { match } = context; + * const headingLevel = match[ 1 ].length; + * + * editor.execute( 'heading', { + * formatId: `heading${ headingLevel }` + * } ); + * } ); + * ``` + * + * @param editor The editor instance. + * @param plugin The autoformat plugin instance. + * @param pattern The regular expression to execute on just inserted text. The regular expression is tested against the text + * from the beginning until the caret position. + * @param callbackOrCommand The callback to execute or the command to run when the text is matched. + * In case of providing the callback, it receives the following parameter: + * * match RegExp.exec() result of matching the pattern to inserted text. + */ +export default function blockAutoformatEditing(editor: Editor, plugin: Autoformat, pattern: RegExp, callbackOrCommand: string | ((context: { + match: RegExpExecArray; +}) => unknown)): void; diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js b/node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js new file mode 100644 index 0000000..881a012 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/blockautoformatediting.js @@ -0,0 +1,137 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { LiveRange } from 'ckeditor5/src/engine.js'; +import { first } from 'ckeditor5/src/utils.js'; +/** + * The block autoformatting engine. It allows to format various block patterns. For example, + * it can be configured to turn a paragraph starting with `*` and followed by a space into a list item. + * + * The autoformatting operation is integrated with the undo manager, + * so the autoformatting step can be undone if the user's intention was not to format the text. + * + * See the {@link module:autoformat/blockautoformatediting~blockAutoformatEditing `blockAutoformatEditing`} documentation + * to learn how to create custom block autoformatters. You can also use + * the {@link module:autoformat/autoformat~Autoformat} feature which enables a set of default autoformatters + * (lists, headings, bold and italic). + * + * @module autoformat/blockautoformatediting + */ +/** + * Creates a listener triggered on {@link module:engine/model/document~Document#event:change:data `change:data`} event in the document. + * Calls the callback when inserted text matches the regular expression or the command name + * if provided instead of the callback. + * + * Examples of usage: + * + * To convert a paragraph into heading 1 when `- ` is typed, using just the command name: + * + * ```ts + * blockAutoformatEditing( editor, plugin, /^\- $/, 'heading1' ); + * ``` + * + * To convert a paragraph into heading 1 when `- ` is typed, using just the callback: + * + * ```ts + * blockAutoformatEditing( editor, plugin, /^\- $/, ( context ) => { + * const { match } = context; + * const headingLevel = match[ 1 ].length; + * + * editor.execute( 'heading', { + * formatId: `heading${ headingLevel }` + * } ); + * } ); + * ``` + * + * @param editor The editor instance. + * @param plugin The autoformat plugin instance. + * @param pattern The regular expression to execute on just inserted text. The regular expression is tested against the text + * from the beginning until the caret position. + * @param callbackOrCommand The callback to execute or the command to run when the text is matched. + * In case of providing the callback, it receives the following parameter: + * * match RegExp.exec() result of matching the pattern to inserted text. + */ +export default function blockAutoformatEditing(editor, plugin, pattern, callbackOrCommand) { + let callback; + let command = null; + if (typeof callbackOrCommand == 'function') { + callback = callbackOrCommand; + } + else { + // We assume that the actual command name was provided. + command = editor.commands.get(callbackOrCommand); + callback = () => { + editor.execute(callbackOrCommand); + }; + } + editor.model.document.on('change:data', (evt, batch) => { + if (command && !command.isEnabled || !plugin.isEnabled) { + return; + } + const range = first(editor.model.document.selection.getRanges()); + if (!range.isCollapsed) { + return; + } + if (batch.isUndo || !batch.isLocal) { + return; + } + const changes = Array.from(editor.model.document.differ.getChanges()); + const entry = changes[0]; + // Typing is represented by only a single change. + if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) { + return; + } + const blockToFormat = entry.position.parent; + // Block formatting should be disabled in codeBlocks (#5800). + if (blockToFormat.is('element', 'codeBlock')) { + return; + } + // Only list commands and custom callbacks can be applied inside a list. + if (blockToFormat.is('element', 'listItem') && + typeof callbackOrCommand !== 'function' && + !['numberedList', 'bulletedList', 'todoList'].includes(callbackOrCommand)) { + return; + } + // In case a command is bound, do not re-execute it over an existing block style which would result in a style removal. + // Instead, just drop processing so that autoformat trigger text is not lost. E.g. writing "# " in a level 1 heading. + if (command && command.value === true) { + return; + } + const firstNode = blockToFormat.getChild(0); + const firstNodeRange = editor.model.createRangeOn(firstNode); + // Range is only expected to be within or at the very end of the first text node. + if (!firstNodeRange.containsRange(range) && !range.end.isEqual(firstNodeRange.end)) { + return; + } + const match = pattern.exec(firstNode.data.substr(0, range.end.offset)); + // ...and this text node's data match the pattern. + if (!match) { + return; + } + // Use enqueueChange to create new batch to separate typing batch from the auto-format changes. + editor.model.enqueueChange(writer => { + // Matched range. + const start = writer.createPositionAt(blockToFormat, 0); + const end = writer.createPositionAt(blockToFormat, match[0].length); + const range = new LiveRange(start, end); + const wasChanged = callback({ match }); + // Remove matched text. + if (wasChanged !== false) { + writer.remove(range); + const selectionRange = editor.model.document.selection.getFirstRange(); + const blockRange = writer.createRangeIn(blockToFormat); + // If the block is empty and the document selection has been moved when + // applying formatting (e.g. is now in newly created block). + if (blockToFormat.isEmpty && !blockRange.isEqual(selectionRange) && !blockRange.containsRange(selectionRange, true)) { + writer.remove(blockToFormat); + } + } + range.detach(); + editor.model.enqueueChange(() => { + const deletePlugin = editor.plugins.get('Delete'); + deletePlugin.requestUndoOnBackspace(); + }); + }); + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-autoformat/src/index.d.ts new file mode 100644 index 0000000..2afe8cc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/index.d.ts @@ -0,0 +1,9 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module autoformat + */ +export { default as Autoformat } from './autoformat.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/index.js b/node_modules/@ckeditor/ckeditor5-autoformat/src/index.js new file mode 100644 index 0000000..2afe8cc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/index.js @@ -0,0 +1,9 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module autoformat + */ +export { default as Autoformat } from './autoformat.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.d.ts b/node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.d.ts new file mode 100644 index 0000000..e0b08e2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.d.ts @@ -0,0 +1,83 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * The inline autoformatting engine. It allows to format various inline patterns. For example, + * it can be configured to make "foo" bold when typed `**foo**` (the `**` markers will be removed). + * + * The autoformatting operation is integrated with the undo manager, + * so the autoformatting step can be undone if the user's intention was not to format the text. + * + * See the {@link module:autoformat/inlineautoformatediting~inlineAutoformatEditing `inlineAutoformatEditing`} documentation + * to learn how to create custom inline autoformatters. You can also use + * the {@link module:autoformat/autoformat~Autoformat} feature which enables a set of default autoformatters + * (lists, headings, bold and italic). + * + * @module autoformat/inlineautoformatediting + */ +import type { Editor } from 'ckeditor5/src/core.js'; +import type { Range, Writer } from 'ckeditor5/src/engine.js'; +import type Autoformat from './autoformat.js'; +export type TestCallback = (text: string) => { + remove: Array>; + format: Array>; +}; +/** + * Enables autoformatting mechanism for a given {@link module:core/editor/editor~Editor}. + * + * It formats the matched text by applying the given model attribute or by running the provided formatting callback. + * On every {@link module:engine/model/document~Document#event:change:data data change} in the model document + * the autoformatting engine checks the text on the left of the selection + * and executes the provided action if the text matches given criteria (regular expression or callback). + * + * @param editor The editor instance. + * @param plugin The autoformat plugin instance. + * @param testRegexpOrCallback The regular expression or callback to execute on text. + * Provided regular expression *must* have three capture groups. The first and the third capture group + * should match opening and closing delimiters. The second capture group should match the text to format. + * + * ```ts + * // Matches the `**bold text**` pattern. + * // There are three capturing groups: + * // - The first to match the starting `**` delimiter. + * // - The second to match the text to format. + * // - The third to match the ending `**` delimiter. + * inlineAutoformatEditing( editor, plugin, /(\*\*)([^\*]+?)(\*\*)$/g, formatCallback ); + * ``` + * + * When a function is provided instead of the regular expression, it will be executed with the text to match as a parameter. + * The function should return proper "ranges" to delete and format. + * + * ```ts + * { + * remove: [ + * [ 0, 1 ], // Remove the first letter from the given text. + * [ 5, 6 ] // Remove the 6th letter from the given text. + * ], + * format: [ + * [ 1, 5 ] // Format all letters from 2nd to 5th. + * ] + * } + * ``` + * + * @param formatCallback A callback to apply actual formatting. + * It should return `false` if changes should not be applied (e.g. if a command is disabled). + * + * ```ts + * inlineAutoformatEditing( editor, plugin, /(\*\*)([^\*]+?)(\*\*)$/g, ( writer, rangesToFormat ) => { + * const command = editor.commands.get( 'bold' ); + * + * if ( !command.isEnabled ) { + * return false; + * } + * + * const validRanges = editor.model.schema.getValidRanges( rangesToFormat, 'bold' ); + * + * for ( let range of validRanges ) { + * writer.setAttribute( 'bold', true, range ); + * } + * } ); + * ``` + */ +export default function inlineAutoformatEditing(editor: Editor, plugin: Autoformat, testRegexpOrCallback: RegExp | TestCallback, formatCallback: (writer: Writer, rangesToFormat: Array) => boolean | undefined): void; diff --git a/node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js b/node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js new file mode 100644 index 0000000..88bc322 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-autoformat/src/inlineautoformatediting.js @@ -0,0 +1,174 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Enables autoformatting mechanism for a given {@link module:core/editor/editor~Editor}. + * + * It formats the matched text by applying the given model attribute or by running the provided formatting callback. + * On every {@link module:engine/model/document~Document#event:change:data data change} in the model document + * the autoformatting engine checks the text on the left of the selection + * and executes the provided action if the text matches given criteria (regular expression or callback). + * + * @param editor The editor instance. + * @param plugin The autoformat plugin instance. + * @param testRegexpOrCallback The regular expression or callback to execute on text. + * Provided regular expression *must* have three capture groups. The first and the third capture group + * should match opening and closing delimiters. The second capture group should match the text to format. + * + * ```ts + * // Matches the `**bold text**` pattern. + * // There are three capturing groups: + * // - The first to match the starting `**` delimiter. + * // - The second to match the text to format. + * // - The third to match the ending `**` delimiter. + * inlineAutoformatEditing( editor, plugin, /(\*\*)([^\*]+?)(\*\*)$/g, formatCallback ); + * ``` + * + * When a function is provided instead of the regular expression, it will be executed with the text to match as a parameter. + * The function should return proper "ranges" to delete and format. + * + * ```ts + * { + * remove: [ + * [ 0, 1 ], // Remove the first letter from the given text. + * [ 5, 6 ] // Remove the 6th letter from the given text. + * ], + * format: [ + * [ 1, 5 ] // Format all letters from 2nd to 5th. + * ] + * } + * ``` + * + * @param formatCallback A callback to apply actual formatting. + * It should return `false` if changes should not be applied (e.g. if a command is disabled). + * + * ```ts + * inlineAutoformatEditing( editor, plugin, /(\*\*)([^\*]+?)(\*\*)$/g, ( writer, rangesToFormat ) => { + * const command = editor.commands.get( 'bold' ); + * + * if ( !command.isEnabled ) { + * return false; + * } + * + * const validRanges = editor.model.schema.getValidRanges( rangesToFormat, 'bold' ); + * + * for ( let range of validRanges ) { + * writer.setAttribute( 'bold', true, range ); + * } + * } ); + * ``` + */ +export default function inlineAutoformatEditing(editor, plugin, testRegexpOrCallback, formatCallback) { + let regExp; + let testCallback; + if (testRegexpOrCallback instanceof RegExp) { + regExp = testRegexpOrCallback; + } + else { + testCallback = testRegexpOrCallback; + } + // A test callback run on changed text. + testCallback = testCallback || (text => { + let result; + const remove = []; + const format = []; + while ((result = regExp.exec(text)) !== null) { + // There should be full match and 3 capture groups. + if (result && result.length < 4) { + break; + } + let { index, '1': leftDel, '2': content, '3': rightDel } = result; + // Real matched string - there might be some non-capturing groups so we need to recalculate starting index. + const found = leftDel + content + rightDel; + index += result[0].length - found.length; + // Start and End offsets of delimiters to remove. + const delStart = [ + index, + index + leftDel.length + ]; + const delEnd = [ + index + leftDel.length + content.length, + index + leftDel.length + content.length + rightDel.length + ]; + remove.push(delStart); + remove.push(delEnd); + format.push([index + leftDel.length, index + leftDel.length + content.length]); + } + return { + remove, + format + }; + }); + editor.model.document.on('change:data', (evt, batch) => { + if (batch.isUndo || !batch.isLocal || !plugin.isEnabled) { + return; + } + const model = editor.model; + const selection = model.document.selection; + // Do nothing if selection is not collapsed. + if (!selection.isCollapsed) { + return; + } + const changes = Array.from(model.document.differ.getChanges()); + const entry = changes[0]; + // Typing is represented by only a single change. + if (changes.length != 1 || entry.type !== 'insert' || entry.name != '$text' || entry.length != 1) { + return; + } + const focus = selection.focus; + const block = focus.parent; + const { text, range } = getTextAfterCode(model.createRange(model.createPositionAt(block, 0), focus), model); + const testOutput = testCallback(text); + const rangesToFormat = testOutputToRanges(range.start, testOutput.format, model); + const rangesToRemove = testOutputToRanges(range.start, testOutput.remove, model); + if (!(rangesToFormat.length && rangesToRemove.length)) { + return; + } + // Use enqueueChange to create new batch to separate typing batch from the auto-format changes. + model.enqueueChange(writer => { + // Apply format. + const hasChanged = formatCallback(writer, rangesToFormat); + // Strict check on `false` to have backward compatibility (when callbacks were returning `undefined`). + if (hasChanged === false) { + return; + } + // Remove delimiters - use reversed order to not mix the offsets while removing. + for (const range of rangesToRemove.reverse()) { + writer.remove(range); + } + model.enqueueChange(() => { + const deletePlugin = editor.plugins.get('Delete'); + deletePlugin.requestUndoOnBackspace(); + }); + }); + }); +} +/** + * Converts output of the test function provided to the inlineAutoformatEditing and converts it to the model ranges + * inside provided block. + */ +function testOutputToRanges(start, arrays, model) { + return arrays + .filter(array => (array[0] !== undefined && array[1] !== undefined)) + .map(array => { + return model.createRange(start.getShiftedBy(array[0]), start.getShiftedBy(array[1])); + }); +} +/** + * Returns the last text line after the last code element from the given range. + * It is similar to {@link module:typing/utils/getlasttextline.getLastTextLine `getLastTextLine()`}, + * but it ignores any text before the last `code`. + */ +function getTextAfterCode(range, model) { + let start = range.start; + const text = Array.from(range.getItems()).reduce((rangeText, node) => { + // Trim text to a last occurrence of an inline element and update range start. + if (!(node.is('$text') || node.is('$textProxy')) || node.getAttribute('code')) { + start = model.createPositionAfter(node); + return ''; + } + return rangeText + node.data; + }, ''); + return { text, range: model.createRange(start, range.end) }; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md new file mode 100644 index 0000000..b130453 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/CHANGELOG.md @@ -0,0 +1,247 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v18.0.0...v19.0.0) (April 29, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v16.0.0...v17.0.0) (February 18, 2020) + +### Bug fixes + +* Focus the editor before executing toolbar buttons' command. See [ckeditor/ckeditor5#353](https://github.com/ckeditor/ckeditor5/issues/353). ([6bbca98](https://github.com/ckeditor/ckeditor5-basic-styles/commit/6bbca98)) + +### Other changes + +* Updated translations. ([4def017](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4def017)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Other changes + +* Updated translations. ([9dfd52c](https://github.com/ckeditor/ckeditor5-basic-styles/commit/9dfd52c)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.4...v15.0.0) (October 23, 2019) + +### Features + +* Provided support for numeric values for the `font-weight` attribute. Closes [#94](https://github.com/ckeditor/ckeditor5-basic-styles/issues/94). Closes [ckeditor/ckeditor5-paste-from-office#74](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/74). ([25a0d7c](https://github.com/ckeditor/ckeditor5-basic-styles/commit/25a0d7c)) + +### Other changes + +* Added `pluginName` property to editing plugins. ([d91773f](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d91773f)) +* Updated translations. ([56d6060](https://github.com/ckeditor/ckeditor5-basic-styles/commit/56d6060)) + + +## [11.1.4](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.3...v11.1.4) (August 26, 2019) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([b9f5867](https://github.com/ckeditor/ckeditor5-basic-styles/commit/b9f5867)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([8293319](https://github.com/ckeditor/ckeditor5-basic-styles/commit/8293319)) +* Mark basic-styles attributes with 'copyOnEnter' property. ([0afbc20](https://github.com/ckeditor/ckeditor5-basic-styles/commit/0afbc20)) +* Updated translations. ([52de3fe](https://github.com/ckeditor/ckeditor5-basic-styles/commit/52de3fe)) + + +## [11.1.3](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.2...v11.1.3) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.1.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.1...v11.1.2) (July 4, 2019) + +### Other changes + +* Updated translations. ([8914cfc](https://github.com/ckeditor/ckeditor5-basic-styles/commit/8914cfc)) ([fb07a45](https://github.com/ckeditor/ckeditor5-basic-styles/commit/fb07a45)) + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.1.0...v11.1.1) (June 6, 2019) + +### Other changes + +* Updated translations. ([c9cdc44](https://github.com/ckeditor/ckeditor5-basic-styles/commit/c9cdc44)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v11.0.0...v11.1.0) (April 4, 2019) + +### Features + +* Marked basic style attributes as a formatting using the `AttributeProperties#isFormatting` property. Closes [ckeditor/ckeditor5#1664](https://github.com/ckeditor/ckeditor5/issues/1664). ([fcfba54](https://github.com/ckeditor/ckeditor5-basic-styles/commit/fcfba54)) + +### Other changes + +* Optimized icons. ([018dda9](https://github.com/ckeditor/ckeditor5-basic-styles/commit/018dda9)) +* Updated translations. ([4365251](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4365251)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.1.0...v11.0.0) (February 28, 2019) + +### Other changes + +* Updated translations. ([b96cf6d](https://github.com/ckeditor/ckeditor5-basic-styles/commit/b96cf6d)) ([8223ff2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/8223ff2)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.3...v10.1.0) (December 5, 2018) + +### Features + +* Introduced the `Superscript` and the `Subscript` features. Closes [#76](https://github.com/ckeditor/ckeditor5-basic-styles/issues/76). Closes [#74](https://github.com/ckeditor/ckeditor5-basic-styles/issues/74). ([f281e99](https://github.com/ckeditor/ckeditor5-basic-styles/commit/f281e99)) + + Thanks to [@idleb](https://github.com/idleb)! + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([6314191](https://github.com/ckeditor/ckeditor5-basic-styles/commit/6314191)) +* Updated translations. ([f9d3d07](https://github.com/ckeditor/ckeditor5-basic-styles/commit/f9d3d07)) ([67fb2e2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/67fb2e2)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.2...v10.0.3) (October 8, 2018) + +### Other changes + +* Updated translations. ([cf4e657](https://github.com/ckeditor/ckeditor5-basic-styles/commit/cf4e657)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.1...v10.0.2) (July 18, 2018) + +### Bug fixes + +* The value of `AttributeCommand` should be taken from the first node on which this style is allowed. Closes [#56](https://github.com/ckeditor/ckeditor5-basic-styles/issues/56). ([64a0dbc](https://github.com/ckeditor/ckeditor5-basic-styles/commit/64a0dbc)) + +### Other changes + +* Updated translations. ([df8bcc4](https://github.com/ckeditor/ckeditor5-basic-styles/commit/df8bcc4)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v10.0.0...v10.0.1) (June 21, 2018) + +### Other changes + +* Updated translations. + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([94da24e](https://github.com/ckeditor/ckeditor5-basic-styles/commit/94da24e)) +* Updated translations. ([dbebfe0](https://github.com/ckeditor/ckeditor5-basic-styles/commit/dbebfe0)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +### Other changes + +* Improved the "strikethrough" icon. Closes [ckeditor/ckeditor5#910](https://github.com/ckeditor/ckeditor5/issues/910). ([d559d8f](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d559d8f)) +* Updated translations. ([b4c8419](https://github.com/ckeditor/ckeditor5-basic-styles/commit/b4c8419)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Features + +* Added the strikethrough feature. ([78719c9](https://github.com/ckeditor/ckeditor5-basic-styles/commit/78719c9)) + + Thanks to [@Natim](https://github.com/Natim)! +* Updated icons for compatibility with the refreshed Lark theme (see [ckeditor/ckeditor5#645](https://github.com/ckeditor/ckeditor5/issues/645)). ([170fec2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/170fec2)) + +### Other changes + +* Aligned feature class naming to the new scheme. ([51a4b61](https://github.com/ckeditor/ckeditor5-basic-styles/commit/51a4b61)) +* Migrated package styles to PostCSS. Moved the visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([a5d5d9e](https://github.com/ckeditor/ckeditor5-basic-styles/commit/a5d5d9e)) +* Updated translations. ([1ff4312](https://github.com/ckeditor/ckeditor5-basic-styles/commit/1ff4312)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Other changes + +* Updated translations. ([398054d](https://github.com/ckeditor/ckeditor5-basic-styles/commit/398054d)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.9.0...v1.0.0-alpha.1) (October 3, 2017) + +### Features + +* Introduced the `Code` plugin. Closes [#52](https://github.com/ckeditor/ckeditor5-basic-styles/issues/52). ([d720cb9](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d720cb9)) + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.8.1...v0.9.0) (September 3, 2017) + +### Bug fixes + +* It should be possible to paste basic styles. See https://github.com/ckeditor/ckeditor5/issues/477. ([d2db7fe](https://github.com/ckeditor/ckeditor5-basic-styles/commit/d2db7fe)) + +### Features + +* Introduced `AttributeCommand`. It was moved from `@ckeditor/ckeditor5-core/src/command/toggleattributecommand`. Closes [#47](https://github.com/ckeditor/ckeditor5-basic-styles/issues/47). ([0301d4a](https://github.com/ckeditor/ckeditor5-basic-styles/commit/0301d4a)) +* Introduced the `Underline` plugin. Closes [#51](https://github.com/ckeditor/ckeditor5-basic-styles/issues/51). ([f724ae0](https://github.com/ckeditor/ckeditor5-basic-styles/commit/f724ae0)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([36a976e](https://github.com/ckeditor/ckeditor5-basic-styles/commit/36a976e)) +* Cleaned up SVG icons. ([da10131](https://github.com/ckeditor/ckeditor5-basic-styles/commit/da10131)) +* Italic feature will use `` instead of ``. Closes [#28](https://github.com/ckeditor/ckeditor5-basic-styles/issues/28). ([9d1d5e2](https://github.com/ckeditor/ckeditor5-basic-styles/commit/9d1d5e2)) + + Read more in [Editor Recommendations](http://ckeditor.github.io/editor-recommendations/features/italic.html). + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.8.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.8.0...v0.8.1) (May 7, 2017) + +### Bug fixes + +* Bold and italic should not be allowed directly in the root element. Closes [#40](https://github.com/ckeditor/ckeditor5-basic-styles/issues/40). ([4a737bf](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4a737bf)) + +### Other changes + +* Updated translations. ([5250bec](https://github.com/ckeditor/ckeditor5-basic-styles/commit/5250bec)) + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.7.1...v0.8.0) (April 5, 2017) + +### Features + +* Named existing plugin(s). ([5f649be](https://github.com/ckeditor/ckeditor5-basic-styles/commit/5f649be)) + +### Other changes + +* Updated translations. ([2aa33fd](https://github.com/ckeditor/ckeditor5-basic-styles/commit/2aa33fd)) + + +## [0.7.1](https://github.com/ckeditor/ckeditor5-basic-styles/compare/v0.7.0...v0.7.1) (March 6, 2017) + +### Other changes + +* Updated translations. ([4fd6e19](https://github.com/ckeditor/ckeditor5-basic-styles/commit/4fd6e19)) diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/LICENSE.md b/node_modules/@ckeditor/ckeditor5-basic-styles/LICENSE.md new file mode 100644 index 0000000..90cd5c5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 basic styles feature** – https://github.com/ckeditor/ckeditor5-basic-styles
+Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/README.md b/node_modules/@ckeditor/ckeditor5-basic-styles/README.md new file mode 100644 index 0000000..219ac3c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/README.md @@ -0,0 +1,20 @@ +CKEditor 5 basic styles feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-basic-styles.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package contains CKEditor 5 features allowing to apply basic text formatting such as bold, italic, underline, and code in CKEditor 5. + +## Demo + +Check out the [demo in the basic styles feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/basic-styles.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-basic-styles` package](https://ckeditor.com/docs/ckeditor5/latest/api/basic-styles.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js new file mode 100644 index 0000000..a2926f5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/basic-styles.js @@ -0,0 +1,5 @@ +!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Bold","Bold text":"Bold text",Code:"Code",Italic:"Italic","Italic text":"Italic text","Move out of an inline code style":"Move out of an inline code style",Strikethrough:"Strikethrough","Strikethrough text":"Strikethrough text",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline","Underline text":"Underline text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var t={598:(t,e,i)=>{"use strict";i.d(e,{A:()=>r});var n=i(935),o=i.n(n)()((function(t){return t[1]}));o.push([t.id,".ck-content code{background-color:hsla(0,0%,78%,.3);border-radius:2px;padding:.15em}.ck.ck-editor__editable .ck-code_selected{background-color:hsla(0,0%,78%,.5)}",""]);const r=o},935:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i=t(e);return e[2]?"@media ".concat(e[2]," {").concat(i,"}"):i})).join("")},e.i=function(t,i,n){"string"==typeof t&&(t=[[null,t,""]]);var o={};if(n)for(var r=0;r{"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var t={};return function(e){if(void 0===t[e]){var i=document.querySelector(e);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(t){i=null}t[e]=i}return t[e]}}(),s=[];function a(t){for(var e=-1,i=0;i{t.exports=i(237)("./src/core.js")},834:(t,e,i)=>{t.exports=i(237)("./src/typing.js")},311:(t,e,i)=>{t.exports=i(237)("./src/ui.js")},237:t=>{"use strict";t.exports=CKEditor5.dll}},e={};function i(n){var o=e[n];if(void 0!==o)return o.exports;var r=e[n]={id:n,exports:{}};return t[n](r,r.exports,i),r.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.nc=void 0;var n={};(()=>{"use strict";i.r(n),i.d(n,{Bold:()=>u,BoldEditing:()=>r,BoldUI:()=>l,Code:()=>w,CodeEditing:()=>g,CodeUI:()=>f,Italic:()=>B,ItalicEditing:()=>k,ItalicUI:()=>I,Strikethrough:()=>E,StrikethroughEditing:()=>T,StrikethroughUI:()=>C,Subscript:()=>F,SubscriptEditing:()=>L,SubscriptUI:()=>U,Superscript:()=>j,SuperscriptEditing:()=>V,SuperscriptUI:()=>K,Underline:()=>$,UnderlineEditing:()=>_,UnderlineUI:()=>H});var t=i(782);class e extends t.Command{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,i=e.document.selection,n=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(i.isCollapsed)n?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const o=e.schema.getValidRanges(i.getRanges(),this.attributeKey);for(const e of o)n?t.setAttribute(this.attributeKey,n,e):t.removeAttribute(this.attributeKey,e)}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,i=t.document.selection;if(i.isCollapsed)return i.hasAttribute(this.attributeKey);for(const t of i.getRanges())for(const i of t.getItems())if(e.checkAttribute(i,this.attributeKey))return i.hasAttribute(this.attributeKey);return!1}}const o="bold";class r extends t.Plugin{static get pluginName(){return"BoldEditing"}init(){const t=this.editor,i=this.editor.t;t.model.schema.extend("$text",{allowAttributes:o}),t.model.schema.setAttributeProperties(o,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:o,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e&&("bold"==e||Number(e)>=600)?{name:!0,styles:["font-weight"]}:null}]}),t.commands.add(o,new e(t,o)),t.keystrokes.set("CTRL+B",o),t.accessibility.addKeystrokeInfos({keystrokes:[{label:i("Bold text"),keystroke:"CTRL+B"}]})}}var s=i(311);function a({editor:t,commandName:e,plugin:i,icon:n,label:o,keystroke:r}){return s=>{const a=t.commands.get(e),c=new s(t.locale);return c.set({label:o,icon:n,keystroke:r,isToggleable:!0}),c.bind("isEnabled").to(a,"isEnabled"),i.listenTo(c,"execute",(()=>{t.execute(e),t.editing.view.focus()})),c}}const c="bold";class l extends t.Plugin{static get pluginName(){return"BoldUI"}init(){const e=this.editor,i=e.locale.t,n=e.commands.get(c),o=a({editor:e,commandName:c,plugin:this,icon:t.icons.bold,label:i("Bold"),keystroke:"CTRL+B"});e.ui.componentFactory.add(c,(()=>{const t=o(s.ButtonView);return t.set({tooltip:!0}),t.bind("isOn").to(n,"value"),t})),e.ui.componentFactory.add("menuBar:"+c,(()=>o(s.MenuBarMenuListItemButtonView)))}}class u extends t.Plugin{static get requires(){return[r,l]}static get pluginName(){return"Bold"}}var d=i(834);const m="code";class g extends t.Plugin{static get pluginName(){return"CodeEditing"}static get requires(){return[d.TwoStepCaretMovement]}init(){const t=this.editor,i=this.editor.t;t.model.schema.extend("$text",{allowAttributes:m}),t.model.schema.setAttributeProperties(m,{isFormatting:!0,copyOnEnter:!1}),t.conversion.attributeToElement({model:m,view:"code",upcastAlso:{styles:{"word-wrap":"break-word"}}}),t.commands.add(m,new e(t,m)),t.plugins.get(d.TwoStepCaretMovement).registerAttribute(m),(0,d.inlineHighlight)(t,m,"code","ck-code_selected"),t.accessibility.addKeystrokeInfos({keystrokes:[{label:i("Move out of an inline code style"),keystroke:[["arrowleft","arrowleft"],["arrowright","arrowright"]]}]})}}var p=i(591),h=i.n(p),b=i(598),v={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};h()(b.A,v);b.A.locals;const y="code";class f extends t.Plugin{static get pluginName(){return"CodeUI"}init(){const t=this.editor,e=t.locale.t,i=a({editor:t,commandName:y,plugin:this,icon:'',label:e("Code")});t.ui.componentFactory.add(y,(()=>{const e=i(s.ButtonView),n=t.commands.get(y);return e.set({tooltip:!0}),e.bind("isOn").to(n,"value"),e})),t.ui.componentFactory.add("menuBar:"+y,(()=>i(s.MenuBarMenuListItemButtonView)))}}class w extends t.Plugin{static get requires(){return[g,f]}static get pluginName(){return"Code"}}const x="italic";class k extends t.Plugin{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor,i=this.editor.t;t.model.schema.extend("$text",{allowAttributes:x}),t.model.schema.setAttributeProperties(x,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:x,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(x,new e(t,x)),t.keystrokes.set("CTRL+I",x),t.accessibility.addKeystrokeInfos({keystrokes:[{label:i("Italic text"),keystroke:"CTRL+I"}]})}}const S="italic";class I extends t.Plugin{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.commands.get(S),i=t.locale.t,n=a({editor:t,commandName:S,plugin:this,icon:'',keystroke:"CTRL+I",label:i("Italic")});t.ui.componentFactory.add(S,(()=>{const t=n(s.ButtonView);return t.set({tooltip:!0}),t.bind("isOn").to(e,"value"),t})),t.ui.componentFactory.add("menuBar:"+S,(()=>n(s.MenuBarMenuListItemButtonView)))}}class B extends t.Plugin{static get requires(){return[k,I]}static get pluginName(){return"Italic"}}const A="strikethrough";class T extends t.Plugin{static get pluginName(){return"StrikethroughEditing"}init(){const t=this.editor,i=this.editor.t;t.model.schema.extend("$text",{allowAttributes:A}),t.model.schema.setAttributeProperties(A,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:A,view:"s",upcastAlso:["del","strike",{styles:{"text-decoration":"line-through"}}]}),t.commands.add(A,new e(t,A)),t.keystrokes.set("CTRL+SHIFT+X","strikethrough"),t.accessibility.addKeystrokeInfos({keystrokes:[{label:i("Strikethrough text"),keystroke:"CTRL+SHIFT+X"}]})}}const N="strikethrough";class C extends t.Plugin{static get pluginName(){return"StrikethroughUI"}init(){const t=this.editor,e=t.locale.t,i=a({editor:t,commandName:N,plugin:this,icon:'',keystroke:"CTRL+SHIFT+X",label:e("Strikethrough")});t.ui.componentFactory.add(N,(()=>{const e=i(s.ButtonView),n=t.commands.get(N);return e.set({tooltip:!0}),e.bind("isOn").to(n,"value"),e})),t.ui.componentFactory.add("menuBar:"+N,(()=>i(s.MenuBarMenuListItemButtonView)))}}class E extends t.Plugin{static get requires(){return[T,C]}static get pluginName(){return"Strikethrough"}}const M="subscript";class L extends t.Plugin{static get pluginName(){return"SubscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:M}),t.model.schema.setAttributeProperties(M,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:M,view:"sub",upcastAlso:[{styles:{"vertical-align":"sub"}}]}),t.commands.add(M,new e(t,M))}}const P="subscript";class U extends t.Plugin{static get pluginName(){return"SubscriptUI"}init(){const t=this.editor,e=t.locale.t,i=a({editor:t,commandName:P,plugin:this,icon:'',label:e("Subscript")});t.ui.componentFactory.add(P,(()=>{const e=i(s.ButtonView),n=t.commands.get(P);return e.set({tooltip:!0}),e.bind("isOn").to(n,"value"),e})),t.ui.componentFactory.add("menuBar:"+P,(()=>i(s.MenuBarMenuListItemButtonView)))}}class F extends t.Plugin{static get requires(){return[L,U]}static get pluginName(){return"Subscript"}}const O="superscript";class V extends t.Plugin{static get pluginName(){return"SuperscriptEditing"}init(){const t=this.editor;t.model.schema.extend("$text",{allowAttributes:O}),t.model.schema.setAttributeProperties(O,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:O,view:"sup",upcastAlso:[{styles:{"vertical-align":"super"}}]}),t.commands.add(O,new e(t,O))}}const R="superscript";class K extends t.Plugin{static get pluginName(){return"SuperscriptUI"}init(){const t=this.editor,e=t.locale.t,i=a({editor:t,commandName:R,plugin:this,icon:'',label:e("Superscript")});t.ui.componentFactory.add(R,(()=>{const e=i(s.ButtonView),n=t.commands.get(R);return e.set({tooltip:!0}),e.bind("isOn").to(n,"value"),e})),t.ui.componentFactory.add("menuBar:"+R,(()=>i(s.MenuBarMenuListItemButtonView)))}}class j extends t.Plugin{static get requires(){return[V,K]}static get pluginName(){return"Superscript"}}const z="underline";class _ extends t.Plugin{static get pluginName(){return"UnderlineEditing"}init(){const t=this.editor,i=this.editor.t;t.model.schema.extend("$text",{allowAttributes:z}),t.model.schema.setAttributeProperties(z,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:z,view:"u",upcastAlso:{styles:{"text-decoration":"underline"}}}),t.commands.add(z,new e(t,z)),t.keystrokes.set("CTRL+U","underline"),t.accessibility.addKeystrokeInfos({keystrokes:[{label:i("Underline text"),keystroke:"CTRL+U"}]})}}const q="underline";class H extends t.Plugin{static get pluginName(){return"UnderlineUI"}init(){const t=this.editor,e=t.commands.get(q),i=t.locale.t,n=a({editor:t,commandName:q,plugin:this,icon:'',label:i("Underline"),keystroke:"CTRL+U"});t.ui.componentFactory.add(q,(()=>{const t=n(s.ButtonView);return t.set({tooltip:!0}),t.bind("isOn").to(e,"value"),t})),t.ui.componentFactory.add("menuBar:"+q,(()=>n(s.MenuBarMenuListItemButtonView)))}}class $ extends t.Plugin{static get requires(){return[_,H]}static get pluginName(){return"Underline"}}})(),(window.CKEditor5=window.CKEditor5||{}).basicStyles=n})(); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/af.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/af.js new file mode 100644 index 0000000..215cd7d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/af.js @@ -0,0 +1 @@ +!function(e){const t=e.af=e.af||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Vet","Bold text":"",Code:"Bronkode",Italic:"Kursief","Italic text":"","Move out of an inline code style":"",Strikethrough:"Deurstreep","Strikethrough text":"",Subscript:"Onderskrif",Superscript:"Boskrif",Underline:"Onderstreep","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js new file mode 100644 index 0000000..d8c9246 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ar.js @@ -0,0 +1 @@ +!function(t){const i=t.ar=t.ar||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"عريض","Bold text":"نص غامق",Code:"شفرة برمجية",Italic:"مائل","Italic text":"نص مائل","Move out of an inline code style":"ابتعدْ عن نمط التعليمات البرمجية المضمّنة",Strikethrough:"يتوسطه خط","Strikethrough text":"توسيط الخط في النص",Subscript:"حرف منخفض",Superscript:"حرف مرتفع",Underline:"تحته خط","Underline text":"تسطير النص"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js new file mode 100644 index 0000000..7ce37a3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ast.js @@ -0,0 +1 @@ +!function(t){const i=t.ast=t.ast||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Negrina","Bold text":"",Code:"",Italic:"Cursiva","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/az.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/az.js new file mode 100644 index 0000000..bc716f8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/az.js @@ -0,0 +1 @@ +!function(t){const i=t.az=t.az||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Yarıqalın","Bold text":"",Code:"Kod",Italic:"Maili","Italic text":"","Move out of an inline code style":"",Strikethrough:"Qaralanmış","Strikethrough text":"",Subscript:"Alt yazı",Superscript:"Üst yazı",Underline:"Altdan xətt","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js new file mode 100644 index 0000000..35decce --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bg.js @@ -0,0 +1 @@ +!function(t){const i=t.bg=t.bg||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Удебелен","Bold text":"Почернен текст",Code:"Код",Italic:"Курсив","Italic text":"Наклонен текст","Move out of an inline code style":"Излизане от подравнен стил на кодиране",Strikethrough:"Зачертаване","Strikethrough text":"Зачертан текст",Subscript:"Долен индекс",Superscript:"Горен индекс",Underline:"Подчертаване","Underline text":"Подчертан текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js new file mode 100644 index 0000000..38e18df --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bn.js @@ -0,0 +1 @@ +!function(t){const i=t.bn=t.bn||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"বোল্ড","Bold text":"বোল্ড টেক্সট",Code:"কোড",Italic:"ইটালিক","Italic text":"ইটালিক টেক্সট","Move out of an inline code style":"ইনলাইন কোড স্টাইল থেকে সরে আসুন",Strikethrough:"স্ট্রাইকথ্রু","Strikethrough text":"স্ট্রাইকথ্রু টেক্সট",Subscript:"সাবস্ক্রিপ্ট",Superscript:"সুপারস্ক্রিপ্ট",Underline:"আন্ডারলাইন","Underline text":"আন্ডারলাইন টেক্সট"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js new file mode 100644 index 0000000..45fc61d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/bs.js @@ -0,0 +1 @@ +!function(t){const o=t.bs=t.bs||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Podebljano","Bold text":"",Code:"Kod",Italic:"Zakrivljeno","Italic text":"","Move out of an inline code style":"",Strikethrough:"Precrtano","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"Podcrtano","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js new file mode 100644 index 0000000..e71a7c7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ca.js @@ -0,0 +1 @@ +!function(t){const e=t.ca=t.ca||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Negreta","Bold text":"Text en negreta",Code:"Codi",Italic:"Cursiva","Italic text":"Text en cursiva","Move out of an inline code style":"Surt d'un codi d'estil en línia",Strikethrough:"Marcat","Strikethrough text":"Barra el text",Subscript:"Subíndex",Superscript:"Superíndex",Underline:"Subrallat","Underline text":"Subratlla el text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js new file mode 100644 index 0000000..fbbb71d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/cs.js @@ -0,0 +1 @@ +!function(t){const n=t.cs=t.cs||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Tučné","Bold text":"Tučně",Code:"Kódový blok",Italic:"Kurzíva","Italic text":"Kurzíva","Move out of an inline code style":"Odejít ze stylu vloženého kódu",Strikethrough:"Přeškrtnuté","Strikethrough text":"Přešktnutí",Subscript:"Dolní index",Superscript:"Horní index",Underline:"Podtržené","Underline text":"Podtrhnutí"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/da.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/da.js new file mode 100644 index 0000000..9573429 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/da.js @@ -0,0 +1 @@ +!function(t){const e=t.da=t.da||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fed","Bold text":"Fed tekst",Code:"Kode",Italic:"Kursiv","Italic text":"Kursiv tekst","Move out of an inline code style":"Flyt ud af en inline-kodestil",Strikethrough:"Gennemstreg","Strikethrough text":"Gennemstreget tekst",Subscript:"Sænket skrift",Superscript:"Hævet skrift",Underline:"Understreget","Underline text":"Understreget tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js new file mode 100644 index 0000000..fd28fdc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de-ch.js @@ -0,0 +1 @@ +!function(t){const e=t["de-ch"]=t["de-ch"]||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fett","Bold text":"",Code:"Code",Italic:"Kursiv","Italic text":"","Move out of an inline code style":"",Strikethrough:"Durchgestrichen","Strikethrough text":"",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de.js new file mode 100644 index 0000000..e2f949b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/de.js @@ -0,0 +1 @@ +!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Fett","Bold text":"Fettschrift",Code:"Code",Italic:"Kursiv","Italic text":"Kursivschrift","Move out of an inline code style":"Inline Code Style verlassen",Strikethrough:"Durchgestrichen","Strikethrough text":"Durchgestrichener Text",Subscript:"Tiefgestellt",Superscript:"Hochgestellt",Underline:"Unterstrichen","Underline text":"Text hervorheben"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/el.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/el.js new file mode 100644 index 0000000..4e3ad31 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/el.js @@ -0,0 +1 @@ +!function(t){const e=t.el=t.el||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Έντονα","Bold text":"Έντονο κείμενο",Code:"Κώδικας",Italic:"Πλάγια","Italic text":"Πλάγιο κείμενο","Move out of an inline code style":"Μετακίνηση από ένα στυλ ενσωματωμένου κώδικα",Strikethrough:"Διακριτή διαγραφή","Strikethrough text":"Διακριτική διαγραφή κειμένου",Subscript:"Δείκτης",Superscript:"Εκθέτης",Underline:"Υπογράμμιση","Underline text":"Υπογράμμιση κειμένου"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js new file mode 100644 index 0000000..2e7a62e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-au.js @@ -0,0 +1 @@ +!function(t){const e=t["en-au"]=t["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Bold","Bold text":"",Code:"Code",Italic:"Italic","Italic text":"","Move out of an inline code style":"",Strikethrough:"Strikethrough","Strikethrough text":"",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js new file mode 100644 index 0000000..9768b83 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/en-gb.js @@ -0,0 +1 @@ +!function(t){const e=t["en-gb"]=t["en-gb"]||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Bold","Bold text":"",Code:"Code",Italic:"Italic","Italic text":"","Move out of an inline code style":"",Strikethrough:"Strikethrough","Strikethrough text":"",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js new file mode 100644 index 0000000..5d05c58 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eo.js @@ -0,0 +1 @@ +!function(t){const e=t.eo=t.eo||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"grasa","Bold text":"",Code:"",Italic:"kursiva","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js new file mode 100644 index 0000000..c8ea179 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es-co.js @@ -0,0 +1 @@ +!function(e){const t=e["es-co"]=e["es-co"]||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrita","Bold text":"",Code:"Código",Italic:"Cursiva","Italic text":"Texto en cursiva","Move out of an inline code style":"",Strikethrough:"Tachado","Strikethrough text":"",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subrayado","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es.js new file mode 100644 index 0000000..61efb48 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/es.js @@ -0,0 +1 @@ +!function(e){const t=e.es=e.es||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negrita","Bold text":"Texto en negrita",Code:"Código",Italic:"Cursiva","Italic text":"Texto en cursiva","Move out of an inline code style":"Sale de un estilo de código en línea",Strikethrough:"Tachado","Strikethrough text":"Tacha el texto",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subrayado","Underline text":"Subraya el texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/et.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/et.js new file mode 100644 index 0000000..7635483 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/et.js @@ -0,0 +1 @@ +!function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Rasvane","Bold text":"Paks tekst",Code:"Kood",Italic:"Kaldkiri","Italic text":"Kaldkirjas tekst","Move out of an inline code style":"Välju reasisese koodi stiilist",Strikethrough:"Läbijoonitud","Strikethrough text":"Läbikriipsutatud tekst",Subscript:"Alaindeks",Superscript:"Ülaindeks",Underline:"Allajoonitud","Underline text":"Allakriipsutatud tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js new file mode 100644 index 0000000..08499c2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/eu.js @@ -0,0 +1 @@ +!function(t){const e=t.eu=t.eu||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Lodia","Bold text":"",Code:"Kodea",Italic:"Etzana","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"Azpimarra","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js new file mode 100644 index 0000000..7634f72 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fa.js @@ -0,0 +1 @@ +!function(t){const i=t.fa=t.fa||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"درشت","Bold text":"",Code:"کد",Italic:"کج","Italic text":"","Move out of an inline code style":"",Strikethrough:"خط خورده","Strikethrough text":"",Subscript:"پایین نویس",Superscript:"بالانویس",Underline:"خط زیر","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js new file mode 100644 index 0000000..2f862b7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fi.js @@ -0,0 +1 @@ +!function(i){const t=i.fi=i.fi||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Lihavointi","Bold text":"Lihavoitu teksti",Code:"Koodi",Italic:"Kursivointi","Italic text":"Kursivoitu teksti","Move out of an inline code style":"Siirry pois rivinsisäisestä koodista",Strikethrough:"Yliviivaus","Strikethrough text":"Yliviivattu teksti",Subscript:"Alaindeksi",Superscript:"Yläindeksi",Underline:"Alleviivaus","Underline text":"Alleviivattu teksti"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js new file mode 100644 index 0000000..2fdc244 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/fr.js @@ -0,0 +1 @@ +!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Gras","Bold text":"Texte en gras",Code:"Code",Italic:"Italique","Italic text":"Texte en italique","Move out of an inline code style":"Sortir d'un style de code en ligne",Strikethrough:"Barré","Strikethrough text":"Texte barré",Subscript:"Indice",Superscript:"Exposant",Underline:"Souligné","Underline text":"Souligner le texte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js new file mode 100644 index 0000000..162448a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gl.js @@ -0,0 +1 @@ +!function(i){const t=i.gl=i.gl||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Negra","Bold text":"",Code:"Código",Italic:"Itálica","Italic text":"","Move out of an inline code style":"",Strikethrough:"Riscado","Strikethrough text":"",Subscript:"Subíndice",Superscript:"Superíndice",Underline:"Subliñado","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js new file mode 100644 index 0000000..d0f09f0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/gu.js @@ -0,0 +1 @@ +!function(t){const i=t.gu=t.gu||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"ઘાટુ - બોલ્ડ્","Bold text":"",Code:"",Italic:"ત્રાંસુ - ઇટલિક્","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"નીચે લિટી - અન્ડરલાઇન્","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/he.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/he.js new file mode 100644 index 0000000..763947d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/he.js @@ -0,0 +1 @@ +!function(t){const e=t.he=t.he||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"מודגש","Bold text":"טקסט מודגש",Code:"קוד",Italic:"נטוי","Italic text":"טקסט נטוי","Move out of an inline code style":"יציאה מסגנון קוד מוטבע",Strikethrough:"קו חוצה","Strikethrough text":"הוספת קו חוצה לטקסט",Subscript:"כתב תחתי",Superscript:"כתב עילי",Underline:"קו תחתון","Underline text":"הוספת קו תחתון לטקסט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js new file mode 100644 index 0000000..58a10b1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hi.js @@ -0,0 +1 @@ +!function(t){const i=t.hi=t.hi||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Bold","Bold text":"टेक्स्ट को बोल्ड करें",Code:"Code",Italic:"Italic","Italic text":"इटैलिक टेक्स्ट","Move out of an inline code style":"इनलाइन कोड स्टाइल के बाहर जाएँ",Strikethrough:"Strikethrough","Strikethrough text":"टेक्स्ट को स्ट्राइकथ्रू करें",Subscript:"Subscript",Superscript:"Superscript",Underline:"Underline","Underline text":"टेक्स्ट को अंडरलाइन करें"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js new file mode 100644 index 0000000..cfd42e4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hr.js @@ -0,0 +1 @@ +!function(t){const e=t.hr=t.hr||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Podebljano","Bold text":"",Code:"Kod",Italic:"Ukošeno","Italic text":"","Move out of an inline code style":"",Strikethrough:"Precrtano","Strikethrough text":"",Subscript:"Indeks",Superscript:"Eksponent",Underline:"Podcrtavanje","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js new file mode 100644 index 0000000..848ae16 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hu.js @@ -0,0 +1 @@ +!function(t){const e=t.hu=t.hu||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Félkövér","Bold text":"Félkövér szöveg",Code:"Forráskód",Italic:"Dőlt","Italic text":"Dőlt szöveg","Move out of an inline code style":"Kilépés egy soron belüli kódstílusból",Strikethrough:"Áthúzott","Strikethrough text":"Áthúzott szöveg",Subscript:"Alsó index",Superscript:"Felső index",Underline:"Aláhúzott","Underline text":"Aláhúzott szöveg"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hy.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hy.js new file mode 100644 index 0000000..8527290 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/hy.js @@ -0,0 +1 @@ +!function(t){const i=t.hy=t.hy||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Թավագիր","Bold text":"",Code:"Կոդ",Italic:"Շեղագիր","Italic text":"","Move out of an inline code style":"",Strikethrough:"Գծանշել","Strikethrough text":"",Subscript:"Ենթատեքստ",Superscript:"Գերագիր",Underline:"Ընդգծել","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/id.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/id.js new file mode 100644 index 0000000..76c534b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/id.js @@ -0,0 +1 @@ +!function(e){const i=e.id=e.id||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tebal","Bold text":"Teks tebal",Code:"Kode",Italic:"Miring","Italic text":"Teks miring","Move out of an inline code style":"Keluar dari gaya kode sebaris",Strikethrough:"Coret","Strikethrough text":"Teks yang dicoret",Subscript:"Subskrip",Superscript:"Superskrip",Underline:"Garis bawah","Underline text":"Teks bergaris bawah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/it.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/it.js new file mode 100644 index 0000000..28271c6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/it.js @@ -0,0 +1 @@ +!function(t){const o=t.it=t.it||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Grassetto","Bold text":"Testo in grassetto",Code:"Codice",Italic:"Corsivo","Italic text":"Testo in corsivo","Move out of an inline code style":"Esce da uno stile di codice in linea",Strikethrough:"Barrato","Strikethrough text":"Testo barrato",Subscript:"Pedice",Superscript:"Apice",Underline:"Sottolineato","Underline text":"Testo sottolineato"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js new file mode 100644 index 0000000..c7dfb4b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ja.js @@ -0,0 +1 @@ +!function(t){const i=t.ja=t.ja||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"ボールド","Bold text":"太字",Code:"コード",Italic:"イタリック","Italic text":"斜体","Move out of an inline code style":"インラインコードスタイルを終了する",Strikethrough:"取り消し線","Strikethrough text":"取り消し線",Subscript:"下付き文字",Superscript:"上付き文字",Underline:"アンダーライン","Underline text":"下線"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js new file mode 100644 index 0000000..87a101b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/jv.js @@ -0,0 +1 @@ +!function(t){const i=t.jv=t.jv||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Kandhel","Bold text":"",Code:"Kode",Italic:"Miring","Italic text":"","Move out of an inline code style":"",Strikethrough:"Seratan dicoret","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"Garis ngandhap","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/km.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/km.js new file mode 100644 index 0000000..2d25c53 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/km.js @@ -0,0 +1 @@ +!function(t){const i=t.km=t.km||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"ដិត","Bold text":"",Code:"កូដ",Italic:"ទ្រេត","Italic text":"","Move out of an inline code style":"",Strikethrough:"ឆូតកណ្ដាល","Strikethrough text":"",Subscript:"អក្សរ​តូចក្រោម",Superscript:"អក្សរ​តូចលើ",Underline:"គូស​បន្ទាត់​ក្រោម","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js new file mode 100644 index 0000000..4401ecb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/kn.js @@ -0,0 +1 @@ +!function(t){const i=t.kn=t.kn||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"‍‍ದಪ್ಪ","Bold text":"",Code:"",Italic:"‍ಇಟಾಲಿಕ್","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js new file mode 100644 index 0000000..8233608 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ko.js @@ -0,0 +1 @@ +!function(t){const i=t.ko=t.ko||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"굵게","Bold text":"굵은 텍스트",Code:"코드",Italic:"기울임꼴","Italic text":"기울인 텍스트","Move out of an inline code style":"인라인 코드 스타일 밖으로 이동",Strikethrough:"취소선","Strikethrough text":"텍스트 취소선",Subscript:"아래 첨자",Superscript:"위 첨자",Underline:"밑줄","Underline text":"텍스트 밑줄"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js new file mode 100644 index 0000000..8f3dff1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ku.js @@ -0,0 +1 @@ +!function(t){const i=t.ku=t.ku||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"قەڵەو","Bold text":"",Code:"کۆد",Italic:"لار","Italic text":"","Move out of an inline code style":"",Strikethrough:"هێڵ بەسەرداهاتوو","Strikethrough text":"",Subscript:"ژێرنووس",Superscript:"سەرنووس",Underline:"ژێرهێڵ","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js new file mode 100644 index 0000000..c8709ad --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lt.js @@ -0,0 +1 @@ +!function(t){const i=t.lt=t.lt||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Paryškintas","Bold text":"Pajuodinti tekstą",Code:"Kodas",Italic:"Kursyvas","Italic text":"Rašyti tekstą kursyvu","Move out of an inline code style":"Perėjimas iš įterptojo kodo stiliaus",Strikethrough:"Perbrauktas","Strikethrough text":"Perbraukti tekstą",Subscript:"Žemiau",Superscript:"Aukščiau",Underline:"Pabrauktas","Underline text":"Pabraukti tekstą"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js new file mode 100644 index 0000000..7bee2d6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/lv.js @@ -0,0 +1 @@ +!function(t){const s=t.lv=t.lv||{};s.dictionary=Object.assign(s.dictionary||{},{Bold:"Trekns","Bold text":"Teksts treknrakstā",Code:"Kods",Italic:"Kursīvs","Italic text":"Teksts slīprakstā","Move out of an inline code style":"Iziet no iekļautā koda stila",Strikethrough:"Nosvītrots","Strikethrough text":"Pārsvītrot teksts",Subscript:"Apakšraksts",Superscript:"Augšraksts",Underline:"Pasvītrots","Underline text":"Pasvītrot tekstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js new file mode 100644 index 0000000..d686720 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ms.js @@ -0,0 +1 @@ +!function(e){const i=e.ms=e.ms||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Tebal","Bold text":"Teks tebal",Code:"Kod",Italic:"Italik","Italic text":"Teks huruf condong","Move out of an inline code style":"Alih keluar daripada gaya kod sebaris",Strikethrough:"Garis lorek","Strikethrough text":"Teks coretan",Subscript:"Subskrip",Superscript:"Superskrip",Underline:"Garis bawah","Underline text":"Teks garis bawah"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js new file mode 100644 index 0000000..e216f1a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nb.js @@ -0,0 +1 @@ +!function(t){const e=t.nb=t.nb||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fet","Bold text":"",Code:"Kode",Italic:"Kursiv","Italic text":"","Move out of an inline code style":"",Strikethrough:"Gjennomstreking","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"Understreking","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js new file mode 100644 index 0000000..c907d17 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ne.js @@ -0,0 +1 @@ +!function(t){const e=t.ne=t.ne||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"बोल्ड","Bold text":"",Code:"कोड",Italic:"इटालिक","Italic text":"","Move out of an inline code style":"",Strikethrough:"स्ट्राइकथ्रू","Strikethrough text":"",Subscript:"सबस्क्रिप्ट",Superscript:"सुपरस्क्रिप्ट",Underline:"रेखांकन","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js new file mode 100644 index 0000000..bae50b7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/nl.js @@ -0,0 +1 @@ +!function(e){const t=e.nl=e.nl||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Vet","Bold text":"Vetgedrukte tekst",Code:"Code",Italic:"Cursief","Italic text":"Cursieve tekst","Move out of an inline code style":"Uit een stijl voor code op één regel gaan",Strikethrough:"Doorhalen","Strikethrough text":"Doorgehaalde tekst",Subscript:"Subscript",Superscript:"Superscript",Underline:"Onderlijnen","Underline text":"Onderstreepte tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/no.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/no.js new file mode 100644 index 0000000..37f6152 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/no.js @@ -0,0 +1 @@ +!function(t){const e=t.no=t.no||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fet","Bold text":"Uthevet tekst",Code:"Kode",Italic:"Kursiv","Italic text":"Kursiv tekst","Move out of an inline code style":"Gå ut av en intern kodestil",Strikethrough:"Gjennomstreket","Strikethrough text":"Gjennomstreket tekst",Subscript:"Senket skrift",Superscript:"Hevet skrift",Underline:"Understreket","Underline text":"Understreket tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js new file mode 100644 index 0000000..74c87f4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/oc.js @@ -0,0 +1 @@ +!function(t){const i=t.oc=t.oc||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Gras","Bold text":"",Code:"",Italic:"Italica","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js new file mode 100644 index 0000000..2bf78fb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pl.js @@ -0,0 +1 @@ +!function(e){const t=e.pl=e.pl||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Pogrubienie","Bold text":"Pogrubia tekst",Code:"Kod",Italic:"Kursywa","Italic text":"Zmienia tekst na kursywę","Move out of an inline code style":"Przenosi zaznaczenie poza styl kodu inline",Strikethrough:"Przekreślenie","Strikethrough text":"Przekreśla tekst",Subscript:"Indeks dolny",Superscript:"Indeks górny",Underline:"Podkreślenie","Underline text":"Podkreśla tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js new file mode 100644 index 0000000..6eba982 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt-br.js @@ -0,0 +1 @@ +!function(t){const i=t["pt-br"]=t["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Negrito","Bold text":"Texto em negrito",Code:"Código",Italic:"Itálico","Italic text":"Texto em itálico","Move out of an inline code style":"Sair de um estilo de código inline",Strikethrough:"Tachado","Strikethrough text":"Texto com riscado",Subscript:"Subscrito",Superscript:"Sobrescrito",Underline:"Sublinhado","Underline text":"Texto sublinhado"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js new file mode 100644 index 0000000..e92ee1e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/pt.js @@ -0,0 +1 @@ +!function(t){const i=t.pt=t.pt||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Negrito","Bold text":"Texto em negrito",Code:"Código",Italic:"Itálico","Italic text":"Texto em itálico","Move out of an inline code style":"Sair de um estilo de código inline",Strikethrough:"Rasurar","Strikethrough text":"Texto rasurado",Subscript:"Subscrito",Superscript:"Sobrescrito",Underline:"Sublinhado","Underline text":"Sublinhar texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js new file mode 100644 index 0000000..6b30521 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ro.js @@ -0,0 +1 @@ +!function(t){const i=t.ro=t.ro||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Îngroșat","Bold text":"Text bold",Code:"Cod",Italic:"Cursiv","Italic text":"Text cursiv","Move out of an inline code style":"Ieșirea dintr-un stil de cod inline",Strikethrough:"Tăiere text cu o linie","Strikethrough text":"Text barat",Subscript:"Indice",Superscript:"Exponent",Underline:"Subliniat","Underline text":"Text subliniat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js new file mode 100644 index 0000000..a25caed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ru.js @@ -0,0 +1 @@ +!function(t){const i=t.ru=t.ru||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Жирный","Bold text":"Жирный текст",Code:"Исходный код",Italic:"Курсив","Italic text":"Текст курсивом","Move out of an inline code style":"Выйти из встроенного стиля кода",Strikethrough:"Зачеркнутый","Strikethrough text":"Зачеркнутый текст",Subscript:"Подстрочный",Superscript:"Надстрочный",Underline:"Подчеркнутый","Underline text":"Подчеркнутый текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/si.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/si.js new file mode 100644 index 0000000..5e82b97 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/si.js @@ -0,0 +1 @@ +!function(t){const i=t.si=t.si||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"තදකුරු","Bold text":"",Code:"",Italic:"ඇලකුරු","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js new file mode 100644 index 0000000..2be1e52 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sk.js @@ -0,0 +1 @@ +!function(t){const n=t.sk=t.sk||{};n.dictionary=Object.assign(n.dictionary||{},{Bold:"Tučné","Bold text":"Tučný text",Code:"Kód",Italic:"Kurzíva","Italic text":"Kurzíva","Move out of an inline code style":"Presunúť mimo vloženého kódu",Strikethrough:"Preškrtnuté","Strikethrough text":"Prečiarknutý text",Subscript:"Dolný index",Superscript:"Horný index",Underline:"Podčiarknuté","Underline text":"Podčiarknutý text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js new file mode 100644 index 0000000..3952040 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sl.js @@ -0,0 +1 @@ +!function(t){const o=t.sl=t.sl||{};o.dictionary=Object.assign(o.dictionary||{},{Bold:"Krepko","Bold text":"",Code:"Koda",Italic:"Poševno","Italic text":"","Move out of an inline code style":"",Strikethrough:"Prečrtano","Strikethrough text":"",Subscript:"Naročnik",Superscript:"Nadpis",Underline:"Podčrtaj","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js new file mode 100644 index 0000000..8c236cf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sq.js @@ -0,0 +1 @@ +!function(t){const i=t.sq=t.sq||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Trash","Bold text":"",Code:"Kod",Italic:"Pjerrtë","Italic text":"","Move out of an inline code style":"",Strikethrough:"Vi në mes","Strikethrough text":"",Subscript:"Abonohu",Superscript:"Mbishkrim",Underline:"Nënvizuar","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js new file mode 100644 index 0000000..a7d1095 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr-latn.js @@ -0,0 +1 @@ +!function(t){const e=t["sr-latn"]=t["sr-latn"]||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Podebljano","Bold text":"",Code:"Kod",Italic:"Kurziv","Italic text":"","Move out of an inline code style":"",Strikethrough:"Precrtan","Strikethrough text":"",Subscript:"Index dole",Superscript:"Index gore",Underline:"Podvučen","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js new file mode 100644 index 0000000..f22f3bd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sr.js @@ -0,0 +1 @@ +!function(t){const e=t.sr=t.sr||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Подебљано","Bold text":"Podebljan tekst",Code:"Код",Italic:"Курзив","Italic text":"Tekst u kurzivu","Move out of an inline code style":"Izađi iz inline stila",Strikethrough:"Прецртан","Strikethrough text":"Precrtan tekst",Subscript:"Индекс доле",Superscript:"Индекс горе",Underline:"Подвучен","Underline text":"Podvučen tekst"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js new file mode 100644 index 0000000..461782a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/sv.js @@ -0,0 +1 @@ +!function(t){const e=t.sv=t.sv||{};e.dictionary=Object.assign(e.dictionary||{},{Bold:"Fet","Bold text":"Fetstil",Code:"Kod",Italic:"Kursiv","Italic text":"Kursiv stil","Move out of an inline code style":"Flytta bort från inlinekodens stil",Strikethrough:"Genomstruken","Strikethrough text":"Genomstruken text",Subscript:"Nedsänkta tecken",Superscript:"Upphöjda tecken",Underline:"Understrykning","Underline text":"Understruken text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/th.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/th.js new file mode 100644 index 0000000..e591c7b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/th.js @@ -0,0 +1 @@ +!function(t){const i=t.th=t.th||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"ตัวหนา","Bold text":"ทำข้อความเป็นตัวหนา",Code:"โค้ด",Italic:"ตัวเอียง","Italic text":"ข้อความเอียง","Move out of an inline code style":"ย้ายออกจากสไตล์โค้ดแบบอินไลน์",Strikethrough:"ขีดทับ","Strikethrough text":"ขีดทับข้อความ",Subscript:"ตัวห้อย",Superscript:"ตัวยก",Underline:"ขีดเส้นใต้","Underline text":"ขีดเส้นใต้ข้อความ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js new file mode 100644 index 0000000..c27da9f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tk.js @@ -0,0 +1 @@ +!function(t){const i=t.tk=t.tk||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Galyň","Bold text":"",Code:"Kod",Italic:"Italik","Italic text":"","Move out of an inline code style":"",Strikethrough:"Üsti çyzykly","Strikethrough text":"",Subscript:"Aşaky ýazgy",Superscript:"Üst ýazgy",Underline:"Aşagy çyzykly","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js new file mode 100644 index 0000000..e62e4ee --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tr.js @@ -0,0 +1 @@ +!function(t){const i=t.tr=t.tr||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Kalın","Bold text":"Kalın yazı",Code:"Kod",Italic:"İtalik","Italic text":"İtalik metin","Move out of an inline code style":"Satır içi kod stilinden çık",Strikethrough:"Üstü çizili","Strikethrough text":"Metnin üstünü çiz",Subscript:"Alt Simge",Superscript:"Üst Simge",Underline:"Altı Çizgili","Underline text":"Metnin altını çiz"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js new file mode 100644 index 0000000..3da6dfe --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/tt.js @@ -0,0 +1 @@ +!function(t){const i=t.tt=t.tt||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Калын","Bold text":"",Code:"Код",Italic:"","Italic text":"","Move out of an inline code style":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"",Underline:"","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js new file mode 100644 index 0000000..e45d1f3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ug.js @@ -0,0 +1 @@ +!function(t){const i=t.ug=t.ug||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"توم","Bold text":"",Code:"كود",Italic:"يانتۇ","Italic text":"","Move out of an inline code style":"",Strikethrough:"ئۆچۈرۈش سىزىقى","Strikethrough text":"",Subscript:"ئاستبەلگە",Superscript:"ئۈستبەلگە",Underline:"ئاستى سىزىق","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js new file mode 100644 index 0000000..30c0c65 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uk.js @@ -0,0 +1 @@ +!function(t){const i=t.uk=t.uk||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Жирний","Bold text":"Жирний шрифт",Code:"Код",Italic:"Курсив","Italic text":"Курсив","Move out of an inline code style":"Вийти зі стилю вбудованого коду",Strikethrough:"Закреслений","Strikethrough text":"Закреслений",Subscript:"Нижній індекс",Superscript:"Верхній індекс",Underline:"Підкреслений","Underline text":"Підкреслений"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js new file mode 100644 index 0000000..a2b4860 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/ur.js @@ -0,0 +1 @@ +!function(t){const i=t.ur=t.ur||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"جلّی","Bold text":"",Code:"کوڈ",Italic:"ترچھا","Italic text":"","Move out of an inline code style":"",Strikethrough:"خط کشیدہ","Strikethrough text":"",Subscript:"زير نوشت",Superscript:"بالا نوشت",Underline:"ترچھا","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js new file mode 100644 index 0000000..52532a2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/uz.js @@ -0,0 +1 @@ +!function(i){const t=i.uz=i.uz||{};t.dictionary=Object.assign(t.dictionary||{},{Bold:"Qalin","Bold text":"",Code:"Manba kodi",Italic:"Kursiv","Italic text":"","Move out of an inline code style":"",Strikethrough:"Chizilgan","Strikethrough text":"",Subscript:"Pastki yozuv",Superscript:"Yuqori yozuv",Underline:"Tagi chizilgan","Underline text":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js new file mode 100644 index 0000000..1a7c381 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/vi.js @@ -0,0 +1 @@ +!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"Đậm","Bold text":"In đậm chữ",Code:"Code",Italic:"Nghiêng","Italic text":"In nghiêng chữ","Move out of an inline code style":"Thoát khỏi kiểu mã nội dòng",Strikethrough:"Gạch ngang","Strikethrough text":"Gạch ngang chữ",Subscript:"Chữ nhỏ dưới",Superscript:"Chữ nhỏ trên",Underline:"Gạch dưới","Underline text":"Gạch chân chữ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js new file mode 100644 index 0000000..3e4c71d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh-cn.js @@ -0,0 +1 @@ +!function(t){const i=t["zh-cn"]=t["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"加粗","Bold text":"加粗字体",Code:"代码",Italic:"倾斜","Italic text":"斜体文本","Move out of an inline code style":"摆脱内联代码风格",Strikethrough:"删除线","Strikethrough text":"给文本添加删除线",Subscript:"下标",Superscript:"上标",Underline:"下划线","Underline text":"给文本添加下划线"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js new file mode 100644 index 0000000..2595245 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/build/translations/zh.js @@ -0,0 +1 @@ +!function(t){const i=t.zh=t.zh||{};i.dictionary=Object.assign(i.dictionary||{},{Bold:"粗體","Bold text":"粗體文字",Code:"代碼",Italic:"斜體","Italic text":"斜體文字","Move out of an inline code style":"移出行內程式碼樣式",Strikethrough:"刪除線","Strikethrough text":"刪除線文字",Subscript:"下標",Superscript:"上標",Underline:"底線","Underline text":"底線文字"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json new file mode 100644 index 0000000..91308e7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/ckeditor5-metadata.json @@ -0,0 +1,137 @@ +{ + "plugins": [ + { + "name": "Bold", + "className": "Bold", + "description": "Implements bold formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/bold.js", + "uiComponents": [ + { + "type": "Button", + "name": "bold", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/bold.svg" + } + ], + "htmlOutput": [ + { + "elements": "strong" + } + ] + }, + { + "name": "Code", + "className": "Code", + "description": "Implements inline code formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/code.js", + "uiComponents": [ + { + "type": "Button", + "name": "code", + "iconPath": "theme/icons/code.svg" + } + ], + "htmlOutput": [ + { + "elements": "code" + } + ] + }, + { + "name": "Italic", + "className": "Italic", + "description": "Implements italic formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/italic.js", + "uiComponents": [ + { + "type": "Button", + "name": "italic", + "iconPath": "theme/icons/italic.svg" + } + ], + "htmlOutput": [ + { + "elements": "i" + } + ] + }, + { + "name": "Strikethrough", + "className": "Strikethrough", + "description": "Implements strikethrough formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/strikethrough.js", + "uiComponents": [ + { + "type": "Button", + "name": "strikethrough", + "iconPath": "theme/icons/strikethrough.svg" + } + ], + "htmlOutput": [ + { + "elements": "s" + } + ] + }, + { + "name": "Subscript", + "className": "Subscript", + "description": "Implements subscript formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/subscript.js", + "uiComponents": [ + { + "type": "Button", + "name": "subscript", + "iconPath": "theme/icons/subscript.svg" + } + ], + "htmlOutput": [ + { + "elements": "sub" + } + ] + }, + { + "name": "Superscript", + "className": "Superscript", + "description": "Implements superscript formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/superscript.js", + "uiComponents": [ + { + "type": "Button", + "name": "superscript", + "iconPath": "theme/icons/superscript.svg" + } + ], + "htmlOutput": [ + { + "elements": "sup" + } + ] + }, + { + "name": "Underline", + "className": "Underline", + "description": "Implements underline formatting support. It is a part of the basic text styles package.", + "docs": "features/basic-styles.html", + "path": "src/underline.js", + "uiComponents": [ + { + "type": "Button", + "name": "underline", + "iconPath": "theme/icons/underline.svg" + } + ], + "htmlOutput": [ + { + "elements": "u" + } + ] + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/contexts.json b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/contexts.json new file mode 100644 index 0000000..581582c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/contexts.json @@ -0,0 +1,14 @@ +{ + "Bold": "Toolbar button tooltip for the Bold feature.", + "Italic": "Toolbar button tooltip for the Italic feature.", + "Underline": "Toolbar button tooltip for the Underline feature.", + "Code": "Toolbar button tooltip for the Code feature.", + "Strikethrough": "Toolbar button tooltip for the Strikethrough feature.", + "Subscript": "Toolbar button tooltip for the Subscript feature.", + "Superscript": "Toolbar button tooltip for the Superscript feature.", + "Italic text": "Keystroke description for assistive technologies: keystroke for making text italic.", + "Move out of an inline code style": "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style.", + "Bold text": "Keystroke description for assistive technologies: keystroke for making text bold.", + "Underline text": "Keystroke description for assistive technologies: keystroke for making text underlined.", + "Strikethrough text": "Keystroke description for assistive technologies: keystroke for making text strikethrough." +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po new file mode 100644 index 0000000..b688c17 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/af.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://app.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Vet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursief" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Onderstreep" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Bronkode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Deurstreep" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Onderskrif" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Boskrif" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po new file mode 100644 index 0000000..bc8473d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ar.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "عريض" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "مائل" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "تحته خط" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "شفرة برمجية" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "يتوسطه خط" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "حرف منخفض" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "حرف مرتفع" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "نص مائل" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "ابتعدْ عن نمط التعليمات البرمجية المضمّنة" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "نص غامق" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "تسطير النص" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "توسيط الخط في النص" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po new file mode 100644 index 0000000..bb87fc3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ast.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Asturian (https://app.transifex.com/ckeditor/teams/11143/ast/)\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrina" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po new file mode 100644 index 0000000..e478b3d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/az.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Yarıqalın" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Maili" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Altdan xətt" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Qaralanmış" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alt yazı" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Üst yazı" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po new file mode 100644 index 0000000..b7aa378 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bg.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Удебелен" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курсив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Подчертаване" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Зачертаване" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Долен индекс" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Горен индекс" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Наклонен текст" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Излизане от подравнен стил на кодиране" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Почернен текст" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Подчертан текст" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Зачертан текст" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po new file mode 100644 index 0000000..100604f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bn.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "বোল্ড" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ইটালিক" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "আন্ডারলাইন" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "কোড" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "স্ট্রাইকথ্রু" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "সাবস্ক্রিপ্ট" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "সুপারস্ক্রিপ্ট" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "ইটালিক টেক্সট" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "ইনলাইন কোড স্টাইল থেকে সরে আসুন" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "বোল্ড টেক্সট" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "আন্ডারলাইন টেক্সট" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "স্ট্রাইকথ্রু টেক্সট" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po new file mode 100644 index 0000000..b725395 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/bs.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://app.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Podebljano" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Zakrivljeno" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podcrtano" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Precrtano" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po new file mode 100644 index 0000000..3912d4e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ca.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negreta" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subrallat" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Codi" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Marcat" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndex" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndex" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Text en cursiva" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Surt d'un codi d'estil en línia" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Text en negreta" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Subratlla el text" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Barra el text" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po new file mode 100644 index 0000000..d50392a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/cs.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tučné" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kurzíva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podtržené" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kódový blok" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Přeškrtnuté" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Dolní index" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Horní index" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kurzíva" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Odejít ze stylu vloženého kódu" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Tučně" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Podtrhnutí" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Přešktnutí" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po new file mode 100644 index 0000000..5e9c196 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/da.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fed" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understreget" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gennemstreg" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Sænket skrift" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hævet skrift" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kursiv tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Flyt ud af en inline-kodestil" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Fed tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Understreget tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Gennemstreget tekst" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po new file mode 100644 index 0000000..e0ed0b3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de-ch.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fett" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Unterstrichen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Durchgestrichen" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Tiefgestellt" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hochgestellt" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po new file mode 100644 index 0000000..29f176c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/de.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fett" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Unterstrichen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Durchgestrichen" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Tiefgestellt" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hochgestellt" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kursivschrift" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Inline Code Style verlassen" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Fettschrift" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Text hervorheben" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Durchgestrichener Text" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po new file mode 100644 index 0000000..09a5f18 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/el.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Έντονα" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Πλάγια" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Υπογράμμιση" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Κώδικας" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Διακριτή διαγραφή" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Δείκτης" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Εκθέτης" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Πλάγιο κείμενο" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Μετακίνηση από ένα στυλ ενσωματωμένου κώδικα" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Έντονο κείμενο" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Υπογράμμιση κειμένου" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Διακριτική διαγραφή κειμένου" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po new file mode 100644 index 0000000..11af4bc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-au.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po new file mode 100644 index 0000000..ba9a858 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en-gb.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po new file mode 100644 index 0000000..1fc08c4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/en.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Italic text" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Move out of an inline code style" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Bold text" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Underline text" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Strikethrough text" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po new file mode 100644 index 0000000..f4e7082 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eo.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Esperanto (https://app.transifex.com/ckeditor/teams/11143/eo/)\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "grasa" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "kursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po new file mode 100644 index 0000000..8ac0449 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es-co.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrita" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subrayado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tachado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndice" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Texto en cursiva" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po new file mode 100644 index 0000000..155b264 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/es.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrita" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subrayado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tachado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndice" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Texto en cursiva" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Sale de un estilo de código en línea" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Texto en negrita" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Subraya el texto" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Tacha el texto" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po new file mode 100644 index 0000000..95f1fe0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/et.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Rasvane" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kaldkiri" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Allajoonitud" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kood" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Läbijoonitud" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alaindeks" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Ülaindeks" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kaldkirjas tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Välju reasisese koodi stiilist" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Paks tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Allakriipsutatud tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Läbikriipsutatud tekst" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po new file mode 100644 index 0000000..54a71e8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/eu.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://app.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Lodia" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Etzana" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Azpimarra" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kodea" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po new file mode 100644 index 0000000..ada5120 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fa.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "درشت" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "کج" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "خط زیر" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "کد" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "خط خورده" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "پایین نویس" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "بالانویس" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po new file mode 100644 index 0000000..dbf4bf8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fi.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Lihavointi" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursivointi" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Alleviivaus" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Koodi" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Yliviivaus" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alaindeksi" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Yläindeksi" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kursivoitu teksti" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Siirry pois rivinsisäisestä koodista" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Lihavoitu teksti" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Alleviivattu teksti" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Yliviivattu teksti" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po new file mode 100644 index 0000000..620fc29 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/fr.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Gras" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italique" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Souligné" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Barré" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Exposant" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Texte en italique" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Sortir d'un style de code en ligne" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Texte en gras" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Souligner le texte" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Texte barré" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po new file mode 100644 index 0000000..3a128ab --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gl.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negra" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Itálica" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subliñado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Riscado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subíndice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superíndice" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po new file mode 100644 index 0000000..ac6ca24 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/gu.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Gujarati (https://app.transifex.com/ckeditor/teams/11143/gu/)\n" +"Language: gu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ઘાટુ - બોલ્ડ્" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ત્રાંસુ - ઇટલિક્" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "નીચે લિટી - અન્ડરલાઇન્" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po new file mode 100644 index 0000000..58e338c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/he.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "מודגש" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "נטוי" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "קו תחתון" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "קוד" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "קו חוצה" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "כתב תחתי" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "כתב עילי" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "טקסט נטוי" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "יציאה מסגנון קוד מוטבע" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "טקסט מודגש" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "הוספת קו תחתון לטקסט" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "הוספת קו חוצה לטקסט" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po new file mode 100644 index 0000000..afb3a03 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hi.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Bold" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italic" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Underline" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Strikethrough" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "इटैलिक टेक्स्ट" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "इनलाइन कोड स्टाइल के बाहर जाएँ" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "टेक्स्ट को बोल्ड करें" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "टेक्स्ट को अंडरलाइन करें" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "टेक्स्ट को स्ट्राइकथ्रू करें" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po new file mode 100644 index 0000000..a91393a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hr.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Podebljano" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Ukošeno" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podcrtavanje" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Precrtano" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indeks" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Eksponent" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po new file mode 100644 index 0000000..2a3b978 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hu.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Félkövér" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Dőlt" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Aláhúzott" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Forráskód" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Áthúzott" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alsó index" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Felső index" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Dőlt szöveg" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Kilépés egy soron belüli kódstílusból" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Félkövér szöveg" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Aláhúzott szöveg" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Áthúzott szöveg" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hy.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hy.po new file mode 100644 index 0000000..01d8aa1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/hy.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Armenian (https://app.transifex.com/ckeditor/teams/11143/hy/)\n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Թավագիր" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Շեղագիր" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Ընդգծել" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Կոդ" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Գծանշել" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Ենթատեքստ" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Գերագիր" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po new file mode 100644 index 0000000..4447d1a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/id.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tebal" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Miring" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Garis bawah" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Coret" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subskrip" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superskrip" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Teks miring" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Keluar dari gaya kode sebaris" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Teks tebal" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Teks bergaris bawah" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Teks yang dicoret" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po new file mode 100644 index 0000000..5da3456 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/it.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Grassetto" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Corsivo" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Sottolineato" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Codice" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Barrato" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Pedice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Apice" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Testo in corsivo" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Esce da uno stile di codice in linea" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Testo in grassetto" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Testo sottolineato" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Testo barrato" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po new file mode 100644 index 0000000..5eba76a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ja.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ボールド" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "イタリック" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "アンダーライン" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "コード" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "取り消し線" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "下付き文字" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "上付き文字" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "斜体" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "インラインコードスタイルを終了する" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "太字" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "下線" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "取り消し線" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po new file mode 100644 index 0000000..ea3a97e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/jv.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Javanese (https://app.transifex.com/ckeditor/teams/11143/jv/)\n" +"Language: jv\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Kandhel" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Miring" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Garis ngandhap" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Seratan dicoret" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po new file mode 100644 index 0000000..7835f5c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/km.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://app.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ដិត" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ទ្រេត" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "គូស​បន្ទាត់​ក្រោម" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "កូដ" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "ឆូតកណ្ដាល" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "អក្សរ​តូចក្រោម" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "អក្សរ​តូចលើ" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po new file mode 100644 index 0000000..4786b5c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/kn.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://app.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "‍‍ದಪ್ಪ" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "‍ಇಟಾಲಿಕ್" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po new file mode 100644 index 0000000..c23055c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ko.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "굵게" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "기울임꼴" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "밑줄" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "코드" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "취소선" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "아래 첨자" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "위 첨자" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "기울인 텍스트" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "인라인 코드 스타일 밖으로 이동" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "굵은 텍스트" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "텍스트 밑줄" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "텍스트 취소선" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po new file mode 100644 index 0000000..ecf03db --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ku.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "قەڵەو" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "لار" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ژێرهێڵ" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "کۆد" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "هێڵ بەسەرداهاتوو" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "ژێرنووس" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "سەرنووس" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po new file mode 100644 index 0000000..8bcf010 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lt.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Paryškintas" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursyvas" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Pabrauktas" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kodas" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Perbrauktas" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Žemiau" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Aukščiau" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Rašyti tekstą kursyvu" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Perėjimas iš įterptojo kodo stiliaus" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Pajuodinti tekstą" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Pabraukti tekstą" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Perbraukti tekstą" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po new file mode 100644 index 0000000..87934df --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/lv.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Trekns" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursīvs" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Pasvītrots" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kods" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Nosvītrots" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Apakšraksts" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Augšraksts" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Teksts slīprakstā" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Iziet no iekļautā koda stila" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Teksts treknrakstā" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Pasvītrot tekstu" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Pārsvītrot teksts" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po new file mode 100644 index 0000000..985483f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ms.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tebal" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italik" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Garis bawah" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Garis lorek" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subskrip" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superskrip" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Teks huruf condong" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Alih keluar daripada gaya kod sebaris" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Teks tebal" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Teks garis bawah" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Teks coretan" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po new file mode 100644 index 0000000..5c8904b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nb.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understreking" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gjennomstreking" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po new file mode 100644 index 0000000..ce38ada --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ne.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "बोल्ड" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "इटालिक" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "रेखांकन" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "कोड" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "स्ट्राइकथ्रू" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "सबस्क्रिप्ट" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "सुपरस्क्रिप्ट" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po new file mode 100644 index 0000000..90bd768 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/nl.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Vet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursief" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Onderlijnen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Doorhalen" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscript" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Superscript" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Cursieve tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Uit een stijl voor code op één regel gaan" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Vetgedrukte tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Onderstreepte tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Doorgehaalde tekst" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po new file mode 100644 index 0000000..ad9718d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/no.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understreket" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kode" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gjennomstreket" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Senket skrift" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Hevet skrift" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kursiv tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Gå ut av en intern kodestil" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Uthevet tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Understreket tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Gjennomstreket tekst" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po new file mode 100644 index 0000000..e2d81e3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/oc.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Occitan (post 1500) (https://app.transifex.com/ckeditor/teams/11143/oc/)\n" +"Language: oc\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Gras" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italica" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po new file mode 100644 index 0000000..fbb50f5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pl.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Pogrubienie" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursywa" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podkreślenie" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Przekreślenie" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indeks dolny" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Indeks górny" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Zmienia tekst na kursywę" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Przenosi zaznaczenie poza styl kodu inline" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Pogrubia tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Podkreśla tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Przekreśla tekst" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po new file mode 100644 index 0000000..2bc5a91 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt-br.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrito" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Itálico" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Sublinhado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tachado" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscrito" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Sobrescrito" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Texto em itálico" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Sair de um estilo de código inline" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Texto em negrito" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Texto sublinhado" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Texto com riscado" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po new file mode 100644 index 0000000..d09d61e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/pt.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Negrito" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Itálico" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Sublinhado" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Código" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Rasurar" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Subscrito" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Sobrescrito" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Texto em itálico" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Sair de um estilo de código inline" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Texto em negrito" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Sublinhar texto" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Texto rasurado" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po new file mode 100644 index 0000000..3737f99 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ro.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Îngroșat" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Cursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Subliniat" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Cod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Tăiere text cu o linie" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Indice" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Exponent" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Text cursiv" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Ieșirea dintr-un stil de cod inline" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Text bold" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Text subliniat" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Text barat" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po new file mode 100644 index 0000000..1312664 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ru.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Жирный" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курсив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Подчеркнутый" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Исходный код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Зачеркнутый" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Подстрочный" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Надстрочный" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Текст курсивом" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Выйти из встроенного стиля кода" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Жирный текст" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Подчеркнутый текст" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Зачеркнутый текст" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po new file mode 100644 index 0000000..088a694 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/si.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Sinhala (Sri Lanka) (https://app.transifex.com/ckeditor/teams/11143/si_LK/)\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "තදකුරු" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ඇලකුරු" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po new file mode 100644 index 0000000..7c4b1d5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sk.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Tučné" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kurzíva" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podčiarknuté" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kód" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Preškrtnuté" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Dolný index" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Horný index" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kurzíva" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Presunúť mimo vloženého kódu" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Tučný text" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Podčiarknutý text" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Prečiarknutý text" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po new file mode 100644 index 0000000..084fea9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sl.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://app.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Krepko" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Poševno" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podčrtaj" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Koda" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Prečrtano" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Naročnik" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Nadpis" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po new file mode 100644 index 0000000..3a3d3a0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sq.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Trash" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Pjerrtë" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Nënvizuar" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Vi në mes" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Abonohu" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Mbishkrim" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po new file mode 100644 index 0000000..fe190aa --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr-latn.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Podebljano" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kurziv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Podvučen" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Precrtan" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Index dole" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Index gore" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po new file mode 100644 index 0000000..d915620 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sr.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Подебљано" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курзив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Подвучен" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Прецртан" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Индекс доле" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Индекс горе" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Tekst u kurzivu" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Izađi iz inline stila" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Podebljan tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Podvučen tekst" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Precrtan tekst" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po new file mode 100644 index 0000000..8118746 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/sv.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Fet" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Understrykning" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Genomstruken" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Nedsänkta tecken" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Upphöjda tecken" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Kursiv stil" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Flytta bort från inlinekodens stil" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Fetstil" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Understruken text" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Genomstruken text" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po new file mode 100644 index 0000000..08ee16d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/th.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "ตัวหนา" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ตัวเอียง" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ขีดเส้นใต้" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "โค้ด" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "ขีดทับ" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "ตัวห้อย" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "ตัวยก" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "ข้อความเอียง" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "ย้ายออกจากสไตล์โค้ดแบบอินไลน์" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "ทำข้อความเป็นตัวหนา" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "ขีดเส้นใต้ข้อความ" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "ขีดทับข้อความ" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po new file mode 100644 index 0000000..6760233 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tk.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Galyň" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Italik" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Aşagy çyzykly" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Üsti çyzykly" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Aşaky ýazgy" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Üst ýazgy" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po new file mode 100644 index 0000000..554a0d6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tr.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Kalın" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "İtalik" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Altı Çizgili" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Kod" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Üstü çizili" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Alt Simge" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Üst Simge" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "İtalik metin" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Satır içi kod stilinden çık" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Kalın yazı" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Metnin altını çiz" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Metnin üstünü çiz" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po new file mode 100644 index 0000000..932189b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/tt.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Tatar (https://app.transifex.com/ckeditor/teams/11143/tt/)\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Калын" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po new file mode 100644 index 0000000..d4dc5bb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ug.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "توم" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "يانتۇ" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ئاستى سىزىق" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "كود" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "ئۆچۈرۈش سىزىقى" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "ئاستبەلگە" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "ئۈستبەلگە" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po new file mode 100644 index 0000000..6bff7b5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uk.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Жирний" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Курсив" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Підкреслений" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Код" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Закреслений" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Нижній індекс" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Верхній індекс" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "Курсив" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Вийти зі стилю вбудованого коду" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "Жирний шрифт" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Підкреслений" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Закреслений" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po new file mode 100644 index 0000000..66087a5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/ur.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "جلّی" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "ترچھا" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "ترچھا" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "کوڈ" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "خط کشیدہ" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "زير نوشت" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "بالا نوشت" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po new file mode 100644 index 0000000..ed3de5b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/uz.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Qalin" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Kursiv" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Tagi chizilgan" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Manba kodi" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Chizilgan" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Pastki yozuv" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Yuqori yozuv" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po new file mode 100644 index 0000000..925fea1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/vi.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "Đậm" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "Nghiêng" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "Gạch dưới" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "Code" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "Gạch ngang" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "Chữ nhỏ dưới" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "Chữ nhỏ trên" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "In nghiêng chữ" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "Thoát khỏi kiểu mã nội dòng" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "In đậm chữ" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "Gạch chân chữ" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "Gạch ngang chữ" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po new file mode 100644 index 0000000..ce3f136 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh-cn.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "加粗" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "倾斜" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "下划线" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "代码" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "删除线" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "下标" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "上标" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "斜体文本" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "摆脱内联代码风格" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "加粗字体" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "给文本添加下划线" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "给文本添加删除线" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po new file mode 100644 index 0000000..723c1ef --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/lang/translations/zh.po @@ -0,0 +1,66 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Bold feature." +msgid "Bold" +msgstr "粗體" + +msgctxt "Toolbar button tooltip for the Italic feature." +msgid "Italic" +msgstr "斜體" + +msgctxt "Toolbar button tooltip for the Underline feature." +msgid "Underline" +msgstr "底線" + +msgctxt "Toolbar button tooltip for the Code feature." +msgid "Code" +msgstr "代碼" + +msgctxt "Toolbar button tooltip for the Strikethrough feature." +msgid "Strikethrough" +msgstr "刪除線" + +msgctxt "Toolbar button tooltip for the Subscript feature." +msgid "Subscript" +msgstr "下標" + +msgctxt "Toolbar button tooltip for the Superscript feature." +msgid "Superscript" +msgstr "上標" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text italic." +msgid "Italic text" +msgstr "斜體文字" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving selection out of an inline code style." +msgid "Move out of an inline code style" +msgstr "移出行內程式碼樣式" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text bold." +msgid "Bold text" +msgstr "粗體文字" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text underlined." +msgid "Underline text" +msgstr "底線文字" + +msgctxt "Keystroke description for assistive technologies: keystroke for making text strikethrough." +msgid "Strikethrough text" +msgstr "刪除線文字" diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/package.json b/node_modules/@ckeditor/ckeditor5-basic-styles/package.json new file mode 100644 index 0000000..a4f392d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/package.json @@ -0,0 +1,37 @@ +{ + "name": "@ckeditor/ckeditor5-basic-styles", + "version": "41.3.1", + "description": "Basic styles feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "ckeditor5": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-basic-styles" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.d.ts new file mode 100644 index 0000000..d8d2007 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.d.ts @@ -0,0 +1,74 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/attributecommand + */ +import { Command, type Editor } from 'ckeditor5/src/core.js'; +/** + * An extension of the base {@link module:core/command~Command} class, which provides utilities for a command + * that toggles a single attribute on a text or an element. + * + * `AttributeCommand` uses {@link module:engine/model/document~Document#selection} + * to decide which nodes (if any) should be changed, and applies or removes the attribute from them. + * + * The command checks the {@link module:engine/model/model~Model#schema} to decide if it can be enabled + * for the current selection and to which nodes the attribute can be applied. + */ +export default class AttributeCommand extends Command { + /** + * Flag indicating whether the command is active. The command is active when the + * {@link module:engine/model/selection~Selection#hasAttribute selection has the attribute} which means that: + * + * * If the selection is not empty – That the attribute is set on the first node in the selection that allows this attribute. + * * If the selection is empty – That the selection has the attribute itself (which means that newly typed + * text will have this attribute, too). + * + * @observable + * @readonly + */ + value: boolean; + /** + * The attribute that will be set by the command. + */ + readonly attributeKey: string; + /** + * @param attributeKey Attribute that will be set by the command. + */ + constructor(editor: Editor, attributeKey: string); + /** + * Updates the command's {@link #value} and {@link #isEnabled} based on the current selection. + */ + refresh(): void; + /** + * Executes the command – applies the attribute to the selection or removes it from the selection. + * + * If the command is active (`value == true`), it will remove attributes. Otherwise, it will set attributes. + * + * The execution result differs, depending on the {@link module:engine/model/document~Document#selection}: + * + * * If the selection is on a range, the command applies the attribute to all nodes in that range + * (if they are allowed to have this attribute by the {@link module:engine/model/schema~Schema schema}). + * * If the selection is collapsed in a non-empty node, the command applies the attribute to the + * {@link module:engine/model/document~Document#selection} itself (note that typed characters copy attributes from the selection). + * * If the selection is collapsed in an empty node, the command applies the attribute to the parent node of the selection (note + * that the selection inherits all attributes from a node if it is in an empty node). + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, + * the command will apply the attribute, otherwise the command will remove the attribute. + * If not set, the command will look for its current value to decide what it should do. + */ + execute(options?: { + forceValue?: boolean; + }): void; + /** + * Checks the attribute value of the first node in the selection that allows the attribute. + * For the collapsed selection returns the selection attribute. + * + * @returns The attribute value. + */ + private _getValueFromFirstAllowedNode; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js new file mode 100644 index 0000000..83ec996 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/attributecommand.js @@ -0,0 +1,105 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/attributecommand + */ +import { Command } from 'ckeditor5/src/core.js'; +/** + * An extension of the base {@link module:core/command~Command} class, which provides utilities for a command + * that toggles a single attribute on a text or an element. + * + * `AttributeCommand` uses {@link module:engine/model/document~Document#selection} + * to decide which nodes (if any) should be changed, and applies or removes the attribute from them. + * + * The command checks the {@link module:engine/model/model~Model#schema} to decide if it can be enabled + * for the current selection and to which nodes the attribute can be applied. + */ +export default class AttributeCommand extends Command { + /** + * @param attributeKey Attribute that will be set by the command. + */ + constructor(editor, attributeKey) { + super(editor); + this.attributeKey = attributeKey; + } + /** + * Updates the command's {@link #value} and {@link #isEnabled} based on the current selection. + */ + refresh() { + const model = this.editor.model; + const doc = model.document; + this.value = this._getValueFromFirstAllowedNode(); + this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, this.attributeKey); + } + /** + * Executes the command – applies the attribute to the selection or removes it from the selection. + * + * If the command is active (`value == true`), it will remove attributes. Otherwise, it will set attributes. + * + * The execution result differs, depending on the {@link module:engine/model/document~Document#selection}: + * + * * If the selection is on a range, the command applies the attribute to all nodes in that range + * (if they are allowed to have this attribute by the {@link module:engine/model/schema~Schema schema}). + * * If the selection is collapsed in a non-empty node, the command applies the attribute to the + * {@link module:engine/model/document~Document#selection} itself (note that typed characters copy attributes from the selection). + * * If the selection is collapsed in an empty node, the command applies the attribute to the parent node of the selection (note + * that the selection inherits all attributes from a node if it is in an empty node). + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, + * the command will apply the attribute, otherwise the command will remove the attribute. + * If not set, the command will look for its current value to decide what it should do. + */ + execute(options = {}) { + const model = this.editor.model; + const doc = model.document; + const selection = doc.selection; + const value = (options.forceValue === undefined) ? !this.value : options.forceValue; + model.change(writer => { + if (selection.isCollapsed) { + if (value) { + writer.setSelectionAttribute(this.attributeKey, true); + } + else { + writer.removeSelectionAttribute(this.attributeKey); + } + } + else { + const ranges = model.schema.getValidRanges(selection.getRanges(), this.attributeKey); + for (const range of ranges) { + if (value) { + writer.setAttribute(this.attributeKey, value, range); + } + else { + writer.removeAttribute(this.attributeKey, range); + } + } + } + }); + } + /** + * Checks the attribute value of the first node in the selection that allows the attribute. + * For the collapsed selection returns the selection attribute. + * + * @returns The attribute value. + */ + _getValueFromFirstAllowedNode() { + const model = this.editor.model; + const schema = model.schema; + const selection = model.document.selection; + if (selection.isCollapsed) { + return selection.hasAttribute(this.attributeKey); + } + for (const range of selection.getRanges()) { + for (const item of range.getItems()) { + if (schema.checkAttribute(item, this.attributeKey)) { + return item.hasAttribute(this.attributeKey); + } + } + } + return false; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.d.ts new file mode 100644 index 0000000..86664eb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.d.ts @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Superscript, Subscript, Bold, Code, AttributeCommand, BoldUI, CodeEditing, CodeUI, Italic, ItalicEditing, ItalicUI, Strikethrough, StrikethroughEditing, StrikethroughUI, SubscriptEditing, SubscriptUI, SuperscriptEditing, SuperscriptUI, Underline, UnderlineEditing, UnderlineUI } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface PluginsMap { + [Superscript.pluginName]: Superscript; + [Subscript.pluginName]: Subscript; + [Bold.pluginName]: Bold; + [Code.pluginName]: Code; + [Code.pluginName]: Code; + [Code.pluginName]: Code; + [BoldUI.pluginName]: BoldUI; + [CodeEditing.pluginName]: CodeEditing; + [CodeUI.pluginName]: CodeUI; + [Italic.pluginName]: Italic; + [ItalicEditing.pluginName]: ItalicEditing; + [ItalicUI.pluginName]: ItalicUI; + [Strikethrough.pluginName]: Strikethrough; + [StrikethroughEditing.pluginName]: StrikethroughEditing; + [StrikethroughUI.pluginName]: StrikethroughUI; + [SubscriptEditing.pluginName]: SubscriptEditing; + [SubscriptUI.pluginName]: SubscriptUI; + [SuperscriptEditing.pluginName]: SuperscriptEditing; + [SuperscriptUI.pluginName]: SuperscriptUI; + [Underline.pluginName]: Underline; + [UnderlineEditing.pluginName]: UnderlineEditing; + [UnderlineUI.pluginName]: UnderlineUI; + } + interface CommandsMap { + bold: AttributeCommand; + code: AttributeCommand; + italic: AttributeCommand; + strikethrough: AttributeCommand; + subscript: AttributeCommand; + superscript: AttributeCommand; + underline: AttributeCommand; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.d.ts new file mode 100644 index 0000000..8ef5bea --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.d.ts @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import BoldEditing from './bold/boldediting.js'; +import BoldUI from './bold/boldui.js'; +/** + * The bold feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/bold/boldediting~BoldEditing bold editing feature} + * and {@link module:basic-styles/bold/boldui~BoldUI bold UI feature}. + */ +export default class Bold extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof BoldEditing, typeof BoldUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Bold"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js new file mode 100644 index 0000000..f551b3a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import BoldEditing from './bold/boldediting.js'; +import BoldUI from './bold/boldui.js'; +/** + * The bold feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/bold/boldediting~BoldEditing bold editing feature} + * and {@link module:basic-styles/bold/boldui~BoldUI bold UI feature}. + */ +export default class Bold extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [BoldEditing, BoldUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Bold'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.d.ts new file mode 100644 index 0000000..d22130e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold/boldediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The bold editing feature. + * + * It registers the `'bold'` command and introduces the `bold` attribute in the model which renders to the view + * as a `` element. + */ +export default class BoldEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "BoldEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js new file mode 100644 index 0000000..f64de93 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldediting.js @@ -0,0 +1,72 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold/boldediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import AttributeCommand from '../attributecommand.js'; +const BOLD = 'bold'; +/** + * The bold editing feature. + * + * It registers the `'bold'` command and introduces the `bold` attribute in the model which renders to the view + * as a `` element. + */ +export default class BoldEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BoldEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = this.editor.t; + // Allow bold attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: BOLD }); + editor.model.schema.setAttributeProperties(BOLD, { + isFormatting: true, + copyOnEnter: true + }); + // Build converter from model to view for data and editing pipelines. + editor.conversion.attributeToElement({ + model: BOLD, + view: 'strong', + upcastAlso: [ + 'b', + viewElement => { + const fontWeight = viewElement.getStyle('font-weight'); + if (!fontWeight) { + return null; + } + // Value of the `font-weight` attribute can be defined as a string or a number. + if (fontWeight == 'bold' || Number(fontWeight) >= 600) { + return { + name: true, + styles: ['font-weight'] + }; + } + return null; + } + ] + }); + // Create bold command. + editor.commands.add(BOLD, new AttributeCommand(editor, BOLD)); + // Set the Ctrl+B keystroke. + editor.keystrokes.set('CTRL+B', BOLD); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Bold text'), + keystroke: 'CTRL+B' + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.d.ts new file mode 100644 index 0000000..c0c5625 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold/boldui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The bold UI feature. It introduces the Bold button. + */ +export default class BoldUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "BoldUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js new file mode 100644 index 0000000..c8ecd53 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/bold/boldui.js @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/bold/boldui + */ +import { Plugin, icons } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +const BOLD = 'bold'; +/** + * The bold UI feature. It introduces the Bold button. + */ +export default class BoldUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BoldUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.locale.t; + const command = editor.commands.get(BOLD); + const createButton = getButtonCreator({ + editor, + commandName: BOLD, + plugin: this, + icon: icons.bold, + label: t('Bold'), + keystroke: 'CTRL+B' + }); + // Add bold button to feature components. + editor.ui.componentFactory.add(BOLD, () => { + const buttonView = createButton(ButtonView); + buttonView.set({ + tooltip: true + }); + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + BOLD, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/code.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code.d.ts new file mode 100644 index 0000000..9973296 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code.d.ts @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import CodeEditing from './code/codeediting.js'; +import CodeUI from './code/codeui.js'; +import '../theme/code.css'; +/** + * The code feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/code/codeediting~CodeEditing code editing feature} + * and {@link module:basic-styles/code/codeui~CodeUI code UI feature}. + */ +export default class Code extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof CodeEditing, typeof CodeUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Code"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js new file mode 100644 index 0000000..38c3174 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code.js @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import CodeEditing from './code/codeediting.js'; +import CodeUI from './code/codeui.js'; +import '../theme/code.css'; +/** + * The code feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/code/codeediting~CodeEditing code editing feature} + * and {@link module:basic-styles/code/codeui~CodeUI code UI feature}. + */ +export default class Code extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [CodeEditing, CodeUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Code'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.d.ts new file mode 100644 index 0000000..7ccd5d7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.d.ts @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code/codeediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { TwoStepCaretMovement } from 'ckeditor5/src/typing.js'; +/** + * The code editing feature. + * + * It registers the `'code'` command and introduces the `code` attribute in the model which renders to the view + * as a `` element. + */ +export default class CodeEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "CodeEditing"; + /** + * @inheritDoc + */ + static get requires(): readonly [typeof TwoStepCaretMovement]; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js new file mode 100644 index 0000000..ff7d0ed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeediting.js @@ -0,0 +1,72 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code/codeediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { TwoStepCaretMovement, inlineHighlight } from 'ckeditor5/src/typing.js'; +import AttributeCommand from '../attributecommand.js'; +const CODE = 'code'; +const HIGHLIGHT_CLASS = 'ck-code_selected'; +/** + * The code editing feature. + * + * It registers the `'code'` command and introduces the `code` attribute in the model which renders to the view + * as a `` element. + */ +export default class CodeEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'CodeEditing'; + } + /** + * @inheritDoc + */ + static get requires() { + return [TwoStepCaretMovement]; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = this.editor.t; + // Allow code attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: CODE }); + editor.model.schema.setAttributeProperties(CODE, { + isFormatting: true, + copyOnEnter: false + }); + editor.conversion.attributeToElement({ + model: CODE, + view: 'code', + upcastAlso: { + styles: { + 'word-wrap': 'break-word' + } + } + }); + // Create code command. + editor.commands.add(CODE, new AttributeCommand(editor, CODE)); + // Enable two-step caret movement for `code` attribute. + editor.plugins.get(TwoStepCaretMovement).registerAttribute(CODE); + // Setup highlight over selected element. + inlineHighlight(editor, CODE, 'code', HIGHLIGHT_CLASS); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Move out of an inline code style'), + keystroke: [ + ['arrowleft', 'arrowleft'], + ['arrowright', 'arrowright'] + ] + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.d.ts new file mode 100644 index 0000000..3a4e1c6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.d.ts @@ -0,0 +1,22 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code/codeui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import '../../theme/code.css'; +/** + * The code UI feature. It introduces the Code button. + */ +export default class CodeUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "CodeUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js new file mode 100644 index 0000000..f0b88a8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/code/codeui.js @@ -0,0 +1,52 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/code/codeui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +import codeIcon from '../../theme/icons/code.svg'; +import '../../theme/code.css'; +const CODE = 'code'; +/** + * The code UI feature. It introduces the Code button. + */ +export default class CodeUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'CodeUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.locale.t; + const createButton = getButtonCreator({ + editor, + commandName: CODE, + plugin: this, + icon: codeIcon, + label: t('Code') + }); + // Add code button to feature components. + editor.ui.componentFactory.add(CODE, () => { + const buttonView = createButton(ButtonView); + const command = editor.commands.get(CODE); + buttonView.set({ + tooltip: true + }); + // Bind button model to command. + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + CODE, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/index.d.ts new file mode 100644 index 0000000..4b91956 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/index.d.ts @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles + */ +export { default as Bold } from './bold.js'; +export { default as BoldEditing } from './bold/boldediting.js'; +export { default as BoldUI } from './bold/boldui.js'; +export { default as Code } from './code.js'; +export { default as CodeEditing } from './code/codeediting.js'; +export { default as CodeUI } from './code/codeui.js'; +export { default as Italic } from './italic.js'; +export { default as ItalicEditing } from './italic/italicediting.js'; +export { default as ItalicUI } from './italic/italicui.js'; +export { default as Strikethrough } from './strikethrough.js'; +export { default as StrikethroughEditing } from './strikethrough/strikethroughediting.js'; +export { default as StrikethroughUI } from './strikethrough/strikethroughui.js'; +export { default as Subscript } from './subscript.js'; +export { default as SubscriptEditing } from './subscript/subscriptediting.js'; +export { default as SubscriptUI } from './subscript/subscriptui.js'; +export { default as Superscript } from './superscript.js'; +export { default as SuperscriptEditing } from './superscript/superscriptediting.js'; +export { default as SuperscriptUI } from './superscript/superscriptui.js'; +export { default as Underline } from './underline.js'; +export { default as UnderlineEditing } from './underline/underlineediting.js'; +export { default as UnderlineUI } from './underline/underlineui.js'; +export type { default as AttributeCommand } from './attributecommand.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/index.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/index.js new file mode 100644 index 0000000..6605158 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/index.js @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles + */ +export { default as Bold } from './bold.js'; +export { default as BoldEditing } from './bold/boldediting.js'; +export { default as BoldUI } from './bold/boldui.js'; +export { default as Code } from './code.js'; +export { default as CodeEditing } from './code/codeediting.js'; +export { default as CodeUI } from './code/codeui.js'; +export { default as Italic } from './italic.js'; +export { default as ItalicEditing } from './italic/italicediting.js'; +export { default as ItalicUI } from './italic/italicui.js'; +export { default as Strikethrough } from './strikethrough.js'; +export { default as StrikethroughEditing } from './strikethrough/strikethroughediting.js'; +export { default as StrikethroughUI } from './strikethrough/strikethroughui.js'; +export { default as Subscript } from './subscript.js'; +export { default as SubscriptEditing } from './subscript/subscriptediting.js'; +export { default as SubscriptUI } from './subscript/subscriptui.js'; +export { default as Superscript } from './superscript.js'; +export { default as SuperscriptEditing } from './superscript/superscriptediting.js'; +export { default as SuperscriptUI } from './superscript/superscriptui.js'; +export { default as Underline } from './underline.js'; +export { default as UnderlineEditing } from './underline/underlineediting.js'; +export { default as UnderlineUI } from './underline/underlineui.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.d.ts new file mode 100644 index 0000000..c068cd0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.d.ts @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import ItalicEditing from './italic/italicediting.js'; +import ItalicUI from './italic/italicui.js'; +/** + * The italic feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/italic/italicediting~ItalicEditing} and + * {@link module:basic-styles/italic/italicui~ItalicUI} plugins. + */ +export default class Italic extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof ItalicEditing, typeof ItalicUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Italic"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js new file mode 100644 index 0000000..6baf314 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import ItalicEditing from './italic/italicediting.js'; +import ItalicUI from './italic/italicui.js'; +/** + * The italic feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/italic/italicediting~ItalicEditing} and + * {@link module:basic-styles/italic/italicui~ItalicUI} plugins. + */ +export default class Italic extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [ItalicEditing, ItalicUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Italic'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.d.ts new file mode 100644 index 0000000..cbf71e9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic/italicediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The italic editing feature. + * + * It registers the `'italic'` command, the Ctrl+I keystroke and introduces the `italic` attribute in the model + * which renders to the view as an `` element. + */ +export default class ItalicEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "ItalicEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js new file mode 100644 index 0000000..a69c1e6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicediting.js @@ -0,0 +1,62 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic/italicediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import AttributeCommand from '../attributecommand.js'; +const ITALIC = 'italic'; +/** + * The italic editing feature. + * + * It registers the `'italic'` command, the Ctrl+I keystroke and introduces the `italic` attribute in the model + * which renders to the view as an `` element. + */ +export default class ItalicEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'ItalicEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = this.editor.t; + // Allow italic attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: ITALIC }); + editor.model.schema.setAttributeProperties(ITALIC, { + isFormatting: true, + copyOnEnter: true + }); + editor.conversion.attributeToElement({ + model: ITALIC, + view: 'i', + upcastAlso: [ + 'em', + { + styles: { + 'font-style': 'italic' + } + } + ] + }); + // Create italic command. + editor.commands.add(ITALIC, new AttributeCommand(editor, ITALIC)); + // Set the Ctrl+I keystroke. + editor.keystrokes.set('CTRL+I', ITALIC); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Italic text'), + keystroke: 'CTRL+I' + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.d.ts new file mode 100644 index 0000000..9c43e63 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic/italicui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The italic UI feature. It introduces the Italic button. + */ +export default class ItalicUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "ItalicUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js new file mode 100644 index 0000000..c4ade01 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/italic/italicui.js @@ -0,0 +1,51 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/italic/italicui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { MenuBarMenuListItemButtonView, ButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +import italicIcon from '../../theme/icons/italic.svg'; +const ITALIC = 'italic'; +/** + * The italic UI feature. It introduces the Italic button. + */ +export default class ItalicUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'ItalicUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const command = editor.commands.get(ITALIC); + const t = editor.locale.t; + const createButton = getButtonCreator({ + editor, + commandName: ITALIC, + plugin: this, + icon: italicIcon, + keystroke: 'CTRL+I', + label: t('Italic') + }); + // Add bold button to feature components. + editor.ui.componentFactory.add(ITALIC, () => { + const buttonView = createButton(ButtonView); + buttonView.set({ + tooltip: true + }); + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + ITALIC, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.d.ts new file mode 100644 index 0000000..16730ae --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.d.ts @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import StrikethroughEditing from './strikethrough/strikethroughediting.js'; +import StrikethroughUI from './strikethrough/strikethroughui.js'; +/** + * The strikethrough feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/strikethrough/strikethroughediting~StrikethroughEditing} and + * {@link module:basic-styles/strikethrough/strikethroughui~StrikethroughUI} plugins. + */ +export default class Strikethrough extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof StrikethroughEditing, typeof StrikethroughUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Strikethrough"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js new file mode 100644 index 0000000..c5f061d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import StrikethroughEditing from './strikethrough/strikethroughediting.js'; +import StrikethroughUI from './strikethrough/strikethroughui.js'; +/** + * The strikethrough feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/strikethrough/strikethroughediting~StrikethroughEditing} and + * {@link module:basic-styles/strikethrough/strikethroughui~StrikethroughUI} plugins. + */ +export default class Strikethrough extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [StrikethroughEditing, StrikethroughUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Strikethrough'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.d.ts new file mode 100644 index 0000000..3e51c77 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.d.ts @@ -0,0 +1,25 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough/strikethroughediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The strikethrough editing feature. + * + * It registers the `'strikethrough'` command, the Ctrl+Shift+X keystroke and introduces the + * `strikethroughsthrough` attribute in the model which renders to the view + * as a `` element. + */ +export default class StrikethroughEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "StrikethroughEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js new file mode 100644 index 0000000..776b5ff --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughediting.js @@ -0,0 +1,64 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough/strikethroughediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import AttributeCommand from '../attributecommand.js'; +const STRIKETHROUGH = 'strikethrough'; +/** + * The strikethrough editing feature. + * + * It registers the `'strikethrough'` command, the Ctrl+Shift+X keystroke and introduces the + * `strikethroughsthrough` attribute in the model which renders to the view + * as a `` element. + */ +export default class StrikethroughEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'StrikethroughEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = this.editor.t; + // Allow strikethrough attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: STRIKETHROUGH }); + editor.model.schema.setAttributeProperties(STRIKETHROUGH, { + isFormatting: true, + copyOnEnter: true + }); + editor.conversion.attributeToElement({ + model: STRIKETHROUGH, + view: 's', + upcastAlso: [ + 'del', + 'strike', + { + styles: { + 'text-decoration': 'line-through' + } + } + ] + }); + // Create strikethrough command. + editor.commands.add(STRIKETHROUGH, new AttributeCommand(editor, STRIKETHROUGH)); + // Set the Ctrl+Shift+X keystroke. + editor.keystrokes.set('CTRL+SHIFT+X', 'strikethrough'); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Strikethrough text'), + keystroke: 'CTRL+SHIFT+X' + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.d.ts new file mode 100644 index 0000000..366a48a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough/strikethroughui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The strikethrough UI feature. It introduces the Strikethrough button. + */ +export default class StrikethroughUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "StrikethroughUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js new file mode 100644 index 0000000..419e53e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/strikethrough/strikethroughui.js @@ -0,0 +1,52 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/strikethrough/strikethroughui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +import strikethroughIcon from '../../theme/icons/strikethrough.svg'; +const STRIKETHROUGH = 'strikethrough'; +/** + * The strikethrough UI feature. It introduces the Strikethrough button. + */ +export default class StrikethroughUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'StrikethroughUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.locale.t; + const createButton = getButtonCreator({ + editor, + commandName: STRIKETHROUGH, + plugin: this, + icon: strikethroughIcon, + keystroke: 'CTRL+SHIFT+X', + label: t('Strikethrough') + }); + // Add strikethrough button to feature components. + editor.ui.componentFactory.add(STRIKETHROUGH, () => { + const buttonView = createButton(ButtonView); + const command = editor.commands.get(STRIKETHROUGH); + buttonView.set({ + tooltip: true + }); + // Bind button model to command. + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + STRIKETHROUGH, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.d.ts new file mode 100644 index 0000000..d51f085 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.d.ts @@ -0,0 +1,26 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import SubscriptEditing from './subscript/subscriptediting.js'; +import SubscriptUI from './subscript/subscriptui.js'; +/** + * The subscript feature. + * + * It loads the {@link module:basic-styles/subscript/subscriptediting~SubscriptEditing} and + * {@link module:basic-styles/subscript/subscriptui~SubscriptUI} plugins. + */ +export default class Subscript extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof SubscriptEditing, typeof SubscriptUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Subscript"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js new file mode 100644 index 0000000..a47da16 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript.js @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import SubscriptEditing from './subscript/subscriptediting.js'; +import SubscriptUI from './subscript/subscriptui.js'; +/** + * The subscript feature. + * + * It loads the {@link module:basic-styles/subscript/subscriptediting~SubscriptEditing} and + * {@link module:basic-styles/subscript/subscriptui~SubscriptUI} plugins. + */ +export default class Subscript extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [SubscriptEditing, SubscriptUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Subscript'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.d.ts new file mode 100644 index 0000000..43a736d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript/subscriptediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The subscript editing feature. + * + * It registers the `sub` command and introduces the `sub` attribute in the model which renders to the view + * as a `` element. + */ +export default class SubscriptEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "SubscriptEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js new file mode 100644 index 0000000..4c786e4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptediting.js @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript/subscriptediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import AttributeCommand from '../attributecommand.js'; +const SUBSCRIPT = 'subscript'; +/** + * The subscript editing feature. + * + * It registers the `sub` command and introduces the `sub` attribute in the model which renders to the view + * as a `` element. + */ +export default class SubscriptEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SubscriptEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow sub attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: SUBSCRIPT }); + editor.model.schema.setAttributeProperties(SUBSCRIPT, { + isFormatting: true, + copyOnEnter: true + }); + // Build converter from model to view for data and editing pipelines. + editor.conversion.attributeToElement({ + model: SUBSCRIPT, + view: 'sub', + upcastAlso: [ + { + styles: { + 'vertical-align': 'sub' + } + } + ] + }); + // Create sub command. + editor.commands.add(SUBSCRIPT, new AttributeCommand(editor, SUBSCRIPT)); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.d.ts new file mode 100644 index 0000000..b3f25d8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript/subscriptui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The subscript UI feature. It introduces the Subscript button. + */ +export default class SubscriptUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "SubscriptUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js new file mode 100644 index 0000000..5eee2f7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/subscript/subscriptui.js @@ -0,0 +1,51 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/subscript/subscriptui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +import subscriptIcon from '../../theme/icons/subscript.svg'; +const SUBSCRIPT = 'subscript'; +/** + * The subscript UI feature. It introduces the Subscript button. + */ +export default class SubscriptUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SubscriptUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.locale.t; + const createButton = getButtonCreator({ + editor, + commandName: SUBSCRIPT, + plugin: this, + icon: subscriptIcon, + label: t('Subscript') + }); + // Add subscript button to feature components. + editor.ui.componentFactory.add(SUBSCRIPT, () => { + const buttonView = createButton(ButtonView); + const command = editor.commands.get(SUBSCRIPT); + buttonView.set({ + tooltip: true + }); + // Bind button model to command. + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + SUBSCRIPT, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.d.ts new file mode 100644 index 0000000..6f9cf21 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.d.ts @@ -0,0 +1,26 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import SuperscriptEditing from './superscript/superscriptediting.js'; +import SuperscriptUI from './superscript/superscriptui.js'; +/** + * The superscript feature. + * + * It loads the {@link module:basic-styles/superscript/superscriptediting~SuperscriptEditing} and + * {@link module:basic-styles/superscript/superscriptui~SuperscriptUI} plugins. + */ +export default class Superscript extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof SuperscriptEditing, typeof SuperscriptUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Superscript"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js new file mode 100644 index 0000000..de85ebe --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript.js @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import SuperscriptEditing from './superscript/superscriptediting.js'; +import SuperscriptUI from './superscript/superscriptui.js'; +/** + * The superscript feature. + * + * It loads the {@link module:basic-styles/superscript/superscriptediting~SuperscriptEditing} and + * {@link module:basic-styles/superscript/superscriptui~SuperscriptUI} plugins. + */ +export default class Superscript extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [SuperscriptEditing, SuperscriptUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Superscript'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.d.ts new file mode 100644 index 0000000..9274abf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript/superscriptediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The superscript editing feature. + * + * It registers the `super` command and introduces the `super` attribute in the model which renders to the view + * as a `` element. + */ +export default class SuperscriptEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "SuperscriptEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js new file mode 100644 index 0000000..f386016 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptediting.js @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript/superscriptediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import AttributeCommand from '../attributecommand.js'; +const SUPERSCRIPT = 'superscript'; +/** + * The superscript editing feature. + * + * It registers the `super` command and introduces the `super` attribute in the model which renders to the view + * as a `` element. + */ +export default class SuperscriptEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SuperscriptEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + // Allow super attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: SUPERSCRIPT }); + editor.model.schema.setAttributeProperties(SUPERSCRIPT, { + isFormatting: true, + copyOnEnter: true + }); + // Build converter from model to view for data and editing pipelines. + editor.conversion.attributeToElement({ + model: SUPERSCRIPT, + view: 'sup', + upcastAlso: [ + { + styles: { + 'vertical-align': 'super' + } + } + ] + }); + // Create super command. + editor.commands.add(SUPERSCRIPT, new AttributeCommand(editor, SUPERSCRIPT)); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.d.ts new file mode 100644 index 0000000..170f6fc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript/superscriptui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The superscript UI feature. It introduces the Superscript button. + */ +export default class SuperscriptUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "SuperscriptUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js new file mode 100644 index 0000000..60e4864 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/superscript/superscriptui.js @@ -0,0 +1,51 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/superscript/superscriptui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +import superscriptIcon from '../../theme/icons/superscript.svg'; +const SUPERSCRIPT = 'superscript'; +/** + * The superscript UI feature. It introduces the Superscript button. + */ +export default class SuperscriptUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'SuperscriptUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.locale.t; + const createButton = getButtonCreator({ + editor, + commandName: SUPERSCRIPT, + plugin: this, + icon: superscriptIcon, + label: t('Superscript') + }); + // Add superscript button to feature components. + editor.ui.componentFactory.add(SUPERSCRIPT, () => { + const buttonView = createButton(ButtonView); + const command = editor.commands.get(SUPERSCRIPT); + buttonView.set({ + tooltip: true + }); + // Bind button model to command. + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + SUPERSCRIPT, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.d.ts new file mode 100644 index 0000000..75b9038 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.d.ts @@ -0,0 +1,29 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import UnderlineEditing from './underline/underlineediting.js'; +import UnderlineUI from './underline/underlineui.js'; +/** + * The underline feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/underline/underlineediting~UnderlineEditing} and + * {@link module:basic-styles/underline/underlineui~UnderlineUI} plugins. + */ +export default class Underline extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof UnderlineEditing, typeof UnderlineUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Underline"; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js new file mode 100644 index 0000000..a6e01e4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline.js @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import UnderlineEditing from './underline/underlineediting.js'; +import UnderlineUI from './underline/underlineui.js'; +/** + * The underline feature. + * + * For a detailed overview check the {@glink features/basic-styles Basic styles feature} guide + * and the {@glink api/basic-styles package page}. + * + * This is a "glue" plugin which loads the {@link module:basic-styles/underline/underlineediting~UnderlineEditing} and + * {@link module:basic-styles/underline/underlineui~UnderlineUI} plugins. + */ +export default class Underline extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [UnderlineEditing, UnderlineUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Underline'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.d.ts new file mode 100644 index 0000000..3eee4f0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline/underlineediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The underline editing feature. + * + * It registers the `'underline'` command, the Ctrl+U keystroke + * and introduces the `underline` attribute in the model which renders to the view as an `` element. + */ +export default class UnderlineEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "UnderlineEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js new file mode 100644 index 0000000..c9f2660 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineediting.js @@ -0,0 +1,59 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline/underlineediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import AttributeCommand from '../attributecommand.js'; +const UNDERLINE = 'underline'; +/** + * The underline editing feature. + * + * It registers the `'underline'` command, the Ctrl+U keystroke + * and introduces the `underline` attribute in the model which renders to the view as an `` element. + */ +export default class UnderlineEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'UnderlineEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = this.editor.t; + // Allow strikethrough attribute on text nodes. + editor.model.schema.extend('$text', { allowAttributes: UNDERLINE }); + editor.model.schema.setAttributeProperties(UNDERLINE, { + isFormatting: true, + copyOnEnter: true + }); + editor.conversion.attributeToElement({ + model: UNDERLINE, + view: 'u', + upcastAlso: { + styles: { + 'text-decoration': 'underline' + } + } + }); + // Create underline command. + editor.commands.add(UNDERLINE, new AttributeCommand(editor, UNDERLINE)); + // Set the Ctrl+U keystroke. + editor.keystrokes.set('CTRL+U', 'underline'); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Underline text'), + keystroke: 'CTRL+U' + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.d.ts new file mode 100644 index 0000000..5f5709b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline/underlineui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +/** + * The underline UI feature. It introduces the Underline button. + */ +export default class UnderlineUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "UnderlineUI"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js new file mode 100644 index 0000000..ca6e64c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/underline/underlineui.js @@ -0,0 +1,51 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/underline/underlineui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import { getButtonCreator } from '../utils.js'; +import underlineIcon from '../../theme/icons/underline.svg'; +const UNDERLINE = 'underline'; +/** + * The underline UI feature. It introduces the Underline button. + */ +export default class UnderlineUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'UnderlineUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const command = editor.commands.get(UNDERLINE); + const t = editor.locale.t; + const createButton = getButtonCreator({ + editor, + commandName: UNDERLINE, + plugin: this, + icon: underlineIcon, + label: t('Underline'), + keystroke: 'CTRL+U' + }); + // Add bold button to feature components. + editor.ui.componentFactory.add(UNDERLINE, () => { + const buttonView = createButton(ButtonView); + buttonView.set({ + tooltip: true + }); + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + UNDERLINE, () => { + return createButton(MenuBarMenuListItemButtonView); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.d.ts b/node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.d.ts new file mode 100644 index 0000000..02837f5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.d.ts @@ -0,0 +1,20 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module basic-styles/utils + */ +import type { Editor, Plugin } from 'ckeditor5/src/core.js'; +import type { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +/** + * Returns a function that creates a (toolbar or menu bar) button for a basic style feature. + */ +export declare function getButtonCreator({ editor, commandName, plugin, icon, label, keystroke }: { + editor: Editor; + commandName: string; + icon: string; + label: string; + plugin: Plugin; + keystroke?: string; +}): (ButtonClass: T) => InstanceType; diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.js b/node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.js new file mode 100644 index 0000000..a18e36a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/src/utils.js @@ -0,0 +1,26 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns a function that creates a (toolbar or menu bar) button for a basic style feature. + */ +export function getButtonCreator({ editor, commandName, plugin, icon, label, keystroke }) { + return (ButtonClass) => { + const command = editor.commands.get(commandName); + const view = new ButtonClass(editor.locale); + view.set({ + label, + icon, + keystroke, + isToggleable: true + }); + view.bind('isEnabled').to(command, 'isEnabled'); + // Execute the command. + plugin.listenTo(view, 'execute', () => { + editor.execute(commandName); + editor.editing.view.focus(); + }); + return view; + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/code.css b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/code.css new file mode 100644 index 0000000..5fa2d8a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/code.css @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content code { + background-color: hsla(0, 0%, 78%, 0.3); + padding: .15em; + border-radius: 2px; +} + +.ck.ck-editor__editable .ck-code_selected { + background-color: hsla(0, 0%, 78%, 0.5); +} diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg new file mode 100644 index 0000000..0cd08e1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg new file mode 100644 index 0000000..efd83d1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg new file mode 100644 index 0000000..9b307bc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/strikethrough.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg new file mode 100644 index 0000000..0cb413e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/subscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg new file mode 100644 index 0000000..92b5eb1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/superscript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg new file mode 100644 index 0000000..149b64f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-basic-styles/theme/icons/underline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-block-quote/CHANGELOG.md new file mode 100644 index 0000000..5ab47ca --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/CHANGELOG.md @@ -0,0 +1,204 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v18.0.0...v19.0.0) (April 29, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v16.0.0...v17.0.0) (February 18, 2020) + +### Bug fixes + +* Focus the editor before executing toolbar buttons' command. See [ckeditor/ckeditor5#353](https://github.com/ckeditor/ckeditor5/issues/353). ([4223ff2](https://github.com/ckeditor/ckeditor5-block-quote/commit/4223ff2)) + +### Other changes + +* Updated translations. ([77fbbad](https://github.com/ckeditor/ckeditor5-block-quote/commit/77fbbad)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Other changes + +* Updated translations. ([e49b7b0](https://github.com/ckeditor/ckeditor5-block-quote/commit/e49b7b0)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.3...v15.0.0) (October 23, 2019) + +### Other changes + +* Add `pluginName` property to editing plugins. ([3d6b419](https://github.com/ckeditor/ckeditor5-block-quote/commit/3d6b419)) +* Updated translations. ([47acb53](https://github.com/ckeditor/ckeditor5-block-quote/commit/47acb53)) + + +## [11.1.3](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.2...v11.1.3) (August 26, 2019) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([aa24686](https://github.com/ckeditor/ckeditor5-block-quote/commit/aa24686)) + +### Other changes + +* Adjusted blockquote content styles for better compatibility with RTL languages. See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([c48b703](https://github.com/ckeditor/ckeditor5-block-quote/commit/c48b703)) +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([ffcbcfc](https://github.com/ckeditor/ckeditor5-block-quote/commit/ffcbcfc)) +* Updated translations. ([537f761](https://github.com/ckeditor/ckeditor5-block-quote/commit/537f761)) + + +## [11.1.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.1...v11.1.2) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.1.0...v11.1.1) (July 4, 2019) + +### Other changes + +* Updated translations. ([3ab78f2](https://github.com/ckeditor/ckeditor5-block-quote/commit/3ab78f2)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.0.1...v11.1.0) (June 6, 2019) + +### Features + +* Added possibility to force quoting or un-quoting in `execute()`. Closes: [#35](https://github.com/ckeditor/ckeditor5-block-quote/issues/35). ([e9a5027](https://github.com/ckeditor/ckeditor5-block-quote/commit/e9a5027)) + +### Other changes + +* Updated translations. ([eb15fc6](https://github.com/ckeditor/ckeditor5-block-quote/commit/eb15fc6)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v11.0.0...v11.0.1) (April 4, 2019) + +### Other changes + +* Updated translations. ([c524349](https://github.com/ckeditor/ckeditor5-block-quote/commit/c524349)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.1.1...v11.0.0) (February 28, 2019) + +### Other changes + +* Make `BlockQuoteCommand` wrap only top-most blocks. ([17c9d3b](https://github.com/ckeditor/ckeditor5-block-quote/commit/17c9d3b)) +* Updated translations. ([f452b45](https://github.com/ckeditor/ckeditor5-block-quote/commit/f452b45)) ([8d8fde2](https://github.com/ckeditor/ckeditor5-block-quote/commit/8d8fde2)) ([cb7ec44](https://github.com/ckeditor/ckeditor5-block-quote/commit/cb7ec44)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.1.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.1.0...v10.1.1) (December 5, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.0.2...v10.1.0) (October 8, 2018) + +### Features + +* Implemented a post-fixer for cleaning incorrect blockquotes. ([fcb00c0](https://github.com/ckeditor/ckeditor5-block-quote/commit/fcb00c0)) + +### Other changes + +* Updated translations. ([a0078f3](https://github.com/ckeditor/ckeditor5-block-quote/commit/a0078f3)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.0.1...v10.0.2) (July 18, 2018) + +### Other changes + +* Updated translations. ([170a8fd](https://github.com/ckeditor/ckeditor5-block-quote/commit/170a8fd)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v10.0.0...v10.0.1) (June 21, 2018) + +### Other changes + +* Updated translations. ([4a51fd8](https://github.com/ckeditor/ckeditor5-block-quote/commit/4a51fd8)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([a4fa6e7](https://github.com/ckeditor/ckeditor5-block-quote/commit/a4fa6e7)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +### Bug fixes + +* The outline of a quoted image should not be cropped. Closes [#15](https://github.com/ckeditor/ckeditor5-block-quote/issues/15). ([1512135](https://github.com/ckeditor/ckeditor5-block-quote/commit/1512135)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Other changes + +* Aligned feature class naming to the new scheme. ([cc723c3](https://github.com/ckeditor/ckeditor5-block-quote/commit/cc723c3)) +* Migrated package styles to PostCSS. Moved the visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([c973931](https://github.com/ckeditor/ckeditor5-block-quote/commit/c973931)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-block-quote/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Other changes + +* Updated translations. ([e150fe2](https://github.com/ckeditor/ckeditor5-block-quote/commit/e150fe2)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v0.2.0...v1.0.0-alpha.1) (October 3, 2017) + +### Other changes + +* Improved default blockquote styling so it does not overlap with floated images. Closes [#12](https://github.com/ckeditor/ckeditor5-block-quote/issues/12). ([fb09418](https://github.com/ckeditor/ckeditor5-block-quote/commit/fb09418)) + + +## [0.2.0](https://github.com/ckeditor/ckeditor5-block-quote/compare/v0.1.1...v0.2.0) (September 3, 2017) + +### Features + +* Enter in the block quote will scroll the viewport to the selection. See ckeditor/ckeditor5-engine#660. ([09dc740](https://github.com/ckeditor/ckeditor5-block-quote/commit/09dc740)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([627510a](https://github.com/ckeditor/ckeditor5-block-quote/commit/627510a)) + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.1.1](https://github.com/ckeditor/ckeditor5-block-quote/compare/v0.1.0...v0.1.1) (May 7, 2017) + +### Bug fixes + +* Block quote should not be applied to image's caption. Closes: [#10](https://github.com/ckeditor/ckeditor5-block-quote/issues/10). ([06de874](https://github.com/ckeditor/ckeditor5-block-quote/commit/06de874)) + +### Other changes + +* Updated translations. ([5e23f86](https://github.com/ckeditor/ckeditor5-block-quote/commit/5e23f86)) + + +## 0.1.0 (April 5, 2017) + +### Features + +* Introduced the block quote feature. Closes [#1](https://github.com/ckeditor/ckeditor5-block-quote/issues/1). ([239015b](https://github.com/ckeditor/ckeditor5-block-quote/commit/239015b)) diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/LICENSE.md b/node_modules/@ckeditor/ckeditor5-block-quote/LICENSE.md new file mode 100644 index 0000000..106d679 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 block quote feature** – https://github.com/ckeditor/ckeditor5-block-quote
+Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/README.md b/node_modules/@ckeditor/ckeditor5-block-quote/README.md new file mode 100644 index 0000000..f63ea38 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/README.md @@ -0,0 +1,20 @@ +CKEditor 5 block quote feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-block-quote.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements block quote support for CKEditor 5. + +## Demo + +Check out the [demo in the block quote feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/block-quote.html#demo). + +## Documentation + +See the [`@ckeditor/ckeditor5-block-quote` package](https://ckeditor.com/docs/ckeditor5/latest/api/block-quote.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/block-quote.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/block-quote.js new file mode 100644 index 0000000..98352ec --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/block-quote.js @@ -0,0 +1,5 @@ +!function(e){const t=e.en=e.en||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var e={28:(e,t,o)=>{"use strict";o.d(t,{A:()=>i});var n=o(935),r=o.n(n)()((function(e){return e[1]}));r.push([e.id,".ck-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}",""]);const i=r},935:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var o=e(t);return t[2]?"@media ".concat(t[2]," {").concat(o,"}"):o})).join("")},t.i=function(e,o,n){"string"==typeof e&&(e=[[null,e,""]]);var r={};if(n)for(var i=0;i{"use strict";var n,r=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},i=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),c=[];function s(e){for(var t=-1,o=0;o{e.exports=o(237)("./src/core.js")},507:(e,t,o)=>{e.exports=o(237)("./src/enter.js")},834:(e,t,o)=>{e.exports=o(237)("./src/typing.js")},311:(e,t,o)=>{e.exports=o(237)("./src/ui.js")},584:(e,t,o)=>{e.exports=o(237)("./src/utils.js")},237:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={id:n,exports:{}};return e[n](i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nc=void 0;var n={};(()=>{"use strict";o.r(n),o.d(n,{BlockQuote:()=>g,BlockQuoteEditing:()=>u,BlockQuoteUI:()=>v});var e=o(782),t=o(507),r=o(834),i=o(584);class c extends e.Command{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(e={}){const t=this.editor.model,o=t.schema,n=t.document.selection,r=Array.from(n.getSelectedBlocks()),i=void 0===e.forceValue?!this.value:e.forceValue;t.change((e=>{if(i){const t=r.filter((e=>s(e)||l(o,e)));this._applyQuote(e,t)}else this._removeQuote(e,r.filter(s))}))}_getValue(){const e=this.editor.model.document.selection,t=(0,i.first)(e.getSelectedBlocks());return!(!t||!s(t))}_checkEnabled(){if(this.value)return!0;const e=this.editor.model.document.selection,t=this.editor.model.schema,o=(0,i.first)(e.getSelectedBlocks());return!!o&&l(t,o)}_removeQuote(e,t){a(e,t).reverse().forEach((t=>{if(t.start.isAtStart&&t.end.isAtEnd)return void e.unwrap(t.start.parent);if(t.start.isAtStart){const o=e.createPositionBefore(t.start.parent);return void e.move(t,o)}t.end.isAtEnd||e.split(t.end);const o=e.createPositionAfter(t.end.parent);e.move(t,o)}))}_applyQuote(e,t){const o=[];a(e,t).reverse().forEach((t=>{let n=s(t.start);n||(n=e.createElement("blockQuote"),e.wrap(t,n)),o.push(n)})),o.reverse().reduce(((t,o)=>t.nextSibling==o?(e.merge(e.createPositionAfter(t)),t):o))}}function s(e){return"blockQuote"==e.parent.name?e.parent:null}function a(e,t){let o,n=0;const r=[];for(;n{const n=e.model.document.differ.getChanges();for(const e of n)if("insert"==e.type){const n=e.position.nodeAfter;if(!n)continue;if(n.is("element","blockQuote")&&n.isEmpty)return o.remove(n),!0;if(n.is("element","blockQuote")&&!t.checkChild(e.position,n))return o.unwrap(n),!0;if(n.is("element")){const e=o.createRangeIn(n);for(const n of e.getItems())if(n.is("element","blockQuote")&&!t.checkChild(o.createPositionBefore(n),n))return o.unwrap(n),!0}}else if("remove"==e.type){const t=e.position.parent;if(t.is("element","blockQuote")&&t.isEmpty)return o.remove(t),!0}return!1}));const o=this.editor.editing.view.document,n=e.model.document.selection,r=e.commands.get("blockQuote");this.listenTo(o,"enter",((t,o)=>{if(!n.isCollapsed||!r.value)return;n.getLastPosition().parent.isEmpty&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),o.preventDefault(),t.stop())}),{context:"blockquote"}),this.listenTo(o,"delete",((t,o)=>{if("backward"!=o.direction||!n.isCollapsed||!r.value)return;const i=n.getLastPosition().parent;i.isEmpty&&!i.previousSibling&&(e.execute("blockQuote"),e.editing.view.scrollToTheSelection(),o.preventDefault(),t.stop())}),{context:"blockquote"})}}var d=o(311),f=o(591),p=o.n(f),m=o(28),h={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};p()(m.A,h);m.A.locals;class v extends e.Plugin{static get pluginName(){return"BlockQuoteUI"}init(){const e=this.editor,t=e.commands.get("blockQuote");e.ui.componentFactory.add("blockQuote",(()=>{const e=this._createButton(d.ButtonView);return e.set({tooltip:!0}),e.bind("isOn").to(t,"value"),e})),e.ui.componentFactory.add("menuBar:blockQuote",(()=>this._createButton(d.MenuBarMenuListItemButtonView)))}_createButton(t){const o=this.editor,n=o.locale,r=o.commands.get("blockQuote"),i=new t(o.locale),c=n.t;return i.set({label:c("Block quote"),icon:e.icons.quote,isToggleable:!0}),i.bind("isEnabled").to(r,"isEnabled"),this.listenTo(i,"execute",(()=>{o.execute("blockQuote"),o.editing.view.focus()})),i}}class g extends e.Plugin{static get requires(){return[u,v]}static get pluginName(){return"BlockQuote"}}})(),(window.CKEditor5=window.CKEditor5||{}).blockQuote=n})(); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/af.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/af.js new file mode 100644 index 0000000..e35bd01 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/af.js @@ -0,0 +1 @@ +!function(n){const i=n.af=n.af||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Verwysingsaanhaling"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ar.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ar.js new file mode 100644 index 0000000..a6df1fe --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ar.js @@ -0,0 +1 @@ +!function(i){const n=i.ar=i.ar||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"اقتباس"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/az.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/az.js new file mode 100644 index 0000000..22158de --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/az.js @@ -0,0 +1 @@ +!function(i){const o=i.az=i.az||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Sitat bloku"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bg.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bg.js new file mode 100644 index 0000000..f8b2a45 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bg.js @@ -0,0 +1 @@ +!function(i){const n=i.bg=i.bg||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bn.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bn.js new file mode 100644 index 0000000..7b319b2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bn.js @@ -0,0 +1 @@ +!function(n){const i=n.bn=n.bn||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"ব্লক কোট"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bs.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bs.js new file mode 100644 index 0000000..0a20b71 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/bs.js @@ -0,0 +1 @@ +!function(i){const n=i.bs=i.bs||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ca.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ca.js new file mode 100644 index 0000000..e3f5bfd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ca.js @@ -0,0 +1 @@ +!function(c){const i=c.ca=c.ca||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cita de bloc"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/cs.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/cs.js new file mode 100644 index 0000000..6bf6efd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/cs.js @@ -0,0 +1 @@ +!function(c){const i=c.cs=c.cs||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citace"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/da.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/da.js new file mode 100644 index 0000000..517b5cb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/da.js @@ -0,0 +1 @@ +!function(i){const o=i.da=i.da||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blot citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js new file mode 100644 index 0000000..d021ce3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de-ch.js @@ -0,0 +1 @@ +!function(c){const i=c["de-ch"]=c["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de.js new file mode 100644 index 0000000..5bafd44 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/de.js @@ -0,0 +1 @@ +!function(i){const o=i.de=i.de||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockzitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/el.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/el.js new file mode 100644 index 0000000..2e7cea9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/el.js @@ -0,0 +1 @@ +!function(i){const n=i.el=i.el||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Περιοχή παράθεσης"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js new file mode 100644 index 0000000..a44520c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-au.js @@ -0,0 +1 @@ +!function(n){const o=n["en-au"]=n["en-au"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js new file mode 100644 index 0000000..3fd172f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/en-gb.js @@ -0,0 +1 @@ +!function(n){const o=n["en-gb"]=n["en-gb"]||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js new file mode 100644 index 0000000..370b102 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es-co.js @@ -0,0 +1 @@ +!function(o){const i=o["es-co"]=o["es-co"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es.js new file mode 100644 index 0000000..659c580 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/es.js @@ -0,0 +1 @@ +!function(i){const o=i.es=i.es||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Bloque de cita"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/et.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/et.js new file mode 100644 index 0000000..2a02d6a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/et.js @@ -0,0 +1 @@ +!function(t){const i=t.et=t.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Tsitaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/eu.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/eu.js new file mode 100644 index 0000000..80be33c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/eu.js @@ -0,0 +1 @@ +!function(i){const n=i.eu=i.eu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Aipua"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fa.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fa.js new file mode 100644 index 0000000..f508a10 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fa.js @@ -0,0 +1 @@ +!function(i){const n=i.fa=i.fa||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" بلوک نقل قول"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fi.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fi.js new file mode 100644 index 0000000..173289c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fi.js @@ -0,0 +1 @@ +!function(i){const n=i.fi=i.fi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Lainaus"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fr.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fr.js new file mode 100644 index 0000000..002cb15 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/fr.js @@ -0,0 +1 @@ +!function(i){const n=i.fr=i.fr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citation"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gl.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gl.js new file mode 100644 index 0000000..943c041 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gl.js @@ -0,0 +1 @@ +!function(i){const o=i.gl=i.gl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Cita de bloque"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gu.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gu.js new file mode 100644 index 0000000..2ead639 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/gu.js @@ -0,0 +1 @@ +!function(i){const n=i.gu=i.gu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":" વિચાર ટાંકો"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/he.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/he.js new file mode 100644 index 0000000..3b71162 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/he.js @@ -0,0 +1 @@ +!function(i){const n=i.he=i.he||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"בלוק ציטוט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hi.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hi.js new file mode 100644 index 0000000..02ad5ca --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hi.js @@ -0,0 +1 @@ +!function(i){const o=i.hi=i.hi||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Block quote"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hr.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hr.js new file mode 100644 index 0000000..98514f6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hr.js @@ -0,0 +1 @@ +!function(i){const o=i.hr=i.hr||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blok citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hu.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hu.js new file mode 100644 index 0000000..a7f2c85 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/hu.js @@ -0,0 +1 @@ +!function(i){const n=i.hu=i.hu||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Idézet"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/id.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/id.js new file mode 100644 index 0000000..061777f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/id.js @@ -0,0 +1 @@ +!function(i){const n=i.id=i.id||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Kutipan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/it.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/it.js new file mode 100644 index 0000000..aaa7054 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/it.js @@ -0,0 +1 @@ +!function(i){const o=i.it=i.it||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blocco citazione"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ja.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ja.js new file mode 100644 index 0000000..7978b9f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ja.js @@ -0,0 +1 @@ +!function(i){const n=i.ja=i.ja||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ブロッククオート(引用)"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/km.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/km.js new file mode 100644 index 0000000..d6dcaaf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/km.js @@ -0,0 +1 @@ +!function(i){const n=i.km=i.km||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"ប្លុក​ពាក្យ​សម្រង់"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/kn.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/kn.js new file mode 100644 index 0000000..47f43c7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/kn.js @@ -0,0 +1 @@ +!function(n){const i=n.kn=n.kn||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ko.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ko.js new file mode 100644 index 0000000..3ed9283 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ko.js @@ -0,0 +1 @@ +!function(o){const i=o.ko=o.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"인용 단락"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ku.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ku.js new file mode 100644 index 0000000..a0a5d05 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ku.js @@ -0,0 +1 @@ +!function(i){const n=i.ku=i.ku||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"وتەی وەرگیراو"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lt.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lt.js new file mode 100644 index 0000000..e7a9e1a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lt.js @@ -0,0 +1 @@ +!function(t){const i=t.lt=t.lt||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Citata"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lv.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lv.js new file mode 100644 index 0000000..aa87169 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/lv.js @@ -0,0 +1 @@ +!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citāts"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ms.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ms.js new file mode 100644 index 0000000..384ac23 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ms.js @@ -0,0 +1 @@ +!function(i){const n=i.ms=i.ms||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Blok petikan"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nb.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nb.js new file mode 100644 index 0000000..8b6ff6f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nb.js @@ -0,0 +1 @@ +!function(n){const i=n.nb=n.nb||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ne.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ne.js new file mode 100644 index 0000000..3f9e689 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ne.js @@ -0,0 +1 @@ +!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"ब्लक उद्धरण"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nl.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nl.js new file mode 100644 index 0000000..5104493 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/nl.js @@ -0,0 +1 @@ +!function(n){const i=n.nl=n.nl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Blok citaat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/no.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/no.js new file mode 100644 index 0000000..92ac633 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/no.js @@ -0,0 +1 @@ +!function(o){const n=o.no=o.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Blokksitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pl.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pl.js new file mode 100644 index 0000000..db1f5a8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pl.js @@ -0,0 +1 @@ +!function(o){const i=o.pl=o.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Cytat blokowy"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js new file mode 100644 index 0000000..5e48dbe --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt-br.js @@ -0,0 +1 @@ +!function(o){const i=o["pt-br"]=o["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloco de citação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt.js new file mode 100644 index 0000000..2c3449e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/pt.js @@ -0,0 +1 @@ +!function(o){const i=o.pt=o.pt||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloco de citação"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ro.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ro.js new file mode 100644 index 0000000..d6671e1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ro.js @@ -0,0 +1 @@ +!function(o){const i=o.ro=o.ro||{};i.dictionary=Object.assign(i.dictionary||{},{"Block quote":"Bloc citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ru.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ru.js new file mode 100644 index 0000000..4591608 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ru.js @@ -0,0 +1 @@ +!function(i){const n=i.ru=i.ru||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sk.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sk.js new file mode 100644 index 0000000..6ccea39 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sk.js @@ -0,0 +1 @@ +!function(i){const n=i.sk=i.sk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Citát"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sl.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sl.js new file mode 100644 index 0000000..dd31080 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sl.js @@ -0,0 +1 @@ +!function(i){const o=i.sl=i.sl||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blokiraj citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sq.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sq.js new file mode 100644 index 0000000..1e47d02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sq.js @@ -0,0 +1 @@ +!function(n){const o=n.sq=n.sq||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Thonjëzat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js new file mode 100644 index 0000000..b630bc6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr-latn.js @@ -0,0 +1 @@ +!function(n){const t=n["sr-latn"]=n["sr-latn"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Citat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr.js new file mode 100644 index 0000000..516a7a8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sr.js @@ -0,0 +1 @@ +!function(i){const n=i.sr=i.sr||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитат"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sv.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sv.js new file mode 100644 index 0000000..e2a0869 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/sv.js @@ -0,0 +1 @@ +!function(i){const o=i.sv=i.sv||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Blockcitat"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/th.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/th.js new file mode 100644 index 0000000..2305940 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/th.js @@ -0,0 +1 @@ +!function(i){const n=i.th=i.th||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"คำพูดบล็อก"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tk.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tk.js new file mode 100644 index 0000000..98d5f38 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tk.js @@ -0,0 +1 @@ +!function(i){const t=i.tk=i.tk||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Sitata blokirläň"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tr.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tr.js new file mode 100644 index 0000000..afef9da --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/tr.js @@ -0,0 +1 @@ +!function(n){const t=n.tr=n.tr||{};t.dictionary=Object.assign(t.dictionary||{},{"Block quote":"Alıntı"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ug.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ug.js new file mode 100644 index 0000000..41f4bff --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ug.js @@ -0,0 +1 @@ +!function(i){const n=i.ug=i.ug||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"نەقىل"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uk.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uk.js new file mode 100644 index 0000000..9678c69 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uk.js @@ -0,0 +1 @@ +!function(i){const n=i.uk=i.uk||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Цитата"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ur.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ur.js new file mode 100644 index 0000000..be45717 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/ur.js @@ -0,0 +1 @@ +!function(i){const n=i.ur=i.ur||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"خانہ اقتباس"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uz.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uz.js new file mode 100644 index 0000000..af1a4af --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/uz.js @@ -0,0 +1 @@ +!function(i){const o=i.uz=i.uz||{};o.dictionary=Object.assign(o.dictionary||{},{"Block quote":"Iqtibos"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/vi.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/vi.js new file mode 100644 index 0000000..0593468 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/vi.js @@ -0,0 +1 @@ +!function(i){const n=i.vi=i.vi||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"Trích dẫn"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js new file mode 100644 index 0000000..8e83d4b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh-cn.js @@ -0,0 +1 @@ +!function(n){const c=n["zh-cn"]=n["zh-cn"]||{};c.dictionary=Object.assign(c.dictionary||{},{"Block quote":"块引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh.js b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh.js new file mode 100644 index 0000000..0877dc5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/build/translations/zh.js @@ -0,0 +1 @@ +!function(i){const n=i.zh=i.zh||{};n.dictionary=Object.assign(n.dictionary||{},{"Block quote":"段落引用"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json new file mode 100644 index 0000000..6668d46 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/ckeditor5-metadata.json @@ -0,0 +1,23 @@ +{ + "plugins": [ + { + "name": "Block quote", + "className": "BlockQuote", + "description": "Implements the block quote support to easily include quotations and passages in the rich-text content.", + "docs": "features/block-quote.html", + "path": "src/blockquote.js", + "uiComponents": [ + { + "type": "Button", + "name": "blockQuote", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/quote.svg" + } + ], + "htmlOutput": [ + { + "elements": "blockquote" + } + ] + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/contexts.json b/node_modules/@ckeditor/ckeditor5-block-quote/lang/contexts.json new file mode 100644 index 0000000..163affa --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/contexts.json @@ -0,0 +1,3 @@ +{ + "Block quote": "Toolbar button tooltip for the Block quote feature." +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/af.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/af.po new file mode 100644 index 0000000..3103dc6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/af.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://app.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Verwysingsaanhaling" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po new file mode 100644 index 0000000..d4b47f7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ar.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "اقتباس" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/az.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/az.po new file mode 100644 index 0000000..f7aada9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/az.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Sitat bloku" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po new file mode 100644 index 0000000..d0fce37 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bg.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитат" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po new file mode 100644 index 0000000..eb6c91a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ব্লক কোট" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po new file mode 100644 index 0000000..434f98d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/bs.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://app.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po new file mode 100644 index 0000000..14f3999 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ca.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloc" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po new file mode 100644 index 0000000..768fc20 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/cs.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citace" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/da.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/da.po new file mode 100644 index 0000000..9167145 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/da.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blot citat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po new file mode 100644 index 0000000..438580c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de-ch.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockzitat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de.po new file mode 100644 index 0000000..38a92d4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/de.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockzitat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/el.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/el.po new file mode 100644 index 0000000..fd23cff --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/el.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Περιοχή παράθεσης" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po new file mode 100644 index 0000000..2daa3d8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-au.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po new file mode 100644 index 0000000..8a3acc7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en-gb.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en.po new file mode 100644 index 0000000..17bbb20 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/en.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po new file mode 100644 index 0000000..3ec1e1a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es-co.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es.po new file mode 100644 index 0000000..f898563 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/es.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloque de cita" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/et.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/et.po new file mode 100644 index 0000000..763ff9a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/et.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Tsitaat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po new file mode 100644 index 0000000..30d8797 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/eu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://app.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Aipua" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po new file mode 100644 index 0000000..9919ff2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fa.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr " بلوک نقل قول" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po new file mode 100644 index 0000000..a43e53b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Lainaus" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po new file mode 100644 index 0000000..9710d7b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/fr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citation" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po new file mode 100644 index 0000000..a25dc18 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cita de bloque" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po new file mode 100644 index 0000000..1fd205b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/gu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Gujarati (https://app.transifex.com/ckeditor/teams/11143/gu/)\n" +"Language: gu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr " વિચાર ટાંકો" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/he.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/he.po new file mode 100644 index 0000000..de0f3e1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/he.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "בלוק ציטוט" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po new file mode 100644 index 0000000..2b56158 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Block quote" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po new file mode 100644 index 0000000..01d579a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok citat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po new file mode 100644 index 0000000..40fc0dd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/hu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Idézet" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/id.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/id.po new file mode 100644 index 0000000..27c9bb3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/id.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Kutipan" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/it.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/it.po new file mode 100644 index 0000000..8737841 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/it.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blocco citazione" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po new file mode 100644 index 0000000..7958657 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ja.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ブロッククオート(引用)" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/km.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/km.po new file mode 100644 index 0000000..adef2e6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/km.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://app.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ប្លុក​ពាក្យ​សម្រង់" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po new file mode 100644 index 0000000..05eddd9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/kn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://app.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "‍‍‍‍ಗುರುತಿಸಲಾದ ‍‍ಉಲ್ಲೇಖ" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po new file mode 100644 index 0000000..b7f51b6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ko.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "인용 단락" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po new file mode 100644 index 0000000..c0ab93c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ku.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "وتەی وەرگیراو" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po new file mode 100644 index 0000000..857f45a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citata" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po new file mode 100644 index 0000000..68b8707 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/lv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citāts" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po new file mode 100644 index 0000000..703bf83 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ms.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok petikan" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po new file mode 100644 index 0000000..be64e8a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nb.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokksitat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po new file mode 100644 index 0000000..0681f80 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ne.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "ब्लक उद्धरण" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po new file mode 100644 index 0000000..96d891b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/nl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blok citaat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/no.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/no.po new file mode 100644 index 0000000..5eda198 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/no.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokksitat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po new file mode 100644 index 0000000..a9a2abf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Cytat blokowy" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po new file mode 100644 index 0000000..92ae869 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt-br.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloco de citação" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po new file mode 100644 index 0000000..c4c0db1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/pt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloco de citação" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po new file mode 100644 index 0000000..441fcc2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ro.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Bloc citat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po new file mode 100644 index 0000000..4a4025b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ru.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитата" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po new file mode 100644 index 0000000..63239f4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citát" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po new file mode 100644 index 0000000..a451015 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://app.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blokiraj citat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po new file mode 100644 index 0000000..a745b3c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sq.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Thonjëzat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po new file mode 100644 index 0000000..6067dba --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr-latn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Citat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po new file mode 100644 index 0000000..d0b5be4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитат" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po new file mode 100644 index 0000000..48ba49c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/sv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Blockcitat" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/th.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/th.po new file mode 100644 index 0000000..fd3b721 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/th.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "คำพูดบล็อก" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po new file mode 100644 index 0000000..0fa386a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Sitata blokirläň" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po new file mode 100644 index 0000000..caba274 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/tr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Alıntı" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po new file mode 100644 index 0000000..5816d3f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ug.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "نەقىل" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po new file mode 100644 index 0000000..329193c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Цитата" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po new file mode 100644 index 0000000..9e471e0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/ur.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "خانہ اقتباس" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po new file mode 100644 index 0000000..f7f4045 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/uz.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Iqtibos" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po new file mode 100644 index 0000000..e229468 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/vi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "Trích dẫn" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po new file mode 100644 index 0000000..461cc95 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh-cn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "块引用" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po new file mode 100644 index 0000000..9b496b3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/lang/translations/zh.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Block quote feature." +msgid "Block quote" +msgstr "段落引用" diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/package.json b/node_modules/@ckeditor/ckeditor5-block-quote/package.json new file mode 100644 index 0000000..6eeb093 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/package.json @@ -0,0 +1,37 @@ +{ + "name": "@ckeditor/ckeditor5-block-quote", + "version": "41.3.1", + "description": "Block quote feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "ckeditor5": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-block-quote" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "build", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.d.ts new file mode 100644 index 0000000..cad633e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.d.ts @@ -0,0 +1,15 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { BlockQuote, BlockQuoteCommand, BlockQuoteEditing, BlockQuoteUI } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface PluginsMap { + [BlockQuote.pluginName]: BlockQuote; + [BlockQuoteEditing.pluginName]: BlockQuoteEditing; + [BlockQuoteUI.pluginName]: BlockQuoteUI; + } + interface CommandsMap { + blockQuote: BlockQuoteCommand; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.d.ts b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.d.ts new file mode 100644 index 0000000..487ca1b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.d.ts @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquote + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import BlockQuoteEditing from './blockquoteediting.js'; +import BlockQuoteUI from './blockquoteui.js'; +/** + * The block quote plugin. + * + * For more information about this feature check the {@glink api/block-quote package page}. + * + * This is a "glue" plugin which loads the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature} + * and {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuote extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof BlockQuoteEditing, typeof BlockQuoteUI]; + /** + * @inheritDoc + */ + static get pluginName(): "BlockQuote"; +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js new file mode 100644 index 0000000..b442a78 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquote.js @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquote + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import BlockQuoteEditing from './blockquoteediting.js'; +import BlockQuoteUI from './blockquoteui.js'; +/** + * The block quote plugin. + * + * For more information about this feature check the {@glink api/block-quote package page}. + * + * This is a "glue" plugin which loads the {@link module:block-quote/blockquoteediting~BlockQuoteEditing block quote editing feature} + * and {@link module:block-quote/blockquoteui~BlockQuoteUI block quote UI feature}. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuote extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [BlockQuoteEditing, BlockQuoteUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockQuote'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.d.ts b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.d.ts new file mode 100644 index 0000000..8b13e13 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.d.ts @@ -0,0 +1,61 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquotecommand + */ +import { Command } from 'ckeditor5/src/core.js'; +/** + * The block quote command plugin. + * + * @extends module:core/command~Command + */ +export default class BlockQuoteCommand extends Command { + /** + * Whether the selection starts in a block quote. + * + * @observable + * @readonly + */ + value: boolean; + /** + * @inheritDoc + */ + refresh(): void; + /** + * Executes the command. When the command {@link #value is on}, all top-most block quotes within + * the selection will be removed. If it is off, all selected blocks will be wrapped with + * a block quote. + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, + * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. + */ + execute(options?: { + forceValue?: boolean; + }): void; + /** + * Checks the command's {@link #value}. + */ + private _getValue; + /** + * Checks whether the command can be enabled in the current context. + * + * @returns Whether the command should be enabled. + */ + private _checkEnabled; + /** + * Removes the quote from given blocks. + * + * If blocks which are supposed to be "unquoted" are in the middle of a quote, + * start it or end it, then the quote will be split (if needed) and the blocks + * will be moved out of it, so other quoted blocks remained quoted. + */ + private _removeQuote; + /** + * Applies the quote to given blocks. + */ + private _applyQuote; +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js new file mode 100644 index 0000000..6af531e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquotecommand.js @@ -0,0 +1,172 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquotecommand + */ +import { Command } from 'ckeditor5/src/core.js'; +import { first } from 'ckeditor5/src/utils.js'; +/** + * The block quote command plugin. + * + * @extends module:core/command~Command + */ +export default class BlockQuoteCommand extends Command { + /** + * @inheritDoc + */ + refresh() { + this.value = this._getValue(); + this.isEnabled = this._checkEnabled(); + } + /** + * Executes the command. When the command {@link #value is on}, all top-most block quotes within + * the selection will be removed. If it is off, all selected blocks will be wrapped with + * a block quote. + * + * @fires execute + * @param options Command options. + * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, + * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. + */ + execute(options = {}) { + const model = this.editor.model; + const schema = model.schema; + const selection = model.document.selection; + const blocks = Array.from(selection.getSelectedBlocks()); + const value = (options.forceValue === undefined) ? !this.value : options.forceValue; + model.change(writer => { + if (!value) { + this._removeQuote(writer, blocks.filter(findQuote)); + } + else { + const blocksToQuote = blocks.filter(block => { + // Already quoted blocks needs to be considered while quoting too + // in order to reuse their elements. + return findQuote(block) || checkCanBeQuoted(schema, block); + }); + this._applyQuote(writer, blocksToQuote); + } + }); + } + /** + * Checks the command's {@link #value}. + */ + _getValue() { + const selection = this.editor.model.document.selection; + const firstBlock = first(selection.getSelectedBlocks()); + // In the current implementation, the block quote must be an immediate parent of a block element. + return !!(firstBlock && findQuote(firstBlock)); + } + /** + * Checks whether the command can be enabled in the current context. + * + * @returns Whether the command should be enabled. + */ + _checkEnabled() { + if (this.value) { + return true; + } + const selection = this.editor.model.document.selection; + const schema = this.editor.model.schema; + const firstBlock = first(selection.getSelectedBlocks()); + if (!firstBlock) { + return false; + } + return checkCanBeQuoted(schema, firstBlock); + } + /** + * Removes the quote from given blocks. + * + * If blocks which are supposed to be "unquoted" are in the middle of a quote, + * start it or end it, then the quote will be split (if needed) and the blocks + * will be moved out of it, so other quoted blocks remained quoted. + */ + _removeQuote(writer, blocks) { + // Unquote all groups of block. Iterate in the reverse order to not break following ranges. + getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => { + if (groupRange.start.isAtStart && groupRange.end.isAtEnd) { + writer.unwrap(groupRange.start.parent); + return; + } + // The group of blocks are at the beginning of an so let's move them left (out of the ). + if (groupRange.start.isAtStart) { + const positionBefore = writer.createPositionBefore(groupRange.start.parent); + writer.move(groupRange, positionBefore); + return; + } + // The blocks are in the middle of an so we need to split the after the last block + // so we move the items there. + if (!groupRange.end.isAtEnd) { + writer.split(groupRange.end); + } + // Now we are sure that groupRange.end.isAtEnd is true, so let's move the blocks right. + const positionAfter = writer.createPositionAfter(groupRange.end.parent); + writer.move(groupRange, positionAfter); + }); + } + /** + * Applies the quote to given blocks. + */ + _applyQuote(writer, blocks) { + const quotesToMerge = []; + // Quote all groups of block. Iterate in the reverse order to not break following ranges. + getRangesOfBlockGroups(writer, blocks).reverse().forEach(groupRange => { + let quote = findQuote(groupRange.start); + if (!quote) { + quote = writer.createElement('blockQuote'); + writer.wrap(groupRange, quote); + } + quotesToMerge.push(quote); + }); + // Merge subsequent elements. Reverse the order again because this time we want to go through + // the elements in the source order (due to how merge works – it moves the right element's content + // to the first element and removes the right one. Since we may need to merge a couple of subsequent `` elements + // we want to keep the reference to the first (furthest left) one. + quotesToMerge.reverse().reduce((currentQuote, nextQuote) => { + if (currentQuote.nextSibling == nextQuote) { + writer.merge(writer.createPositionAfter(currentQuote)); + return currentQuote; + } + return nextQuote; + }); + } +} +function findQuote(elementOrPosition) { + return elementOrPosition.parent.name == 'blockQuote' ? elementOrPosition.parent : null; +} +/** + * Returns a minimal array of ranges containing groups of subsequent blocks. + * + * content: abcdefgh + * blocks: [ a, b, d, f, g, h ] + * output ranges: [ab]c[d]e[fgh] + */ +function getRangesOfBlockGroups(writer, blocks) { + let startPosition; + let i = 0; + const ranges = []; + while (i < blocks.length) { + const block = blocks[i]; + const nextBlock = blocks[i + 1]; + if (!startPosition) { + startPosition = writer.createPositionBefore(block); + } + if (!nextBlock || block.nextSibling != nextBlock) { + ranges.push(writer.createRange(startPosition, writer.createPositionAfter(block))); + startPosition = null; + } + i++; + } + return ranges; +} +/** + * Checks whether can wrap the block. + */ +function checkCanBeQuoted(schema, block) { + // TMP will be replaced with schema.checkWrap(). + const isBQAllowed = schema.checkChild(block.parent, 'blockQuote'); + const isBlockAllowedInBQ = schema.checkChild(['$root', 'blockQuote'], block); + return isBQAllowed && isBlockAllowedInBQ; +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.d.ts b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.d.ts new file mode 100644 index 0000000..ac83c81 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.d.ts @@ -0,0 +1,31 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquoteediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { Enter } from 'ckeditor5/src/enter.js'; +import { Delete } from 'ckeditor5/src/typing.js'; +/** + * The block quote editing. + * + * Introduces the `'blockQuote'` command and the `'blockQuote'` model element. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "BlockQuoteEditing"; + /** + * @inheritDoc + */ + static get requires(): readonly [typeof Enter, typeof Delete]; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js new file mode 100644 index 0000000..f6031b6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteediting.js @@ -0,0 +1,118 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquoteediting + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import { Enter } from 'ckeditor5/src/enter.js'; +import { Delete } from 'ckeditor5/src/typing.js'; +import BlockQuoteCommand from './blockquotecommand.js'; +/** + * The block quote editing. + * + * Introduces the `'blockQuote'` command and the `'blockQuote'` model element. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteEditing extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockQuoteEditing'; + } + /** + * @inheritDoc + */ + static get requires() { + return [Enter, Delete]; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const schema = editor.model.schema; + editor.commands.add('blockQuote', new BlockQuoteCommand(editor)); + schema.register('blockQuote', { + inheritAllFrom: '$container' + }); + editor.conversion.elementToElement({ model: 'blockQuote', view: 'blockquote' }); + // Postfixer which cleans incorrect model states connected with block quotes. + editor.model.document.registerPostFixer(writer => { + const changes = editor.model.document.differ.getChanges(); + for (const entry of changes) { + if (entry.type == 'insert') { + const element = entry.position.nodeAfter; + if (!element) { + // We are inside a text node. + continue; + } + if (element.is('element', 'blockQuote') && element.isEmpty) { + // Added an empty blockQuote - remove it. + writer.remove(element); + return true; + } + else if (element.is('element', 'blockQuote') && !schema.checkChild(entry.position, element)) { + // Added a blockQuote in incorrect place. Unwrap it so the content inside is not lost. + writer.unwrap(element); + return true; + } + else if (element.is('element')) { + // Just added an element. Check that all children meet the scheme rules. + const range = writer.createRangeIn(element); + for (const child of range.getItems()) { + if (child.is('element', 'blockQuote') && + !schema.checkChild(writer.createPositionBefore(child), child)) { + writer.unwrap(child); + return true; + } + } + } + } + else if (entry.type == 'remove') { + const parent = entry.position.parent; + if (parent.is('element', 'blockQuote') && parent.isEmpty) { + // Something got removed and now blockQuote is empty. Remove the blockQuote as well. + writer.remove(parent); + return true; + } + } + } + return false; + }); + const viewDocument = this.editor.editing.view.document; + const selection = editor.model.document.selection; + const blockQuoteCommand = editor.commands.get('blockQuote'); + // Overwrite default Enter key behavior. + // If Enter key is pressed with selection collapsed in empty block inside a quote, break the quote. + this.listenTo(viewDocument, 'enter', (evt, data) => { + if (!selection.isCollapsed || !blockQuoteCommand.value) { + return; + } + const positionParent = selection.getLastPosition().parent; + if (positionParent.isEmpty) { + editor.execute('blockQuote'); + editor.editing.view.scrollToTheSelection(); + data.preventDefault(); + evt.stop(); + } + }, { context: 'blockquote' }); + // Overwrite default Backspace key behavior. + // If Backspace key is pressed with selection collapsed in first empty block inside a quote, break the quote. + this.listenTo(viewDocument, 'delete', (evt, data) => { + if (data.direction != 'backward' || !selection.isCollapsed || !blockQuoteCommand.value) { + return; + } + const positionParent = selection.getLastPosition().parent; + if (positionParent.isEmpty && !positionParent.previousSibling) { + editor.execute('blockQuote'); + editor.editing.view.scrollToTheSelection(); + data.preventDefault(); + evt.stop(); + } + }, { context: 'blockquote' }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.d.ts b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.d.ts new file mode 100644 index 0000000..940963f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.d.ts @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquoteui + */ +import { Plugin } from 'ckeditor5/src/core.js'; +import '../theme/blockquote.css'; +/** + * The block quote UI plugin. + * + * It introduces the `'blockQuote'` button. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "BlockQuoteUI"; + /** + * @inheritDoc + */ + init(): void; + /** + * Creates a button for block quote command to use either in toolbar or in menu bar. + */ + private _createButton; +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js new file mode 100644 index 0000000..e0111ac --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/blockquoteui.js @@ -0,0 +1,64 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote/blockquoteui + */ +import { Plugin, icons } from 'ckeditor5/src/core.js'; +import { ButtonView, MenuBarMenuListItemButtonView } from 'ckeditor5/src/ui.js'; +import '../theme/blockquote.css'; +/** + * The block quote UI plugin. + * + * It introduces the `'blockQuote'` button. + * + * @extends module:core/plugin~Plugin + */ +export default class BlockQuoteUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockQuoteUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const command = editor.commands.get('blockQuote'); + editor.ui.componentFactory.add('blockQuote', () => { + const buttonView = this._createButton(ButtonView); + buttonView.set({ + tooltip: true + }); + // Bind button model to command. + buttonView.bind('isOn').to(command, 'value'); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:blockQuote', () => this._createButton(MenuBarMenuListItemButtonView)); + } + /** + * Creates a button for block quote command to use either in toolbar or in menu bar. + */ + _createButton(ButtonClass) { + const editor = this.editor; + const locale = editor.locale; + const command = editor.commands.get('blockQuote'); + const view = new ButtonClass(editor.locale); + const t = locale.t; + view.set({ + label: t('Block quote'), + icon: icons.quote, + isToggleable: true + }); + view.bind('isEnabled').to(command, 'isEnabled'); + // Execute the command. + this.listenTo(view, 'execute', () => { + editor.execute('blockQuote'); + editor.editing.view.focus(); + }); + return view; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-block-quote/src/index.d.ts new file mode 100644 index 0000000..4e16385 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/index.d.ts @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote + */ +export { default as BlockQuote } from './blockquote.js'; +export { default as BlockQuoteEditing } from './blockquoteediting.js'; +export { default as BlockQuoteUI } from './blockquoteui.js'; +export type { default as BlockQuoteCommand } from './blockquotecommand.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/src/index.js b/node_modules/@ckeditor/ckeditor5-block-quote/src/index.js new file mode 100644 index 0000000..418b5fa --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/src/index.js @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module block-quote + */ +export { default as BlockQuote } from './blockquote.js'; +export { default as BlockQuoteEditing } from './blockquoteediting.js'; +export { default as BlockQuoteUI } from './blockquoteui.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css b/node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css new file mode 100644 index 0000000..e456acb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-block-quote/theme/blockquote.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content blockquote { + /* See #12 */ + overflow: hidden; + + /* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */ + padding-right: 1.5em; + padding-left: 1.5em; + + margin-left: 0; + margin-right: 0; + font-style: italic; + border-left: solid 5px hsl(0, 0%, 80%); +} + +.ck-content[dir="rtl"] blockquote { + border-left: 0; + border-right: solid 5px hsl(0, 0%, 80%); +} diff --git a/node_modules/@ckeditor/ckeditor5-build-classic/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-build-classic/CHANGELOG.md new file mode 100644 index 0000000..0ad3bec --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-build-classic/CHANGELOG.md @@ -0,0 +1,1058 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v18.0.0...v19.0.0) (April 29, 2020) + +We are happy to announce the release of CKEditor 5 v19.0.0. + +Refer to the [main changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v19.0.0) to find out about all the new features, improvements and possible breaking changes. + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v19.0.0-with-table-enhancements-improved-performance-and-select-all-feature/ + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-select-all](https://www.npmjs.com/package/@ckeditor/ckeditor5-select-all): [v19.0.0](https://github.com/ckeditor/ckeditor5-select-all/releases/tag/v19.0.0) + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v19.0.0) + +Major releases (contain minor breaking changes): + +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v19.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v19.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v18.0.0 => [v19.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v19.0.0) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v17.0.0...v18.0.0) (March 19, 2020) + +We are happy to announce the release of CKEditor 5 v18.0.0. + +Refer to the [main changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v18.0.0) to find out about all the new features, improvements and possible breaking changes. + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v18.0.0-with-custom-table-selection-and-pasting-nested-lists-from-Word/ + +### Features + +Besides new features introduced by the dependencies, this version also introduces the following features: + +* Added the [Automatic text transformation](https://ckeditor.com/docs/ckeditor5/latest/features/text-transformation.html) feature to the build. See [ckeditor/ckeditor5#6304](https://github.com/ckeditor/ckeditor5/issues/6304). ([af021aa](https://github.com/ckeditor/ckeditor5-build-classic/commit/af021aa)) + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v18.0.0) + +Major releases (contain minor breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v18.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v18.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v17.0.0 => [v18.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v18.0.0) + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v16.0.0...v17.0.0) (February 19, 2020) + +We are happy to announce the release of CKEditor 5 v17.0.0. + +Refer to the [main changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v17.0.0) to find out about all the new features, improvements and possible breaking changes. + +https://ckeditor.com/blog/CKEditor-5-v17.0.0-with-table-styles-special-characters-and-performance-improvements/ + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v17.0.0) + +Major releases (contain minor breaking changes): + +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v17.0.0) + +Releases containing new features: + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v17.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v17.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v16.0.0 => [v17.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v17.0.0) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v15.0.0...v16.0.0) (December 4, 2019) + +We are happy to announce the release of CKEditor 5 v16.0.0. This release introduces one of the most community-requested features: [code blocks](https://ckeditor.com/docs/ckeditor5/latest/features/code-blocks.html). We included a new [restricted editing](https://ckeditor.com/docs/ckeditor5/latest/features/restricted-editing.html) plugin, too. + +We also did some changes in the default UI colors to improve accessibility. In addition to that, as always, the release contains many [more improvements and bug fixes](https://github.com/ckeditor/ckeditor5/issues?q=is%3Aissue+milestone%3A%22iteration+28%22+is%3Aclosed+-label%3Atype%3Adocs+-label%3Atype%3Atask+-label%3Apackage%3Arestricted-editing+-label%3Apackage%3Acode-block+-label%3Atype%3Afeature). + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v16.0.0-with-code-blocks-and-restricted-editing/ + +### Other changes + +* Replaced UglifyJS with Terser. See [ckeditor/ckeditor5#1353](https://github.com/ckeditor/ckeditor5/issues/1353). ([6d387bd](https://github.com/ckeditor/ckeditor5-build-classic/commit/6d387bd)) + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v16.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v16.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v15.0.0 => [v16.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v16.0.0) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v12.4.0...v15.0.0) (October 23, 2019) + +We are happy to announce the release of CKEditor 5 v15.0.0. This editor version introduces support for inserting [horizontal lines](https://ckeditor.com/docs/ckeditor5/latest/features/horizontal-line.html), [page breaks](https://ckeditor.com/docs/ckeditor5/latest/features/page-break.html) and [SVG images](https://ckeditor.com/docs/ckeditor5/latest/api/module_image_imageupload-ImageUploadConfig.html#member-types) into the WYSIWYG editor. It also allows you to define the [document title section](https://ckeditor.com/docs/ckeditor5/latest/features/title.html) thanks to the new title plugin. The editor toolbar is now responsive which improves the UX, especially for mobile devices. + +Regarding the build itself, we added the [list indentation](https://ckeditor.com/docs/ckeditor5/latest/features/indent.html#indenting-lists) button to the build's default setup. See [ckeditor/ckeditor5#1844](https://github.com/ckeditor/ckeditor5/issues/1844). ([5dc1e87](https://github.com/ckeditor/ckeditor5-build-classic/commit/5dc1e87)) + +In other news, we changed the versioning policy. Now, all packages will have the same major version, hence, we needed to release this one as v15.0.0 (we skipped versions 13.0.0 and 14.0.0). Read more about the [new versioning policy](https://ckeditor.com/docs/ckeditor5/latest/updating/versioning-policy.html). + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v15.0.0-with-horizontal-line-page-break-responsive-toolbar-and-SVG-upload-support/ + +### Dependencies + +Major releases (contain major breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v15.0.0) + +Major releases (dependencies of those packages have breaking changes): + +* [@ckeditor/ckeditor-cloud-services-core](https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core): v3.0.1 => [v15.0.0](https://github.com/ckeditor/ckeditor-cloud-services-core/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.4 => [v15.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.3 => [v15.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v12.0.2 => [v15.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.3.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v12.1.4 => [v15.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-indent](https://www.npmjs.com/package/@ckeditor/ckeditor5-indent): v10.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-indent/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.1.2 => [v15.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.4 => [v15.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.1.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.2.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.2.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.5 => [v15.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v12.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v15.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v14.0.0 => [v15.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v15.0.0) + + +## [12.4.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v12.3.1...v12.4.0) (August 26, 2019) + +This release brings a huge set of new features: [image resizing](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/image.html#resizing-images), [to-do lists](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/todo-lists.html), [support for RTL languages](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/ui-language.html), [simple upload adapter](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/images/image-upload/simple-upload-adapter.html), [support for pasting from Google Docs](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/paste-from-office/paste-from-google-docs.html), [mathematic formulas](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/mathtype.html), and [spelling and grammar checking](https://ckeditor.com/ckeditor5/build/docs/ckeditor5/latest/features/spell-checker.html). In addition to that, as always, it contains many improvements and bug fixes. + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.2.1 => [v14.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.1.2 => [v14.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v13.0.2 => [v14.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v13.0.2 => [v14.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.1.1 => [v12.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v13.0.1 => [v14.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v14.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.2.1 => [v12.3.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.3.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.4 => [v11.1.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.4 => [v12.1.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.4 => [v11.1.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.1.1 => [v14.2.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.2.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.1.1 => [v12.2.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.2.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.4 => [v11.1.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.3 => [v11.1.4](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.4) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.2 => [v11.1.3](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.3) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v12.0.1 => [v12.0.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v12.0.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v12.1.3 => [v12.1.4](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v12.1.4) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.3 => [v11.1.4](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.4) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.5) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.4 => [v11.0.5](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.5) + +### Other changes + +* Bumped style-loader to v1.0.0. Aligned the webpack configuration to the new loader API. See [ckeditor/ckeditor5#1945](https://github.com/ckeditor/ckeditor5/issues/1945). ([9e69c1e](https://github.com/ckeditor/ckeditor5-build-classic/commit/9e69c1e)) +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([8b4af5d](https://github.com/ckeditor/ckeditor5-build-classic/commit/8b4af5d)) + + +## [12.3.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v12.3.0...v12.3.1) (July 10, 2019) + +We are happy to report the release of CKEditor 5 v12.3.0 (and v12.3.1 with a small fix). This release introduces several new features ([word count](https://ckeditor.com/docs/ckeditor5/latest/features/word-count.html), [automatic text transformations](https://ckeditor.com/docs/ckeditor5/latest/features/text-transformation.html), [ability to control link attributes such as `target`](https://ckeditor.com/docs/ckeditor5/latest/features/link.html#custom-link-attributes-decorators) and [block indentation](https://ckeditor.com/docs/ckeditor5/latest/features/indent.html)). It also brings improvements to existing features (like the ["document colors" section](https://ckeditor.com/docs/ckeditor5/latest/features/font.html#documents-colors) in the font color picker dropdowns) and many bug fixes. + +### Dependencies + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.2 => [v11.1.3](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.3) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.2.0 => [v12.2.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.2.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v12.1.2 => [v12.1.3](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v12.1.3) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.2.0 => [v13.2.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.2.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.1.1 => [v13.1.2](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.1.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.3 => [v12.0.4](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.4) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.2 => [v11.1.3](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.3) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v13.0.1 => [v13.0.2](https://github.com/ckeditor/ckeditor5-table/releases/tag/v13.0.2) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.1.0 => [v14.1.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.1.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v13.0.1 => [v13.0.2](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v13.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.4) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.3 => [v11.0.4](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.4) + + +## [12.3.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v12.2.0...v12.3.0) (July 4, 2019) + +We are happy to report the release of CKEditor 5 v12.3.0. This release introduces several new features ([word count](https://ckeditor.com/docs/ckeditor5/latest/features/word-count.html), [automatic text transformations](https://ckeditor.com/docs/ckeditor5/latest/features/text-transformation.html), [ability to control link attributes such as `target`](https://ckeditor.com/docs/ckeditor5/latest/features/link.html#custom-link-attributes-decorators) and [block indentation](https://ckeditor.com/docs/ckeditor5/latest/features/indent.html)). It also brings improvements to existing features (like the ["document colors" section](https://ckeditor.com/docs/ckeditor5/latest/features/font.html#documents-colors) in the font color picker dropdowns) and many bug fixes. + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v11.0.2 => [v12.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v12.1.1 => [v13.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v13.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.1.1 => [v12.2.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.2.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.1.1 => [v13.2.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.2.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.0.2 => [v11.1.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v14.0.0 => [v14.1.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.1.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.0.2 => [v12.1.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.0.2 => [v11.1.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v12.1.1 => [v12.1.2](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v12.1.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.1.0 => [v13.1.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.1.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.2 => [v12.0.3](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.3) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.1 => [v11.1.2](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-table/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.3) + + +## [12.2.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v12.1.0...v12.2.0) (June 6, 2019) + +We are happy to report the release of CKEditor 5 v12.2.0. This is a minor release with many bug fixes and a new UI feature which allows to navigating between multiple balloons. + +**Note:** The `config.table.toolbar` property that had been deprecated last year has now been completely removed. Use [`config.table.contentToolbar`](https://ckeditor.com/docs/ckeditor5/latest/api/module_table_table-TableConfig.html#member-contentToolbar) instead. + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v12.0.1 => [v13.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v13.0.1 => [v14.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v14.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v12.1.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v13.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.0.1 => [v11.1.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.0.1 => [v13.1.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.1.0 => [v13.1.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.1.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.1 => [v12.0.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.2) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.1.0 => [v11.1.1](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.0.1 => [v12.0.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v12.1.0 => [v12.1.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v12.1.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.2) + + +## [12.1.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v12.0.0...v12.1.0) (April 4, 2019) + +We are happy to report the release of CKEditor 5 v12.1.0. This release introduces 3 new features ([mentions](https://ckeditor.com/docs/ckeditor5/latest/features/mentions.html), [font color and background color](https://ckeditor.com/docs/ckeditor5/latest/features/font.html) and [remove format](https://ckeditor.com/docs/ckeditor5/latest/features/remove-format.html)). + +Check out the linked guides for information how to install and configure those features in your editor. + +### Dependencies + +Minor releases: + +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v13.0.0 => [v13.1.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.1.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v12.1.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v12.0.0 => [v12.1.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v12.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-table/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v13.0.0 => [v13.0.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v13.0.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v12.0.0 => [v12.0.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.1) + + +## [12.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v11.2.0...v12.0.0) (February 28, 2019) + +We are happy to report the release of CKEditor 5 v12.0.0. This release introduces a new editor (called "[Balloon block editor](https://ckeditor.com/docs/ckeditor5/latest/examples/builds/balloon-block-editor.html)"), the [editor content placeholder](https://ckeditor.com/docs/ckeditor5/latest/features/editor-placeholder.html) and support for inline widgets (watch [this PR](https://github.com/ckeditor/ckeditor5/pull/1587) for updates). In addition to that we enabled media embeds and images in tables and resolved the issue where `editor.getData()` returned `

 

` for empty content (now it returns an empty string in this case). + +Besides new features, this release contains many improvements to stability, [performance](https://github.com/ckeditor/ckeditor5-utils/issues/269) and API. The last group of changes contain many breaking ones. Make sure to read the [main package's changelog](https://github.com/ckeditor/ckeditor5/releases/tag/v12.0.0). + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.1.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): v10.0.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.1.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v11.1.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v11.0.2 => [v12.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v12.0.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.3 => [v11.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.3 => [v11.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.1.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v12.0.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.3 => [v12.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): v10.0.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v11.0.1 => [v12.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v12.0.0 => [v13.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v13.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v11.0.2 => [v12.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v11.2.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.4 => [v11.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v11.1.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.3.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v11.0.0) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [11.2.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v11.1.1...v11.2.0) (December 5, 2018) + +We are happy to report the release of CKEditor 5 v11.2.0. This editor version brings the long-awaited [support for paste from Office](https://ckeditor.com/docs/ckeditor5/latest/features/paste-from-word.html) (for example, from Microsoft Word), [integration with CKFinder file manager](https://ckeditor.com/docs/ckeditor5/latest/features/ckfinder.html), improved [image upload documentation](https://ckeditor.com/docs/ckeditor5/latest/features/image-upload.html), improved [editor UI on mobile devices](https://github.com/ckeditor/ckeditor5/issues/416#issuecomment-430246472), as well as many smaller features and improvements. + +Blog post is coming soon... + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-ckfinder): [v10.0.0](https://github.com/ckeditor/ckeditor5-ckfinder/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-paste-from-office](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office): [v10.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/releases/tag/v10.0.0) + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v11.0.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v11.0.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v12.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v11.1.0 => [v12.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v12.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.3 => [v10.1.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v11.0.1 => [v11.1.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.4 => [v10.1.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-media-embed](https://www.npmjs.com/package/@ckeditor/ckeditor5-media-embed): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-media-embed/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v11.1.0 => [v11.2.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v11.2.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v11.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.2 => [v10.1.3](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.3) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.2 => [v10.1.3](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.3) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.2 => [v11.0.3](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.3) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-table/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.3.0 => [v10.3.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.3.1) + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v11.1.0...v11.1.1) (October 11, 2018) + +This releases fixes the README of this package on npm. + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v11.0.1...v11.1.0) (October 8, 2018) + +This is a minor release. Besides updating all used CKEditor 5 packages to their latest versions it brings two new features: the [Table](https://ckeditor.com/docs/ckeditor5/latest/features/table.html) and [Media embed](https://ckeditor.com/docs/ckeditor5/latest/features/media-embed.html) features which are now enabled in this build by default. + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v11.1.0-released/ + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v10.2.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v10.2.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-table](https://www.npmjs.com/package/@ckeditor/ckeditor5-table): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-table/releases/tag/v11.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.0.2 => [v10.1.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v11.0.0 => [v11.1.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v11.1.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.2.0 => [v10.3.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.3.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.1 => [v10.1.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.1 => [v10.1.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.3 => [v10.0.4](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.4) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.1 => [v11.0.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v10.2.1 => [v10.2.2](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.2.2) + +### Features + +Besides new features introduced by the dependencies, this version also introduces the following features: + +* Added the table and media embed features to the build. See [ckeditor/ckeditor5#1247](https://github.com/ckeditor/ckeditor5/issues/1247). ([01281a1](https://github.com/ckeditor/ckeditor5-build-classic/commit/01281a1)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v11.0.0...v11.0.1) (July 18, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v10.1.0...v11.0.0) (July 18, 2018) + +### Release notes + +This is a major releases that introduces many smaller features, dozens of bug fixes and a couple of infrastructure changes (an upgrade to `webpack@4`, simplified structure of the build repository). Additionally, the `ClassicEditor#element` property was renamed to `ClassicEditor#sourceElement` and the `ClassicEditor#updateElement()` method was renamed to `ClassicEditor#updateSourceElement()`. + +If you maintain a [custom build of CKEditor 5](https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/alternative-setups/custom-builds.html) or [integrate CKEditor 5 from source](https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/alternative-setups/integrating-from-source-webpack.html), we recommend reading the [migration guide](https://github.com/ckeditor/ckeditor5/issues/1136). + +Read more in the blog post: https://ckeditor.com/blog/CKEditor-5-v11.0.0-released/ + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v10.0.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v10.0.1 => [v11.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v11.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v10.1.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v11.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v10.2.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v10.2.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.2.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.1.0 => [v10.2.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.2.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.1.0 => [v10.1.1](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.2 => [v10.0.3](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.3) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v11.0.0 => [v11.0.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.2) + +### Other changes + +* Changed the structure of the build repository. Closes [ckeditor/ckeditor5#1038](https://github.com/ckeditor/ckeditor5/issues/1038). ([623c871](https://github.com/ckeditor/ckeditor5-build-classic/commit/623c871)) +* Updated `webpack` to version 4 (applies to custom builds only). ([9392b43](https://github.com/ckeditor/ckeditor5-build-classic/commit/9392b43)) + +### BREAKING CHANGES + +If you maintain a custom build, we recommend reading the [migration guide](https://github.com/ckeditor/ckeditor5/issues/1136). Closes [ckeditor/ckeditor5#1038](https://github.com/ckeditor/ckeditor5/issues/1038). + +* CKEditor 5 environment was updated to use `webpack@4`. `webpack@4` introduced major changes in its configuration and plugin system. CKEditor 5 tools and build configuration were updated to work with `webpack@4` and will not work with `webpack@3`. +* The structure of the build repository was changed. The `build-config.js` file was removed and the build configuration is now kept only in the `src/ckeditor.js` file. + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v10.0.1...v10.1.0) (June 21, 2018) + +This is a minor release that introduces many bug fixes and new features (most notable one is support for inserting soft breaks with Shift+Enter). + +You can read more in the [blog post](https://ckeditor.com/blog/CKEditor-5-v10.1.0-released/). + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v10.0.0 => [v11.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v11.0.0) + +Minor releases: + +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.1.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v10.0.0 => [v10.1.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.1.0) + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.1 => [v10.0.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v10.0.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.1) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v10.0.0...v10.0.1) (May 22, 2018) + +### Dependencies + +Patch releases (bug fixes, internal changes): + +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v10.0.0 => [v10.0.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.1) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-core/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-image/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-link/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-list/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v10.0.0) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-beta.4 => [v10.0.0](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v10.0.0) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([379c31f](https://github.com/ckeditor/ckeditor5-build-classic/commit/379c31f)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-build-classic/compare/v1.0.0-beta.3...v1.0.0-beta.4) (April 19, 2018) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-beta.4) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-beta.2 => [v1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-beta.4) + + +## [1.0.0-beta.3](https://github.com/ckeditor/ckeditor5-build-classic/compare/v1.0.0-beta.2...v1.0.0-beta.3) (April 10, 2018) + +### Note + +This release followed `v1.0.0-beta.2` immediately to fix the issue mentioned below. Therefore, when upgrading from `v1.0.0-beta.1` make sure to also check [`v1.0.0-beta.2` release notes](https://github.com/ckeditor/ckeditor5-build-classic/releases/tag/v1.0.0-beta.2). + +### Bug fixes + +* Translations should work when CKEditor was loaded using RequireJS. See [ckeditor/ckeditor5#914](https://github.com/ckeditor/ckeditor5/issues/914). ([16cba07](https://github.com/ckeditor/ckeditor5-build-classic/commit/16cba07)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-build-classic/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-cloud-services](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloud-services): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-cloud-services/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-beta.2) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-beta.1 => [v1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-beta.2) + +### Bug fixes + +Besides changes in the dependencies, this version also contains the following bug fixes: + +* Removed duplicated `ImageUpload` plugin. See [ckeditor/ckeditor5#909](https://github.com/ckeditor/ckeditor5/issues/909). ([8553d0f](https://github.com/ckeditor/ckeditor5-build-classic/commit/8553d0f)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Dependencies + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-cloudservices](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloudservices): v1.0.0-alpha.1 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-cloudservices/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-beta.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-alpha.2 => [v1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-beta.1) + +### Features + +Besides new features introduced by the dependencies, this version also introduces the following features: + +* Added the image upload button to the build. See [ckeditor/ckeditor5#870](https://github.com/ckeditor/ckeditor5/issues/870). ([f6cab12](https://github.com/ckeditor/ckeditor5-build-classic/commit/f6cab12)) + +### Other changes + +* Aligned build and `webpack.config.js` to the new Translation Service ([ckeditor/ckeditor5#624](https://github.com/ckeditor/ckeditor5/issues/624)). ([a349ffb](https://github.com/ckeditor/ckeditor5-build-classic/commit/a349ffb)) +* Changed the webpack configuration so the styles are processed using PostCSS instead of SASS (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([040b92f](https://github.com/ckeditor/ckeditor5-build-classic/commit/040b92f)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-build-classic.git/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-cloudservices](https://www.npmjs.com/package/@ckeditor/ckeditor5-cloudservices): [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-cloudservices/releases/tag/v1.0.0-alpha.1) + +Major releases (contain breaking changes): + +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-essentials](https://www.npmjs.com/package/@ckeditor/ckeditor5-essentials): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-essentials/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-alpha.2) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v1.0.0-alpha.1 => [v1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-alpha.2) + +### Bug fixes + +Besides changes in the dependencies, this version also contains the following bug fixes: + +* Build scripts will work on Windows. Closes [#26](https://github.com/ckeditor/ckeditor5-build-classic/issues/26). ([6c980fd](https://github.com/ckeditor/ckeditor5-build-classic/commit/6c980fd)) + +### Other changes + +* Optimized the bundle size (~10%) by enabling webpack's `ModuleConcatenationPlugin` plugin. Read more https://github.com/ckeditor/ckeditor5/issues/475. ([d25def7](https://github.com/ckeditor/ckeditor5-build-classic/commit/d25def7)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v0.4.0...v1.0.0-alpha.1) (October 3, 2017) + +### Dependencies + +New packages: + +* [@ckeditor/ckeditor5-easy-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-easy-image): [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-easy-image/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-adapter-ckfinder](https://www.npmjs.com/package/@ckeditor/ckeditor5-adapter-ckfinder): [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-adapter-ckfinder/releases/tag/v1.0.0-alpha.1) + +Major releases (possible breaking changes): + +* [@ckeditor/ckeditor5-autoformat](https://www.npmjs.com/package/@ckeditor/ckeditor5-autoformat): v0.1.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-autoformat/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-basic-styles](https://www.npmjs.com/package/@ckeditor/ckeditor5-basic-styles): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-basic-styles/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-block-quote](https://www.npmjs.com/package/@ckeditor/ckeditor5-block-quote): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-block-quote/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-clipboard](https://www.npmjs.com/package/@ckeditor/ckeditor5-clipboard): v0.7.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-clipboard/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-core](https://www.npmjs.com/package/@ckeditor/ckeditor5-core): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-core/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-editor-classic](https://www.npmjs.com/package/@ckeditor/ckeditor5-editor-classic): v0.8.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-editor-classic/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-engine](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine): v0.11.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-engine/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-enter](https://www.npmjs.com/package/@ckeditor/ckeditor5-enter): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-enter/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-heading](https://www.npmjs.com/package/@ckeditor/ckeditor5-heading): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-heading/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-image](https://www.npmjs.com/package/@ckeditor/ckeditor5-image): v0.7.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-image/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-link](https://www.npmjs.com/package/@ckeditor/ckeditor5-link): v0.8.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-link/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-list](https://www.npmjs.com/package/@ckeditor/ckeditor5-list): v0.7.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-list/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-paragraph](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-paragraph/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-theme-lark](https://www.npmjs.com/package/@ckeditor/ckeditor5-theme-lark): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-theme-lark/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-typing](https://www.npmjs.com/package/@ckeditor/ckeditor5-typing): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-typing/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-ui](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-ui/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-undo](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo): v0.9.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-undo/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-upload](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-upload/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils): v0.10.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-utils/releases/tag/v1.0.0-alpha.1) +* [@ckeditor/ckeditor5-widget](https://www.npmjs.com/package/@ckeditor/ckeditor5-widget): v0.2.0 => [v1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-widget/releases/tag/v1.0.0-alpha.1) + +### Bug fixes + +Besides changes in the dependencies, this build also contains these bug fixes: + +* It will be possible to configure toolbar offset without overriding pre-configured toolbar items. See [ckeditor/ckeditor5#572](https://github.com/ckeditor/ckeditor5/issues/572). ([e7fbda9](https://github.com/ckeditor/ckeditor5-build-classic/commit/e7fbda9)) + +### Features + +Besides new features introduced in the dependencies, this build also introduces these features: + +* Added Easy Image with Cloud Services and CKFinder adapter. See [ckeditor/ckeditor5#567](https://github.com/ckeditor/ckeditor5/issues/567). ([668691f](https://github.com/ckeditor/ckeditor5-build-classic/commit/668691f)) + + +## [0.4.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v0.3.0...v0.4.0) (September 7, 2017) + +### Other changes + +* The build now defines the editor as its default export. This makes requiring the build easier when using AMD, CJS or ES6 modules. See [ckeditor/ckeditor5#545](https://github.com/ckeditor/ckeditor5/issues/545). ([e5c7511](https://github.com/ckeditor/ckeditor5-build-classic/commit/e5c7511)) + +### BREAKING CHANGES + +* The build now defines a default export instead of named export. See [ckeditor/ckeditor5#545](https://github.com/ckeditor/ckeditor5/issues/545). + + +## [0.3.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v0.2.0...v0.3.0) (September 3, 2017) + +### Features + +* Support for building the editor in another language than `en`. Closes [#11](https://github.com/ckeditor/ckeditor5-build-classic/issues/11). ([f4233a5](https://github.com/ckeditor/ckeditor5-build-classic/commit/f4233a5)) + +### Other changes + +* Removed the compat-type of build. Closes [#20](https://github.com/ckeditor/ckeditor5-build-classic/issues/20). ([529a319](https://github.com/ckeditor/ckeditor5-build-classic/commit/529a319)) + + +## [0.2.0](https://github.com/ckeditor/ckeditor5-build-classic/compare/v0.1.1...v0.2.0) (May 7, 2017) + +### Bug fixes + +* CSS should be minified. Closes [#7](https://github.com/ckeditor/ckeditor5-build-classic/issues/7). ([ae2da32](https://github.com/ckeditor/ckeditor5-build-classic/commit/ae2da32)) + +### Features + +* Added the block quotes feature. Closes [#5](https://github.com/ckeditor/ckeditor5-build-classic/issues/5). ([ab5db32](https://github.com/ckeditor/ckeditor5-build-classic/commit/ab5db32)) + +### Other changes + +* Changed the order of buttons in the image toolbar. See https://github.com/ckeditor/ckeditor5-image/issues/60. ([131cbe7](https://github.com/ckeditor/ckeditor5-build-classic/commit/131cbe7)) +* Use the essentials preset instead of low level features like typing and enter. Closes [#9](https://github.com/ckeditor/ckeditor5-build-classic/issues/9). ([80314bf](https://github.com/ckeditor/ckeditor5-build-classic/commit/80314bf)) + + +## [0.1.1](https://github.com/ckeditor/ckeditor5-build-classic/compare/v0.1.0...v0.1.1) (April 6, 2017) + +### Other + +* Updated the bundles (the previous release contained an outdated bundles). ([0ac7b07](https://github.com/ckeditor/ckeditor5-build-classic/commit/0ac7b07)) + + +## 0.1.0 (April 5, 2017) + +### Features + +* Initial implementation. Closes [#1](https://github.com/ckeditor/ckeditor5-build-classic/issues/1). ([f88bc52](https://github.com/ckeditor/ckeditor5-build-classic/commit/f88bc52)) diff --git a/node_modules/@ckeditor/ckeditor5-build-classic/LICENSE.md b/node_modules/@ckeditor/ckeditor5-build-classic/LICENSE.md new file mode 100644 index 0000000..5c91102 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-build-classic/LICENSE.md @@ -0,0 +1,21 @@ +Software License Agreement +========================== + +**CKEditor 5 classic editor build** – https://github.com/ckeditor/ckeditor5-build-classic
+Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +The following libraries are included in CKEditor under the [MIT license](https://opensource.org/licenses/MIT): + +* Lodash - Copyright (c) JS Foundation and other contributors https://js.foundation/. Based on Underscore.js, copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors http://underscorejs.org/. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-build-classic/README.md b/node_modules/@ckeditor/ckeditor5-build-classic/README.md new file mode 100644 index 0000000..0f8f55a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-build-classic/README.md @@ -0,0 +1,70 @@ +CKEditor 5 classic editor build +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-build-classic.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-build-classic) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +The classic editor build for CKEditor 5. Read more about the [classic editor build](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/predefined-builds.html#classic-editor) and see the [demo](https://ckeditor.com/docs/ckeditor5/latest/examples/builds/classic-editor.html). + +![CKEditor 5 classic editor build screenshot](https://c.cksource.com/a/1/img/npm/ckeditor5-build-classic.png) + +## Documentation + +See: + +* [Installation](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/quick-start.html) for how to install this package and what it contains. +* [Editor lifecycle](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/editor-lifecycle.html) for how to create an editor and interact with it. +* [Configuration](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/configuration.html) for how to configure the editor. +* [Creating custom builds](https://ckeditor.com/docs/ckeditor5/latest/installation/getting-started/quick-start.html#building-the-editor-from-source) for how to customize the build (configure and rebuild the editor bundle). + +## Quick start + +First, install the build from npm: + +```bash +npm install --save @ckeditor/ckeditor5-build-classic +``` + +And use it in your website: + +```html +
+

This is the editor content.

+
+ + +``` + +Or in your JavaScript application: + +```js +import ClassicEditor from '@ckeditor/ckeditor5-build-classic'; + +// Or using the CommonJS version: +// const ClassicEditor = require( '@ckeditor/ckeditor5-build-classic' ); + +ClassicEditor + .create( document.querySelector( '#editor' ) ) + .then( editor => { + window.editor = editor; + } ) + .catch( error => { + console.error( 'There was a problem initializing the editor.', error ); + } ); +``` + +**Note:** If you are planning to integrate CKEditor 5 deep into your application, it is actually more convenient and recommended to install and import the source modules directly (like it happens in `ckeditor.js`). Read more in the [Advanced setup guide](https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/alternative-setups/integrating-from-source-webpack.html). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.d.ts b/node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.d.ts new file mode 100644 index 0000000..01b53a5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.d.ts @@ -0,0 +1,39 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { ClassicEditor as ClassicEditorBase } from '@ckeditor/ckeditor5-editor-classic'; +import { Essentials } from '@ckeditor/ckeditor5-essentials'; +import { CKFinderUploadAdapter } from '@ckeditor/ckeditor5-adapter-ckfinder'; +import { Autoformat } from '@ckeditor/ckeditor5-autoformat'; +import { Bold, Italic } from '@ckeditor/ckeditor5-basic-styles'; +import { BlockQuote } from '@ckeditor/ckeditor5-block-quote'; +import { CKBox } from '@ckeditor/ckeditor5-ckbox'; +import { CKFinder } from '@ckeditor/ckeditor5-ckfinder'; +import { EasyImage } from '@ckeditor/ckeditor5-easy-image'; +import { Heading } from '@ckeditor/ckeditor5-heading'; +import { Image, ImageCaption, ImageStyle, ImageToolbar, ImageUpload, PictureEditing } from '@ckeditor/ckeditor5-image'; +import { Indent } from '@ckeditor/ckeditor5-indent'; +import { Link } from '@ckeditor/ckeditor5-link'; +import { List } from '@ckeditor/ckeditor5-list'; +import { MediaEmbed } from '@ckeditor/ckeditor5-media-embed'; +import { Paragraph } from '@ckeditor/ckeditor5-paragraph'; +import { PasteFromOffice } from '@ckeditor/ckeditor5-paste-from-office'; +import { Table, TableToolbar } from '@ckeditor/ckeditor5-table'; +import { TextTransformation } from '@ckeditor/ckeditor5-typing'; +import { CloudServices } from '@ckeditor/ckeditor5-cloud-services'; +export default class ClassicEditor extends ClassicEditorBase { + static builtinPlugins: (typeof TextTransformation | typeof Essentials | typeof CKFinderUploadAdapter | typeof Paragraph | typeof Heading | typeof Autoformat | typeof Bold | typeof Italic | typeof BlockQuote | typeof Image | typeof ImageCaption | typeof ImageStyle | typeof ImageToolbar | typeof ImageUpload | typeof CloudServices | typeof CKBox | typeof CKFinder | typeof EasyImage | typeof List | typeof Indent | typeof Link | typeof MediaEmbed | typeof PasteFromOffice | typeof Table | typeof TableToolbar | typeof PictureEditing)[]; + static defaultConfig: { + toolbar: { + items: string[]; + }; + image: { + toolbar: string[]; + }; + table: { + contentToolbar: string[]; + }; + language: string; + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js b/node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js new file mode 100644 index 0000000..aebe97d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js @@ -0,0 +1,7 @@ +!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require Fn)":"(may require Fn)","%0 of %1":"%0 of %1",Accept:"Accept",Accessibility:"Accessibility","Accessibility help":"Accessibility help","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",Aquamarine:"Aquamarine",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Below, you can find a list of keyboard shortcuts that can be used in the editor.",Black:"Black","Block quote":"Block quote",Blue:"Blue",Bold:"Bold","Bold text":"Bold text",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Cannot access default workspace.":"Cannot access default workspace.","Cannot determine a category for the uploaded file.":"Cannot determine a category for the uploaded file.","Cannot upload file:":"Cannot upload file:","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image","Cell properties":"Cell properties","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"Click to edit block",Close:"Close","Close contextual balloons, dropdowns, and dialogs":"Close contextual balloons, dropdowns, and dialogs",Code:"Code",Color:"Color","Color picker":"Color picker",Column:"Column","Content editing keystrokes":"Content editing keystrokes","Copy selected content":"Copy selected content","Could not insert image at the current position.":"Could not insert image at the current position.","Could not obtain resized image URL.":"Could not obtain resized image URL.","Create link":"Create link",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"Decrease list item indent","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc",Dotted:"Dotted",Double:"Double",Downloadable:"Downloadable","Drag to move":"Drag to move","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit image":"Edit image","Edit link":"Edit link","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"Editor dialog","Editor editing area: %0":"Editor editing area: %0","Editor menu bar":"Editor menu bar","Editor toolbar":"Editor toolbar","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.","Failed to determine category of edited image.":"Failed to determine category of edited image.","Full size image":"Full size image",Green:"Green",Grey:"Grey",Groove:"Groove","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Height:"Height","Help Contents. To close this dialog press ESC.":"Help Contents. To close this dialog press ESC.",HEX:"HEX","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Image from computer":"Image from computer","Image resize list":"Image resize list","Image toolbar":"Image toolbar","image widget":"image widget","In line":"In line","Increase indent":"Increase indent","Increase list item indent":"Increase list item indent",Insert:"Insert","Insert a hard break (a new paragraph)":"Insert a hard break (a new paragraph)","Insert a new paragraph directly after a widget":"Insert a new paragraph directly after a widget","Insert a new paragraph directly before a widget":"Insert a new paragraph directly before a widget","Insert a new table row (when in the last cell of a table)":"Insert a new table row (when in the last cell of a table)","Insert a soft break (a <br> element)":"Insert a soft break (a <br> element)","Insert column left":"Insert column left","Insert column right":"Insert column right","Insert image":"Insert image","Insert image via URL":"Insert image via URL","Insert image with file manager":"Insert image with file manager","Insert media":"Insert media","Insert paragraph after block":"Insert paragraph after block","Insert paragraph before block":"Insert paragraph before block","Insert row above":"Insert row above","Insert row below":"Insert row below","Insert table":"Insert table","Insert with file manager":"Insert with file manager","Inserting image failed":"Inserting image failed",Inset:"Inset","Invalid start index value.":"Invalid start index value.",Italic:"Italic","Italic text":"Italic text","Justify cell text":"Justify cell text","Keystrokes that can be used in a list":"Keystrokes that can be used in a list","Keystrokes that can be used in a table cell":"Keystrokes that can be used in a table cell","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"Keystrokes that can be used when a widget is selected (for example: image, table, etc.)","Left aligned image":"Left aligned image","Light blue":"Light blue","Light green":"Light green","Light grey":"Light grey",Link:"Link","Link image":"Link image","Link URL":"Link URL","List properties":"List properties","Lower-latin":"Lower-latin","Lower–roman":"Lower–roman","Media toolbar":"Media toolbar","Media URL":"Media URL","media widget":"media widget",MENU_BAR_MENU_EDIT:"Edit",MENU_BAR_MENU_FILE:"File",MENU_BAR_MENU_FONT:"Font",MENU_BAR_MENU_FORMAT:"Format",MENU_BAR_MENU_HELP:"Help",MENU_BAR_MENU_INSERT:"Insert",MENU_BAR_MENU_TEXT:"Text",MENU_BAR_MENU_TOOLS:"Tools",MENU_BAR_MENU_VIEW:"View","Merge cell down":"Merge cell down","Merge cell left":"Merge cell left","Merge cell right":"Merge cell right","Merge cell up":"Merge cell up","Merge cells":"Merge cells","Move focus between form fields (inputs, buttons, etc.)":"Move focus between form fields (inputs, buttons, etc.)","Move focus in and out of an active dialog window":"Move focus in and out of an active dialog window","Move focus to the menu bar, navigate between menu bars":"Move focus to the menu bar, navigate between menu bars","Move focus to the toolbar, navigate between toolbars":"Move focus to the toolbar, navigate between toolbars","Move out of a link":"Move out of a link","Move out of an inline code style":"Move out of an inline code style","Move the caret to allow typing directly after a widget":"Move the caret to allow typing directly after a widget","Move the caret to allow typing directly before a widget":"Move the caret to allow typing directly before a widget","Move the selection to the next cell":"Move the selection to the next cell","Move the selection to the previous cell":"Move the selection to the previous cell","Navigate through the table":"Navigate through the table","Navigate through the toolbar or menu bar":"Navigate through the toolbar or menu bar",Next:"Next","No results found":"No results found","No searchable items":"No searchable items",None:"None","Numbered List":"Numbered List","Numbered list styles toolbar":"Numbered list styles toolbar","Open file manager":"Open file manager","Open in a new tab":"Open in a new tab","Open link in new tab":"Open link in new tab","Open media in new tab":"Open media in new tab","Open the accessibility help dialog":"Open the accessibility help dialog",Orange:"Orange",Original:"Original",Outset:"Outset",Padding:"Padding",Paragraph:"Paragraph","Paste content":"Paste content","Paste content as plain text":"Paste content as plain text","Paste the media URL in the input.":"Paste the media URL in the input.","Press %0 for help.":"Press %0 for help.","Press Enter to type after or press Shift + Enter to type before the widget":"Press Enter to type after or press Shift + Enter to type before the widget",Previous:"Previous","Processing the edited image.":"Processing the edited image.",Purple:"Purple",Red:"Red",Redo:"Redo","Remove color":"Remove color","Replace from computer":"Replace from computer","Replace image":"Replace image","Replace image from computer":"Replace image from computer","Replace image with file manager":"Replace image with file manager","Replace with file manager":"Replace with file manager","Resize image":"Resize image","Resize image to %0":"Resize image to %0","Resize image to the original size":"Resize image to the original size","Restore default":"Restore default","Reversed order":"Reversed order","Revert autoformatting action":"Revert autoformatting action","Rich Text Editor":"Rich Text Editor",Ridge:"Ridge","Right aligned image":"Right aligned image",Row:"Row",Save:"Save","Select all":"Select all","Select column":"Select column","Select row":"Select row","Selecting resized image failed":"Selecting resized image failed","Server failed to process the image.":"Server failed to process the image.","Show more items":"Show more items","Side image":"Side image",Solid:"Solid","Split cell horizontally":"Split cell horizontally","Split cell vertically":"Split cell vertically",Square:"Square","Start at":"Start at","Start index must be greater than 0.":"Start index must be greater than 0.",Strikethrough:"Strikethrough","Strikethrough text":"Strikethrough text",Style:"Style",Subscript:"Subscript",Superscript:"Superscript",Table:"Table","Table alignment toolbar":"Table alignment toolbar","Table cell text alignment":"Table cell text alignment","Table properties":"Table properties","Table toolbar":"Table toolbar","Text alternative":"Text alternative",'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".':'The color is invalid. Try "#FF0000" or "rgb(255,0,0)" or "red".',"The URL must not be empty.":"The URL must not be empty.",'The value is invalid. Try "10px" or "2em" or simply "2".':'The value is invalid. Try "10px" or "2em" or simply "2".',"These keyboard shortcuts allow for quick access to content editing features.":"These keyboard shortcuts allow for quick access to content editing features.","This link has no URL":"This link has no URL","This media URL is not supported.":"This media URL is not supported.","Tip: Paste the URL into the content to embed faster.":"Tip: Paste the URL into the content to embed faster.","To-do List":"To-do List","Toggle caption off":"Toggle caption off","Toggle caption on":"Toggle caption on","Toggle the circle list style":"Toggle the circle list style","Toggle the decimal list style":"Toggle the decimal list style","Toggle the decimal with leading zero list style":"Toggle the decimal with leading zero list style","Toggle the disc list style":"Toggle the disc list style","Toggle the lower–latin list style":"Toggle the lower–latin list style","Toggle the lower–roman list style":"Toggle the lower–roman list style","Toggle the square list style":"Toggle the square list style","Toggle the upper–latin list style":"Toggle the upper–latin list style","Toggle the upper–roman list style":"Toggle the upper–roman list style",Turquoise:"Turquoise","Type or paste your content here.":"Type or paste your content here.","Type your title":"Type your title",Underline:"Underline","Underline text":"Underline text",Undo:"Undo",Unlink:"Unlink",Update:"Update","Update image URL":"Update image URL","Upload failed":"Upload failed","Upload from computer":"Upload from computer","Upload image from computer":"Upload image from computer","Upload in progress":"Upload in progress","Upper-latin":"Upper-latin","Upper-roman":"Upper-roman","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.","User interface and content navigation keystrokes":"User interface and content navigation keystrokes","Vertical text alignment toolbar":"Vertical text alignment toolbar",White:"White","Widget toolbar":"Widget toolbar",Width:"Width","Wrap text":"Wrap text",Yellow:"Yellow"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})), +/*! + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */ +function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClassicEditor=e():t.ClassicEditor=e()}(self,(()=>(()=>{var t={9246:(t,e,n)=>{const o=n(6931),i={};for(const t of Object.keys(o))i[o[t]]=t;const r={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};t.exports=r;for(const t of Object.keys(r)){if(!("channels"in r[t]))throw new Error("missing channels property: "+t);if(!("labels"in r[t]))throw new Error("missing channel labels property: "+t);if(r[t].labels.length!==r[t].channels)throw new Error("channel and label counts mismatch: "+t);const{channels:e,labels:n}=r[t];delete r[t].channels,delete r[t].labels,Object.defineProperty(r[t],"channels",{value:e}),Object.defineProperty(r[t],"labels",{value:n})}r.rgb.hsl=function(t){const e=t[0]/255,n=t[1]/255,o=t[2]/255,i=Math.min(e,n,o),r=Math.max(e,n,o),s=r-i;let a,c;r===i?a=0:e===r?a=(n-o)/s:n===r?a=2+(o-e)/s:o===r&&(a=4+(e-n)/s),a=Math.min(60*a,360),a<0&&(a+=360);const l=(i+r)/2;return c=r===i?0:l<=.5?s/(r+i):s/(2-r-i),[a,100*c,100*l]},r.rgb.hsv=function(t){let e,n,o,i,r;const s=t[0]/255,a=t[1]/255,c=t[2]/255,l=Math.max(s,a,c),d=l-Math.min(s,a,c),u=function(t){return(l-t)/6/d+.5};return 0===d?(i=0,r=0):(r=d/l,e=u(s),n=u(a),o=u(c),s===l?i=o-n:a===l?i=1/3+e-o:c===l&&(i=2/3+n-e),i<0?i+=1:i>1&&(i-=1)),[360*i,100*r,100*l]},r.rgb.hwb=function(t){const e=t[0],n=t[1];let o=t[2];const i=r.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(n,o));return o=1-1/255*Math.max(e,Math.max(n,o)),[i,100*s,100*o]},r.rgb.cmyk=function(t){const e=t[0]/255,n=t[1]/255,o=t[2]/255,i=Math.min(1-e,1-n,1-o);return[100*((1-e-i)/(1-i)||0),100*((1-n-i)/(1-i)||0),100*((1-o-i)/(1-i)||0),100*i]},r.rgb.keyword=function(t){const e=i[t];if(e)return e;let n,r=1/0;for(const e of Object.keys(o)){const i=o[e],c=(a=i,((s=t)[0]-a[0])**2+(s[1]-a[1])**2+(s[2]-a[2])**2);c.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;return[100*(.4124*e+.3576*n+.1805*o),100*(.2126*e+.7152*n+.0722*o),100*(.0193*e+.1192*n+.9505*o)]},r.rgb.lab=function(t){const e=r.rgb.xyz(t);let n=e[0],o=e[1],i=e[2];n/=95.047,o/=100,i/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;return[116*o-16,500*(n-o),200*(o-i)]},r.hsl.rgb=function(t){const e=t[0]/360,n=t[1]/100,o=t[2]/100;let i,r,s;if(0===n)return s=255*o,[s,s,s];i=o<.5?o*(1+n):o+n-o*n;const a=2*o-i,c=[0,0,0];for(let t=0;t<3;t++)r=e+1/3*-(t-1),r<0&&r++,r>1&&r--,s=6*r<1?a+6*(i-a)*r:2*r<1?i:3*r<2?a+(i-a)*(2/3-r)*6:a,c[t]=255*s;return c},r.hsl.hsv=function(t){const e=t[0];let n=t[1]/100,o=t[2]/100,i=n;const r=Math.max(o,.01);o*=2,n*=o<=1?o:2-o,i*=r<=1?r:2-r;return[e,100*(0===o?2*i/(r+i):2*n/(o+n)),100*((o+n)/2)]},r.hsv.rgb=function(t){const e=t[0]/60,n=t[1]/100;let o=t[2]/100;const i=Math.floor(e)%6,r=e-Math.floor(e),s=255*o*(1-n),a=255*o*(1-n*r),c=255*o*(1-n*(1-r));switch(o*=255,i){case 0:return[o,c,s];case 1:return[a,o,s];case 2:return[s,o,c];case 3:return[s,a,o];case 4:return[c,s,o];case 5:return[o,s,a]}},r.hsv.hsl=function(t){const e=t[0],n=t[1]/100,o=t[2]/100,i=Math.max(o,.01);let r,s;s=(2-n)*o;const a=(2-n)*i;return r=n*i,r/=a<=1?a:2-a,r=r||0,s/=2,[e,100*r,100*s]},r.hwb.rgb=function(t){const e=t[0]/360;let n=t[1]/100,o=t[2]/100;const i=n+o;let r;i>1&&(n/=i,o/=i);const s=Math.floor(6*e),a=1-o;r=6*e-s,1&s&&(r=1-r);const c=n+r*(a-n);let l,d,u;switch(s){default:case 6:case 0:l=a,d=c,u=n;break;case 1:l=c,d=a,u=n;break;case 2:l=n,d=a,u=c;break;case 3:l=n,d=c,u=a;break;case 4:l=c,d=n,u=a;break;case 5:l=a,d=n,u=c}return[255*l,255*d,255*u]},r.cmyk.rgb=function(t){const e=t[0]/100,n=t[1]/100,o=t[2]/100,i=t[3]/100;return[255*(1-Math.min(1,e*(1-i)+i)),255*(1-Math.min(1,n*(1-i)+i)),255*(1-Math.min(1,o*(1-i)+i))]},r.xyz.rgb=function(t){const e=t[0]/100,n=t[1]/100,o=t[2]/100;let i,r,s;return i=3.2406*e+-1.5372*n+-.4986*o,r=-.9689*e+1.8758*n+.0415*o,s=.0557*e+-.204*n+1.057*o,i=i>.0031308?1.055*i**(1/2.4)-.055:12.92*i,r=r>.0031308?1.055*r**(1/2.4)-.055:12.92*r,s=s>.0031308?1.055*s**(1/2.4)-.055:12.92*s,i=Math.min(Math.max(0,i),1),r=Math.min(Math.max(0,r),1),s=Math.min(Math.max(0,s),1),[255*i,255*r,255*s]},r.xyz.lab=function(t){let e=t[0],n=t[1],o=t[2];e/=95.047,n/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;return[116*n-16,500*(e-n),200*(n-o)]},r.lab.xyz=function(t){let e,n,o;n=(t[0]+16)/116,e=t[1]/500+n,o=n-t[2]/200;const i=n**3,r=e**3,s=o**3;return n=i>.008856?i:(n-16/116)/7.787,e=r>.008856?r:(e-16/116)/7.787,o=s>.008856?s:(o-16/116)/7.787,e*=95.047,n*=100,o*=108.883,[e,n,o]},r.lab.lch=function(t){const e=t[0],n=t[1],o=t[2];let i;i=360*Math.atan2(o,n)/2/Math.PI,i<0&&(i+=360);return[e,Math.sqrt(n*n+o*o),i]},r.lch.lab=function(t){const e=t[0],n=t[1],o=t[2]/360*2*Math.PI;return[e,n*Math.cos(o),n*Math.sin(o)]},r.rgb.ansi16=function(t,e=null){const[n,o,i]=t;let s=null===e?r.rgb.hsv(t)[2]:e;if(s=Math.round(s/50),0===s)return 30;let a=30+(Math.round(i/255)<<2|Math.round(o/255)<<1|Math.round(n/255));return 2===s&&(a+=60),a},r.hsv.ansi16=function(t){return r.rgb.ansi16(r.hsv.rgb(t),t[2])},r.rgb.ansi256=function(t){const e=t[0],n=t[1],o=t[2];if(e===n&&n===o)return e<8?16:e>248?231:Math.round((e-8)/247*24)+232;return 16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(o/255*5)},r.ansi16.rgb=function(t){let e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];const n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},r.ansi256.rgb=function(t){if(t>=232){const e=10*(t-232)+8;return[e,e,e]}let e;t-=16;return[Math.floor(t/36)/5*255,Math.floor((e=t%36)/6)/5*255,e%6/5*255]},r.rgb.hex=function(t){const e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},r.hex.rgb=function(t){const e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let n=e[0];3===e[0].length&&(n=n.split("").map((t=>t+t)).join(""));const o=parseInt(n,16);return[o>>16&255,o>>8&255,255&o]},r.rgb.hcg=function(t){const e=t[0]/255,n=t[1]/255,o=t[2]/255,i=Math.max(Math.max(e,n),o),r=Math.min(Math.min(e,n),o),s=i-r;let a,c;return a=s<1?r/(1-s):0,c=s<=0?0:i===e?(n-o)/s%6:i===n?2+(o-e)/s:4+(e-n)/s,c/=6,c%=1,[360*c,100*s,100*a]},r.hsl.hcg=function(t){const e=t[1]/100,n=t[2]/100,o=n<.5?2*e*n:2*e*(1-n);let i=0;return o<1&&(i=(n-.5*o)/(1-o)),[t[0],100*o,100*i]},r.hsv.hcg=function(t){const e=t[1]/100,n=t[2]/100,o=e*n;let i=0;return o<1&&(i=(n-o)/(1-o)),[t[0],100*o,100*i]},r.hcg.rgb=function(t){const e=t[0]/360,n=t[1]/100,o=t[2]/100;if(0===n)return[255*o,255*o,255*o];const i=[0,0,0],r=e%1*6,s=r%1,a=1-s;let c=0;switch(Math.floor(r)){case 0:i[0]=1,i[1]=s,i[2]=0;break;case 1:i[0]=a,i[1]=1,i[2]=0;break;case 2:i[0]=0,i[1]=1,i[2]=s;break;case 3:i[0]=0,i[1]=a,i[2]=1;break;case 4:i[0]=s,i[1]=0,i[2]=1;break;default:i[0]=1,i[1]=0,i[2]=a}return c=(1-n)*o,[255*(n*i[0]+c),255*(n*i[1]+c),255*(n*i[2]+c)]},r.hcg.hsv=function(t){const e=t[1]/100,n=e+t[2]/100*(1-e);let o=0;return n>0&&(o=e/n),[t[0],100*o,100*n]},r.hcg.hsl=function(t){const e=t[1]/100,n=t[2]/100*(1-e)+.5*e;let o=0;return n>0&&n<.5?o=e/(2*n):n>=.5&&n<1&&(o=e/(2*(1-n))),[t[0],100*o,100*n]},r.hcg.hwb=function(t){const e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},r.hwb.hcg=function(t){const e=t[1]/100,n=1-t[2]/100,o=n-e;let i=0;return o<1&&(i=(n-o)/(1-o)),[t[0],100*o,100*i]},r.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},r.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},r.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},r.gray.hsl=function(t){return[0,0,t[0]]},r.gray.hsv=r.gray.hsl,r.gray.hwb=function(t){return[0,100,t[0]]},r.gray.cmyk=function(t){return[0,0,0,t[0]]},r.gray.lab=function(t){return[t[0],0,0]},r.gray.hex=function(t){const e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},r.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}},9047:(t,e,n)=>{const o=n(9246),i=n(802),r={};Object.keys(o).forEach((t=>{r[t]={},Object.defineProperty(r[t],"channels",{value:o[t].channels}),Object.defineProperty(r[t],"labels",{value:o[t].labels});const e=i(t);Object.keys(e).forEach((n=>{const o=e[n];r[t][n]=function(t){const e=function(...e){const n=e[0];if(null==n)return n;n.length>1&&(e=n);const o=t(e);if("object"==typeof o)for(let t=o.length,e=0;e1&&(e=n),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(o)}))})),t.exports=r},802:(t,e,n)=>{const o=n(9246);function i(t){const e=function(){const t={},e=Object.keys(o);for(let n=e.length,o=0;o{"use strict";t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},4199:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content code{background-color:hsla(0,0%,78%,.3);border-radius:2px;padding:.15em}.ck.ck-editor__editable .ck-code_selected{background-color:hsla(0,0%,78%,.5)}","",{version:3,sources:["webpack://./../ckeditor5-basic-styles/theme/code.css"],names:[],mappings:"AAKA,iBACC,kCAAuC,CAEvC,iBAAkB,CADlB,aAED,CAEA,0CACC,kCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content code {\n\tbackground-color: hsla(0, 0%, 78%, 0.3);\n\tpadding: .15em;\n\tborder-radius: 2px;\n}\n\n.ck.ck-editor__editable .ck-code_selected {\n\tbackground-color: hsla(0, 0%, 78%, 0.5);\n}\n"],sourceRoot:""}]);const a=s},8708:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content blockquote{border-left:5px solid #ccc;font-style:italic;margin-left:0;margin-right:0;overflow:hidden;padding-left:1.5em;padding-right:1.5em}.ck-content[dir=rtl] blockquote{border-left:0;border-right:5px solid #ccc}","",{version:3,sources:["webpack://./../ckeditor5-block-quote/theme/blockquote.css"],names:[],mappings:"AAKA,uBAWC,0BAAsC,CADtC,iBAAkB,CAFlB,aAAc,CACd,cAAe,CAPf,eAAgB,CAIhB,kBAAmB,CADnB,mBAOD,CAEA,gCACC,aAAc,CACd,2BACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content blockquote {\n\t/* See #12 */\n\toverflow: hidden;\n\n\t/* https://github.com/ckeditor/ckeditor5-block-quote/issues/15 */\n\tpadding-right: 1.5em;\n\tpadding-left: 1.5em;\n\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-style: italic;\n\tborder-left: solid 5px hsl(0, 0%, 80%);\n}\n\n.ck-content[dir="rtl"] blockquote {\n\tborder-left: 0;\n\tborder-right: solid 5px hsl(0, 0%, 80%);\n}\n'],sourceRoot:""}]);const a=s},1866:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,':root{--ck-image-processing-highlight-color:#f9fafa;--ck-image-processing-background-color:#e3e5e8}.ck.ck-editor__editable .image.image-processing{position:relative}.ck.ck-editor__editable .image.image-processing:before{animation:ck-image-processing-animation 2s linear infinite;background:linear-gradient(90deg,var(--ck-image-processing-background-color),var(--ck-image-processing-highlight-color),var(--ck-image-processing-background-color));background-size:200% 100%;content:"";height:100%;left:0;position:absolute;top:0;width:100%;z-index:1}.ck.ck-editor__editable .image.image-processing img{height:100%}@keyframes ck-image-processing-animation{0%{background-position:200% 0}to{background-position:-200% 0}}',"",{version:3,sources:["webpack://./../ckeditor5-ckbox/theme/ckboximageedit.css"],names:[],mappings:"AAKA,MAEC,6CAAyD,CACzD,8CACD,CAIE,gDACC,iBA2BD,CAzBC,uDAmBC,0DAA2D,CAR3D,oKAKC,CACD,yBAA0B,CAhB1B,UAAW,CAOX,WAAY,CAHZ,MAAO,CAFP,iBAAkB,CAClB,KAAM,CAKN,UAAW,CAHX,SAcD,CAEA,oDACC,WACD,CAKH,yCACC,GACC,0BACD,CACA,GACC,2BACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Based on default CKBox theme colors */\n\t--ck-image-processing-highlight-color: hsl(220, 10%, 98%);\n\t--ck-image-processing-background-color: hsl(220, 10%, 90%);\n}\n\n.ck.ck-editor__editable {\n\t& .image {\n\t\t&.image-processing {\n\t\t\tposition: relative;\n\n\t\t\t&:before {\n\t\t\t\tcontent: '';\n\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tz-index: 1;\n\n\t\t\t\theight: 100%;\n\t\t\t\twidth: 100%;\n\n\t\t\t\tbackground: linear-gradient(\n\t\t\t\t\t90deg,\n\t\t\t\t\tvar(--ck-image-processing-background-color),\n\t\t\t\t\tvar(--ck-image-processing-highlight-color),\n\t\t\t\t\tvar(--ck-image-processing-background-color)\n\t\t\t\t);\n\t\t\t\tbackground-size: 200% 100%;\n\n\t\t\t\tanimation: ck-image-processing-animation 2s linear infinite;\n\t\t\t}\n\n\t\t\t& img {\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t}\n\t}\n}\n\n@keyframes ck-image-processing-animation {\n\t0% {\n\t\tbackground-position: 200% 0;\n\t}\n\t100% {\n\t\tbackground-position: -200% 0;\n\t}\n}\n"],sourceRoot:""}]);const a=s},7793:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position{display:inline;pointer-events:none;position:relative}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{position:absolute;width:0}.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__selection-handle,.ck.ck-editor__editable .ck-widget:-webkit-drag>.ck-widget__type-around{display:none}.ck.ck-clipboard-drop-target-line{pointer-events:none;position:absolute}:root{--ck-clipboard-drop-target-dot-width:12px;--ck-clipboard-drop-target-dot-height:8px;--ck-clipboard-drop-target-color:var(--ck-color-focus-border)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);bottom:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);margin-left:-1px;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5)}.ck.ck-editor__editable .ck.ck-clipboard-drop-target-position span:after{border-color:var(--ck-clipboard-drop-target-color) transparent transparent transparent;border-style:solid;border-width:calc(var(--ck-clipboard-drop-target-dot-height)) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5);content:"";display:block;height:0;left:50%;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-height)*-.5);transform:translateX(-50%);width:0}.ck.ck-editor__editable .ck-widget.ck-clipboard-drop-target-range{outline:var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color)!important}.ck.ck-editor__editable .ck-widget:-webkit-drag{zoom:.6;outline:none!important}.ck.ck-clipboard-drop-target-line{background:var(--ck-clipboard-drop-target-color);border:1px solid var(--ck-clipboard-drop-target-color);height:0;margin-top:-1px}.ck.ck-clipboard-drop-target-line:before{border-style:solid;content:"";height:0;position:absolute;top:calc(var(--ck-clipboard-drop-target-dot-width)*-.5);width:0}[dir=ltr] .ck.ck-clipboard-drop-target-line:before{border-color:transparent transparent transparent var(--ck-clipboard-drop-target-color);border-width:calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0 calc(var(--ck-clipboard-drop-target-dot-width)*.5) var(--ck-clipboard-drop-target-dot-height);left:-1px}[dir=rtl] .ck.ck-clipboard-drop-target-line:before{border-color:transparent var(--ck-clipboard-drop-target-color) transparent transparent;border-width:calc(var(--ck-clipboard-drop-target-dot-width)*.5) var(--ck-clipboard-drop-target-dot-height) calc(var(--ck-clipboard-drop-target-dot-width)*.5) 0;right:-1px}',"",{version:3,sources:["webpack://./../ckeditor5-clipboard/theme/clipboard.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-clipboard/clipboard.css"],names:[],mappings:"AASC,8DACC,cAAe,CAEf,mBAAoB,CADpB,iBAOD,CAJC,mEACC,iBAAkB,CAClB,OACD,CAWA,qJACC,YACD,CAIF,kCAEC,mBAAoB,CADpB,iBAED,CC9BA,MACC,yCAA0C,CAC1C,yCAA0C,CAC1C,6DACD,CAOE,mEAIC,gDAAiD,CADjD,sDAAuD,CAFvD,2DAA8D,CAI9D,gBAAiB,CAHjB,wDAqBD,CAfC,yEAWC,sFAAuF,CAEvF,kBAAmB,CADnB,qKAA0K,CAX1K,UAAW,CAIX,aAAc,CAFd,QAAS,CAIT,QAAS,CADT,iBAAkB,CAElB,wDAA2D,CAE3D,0BAA2B,CAR3B,OAYD,CAOF,kEACC,gGACD,CAKA,gDACC,OAAS,CACT,sBACD,CAGD,kCAGC,gDAAiD,CADjD,sDAAuD,CADvD,QAAS,CAGT,eAwBD,CAtBC,yCAMC,kBAAmB,CALnB,UAAW,CAIX,QAAS,CAHT,iBAAkB,CAClB,uDAA0D,CAC1D,OAiBD,CArBA,mDAYE,sFAAuF,CADvF,+JAAoK,CAFpK,SAYF,CArBA,mDAmBE,sFAAuF,CADvF,+JAAmK,CAFnK,UAKF",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\tdisplay: inline;\n\t\tposition: relative;\n\t\tpointer-events: none;\n\n\t\t& span {\n\t\t\tposition: absolute;\n\t\t\twidth: 0;\n\t\t}\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\t& > .ck-widget__selection-handle {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t& > .ck-widget__type-around {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n.ck.ck-clipboard-drop-target-line {\n\tposition: absolute;\n\tpointer-events: none;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import \"@ckeditor/ckeditor5-ui/theme/mixins/_dir.css\";\n\n:root {\n\t--ck-clipboard-drop-target-dot-width: 12px;\n\t--ck-clipboard-drop-target-dot-height: 8px;\n\t--ck-clipboard-drop-target-color: var(--ck-color-focus-border);\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Vertical drop target (in text).\n\t */\n\t& .ck.ck-clipboard-drop-target-position {\n\t\t& span {\n\t\t\tbottom: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\t\t\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\t\t\tbackground: var(--ck-clipboard-drop-target-color);\n\t\t\tmargin-left: -1px;\n\n\t\t\t/* The triangle above the marker */\n\t\t\t&::after {\n\t\t\t\tcontent: '';\n\t\t\t\twidth: 0;\n\t\t\t\theight: 0;\n\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 50%;\n\t\t\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-height));\n\n\t\t\t\ttransform: translateX(-50%);\n\t\t\t\tborder-color: var(--ck-clipboard-drop-target-color) transparent transparent transparent;\n\t\t\t\tborder-width: calc(var(--ck-clipboard-drop-target-dot-height)) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width));\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Styles of the widget that it a drop target.\n\t */\n\t& .ck-widget.ck-clipboard-drop-target-range {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-clipboard-drop-target-color) !important;\n\t}\n\n\t/*\n\t * Styles of the widget being dragged (its preview).\n\t */\n\t& .ck-widget:-webkit-drag {\n\t\tzoom: 0.6;\n\t\toutline: none !important;\n\t}\n}\n\n.ck.ck-clipboard-drop-target-line {\n\theight: 0;\n\tborder: 1px solid var(--ck-clipboard-drop-target-color);\n\tbackground: var(--ck-clipboard-drop-target-color);\n\tmargin-top: -1px;\n\n\t&::before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: calc(-.5 * var(--ck-clipboard-drop-target-dot-width));\n\t\twidth: 0;\n\t\theight: 0;\n\t\tborder-style: solid;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tleft: -1px;\n\n\t\t\tborder-width: calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0 calc(.5 * var(--ck-clipboard-drop-target-dot-width)) var(--ck-clipboard-drop-target-dot-height);\n\t\t\tborder-color: transparent transparent transparent var(--ck-clipboard-drop-target-color);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tright: -1px;\n\n\t\t\tborder-width:calc(.5 * var(--ck-clipboard-drop-target-dot-width)) var(--ck-clipboard-drop-target-dot-height) calc(.5 * var(--ck-clipboard-drop-target-dot-width)) 0;\n\t\t\tborder-color: transparent var(--ck-clipboard-drop-target-color) transparent transparent;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},7388:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor{position:relative}.ck.ck-editor .ck-editor__top .ck-sticky-panel .ck-toolbar{z-index:var(--ck-z-panel)}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content{border-radius:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content{border:solid var(--ck-color-base-border);border-width:1px 1px 0}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content.ck-sticky-panel__content_sticky{border-bottom-width:1px}.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content .ck-menu-bar,.ck.ck-editor__top .ck-sticky-panel .ck-sticky-panel__content .ck-toolbar{border:0}.ck.ck-editor__main>.ck-editor__editable{background:var(--ck-color-base-background);border-radius:0}.ck-rounded-corners .ck.ck-editor__main>.ck-editor__editable,.ck.ck-editor__main>.ck-editor__editable.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}.ck.ck-editor__main>.ck-editor__editable:not(.ck-focused){border-color:var(--ck-color-base-border)}","",{version:3,sources:["webpack://./../ckeditor5-editor-classic/theme/classiceditor.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-editor-classic/classiceditor.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,cAIC,iBAMD,CAJC,2DAEC,yBACD,CCLC,8DCED,eDeC,CAjBA,mKCMA,qCAAsC,CDJpC,2BAA4B,CAC5B,4BAcF,CAjBA,8DAOC,wCAAsB,CAAtB,sBAUD,CARC,8FACC,uBACD,CAEA,qJAEC,QACD,CAMH,yCAEC,0CAA2C,CCtB3C,eDgCD,CAZA,yHChBE,qCAAsC,CDqBtC,wBAAyB,CACzB,yBAMF,CAHC,0DACC,wCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor {\n\t/* All the elements within `.ck-editor` are positioned relatively to it.\n\t If any element needs to be positioned with respect to the , etc.,\n\t it must land outside of the `.ck-editor` in DOM. */\n\tposition: relative;\n\n\t& .ck-editor__top .ck-sticky-panel .ck-toolbar {\n\t\t/* https://github.com/ckeditor/ckeditor5-editor-classic/issues/62 */\n\t\tz-index: var(--ck-z-panel);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n.ck.ck-editor__top {\n\t& .ck-sticky-panel {\n\t\t& .ck-sticky-panel__content {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\n\t\t\tborder: 1px solid var(--ck-color-base-border);\n\t\t\tborder-bottom-width: 0;\n\n\t\t\t&.ck-sticky-panel__content_sticky {\n\t\t\t\tborder-bottom-width: 1px;\n\t\t\t}\n\n\t\t\t& .ck-menu-bar,\n\t\t\t& .ck-toolbar {\n\t\t\t\tborder: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Note: Use ck-editor__main to make sure these styles don\'t apply to other editor types */\n.ck.ck-editor__main > .ck-editor__editable {\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/113 */\n\tbackground: var(--ck-color-base-background);\n\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&:not(.ck-focused) {\n\t\tborder-color: var(--ck-color-base-border);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},4098:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck .ck-placeholder,.ck.ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{content:attr(data-placeholder);left:0;pointer-events:none;position:absolute;right:0}.ck.ck-read-only .ck-placeholder:before{display:none}.ck.ck-reset_all .ck-placeholder{position:relative}.ck .ck-placeholder:before,.ck.ck-placeholder:before{color:var(--ck-color-engine-placeholder-text);cursor:text}","",{version:3,sources:["webpack://./../ckeditor5-engine/theme/placeholder.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-engine/placeholder.css"],names:[],mappings:"AAMA,uCAEC,iBAWD,CATC,qDAIC,8BAA+B,CAF/B,MAAO,CAKP,mBAAoB,CANpB,iBAAkB,CAElB,OAKD,CAKA,wCACC,YACD,CAQD,iCACC,iBACD,CC5BC,qDAEC,6CAA8C,CAD9C,WAED",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder,\n.ck .ck-placeholder {\n\tposition: relative;\n\n\t&::before {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tcontent: attr(data-placeholder);\n\n\t\t/* See ckeditor/ckeditor5#469. */\n\t\tpointer-events: none;\n\t}\n}\n\n/* See ckeditor/ckeditor5#1987. */\n.ck.ck-read-only .ck-placeholder {\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n\n/*\n * Rules for the `ck-placeholder` are loaded before the rules for `ck-reset_all` in the base CKEditor 5 DLL build.\n * This fix overwrites the incorrectly set `position: static` from `ck-reset_all`.\n * See https://github.com/ckeditor/ckeditor5/issues/11418.\n */\n.ck.ck-reset_all .ck-placeholder {\n\tposition: relative;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* See ckeditor/ckeditor5#936. */\n.ck.ck-placeholder, .ck .ck-placeholder {\n\t&::before {\n\t\tcursor: text;\n\t\tcolor: var(--ck-color-engine-placeholder-text);\n\t}\n}\n"],sourceRoot:""}]);const a=s},8264:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable span[data-ck-unsafe-element]{display:none}","",{version:3,sources:["webpack://./../ckeditor5-engine/theme/renderer.css"],names:[],mappings:"AAMA,qDACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Elements marked by the Renderer as hidden should be invisible in the editor. */\n.ck.ck-editor__editable span[data-ck-unsafe-element] {\n\tdisplay: none;\n}\n"],sourceRoot:""}]);const a=s},6269:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-heading_heading1{font-size:20px}.ck.ck-heading_heading2{font-size:17px}.ck.ck-heading_heading3{font-size:14px}.ck[class*=ck-heading_heading]{font-weight:700}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__button .ck-button__label{width:8em}.ck.ck-dropdown.ck-heading-dropdown .ck-dropdown__panel .ck-list__item{min-width:18em}","",{version:3,sources:["webpack://./../ckeditor5-heading/theme/heading.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-heading/heading.css"],names:[],mappings:"AAKA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,wBACC,cACD,CAEA,+BACC,eACD,CCZC,2EACC,SACD,CAEA,uEACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-heading_heading1 {\n\tfont-size: 20px;\n}\n\n.ck.ck-heading_heading2 {\n\tfont-size: 17px;\n}\n\n.ck.ck-heading_heading3 {\n\tfont-size: 14px;\n}\n\n.ck[class*="ck-heading_heading"] {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Resize dropdown's button label. */\n.ck.ck-dropdown.ck-heading-dropdown {\n\t& .ck-dropdown__button .ck-button__label {\n\t\twidth: 8em;\n\t}\n\n\t& .ck-dropdown__panel .ck-list__item {\n\t\tmin-width: 18em;\n\t}\n}\n"],sourceRoot:""}]);const a=s},265:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content .image{clear:both;display:table;margin:.9em auto;min-width:50px;text-align:center}.ck-content .image img{display:block;height:auto;margin:0 auto;max-width:100%;min-width:100%}.ck-content .image-inline{align-items:flex-start;display:inline-flex;max-width:100%}.ck-content .image-inline picture{display:flex}.ck-content .image-inline img,.ck-content .image-inline picture{flex-grow:1;flex-shrink:1;max-width:100%}.ck.ck-editor__editable .image>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}.ck.ck-editor__editable .image{z-index:1}.ck.ck-editor__editable .image.ck-widget_selected{z-index:2}.ck.ck-editor__editable .image-inline{z-index:1}.ck.ck-editor__editable .image-inline.ck-widget_selected{z-index:2}.ck.ck-editor__editable .image-inline.ck-widget_selected ::selection{display:none}.ck.ck-editor__editable .image-inline img{height:auto}.ck.ck-editor__editable td .image-inline img,.ck.ck-editor__editable th .image-inline img{max-width:none}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/image.css"],names:[],mappings:"AAMC,mBAEC,UAAW,CADX,aAAc,CAOd,gBAAkB,CAGlB,cAAe,CARf,iBA2BD,CAjBC,uBAEC,aAAc,CAad,WAAY,CAVZ,aAAc,CAGd,cAAe,CAGf,cAKD,CAGD,0BAYC,sBAAuB,CANvB,mBAAoB,CAGpB,cAoBD,CAdC,kCACC,YACD,CAGA,gEAGC,WAAY,CACZ,aAAc,CAGd,cACD,CAUD,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAKA,+BACC,SASD,CAHC,kDACC,SACD,CAMD,sCACC,SAkBD,CAZC,yDACC,SAUD,CAHC,qEACC,YACD,CAMF,0CACC,WACD,CAMC,0FACC,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content {\n\t& .image {\n\t\tdisplay: table;\n\t\tclear: both;\n\t\ttext-align: center;\n\n\t\t/* Make sure there is some space between the content and the image. Center image by default. */\n\t\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\t \tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\t\tmargin: 0.9em auto;\n\n\t\t/* Make sure the caption will be displayed properly (See: https://github.com/ckeditor/ckeditor5/issues/1870). */\n\t\tmin-width: 50px;\n\n\t\t& img {\n\t\t\t/* Prevent unnecessary margins caused by line-height (see #44). */\n\t\t\tdisplay: block;\n\n\t\t\t/* Center the image if its width is smaller than the content\'s width. */\n\t\t\tmargin: 0 auto;\n\n\t\t\t/* Make sure the image never exceeds the size of the parent container (ckeditor/ckeditor5-ui#67). */\n\t\t\tmax-width: 100%;\n\n\t\t\t/* Make sure the image is never smaller than the parent container (See: https://github.com/ckeditor/ckeditor5/issues/9300). */\n\t\t\tmin-width: 100%;\n\n\t\t\t/* Keep proportions of the block image if the height is set and the image is wider than the editor width.\n\t\t\tSee https://github.com/ckeditor/ckeditor5/issues/14542. */\n\t\t\theight: auto;\n\t\t}\n\t}\n\n\t& .image-inline {\n\t\t/*\n\t\t * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).\n\t\t * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.\n\t\t * This strange behavior does not happen with inline-flex.\n\t\t */\n\t\tdisplay: inline-flex;\n\n\t\t/* While being resized, don\'t allow the image to exceed the width of the editing root. */\n\t\tmax-width: 100%;\n\n\t\t/* This is required by Safari to resize images in a sensible way. Without this, the browser breaks the ratio. */\n\t\talign-items: flex-start;\n\n\t\t/* When the picture is present it must act as a flex container to let the img resize properly */\n\t\t& picture {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t/* When the picture is present, it must act like a resizable img. */\n\t\t& picture,\n\t\t& img {\n\t\t\t/* This is necessary for the img to span the entire .image-inline wrapper and to resize properly. */\n\t\t\tflex-grow: 1;\n\t\t\tflex-shrink: 1;\n\n\t\t\t/* Prevents overflowing the editing root boundaries when an inline image is very wide. */\n\t\t\tmax-width: 100%;\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable {\n\t/*\n\t * Inhertit the content styles padding of the
in case the integration overrides `text-align: center`\n\t * of `.image` (e.g. to the left/right). This ensures the placeholder stays at the padding just like the native\n\t * caret does, and not at the edge of
.\n\t */\n\t& .image > figcaption.ck-placeholder::before {\n\t\tpadding-left: inherit;\n\t\tpadding-right: inherit;\n\n\t\t/*\n\t\t * Make sure the image caption placeholder doesn\'t overflow the placeholder area.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\n\t\t */\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t/*\n\t * See https://github.com/ckeditor/ckeditor5/issues/15115.\n\t */\n\t& .image {\n\t\tz-index: 1;\n\n\t\t/*\n\t\t * Make sure the selected image always stays on top of its siblings.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9108.\n\t\t */\n\t\t&.ck-widget_selected {\n\t\t\tz-index: 2;\n\t\t}\n\t}\n\n\t/*\n\t * See https://github.com/ckeditor/ckeditor5/issues/15115.\n\t */\n\t& .image-inline {\n\t\tz-index: 1;\n\n\t\t/*\n\t\t * Make sure the selected inline image always stays on top of its siblings.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9108.\n\t\t */\n\t\t&.ck-widget_selected {\n\t\t\tz-index: 2;\n\n\t\t\t/*\n\t\t\t * Make sure the native browser selection style is not displayed.\n\t\t\t * Inline image widgets have their own styles for the selected state and\n\t\t\t * leaving this up to the browser is asking for a visual collision.\n\t\t\t */\n\t\t\t& ::selection {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Keep proportions of the inline image if the height is set and the image is wider than the editor width.\n\tSee https://github.com/ckeditor/ckeditor5/issues/14542. */\n\t& .image-inline img {\n\t\theight: auto;\n\t}\n\n\t/* The inline image nested in the table should have its original size if not resized.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\n\t& td,\n\t& th {\n\t\t& .image-inline img {\n\t\t\tmax-width: none;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},5247:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-image-caption-background:#f7f7f7;--ck-color-image-caption-text:#333;--ck-color-image-caption-highlighted-background:#fd0}.ck-content .image>figcaption{background-color:var(--ck-color-image-caption-background);caption-side:bottom;color:var(--ck-color-image-caption-text);display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;word-break:break-word}.ck.ck-editor__editable .image>figcaption.image__caption_highlighted{animation:ck-image-caption-highlight .6s ease-out}@keyframes ck-image-caption-highlight{0%{background-color:var(--ck-color-image-caption-highlighted-background)}to{background-color:var(--ck-color-image-caption-background)}}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imagecaption.css"],names:[],mappings:"AAKA,MACC,2CAAoD,CACpD,kCAA8C,CAC9C,oDACD,CAGA,8BAKC,yDAA0D,CAH1D,mBAAoB,CAEpB,wCAAyC,CAHzC,qBAAsB,CAMtB,eAAgB,CAChB,mBAAoB,CAFpB,YAAa,CAHb,qBAMD,CAGA,qEACC,iDACD,CAEA,sCACC,GACC,qEACD,CAEA,GACC,yDACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-caption-background: hsl(0, 0%, 97%);\n\t--ck-color-image-caption-text: hsl(0, 0%, 20%);\n\t--ck-color-image-caption-highlighted-background: hsl(52deg 100% 50%);\n}\n\n/* Content styles */\n.ck-content .image > figcaption {\n\tdisplay: table-caption;\n\tcaption-side: bottom;\n\tword-break: break-word;\n\tcolor: var(--ck-color-image-caption-text);\n\tbackground-color: var(--ck-color-image-caption-background);\n\tpadding: .6em;\n\tfont-size: .75em;\n\toutline-offset: -1px;\n}\n\n/* Editing styles */\n.ck.ck-editor__editable .image > figcaption.image__caption_highlighted {\n\tanimation: ck-image-caption-highlight .6s ease-out;\n}\n\n@keyframes ck-image-caption-highlight {\n\t0% {\n\t\tbackground-color: var(--ck-color-image-caption-highlighted-background);\n\t}\n\n\t100% {\n\t\tbackground-color: var(--ck-color-image-caption-background);\n\t}\n}\n"],sourceRoot:""}]);const a=s},3350:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-image-insert-url .ck-image-insert-url__action-row{display:grid;grid-template-columns:repeat(2,1fr)}:root{--ck-image-insert-insert-by-url-width:250px}.ck.ck-image-insert-url{--ck-input-width:100%}.ck.ck-image-insert-url .ck-image-insert-url__action-row{grid-column-gap:var(--ck-spacing-large);margin-top:var(--ck-spacing-large)}.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button-cancel,.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button-save{justify-content:center;min-width:auto}.ck.ck-image-insert-url .ck-image-insert-url__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}.ck.ck-image-insert-form>.ck.ck-button{display:block;padding:var(--ck-list-button-padding);width:100%}[dir=ltr] .ck.ck-image-insert-form>.ck.ck-button{text-align:left}[dir=rtl] .ck.ck-image-insert-form>.ck.ck-button{text-align:right}.ck.ck-image-insert-form>.ck.ck-collapsible:not(:first-child){border-top:1px solid var(--ck-color-base-border)}.ck.ck-image-insert-form>.ck.ck-collapsible:not(:last-child){border-bottom:1px solid var(--ck-color-base-border)}.ck.ck-image-insert-form>.ck.ck-collapsible,.ck.ck-image-insert-form>.ck.ck-image-insert-url{min-width:var(--ck-image-insert-insert-by-url-width)}.ck.ck-image-insert-form>.ck.ck-image-insert-url{padding:var(--ck-spacing-large)}.ck.ck-image-insert-form:focus{outline:none}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageinsert.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageinsert.css"],names:[],mappings:"AAMC,yDACC,YAAa,CACb,mCACD,CCFD,MACC,2CACD,CAEA,wBACC,qBAgBD,CAdC,yDACC,uCAAwC,CACxC,kCAWD,CATC,oJAEC,sBAAuB,CACvB,cACD,CAEA,sFACC,0BACD,CAKD,uCACC,aAAc,CAEd,qCAAsC,CADtC,UAUD,CAZA,iDAME,eAMF,CAZA,iDAUE,gBAEF,CAGC,8DACC,gDACD,CAEA,6DACC,mDACD,CAMD,6FAJC,oDAOD,CAHA,iDAEC,+BACD,CAEA,+BACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-image-insert-url {\n\t& .ck-image-insert-url__action-row {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(2, 1fr);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-image-insert-insert-by-url-width: 250px;\n}\n\n.ck.ck-image-insert-url {\n\t--ck-input-width: 100%;\n\n\t& .ck-image-insert-url__action-row {\n\t\tgrid-column-gap: var(--ck-spacing-large);\n\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t\tmin-width: auto;\n\t\t}\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n\n.ck.ck-image-insert-form {\n\t& > .ck.ck-button {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tpadding: var(--ck-list-button-padding);\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& > .ck.ck-collapsible {\n\t\t&:not(:first-child) {\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\t}\n\n\t\t&:not(:last-child) {\n\t\t\tborder-bottom: 1px solid var(--ck-color-base-border);\n\t\t}\n\n\t\tmin-width: var(--ck-image-insert-insert-by-url-width);\n\t}\n\n\t/* This is the case when there are no other integrations configured than insert by URL */\n\t& > .ck.ck-image-insert-url {\n\t\tmin-width: var(--ck-image-insert-insert-by-url-width);\n\t\tpadding: var(--ck-spacing-large);\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n}\n'],sourceRoot:""}]);const a=s},7378:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable img.image_placeholder{background-size:100% 100%}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageplaceholder.css"],names:[],mappings:"AAMC,8CACC,yBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& img.image_placeholder {\n\t\tbackground-size: 100% 100%;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3469:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content img.image_resized{height:auto}.ck-content .image.image_resized{box-sizing:border-box;display:block;max-width:100%}.ck-content .image.image_resized img{width:100%}.ck-content .image.image_resized>figcaption{display:block}.ck.ck-editor__editable td .image-inline.image_resized img,.ck.ck-editor__editable th .image-inline.image_resized img{max-width:100%}[dir=ltr] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon{margin-left:var(--ck-spacing-standard)}.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label{width:4em}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageresize.css"],names:[],mappings:"AAMA,8BACC,WACD,CAEA,iCAQC,qBAAsB,CADtB,aAAc,CANd,cAkBD,CATC,qCAEC,UACD,CAEA,4CAEC,aACD,CAQC,sHACC,cACD,CAIF,oFACC,uCACD,CAEA,oFACC,sCACD,CAEA,oEACC,SACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Preserve aspect ratio of the resized image after introducing image height attribute. */\n.ck-content img.image_resized {\n\theight: auto;\n}\n\n.ck-content .image.image_resized {\n\tmax-width: 100%;\n\t/*\n\tThe `
` element for resized images must not use `display:table` as browsers do not support `max-width` for it well.\n\tSee https://stackoverflow.com/questions/4019604/chrome-safari-ignoring-max-width-in-table/14420691#14420691 for more.\n\tFortunately, since we control the width, there is no risk that the image will look bad.\n\t*/\n\tdisplay: block;\n\tbox-sizing: border-box;\n\n\t& img {\n\t\t/* For resized images it is the `
` element that determines the image width. */\n\t\twidth: 100%;\n\t}\n\n\t& > figcaption {\n\t\t/* The `
` element uses `display:block`, so `
` also has to. */\n\t\tdisplay: block;\n\t}\n}\n\n.ck.ck-editor__editable {\n\t/* The resized inline image nested in the table should respect its parent size.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9117. */\n\t& td,\n\t& th {\n\t\t& .image-inline.image_resized img {\n\t\t\tmax-width: 100%;\n\t\t}\n\t}\n}\n\n[dir="ltr"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\n\tmargin-right: var(--ck-spacing-standard);\n}\n\n[dir="rtl"] .ck.ck-button.ck-button_with-text.ck-resize-image-button .ck-button__icon {\n\tmargin-left: var(--ck-spacing-standard);\n}\n\n.ck.ck-dropdown .ck-button.ck-resize-image-button .ck-button__label {\n\twidth: 4em;\n}\n'],sourceRoot:""}]);const a=s},6386:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-image-style-spacing:1.5em;--ck-inline-image-style-spacing:calc(var(--ck-image-style-spacing)/2)}.ck-content .image-style-block-align-left,.ck-content .image-style-block-align-right{max-width:calc(100% - var(--ck-image-style-spacing))}.ck-content .image-style-align-left,.ck-content .image-style-align-right{clear:none}.ck-content .image-style-side{float:right;margin-left:var(--ck-image-style-spacing);max-width:50%}.ck-content .image-style-align-left{float:left;margin-right:var(--ck-image-style-spacing)}.ck-content .image-style-align-center{margin-left:auto;margin-right:auto}.ck-content .image-style-align-right{float:right;margin-left:var(--ck-image-style-spacing)}.ck-content .image-style-block-align-right{margin-left:auto;margin-right:0}.ck-content .image-style-block-align-left{margin-left:0;margin-right:auto}.ck-content p+.image-style-align-left,.ck-content p+.image-style-align-right,.ck-content p+.image-style-side{margin-top:0}.ck-content .image-inline.image-style-align-left,.ck-content .image-inline.image-style-align-right{margin-bottom:var(--ck-inline-image-style-spacing);margin-top:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-left{margin-right:var(--ck-inline-image-style-spacing)}.ck-content .image-inline.image-style-align-right{margin-left:var(--ck-inline-image-style-spacing)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-background)}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__action:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton.ck-splitbutton_flatten:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover):after{display:none}.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__action:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled),.ck.ck-splitbutton.ck-splitbutton_flatten.ck-splitbutton_open:hover>.ck-splitbutton__arrow:not(.ck-disabled):not(:hover){background-color:var(--ck-color-button-on-hover-background)}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imagestyle.css"],names:[],mappings:"AAKA,MACC,8BAA+B,CAC/B,qEACD,CAMC,qFAEC,oDACD,CAIA,yEAEC,UACD,CAEA,8BACC,WAAY,CACZ,yCAA0C,CAC1C,aACD,CAEA,oCACC,UAAW,CACX,0CACD,CAEA,sCACC,gBAAiB,CACjB,iBACD,CAEA,qCACC,WAAY,CACZ,yCACD,CAEA,2CAEC,gBAAiB,CADjB,cAED,CAEA,0CACC,aAAc,CACd,iBACD,CAGA,6GAGC,YACD,CAGC,mGAGC,kDAAmD,CADnD,+CAED,CAEA,iDACC,iDACD,CAEA,kDACC,gDACD,CAUC,0lBAGC,qDAKD,CAHC,8nBACC,YACD,CAKD,oVAGC,2DACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-image-style-spacing: 1.5em;\n\t--ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);\n}\n\n.ck-content {\n\t/* Provides a minimal side margin for the left and right aligned images, so that the user has a visual feedback\n\tconfirming successful application of the style if image width exceeds the editor's size.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9342 */\n\t& .image-style-block-align-left,\n\t& .image-style-block-align-right {\n\t\tmax-width: calc(100% - var(--ck-image-style-spacing));\n\t}\n\n\t/* Allows displaying multiple floating images in the same line.\n\tSee https://github.com/ckeditor/ckeditor5/issues/9183#issuecomment-804988132 */\n\t& .image-style-align-left,\n\t& .image-style-align-right {\n\t\tclear: none;\n\t}\n\n\t& .image-style-side {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t\tmax-width: 50%;\n\t}\n\n\t& .image-style-align-left {\n\t\tfloat: left;\n\t\tmargin-right: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-align-center {\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\n\t& .image-style-align-right {\n\t\tfloat: right;\n\t\tmargin-left: var(--ck-image-style-spacing);\n\t}\n\n\t& .image-style-block-align-right {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t& .image-style-block-align-left {\n\t\tmargin-left: 0;\n\t\tmargin-right: auto;\n\t}\n\n\t/* Simulates margin collapsing with the preceding paragraph, which does not work for the floating elements. */\n\t& p + .image-style-align-left,\n\t& p + .image-style-align-right,\n\t& p + .image-style-side {\n\t\tmargin-top: 0;\n\t}\n\n\t& .image-inline {\n\t\t&.image-style-align-left,\n\t\t&.image-style-align-right {\n\t\t\tmargin-top: var(--ck-inline-image-style-spacing);\n\t\t\tmargin-bottom: var(--ck-inline-image-style-spacing);\n\t\t}\n\n\t\t&.image-style-align-left {\n\t\t\tmargin-right: var(--ck-inline-image-style-spacing);\n\t\t}\n\n\t\t&.image-style-align-right {\n\t\t\tmargin-left: var(--ck-inline-image-style-spacing);\n\t\t}\n\t}\n}\n\n.ck.ck-splitbutton {\n\t/* The button should display as a regular drop-down if the action button\n\tis forced to fire the same action as the arrow button. */\n\t&.ck-splitbutton_flatten {\n\t\t&:hover,\n\t\t&.ck-splitbutton_open {\n\t\t\t& > .ck-splitbutton__action:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\n\t\t\t\tbackground-color: var(--ck-color-button-on-background);\n\n\t\t\t\t&::after {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.ck-splitbutton_open:hover {\n\t\t\t& > .ck-splitbutton__action:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled),\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled):not(:hover) {\n\t\t\t\tbackground-color: var(--ck-color-button-on-hover-background);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},7693:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck-image-upload-complete-icon{border-radius:50%;display:block;position:absolute;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);z-index:1}.ck-image-upload-complete-icon:after{content:"";position:absolute}:root{--ck-color-image-upload-icon:#fff;--ck-color-image-upload-icon-background:#008a00;--ck-image-upload-icon-size:20;--ck-image-upload-icon-width:2px;--ck-image-upload-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck-image-upload-complete-icon{animation-delay:0ms,3s;animation-duration:.5s,.5s;animation-fill-mode:forwards,forwards;animation-name:ck-upload-complete-icon-show,ck-upload-complete-icon-hide;background:var(--ck-color-image-upload-icon-background);font-size:calc(1px*var(--ck-image-upload-icon-size));height:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size));opacity:0;overflow:hidden;width:calc(var(--ck-image-upload-icon-is-visible)*var(--ck-image-upload-icon-size))}.ck-image-upload-complete-icon:after{animation-delay:.5s;animation-duration:.5s;animation-fill-mode:forwards;animation-name:ck-upload-complete-icon-check;border-right:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);border-top:var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);box-sizing:border-box;height:0;left:25%;opacity:0;top:50%;transform:scaleX(-1) rotate(135deg);transform-origin:left top;width:0}@keyframes ck-upload-complete-icon-show{0%{opacity:0}to{opacity:1}}@keyframes ck-upload-complete-icon-hide{0%{opacity:1}to{opacity:0}}@keyframes ck-upload-complete-icon-check{0%{height:0;opacity:1;width:0}33%{height:0;width:.3em}to{height:.45em;opacity:1;width:.3em}}',"",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageuploadicon.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadicon.css"],names:[],mappings:"AAKA,+BAUC,iBAAkB,CATlB,aAAc,CACd,iBAAkB,CAOlB,sCAAwC,CADxC,oCAAsC,CAGtC,SAMD,CAJC,qCACC,UAAW,CACX,iBACD,CChBD,MACC,iCAA8C,CAC9C,+CAA4D,CAG5D,8BAA+B,CAC/B,gCAAiC,CACjC,4DACD,CAEA,+BAWC,sBAA4B,CAN5B,0BAAgC,CADhC,qCAAuC,CADvC,wEAA0E,CAD1E,uDAAwD,CAMxD,oDAAuD,CAWvD,oFAAuF,CAlBvF,SAAU,CAgBV,eAAgB,CAChB,mFA0BD,CAtBC,qCAgBC,mBAAsB,CADtB,sBAAyB,CAEzB,4BAA6B,CAH7B,4CAA6C,CAF7C,sFAAuF,CADvF,oFAAqF,CASrF,qBAAsB,CAdtB,QAAS,CAJT,QAAS,CAGT,SAAU,CADV,OAAQ,CAKR,mCAAoC,CACpC,yBAA0B,CAH1B,OAcD,CAGD,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,wCACC,GACC,SACD,CAEA,GACC,SACD,CACD,CAEA,yCACC,GAGC,QAAS,CAFT,SAAU,CACV,OAED,CACA,IAEC,QAAS,CADT,UAED,CACA,GAGC,YAAc,CAFd,SAAU,CACV,UAED,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-image-upload-complete-icon {\n\tdisplay: block;\n\tposition: absolute;\n\n\t/*\n\t * Smaller images should have the icon closer to the border.\n\t * Match the icon position with the linked image indicator brought by the link image feature.\n\t */\n\ttop: min(var(--ck-spacing-medium), 6%);\n\tright: min(var(--ck-spacing-medium), 6%);\n\tborder-radius: 50%;\n\tz-index: 1;\n\n\t&::after {\n\t\tcontent: "";\n\t\tposition: absolute;\n\t}\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-image-upload-icon: hsl(0, 0%, 100%);\n\t--ck-color-image-upload-icon-background: hsl(120, 100%, 27%);\n\n\t/* Match the icon size with the linked image indicator brought by the link image feature. */\n\t--ck-image-upload-icon-size: 20;\n\t--ck-image-upload-icon-width: 2px;\n\t--ck-image-upload-icon-is-visible: clamp(0px, 100% - 50px, 1px);\n}\n\n.ck-image-upload-complete-icon {\n\topacity: 0;\n\tbackground: var(--ck-color-image-upload-icon-background);\n\tanimation-name: ck-upload-complete-icon-show, ck-upload-complete-icon-hide;\n\tanimation-fill-mode: forwards, forwards;\n\tanimation-duration: 500ms, 500ms;\n\n\t/* To make animation scalable. */\n\tfont-size: calc(1px * var(--ck-image-upload-icon-size));\n\n\t/* Hide completed upload icon after 3 seconds. */\n\tanimation-delay: 0ms, 3000ms;\n\n\t/*\n\t * Use CSS math to simulate container queries.\n\t * https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\n\t */\n\toverflow: hidden;\n\twidth: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\n\theight: calc(var(--ck-image-upload-icon-is-visible) * var(--ck-image-upload-icon-size));\n\n\t/* This is check icon element made from border-width mixed with animations. */\n\t&::after {\n\t\t/* Because of border transformation we need to "hard code" left position. */\n\t\tleft: 25%;\n\n\t\ttop: 50%;\n\t\topacity: 0;\n\t\theight: 0;\n\t\twidth: 0;\n\n\t\ttransform: scaleX(-1) rotate(135deg);\n\t\ttransform-origin: left top;\n\t\tborder-top: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\t\tborder-right: var(--ck-image-upload-icon-width) solid var(--ck-color-image-upload-icon);\n\n\t\tanimation-name: ck-upload-complete-icon-check;\n\t\tanimation-duration: 500ms;\n\t\tanimation-delay: 500ms;\n\t\tanimation-fill-mode: forwards;\n\n\t\t/* #1095. While reset is not providing proper box-sizing for pseudoelements, we need to handle it. */\n\t\tbox-sizing: border-box;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-show {\n\tfrom {\n\t\topacity: 0;\n\t}\n\n\tto {\n\t\topacity: 1;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-hide {\n\tfrom {\n\t\topacity: 1;\n\t}\n\n\tto {\n\t\topacity: 0;\n\t}\n}\n\n@keyframes ck-upload-complete-icon-check {\n\t0% {\n\t\topacity: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t}\n\t33% {\n\t\twidth: 0.3em;\n\t\theight: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t\twidth: 0.3em;\n\t\theight: 0.45em;\n\t}\n}\n'],sourceRoot:""}]);const a=s},1559:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck .ck-upload-placeholder-loader{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:0}.ck .ck-upload-placeholder-loader:before{content:"";position:relative}:root{--ck-color-upload-placeholder-loader:#b3b3b3;--ck-upload-placeholder-loader-size:32px;--ck-upload-placeholder-image-aspect-ratio:2.8}.ck .ck-image-upload-placeholder{margin:0;width:100%}.ck .ck-image-upload-placeholder.image-inline{width:calc(var(--ck-upload-placeholder-loader-size)*2*var(--ck-upload-placeholder-image-aspect-ratio))}.ck .ck-image-upload-placeholder img{aspect-ratio:var(--ck-upload-placeholder-image-aspect-ratio)}.ck .ck-upload-placeholder-loader{height:100%;width:100%}.ck .ck-upload-placeholder-loader:before{animation:ck-upload-placeholder-loader 1s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:3px solid var(--ck-color-upload-placeholder-loader);height:var(--ck-upload-placeholder-loader-size);width:var(--ck-upload-placeholder-loader-size)}@keyframes ck-upload-placeholder-loader{to{transform:rotate(1turn)}}',"",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageuploadloader.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadloader.css"],names:[],mappings:"AAKA,kCAGC,kBAAmB,CADnB,YAAa,CAEb,sBAAuB,CAEvB,MAAO,CALP,iBAAkB,CAIlB,KAOD,CAJC,yCACC,UAAW,CACX,iBACD,CCXD,MACC,4CAAqD,CACrD,wCAAyC,CACzC,8CACD,CAEA,iCAGC,QAAS,CADT,UAgBD,CAbC,8CACC,sGACD,CAEA,qCAOC,4DACD,CAGD,kCAEC,WAAY,CADZ,UAWD,CARC,yCAMC,yDAA0D,CAH1D,iBAAkB,CAElB,kCAAmC,CADnC,8DAA+D,CAF/D,+CAAgD,CADhD,8CAMD,CAGD,wCACC,GACC,uBACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-upload-placeholder-loader {\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttop: 0;\n\tleft: 0;\n\n\t&::before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-upload-placeholder-loader: hsl(0, 0%, 70%);\n\t--ck-upload-placeholder-loader-size: 32px;\n\t--ck-upload-placeholder-image-aspect-ratio: 2.8;\n}\n\n.ck .ck-image-upload-placeholder {\n\t/* We need to control the full width of the SVG gray background. */\n\twidth: 100%;\n\tmargin: 0;\n\n\t&.image-inline {\n\t\twidth: calc( 2 * var(--ck-upload-placeholder-loader-size) * var(--ck-upload-placeholder-image-aspect-ratio) );\n\t}\n\n\t& img {\n\t\t/*\n\t\t * This is an arbitrary aspect for a 1x1 px GIF to display to the user. Not too tall, not too short.\n\t\t * There's nothing special about this number except that it should make the image placeholder look like\n\t\t * a real image during this short period after the upload started and before the image was read from the\n\t\t * file system (and a rich preview was loaded).\n\t\t */\n\t\taspect-ratio: var(--ck-upload-placeholder-image-aspect-ratio);\n\t}\n}\n\n.ck .ck-upload-placeholder-loader {\n\twidth: 100%;\n\theight: 100%;\n\n\t&::before {\n\t\twidth: var(--ck-upload-placeholder-loader-size);\n\t\theight: var(--ck-upload-placeholder-loader-size);\n\t\tborder-radius: 50%;\n\t\tborder-top: 3px solid var(--ck-color-upload-placeholder-loader);\n\t\tborder-right: 2px solid transparent;\n\t\tanimation: ck-upload-placeholder-loader 1s linear infinite;\n\t}\n}\n\n@keyframes ck-upload-placeholder-loader {\n\tto {\n\t\ttransform: rotate( 360deg );\n\t}\n}\n"],sourceRoot:""}]);const a=s},2267:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-editor__editable .image,.ck.ck-editor__editable .image-inline{position:relative}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{left:0;position:absolute;top:0}.ck.ck-editor__editable .image-inline.ck-appear,.ck.ck-editor__editable .image.ck-appear{animation:fadeIn .7s}.ck.ck-editor__editable .image .ck-progress-bar,.ck.ck-editor__editable .image-inline .ck-progress-bar{background:var(--ck-color-upload-bar-background);height:2px;transition:width .1s;width:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/imageuploadprogress.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-image/imageuploadprogress.css"],names:[],mappings:"AAMC,qEAEC,iBACD,CAGA,uGAIC,MAAO,CAFP,iBAAkB,CAClB,KAED,CCRC,yFACC,oBACD,CAID,uGAIC,gDAAiD,CAFjD,UAAW,CAGX,oBAAuB,CAFvB,OAGD,CAGD,kBACC,GAAO,SAAY,CACnB,GAAO,SAAY,CACpB",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& .image,\n\t& .image-inline {\n\t\tposition: relative;\n\t}\n\n\t/* Upload progress bar. */\n\t& .image .ck-progress-bar,\n\t& .image-inline .ck-progress-bar {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t& .image,\n\t& .image-inline {\n\t\t/* Showing animation. */\n\t\t&.ck-appear {\n\t\t\tanimation: fadeIn 700ms;\n\t\t}\n\t}\n\n\t/* Upload progress bar. */\n\t& .image .ck-progress-bar,\n\t& .image-inline .ck-progress-bar {\n\t\theight: 2px;\n\t\twidth: 0;\n\t\tbackground: var(--ck-color-upload-bar-background);\n\t\ttransition: width 100ms;\n\t}\n}\n\n@keyframes fadeIn {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n"],sourceRoot:""}]);const a=s},4062:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-text-alternative-form{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-text-alternative-form .ck-labeled-field-view{display:inline-block}.ck.ck-text-alternative-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-text-alternative-form{flex-wrap:wrap}.ck.ck-text-alternative-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-text-alternative-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./../ckeditor5-image/theme/textalternativeform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,6BACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,oDACC,oBACD,CAEA,uCACC,YACD,CCZA,oCDCD,6BAcE,cAUF,CARE,oDACC,eACD,CAEA,wCACC,cACD,CCrBD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-text-alternative-form {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},7719:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck .ck-link_selected{background:var(--ck-color-link-selected-background)}.ck .ck-link_selected span.image-inline{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background)}.ck .ck-fake-link-selection{background:var(--ck-color-link-fake-selection)}.ck .ck-fake-link-selection_collapsed{border-right:1px solid var(--ck-color-base-text);height:100%;margin-right:-1px;outline:1px solid hsla(0,0%,100%,.5)}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/link.css"],names:[],mappings:"AAMA,sBACC,mDAMD,CAHC,wCACC,yFACD,CAOD,4BACC,8CACD,CAGA,sCAEC,gDAAiD,CADjD,WAAY,CAEZ,iBAAkB,CAClB,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/* Class added to span element surrounding currently selected link. */\n.ck .ck-link_selected {\n\tbackground: var(--ck-color-link-selected-background);\n\n\t/* Give linked inline images some outline to let the user know they are also part of the link. */\n\t& span.image-inline {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-link-selected-background);\n\t}\n}\n\n/*\n * Classes used by the "fake visual selection" displayed in the content when an input\n * in the link UI has focus (the browser does not render the native selection in this state).\n */\n.ck .ck-fake-link-selection {\n\tbackground: var(--ck-color-link-fake-selection);\n}\n\n/* A collapsed fake visual selection. */\n.ck .ck-fake-link-selection_collapsed {\n\theight: 100%;\n\tborder-right: 1px solid var(--ck-color-base-text);\n\tmargin-right: -1px;\n\toutline: solid 1px hsla(0, 0%, 100%, .5);\n}\n'],sourceRoot:""}]);const a=s},8762:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-link-actions{display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-link-actions .ck-link-actions__preview{display:inline-block}.ck.ck-link-actions .ck-link-actions__preview .ck-button__label{overflow:hidden}@media screen and (max-width:600px){.ck.ck-link-actions{flex-wrap:wrap}.ck.ck-link-actions .ck-link-actions__preview{flex-basis:100%}.ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){flex-basis:50%}}.ck.ck-link-actions .ck-button.ck-link-actions__preview{padding-left:0;padding-right:0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{color:var(--ck-color-link-default);cursor:pointer;max-width:var(--ck-input-width);min-width:3em;padding:0 var(--ck-spacing-medium);text-align:center;text-overflow:ellipsis}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label:hover{text-decoration:underline}.ck.ck-link-actions .ck-button.ck-link-actions__preview,.ck.ck-link-actions .ck-button.ck-link-actions__preview:active,.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus,.ck.ck-link-actions .ck-button.ck-link-actions__preview:hover{background:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:active{box-shadow:none}.ck.ck-link-actions .ck-button.ck-link-actions__preview:focus .ck-button__label{text-decoration:underline}[dir=ltr] .ck.ck-link-actions .ck-button:not(:first-child),[dir=rtl] .ck.ck-link-actions .ck-button:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-link-actions .ck-button.ck-link-actions__preview{margin:var(--ck-spacing-standard) var(--ck-spacing-standard) 0}.ck.ck-link-actions .ck-button.ck-link-actions__preview .ck-button__label{max-width:100%;min-width:0}[dir=ltr] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview),[dir=rtl] .ck.ck-link-actions .ck-button:not(.ck-link-actions__preview){margin-left:0}}","",{version:3,sources:["webpack://./../ckeditor5-link/theme/linkactions.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/linkactions.css"],names:[],mappings:"AAOA,oBACC,YAAa,CACb,kBAAmB,CACnB,gBAqBD,CAnBC,8CACC,oBAKD,CAHC,gEACC,eACD,CCXD,oCDCD,oBAcE,cAUF,CARE,8CACC,eACD,CAEA,8DACC,cACD,CCrBD,CCIA,wDACC,cAAe,CACf,eAmCD,CAjCC,0EAEC,kCAAmC,CAEnC,cAAe,CAIf,+BAAgC,CAChC,aAAc,CARd,kCAAmC,CASnC,iBAAkB,CAPlB,sBAYD,CAHC,gFACC,yBACD,CAGD,mPAIC,eACD,CAEA,+DACC,eACD,CAGC,gFACC,yBACD,CAWD,qHACC,sCACD,CDtDD,oCC0DC,wDACC,8DAMD,CAJC,0EAEC,cAAe,CADf,WAED,CAGD,gJAME,aAEF,CDzED",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-link-actions__preview {\n\t\tdisplay: inline-block;\n\n\t\t& .ck-button__label {\n\t\t\toverflow: hidden;\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-link-actions__preview {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-actions {\n\t& .ck-button.ck-link-actions__preview {\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\n\t\t& .ck-button__label {\n\t\t\tpadding: 0 var(--ck-spacing-medium);\n\t\t\tcolor: var(--ck-color-link-default);\n\t\t\ttext-overflow: ellipsis;\n\t\t\tcursor: pointer;\n\n\t\t\t/* Match the box model of the link editor form\'s input so the balloon\n\t\t\tdoes not change width when moving between actions and the form. */\n\t\t\tmax-width: var(--ck-input-width);\n\t\t\tmin-width: 3em;\n\t\t\ttext-align: center;\n\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\n\t\t&,\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tbackground: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&:focus {\n\t\t\t& .ck-button__label {\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-button:not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-button:not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\t& .ck-button.ck-link-actions__preview {\n\t\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-standard) 0;\n\n\t\t\t& .ck-button__label {\n\t\t\t\tmin-width: 0;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-button:not(.ck-link-actions__preview) {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},3817:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-link-form{display:flex}.ck.ck-link-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-link-form{flex-wrap:wrap}.ck.ck-link-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-link-form .ck-button{flex-basis:50%}}.ck.ck-link-form_layout-vertical{display:block}.ck.ck-link-form_layout-vertical .ck-button.ck-button-cancel,.ck.ck-link-form_layout-vertical .ck-button.ck-button-save{margin-top:var(--ck-spacing-medium)}.ck.ck-link-form_layout-vertical{min-width:var(--ck-input-width);padding:0}.ck.ck-link-form_layout-vertical .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small)}.ck.ck-link-form_layout-vertical .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-link-form_layout-vertical>.ck-button{border-radius:0;margin:0;padding:var(--ck-spacing-standard);width:50%}.ck.ck-link-form_layout-vertical>.ck-button:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-link-form_layout-vertical>.ck-button,[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button{margin-left:0}[dir=rtl] .ck.ck-link-form_layout-vertical>.ck-button:last-of-type{border-right:1px solid var(--ck-color-base-border)}.ck.ck-link-form_layout-vertical .ck.ck-list{margin:var(--ck-spacing-standard) var(--ck-spacing-large)}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton{padding:0;width:100%}.ck.ck-link-form_layout-vertical .ck.ck-list .ck-button.ck-switchbutton:hover{background:none}","",{version:3,sources:["webpack://./../ckeditor5-link/theme/linkform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/linkform.css"],names:[],mappings:"AAOA,iBACC,YAiBD,CAfC,2BACC,YACD,CCNA,oCDCD,iBAQE,cAUF,CARE,wCACC,eACD,CAEA,4BACC,cACD,CCfD,CDuBD,iCACC,aAYD,CALE,wHAEC,mCACD,CE/BF,iCAEC,+BAAgC,CADhC,SAgDD,CA7CC,wDACC,8EAMD,CAJC,uEACC,WAAY,CACZ,UACD,CAGD,4CAIC,eAAgB,CAFhB,QAAS,CADT,kCAAmC,CAEnC,SAkBD,CAfC,wDACC,gDACD,CARD,4GAeE,aAMF,CAJE,mEACC,kDACD,CAKF,6CACC,yDAUD,CARC,wEACC,SAAU,CACV,UAKD,CAHC,8EACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-link-form {\n\tdisplay: flex;\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tdisplay: block;\n\n\t/*\n\t * Whether the form is in the responsive mode or not, if there are decorator buttons\n\t * keep the top margin of action buttons medium.\n\t */\n\t& .ck-button {\n\t\t&.ck-button-save,\n\t\t&.ck-button-cancel {\n\t\t\tmargin-top: var(--ck-spacing-medium);\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/*\n * Style link form differently when manual decorators are available.\n * See: https://github.com/ckeditor/ckeditor5-link/issues/186.\n */\n.ck.ck-link-form_layout-vertical {\n\tpadding: 0;\n\tmin-width: var(--ck-input-width);\n\n\t& .ck-labeled-field-view {\n\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) var(--ck-spacing-small);\n\n\t\t& .ck-input-text {\n\t\t\tmin-width: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n\n\t& > .ck-button {\n\t\tpadding: var(--ck-spacing-standard);\n\t\tmargin: 0;\n\t\twidth: 50%;\n\t\tborder-radius: 0;\n\n\t\t&:not(:focus) {\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\t}\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: 0;\n\n\t\t\t&:last-of-type {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Using additional `.ck` class for stronger CSS specificity than `.ck.ck-link-form > :not(:first-child)`. */\n\t& .ck.ck-list {\n\t\tmargin: var(--ck-spacing-standard) var(--ck-spacing-large);\n\n\t\t& .ck-button.ck-switchbutton {\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\n\t\t\t&:hover {\n\t\t\t\tbackground: none;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},4808:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{display:block;position:absolute}:root{--ck-link-image-indicator-icon-size:20;--ck-link-image-indicator-icon-is-visible:clamp(0px,100% - 50px,1px)}.ck.ck-editor__editable a span.image-inline:after,.ck.ck-editor__editable figure.image>a:after{background-color:rgba(0,0,0,.4);background-image:url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+");background-position:50%;background-repeat:no-repeat;background-size:14px;border-radius:100%;content:"";height:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size));overflow:hidden;right:min(var(--ck-spacing-medium),6%);top:min(var(--ck-spacing-medium),6%);width:calc(var(--ck-link-image-indicator-icon-is-visible)*var(--ck-link-image-indicator-icon-size))}',"",{version:3,sources:["webpack://./../ckeditor5-link/theme/linkimage.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-link/linkimage.css"],names:[],mappings:"AASE,+FACC,aAAc,CACd,iBACD,CCPF,MAEC,sCAAuC,CACvC,oEACD,CAME,+FAUC,+BAAqC,CACrC,83BAA+3B,CAG/3B,uBAA2B,CAD3B,2BAA4B,CAD5B,oBAAqB,CAGrB,kBAAmB,CAdnB,UAAW,CAsBX,oGAAuG,CAFvG,eAAgB,CAbhB,sCAAwC,CADxC,oCAAsC,CAetC,mGAED",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-editor__editable {\n\t/* Linked image indicator */\n\t& figure.image > a,\n\t& a span.image-inline {\n\t\t&::after {\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t}\n\t}\n}\n\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Match the icon size with the upload indicator brought by the image upload feature. */\n\t--ck-link-image-indicator-icon-size: 20;\n\t--ck-link-image-indicator-icon-is-visible: clamp(0px, 100% - 50px, 1px);\n}\n\n.ck.ck-editor__editable {\n\t/* Linked image indicator */\n\t& figure.image > a,\n\t& a span.image-inline {\n\t\t&::after {\n\t\t\tcontent: "";\n\n\t\t\t/*\n\t\t\t * Smaller images should have the icon closer to the border.\n\t\t\t * Match the icon position with the upload indicator brought by the image upload feature.\n\t\t\t */\n\t\t\ttop: min(var(--ck-spacing-medium), 6%);\n\t\t\tright: min(var(--ck-spacing-medium), 6%);\n\n\t\t\tbackground-color: hsla(0, 0%, 0%, .4);\n\t\t\tbackground-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTExLjA3NyAxNSAuOTkxLTEuNDE2YS43NS43NSAwIDEgMSAxLjIyOS44NmwtMS4xNDggMS42NGEuNzQ4Ljc0OCAwIDAgMS0uMjE3LjIwNiA1LjI1MSA1LjI1MSAwIDAgMS04LjUwMy01Ljk1NS43NDEuNzQxIDAgMCAxIC4xMi0uMjc0bDEuMTQ3LTEuNjM5YS43NS43NSAwIDEgMSAxLjIyOC44Nkw0LjkzMyAxMC43bC4wMDYuMDAzYTMuNzUgMy43NSAwIDAgMCA2LjEzMiA0LjI5NGwuMDA2LjAwNHptNS40OTQtNS4zMzVhLjc0OC43NDggMCAwIDEtLjEyLjI3NGwtMS4xNDcgMS42MzlhLjc1Ljc1IDAgMSAxLTEuMjI4LS44NmwuODYtMS4yM2EzLjc1IDMuNzUgMCAwIDAtNi4xNDQtNC4zMDFsLS44NiAxLjIyOWEuNzUuNzUgMCAwIDEtMS4yMjktLjg2bDEuMTQ4LTEuNjRhLjc0OC43NDggMCAwIDEgLjIxNy0uMjA2IDUuMjUxIDUuMjUxIDAgMCAxIDguNTAzIDUuOTU1em0tNC41NjMtMi41MzJhLjc1Ljc1IDAgMCAxIC4xODQgMS4wNDVsLTMuMTU1IDQuNTA1YS43NS43NSAwIDEgMS0xLjIyOS0uODZsMy4xNTUtNC41MDZhLjc1Ljc1IDAgMCAxIDEuMDQ1LS4xODR6Ii8+PC9zdmc+");\n\t\t\tbackground-size: 14px;\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tborder-radius: 100%;\n\n\t\t\t/*\n\t\t\t* Use CSS math to simulate container queries.\n\t\t\t* https://css-tricks.com/the-raven-technique-one-step-closer-to-container-queries/#what-about-showing-and-hiding-things\n\t\t\t*/\n\t\t\toverflow: hidden;\n\t\t\twidth: calc(var(--ck-link-image-indicator-icon-is-visible) * var(--ck-link-image-indicator-icon-size));\n\t\t\theight: calc(var(--ck-link-image-indicator-icon-is-visible) * var(--ck-link-image-indicator-icon-size));\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]);const a=s},1232:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-editor__editable .ck-list-bogus-paragraph{display:block}","",{version:3,sources:["webpack://./../ckeditor5-list/theme/documentlist.css"],names:[],mappings:"AAKA,8CACC,aACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-editor__editable .ck-list-bogus-paragraph {\n\tdisplay: block;\n}\n"],sourceRoot:""}]);const a=s},6903:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content ol{list-style-type:decimal}.ck-content ol ol{list-style-type:lower-latin}.ck-content ol ol ol{list-style-type:lower-roman}.ck-content ol ol ol ol{list-style-type:upper-latin}.ck-content ol ol ol ol ol{list-style-type:upper-roman}.ck-content ul{list-style-type:disc}.ck-content ul ul{list-style-type:circle}.ck-content ul ul ul,.ck-content ul ul ul ul{list-style-type:square}","",{version:3,sources:["webpack://./../ckeditor5-list/theme/list.css"],names:[],mappings:"AAKA,eACC,uBAiBD,CAfC,kBACC,2BAaD,CAXC,qBACC,2BASD,CAPC,wBACC,2BAKD,CAHC,2BACC,2BACD,CAMJ,eACC,oBAaD,CAXC,kBACC,sBASD,CAJE,6CACC,sBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content ol {\n\tlist-style-type: decimal;\n\n\t& ol {\n\t\tlist-style-type: lower-latin;\n\n\t\t& ol {\n\t\t\tlist-style-type: lower-roman;\n\n\t\t\t& ol {\n\t\t\t\tlist-style-type: upper-latin;\n\n\t\t\t\t& ol {\n\t\t\t\t\tlist-style-type: upper-roman;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck-content ul {\n\tlist-style-type: disc;\n\n\t& ul {\n\t\tlist-style-type: circle;\n\n\t\t& ul {\n\t\t\tlist-style-type: square;\n\n\t\t\t& ul {\n\t\t\t\tlist-style-type: square;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},9968:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-list-properties.ck-list-properties_without-styles{padding:var(--ck-spacing-large)}.ck.ck-list-properties.ck-list-properties_without-styles>*{min-width:14em}.ck.ck-list-properties.ck-list-properties_without-styles>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-list-styles-list{grid-template-columns:repeat(4,auto)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible{border-top:1px solid var(--ck-color-base-border)}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*{width:100%}.ck.ck-list-properties.ck-list-properties_with-numbered-properties>.ck-collapsible>.ck-collapsible__children>*+*{margin-top:var(--ck-spacing-standard)}.ck.ck-list-properties .ck.ck-numbered-list-properties__start-index .ck-input{min-width:auto;width:100%}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order{background:transparent;margin-bottom:calc(var(--ck-spacing-tiny)*-1);padding-left:0;padding-right:0}.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:active,.ck.ck-list-properties .ck.ck-numbered-list-properties__reversed-order:hover{background:none;border-color:transparent;box-shadow:none}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-list/listproperties.css"],names:[],mappings:"AAOC,yDACC,+BASD,CAPC,2DACC,cAKD,CAHC,6DACC,qCACD,CASD,wFACC,oCACD,CAGA,mFACC,gDAWD,CARE,+GACC,UAKD,CAHC,iHACC,qCACD,CAMJ,8EACC,cAAe,CACf,UACD,CAEA,uEACC,sBAAuB,CAGvB,6CAAgD,CAFhD,cAAe,CACf,eAQD,CALC,2JAGC,eAAgB,CADhB,wBAAyB,CADzB,eAGD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-list-properties {\n\t/* When there are no list styles and there is no collapsible. */\n\t&.ck-list-properties_without-styles {\n\t\tpadding: var(--ck-spacing-large);\n\n\t\t& > * {\n\t\t\tmin-width: 14em;\n\n\t\t\t& + * {\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * When the numbered list property fields (start at, reversed) should be displayed,\n\t * more horizontal space is needed. Reconfigure the style grid to create that space.\n\t */\n\t&.ck-list-properties_with-numbered-properties {\n\t\t& > .ck-list-styles-list {\n\t\t\tgrid-template-columns: repeat( 4, auto );\n\t\t}\n\n\t\t/* When list styles are rendered and property fields are in a collapsible. */\n\t\t& > .ck-collapsible {\n\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\n\t\t\t& > .ck-collapsible__children {\n\t\t\t\t& > * {\n\t\t\t\t\twidth: 100%;\n\n\t\t\t\t\t& + * {\n\t\t\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-numbered-list-properties__start-index .ck-input {\n\t\tmin-width: auto;\n\t\twidth: 100%;\n\t}\n\n\t& .ck.ck-numbered-list-properties__reversed-order {\n\t\tbackground: transparent;\n\t\tpadding-left: 0;\n\t\tpadding-right: 0;\n\t\tmargin-bottom: calc(-1 * var(--ck-spacing-tiny));\n\n\t\t&:active, &:hover {\n\t\t\tbox-shadow: none;\n\t\t\tborder-color: transparent;\n\t\t\tbackground: none;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},7141:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-list-styles-list{display:grid}:root{--ck-list-style-button-size:44px}.ck.ck-list-styles-list{column-gap:var(--ck-spacing-medium);grid-template-columns:repeat(3,auto);padding:var(--ck-spacing-large);row-gap:var(--ck-spacing-medium)}.ck.ck-list-styles-list .ck-button{box-sizing:content-box;margin:0;padding:0}.ck.ck-list-styles-list .ck-button,.ck.ck-list-styles-list .ck-button .ck-icon{height:var(--ck-list-style-button-size);width:var(--ck-list-style-button-size)}","",{version:3,sources:["webpack://./../ckeditor5-list/theme/liststyles.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-list/liststyles.css"],names:[],mappings:"AAKA,wBACC,YACD,CCFA,MACC,gCACD,CAEA,wBAGC,mCAAoC,CAFpC,oCAAwC,CAGxC,+BAAgC,CAFhC,gCA4BD,CAxBC,mCAiBC,sBAAuB,CAPvB,QAAS,CANT,SAmBD,CAJC,+EAhBA,uCAAwC,CADxC,sCAoBA",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-list-styles-list {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-list-style-button-size: 44px;\n}\n\n.ck.ck-list-styles-list {\n\tgrid-template-columns: repeat( 3, auto );\n\trow-gap: var(--ck-spacing-medium);\n\tcolumn-gap: var(--ck-spacing-medium);\n\tpadding: var(--ck-spacing-large);\n\n\t& .ck-button {\n\t\t/* Make the button look like a thumbnail (the icon "takes it all"). */\n\t\twidth: var(--ck-list-style-button-size);\n\t\theight: var(--ck-list-style-button-size);\n\t\tpadding: 0;\n\n\t\t/*\n\t\t * Buttons are aligned by the grid so disable default button margins to not collide with the\n\t\t * gaps in the grid.\n\t\t */\n\t\tmargin: 0;\n\n\t\t/*\n\t\t * Make sure the button border (which is displayed on focus, BTW) does not steal pixels\n\t\t * from the button dimensions and, as a result, decrease the size of the icon\n\t\t * (which becomes blurry as it scales down).\n\t\t */\n\t\tbox-sizing: content-box;\n\n\t\t& .ck-icon {\n\t\t\twidth: var(--ck-list-style-button-size);\n\t\t\theight: var(--ck-list-style-button-size);\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},8991:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,':root{--ck-todo-list-checkmark-size:16px}.ck-content .todo-list{list-style:none}.ck-content .todo-list li{margin-bottom:5px;position:relative}.ck-content .todo-list li .todo-list{margin-top:5px}.ck-content .todo-list .todo-list__label>input{-webkit-appearance:none;border:0;display:inline-block;height:var(--ck-todo-list-checkmark-size);left:-25px;margin-left:0;margin-right:-15px;position:relative;right:0;vertical-align:middle;width:var(--ck-todo-list-checkmark-size)}.ck-content[dir=rtl] .todo-list .todo-list__label>input{left:0;margin-left:-15px;margin-right:0;right:-25px}.ck-content .todo-list .todo-list__label>input:before{border:1px solid #333;border-radius:2px;box-sizing:border-box;content:"";display:block;height:100%;position:absolute;transition:box-shadow .25s ease-in-out;width:100%}.ck-content .todo-list .todo-list__label>input:after{border-color:transparent;border-style:solid;border-width:0 calc(var(--ck-todo-list-checkmark-size)/8) calc(var(--ck-todo-list-checkmark-size)/8) 0;box-sizing:content-box;content:"";display:block;height:calc(var(--ck-todo-list-checkmark-size)/2.6);left:calc(var(--ck-todo-list-checkmark-size)/3);pointer-events:none;position:absolute;top:calc(var(--ck-todo-list-checkmark-size)/5.3);transform:rotate(45deg);width:calc(var(--ck-todo-list-checkmark-size)/5.3)}.ck-content .todo-list .todo-list__label>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-content .todo-list .todo-list__label>input[checked]:after{border-color:#fff}.ck-content .todo-list .todo-list__label .todo-list__label__description{vertical-align:middle}.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{position:absolute}.ck-editor__editable.ck-content .todo-list .todo-list__label>input,.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input{cursor:pointer}.ck-editor__editable.ck-content .todo-list .todo-list__label>input:hover:before,.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:hover:before{box-shadow:0 0 0 5px rgba(0,0,0,.1)}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input{-webkit-appearance:none;border:0;display:inline-block;height:var(--ck-todo-list-checkmark-size);left:-25px;margin-left:0;margin-right:-15px;position:relative;right:0;vertical-align:middle;width:var(--ck-todo-list-checkmark-size)}.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label>span[contenteditable=false]>input{left:0;margin-left:-15px;margin-right:0;right:-25px}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:before{border:1px solid #333;border-radius:2px;box-sizing:border-box;content:"";display:block;height:100%;position:absolute;transition:box-shadow .25s ease-in-out;width:100%}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input:after{border-color:transparent;border-style:solid;border-width:0 calc(var(--ck-todo-list-checkmark-size)/8) calc(var(--ck-todo-list-checkmark-size)/8) 0;box-sizing:content-box;content:"";display:block;height:calc(var(--ck-todo-list-checkmark-size)/2.6);left:calc(var(--ck-todo-list-checkmark-size)/3);pointer-events:none;position:absolute;top:calc(var(--ck-todo-list-checkmark-size)/5.3);transform:rotate(45deg);width:calc(var(--ck-todo-list-checkmark-size)/5.3)}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:before{background:#26ab33;border-color:#26ab33}.ck-editor__editable.ck-content .todo-list .todo-list__label>span[contenteditable=false]>input[checked]:after{border-color:#fff}.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{position:absolute}',"",{version:3,sources:["webpack://./../ckeditor5-list/theme/todolist.css"],names:[],mappings:"AAKA,MACC,kCACD,CAwEA,uBACC,eAwBD,CAtBC,0BAEC,iBAAkB,CADlB,iBAMD,CAHC,qCACC,cACD,CAIA,+CAlFD,uBAAwB,CAQxB,QAAS,CAPT,oBAAqB,CAGrB,yCAA0C,CAO1C,UAAW,CAGX,aAAc,CAFd,kBAAmB,CAVnB,iBAAkB,CAWlB,OAAQ,CARR,qBAAsB,CAFtB,wCAiFC,CAFA,wDAhEA,MAAO,CAGP,iBAAkB,CAFlB,cAAe,CACf,WAgEA,CA5DD,sDAOC,qBAAiC,CACjC,iBAAkB,CALlB,qBAAsB,CACtB,UAAW,CAHX,aAAc,CAKd,WAAY,CAJZ,iBAAkB,CAOlB,sCAAwC,CAJxC,UAKD,CAEA,qDAaC,wBAAyB,CADzB,kBAAmB,CAEnB,sGAA+G,CAX/G,sBAAuB,CAEvB,UAAW,CAJX,aAAc,CAUd,mDAAwD,CAHxD,+CAAoD,CAJpD,mBAAoB,CAFpB,iBAAkB,CAOlB,gDAAqD,CAMrD,uBAAwB,CALxB,kDAMD,CAGC,+DACC,kBAA8B,CAC9B,oBACD,CAEA,8DACC,iBACD,CAwBA,wEACC,qBACD,CAEA,mGACC,iBACD,CAYD,kKAEC,cAKD,CAHC,4LACC,mCACD,CAMD,+FApHA,uBAAwB,CAQxB,QAAS,CAPT,oBAAqB,CAGrB,yCAA0C,CAO1C,UAAW,CAGX,aAAc,CAFd,kBAAmB,CAVnB,iBAAkB,CAWlB,OAAQ,CARR,qBAAsB,CAFtB,wCAmHA,CAFA,wGAlGC,MAAO,CAGP,iBAAkB,CAFlB,cAAe,CACf,WAkGD,CA9FA,sGAOC,qBAAiC,CACjC,iBAAkB,CALlB,qBAAsB,CACtB,UAAW,CAHX,aAAc,CAKd,WAAY,CAJZ,iBAAkB,CAOlB,sCAAwC,CAJxC,UAKD,CAEA,qGAaC,wBAAyB,CADzB,kBAAmB,CAEnB,sGAA+G,CAX/G,sBAAuB,CAEvB,UAAW,CAJX,aAAc,CAUd,mDAAwD,CAHxD,+CAAoD,CAJpD,mBAAoB,CAFpB,iBAAkB,CAOlB,gDAAqD,CAMrD,uBAAwB,CALxB,kDAMD,CAGC,+GACC,kBAA8B,CAC9B,oBACD,CAEA,8GACC,iBACD,CA2DA,uHACC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-todo-list-checkmark-size: 16px;\n}\n\n@define-mixin todo-list-checkbox {\n\t-webkit-appearance: none;\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: var(--ck-todo-list-checkmark-size);\n\theight: var(--ck-todo-list-checkmark-size);\n\tvertical-align: middle;\n\n\t/* Needed on iOS */\n\tborder: 0;\n\n\t/* LTR styles */\n\tleft: -25px;\n\tmargin-right: -15px;\n\tright: 0;\n\tmargin-left: 0;\n\n\t/* RTL styles */\n\t@nest [dir=rtl]& {\n\t\tleft: 0;\n\t\tmargin-right: 0;\n\t\tright: -25px;\n\t\tmargin-left: -15px;\n\t}\n\n\t&::before {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tbox-sizing: border-box;\n\t\tcontent: '';\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tborder: 1px solid hsl(0, 0%, 20%);\n\t\tborder-radius: 2px;\n\t\ttransition: 250ms ease-in-out box-shadow;\n\t}\n\n\t&::after {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tbox-sizing: content-box;\n\t\tpointer-events: none;\n\t\tcontent: '';\n\n\t\t/* Calculate tick position, size and border-width proportional to the checkmark size. */\n\t\tleft: calc( var(--ck-todo-list-checkmark-size) / 3 );\n\t\ttop: calc( var(--ck-todo-list-checkmark-size) / 5.3 );\n\t\twidth: calc( var(--ck-todo-list-checkmark-size) / 5.3 );\n\t\theight: calc( var(--ck-todo-list-checkmark-size) / 2.6 );\n\t\tborder-style: solid;\n\t\tborder-color: transparent;\n\t\tborder-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;\n\t\ttransform: rotate(45deg);\n\t}\n\n\t&[checked] {\n\t\t&::before {\n\t\t\tbackground: hsl(126, 64%, 41%);\n\t\t\tborder-color: hsl(126, 64%, 41%);\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: hsl(0, 0%, 100%);\n\t\t}\n\t}\n}\n\n/*\n * To-do list content styles.\n */\n.ck-content .todo-list {\n\tlist-style: none;\n\n\t& li {\n\t\tposition: relative;\n\t\tmargin-bottom: 5px;\n\n\t\t& .todo-list {\n\t\t\tmargin-top: 5px;\n\t\t}\n\t}\n\n\t& .todo-list__label {\n\t\t& > input {\n\t\t\t@mixin todo-list-checkbox;\n\t\t}\n\n\t\t& .todo-list__label__description {\n\t\t\tvertical-align: middle;\n\t\t}\n\n\t\t&.todo-list__label_without-description input[type=checkbox] {\n\t\t\tposition: absolute;\n\t\t}\n\t}\n}\n\n/*\n * To-do list editing view styles.\n */\n.ck-editor__editable.ck-content .todo-list .todo-list__label {\n\t/*\n\t * To-do list should be interactive only during the editing\n\t * (https://github.com/ckeditor/ckeditor5/issues/2090).\n\t */\n\t& > input,\n\t& > span[contenteditable=false] > input {\n\t\tcursor: pointer;\n\n\t\t&:hover::before {\n\t\t\tbox-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1);\n\t\t}\n\t}\n\n\t/*\n\t * Document Lists - editing view has an additional span around checkbox.\n\t */\n\t& > span[contenteditable=false] > input {\n\t\t@mixin todo-list-checkbox;\n\t}\n\n\t&.todo-list__label_without-description {\n\t\t& input[type=checkbox] {\n\t\t\tposition: absolute;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},70:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content .media{clear:both;display:block;margin:.9em 0;min-width:15em}","",{version:3,sources:["webpack://./../ckeditor5-media-embed/theme/mediaembed.css"],names:[],mappings:"AAKA,mBAGC,UAAW,CASX,aAAc,CAJd,aAAe,CAQf,cACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .media {\n\t/* Don\'t allow floated content overlap the media.\n\thttps://github.com/ckeditor/ckeditor5-media-embed/issues/53 */\n\tclear: both;\n\n\t/* Make sure there is some space between the content and the media. */\n\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\tmargin: 0.9em 0;\n\n\t/* Make sure media is not overriden with Bootstrap default `flex` value.\n\tSee: https://github.com/ckeditor/ckeditor5/issues/1373. */\n\tdisplay: block;\n\n\t/* Give the media some minimal width in the content to prevent them\n\tfrom being "squashed" in tight spaces, e.g. in table cells (#44) */\n\tmin-width: 15em;\n}\n'],sourceRoot:""}]);const a=s},7048:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck-media__wrapper .ck-media__placeholder{align-items:center;display:flex;flex-direction:column}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url{max-width:100%;position:relative}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url .ck-media__placeholder__url__text{display:block;overflow:hidden}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon *,.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck-media__placeholder__icon *{display:none}.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper>:not(.ck-media__placeholder),.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder{pointer-events:none}:root{--ck-media-embed-placeholder-icon-size:3em;--ck-color-media-embed-placeholder-url-text:#757575;--ck-color-media-embed-placeholder-url-text-hover:var(--ck-color-base-text)}.ck-media__wrapper{margin:0 auto}.ck-media__wrapper .ck-media__placeholder{background:var(--ck-color-base-foreground);padding:calc(var(--ck-spacing-standard)*3)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon{background-position:50%;background-size:cover;height:var(--ck-media-embed-placeholder-icon-size);margin-bottom:var(--ck-spacing-large);min-width:var(--ck-media-embed-placeholder-icon-size)}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__icon .ck-icon{height:100%;width:100%}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text{color:var(--ck-color-media-embed-placeholder-url-text);font-style:italic;text-align:center;text-overflow:ellipsis;white-space:nowrap}.ck-media__wrapper .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:var(--ck-color-media-embed-placeholder-url-text-hover);cursor:pointer;text-decoration:underline}.ck-media__wrapper[data-oembed-url*="open.spotify.com"]{max-height:380px;max-width:300px}.ck-media__wrapper[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon,.ck-media__wrapper[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Im0yMDYuNDc3IDI2MC45LTI4Ljk4NyAyOC45ODdhNS4yMTggNS4yMTggMCAwIDAgMy43OCAxLjYxaDQ5LjYyMWMxLjY5NCAwIDMuMTktLjc5OCA0LjE0Ni0yLjAzN3oiIGZpbGw9IiM1Yzg4YzUiLz48cGF0aCBkPSJNMjI2Ljc0MiAyMjIuOTg4Yy05LjI2NiAwLTE2Ljc3NyA3LjE3LTE2Ljc3NyAxNi4wMTQuMDA3IDIuNzYyLjY2MyA1LjQ3NCAyLjA5MyA3Ljg3NS40My43MDMuODMgMS40MDggMS4xOSAyLjEwNy4zMzMuNTAyLjY1IDEuMDA1Ljk1IDEuNTA4LjM0My40NzcuNjczLjk1Ny45ODggMS40NCAxLjMxIDEuNzY5IDIuNSAzLjUwMiAzLjYzNyA1LjE2OC43OTMgMS4yNzUgMS42ODMgMi42NCAyLjQ2NiAzLjk5IDIuMzYzIDQuMDk0IDQuMDA3IDguMDkyIDQuNiAxMy45MTR2LjAxMmMuMTgyLjQxMi41MTYuNjY2Ljg3OS42NjcuNDAzLS4wMDEuNzY4LS4zMTQuOTMtLjc5OS42MDMtNS43NTYgMi4yMzgtOS43MjkgNC41ODUtMTMuNzk0Ljc4Mi0xLjM1IDEuNjczLTIuNzE1IDIuNDY1LTMuOTkgMS4xMzctMS42NjYgMi4zMjgtMy40IDMuNjM4LTUuMTY5LjMxNS0uNDgyLjY0NS0uOTYyLjk4OC0xLjQzOS4zLS41MDMuNjE3LTEuMDA2Ljk1LTEuNTA4LjM1OS0uNy43Ni0xLjQwNCAxLjE5LTIuMTA3IDEuNDI2LTIuNDAyIDItNS4xMTQgMi4wMDQtNy44NzUgMC04Ljg0NC03LjUxMS0xNi4wMTQtMTYuNzc2LTE2LjAxNHoiIGZpbGw9IiNkZDRiM2UiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PGVsbGlwc2Ugcnk9IjUuNTY0IiByeD0iNS44MjgiIGN5PSIyMzkuMDAyIiBjeD0iMjI2Ljc0MiIgZmlsbD0iIzgwMmQyNyIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMTkwLjMwMSAyMzcuMjgzYy00LjY3IDAtOC40NTcgMy44NTMtOC40NTcgOC42MDZzMy43ODYgOC42MDcgOC40NTcgOC42MDdjMy4wNDMgMCA0LjgwNi0uOTU4IDYuMzM3LTIuNTE2IDEuNTMtMS41NTcgMi4wODctMy45MTMgMi4wODctNi4yOSAwLS4zNjItLjAyMy0uNzIyLS4wNjQtMS4wNzloLTguMjU3djMuMDQzaDQuODVjLS4xOTcuNzU5LS41MzEgMS40NS0xLjA1OCAxLjk4Ni0uOTQyLjk1OC0yLjAyOCAxLjU0OC0zLjkwMSAxLjU0OC0yLjg3NiAwLTUuMjA4LTIuMzcyLTUuMjA4LTUuMjk5IDAtMi45MjYgMi4zMzItNS4yOTkgNS4yMDgtNS4yOTkgMS4zOTkgMCAyLjYxOC40MDcgMy41ODQgMS4yOTNsMi4zODEtMi4zOGMwLS4wMDItLjAwMy0uMDA0LS4wMDQtLjAwNS0xLjU4OC0xLjUyNC0zLjYyLTIuMjE1LTUuOTU1LTIuMjE1em00LjQzIDUuNjYuMDAzLjAwNnYtLjAwM3oiIGZpbGw9IiNmZmYiIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0ibTIxNS4xODQgMjUxLjkyOS03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVhNS4yMzMgNS4yMzMgMCAwIDAgLjQ0OS0yLjEyM3YtMzEuMTY1Yy0uNDY5LjY3NS0uOTM0IDEuMzQ5LTEuMzgyIDIuMDA1LS43OTIgMS4yNzUtMS42ODIgMi42NC0yLjQ2NSAzLjk5LTIuMzQ3IDQuMDY1LTMuOTgyIDguMDM4LTQuNTg1IDEzLjc5NC0uMTYyLjQ4NS0uNTI3Ljc5OC0uOTMuNzk5LS4zNjMtLjAwMS0uNjk3LS4yNTUtLjg3OS0uNjY3di0uMDEyYy0uNTkzLTUuODIyLTIuMjM3LTkuODItNC42LTEzLjkxNC0uNzgzLTEuMzUtMS42NzMtMi43MTUtMi40NjYtMy45OS0xLjEzNy0xLjY2Ni0yLjMyNy0zLjQtMy42MzctNS4xNjlsLS4wMDItLjAwM3oiIGZpbGw9IiNjM2MzYzMiLz48cGF0aCBkPSJtMjEyLjk4MyAyNDguNDk1LTM2Ljk1MiAzNi45NTN2LjgxMmE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOCA1LjIzOGgxLjAxNWwzNS42NjYtMzUuNjY2YTEzNi4yNzUgMTM2LjI3NSAwIDAgMC0yLjc2NC0zLjkgMzcuNTc1IDM3LjU3NSAwIDAgMC0uOTg5LTEuNDQgMzUuMTI3IDM1LjEyNyAwIDAgMC0uOTUtMS41MDhjLS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJtMjExLjk5OCAyNjEuMDgzLTYuMTUyIDYuMTUxIDI0LjI2NCAyNC4yNjRoLjc4MWE1LjIyNyA1LjIyNyAwIDAgMCA1LjIzOS01LjIzOHYtMS4wNDV6IiBmaWxsPSIjZmZmIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjwvZz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder{background:#4268b3}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAyNCIgaGVpZ2h0PSIxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NjcuNDg0IDBINTYuNTE3QzI1LjMwNCAwIDAgMjUuMzA0IDAgNTYuNTE3djkxMC45NjZDMCA5OTguNjk0IDI1LjI5NyAxMDI0IDU2LjUyMiAxMDI0SDU0N1Y2MjhINDE0VjQ3M2gxMzNWMzU5LjAyOWMwLTEzMi4yNjIgODAuNzczLTIwNC4yODIgMTk4Ljc1Ni0yMDQuMjgyIDU2LjUxMyAwIDEwNS4wODYgNC4yMDggMTE5LjI0NCA2LjA4OVYyOTlsLTgxLjYxNi4wMzdjLTYzLjk5MyAwLTc2LjM4NCAzMC40OTItNzYuMzg0IDc1LjIzNlY0NzNoMTUzLjQ4N2wtMTkuOTg2IDE1NUg3MDd2Mzk2aDI2MC40ODRjMzEuMjEzIDAgNTYuNTE2LTI1LjMwMyA1Ni41MTYtNTYuNTE2VjU2LjUxNUMxMDI0IDI1LjMwMyA5OTguNjk3IDAgOTY3LjQ4NCAwIiBmaWxsPSIjRkZGRkZFIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#cdf}.ck-media__wrapper[data-oembed-url*="facebook.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder{background:linear-gradient(-135deg,#1400c7,#b800b1,#f50000)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTA0IiBoZWlnaHQ9IjUwNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggaWQ9ImEiIGQ9Ik0wIC4xNTloNTAzLjg0MVY1MDMuOTRIMHoiLz48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48bWFzayBpZD0iYiIgZmlsbD0iI2ZmZiI+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48cGF0aCBkPSJNMjUxLjkyMS4xNTljLTY4LjQxOCAwLTc2Ljk5Ny4yOS0xMDMuODY3IDEuNTE2LTI2LjgxNCAxLjIyMy00NS4xMjcgNS40ODItNjEuMTUxIDExLjcxLTE2LjU2NiA2LjQzNy0zMC42MTUgMTUuMDUxLTQ0LjYyMSAyOS4wNTYtMTQuMDA1IDE0LjAwNi0yMi42MTkgMjguMDU1LTI5LjA1NiA0NC42MjEtNi4yMjggMTYuMDI0LTEwLjQ4NyAzNC4zMzctMTEuNzEgNjEuMTUxQy4yOSAxNzUuMDgzIDAgMTgzLjY2MiAwIDI1Mi4wOGMwIDY4LjQxNy4yOSA3Ni45OTYgMS41MTYgMTAzLjg2NiAxLjIyMyAyNi44MTQgNS40ODIgNDUuMTI3IDExLjcxIDYxLjE1MSA2LjQzNyAxNi41NjYgMTUuMDUxIDMwLjYxNSAyOS4wNTYgNDQuNjIxIDE0LjAwNiAxNC4wMDUgMjguMDU1IDIyLjYxOSA0NC42MjEgMjkuMDU3IDE2LjAyNCA2LjIyNyAzNC4zMzcgMTAuNDg2IDYxLjE1MSAxMS43MDkgMjYuODcgMS4yMjYgMzUuNDQ5IDEuNTE2IDEwMy44NjcgMS41MTYgNjguNDE3IDAgNzYuOTk2LS4yOSAxMDMuODY2LTEuNTE2IDI2LjgxNC0xLjIyMyA0NS4xMjctNS40ODIgNjEuMTUxLTExLjcwOSAxNi41NjYtNi40MzggMzAuNjE1LTE1LjA1MiA0NC42MjEtMjkuMDU3IDE0LjAwNS0xNC4wMDYgMjIuNjE5LTI4LjA1NSAyOS4wNTctNDQuNjIxIDYuMjI3LTE2LjAyNCAxMC40ODYtMzQuMzM3IDExLjcwOS02MS4xNTEgMS4yMjYtMjYuODcgMS41MTYtMzUuNDQ5IDEuNTE2LTEwMy44NjYgMC02OC40MTgtLjI5LTc2Ljk5Ny0xLjUxNi0xMDMuODY3LTEuMjIzLTI2LjgxNC01LjQ4Mi00NS4xMjctMTEuNzA5LTYxLjE1MS02LjQzOC0xNi41NjYtMTUuMDUyLTMwLjYxNS0yOS4wNTctNDQuNjIxLTE0LjAwNi0xNC4wMDUtMjguMDU1LTIyLjYxOS00NC42MjEtMjkuMDU2LTE2LjAyNC02LjIyOC0zNC4zMzctMTAuNDg3LTYxLjE1MS0xMS43MUMzMjguOTE3LjQ0OSAzMjAuMzM4LjE1OSAyNTEuOTIxLjE1OVptMCA0NS4zOTFjNjcuMjY1IDAgNzUuMjMzLjI1NyAxMDEuNzk3IDEuNDY5IDI0LjU2MiAxLjEyIDM3LjkwMSA1LjIyNCA0Ni43NzggOC42NzQgMTEuNzU5IDQuNTcgMjAuMTUxIDEwLjAyOSAyOC45NjYgMTguODQ1IDguODE2IDguODE1IDE0LjI3NSAxNy4yMDcgMTguODQ1IDI4Ljk2NiAzLjQ1IDguODc3IDcuNTU0IDIyLjIxNiA4LjY3NCA0Ni43NzggMS4yMTIgMjYuNTY0IDEuNDY5IDM0LjUzMiAxLjQ2OSAxMDEuNzk4IDAgNjcuMjY1LS4yNTcgNzUuMjMzLTEuNDY5IDEwMS43OTctMS4xMiAyNC41NjItNS4yMjQgMzcuOTAxLTguNjc0IDQ2Ljc3OC00LjU3IDExLjc1OS0xMC4wMjkgMjAuMTUxLTE4Ljg0NSAyOC45NjYtOC44MTUgOC44MTYtMTcuMjA3IDE0LjI3NS0yOC45NjYgMTguODQ1LTguODc3IDMuNDUtMjIuMjE2IDcuNTU0LTQ2Ljc3OCA4LjY3NC0yNi41NiAxLjIxMi0zNC41MjcgMS40NjktMTAxLjc5NyAxLjQ2OS02Ny4yNzEgMC03NS4yMzctLjI1Ny0xMDEuNzk4LTEuNDY5LTI0LjU2Mi0xLjEyLTM3LjkwMS01LjIyNC00Ni43NzgtOC42NzQtMTEuNzU5LTQuNTctMjAuMTUxLTEwLjAyOS0yOC45NjYtMTguODQ1LTguODE1LTguODE1LTE0LjI3NS0xNy4yMDctMTguODQ1LTI4Ljk2Ni0zLjQ1LTguODc3LTcuNTU0LTIyLjIxNi04LjY3NC00Ni43NzgtMS4yMTItMjYuNTY0LTEuNDY5LTM0LjUzMi0xLjQ2OS0xMDEuNzk3IDAtNjcuMjY2LjI1Ny03NS4yMzQgMS40NjktMTAxLjc5OCAxLjEyLTI0LjU2MiA1LjIyNC0zNy45MDEgOC42NzQtNDYuNzc4IDQuNTctMTEuNzU5IDEwLjAyOS0yMC4xNTEgMTguODQ1LTI4Ljk2NiA4LjgxNS04LjgxNiAxNy4yMDctMTQuMjc1IDI4Ljk2Ni0xOC44NDUgOC44NzctMy40NSAyMi4yMTYtNy41NTQgNDYuNzc4LTguNjc0IDI2LjU2NC0xLjIxMiAzNC41MzItMS40NjkgMTAxLjc5OC0xLjQ2OVoiIGZpbGw9IiNGRkYiIG1hc2s9InVybCgjYikiLz48cGF0aCBkPSJNMjUxLjkyMSAzMzYuMDUzYy00Ni4zNzggMC04My45NzQtMzcuNTk2LTgzLjk3NC04My45NzMgMC00Ni4zNzggMzcuNTk2LTgzLjk3NCA4My45NzQtODMuOTc0IDQ2LjM3NyAwIDgzLjk3MyAzNy41OTYgODMuOTczIDgzLjk3NCAwIDQ2LjM3Ny0zNy41OTYgODMuOTczLTgzLjk3MyA4My45NzNabTAtMjEzLjMzOGMtNzEuNDQ3IDAtMTI5LjM2NSA1Ny45MTgtMTI5LjM2NSAxMjkuMzY1IDAgNzEuNDQ2IDU3LjkxOCAxMjkuMzY0IDEyOS4zNjUgMTI5LjM2NCA3MS40NDYgMCAxMjkuMzY0LTU3LjkxOCAxMjkuMzY0LTEyOS4zNjQgMC03MS40NDctNTcuOTE4LTEyOS4zNjUtMTI5LjM2NC0xMjkuMzY1Wk00MTYuNjI3IDExNy42MDRjMCAxNi42OTYtMTMuNTM1IDMwLjIzLTMwLjIzMSAzMC4yMy0xNi42OTUgMC0zMC4yMy0xMy41MzQtMzAuMjMtMzAuMjMgMC0xNi42OTYgMTMuNTM1LTMwLjIzMSAzMC4yMy0zMC4yMzEgMTYuNjk2IDAgMzAuMjMxIDEzLjUzNSAzMC4yMzEgMzAuMjMxIiBmaWxsPSIjRkZGIi8+PC9nPjwvc3ZnPg==)}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text{color:#ffe0fe}.ck-media__wrapper[data-oembed-url*="instagram.com"] .ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder{background:linear-gradient(90deg,#71c6f4,#0d70a5)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__icon{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA0MDAgNDAwIiB4bWw6c3BhY2U9InByZXNlcnZlIj48cGF0aCBkPSJNNDAwIDIwMGMwIDExMC41LTg5LjUgMjAwLTIwMCAyMDBTMCAzMTAuNSAwIDIwMCA4OS41IDAgMjAwIDBzMjAwIDg5LjUgMjAwIDIwMHpNMTYzLjQgMzA1LjVjODguNyAwIDEzNy4yLTczLjUgMTM3LjItMTM3LjIgMC0yLjEgMC00LjItLjEtNi4yIDkuNC02LjggMTcuNi0xNS4zIDI0LjEtMjUtOC42IDMuOC0xNy45IDYuNC0yNy43IDcuNiAxMC02IDE3LjYtMTUuNCAyMS4yLTI2LjctOS4zIDUuNS0xOS42IDkuNS0zMC42IDExLjctOC44LTkuNC0yMS4zLTE1LjItMzUuMi0xNS4yLTI2LjYgMC00OC4yIDIxLjYtNDguMiA0OC4yIDAgMy44LjQgNy41IDEuMyAxMS00MC4xLTItNzUuNi0yMS4yLTk5LjQtNTAuNC00LjEgNy4xLTYuNSAxNS40LTYuNSAyNC4yIDAgMTYuNyA4LjUgMzEuNSAyMS41IDQwLjEtNy45LS4yLTE1LjMtMi40LTIxLjgtNnYuNmMwIDIzLjQgMTYuNiA0Mi44IDM4LjcgNDcuMy00IDEuMS04LjMgMS43LTEyLjcgMS43LTMuMSAwLTYuMS0uMy05LjEtLjkgNi4xIDE5LjIgMjMuOSAzMy4xIDQ1IDMzLjUtMTYuNSAxMi45LTM3LjMgMjAuNi01OS45IDIwLjYtMy45IDAtNy43LS4yLTExLjUtLjcgMjEuMSAxMy44IDQ2LjUgMjEuOCA3My43IDIxLjgiIHN0eWxlPSJmaWxsOiNmZmYiLz48L3N2Zz4=)}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text{color:#b8e6ff}.ck-media__wrapper[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder .ck-media__placeholder__url__text:hover{color:#fff}',"",{version:3,sources:["webpack://./../ckeditor5-media-embed/theme/mediaembedediting.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-media-embed/mediaembedediting.css"],names:[],mappings:"AAMC,0CAGC,kBAAmB,CAFnB,YAAa,CACb,qBAcD,CAXC,sEAEC,cAAe,CAEf,iBAMD,CAJC,wGAEC,aAAc,CADd,eAED,CAWD,6kBACC,YACD,CAYF,2LACC,mBACD,CC1CA,MACC,0CAA2C,CAE3C,mDAA4D,CAC5D,2EACD,CAEA,mBACC,aA+FD,CA7FC,0CAEC,0CAA2C,CAD3C,0CA6BD,CA1BC,uEAIC,uBAA2B,CAC3B,qBAAsB,CAHtB,kDAAmD,CACnD,qCAAsC,CAFtC,qDAUD,CAJC,gFAEC,WAAY,CADZ,UAED,CAGD,4EACC,sDAAuD,CAGvD,iBAAkB,CADlB,iBAAkB,CAElB,sBAAuB,CAHvB,kBAUD,CALC,kFACC,4DAA6D,CAC7D,cAAe,CACf,yBACD,CAIF,wDAEC,gBAAiB,CADjB,eAED,CAEA,4UAIC,wvGACD,CAEA,2EACC,kBAaD,CAXC,wGACC,orBACD,CAEA,6GACC,UAKD,CAHC,mHACC,UACD,CAIF,4EACC,2DAcD,CAZC,yGACC,4jHACD,CAGA,8GACC,aAKD,CAHC,oHACC,UACD,CAIF,6EAEC,iDAaD,CAXC,0GACC,wiCACD,CAEA,+GACC,aAKD,CAHC,qHACC,UACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-media__wrapper {\n\t& .ck-media__placeholder {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\n\t\t& .ck-media__placeholder__url {\n\t\t\t/* Otherwise the URL will overflow when the content is very narrow. */\n\t\t\tmax-width: 100%;\n\n\t\t\tposition: relative;\n\n\t\t\t& .ck-media__placeholder__url__text {\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="twitter.com"],\n\t&[data-oembed-url*="google.com/maps"],\n\t&[data-oembed-url*="goo.gl/maps"],\n\t&[data-oembed-url*="maps.google.com"],\n\t&[data-oembed-url*="maps.app.goo.gl"],\n\t&[data-oembed-url*="facebook.com"],\n\t&[data-oembed-url*="instagram.com"] {\n\t\t& .ck-media__placeholder__icon * {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n/* Disable all mouse interaction as long as the editor is not read–only.\n https://github.com/ckeditor/ckeditor5-media-embed/issues/58 */\n.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper > *:not(.ck-media__placeholder) {\n\tpointer-events: none;\n}\n\n/* Disable all mouse interaction when the widget is not selected (e.g. to avoid opening links by accident).\n https://github.com/ckeditor/ckeditor5-media-embed/issues/18 */\n.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder {\n\tpointer-events: none;\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-media-embed-placeholder-icon-size: 3em;\n\n\t--ck-color-media-embed-placeholder-url-text: hsl(0, 0%, 46%);\n\t--ck-color-media-embed-placeholder-url-text-hover: var(--ck-color-base-text);\n}\n\n.ck-media__wrapper {\n\tmargin: 0 auto;\n\n\t& .ck-media__placeholder {\n\t\tpadding: calc( 3 * var(--ck-spacing-standard) );\n\t\tbackground: var(--ck-color-base-foreground);\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tmin-width: var(--ck-media-embed-placeholder-icon-size);\n\t\t\theight: var(--ck-media-embed-placeholder-icon-size);\n\t\t\tmargin-bottom: var(--ck-spacing-large);\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: cover;\n\n\t\t\t& .ck-icon {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: var(--ck-color-media-embed-placeholder-url-text);\n\t\t\twhite-space: nowrap;\n\t\t\ttext-align: center;\n\t\t\tfont-style: italic;\n\t\t\ttext-overflow: ellipsis;\n\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--ck-color-media-embed-placeholder-url-text-hover);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttext-decoration: underline;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="open.spotify.com"] {\n\t\tmax-width: 300px;\n\t\tmax-height: 380px;\n\t}\n\n\t&[data-oembed-url*="google.com/maps"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="goo.gl/maps"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="maps.google.com"] .ck-media__placeholder__icon,\n\t&[data-oembed-url*="maps.app.goo.gl"] .ck-media__placeholder__icon {\n\t\tbackground-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTAuMzc4IiBoZWlnaHQ9IjI1NC4xNjciIHZpZXdCb3g9IjAgMCA2Ni4yNDYgNjcuMjQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjUzMSAtMjE4LjQ1NSkgc2NhbGUoLjk4MDEyKSI+PHJlY3Qgcnk9IjUuMjM4IiByeD0iNS4yMzgiIHk9IjIzMS4zOTkiIHg9IjE3Ni4wMzEiIGhlaWdodD0iNjAuMDk5IiB3aWR0aD0iNjAuMDk5IiBmaWxsPSIjMzRhNjY4IiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxwYXRoIGQ9Ik0yMDYuNDc3IDI2MC45bC0yOC45ODcgMjguOTg3YTUuMjE4IDUuMjE4IDAgMCAwIDMuNzggMS42MWg0OS42MjFjMS42OTQgMCAzLjE5LS43OTggNC4xNDYtMi4wMzd6IiBmaWxsPSIjNWM4OGM1Ii8+PHBhdGggZD0iTTIyNi43NDIgMjIyLjk4OGMtOS4yNjYgMC0xNi43NzcgNy4xNy0xNi43NzcgMTYuMDE0LjAwNyAyLjc2Mi42NjMgNS40NzQgMi4wOTMgNy44NzUuNDMuNzAzLjgzIDEuNDA4IDEuMTkgMi4xMDcuMzMzLjUwMi42NSAxLjAwNS45NSAxLjUwOC4zNDMuNDc3LjY3My45NTcuOTg4IDEuNDQgMS4zMSAxLjc2OSAyLjUgMy41MDIgMy42MzcgNS4xNjguNzkzIDEuMjc1IDEuNjgzIDIuNjQgMi40NjYgMy45OSAyLjM2MyA0LjA5NCA0LjAwNyA4LjA5MiA0LjYgMTMuOTE0di4wMTJjLjE4Mi40MTIuNTE2LjY2Ni44NzkuNjY3LjQwMy0uMDAxLjc2OC0uMzE0LjkzLS43OTkuNjAzLTUuNzU2IDIuMjM4LTkuNzI5IDQuNTg1LTEzLjc5NC43ODItMS4zNSAxLjY3My0yLjcxNSAyLjQ2NS0zLjk5IDEuMTM3LTEuNjY2IDIuMzI4LTMuNCAzLjYzOC01LjE2OS4zMTUtLjQ4Mi42NDUtLjk2Mi45ODgtMS40MzkuMy0uNTAzLjYxNy0xLjAwNi45NS0xLjUwOC4zNTktLjcuNzYtMS40MDQgMS4xOS0yLjEwNyAxLjQyNi0yLjQwMiAyLTUuMTE0IDIuMDA0LTcuODc1IDAtOC44NDQtNy41MTEtMTYuMDE0LTE2Ljc3Ni0xNi4wMTR6IiBmaWxsPSIjZGQ0YjNlIiBwYWludC1vcmRlcj0ibWFya2VycyBzdHJva2UgZmlsbCIvPjxlbGxpcHNlIHJ5PSI1LjU2NCIgcng9IjUuODI4IiBjeT0iMjM5LjAwMiIgY3g9IjIyNi43NDIiIGZpbGw9IiM4MDJkMjciIHBhaW50LW9yZGVyPSJtYXJrZXJzIHN0cm9rZSBmaWxsIi8+PHBhdGggZD0iTTE5MC4zMDEgMjM3LjI4M2MtNC42NyAwLTguNDU3IDMuODUzLTguNDU3IDguNjA2czMuNzg2IDguNjA3IDguNDU3IDguNjA3YzMuMDQzIDAgNC44MDYtLjk1OCA2LjMzNy0yLjUxNiAxLjUzLTEuNTU3IDIuMDg3LTMuOTEzIDIuMDg3LTYuMjkgMC0uMzYyLS4wMjMtLjcyMi0uMDY0LTEuMDc5aC04LjI1N3YzLjA0M2g0Ljg1Yy0uMTk3Ljc1OS0uNTMxIDEuNDUtMS4wNTggMS45ODYtLjk0Mi45NTgtMi4wMjggMS41NDgtMy45MDEgMS41NDgtMi44NzYgMC01LjIwOC0yLjM3Mi01LjIwOC01LjI5OSAwLTIuOTI2IDIuMzMyLTUuMjk5IDUuMjA4LTUuMjk5IDEuMzk5IDAgMi42MTguNDA3IDMuNTg0IDEuMjkzbDIuMzgxLTIuMzhjMC0uMDAyLS4wMDMtLjAwNC0uMDA0LS4wMDUtMS41ODgtMS41MjQtMy42Mi0yLjIxNS01Ljk1NS0yLjIxNXptNC40MyA1LjY2bC4wMDMuMDA2di0uMDAzeiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjE1LjE4NCAyNTEuOTI5bC03Ljk4IDcuOTc5IDI4LjQ3NyAyOC40NzVjLjI4Ny0uNjQ5LjQ0OS0xLjM2Ni40NDktMi4xMjN2LTMxLjE2NWMtLjQ2OS42NzUtLjkzNCAxLjM0OS0xLjM4MiAyLjAwNS0uNzkyIDEuMjc1LTEuNjgyIDIuNjQtMi40NjUgMy45OS0yLjM0NyA0LjA2NS0zLjk4MiA4LjAzOC00LjU4NSAxMy43OTQtLjE2Mi40ODUtLjUyNy43OTgtLjkzLjc5OS0uMzYzLS4wMDEtLjY5Ny0uMjU1LS44NzktLjY2N3YtLjAxMmMtLjU5My01LjgyMi0yLjIzNy05LjgyLTQuNi0xMy45MTQtLjc4My0xLjM1LTEuNjczLTIuNzE1LTIuNDY2LTMuOTktMS4xMzctMS42NjYtMi4zMjctMy40LTMuNjM3LTUuMTY5bC0uMDAyLS4wMDN6IiBmaWxsPSIjYzNjM2MzIi8+PHBhdGggZD0iTTIxMi45ODMgMjQ4LjQ5NWwtMzYuOTUyIDM2Ljk1M3YuODEyYTUuMjI3IDUuMjI3IDAgMCAwIDUuMjM4IDUuMjM4aDEuMDE1bDM1LjY2Ni0zNS42NjZhMTM2LjI3NSAxMzYuMjc1IDAgMCAwLTIuNzY0LTMuOSAzNy41NzUgMzcuNTc1IDAgMCAwLS45ODktMS40NGMtLjI5OS0uNTAzLS42MTYtMS4wMDYtLjk1LTEuNTA4LS4wODMtLjE2Mi0uMTc2LS4zMjYtLjI2NC0uNDg5eiIgZmlsbD0iI2ZkZGM0ZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48cGF0aCBkPSJNMjExLjk5OCAyNjEuMDgzbC02LjE1MiA2LjE1MSAyNC4yNjQgMjQuMjY0aC43ODFhNS4yMjcgNS4yMjcgMCAwIDAgNS4yMzktNS4yMzh2LTEuMDQ1eiIgZmlsbD0iI2ZmZiIgcGFpbnQtb3JkZXI9Im1hcmtlcnMgc3Ryb2tlIGZpbGwiLz48L2c+PC9zdmc+);\n\t}\n\n\t&[data-oembed-url*="facebook.com"] .ck-media__placeholder {\n\t\tbackground: hsl(220, 46%, 48%);\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxMDI0cHgiIGhlaWdodD0iMTAyNHB4IiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPiAgICAgICAgPHRpdGxlPkZpbGwgMTwvdGl0bGU+ICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPiAgICA8ZGVmcz48L2RlZnM+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9ImZMb2dvX1doaXRlIiBmaWxsPSIjRkZGRkZFIj4gICAgICAgICAgICA8cGF0aCBkPSJNOTY3LjQ4NCwwIEw1Ni41MTcsMCBDMjUuMzA0LDAgMCwyNS4zMDQgMCw1Ni41MTcgTDAsOTY3LjQ4MyBDMCw5OTguNjk0IDI1LjI5NywxMDI0IDU2LjUyMiwxMDI0IEw1NDcsMTAyNCBMNTQ3LDYyOCBMNDE0LDYyOCBMNDE0LDQ3MyBMNTQ3LDQ3MyBMNTQ3LDM1OS4wMjkgQzU0NywyMjYuNzY3IDYyNy43NzMsMTU0Ljc0NyA3NDUuNzU2LDE1NC43NDcgQzgwMi4yNjksMTU0Ljc0NyA4NTAuODQyLDE1OC45NTUgODY1LDE2MC44MzYgTDg2NSwyOTkgTDc4My4zODQsMjk5LjAzNyBDNzE5LjM5MSwyOTkuMDM3IDcwNywzMjkuNTI5IDcwNywzNzQuMjczIEw3MDcsNDczIEw4NjAuNDg3LDQ3MyBMODQwLjUwMSw2MjggTDcwNyw2MjggTDcwNywxMDI0IEw5NjcuNDg0LDEwMjQgQzk5OC42OTcsMTAyNCAxMDI0LDk5OC42OTcgMTAyNCw5NjcuNDg0IEwxMDI0LDU2LjUxNSBDMTAyNCwyNS4zMDMgOTk4LjY5NywwIDk2Ny40ODQsMCIgaWQ9IkZpbGwtMSI+PC9wYXRoPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(220, 100%, 90%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="instagram.com"] .ck-media__placeholder {\n\t\tbackground: linear-gradient(-135deg,hsl(246, 100%, 39%),hsl(302, 100%, 36%),hsl(0, 100%, 48%));\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MDRweCIgaGVpZ2h0PSI1MDRweCIgdmlld0JveD0iMCAwIDUwNCA1MDQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+Z2x5cGgtbG9nb19NYXkyMDE2PC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxkZWZzPiAgICAgICAgPHBvbHlnb24gaWQ9InBhdGgtMSIgcG9pbnRzPSIwIDAuMTU5IDUwMy44NDEgMC4xNTkgNTAzLjg0MSA1MDMuOTQgMCA1MDMuOTQiPjwvcG9seWdvbj4gICAgPC9kZWZzPiAgICA8ZyBpZD0iZ2x5cGgtbG9nb19NYXkyMDE2IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJHcm91cC0zIj4gICAgICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+ICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+ICAgICAgICAgICAgPC9tYXNrPiAgICAgICAgICAgIDxnIGlkPSJDbGlwLTIiPjwvZz4gICAgICAgICAgICA8cGF0aCBkPSJNMjUxLjkyMSwwLjE1OSBDMTgzLjUwMywwLjE1OSAxNzQuOTI0LDAuNDQ5IDE0OC4wNTQsMS42NzUgQzEyMS4yNCwyLjg5OCAxMDIuOTI3LDcuMTU3IDg2LjkwMywxMy4zODUgQzcwLjMzNywxOS44MjIgNTYuMjg4LDI4LjQzNiA0Mi4yODIsNDIuNDQxIEMyOC4yNzcsNTYuNDQ3IDE5LjY2Myw3MC40OTYgMTMuMjI2LDg3LjA2MiBDNi45OTgsMTAzLjA4NiAyLjczOSwxMjEuMzk5IDEuNTE2LDE0OC4yMTMgQzAuMjksMTc1LjA4MyAwLDE4My42NjIgMCwyNTIuMDggQzAsMzIwLjQ5NyAwLjI5LDMyOS4wNzYgMS41MTYsMzU1Ljk0NiBDMi43MzksMzgyLjc2IDYuOTk4LDQwMS4wNzMgMTMuMjI2LDQxNy4wOTcgQzE5LjY2Myw0MzMuNjYzIDI4LjI3Nyw0NDcuNzEyIDQyLjI4Miw0NjEuNzE4IEM1Ni4yODgsNDc1LjcyMyA3MC4zMzcsNDg0LjMzNyA4Ni45MDMsNDkwLjc3NSBDMTAyLjkyNyw0OTcuMDAyIDEyMS4yNCw1MDEuMjYxIDE0OC4wNTQsNTAyLjQ4NCBDMTc0LjkyNCw1MDMuNzEgMTgzLjUwMyw1MDQgMjUxLjkyMSw1MDQgQzMyMC4zMzgsNTA0IDMyOC45MTcsNTAzLjcxIDM1NS43ODcsNTAyLjQ4NCBDMzgyLjYwMSw1MDEuMjYxIDQwMC45MTQsNDk3LjAwMiA0MTYuOTM4LDQ5MC43NzUgQzQzMy41MDQsNDg0LjMzNyA0NDcuNTUzLDQ3NS43MjMgNDYxLjU1OSw0NjEuNzE4IEM0NzUuNTY0LDQ0Ny43MTIgNDg0LjE3OCw0MzMuNjYzIDQ5MC42MTYsNDE3LjA5NyBDNDk2Ljg0Myw0MDEuMDczIDUwMS4xMDIsMzgyLjc2IDUwMi4zMjUsMzU1Ljk0NiBDNTAzLjU1MSwzMjkuMDc2IDUwMy44NDEsMzIwLjQ5NyA1MDMuODQxLDI1Mi4wOCBDNTAzLjg0MSwxODMuNjYyIDUwMy41NTEsMTc1LjA4MyA1MDIuMzI1LDE0OC4yMTMgQzUwMS4xMDIsMTIxLjM5OSA0OTYuODQzLDEwMy4wODYgNDkwLjYxNiw4Ny4wNjIgQzQ4NC4xNzgsNzAuNDk2IDQ3NS41NjQsNTYuNDQ3IDQ2MS41NTksNDIuNDQxIEM0NDcuNTUzLDI4LjQzNiA0MzMuNTA0LDE5LjgyMiA0MTYuOTM4LDEzLjM4NSBDNDAwLjkxNCw3LjE1NyAzODIuNjAxLDIuODk4IDM1NS43ODcsMS42NzUgQzMyOC45MTcsMC40NDkgMzIwLjMzOCwwLjE1OSAyNTEuOTIxLDAuMTU5IFogTTI1MS45MjEsNDUuNTUgQzMxOS4xODYsNDUuNTUgMzI3LjE1NCw0NS44MDcgMzUzLjcxOCw0Ny4wMTkgQzM3OC4yOCw0OC4xMzkgMzkxLjYxOSw1Mi4yNDMgNDAwLjQ5Niw1NS42OTMgQzQxMi4yNTUsNjAuMjYzIDQyMC42NDcsNjUuNzIyIDQyOS40NjIsNzQuNTM4IEM0MzguMjc4LDgzLjM1MyA0NDMuNzM3LDkxLjc0NSA0NDguMzA3LDEwMy41MDQgQzQ1MS43NTcsMTEyLjM4MSA0NTUuODYxLDEyNS43MiA0NTYuOTgxLDE1MC4yODIgQzQ1OC4xOTMsMTc2Ljg0NiA0NTguNDUsMTg0LjgxNCA0NTguNDUsMjUyLjA4IEM0NTguNDUsMzE5LjM0NSA0NTguMTkzLDMyNy4zMTMgNDU2Ljk4MSwzNTMuODc3IEM0NTUuODYxLDM3OC40MzkgNDUxLjc1NywzOTEuNzc4IDQ0OC4zMDcsNDAwLjY1NSBDNDQzLjczNyw0MTIuNDE0IDQzOC4yNzgsNDIwLjgwNiA0MjkuNDYyLDQyOS42MjEgQzQyMC42NDcsNDM4LjQzNyA0MTIuMjU1LDQ0My44OTYgNDAwLjQ5Niw0NDguNDY2IEMzOTEuNjE5LDQ1MS45MTYgMzc4LjI4LDQ1Ni4wMiAzNTMuNzE4LDQ1Ny4xNCBDMzI3LjE1OCw0NTguMzUyIDMxOS4xOTEsNDU4LjYwOSAyNTEuOTIxLDQ1OC42MDkgQzE4NC42NSw0NTguNjA5IDE3Ni42ODQsNDU4LjM1MiAxNTAuMTIzLDQ1Ny4xNCBDMTI1LjU2MSw0NTYuMDIgMTEyLjIyMiw0NTEuOTE2IDEwMy4zNDUsNDQ4LjQ2NiBDOTEuNTg2LDQ0My44OTYgODMuMTk0LDQzOC40MzcgNzQuMzc5LDQyOS42MjEgQzY1LjU2NCw0MjAuODA2IDYwLjEwNCw0MTIuNDE0IDU1LjUzNCw0MDAuNjU1IEM1Mi4wODQsMzkxLjc3OCA0Ny45OCwzNzguNDM5IDQ2Ljg2LDM1My44NzcgQzQ1LjY0OCwzMjcuMzEzIDQ1LjM5MSwzMTkuMzQ1IDQ1LjM5MSwyNTIuMDggQzQ1LjM5MSwxODQuODE0IDQ1LjY0OCwxNzYuODQ2IDQ2Ljg2LDE1MC4yODIgQzQ3Ljk4LDEyNS43MiA1Mi4wODQsMTEyLjM4MSA1NS41MzQsMTAzLjUwNCBDNjAuMTA0LDkxLjc0NSA2NS41NjMsODMuMzUzIDc0LjM3OSw3NC41MzggQzgzLjE5NCw2NS43MjIgOTEuNTg2LDYwLjI2MyAxMDMuMzQ1LDU1LjY5MyBDMTEyLjIyMiw1Mi4yNDMgMTI1LjU2MSw0OC4xMzkgMTUwLjEyMyw0Ny4wMTkgQzE3Ni42ODcsNDUuODA3IDE4NC42NTUsNDUuNTUgMjUxLjkyMSw0NS41NSBaIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiBtYXNrPSJ1cmwoI21hc2stMikiPjwvcGF0aD4gICAgICAgIDwvZz4gICAgICAgIDxwYXRoIGQ9Ik0yNTEuOTIxLDMzNi4wNTMgQzIwNS41NDMsMzM2LjA1MyAxNjcuOTQ3LDI5OC40NTcgMTY3Ljk0NywyNTIuMDggQzE2Ny45NDcsMjA1LjcwMiAyMDUuNTQzLDE2OC4xMDYgMjUxLjkyMSwxNjguMTA2IEMyOTguMjk4LDE2OC4xMDYgMzM1Ljg5NCwyMDUuNzAyIDMzNS44OTQsMjUyLjA4IEMzMzUuODk0LDI5OC40NTcgMjk4LjI5OCwzMzYuMDUzIDI1MS45MjEsMzM2LjA1MyBaIE0yNTEuOTIxLDEyMi43MTUgQzE4MC40NzQsMTIyLjcxNSAxMjIuNTU2LDE4MC42MzMgMTIyLjU1NiwyNTIuMDggQzEyMi41NTYsMzIzLjUyNiAxODAuNDc0LDM4MS40NDQgMjUxLjkyMSwzODEuNDQ0IEMzMjMuMzY3LDM4MS40NDQgMzgxLjI4NSwzMjMuNTI2IDM4MS4yODUsMjUyLjA4IEMzODEuMjg1LDE4MC42MzMgMzIzLjM2NywxMjIuNzE1IDI1MS45MjEsMTIyLjcxNSBaIiBpZD0iRmlsbC00IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgICAgICA8cGF0aCBkPSJNNDE2LjYyNywxMTcuNjA0IEM0MTYuNjI3LDEzNC4zIDQwMy4wOTIsMTQ3LjgzNCAzODYuMzk2LDE0Ny44MzQgQzM2OS43MDEsMTQ3LjgzNCAzNTYuMTY2LDEzNC4zIDM1Ni4xNjYsMTE3LjYwNCBDMzU2LjE2NiwxMDAuOTA4IDM2OS43MDEsODcuMzczIDM4Ni4zOTYsODcuMzczIEM0MDMuMDkyLDg3LjM3MyA0MTYuNjI3LDEwMC45MDggNDE2LjYyNywxMTcuNjA0IiBpZD0iRmlsbC01IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+ICAgIDwvZz48L3N2Zz4=);\n\t\t}\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(302, 100%, 94%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n\n\t&[data-oembed-url*="twitter.com"] .ck.ck-media__placeholder {\n\t\t/* Use gradient to contrast with focused widget (ckeditor/ckeditor5-media-embed#22). */\n\t\tbackground: linear-gradient( to right, hsl(201, 85%, 70%), hsl(201, 85%, 35%) );\n\n\t\t& .ck-media__placeholder__icon {\n\t\t\tbackground-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IldoaXRlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQwMCA0MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDB7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MDAsMjAwYzAsMTEwLjUtODkuNSwyMDAtMjAwLDIwMFMwLDMxMC41LDAsMjAwUzg5LjUsMCwyMDAsMFM0MDAsODkuNSw0MDAsMjAweiBNMTYzLjQsMzA1LjVjODguNywwLDEzNy4yLTczLjUsMTM3LjItMTM3LjJjMC0yLjEsMC00LjItMC4xLTYuMmM5LjQtNi44LDE3LjYtMTUuMywyNC4xLTI1Yy04LjYsMy44LTE3LjksNi40LTI3LjcsNy42YzEwLTYsMTcuNi0xNS40LDIxLjItMjYuN2MtOS4zLDUuNS0xOS42LDkuNS0zMC42LDExLjdjLTguOC05LjQtMjEuMy0xNS4yLTM1LjItMTUuMmMtMjYuNiwwLTQ4LjIsMjEuNi00OC4yLDQ4LjJjMCwzLjgsMC40LDcuNSwxLjMsMTFjLTQwLjEtMi03NS42LTIxLjItOTkuNC01MC40Yy00LjEsNy4xLTYuNSwxNS40LTYuNSwyNC4yYzAsMTYuNyw4LjUsMzEuNSwyMS41LDQwLjFjLTcuOS0wLjItMTUuMy0yLjQtMjEuOC02YzAsMC4yLDAsMC40LDAsMC42YzAsMjMuNCwxNi42LDQyLjgsMzguNyw0Ny4zYy00LDEuMS04LjMsMS43LTEyLjcsMS43Yy0zLjEsMC02LjEtMC4zLTkuMS0wLjljNi4xLDE5LjIsMjMuOSwzMy4xLDQ1LDMzLjVjLTE2LjUsMTIuOS0zNy4zLDIwLjYtNTkuOSwyMC42Yy0zLjksMC03LjctMC4yLTExLjUtMC43QzExMC44LDI5Ny41LDEzNi4yLDMwNS41LDE2My40LDMwNS41Ii8+PC9zdmc+);\n\t\t}\n\n\t\t& .ck-media__placeholder__url__text {\n\t\t\tcolor: hsl(201, 100%, 86%);\n\n\t\t\t&:hover {\n\t\t\t\tcolor: hsl(0, 0%, 100%);\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},5651:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-media-form{align-items:flex-start;display:flex;flex-direction:row;flex-wrap:nowrap}.ck.ck-media-form .ck-labeled-field-view{display:inline-block}.ck.ck-media-form .ck-label{display:none}@media screen and (max-width:600px){.ck.ck-media-form{flex-wrap:wrap}.ck.ck-media-form .ck-labeled-field-view{flex-basis:100%}.ck.ck-media-form .ck-button{flex-basis:50%}}","",{version:3,sources:["webpack://./../ckeditor5-media-embed/theme/mediaform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css"],names:[],mappings:"AAOA,kBAEC,sBAAuB,CADvB,YAAa,CAEb,kBAAmB,CACnB,gBAqBD,CAnBC,yCACC,oBACD,CAEA,4BACC,YACD,CCbA,oCDCD,kBAeE,cAUF,CARE,yCACC,eACD,CAEA,6BACC,cACD,CCtBD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck.ck-media-form {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t& .ck-labeled-field-view {\n\t\tdisplay: inline-block;\n\t}\n\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t@mixin ck-media-phone {\n\t\tflex-wrap: wrap;\n\n\t\t& .ck-labeled-field-view {\n\t\t\tflex-basis: 100%;\n\t\t}\n\n\t\t& .ck-button {\n\t\t\tflex-basis: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},5506:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-input-color{display:flex;flex-direction:row-reverse;width:100%}.ck.ck-input-color>input.ck.ck-input-text{flex-grow:1;min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown{min-width:auto}.ck.ck-input-color>div.ck.ck-dropdown>.ck-input-color__button .ck-dropdown__arrow{display:none}.ck.ck-input-color .ck.ck-input-color__button{display:flex}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview{overflow:hidden;position:relative}.ck.ck-input-color .ck.ck-input-color__button .ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{display:block;position:absolute}[dir=ltr] .ck.ck-input-color>.ck.ck-input-text{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-input-text{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-input-color>.ck.ck-input-text:focus{z-index:0}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{padding:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-left-radius:0;border-top-left-radius:0}[dir=ltr] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-left:1px solid transparent}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button{border-bottom-right-radius:0;border-top-right-radius:0}[dir=rtl] .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button:not(:focus){border-right:1px solid transparent}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button.ck-disabled{background:var(--ck-color-input-disabled-background)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border-radius:0}.ck-rounded-corners .ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview,.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview{border:1px solid var(--ck-color-input-border);height:20px;width:20px}.ck.ck-input-color>.ck.ck-dropdown>.ck.ck-button.ck-input-color__button>.ck.ck-input-color__button__preview>.ck.ck-input-color__button__preview__no-color-indicator{background:red;border-radius:2px;height:150%;left:50%;top:-30%;transform:rotate(45deg);transform-origin:50%;width:8%}.ck.ck-input-color .ck.ck-input-color__remove-color{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard);width:100%}.ck.ck-input-color .ck.ck-input-color__remove-color:not(:focus){border-bottom:1px solid var(--ck-color-input-border)}[dir=ltr] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-right-radius:0}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color{border-top-left-radius:0}.ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-input-color .ck.ck-input-color__remove-color .ck.ck-icon{margin-left:var(--ck-spacing-standard);margin-right:0}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/colorinput.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/colorinput.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,mBAEC,YAAa,CACb,0BAA2B,CAF3B,UAgCD,CA5BC,0CAEC,WAAY,CADZ,cAED,CAEA,sCACC,cAMD,CAHC,kFACC,YACD,CAGD,8CAEC,YAWD,CATC,kFAEC,eAAgB,CADhB,iBAOD,CAJC,0IAEC,aAAc,CADd,iBAED,CC1BF,+CAGE,4BAA6B,CAD7B,yBAcF,CAhBA,+CAQE,2BAA4B,CAD5B,wBASF,CAHC,2CACC,SACD,CAIA,wEACC,SA0CD,CA3CA,kFAKE,2BAA4B,CAD5B,wBAuCF,CApCE,8FACC,iCACD,CATF,kFAcE,4BAA6B,CAD7B,yBA8BF,CA3BE,8FACC,kCACD,CAGD,oFACC,oDACD,CAEA,4GC1CF,eD2DE,CAjBA,+PCtCD,qCDuDC,CAjBA,4GAKC,6CAA8C,CAD9C,WAAY,CADZ,UAcD,CAVC,oKAKC,cAA6B,CAC7B,iBAAkB,CAHlB,WAAY,CADZ,QAAS,CADT,QAAS,CAMT,uBAAwB,CACxB,oBAAqB,CAJrB,QAKD,CAKH,oDAIC,2BAA4B,CAC5B,4BAA6B,CAH7B,qEAAwE,CADxE,UA0BD,CApBC,gEACC,oDACD,CATD,8DAYE,yBAeF,CA3BA,8DAgBE,wBAWF,CARC,gEACC,uCAMD,CAPA,0EAKE,sCAAuC,CADvC,cAGF",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-input-color {\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: row-reverse;\n\n\t& > input.ck.ck-input-text {\n\t\tmin-width: auto;\n\t\tflex-grow: 1;\n\t}\n\n\t& > div.ck.ck-dropdown {\n\t\tmin-width: auto;\n\n\t\t/* This dropdown has no arrow but a color preview instead. */\n\t\t& > .ck-input-color__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__button {\n\t\t/* Resolving issue with misaligned buttons on Safari (see #10589) */\n\t\tdisplay: flex;\n\n\t\t& .ck.ck-input-color__button__preview {\n\t\t\tposition: relative;\n\t\t\toverflow: hidden;\n\n\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../mixins/_rounded.css";\n\n.ck.ck-input-color {\n\t& > .ck.ck-input-text {\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t/* Make sure the focused input is always on top of the dropdown button so its\n\t\t outline and border are never cropped (also when the input is read-only). */\n\t\t&:focus {\n\t\t\tz-index: 0;\n\t\t}\n\t}\n\n\t& > .ck.ck-dropdown {\n\t\t& > .ck.ck-button.ck-input-color__button {\n\t\t\tpadding: 0;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\n\t\t\t\t&:not(:focus) {\n\t\t\t\t\tborder-left: 1px solid transparent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\n\t\t\t\t&:not(:focus) {\n\t\t\t\t\tborder-right: 1px solid transparent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.ck-disabled {\n\t\t\t\tbackground: var(--ck-color-input-disabled-background);\n\t\t\t}\n\n\t\t\t& > .ck.ck-input-color__button__preview {\n\t\t\t\t@mixin ck-rounded-corners;\n\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t\tborder: 1px solid var(--ck-color-input-border);\n\n\t\t\t\t& > .ck.ck-input-color__button__preview__no-color-indicator {\n\t\t\t\t\ttop: -30%;\n\t\t\t\t\tleft: 50%;\n\t\t\t\t\theight: 150%;\n\t\t\t\t\twidth: 8%;\n\t\t\t\t\tbackground: hsl(0, 100%, 50%);\n\t\t\t\t\tborder-radius: 2px;\n\t\t\t\t\ttransform: rotate(45deg);\n\t\t\t\t\ttransform-origin: 50%;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-input-color__remove-color {\n\t\twidth: 100%;\n\t\tpadding: calc(var(--ck-spacing-standard) / 2) var(--ck-spacing-standard);\n\n\t\tborder-bottom-left-radius: 0;\n\t\tborder-bottom-right-radius: 0;\n\n\t\t&:not(:focus) {\n\t\t\tborder-bottom: 1px solid var(--ck-color-input-border);\n\t\t}\n\n\t\t@mixin ck-dir ltr {\n\t\t\tborder-top-right-radius: 0;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tborder-top-left-radius: 0;\n\t\t}\n\n\t\t& .ck.ck-icon {\n\t\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: 0;\n\t\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},4043:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-form{padding:0 0 var(--ck-spacing-large)}.ck.ck-form:focus{outline:none}.ck.ck-form .ck.ck-input-text{min-width:100%;width:0}.ck.ck-form .ck.ck-dropdown{min-width:100%}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button:not(:focus){border:1px solid var(--ck-color-base-border)}.ck.ck-form .ck.ck-dropdown .ck-dropdown__button .ck-button__label{width:100%}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/form.css"],names:[],mappings:"AAKA,YACC,mCAyBD,CAvBC,kBAEC,YACD,CAEA,8BACC,cAAe,CACf,OACD,CAEA,4BACC,cAWD,CARE,6DACC,4CACD,CAEA,mEACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form {\n\tpadding: 0 0 var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t& .ck.ck-input-text {\n\t\tmin-width: 100%;\n\t\twidth: 0;\n\t}\n\n\t& .ck.ck-dropdown {\n\t\tmin-width: 100%;\n\n\t\t& .ck-dropdown__button {\n\t\t\t&:not(:focus) {\n\t\t\t\tborder: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t& .ck-button__label {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},2655:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-form__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__row>:not(.ck-label){flex-grow:1}.ck.ck-form__row.ck-table-form__action-row .ck-button-cancel,.ck.ck-form__row.ck-table-form__action-row .ck-button-save{justify-content:center}.ck.ck-form__row{padding:var(--ck-spacing-standard) var(--ck-spacing-large) 0}[dir=ltr] .ck.ck-form__row>:not(.ck-label)+*{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-form__row>:not(.ck-label)+*{margin-right:var(--ck-spacing-large)}.ck.ck-form__row>.ck-label{min-width:100%;width:100%}.ck.ck-form__row.ck-table-form__action-row{margin-top:var(--ck-spacing-large)}.ck.ck-form__row.ck-table-form__action-row .ck-button .ck-button__label{color:var(--ck-color-text)}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/formrow.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/formrow.css"],names:[],mappings:"AAKA,iBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAaD,CAVC,iCACC,WACD,CAGC,wHAEC,sBACD,CCbF,iBACC,4DA2BD,CAvBE,6CAEE,mCAMF,CARA,6CAME,oCAEF,CAGD,2BAEC,cAAe,CADf,UAED,CAEA,2CACC,kCAKD,CAHC,wEACC,0BACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\tflex-grow: 1;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\t& .ck-button-save,\n\t\t& .ck-button-cancel {\n\t\t\tjustify-content: center;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-form__row {\n\tpadding: var(--ck-spacing-standard) var(--ck-spacing-large) 0;\n\n\t/* Ignore labels that work as fieldset legends */\n\t& > *:not(.ck-label) {\n\t\t& + * {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck-label {\n\t\twidth: 100%;\n\t\tmin-width: 100%;\n\t}\n\n\t&.ck-table-form__action-row {\n\t\tmargin-top: var(--ck-spacing-large);\n\n\t\t& .ck-button .ck-button__label {\n\t\t\tcolor: var(--ck-color-text);\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},5032:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck .ck-insert-table-dropdown__grid{display:flex;flex-direction:row;flex-wrap:wrap}:root{--ck-insert-table-dropdown-padding:10px;--ck-insert-table-dropdown-box-height:11px;--ck-insert-table-dropdown-box-width:12px;--ck-insert-table-dropdown-box-margin:1px}.ck .ck-insert-table-dropdown__grid{padding:var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;width:calc(var(--ck-insert-table-dropdown-box-width)*10 + var(--ck-insert-table-dropdown-box-margin)*20 + var(--ck-insert-table-dropdown-padding)*2)}.ck .ck-insert-table-dropdown__label,.ck[dir=rtl] .ck-insert-table-dropdown__label{text-align:center}.ck .ck-insert-table-dropdown-grid-box{border:1px solid var(--ck-color-base-border);border-radius:1px;margin:var(--ck-insert-table-dropdown-box-margin);min-height:var(--ck-insert-table-dropdown-box-height);min-width:var(--ck-insert-table-dropdown-box-width);outline:none;transition:none}.ck .ck-insert-table-dropdown-grid-box:focus{box-shadow:none}.ck .ck-insert-table-dropdown-grid-box.ck-on{background:var(--ck-color-focus-outer-shadow);border-color:var(--ck-color-focus-border)}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/inserttable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/inserttable.css"],names:[],mappings:"AAKA,oCACC,YAAa,CACb,kBAAmB,CACnB,cACD,CCJA,MACC,uCAAwC,CACxC,0CAA2C,CAC3C,yCAA0C,CAC1C,yCACD,CAEA,oCAGC,yFAA0F,CAD1F,oJAED,CAEA,mFAEC,iBACD,CAEA,uCAIC,4CAA6C,CAC7C,iBAAkB,CAFlB,iDAAkD,CADlD,qDAAsD,CADtD,mDAAoD,CAKpD,YAAa,CACb,eAUD,CARC,6CACC,eACD,CAEA,6CAEC,6CAA8C,CAD9C,yCAED",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-insert-table-dropdown__grid {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-insert-table-dropdown-padding: 10px;\n\t--ck-insert-table-dropdown-box-height: 11px;\n\t--ck-insert-table-dropdown-box-width: 12px;\n\t--ck-insert-table-dropdown-box-margin: 1px;\n}\n\n.ck .ck-insert-table-dropdown__grid {\n\t/* The width of a container should match 10 items in a row so there will be a 10x10 grid. */\n\twidth: calc(var(--ck-insert-table-dropdown-box-width) * 10 + var(--ck-insert-table-dropdown-box-margin) * 20 + var(--ck-insert-table-dropdown-padding) * 2);\n\tpadding: var(--ck-insert-table-dropdown-padding) var(--ck-insert-table-dropdown-padding) 0;\n}\n\n.ck .ck-insert-table-dropdown__label,\n.ck[dir=rtl] .ck-insert-table-dropdown__label {\n\ttext-align: center;\n}\n\n.ck .ck-insert-table-dropdown-grid-box {\n\tmin-width: var(--ck-insert-table-dropdown-box-width);\n\tmin-height: var(--ck-insert-table-dropdown-box-height);\n\tmargin: var(--ck-insert-table-dropdown-box-margin);\n\tborder: 1px solid var(--ck-color-base-border);\n\tborder-radius: 1px;\n\toutline: none;\n\ttransition: none;\n\n\t&:focus {\n\t\tbox-shadow: none;\n\t}\n\n\t&.ck-on {\n\t\tborder-color: var(--ck-color-focus-border);\n\t\tbackground: var(--ck-color-focus-outer-shadow);\n\t}\n}\n\n"],sourceRoot:""}]);const a=s},2329:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-content .table{display:table;margin:.9em auto}.ck-content .table table{border:1px double #b3b3b3;border-collapse:collapse;border-spacing:0;height:100%;width:100%}.ck-content .table table td,.ck-content .table table th{border:1px solid #bfbfbf;min-width:2em;padding:.4em}.ck-content .table table th{background:rgba(0,0,0,.05);font-weight:700}.ck-content[dir=rtl] .table th{text-align:right}.ck-content[dir=ltr] .table th{text-align:left}.ck-editor__editable .ck-table-bogus-paragraph{display:inline-block;width:100%}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/table.css"],names:[],mappings:"AAKA,mBAKC,aAAc,CADd,gBAiCD,CA9BC,yBAYC,yBAAkC,CAVlC,wBAAyB,CACzB,gBAAiB,CAKjB,WAAY,CADZ,UAsBD,CAfC,wDAQC,wBAAiC,CANjC,aAAc,CACd,YAMD,CAEA,4BAEC,0BAA+B,CAD/B,eAED,CAMF,+BACC,gBACD,CAEA,+BACC,eACD,CAEA,+CAKC,oBAAqB,CAMrB,UACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck-content .table {\n\t/* Give the table widget some air and center it horizontally */\n\t/* The first value should be equal to --ck-spacing-large variable if used in the editor context\n\tto avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */\n\tmargin: 0.9em auto;\n\tdisplay: table;\n\n\t& table {\n\t\t/* The table cells should have slight borders */\n\t\tborder-collapse: collapse;\n\t\tborder-spacing: 0;\n\n\t\t/* Table width and height are set on the parent
. Make sure the table inside stretches\n\t\tto the full dimensions of the container (https://github.com/ckeditor/ckeditor5/issues/6186). */\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\t/* The outer border of the table should be slightly darker than the inner lines.\n\t\tAlso see https://github.com/ckeditor/ckeditor5-table/issues/50. */\n\t\tborder: 1px double hsl(0, 0%, 70%);\n\n\t\t& td,\n\t\t& th {\n\t\t\tmin-width: 2em;\n\t\t\tpadding: .4em;\n\n\t\t\t/* The border is inherited from .ck-editor__nested-editable styles, so theoretically it\'s not necessary here.\n\t\t\tHowever, the border is a content style, so it should use .ck-content (so it works outside the editor).\n\t\t\tHence, the duplication. See https://github.com/ckeditor/ckeditor5/issues/6314 */\n\t\t\tborder: 1px solid hsl(0, 0%, 75%);\n\t\t}\n\n\t\t& th {\n\t\t\tfont-weight: bold;\n\t\t\tbackground: hsla(0, 0%, 0%, 5%);\n\t\t}\n\t}\n}\n\n/* Text alignment of the table header should match the editor settings and override the native browser styling,\nwhen content is available outside the editor. See https://github.com/ckeditor/ckeditor5/issues/6638 */\n.ck-content[dir="rtl"] .table th {\n\ttext-align: right;\n}\n\n.ck-content[dir="ltr"] .table th {\n\ttext-align: left;\n}\n\n.ck-editor__editable .ck-table-bogus-paragraph {\n\t/*\n\t * Use display:inline-block to force Chrome/Safari to limit text mutations to this element.\n\t * See https://github.com/ckeditor/ckeditor5/issues/6062.\n\t */\n\tdisplay: inline-block;\n\n\t/*\n\t * Inline HTML elements nested in the span should always be dimensioned in relation to the whole cell width.\n\t * See https://github.com/ckeditor/ckeditor5/issues/9117.\n\t */\n\twidth: 100%;\n}\n'],sourceRoot:""}]);const a=s},4143:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-selector-caption-background:#f7f7f7;--ck-color-selector-caption-text:#333;--ck-color-selector-caption-highlighted-background:#fd0}.ck-content .table>figcaption{background-color:var(--ck-color-selector-caption-background);caption-side:top;color:var(--ck-color-selector-caption-text);display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;text-align:center;word-break:break-word}.ck.ck-editor__editable .table>figcaption.table__caption_highlighted{animation:ck-table-caption-highlight .6s ease-out}.ck.ck-editor__editable .table>figcaption.ck-placeholder:before{overflow:hidden;padding-left:inherit;padding-right:inherit;text-overflow:ellipsis;white-space:nowrap}@keyframes ck-table-caption-highlight{0%{background-color:var(--ck-color-selector-caption-highlighted-background)}to{background-color:var(--ck-color-selector-caption-background)}}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/tablecaption.css"],names:[],mappings:"AAKA,MACC,8CAAuD,CACvD,qCAAiD,CACjD,uDACD,CAGA,8BAMC,4DAA6D,CAJ7D,gBAAiB,CAGjB,2CAA4C,CAJ5C,qBAAsB,CAOtB,eAAgB,CAChB,mBAAoB,CAFpB,YAAa,CAHb,iBAAkB,CADlB,qBAOD,CAIC,qEACC,iDACD,CAEA,gEASC,eAAgB,CARhB,oBAAqB,CACrB,qBAAsB,CAQtB,sBAAuB,CAFvB,kBAGD,CAGD,sCACC,GACC,wEACD,CAEA,GACC,4DACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-selector-caption-background: hsl(0, 0%, 97%);\n\t--ck-color-selector-caption-text: hsl(0, 0%, 20%);\n\t--ck-color-selector-caption-highlighted-background: hsl(52deg 100% 50%);\n}\n\n/* Content styles */\n.ck-content .table > figcaption {\n\tdisplay: table-caption;\n\tcaption-side: top;\n\tword-break: break-word;\n\ttext-align: center;\n\tcolor: var(--ck-color-selector-caption-text);\n\tbackground-color: var(--ck-color-selector-caption-background);\n\tpadding: .6em;\n\tfont-size: .75em;\n\toutline-offset: -1px;\n}\n\n/* Editing styles */\n.ck.ck-editor__editable .table > figcaption {\n\t&.table__caption_highlighted {\n\t\tanimation: ck-table-caption-highlight .6s ease-out;\n\t}\n\n\t&.ck-placeholder::before {\n\t\tpadding-left: inherit;\n\t\tpadding-right: inherit;\n\n\t\t/*\n\t\t * Make sure the table caption placeholder doesn't overflow the placeholder area.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9162.\n\t\t */\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n\n@keyframes ck-table-caption-highlight {\n\t0% {\n\t\tbackground-color: var(--ck-color-selector-caption-highlighted-background);\n\t}\n\n\t100% {\n\t\tbackground-color: var(--ck-color-selector-caption-background);\n\t}\n}\n"],sourceRoot:""}]);const a=s},8986:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row{flex-wrap:wrap}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:first-of-type{flex-grow:0.57}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar:last-of-type{flex-grow:0.43}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar .ck-button{flex-grow:1}.ck.ck-table-cell-properties-form{width:320px}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__padding-row{align-self:flex-end;padding:0;width:25%}.ck.ck-table-cell-properties-form .ck-form__row.ck-table-cell-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/tablecellproperties.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tablecellproperties.css"],names:[],mappings:"AAOE,6FACC,cAiBD,CAdE,0HAEC,cACD,CAEA,yHAEC,cACD,CAEA,uHACC,WACD,CClBJ,kCACC,WAkBD,CAfE,2FACC,mBAAoB,CACpB,SAAU,CACV,SACD,CAGC,4GACC,eAAgB,CAGhB,qCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-cell-properties-form {\n\t& .ck-form__row {\n\t\t&.ck-table-cell-properties-form__alignment-row {\n\t\t\tflex-wrap: wrap;\n\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\t&:first-of-type {\n\t\t\t\t\t/* 4 buttons out of 7 (h-alignment + v-alignment) = 0.57 */\n\t\t\t\t\tflex-grow: 0.57;\n\t\t\t\t}\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\t/* 3 buttons out of 7 (h-alignment + v-alignment) = 0.43 */\n\t\t\t\t\tflex-grow: 0.43;\n\t\t\t\t}\n\n\t\t\t\t& .ck-button {\n\t\t\t\t\tflex-grow: 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-cell-properties-form {\n\twidth: 320px;\n\n\t& .ck-form__row {\n\t\t&.ck-table-cell-properties-form__padding-row {\n\t\t\talign-self: flex-end;\n\t\t\tpadding: 0;\n\t\t\twidth: 25%;\n\t\t}\n\n\t\t&.ck-table-cell-properties-form__alignment-row {\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\tbackground: none;\n\n\t\t\t\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},8795:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-selector-column-resizer-hover:var(--ck-color-base-active);--ck-table-column-resizer-width:7px;--ck-table-column-resizer-position-offset:calc(var(--ck-table-column-resizer-width)*-0.5 - 0.5px)}.ck-content .table .ck-table-resized{table-layout:fixed}.ck-content .table table{overflow:hidden}.ck-content .table td,.ck-content .table th{overflow-wrap:break-word;position:relative}.ck.ck-editor__editable .table .ck-table-column-resizer{bottom:0;cursor:col-resize;position:absolute;right:var(--ck-table-column-resizer-position-offset);top:0;user-select:none;width:var(--ck-table-column-resizer-width);z-index:var(--ck-z-default)}.ck.ck-editor__editable .table[draggable] .ck-table-column-resizer,.ck.ck-editor__editable.ck-column-resize_disabled .table .ck-table-column-resizer{display:none}.ck.ck-editor__editable .table .ck-table-column-resizer:hover,.ck.ck-editor__editable .table .ck-table-column-resizer__active{background-color:var(--ck-color-selector-column-resizer-hover);bottom:-999999px;opacity:.25;top:-999999px}.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer{left:var(--ck-table-column-resizer-position-offset);right:unset}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/tablecolumnresize.css"],names:[],mappings:"AAKA,MACC,oEAAqE,CACrE,mCAAoC,CAIpC,iGACD,CAEA,qCACC,kBACD,CAEA,yBACC,eACD,CAEA,4CAIC,wBAAyB,CACzB,iBACD,CAEA,wDAGC,QAAS,CAGT,iBAAkB,CALlB,iBAAkB,CAGlB,oDAAqD,CAFrD,KAAM,CAKN,gBAAiB,CAFjB,0CAA2C,CAG3C,2BACD,CAQA,qJACC,YACD,CAEA,8HAEC,8DAA+D,CAO/D,gBAAiB,CANjB,WAAa,CAKb,aAED,CAEA,iEACC,mDAAoD,CACpD,WACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-selector-column-resizer-hover: var(--ck-color-base-active);\n\t--ck-table-column-resizer-width: 7px;\n\n\t/* The offset used for absolute positioning of the resizer element, so that it is placed exactly above the cell border.\n\t The value is: minus half the width of the resizer decreased additionaly by the half the width of the border (0.5px). */\n\t--ck-table-column-resizer-position-offset: calc(var(--ck-table-column-resizer-width) * -0.5 - 0.5px);\n}\n\n.ck-content .table .ck-table-resized {\n\ttable-layout: fixed;\n}\n\n.ck-content .table table {\n\toverflow: hidden;\n}\n\n.ck-content .table td,\n.ck-content .table th {\n\t/* To prevent text overflowing beyond its cell when columns are resized by resize handler\n\t(https://github.com/ckeditor/ckeditor5/pull/14379#issuecomment-1589460978). */\n\toverflow-wrap: break-word;\n\tposition: relative;\n}\n\n.ck.ck-editor__editable .table .ck-table-column-resizer {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tright: var(--ck-table-column-resizer-position-offset);\n\twidth: var(--ck-table-column-resizer-width);\n\tcursor: col-resize;\n\tuser-select: none;\n\tz-index: var(--ck-z-default);\n}\n\n.ck.ck-editor__editable.ck-column-resize_disabled .table .ck-table-column-resizer {\n\tdisplay: none;\n}\n\n/* The resizer elements, which are extended to an extremely high height, break the drag & drop feature in Chrome. To make it work again,\n all resizers must be hidden while the table is dragged. */\n.ck.ck-editor__editable .table[draggable] .ck-table-column-resizer {\n\tdisplay: none;\n}\n\n.ck.ck-editor__editable .table .ck-table-column-resizer:hover,\n.ck.ck-editor__editable .table .ck-table-column-resizer__active {\n\tbackground-color: var(--ck-color-selector-column-resizer-hover);\n\topacity: 0.25;\n\t/* The resizer element resides in each cell so to occupy the entire height of the table, which is unknown from a CSS point of view,\n\t it is extended to an extremely high height. Even for screens with a very high pixel density, the resizer will fulfill its role as\n\t it should, i.e. for a screen of 476 ppi the total height of the resizer will take over 350 sheets of A4 format, which is totally\n\t unrealistic height for a single table. */\n\ttop: -999999px;\n\tbottom: -999999px;\n}\n\n.ck.ck-editor__editable[dir=rtl] .table .ck-table-column-resizer {\n\tleft: var(--ck-table-column-resizer-position-offset);\n\tright: unset;\n}\n"],sourceRoot:""}]);const a=s},8137:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-selector-focused-cell-background:rgba(158,201,250,.3)}.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table td.ck-editor__nested-editable:focus,.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck-widget.table th.ck-editor__nested-editable:focus{background:var(--ck-color-selector-focused-cell-background);border-style:none;outline:1px solid var(--ck-color-focus-border);outline-offset:-1px}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tableediting.css"],names:[],mappings:"AAKA,MACC,gEACD,CAKE,8QAGC,2DAA4D,CAK5D,iBAAkB,CAClB,8CAA+C,CAC/C,mBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-selector-focused-cell-background: hsla(212, 90%, 80%, .3);\n}\n\n.ck-widget.table {\n\t& td,\n\t& th {\n\t\t&.ck-editor__nested-editable.ck-editor__nested-editable_focused,\n\t\t&.ck-editor__nested-editable:focus {\n\t\t\t/* A very slight background to highlight the focused cell */\n\t\t\tbackground: var(--ck-color-selector-focused-cell-background);\n\n\t\t\t/* Fixes the problem where surrounding cells cover the focused cell's border.\n\t\t\tIt does not fix the problem in all places but the UX is improved.\n\t\t\tSee https://github.com/ckeditor/ckeditor5-table/issues/29. */\n\t\t\tborder-style: none;\n\t\t\toutline: 1px solid var(--ck-color-focus-border);\n\t\t\toutline-offset: -1px; /* progressive enhancement - no IE support */\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},1623:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck.ck-table-form .ck-form__row.ck-table-form__background-row,.ck.ck-table-form .ck-form__row.ck-table-form__border-row{flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{align-items:center;flex-wrap:wrap}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view{align-items:center;display:flex;flex-direction:column-reverse}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-labeled-field-view .ck.ck-dropdown,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{flex-grow:0}.ck.ck-table-form .ck.ck-labeled-field-view{position:relative}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{bottom:calc(var(--ck-table-properties-error-arrow-size)*-1);left:50%;position:absolute;transform:translate(-50%,100%);z-index:1}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{content:"";left:50%;position:absolute;top:calc(var(--ck-table-properties-error-arrow-size)*-1);transform:translateX(-50%)}:root{--ck-table-properties-error-arrow-size:6px;--ck-table-properties-min-error-width:150px}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-labeled-field-view>.ck-label{font-size:var(--ck-font-size-tiny);text-align:center}.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-style,.ck.ck-table-form .ck-form__row.ck-table-form__border-row .ck-table-form__border-width{max-width:80px;min-width:80px;width:80px}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row{padding:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__height,.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimensions-row__width{margin:0}.ck.ck-table-form .ck-form__row.ck-table-form__dimensions-row .ck-table-form__dimension-operator{align-self:flex-end;display:inline-block;height:var(--ck-ui-component-min-height);line-height:var(--ck-ui-component-min-height);margin:0 var(--ck-spacing-small)}.ck.ck-table-form .ck.ck-labeled-field-view{padding-top:var(--ck-spacing-standard)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{border-radius:0}.ck-rounded-corners .ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status,.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{background:var(--ck-color-base-error);color:var(--ck-color-base-background);min-width:var(--ck-table-properties-min-error-width);padding:var(--ck-spacing-small) var(--ck-spacing-medium);text-align:center}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status:after{border-color:transparent transparent var(--ck-color-base-error) transparent;border-style:solid;border-width:0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size)}.ck.ck-table-form .ck.ck-labeled-field-view .ck.ck-labeled-field-view__status{animation:ck-table-form-labeled-view-status-appear .15s ease both}.ck.ck-table-form .ck.ck-labeled-field-view .ck-input.ck-error:not(:focus)+.ck.ck-labeled-field-view__status{display:none}@keyframes ck-table-form-labeled-view-status-appear{0%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./../ckeditor5-table/theme/tableform.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tableform.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAWE,wHACC,cACD,CAEA,8DAEC,kBAAmB,CADnB,cAgBD,CAbC,qFAGC,kBAAmB,CAFnB,YAAa,CACb,6BAMD,CAEA,sMACC,WACD,CAIF,4CAEC,iBAoBD,CAlBC,8EAGC,2DAAgE,CADhE,QAAS,CADT,iBAAkB,CAGlB,8BAA+B,CAG/B,SAUD,CAPC,oFACC,UAAW,CAGX,QAAS,CAFT,iBAAkB,CAClB,wDAA6D,CAE7D,0BACD,CChDH,MACC,0CAA2C,CAC3C,2CACD,CAMI,2FACC,kCAAmC,CACnC,iBACD,CAGD,8KAIC,cAAe,CADf,cAAe,CADf,UAGD,CAGD,8DACC,SAcD,CAZC,yMAEC,QACD,CAEA,iGACC,mBAAoB,CACpB,oBAAqB,CACrB,wCAAyC,CACzC,6CAA8C,CAC9C,gCACD,CAIF,4CACC,sCAyBD,CAvBC,8ECxCD,eDyDC,CAjBA,mMCpCA,qCDqDA,CAjBA,8EAGC,qCAAsC,CACtC,qCAAsC,CAEtC,oDAAqD,CADrD,wDAAyD,CAEzD,iBAUD,CAPC,oFACC,2EAA4E,CAE5E,kBAAmB,CADnB,kJAED,CAdD,8EAgBC,iEACD,CAGA,6GACC,YACD,CAIF,oDACC,GACC,SACD,CAEA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__background-row {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tflex-wrap: wrap;\n\t\t\talign-items: center;\n\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column-reverse;\n\t\t\t\talign-items: center;\n\n\t\t\t\t& .ck.ck-dropdown {\n\t\t\t\t\tflex-grow: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\tflex-grow: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\t/* Allow absolute positioning of the status (error) balloons. */\n\t\tposition: relative;\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\tposition: absolute;\n\t\t\tleft: 50%;\n\t\t\tbottom: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\ttransform: translate(-50%,100%);\n\n\t\t\t/* Make sure the balloon status stays on top of other form elements. */\n\t\t\tz-index: 1;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc( -1 * var(--ck-table-properties-error-arrow-size) );\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX( -50% );\n\t\t\t}\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_rounded.css";\n\n:root {\n\t--ck-table-properties-error-arrow-size: 6px;\n\t--ck-table-properties-min-error-width: 150px;\n}\n\n.ck.ck-table-form {\n\t& .ck-form__row {\n\t\t&.ck-table-form__border-row {\n\t\t\t& .ck-labeled-field-view {\n\t\t\t\t& > .ck-label {\n\t\t\t\t\tfont-size: var(--ck-font-size-tiny);\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-table-form__border-style,\n\t\t\t& .ck-table-form__border-width {\n\t\t\t\twidth: 80px;\n\t\t\t\tmin-width: 80px;\n\t\t\t\tmax-width: 80px;\n\t\t\t}\n\t\t}\n\n\t\t&.ck-table-form__dimensions-row {\n\t\t\tpadding: 0;\n\n\t\t\t& .ck-table-form__dimensions-row__width,\n\t\t\t& .ck-table-form__dimensions-row__height {\n\t\t\t\tmargin: 0\n\t\t\t}\n\n\t\t\t& .ck-table-form__dimension-operator {\n\t\t\t\talign-self: flex-end;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\theight: var(--ck-ui-component-min-height);\n\t\t\t\tline-height: var(--ck-ui-component-min-height);\n\t\t\t\tmargin: 0 var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t& .ck.ck-labeled-field-view {\n\t\tpadding-top: var(--ck-spacing-standard);\n\n\t\t& .ck.ck-labeled-field-view__status {\n\t\t\t@mixin ck-rounded-corners;\n\n\t\t\tbackground: var(--ck-color-base-error);\n\t\t\tcolor: var(--ck-color-base-background);\n\t\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\t\tmin-width: var(--ck-table-properties-min-error-width);\n\t\t\ttext-align: center;\n\n\t\t\t/* The arrow pointing towards the field. */\n\t\t\t&::after {\n\t\t\t\tborder-color: transparent transparent var(--ck-color-base-error) transparent;\n\t\t\t\tborder-width: 0 var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size) var(--ck-table-properties-error-arrow-size);\n\t\t\t\tborder-style: solid;\n\t\t\t}\n\n\t\t\tanimation: ck-table-form-labeled-view-status-appear .15s ease both;\n\t\t}\n\n\t\t/* Hide the error balloon when the field is blurred. Makes the experience much more clear. */\n\t\t& .ck-input.ck-error:not(:focus) + .ck.ck-labeled-field-view__status {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n@keyframes ck-table-form-labeled-view-status-appear {\n\t0% {\n\t\topacity: 0;\n\t}\n\n\t100% {\n\t\topacity: 1;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},5562:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-content:baseline;flex-basis:0;flex-wrap:wrap}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items{flex-wrap:nowrap}.ck.ck-table-properties-form{width:320px}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row{align-self:flex-end;padding:0}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar{background:none;margin-top:var(--ck-spacing-standard)}.ck.ck-table-properties-form .ck-form__row.ck-table-properties-form__alignment-row .ck.ck-toolbar .ck-toolbar__items>*{width:40px}","",{version:3,sources:["webpack://./../ckeditor5-table/theme/tableproperties.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tableproperties.css"],names:[],mappings:"AAOE,mFAGC,sBAAuB,CADvB,YAAa,CADb,cAOD,CAHC,qHACC,gBACD,CCTH,6BACC,WAmBD,CAhBE,mFACC,mBAAoB,CACpB,SAYD,CAVC,kGACC,eAAgB,CAGhB,qCAKD,CAHC,uHACC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\tflex-wrap: wrap;\n\t\t\tflex-basis: 0;\n\t\t\talign-content: baseline;\n\n\t\t\t& .ck.ck-toolbar .ck-toolbar__items {\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t}\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-table-properties-form {\n\twidth: 320px;\n\n\t& .ck-form__row {\n\t\t&.ck-table-properties-form__alignment-row {\n\t\t\talign-self: flex-end;\n\t\t\tpadding: 0;\n\n\t\t\t& .ck.ck-toolbar {\n\t\t\t\tbackground: none;\n\n\t\t\t\t/* Compensate for missing input label that would push the margin (toolbar has no inputs). */\n\t\t\t\tmargin-top: var(--ck-spacing-standard);\n\n\t\t\t\t& .ck-toolbar__items > * {\n\t\t\t\t\twidth: 40px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},8423:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,':root{--ck-table-selected-cell-background:rgba(158,207,250,.3)}.ck.ck-editor__editable .table table td.ck-editor__editable_selected,.ck.ck-editor__editable .table table th.ck-editor__editable_selected{box-shadow:unset;caret-color:transparent;outline:unset;position:relative}.ck.ck-editor__editable .table table td.ck-editor__editable_selected:after,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:after{background-color:var(--ck-table-selected-cell-background);bottom:0;content:"";left:0;pointer-events:none;position:absolute;right:0;top:0}.ck.ck-editor__editable .table table td.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table td.ck-editor__editable_selected:focus,.ck.ck-editor__editable .table table th.ck-editor__editable_selected ::selection,.ck.ck-editor__editable .table table th.ck-editor__editable_selected:focus{background-color:transparent}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget{outline:unset}.ck.ck-editor__editable .table table td.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle,.ck.ck-editor__editable .table table th.ck-editor__editable_selected .ck-widget>.ck-widget__selection-handle{display:none}',"",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-table/tableselection.css"],names:[],mappings:"AAKA,MACC,wDACD,CAGC,0IAKC,gBAAiB,CAFjB,uBAAwB,CACxB,aAAc,CAFd,iBAiCD,CA3BC,sJAGC,yDAA0D,CAK1D,QAAS,CAPT,UAAW,CAKX,MAAO,CAJP,mBAAoB,CAEpB,iBAAkB,CAGlB,OAAQ,CAFR,KAID,CAEA,wTAEC,4BACD,CAMA,gKACC,aAKD,CAHC,0NACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-table-selected-cell-background: hsla(208, 90%, 80%, .3);\n}\n\n.ck.ck-editor__editable .table table {\n\t& td.ck-editor__editable_selected,\n\t& th.ck-editor__editable_selected {\n\t\tposition: relative;\n\t\tcaret-color: transparent;\n\t\toutline: unset;\n\t\tbox-shadow: unset;\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/6446 */\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tpointer-events: none;\n\t\t\tbackground-color: var(--ck-table-selected-cell-background);\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t}\n\n\t\t& ::selection,\n\t\t&:focus {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t/*\n\t\t * To reduce the amount of noise, all widgets in the table selection have no outline and no selection handle.\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/9491.\n\t\t */\n\t\t& .ck-widget {\n\t\t\toutline: unset;\n\n\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},1801:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-aria-live-announcer{left:-10000px;position:absolute;top:-10000px}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/arialiveannouncer/arialiveannouncer.css"],names:[],mappings:"AAKA,2BAEC,aAAc,CADd,iBAAkB,CAElB,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-aria-live-announcer {\n\tposition: absolute;\n\tleft: -10000px;\n\ttop: -10000px;\n}\n"],sourceRoot:""}]);const a=s},5727:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-autocomplete{position:relative}.ck.ck-autocomplete>.ck-search__results{position:absolute;z-index:var(--ck-z-panel)}.ck.ck-autocomplete>.ck-search__results.ck-search__results_n{bottom:100%}.ck.ck-autocomplete>.ck-search__results.ck-search__results_s{bottom:auto;top:100%}.ck.ck-autocomplete>.ck-search__results{border-radius:0}.ck-rounded-corners .ck.ck-autocomplete>.ck-search__results,.ck.ck-autocomplete>.ck-search__results.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-autocomplete>.ck-search__results{background:var(--ck-color-base-background);border:1px solid var(--ck-color-dropdown-panel-border);box-shadow:var(--ck-drop-shadow),0 0;max-height:200px;min-width:auto;overflow-y:auto}.ck.ck-autocomplete>.ck-search__results.ck-search__results_n{border-bottom-left-radius:0;border-bottom-right-radius:0;margin-bottom:-1px}.ck.ck-autocomplete>.ck-search__results.ck-search__results_s{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/autocomplete/autocomplete.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/autocomplete/autocomplete.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,oBACC,iBAeD,CAbC,wCACC,iBAAkB,CAClB,yBAUD,CARC,6DACC,WACD,CAEA,6DAEC,WAAY,CADZ,QAED,CCVD,wCCEA,eDuBA,CAzBA,uHCMC,qCDmBD,CAzBA,wCAMC,0CAA2C,CAC3C,sDAAuD,CEPxD,oCAA8B,CFI7B,gBAAiB,CAIjB,cAAe,CAHf,eAoBD,CAfC,6DACC,2BAA4B,CAC5B,4BAA6B,CAG7B,kBACD,CAEA,6DACC,wBAAyB,CACzB,yBAA0B,CAG1B,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-autocomplete {\n\tposition: relative;\n\n\t& > .ck-search__results {\n\t\tposition: absolute;\n\t\tz-index: var(--ck-z-panel);\n\n\t\t&.ck-search__results_n {\n\t\t\tbottom: 100%;\n\t\t}\n\n\t\t&.ck-search__results_s {\n\t\t\ttop: 100%;\n\t\t\tbottom: auto;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-theme-lark/theme/mixins/_shadow.css";\n\n.ck.ck-autocomplete {\n\t& > .ck-search__results {\n\t\t@mixin ck-rounded-corners;\n\t\t@mixin ck-drop-shadow;\n\n\t\tmax-height: 200px;\n\t\toverflow-y: auto;\n\t\tbackground: var(--ck-color-base-background);\n\t\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\t\tmin-width: auto;\n\n\t\t&.ck-search__results_n {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\n\t\t\t/* Prevent duplicated borders between the input and the results pane. */\n\t\t\tmargin-bottom: -1px;\n\t\t}\n\n\t\t&.ck-search__results_s {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-top-right-radius: 0;\n\n\t\t\t/* Prevent duplicated borders between the input and the results pane. */\n\t\t\tmargin-top: -1px;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},9715:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-button,a.ck.ck-button{align-items:center;display:inline-flex;position:relative;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}[dir=ltr] .ck.ck-button,[dir=ltr] a.ck.ck-button{justify-content:left}[dir=rtl] .ck.ck-button,[dir=rtl] a.ck.ck-button{justify-content:right}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{display:none}.ck.ck-button.ck-button_with-text .ck-button__label,a.ck.ck-button.ck-button_with-text .ck-button__label{display:inline-block}.ck.ck-button:not(.ck-button_with-text),a.ck.ck-button:not(.ck-button_with-text){justify-content:center}.ck.ck-button,a.ck.ck-button{background:var(--ck-color-button-default-background)}.ck.ck-button:not(.ck-disabled):hover,a.ck.ck-button:not(.ck-disabled):hover{background:var(--ck-color-button-default-hover-background)}.ck.ck-button:not(.ck-disabled):active,a.ck.ck-button:not(.ck-disabled):active{background:var(--ck-color-button-default-active-background)}.ck.ck-button.ck-disabled,a.ck.ck-button.ck-disabled{background:var(--ck-color-button-default-disabled-background)}.ck.ck-button,a.ck.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-button,.ck-rounded-corners a.ck.ck-button,.ck.ck-button.ck-rounded-corners,a.ck.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-button,a.ck.ck-button{-webkit-appearance:none;border:1px solid transparent;cursor:default;font-size:inherit;line-height:1;min-height:var(--ck-ui-component-min-height);min-width:var(--ck-ui-component-min-height);padding:var(--ck-spacing-tiny);text-align:center;transition:box-shadow .2s ease-in-out,border .2s ease-in-out;vertical-align:middle;white-space:nowrap}.ck.ck-button:active,.ck.ck-button:focus,a.ck.ck-button:active,a.ck.ck-button:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-button .ck-button__icon use,.ck.ck-button .ck-button__icon use *,a.ck.ck-button .ck-button__icon use,a.ck.ck-button .ck-button__icon use *{color:inherit}.ck.ck-button .ck-button__label,a.ck.ck-button .ck-button__label{color:inherit;cursor:inherit;font-size:inherit;font-weight:inherit;vertical-align:middle}[dir=ltr] .ck.ck-button .ck-button__label,[dir=ltr] a.ck.ck-button .ck-button__label{text-align:left}[dir=rtl] .ck.ck-button .ck-button__label,[dir=rtl] a.ck.ck-button .ck-button__label{text-align:right}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{color:inherit}[dir=ltr] .ck.ck-button .ck-button__keystroke,[dir=ltr] a.ck.ck-button .ck-button__keystroke{margin-left:var(--ck-spacing-large)}[dir=rtl] .ck.ck-button .ck-button__keystroke,[dir=rtl] a.ck.ck-button .ck-button__keystroke{margin-right:var(--ck-spacing-large)}.ck.ck-button .ck-button__keystroke,a.ck.ck-button .ck-button__keystroke{opacity:.5}.ck.ck-button.ck-disabled:active,.ck.ck-button.ck-disabled:focus,a.ck.ck-button.ck-disabled:active,a.ck.ck-button.ck-disabled:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-button.ck-disabled .ck-button__icon,.ck.ck-button.ck-disabled .ck-button__label,a.ck.ck-button.ck-disabled .ck-button__icon,a.ck.ck-button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-disabled .ck-button__keystroke,a.ck.ck-button.ck-disabled .ck-button__keystroke{opacity:.3}.ck.ck-button.ck-button_with-text,a.ck.ck-button.ck-button_with-text{padding:var(--ck-spacing-tiny) var(--ck-spacing-standard)}[dir=ltr] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=ltr] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}[dir=rtl] .ck.ck-button.ck-button_with-text .ck-button__icon,[dir=rtl] a.ck.ck-button.ck-button_with-text .ck-button__icon{margin-left:var(--ck-spacing-small);margin-right:calc(var(--ck-spacing-small)*-1)}.ck.ck-button.ck-button_with-keystroke .ck-button__label,a.ck.ck-button.ck-button_with-keystroke .ck-button__label{flex-grow:1}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{background:var(--ck-color-button-on-background)}.ck.ck-button.ck-on:not(.ck-disabled):hover,a.ck.ck-button.ck-on:not(.ck-disabled):hover{background:var(--ck-color-button-on-hover-background)}.ck.ck-button.ck-on:not(.ck-disabled):active,a.ck.ck-button.ck-on:not(.ck-disabled):active{background:var(--ck-color-button-on-active-background)}.ck.ck-button.ck-on.ck-disabled,a.ck.ck-button.ck-on.ck-disabled{background:var(--ck-color-button-on-disabled-background)}.ck.ck-button.ck-on,a.ck.ck-button.ck-on{color:var(--ck-color-button-on-color)}.ck.ck-button.ck-button-save,a.ck.ck-button.ck-button-save{color:var(--ck-color-button-save)}.ck.ck-button.ck-button-cancel,a.ck.ck-button.ck-button-cancel{color:var(--ck-color-button-cancel)}.ck.ck-button-action,a.ck.ck-button-action{background:var(--ck-color-button-action-background)}.ck.ck-button-action:not(.ck-disabled):hover,a.ck.ck-button-action:not(.ck-disabled):hover{background:var(--ck-color-button-action-hover-background)}.ck.ck-button-action:not(.ck-disabled):active,a.ck.ck-button-action:not(.ck-disabled):active{background:var(--ck-color-button-action-active-background)}.ck.ck-button-action.ck-disabled,a.ck.ck-button-action.ck-disabled{background:var(--ck-color-button-action-disabled-background)}.ck.ck-button-action,a.ck.ck-button-action{color:var(--ck-color-button-action-text)}.ck.ck-button-bold,a.ck.ck-button-bold{font-weight:700}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/button/button.css","webpack://./../ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/button.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/mixins/_button.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AAQA,6BAMC,kBAAmB,CADnB,mBAAoB,CADpB,iBAAkB,CCHlB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD0BD,CA9BA,iDASE,oBAqBF,CA9BA,iDAaE,qBAiBF,CAdC,iEACC,YACD,CAGC,yGACC,oBACD,CAID,iFACC,sBACD,CEzBD,6BCAC,oDD2ID,CCxIE,6EACC,0DACD,CAEA,+EACC,2DACD,CAID,qDACC,6DACD,CDfD,6BEDC,eF4ID,CA3IA,wIEGE,qCFwIF,CA3IA,6BA6BC,uBAAwB,CANxB,4BAA6B,CAjB7B,cAAe,CAcf,iBAAkB,CAHlB,aAAc,CAJd,4CAA6C,CAD7C,2CAA4C,CAJ5C,8BAA+B,CAC/B,iBAAkB,CAiBlB,4DAA8D,CAnB9D,qBAAsB,CAFtB,kBAsID,CA5GC,oFGhCA,2BAA2B,CCF3B,2CAA8B,CDC9B,YHqCA,CAIC,kJAEC,aACD,CAGD,iEAIC,aAAc,CACd,cAAe,CAHf,iBAAkB,CAClB,mBAAoB,CAMpB,qBASD,CAlBA,qFAYE,eAMF,CAlBA,qFAgBE,gBAEF,CAEA,yEACC,aAWD,CAZA,6FAIE,mCAQF,CAZA,6FAQE,oCAIF,CAZA,yEAWC,UACD,CAIC,oIIpFD,oDJwFC,CAOA,gLK/FD,kCLiGC,CAEA,iGACC,UACD,CAGD,qEACC,yDAcD,CAXC,2HAEE,4CAA+C,CAC/C,oCAOF,CAVA,2HAQE,mCAAoC,CADpC,6CAGF,CAKA,mHACC,WACD,CAID,yCC9HA,+CDkIA,CC/HC,yFACC,qDACD,CAEA,2FACC,sDACD,CAID,iEACC,wDACD,CD+GA,yCAGC,qCACD,CAEA,2DACC,iCACD,CAEA,+DACC,mCACD,CAID,2CC9IC,mDDmJD,CChJE,2FACC,yDACD,CAEA,6FACC,0DACD,CAID,mEACC,4DACD,CD+HD,2CAIC,wCACD,CAEA,uCAEC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n@import "../../mixins/_dir.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-unselectable;\n\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\n\t@mixin ck-dir ltr {\n\t\tjustify-content: left;\n\t}\n\n\t@mixin ck-dir rtl {\n\t\tjustify-content: right;\n\t}\n\n\t& .ck-button__label {\n\t\tdisplay: none;\n\t}\n\n\t&.ck-button_with-text {\n\t\t& .ck-button__label {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n\n\t/* Center the icon horizontally in a button without text. */\n\t&:not(.ck-button_with-text) {\n\t\tjustify-content: center;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../mixins/_button.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-button,\na.ck.ck-button {\n\t@mixin ck-button-colors --ck-color-button-default;\n\t@mixin ck-rounded-corners;\n\n\twhite-space: nowrap;\n\tcursor: default;\n\tvertical-align: middle;\n\tpadding: var(--ck-spacing-tiny);\n\ttext-align: center;\n\n\t/* A very important piece of styling. Go to variable declaration to learn more. */\n\tmin-width: var(--ck-ui-component-min-height);\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Normalize the height of the line. Removing this will break consistent height\n\tamong text and text-less buttons (with icons). */\n\tline-height: 1;\n\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t/* Avoid flickering when the foucs border shows up. */\n\tborder: 1px solid transparent;\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .2s ease-in-out, border .2s ease-in-out;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/189 */\n\t-webkit-appearance: none;\n\n\t&:active,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t/* Allow icon coloring using the text "color" property. */\n\t& .ck-button__icon {\n\t\t& use,\n\t\t& use * {\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\n\t& .ck-button__label {\n\t\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\t\tfont-size: inherit;\n\t\tfont-weight: inherit;\n\t\tcolor: inherit;\n\t\tcursor: inherit;\n\n\t\t/* Must be consistent with .ck-icon\'s vertical align. Otherwise, buttons with and\n\t\twithout labels (but with icons) have different sizes in Chrome */\n\t\tvertical-align: middle;\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& .ck-button__keystroke {\n\t\tcolor: inherit;\n\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-right: var(--ck-spacing-large);\n\t\t}\n\n\t\topacity: .5;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t&.ck-disabled {\n\t\t&:active,\n\t\t&:focus {\n\t\t\t/* The disabled button should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t\t& .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t& .ck-button__keystroke {\n\t\t\topacity: .3;\n\t\t}\n\t}\n\n\t&.ck-button_with-text {\n\t\tpadding: var(--ck-spacing-tiny) var(--ck-spacing-standard);\n\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__icon {\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-right: calc(-1 * var(--ck-spacing-small));\n\t\t\t\tmargin-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-button_with-keystroke {\n\t\t/* stylelint-disable-next-line no-descending-specificity */\n\t\t& .ck-button__label {\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t/* A style of the button which is currently on, e.g. its feature is active. */\n\t&.ck-on {\n\t\t@mixin ck-button-colors --ck-color-button-on;\n\n\t\tcolor: var(--ck-color-button-on-color);\n\t}\n\n\t&.ck-button-save {\n\t\tcolor: var(--ck-color-button-save);\n\t}\n\n\t&.ck-button-cancel {\n\t\tcolor: var(--ck-color-button-cancel);\n\t}\n}\n\n/* A style of the button which handles the primary action. */\n.ck.ck-button-action,\na.ck.ck-button-action {\n\t@mixin ck-button-colors --ck-color-button-action;\n\n\tcolor: var(--ck-color-button-action-text);\n}\n\n.ck.ck-button-bold,\na.ck.ck-button-bold {\n\tfont-weight: bold;\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements a button of given background color.\n *\n * @param {String} $background - Background color of the button.\n * @param {String} $border - Border color of the button.\n */\n@define-mixin ck-button-colors $prefix {\n\tbackground: var($(prefix)-background);\n\n\t&:not(.ck-disabled) {\n\t\t&:hover {\n\t\t\tbackground: var($(prefix)-hover-background);\n\t\t}\n\n\t\t&:active {\n\t\t\tbackground: var($(prefix)-active-background);\n\t\t}\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/98 */\n\t&.ck-disabled {\n\t\tbackground: var($(prefix)-disabled-background);\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},4391:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{display:block}:root{--ck-switch-button-toggle-width:2.6153846154em;--ck-switch-button-toggle-inner-size:calc(1.07692em + 1px);--ck-switch-button-translation:calc(var(--ck-switch-button-toggle-width) - var(--ck-switch-button-toggle-inner-size) - 2px);--ck-switch-button-inner-hover-shadow:0 0 0 5px var(--ck-color-switch-button-inner-shadow)}.ck.ck-button.ck-switchbutton,.ck.ck-button.ck-switchbutton.ck-on:active,.ck.ck-button.ck-switchbutton.ck-on:focus,.ck.ck-button.ck-switchbutton.ck-on:hover,.ck.ck-button.ck-switchbutton:active,.ck.ck-button.ck-switchbutton:focus,.ck.ck-button.ck-switchbutton:hover{background:transparent;color:inherit}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__label{margin-right:calc(var(--ck-spacing-large)*2)}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__label{margin-left:calc(var(--ck-spacing-large)*2)}.ck.ck-button.ck-switchbutton .ck-button__toggle{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle,.ck.ck-button.ck-switchbutton .ck-button__toggle.ck-rounded-corners{border-radius:var(--ck-border-radius)}[dir=ltr] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-left:auto}[dir=rtl] .ck.ck-button.ck-switchbutton .ck-button__toggle{margin-right:auto}.ck.ck-button.ck-switchbutton .ck-button__toggle{background:var(--ck-color-switch-button-off-background);border:1px solid transparent;transition:background .4s ease,box-shadow .2s ease-in-out,outline .2s ease-in-out;width:var(--ck-switch-button-toggle-width)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{border-radius:0}.ck-rounded-corners .ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner,.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner.ck-rounded-corners{border-radius:var(--ck-border-radius);border-radius:calc(var(--ck-border-radius)*.5)}.ck.ck-button.ck-switchbutton .ck-button__toggle .ck-button__toggle__inner{background:var(--ck-color-switch-button-inner-background);height:var(--ck-switch-button-toggle-inner-size);transition:all .3s ease;width:var(--ck-switch-button-toggle-inner-size)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover{background:var(--ck-color-switch-button-off-hover-background)}.ck.ck-button.ck-switchbutton .ck-button__toggle:hover .ck-button__toggle__inner{box-shadow:var(--ck-switch-button-inner-hover-shadow)}.ck.ck-button.ck-switchbutton.ck-disabled .ck-button__toggle{opacity:var(--ck-disabled-opacity)}.ck.ck-button.ck-switchbutton:focus{border-color:transparent;box-shadow:none;outline:none}.ck.ck-button.ck-switchbutton:focus .ck-button__toggle{box-shadow:0 0 0 1px var(--ck-color-base-background),0 0 0 5px var(--ck-color-focus-outer-shadow);outline:var(--ck-focus-ring);outline-offset:1px}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle{background:var(--ck-color-switch-button-on-background)}.ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle:hover{background:var(--ck-color-switch-button-on-hover-background)}[dir=ltr] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(var( --ck-switch-button-translation ))}[dir=rtl] .ck.ck-button.ck-switchbutton.ck-on .ck-button__toggle .ck-button__toggle__inner{transform:translateX(calc(var( --ck-switch-button-translation )*-1))}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/button/switchbutton.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/button/switchbutton.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AASE,4HACC,aACD,CCCF,MAEC,8CAA+C,CAE/C,0DAAgE,CAChE,2HAIC,CACD,0FACD,CAOC,0QAEC,sBAAuB,CADvB,aAED,CAEA,0DAGE,4CAOF,CAVA,0DAQE,2CAEF,CAEA,iDCpCA,eD4EA,CAxCA,yIChCC,qCDwED,CAxCA,2DAKE,gBAmCF,CAxCA,2DAUE,iBA8BF,CAxCA,iDAkBC,uDAAwD,CAFxD,4BAA6B,CAD7B,iFAAsF,CAEtF,0CAuBD,CApBC,2ECxDD,eDmEC,CAXA,6LCpDA,qCAAsC,CDsDpC,8CASF,CAXA,2EAOC,yDAA0D,CAD1D,gDAAiD,CAIjD,uBAA0B,CAL1B,+CAMD,CAEA,uDACC,6DAKD,CAHC,iFACC,qDACD,CAIF,6DEhFA,kCFkFA,CAGA,oCACC,wBAAyB,CAEzB,eAAgB,CADhB,YAQD,CALC,uDACC,iGAAmG,CAEnG,4BAA6B,CAD7B,kBAED,CAKA,uDACC,sDAkBD,CAhBC,6DACC,4DACD,CAEA,2FAKE,2DAMF,CAXA,2FASE,oEAEF",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-button.ck-switchbutton {\n\t& .ck-button__toggle {\n\t\tdisplay: block;\n\n\t\t& .ck-button__toggle__inner {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n/* Note: To avoid rendering issues (aliasing) but to preserve the responsive nature\nof the component, floating–point numbers have been used which, for the default font size\n(see: --ck-font-size-base), will generate simple integers. */\n:root {\n\t/* 34px at 13px font-size */\n\t--ck-switch-button-toggle-width: 2.6153846154em;\n\t/* 14px at 13px font-size */\n\t--ck-switch-button-toggle-inner-size: calc(1.0769230769em + 1px);\n\t--ck-switch-button-translation: calc(\n\t\tvar(--ck-switch-button-toggle-width) -\n\t\tvar(--ck-switch-button-toggle-inner-size) -\n\t\t2px /* Border */\n\t);\n\t--ck-switch-button-inner-hover-shadow: 0 0 0 5px var(--ck-color-switch-button-inner-shadow);\n}\n\n.ck.ck-button.ck-switchbutton {\n\t/* Unlike a regular button, the switch button text color and background should never change.\n\t * Changing toggle switch (background, outline) is enough to carry the information about the\n\t * state of the entire component (https://github.com/ckeditor/ckeditor5/issues/12519)\n\t */\n\t&, &:hover, &:focus, &:active, &.ck-on:hover, &.ck-on:focus, &.ck-on:active {\n\t\tcolor: inherit;\n\t\tbackground: transparent;\n\t}\n\n\t& .ck-button__label {\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-right: calc(2 * var(--ck-spacing-large));\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Separate the label from the switch */\n\t\t\tmargin-left: calc(2 * var(--ck-spacing-large));\n\t\t}\n\t}\n\n\t& .ck-button__toggle {\n\t\t@mixin ck-rounded-corners;\n\n\t\t@mixin ck-dir ltr {\n\t\t\t/* Make sure the toggle is always to the right as far as possible. */\n\t\t\tmargin-left: auto;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t/* Make sure the toggle is always to the left as far as possible. */\n\t\t\tmargin-right: auto;\n\t\t}\n\n\t\t/* Apply some smooth transition to the box-shadow and border. */\n\t\t/* Gently animate the background color of the toggle switch */\n\t\ttransition: background 400ms ease, box-shadow .2s ease-in-out, outline .2s ease-in-out;\n\t\tborder: 1px solid transparent;\n\t\twidth: var(--ck-switch-button-toggle-width);\n\t\tbackground: var(--ck-color-switch-button-off-background);\n\n\t\t& .ck-button__toggle__inner {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-radius: calc(.5 * var(--ck-border-radius));\n\t\t\t}\n\n\t\t\twidth: var(--ck-switch-button-toggle-inner-size);\n\t\t\theight: var(--ck-switch-button-toggle-inner-size);\n\t\t\tbackground: var(--ck-color-switch-button-inner-background);\n\n\t\t\t/* Gently animate the inner part of the toggle switch */\n\t\t\ttransition: all 300ms ease;\n\t\t}\n\n\t\t&:hover {\n\t\t\tbackground: var(--ck-color-switch-button-off-hover-background);\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\tbox-shadow: var(--ck-switch-button-inner-hover-shadow);\n\t\t\t}\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-button__toggle {\n\t\t@mixin ck-disabled;\n\t}\n\n\t/* Overriding default .ck-button:focus styles + an outline around the toogle */\n\t&:focus {\n\t\tborder-color: transparent;\n\t\toutline: none;\n\t\tbox-shadow: none;\n\n\t\t& .ck-button__toggle {\n\t\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-background), 0 0 0 5px var(--ck-color-focus-outer-shadow);\n\t\t\toutline-offset: 1px;\n\t\t\toutline: var(--ck-focus-ring);\n\t\t}\n\t}\n\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-on {\n\t\t& .ck-button__toggle {\n\t\t\tbackground: var(--ck-color-switch-button-on-background);\n\n\t\t\t&:hover {\n\t\t\t\tbackground: var(--ck-color-switch-button-on-hover-background);\n\t\t\t}\n\n\t\t\t& .ck-button__toggle__inner {\n\t\t\t\t/*\n\t\t\t\t* Move the toggle switch to the right. It will be animated.\n\t\t\t\t*/\n\t\t\t\t@mixin ck-dir ltr {\n\t\t\t\t\ttransform: translateX( var( --ck-switch-button-translation ) );\n\t\t\t\t}\n\n\t\t\t\t@mixin ck-dir rtl {\n\t\t\t\t\ttransform: translateX( calc( -1 * var( --ck-switch-button-translation ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},25:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-collapsible.ck-collapsible_collapsed>.ck-collapsible__children{display:none}:root{--ck-collapsible-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-collapsible>.ck.ck-button{border-radius:0;color:inherit;font-weight:700;padding:var(--ck-list-button-padding);width:100%}.ck.ck-collapsible>.ck.ck-button:focus{background:transparent}.ck.ck-collapsible>.ck.ck-button:active,.ck.ck-collapsible>.ck.ck-button:hover:not(:focus),.ck.ck-collapsible>.ck.ck-button:not(:focus){background:transparent;border-color:transparent;box-shadow:none}.ck.ck-collapsible>.ck.ck-button>.ck-icon{margin-right:var(--ck-spacing-medium);width:var(--ck-collapsible-arrow-size)}.ck.ck-collapsible>.ck-collapsible__children{padding:var(--ck-spacing-medium) var(--ck-spacing-large) var(--ck-spacing-large)}.ck.ck-collapsible.ck-collapsible_collapsed>.ck.ck-button .ck-icon{transform:rotate(-90deg)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/collapsible/collapsible.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/collapsible/collapsible.css"],names:[],mappings:"AAMC,sEACC,YACD,CCHD,MACC,yDACD,CAGC,iCAIC,eAAgB,CAChB,aAAc,CAHd,eAAiB,CACjB,qCAAsC,CAFtC,UAoBD,CAdC,uCACC,sBACD,CAEA,wIACC,sBAAuB,CACvB,wBAAyB,CACzB,eACD,CAEA,0CACC,qCAAsC,CACtC,sCACD,CAGD,6CACC,gFACD,CAGC,mEACC,wBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-collapsible.ck-collapsible_collapsed {\n\t& > .ck-collapsible__children {\n\t\tdisplay: none;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-collapsible-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-collapsible {\n\t& > .ck.ck-button {\n\t\twidth: 100%;\n\t\tfont-weight: bold;\n\t\tpadding: var(--ck-list-button-padding);\n\t\tborder-radius: 0;\n\t\tcolor: inherit;\n\n\t\t&:focus {\n\t\t\tbackground: transparent;\n\t\t}\n\n\t\t&:active, &:not(:focus), &:hover:not(:focus) {\n\t\t\tbackground: transparent;\n\t\t\tborder-color: transparent;\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t& > .ck-icon {\n\t\t\tmargin-right: var(--ck-spacing-medium);\n\t\t\twidth: var(--ck-collapsible-arrow-size);\n\t\t}\n\t}\n\n\t& > .ck-collapsible__children {\n\t\tpadding: var(--ck-spacing-medium) var(--ck-spacing-large) var(--ck-spacing-large);\n\t}\n\n\t&.ck-collapsible_collapsed {\n\t\t& > .ck.ck-button .ck-icon {\n\t\t\ttransform: rotate(-90deg);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},7317:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-color-grid{display:grid}:root{--ck-color-grid-tile-size:24px;--ck-color-color-grid-check-icon:#166fd4}.ck.ck-color-grid{grid-gap:5px;padding:8px}.ck.ck-color-grid__tile{border:0;height:var(--ck-color-grid-tile-size);min-height:var(--ck-color-grid-tile-size);min-width:var(--ck-color-grid-tile-size);padding:0;transition:box-shadow .2s ease;width:var(--ck-color-grid-tile-size)}.ck.ck-color-grid__tile.ck-disabled{cursor:unset;transition:unset}.ck.ck-color-grid__tile.ck-color-selector__color-tile_bordered{box-shadow:0 0 0 1px var(--ck-color-base-border)}.ck.ck-color-grid__tile .ck.ck-icon{color:var(--ck-color-color-grid-check-icon);display:none}.ck.ck-color-grid__tile.ck-on{box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-base-text)}.ck.ck-color-grid__tile.ck-on .ck.ck-icon{display:block}.ck.ck-color-grid__tile.ck-on,.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){border:0}.ck.ck-color-grid__tile:focus:not(.ck-disabled),.ck.ck-color-grid__tile:hover:not(.ck-disabled){box-shadow:inset 0 0 0 1px var(--ck-color-base-background),0 0 0 2px var(--ck-color-focus-border)}.ck.ck-color-grid__label{padding:0 var(--ck-spacing-standard)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/colorgrid/colorgrid.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorgrid/colorgrid.css"],names:[],mappings:"AAKA,kBACC,YACD,CCAA,MACC,8BAA+B,CAK/B,wCACD,CAEA,kBACC,YAAa,CACb,WACD,CAEA,wBAOC,QAAS,CALT,qCAAsC,CAEtC,yCAA0C,CAD1C,wCAAyC,CAEzC,SAAU,CACV,8BAA+B,CAL/B,oCAyCD,CAjCC,oCACC,YAAa,CACb,gBACD,CAEA,+DACC,gDACD,CAEA,oCAEC,2CAA4C,CAD5C,YAED,CAEA,8BACC,8FAKD,CAHC,0CACC,aACD,CAGD,8HAIC,QACD,CAEA,gGAEC,iGACD,CAGD,yBACC,oCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-color-grid {\n\tdisplay: grid;\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-grid-tile-size: 24px;\n\n\t/* Not using global colors here because these may change but some colors in a pallette\n\t * require special treatment. For instance, this ensures no matter what the UI text color is,\n\t * the check icon will look good on the black color tile. */\n\t--ck-color-color-grid-check-icon: hsl(212, 81%, 46%);\n}\n\n.ck.ck-color-grid {\n\tgrid-gap: 5px;\n\tpadding: 8px;\n}\n\n.ck.ck-color-grid__tile {\n\twidth: var(--ck-color-grid-tile-size);\n\theight: var(--ck-color-grid-tile-size);\n\tmin-width: var(--ck-color-grid-tile-size);\n\tmin-height: var(--ck-color-grid-tile-size);\n\tpadding: 0;\n\ttransition: .2s ease box-shadow;\n\tborder: 0;\n\n\t&.ck-disabled {\n\t\tcursor: unset;\n\t\ttransition: unset;\n\t}\n\n\t&.ck-color-selector__color-tile_bordered {\n\t\tbox-shadow: 0 0 0 1px var(--ck-color-base-border);\n\t}\n\n\t& .ck.ck-icon {\n\t\tdisplay: none;\n\t\tcolor: var(--ck-color-color-grid-check-icon);\n\t}\n\n\t&.ck-on {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-base-text);\n\n\t\t& .ck.ck-icon {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t&.ck-on,\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\t/* Disable the default .ck-button\'s border ring. */\n\t\tborder: 0;\n\t}\n\n\t&:focus:not( .ck-disabled ),\n\t&:hover:not( .ck-disabled ) {\n\t\tbox-shadow: inset 0 0 0 1px var(--ck-color-base-background), 0 0 0 2px var(--ck-color-focus-border);\n\t}\n}\n\n.ck.ck-color-grid__label {\n\tpadding: 0 var(--ck-spacing-standard);\n}\n'],sourceRoot:""}]);const a=s},1905:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".color-picker-hex-input{width:max-content}.color-picker-hex-input .ck.ck-input{min-width:unset}.ck.ck-color-picker__row{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;margin:var(--ck-spacing-large) 0 0;width:unset}.ck.ck-color-picker__row .ck.ck-labeled-field-view{padding-top:unset}.ck.ck-color-picker__row .ck.ck-input-text{width:unset}.ck.ck-color-picker__row .ck-color-picker__hash-view{padding-right:var(--ck-spacing-medium);padding-top:var(--ck-spacing-tiny)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/colorpicker/colorpicker.css"],names:[],mappings:"AAKA,wBACC,iBAKD,CAHC,qCACC,eACD,CAGD,yBACC,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,6BAA8B,CAC9B,kCAAmC,CACnC,WAcD,CAZC,mDACC,iBACD,CAEA,2CACC,WACD,CAEA,qDAEC,sCAAuC,CADvC,kCAED",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.color-picker-hex-input {\n\twidth: max-content;\n\n\t& .ck.ck-input {\n\t\tmin-width: unset;\n\t}\n}\n\n.ck.ck-color-picker__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\tjustify-content: space-between;\n\tmargin: var(--ck-spacing-large) 0 0;\n\twidth: unset;\n\n\t& .ck.ck-labeled-field-view {\n\t\tpadding-top: unset;\n\t}\n\n\t& .ck.ck-input-text {\n\t\twidth: unset;\n\t}\n\n\t& .ck-color-picker__hash-view {\n\t\tpadding-top: var(--ck-spacing-tiny);\n\t\tpadding-right: var(--ck-spacing-medium);\n\t}\n}\n"],sourceRoot:""}]);const a=s},6309:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker,.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__remove-color{align-items:center;display:flex}[dir=rtl] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker,[dir=rtl] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__remove-color{justify-content:flex-start}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar{display:flex;flex-direction:row;justify-content:space-around}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar .ck-button-cancel,.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar .ck-button-save{flex:1}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker,.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__remove-color{width:100%}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:calc(var(--ck-spacing-standard)/2) var(--ck-spacing-standard)}.ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker:not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker .ck.ck-icon{margin-right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-color-selector .ck-color-grids-fragment .ck-button.ck-color-selector__color-picker .ck.ck-icon{margin-left:var(--ck-spacing-standard)}.ck.ck-color-selector .ck-color-grids-fragment label.ck.ck-color-grid__label{font-weight:unset}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker{padding:8px}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker{height:100px;min-width:180px}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(saturation){border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(hue){border-radius:0 0 var(--ck-border-radius) var(--ck-border-radius)}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(hue-pointer),.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-picker .hex-color-picker::part(saturation-pointer){height:15px;width:15px}.ck.ck-color-selector .ck-color-picker-fragment .ck.ck-color-selector_action-bar{padding:0 8px 8px}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/colorselector/colorselector.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/colorselector/colorselector.css"],names:[],mappings:"AAUE,oLAGC,kBAAmB,CADnB,YAMD,CARA,wMAME,0BAEF,CAKA,iFACC,YAAa,CACb,kBAAmB,CACnB,4BAMD,CAJC,oMAEC,MACD,CCrBD,oLAEC,UACD,CAEA,0FAEC,2BAA4B,CAC5B,4BAA6B,CAF7B,qEAiBD,CAbC,sGACC,gDACD,CAEA,gHAEE,uCAMF,CARA,gHAME,sCAEF,CAGD,6EACC,iBACD,CAKA,oEACC,WAoBD,CAlBC,sFACC,YAAa,CACb,eAeD,CAbC,wGACC,iEACD,CAEA,iGACC,iEACD,CAEA,yNAGC,WAAY,CADZ,UAED,CAIF,iFACC,iBACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-color-selector {\n\t/* View fragment with color grids. */\n\t& .ck-color-grids-fragment {\n\t\t& .ck-button.ck-color-selector__remove-color,\n\t\t& .ck-button.ck-color-selector__color-picker {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tjustify-content: flex-start;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* View fragment with a color picker. */\n\t& .ck-color-picker-fragment {\n\t\t& .ck.ck-color-selector_action-bar {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tjustify-content: space-around;\n\n\t\t\t& .ck-button-save,\n\t\t\t& .ck-button-cancel {\n\t\t\t\tflex: 1\n\t\t\t}\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-color-selector {\n\t/* View fragment with color grids. */\n\t& .ck-color-grids-fragment {\n\t\t& .ck-button.ck-color-selector__remove-color,\n\t\t& .ck-button.ck-color-selector__color-picker {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t& .ck-button.ck-color-selector__color-picker {\n\t\t\tpadding: calc(var(--ck-spacing-standard) / 2) var(--ck-spacing-standard);\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\n\t\t\t&:not(:focus) {\n\t\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t& .ck.ck-icon {\n\t\t\t\t@mixin ck-dir ltr {\n\t\t\t\t\tmargin-right: var(--ck-spacing-standard);\n\t\t\t\t}\n\n\t\t\t\t@mixin ck-dir rtl {\n\t\t\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& label.ck.ck-color-grid__label {\n\t\t\tfont-weight: unset;\n\t\t}\n\t}\n\n\t/* View fragment with a color picker. */\n\t& .ck-color-picker-fragment {\n\t\t& .ck.ck-color-picker {\n\t\t\tpadding: 8px;\n\n\t\t\t& .hex-color-picker {\n\t\t\t\theight: 100px;\n\t\t\t\tmin-width: 180px;\n\n\t\t\t\t&::part(saturation) {\n\t\t\t\t\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\n\t\t\t\t}\n\n\t\t\t\t&::part(hue) {\n\t\t\t\t\tborder-radius: 0 0 var(--ck-border-radius) var(--ck-border-radius);\n\t\t\t\t}\n\n\t\t\t\t&::part(saturation-pointer),\n\t\t\t\t&::part(hue-pointer) {\n\t\t\t\t\twidth: 15px;\n\t\t\t\t\theight: 15px;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t& .ck.ck-color-selector_action-bar {\n\t\t\tpadding: 0 8px 8px;\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},9819:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-dialog-overlay{bottom:0;left:0;overscroll-behavior:none;position:fixed;right:0;top:0;user-select:none}.ck.ck-dialog-overlay.ck-dialog-overlay__transparent{animation:none;background:none;pointer-events:none}.ck.ck-dialog{overscroll-behavior:none;position:absolute;width:fit-content}.ck.ck-dialog .ck.ck-form__header{flex-shrink:0}.ck.ck-dialog .ck.ck-form__header .ck-form__header__label{cursor:grab}.ck.ck-dialog-overlay.ck-dialog-overlay__transparent .ck.ck-dialog{pointer-events:all}:root{--ck-dialog-overlay-background-color:rgba(0,0,0,.5);--ck-dialog-drop-shadow:0px 0px 6px 2px rgba(0,0,0,.15);--ck-dialog-max-width:100vw;--ck-dialog-max-height:90vh;--ck-color-dialog-background:var(--ck-color-base-background);--ck-color-dialog-form-header-border:var(--ck-color-base-border)}.ck.ck-dialog-overlay{animation:ck-dialog-fade-in .3s;background:var(--ck-dialog-overlay-background-color);z-index:var(--ck-z-dialog)}.ck.ck-dialog{border-radius:0}.ck-rounded-corners .ck.ck-dialog,.ck.ck-dialog.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dialog{--ck-drop-shadow:var(--ck-dialog-drop-shadow);background:var(--ck-color-dialog-background);border:1px solid var(--ck-color-base-border);box-shadow:var(--ck-drop-shadow),0 0;max-height:var(--ck-dialog-max-height);max-width:var(--ck-dialog-max-width)}.ck.ck-dialog .ck.ck-form__header{border-bottom:1px solid var(--ck-color-dialog-form-header-border)}@keyframes ck-dialog-fade-in{0%{background:transparent}to{background:var(--ck-dialog-overlay-background-color)}}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dialog/dialog.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dialog/dialog.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,sBAKC,QAAS,CACT,MAAO,CAJP,wBAAyB,CAEzB,cAAe,CAGf,OAAQ,CACR,KAAM,CAPN,gBAcD,CALC,qDAEC,cAAe,CACf,eAAgB,CAFhB,mBAGD,CAGD,cACC,wBAAyB,CAEzB,iBAAkB,CADlB,iBAcD,CAXC,kCACC,aAKD,CAHC,0DACC,WACD,CAVF,mEAcE,kBAEF,CC7BA,MACC,mDAA2D,CAC3D,uDAA8D,CAC9D,2BAA4B,CAC5B,2BAA4B,CAC5B,4DAA6D,CAC7D,gEACD,CAEA,sBACC,+BAAgC,CAChC,oDAAqD,CACrD,0BACD,CAEA,cCbC,eD2BD,CAdA,mECTE,qCDuBF,CAdA,cAIC,6CAA8C,CAE9C,4CAA6C,CAG7C,4CAA6C,CExB7C,oCAA8B,CFsB9B,sCAAuC,CACvC,oCAMD,CAHC,kCACC,iEACD,CAGD,6BACC,GACC,sBACD,CAEA,GACC,oDACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-dialog-overlay {\n\tuser-select: none;\n\toverscroll-behavior: none;\n\n\tposition: fixed;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\n\t&.ck-dialog-overlay__transparent {\n\t\tpointer-events: none;\n\t\tanimation: none;\n\t\tbackground: none;\n\t}\n}\n\n.ck.ck-dialog {\n\toverscroll-behavior: none;\n\twidth: fit-content;\n\tposition: absolute;\n\n\t& .ck.ck-form__header {\n\t\tflex-shrink: 0;\n\n\t\t& .ck-form__header__label {\n\t\t\tcursor: grab;\n\t\t}\n\t}\n\n\t@nest .ck.ck-dialog-overlay.ck-dialog-overlay__transparent & {\n\t\tpointer-events: all;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n:root {\n\t--ck-dialog-overlay-background-color: hsla( 0, 0%, 0%, .5 );\n\t--ck-dialog-drop-shadow: 0px 0px 6px 2px hsl(0deg 0% 0% / 15%);\n\t--ck-dialog-max-width: 100vw;\n\t--ck-dialog-max-height: 90vh;\n\t--ck-color-dialog-background: var(--ck-color-base-background);\n\t--ck-color-dialog-form-header-border: var(--ck-color-base-border);\n}\n\n.ck.ck-dialog-overlay {\n\tanimation: ck-dialog-fade-in .3s;\n\tbackground: var(--ck-dialog-overlay-background-color);\n\tz-index: var(--ck-z-dialog);\n}\n\n.ck.ck-dialog {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\t--ck-drop-shadow: var(--ck-dialog-drop-shadow);\n\n\tbackground: var(--ck-color-dialog-background);\n\tmax-height: var(--ck-dialog-max-height);\n\tmax-width: var(--ck-dialog-max-width);\n\tborder: 1px solid var(--ck-color-base-border);\n\n\t& .ck.ck-form__header {\n\t\tborder-bottom: 1px solid var(--ck-color-dialog-form-header-border);\n\t}\n}\n\n@keyframes ck-dialog-fade-in {\n\t0% {\n\t\tbackground: hsla( 0, 0%, 0%, 0 );\n\t}\n\n\t100% {\n\t\tbackground: var(--ck-dialog-overlay-background-color);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},9822:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-dialog .ck.ck-dialog__actions{display:flex;justify-content:flex-end;padding:var(--ck-spacing-large)}.ck.ck-dialog .ck.ck-dialog__actions>*+*{margin-left:var(--ck-spacing-large)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dialog/dialogactions.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dialog/dialogactions.css"],names:[],mappings:"AAMC,qCACC,YAAa,CACb,wBAAyB,CCDzB,+BDED,CCAC,yCACC,mCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-dialog {\n\t& .ck.ck-dialog__actions {\n\t\tdisplay: flex;\n\t\tjustify-content: flex-end;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-dialog {\n\t& .ck.ck-dialog__actions {\n\t\tpadding: var(--ck-spacing-large);\n\n\t\t& > * + * {\n\t\t\tmargin-left: var(--ck-spacing-large);\n\t\t}\n\t}\n}\n"],sourceRoot:""}]);const a=s},8149:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-dropdown-max-width:75vw}.ck.ck-dropdown{display:inline-block;position:relative}.ck.ck-dropdown .ck-dropdown__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-dropdown .ck-button.ck-dropdown__button{width:100%}.ck.ck-dropdown .ck-dropdown__panel{display:none;max-width:var(--ck-dropdown-max-width);position:absolute;z-index:var(--ck-z-panel)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel-visible{display:inline-block}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw{bottom:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{bottom:auto;top:100%}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_ne,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se{left:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{right:0}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_n,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_s{left:50%;transform:translateX(-50%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nmw,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_smw{left:75%;transform:translateX(-75%)}.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_nme,.ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sme{left:25%;transform:translateX(-25%)}.ck.ck-toolbar .ck-dropdown__panel{z-index:calc(var(--ck-z-panel) + 1)}:root{--ck-dropdown-arrow-size:calc(var(--ck-icon-size)*0.5)}.ck.ck-dropdown{font-size:inherit}.ck.ck-dropdown .ck-dropdown__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-dropdown .ck-dropdown__arrow{margin-left:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-dropdown .ck-dropdown__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}.ck.ck-dropdown.ck-disabled .ck-dropdown__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-dropdown .ck-button.ck-dropdown__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-dropdown .ck-button.ck-dropdown__button .ck-button__label{overflow:hidden;text-overflow:ellipsis;width:7em}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-disabled .ck-button__label{opacity:var(--ck-disabled-opacity)}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-dropdown__button_label-width_auto .ck-button__label{width:auto}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active{box-shadow:none}.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-off:active:focus,.ck.ck-dropdown .ck-button.ck-dropdown__button.ck-on:active:focus{box-shadow:var(--ck-focus-outer-shadow),0 0}.ck.ck-dropdown__panel{border-radius:0}.ck-rounded-corners .ck.ck-dropdown__panel,.ck.ck-dropdown__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-dropdown__panel{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;box-shadow:var(--ck-drop-shadow),0 0;min-width:100%}.ck.ck-dropdown__panel.ck-dropdown__panel_se{border-top-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_sw{border-top-right-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_ne{border-bottom-left-radius:0}.ck.ck-dropdown__panel.ck-dropdown__panel_nw{border-bottom-right-radius:0}.ck.ck-dropdown__panel:focus{outline:none}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dropdown/dropdown.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/dropdown.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,MACC,4BACD,CAEA,gBACC,oBAAqB,CACrB,iBA2ED,CAzEC,oCACC,mBAAoB,CACpB,2BACD,CAGA,+CACC,UACD,CAEA,oCACC,YAAa,CAEb,sCAAuC,CAEvC,iBAAkB,CAHlB,yBA4DD,CAvDC,+DACC,oBACD,CAEA,mSAKC,WACD,CAEA,mSAUC,WAAY,CADZ,QAED,CAEA,oHAEC,MACD,CAEA,oHAEC,OACD,CAEA,kHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAEA,sHAGC,QAAS,CACT,0BACD,CAQF,mCACC,mCACD,CCpFA,MACC,sDACD,CAEA,gBAEC,iBA2ED,CAzEC,oCACC,mCACD,CAGC,8CAIC,sCAAuC,CAHvC,gCAID,CAIA,8CACC,+BAAgC,CAGhC,oCACD,CAGD,gDC/BA,kCDiCA,CAIE,mFAEC,oCACD,CAIA,mFAEC,qCACD,CAID,iEAEC,eAAgB,CAChB,sBAAuB,CAFvB,SAGD,CAGA,6EC1DD,kCD4DC,CAGA,qDACC,2BAA4B,CAC5B,4BACD,CAEA,sGACC,UACD,CAGA,yHAEC,eAKD,CAHC,qIE7EF,2CF+EE,CAKH,uBGlFC,eHkHD,CAhCA,qFG9EE,qCH8GF,CAhCA,uBAIC,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CE1FT,oCAA8B,CF6F9B,cAuBD,CAnBC,6CACC,wBACD,CAEA,6CACC,yBACD,CAEA,6CACC,2BACD,CAEA,6CACC,4BACD,CAEA,6BACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-dropdown-max-width: 75vw;\n}\n\n.ck.ck-dropdown {\n\tdisplay: inline-block;\n\tposition: relative;\n\n\t& .ck-dropdown__arrow {\n\t\tpointer-events: none;\n\t\tz-index: var(--ck-z-default);\n\t}\n\n\t/* Dropdown button should span horizontally, e.g. in vertical toolbars */\n\t& .ck-button.ck-dropdown__button {\n\t\twidth: 100%;\n\t}\n\n\t& .ck-dropdown__panel {\n\t\tdisplay: none;\n\t\tz-index: var(--ck-z-panel);\n\t\tmax-width: var(--ck-dropdown-max-width);\n\n\t\tposition: absolute;\n\n\t\t&.ck-dropdown__panel-visible {\n\t\t\tdisplay: inline-block;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_n,\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_nme {\n\t\t\tbottom: 100%;\n\t\t}\n\n\t\t&.ck-dropdown__panel_se,\n\t\t&.ck-dropdown__panel_sw,\n\t\t&.ck-dropdown__panel_smw,\n\t\t&.ck-dropdown__panel_sme,\n\t\t&.ck-dropdown__panel_s {\n\t\t\t/*\n\t\t\t * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays.\n\t\t\t * See https://github.com/ckeditor/ckeditor5/issues/1053.\n\t\t\t */\n\t\t\ttop: 100%;\n\t\t\tbottom: auto;\n\t\t}\n\n\t\t&.ck-dropdown__panel_ne,\n\t\t&.ck-dropdown__panel_se {\n\t\t\tleft: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_nw,\n\t\t&.ck-dropdown__panel_sw {\n\t\t\tright: 0px;\n\t\t}\n\n\t\t&.ck-dropdown__panel_s,\n\t\t&.ck-dropdown__panel_n {\n\t\t\t/* Positioning panels relative to the center of the button */\n\t\t\tleft: 50%;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nmw,\n\t\t&.ck-dropdown__panel_smw {\n\t\t\t/* Positioning panels relative to the middle-west of the button */\n\t\t\tleft: 75%;\n\t\t\ttransform: translateX(-75%);\n\t\t}\n\n\t\t&.ck-dropdown__panel_nme,\n\t\t&.ck-dropdown__panel_sme {\n\t\t\t/* Positioning panels relative to the middle-east of the button */\n\t\t\tleft: 25%;\n\t\t\ttransform: translateX(-25%);\n\t\t}\n\t}\n}\n\n/*\n * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content.\n * See https://github.com/ckeditor/ckeditor5/issues/7874\n */\n.ck.ck-toolbar .ck-dropdown__panel {\n\tz-index: calc( var(--ck-z-panel) + 1 );\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-dropdown-arrow-size: calc(0.5 * var(--ck-icon-size));\n}\n\n.ck.ck-dropdown {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-dropdown__arrow {\n\t\twidth: var(--ck-dropdown-arrow-size);\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& .ck-dropdown__arrow {\n\t\t\tright: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& .ck-dropdown__arrow {\n\t\t\tleft: var(--ck-spacing-standard);\n\n\t\t\t/* A space to accommodate the triangle. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\t}\n\n\t&.ck-disabled .ck-dropdown__arrow {\n\t\t@mixin ck-disabled;\n\t}\n\n\t& .ck-button.ck-dropdown__button {\n\t\t@mixin ck-dir ltr {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\t/* Make sure dropdowns with just an icon have the right inner spacing */\n\t\t\t\tpadding-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t/* #23 */\n\t\t& .ck-button__label {\n\t\t\twidth: 7em;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/70 */\n\t\t&.ck-disabled .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/816 */\n\t\t&.ck-on {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t&.ck-dropdown__button_label-width_auto .ck-button__label {\n\t\t\twidth: auto;\n\t\t}\n\n\t\t/* https://github.com/ckeditor/ckeditor5/issues/8699 */\n\t\t&.ck-off:active,\n\t\t&.ck-on:active {\n\t\t\tbox-shadow: none;\n\n\t\t\t&:focus {\n\t\t\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-dropdown__panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tbackground: var(--ck-color-dropdown-panel-background);\n\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\tbottom: 0;\n\n\t/* Make sure the panel is at least as wide as the drop-down\'s button. */\n\tmin-width: 100%;\n\n\t/* Disabled corner border radius to be consistent with the .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-dropdown__panel_se {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_sw {\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_ne {\n\t\tborder-bottom-left-radius: 0;\n\t}\n\n\t&.ck-dropdown__panel_nw {\n\t\tborder-bottom-right-radius: 0;\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3629:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-dropdown>.ck-dropdown__panel>.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-dropdown>.ck-dropdown__panel>.ck-list,.ck.ck-dropdown>.ck-dropdown__panel>.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0}.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:first-child>.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:first-child>.ck-button,.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:first-child>.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:0}.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:last-child>.ck-button{border-radius:0}.ck-rounded-corners .ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:last-child>.ck-button,.ck.ck-dropdown>.ck-dropdown__panel>.ck-list .ck-list__item:last-child>.ck-button.ck-rounded-corners{border-radius:var(--ck-border-radius);border-top-left-radius:0;border-top-right-radius:0}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/listdropdown.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,6CCIC,eDqBD,CAzBA,iICQE,qCAAsC,CDJtC,wBAqBF,CAfE,mFCND,eDYC,CANA,6MCFA,qCAAsC,CDKpC,2BAA4B,CAC5B,4BAA6B,CAF7B,wBAIF,CAEA,kFCdD,eDmBC,CALA,2MCVA,qCAAsC,CDYpC,wBAAyB,CACzB,yBAEF",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-dropdown > .ck-dropdown__panel > .ck-list {\n\t/* Disabled radius of top-left border to be consistent with .dropdown__button\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t@mixin ck-rounded-corners {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t/* Make sure the button belonging to the first/last child of the list goes well with the\n\tborder radius of the entire panel. */\n\t& .ck-list__item {\n\t\t&:first-child > .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\n\t\t&:last-child > .ck-button {\n\t\t\t@mixin ck-rounded-corners {\n\t\t\t\tborder-top-left-radius: 0;\n\t\t\t\tborder-top-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},1792:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck.ck-splitbutton{font-size:inherit}.ck.ck-splitbutton .ck-splitbutton__action:focus{z-index:calc(var(--ck-z-default) + 1)}:root{--ck-color-split-button-hover-background:#ebebeb;--ck-color-split-button-hover-border:#b3b3b3}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-right-radius:unset;border-top-right-radius:unset}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__action{border-bottom-left-radius:unset;border-top-left-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow{min-width:unset}[dir=ltr] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-left-radius:unset;border-top-left-radius:unset}[dir=rtl] .ck.ck-splitbutton>.ck-splitbutton__arrow{border-bottom-right-radius:unset;border-top-right-radius:unset}.ck.ck-splitbutton>.ck-splitbutton__arrow svg{width:var(--ck-dropdown-arrow-size)}.ck.ck-splitbutton>.ck-splitbutton__arrow:not(:focus){border-bottom-width:0;border-top-width:0}.ck.ck-splitbutton.ck-splitbutton_open>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover),.ck.ck-splitbutton:hover>.ck-button:not(.ck-on):not(.ck-disabled):not(:hover){background:var(--ck-color-split-button-hover-background)}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{background-color:var(--ck-color-split-button-hover-border);content:"";height:100%;position:absolute;width:1px}.ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:focus:after,.ck.ck-splitbutton:hover>.ck-splitbutton__arrow:focus:after{--ck-color-split-button-hover-border:var(--ck-color-focus-border)}[dir=ltr] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=ltr] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{left:-1px}[dir=rtl] .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow:not(.ck-disabled):after,[dir=rtl] .ck.ck-splitbutton:hover>.ck-splitbutton__arrow:not(.ck-disabled):after{right:-1px}.ck.ck-splitbutton.ck-splitbutton_open{border-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__action,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__action{border-bottom-left-radius:0}.ck-rounded-corners .ck.ck-splitbutton.ck-splitbutton_open>.ck-splitbutton__arrow,.ck.ck-splitbutton.ck-splitbutton_open.ck-rounded-corners>.ck-splitbutton__arrow{border-bottom-right-radius:0}',"",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dropdown/splitbutton.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/splitbutton.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAKA,mBAEC,iBAKD,CAHC,iDACC,qCACD,CCJD,MACC,gDAAyD,CACzD,4CACD,CAMC,oIAKE,gCAAiC,CADjC,6BASF,CAbA,oIAWE,+BAAgC,CADhC,4BAGF,CAEA,0CAGC,eAiBD,CApBA,oDAQE,+BAAgC,CADhC,4BAaF,CApBA,oDAcE,gCAAiC,CADjC,6BAOF,CAHC,8CACC,mCACD,CAKD,sDAEC,qBAAwB,CADxB,kBAED,CAQC,0KACC,wDACD,CAIA,8JAKC,0DAA2D,CAJ3D,UAAW,CAGX,WAAY,CAFZ,iBAAkB,CAClB,SAGD,CAGA,sIACC,iEACD,CAGC,kLACC,SACD,CAIA,kLACC,UACD,CAMF,uCCzFA,eDmGA,CAVA,qHCrFC,qCD+FD,CARE,qKACC,2BACD,CAEA,mKACC,4BACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-splitbutton {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t& .ck-splitbutton__action:focus {\n\t\tz-index: calc(var(--ck-z-default) + 1);\n\t}\n}\n\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-color-split-button-hover-background: hsl(0, 0%, 92%);\n\t--ck-color-split-button-hover-border: hsl(0, 0%, 70%);\n}\n\n.ck.ck-splitbutton {\n\t/*\n\t * Note: ck-rounded and ck-dir mixins don\'t go together (because they both use @nest).\n\t */\n\t&:hover > .ck-splitbutton__action,\n\t&.ck-splitbutton_open > .ck-splitbutton__action {\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the action button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the action button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\t}\n\n\t& > .ck-splitbutton__arrow {\n\t\t/* It\'s a text-less button and since the icon is positioned absolutely in such situation,\n\t\tit must get some arbitrary min-width. */\n\t\tmin-width: unset;\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t/* Don\'t round the arrow button on the left side */\n\t\t\tborder-top-left-radius: unset;\n\t\t\tborder-bottom-left-radius: unset;\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t/* Don\'t round the arrow button on the right side */\n\t\t\tborder-top-right-radius: unset;\n\t\t\tborder-bottom-right-radius: unset;\n\t\t}\n\n\t\t& svg {\n\t\t\twidth: var(--ck-dropdown-arrow-size);\n\t\t}\n\t}\n\n\t/* Make sure the divider stretches 100% height of the button\n\thttps://github.com/ckeditor/ckeditor5/issues/10936 */\n\t& > .ck-splitbutton__arrow:not(:focus) {\n\t\tborder-top-width: 0px;\n\t\tborder-bottom-width: 0px;\n\t}\n\n\t/* When the split button is "open" (the arrow is on) or being hovered, it should get some styling\n\tas a whole. The background of both buttons should stand out and there should be a visual\n\tseparation between both buttons. */\n\t&.ck-splitbutton_open,\n\t&:hover {\n\t\t/* When the split button hovered as a whole, not as individual buttons. */\n\t\t& > .ck-button:not(.ck-on):not(.ck-disabled):not(:hover) {\n\t\t\tbackground: var(--ck-color-split-button-hover-background);\n\t\t}\n\n\t\t/* Splitbutton separator needs to be set with the ::after pseudoselector\n\t\tto display properly the borders on focus */\n\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\tcontent: \'\';\n\t\t\tposition: absolute;\n\t\t\twidth: 1px;\n\t\t\theight: 100%;\n\t\t\tbackground-color: var(--ck-color-split-button-hover-border);\n\t\t}\n\n\t\t/* Make sure the divider between the buttons looks fine when the button is focused */\n\t\t& > .ck-splitbutton__arrow:focus::after {\n\t\t\t--ck-color-split-button-hover-border: var(--ck-color-focus-border);\n\t\t}\n\n\t\t@nest [dir="ltr"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\t\tleft: -1px;\n\t\t\t}\n\t\t}\n\n\t\t@nest [dir="rtl"] & {\n\t\t\t& > .ck-splitbutton__arrow:not(.ck-disabled)::after {\n\t\t\t\tright: -1px;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Don\'t round the bottom left and right corners of the buttons when "open"\n\thttps://github.com/ckeditor/ckeditor5/issues/816 */\n\t&.ck-splitbutton_open {\n\t\t@mixin ck-rounded-corners {\n\t\t\t& > .ck-splitbutton__action {\n\t\t\t\tborder-bottom-left-radius: 0;\n\t\t\t}\n\n\t\t\t& > .ck-splitbutton__arrow {\n\t\t\t\tborder-bottom-right-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},1666:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-toolbar-dropdown-max-width:60vw}.ck.ck-toolbar-dropdown>.ck-dropdown__panel{max-width:var(--ck-toolbar-dropdown-max-width);width:max-content}.ck.ck-toolbar-dropdown>.ck-dropdown__panel .ck-button:focus{z-index:calc(var(--ck-z-default) + 1)}.ck.ck-toolbar-dropdown .ck-toolbar{border:0}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/dropdown/toolbardropdown.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/dropdown/toolbardropdown.css"],names:[],mappings:"AAKA,MACC,oCACD,CAEA,4CAGC,8CAA+C,CAD/C,iBAQD,CAJE,6DACC,qCACD,CCZF,oCACC,QACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-dropdown-max-width: 60vw;\n}\n\n.ck.ck-toolbar-dropdown > .ck-dropdown__panel {\n\t/* https://github.com/ckeditor/ckeditor5/issues/5586 */\n\twidth: max-content;\n\tmax-width: var(--ck-toolbar-dropdown-max-width);\n\n\t& .ck-button {\n\t\t&:focus {\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-toolbar-dropdown .ck-toolbar {\n\tborder: 0;\n}\n"],sourceRoot:""}]);const a=s},8527:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-accessibility-help-dialog-max-width:600px;--ck-accessibility-help-dialog-max-height:400px;--ck-accessibility-help-dialog-border-color:#ccced1;--ck-accessibility-help-dialog-code-background-color:#ededed;--ck-accessibility-help-dialog-kbd-shadow-color:#9c9c9c}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content{border:1px solid transparent;max-height:var(--ck-accessibility-help-dialog-max-height);max-width:var(--ck-accessibility-help-dialog-max-width);overflow:auto;padding:var(--ck-spacing-large);user-select:text}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content{*{white-space:normal}}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content .ck-label{display:none}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content h3{font-size:1.2em;font-weight:700}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content h4{font-size:1em;font-weight:700}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content h3,.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content h4,.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content p,.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content table{margin:1em 0}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content dl{border-bottom:none;border-top:1px solid var(--ck-accessibility-help-dialog-border-color);display:grid;grid-template-columns:2fr 1fr}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content dl dd,.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content dl dt{border-bottom:1px solid var(--ck-accessibility-help-dialog-border-color);padding:.4em 0}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content dl dt{grid-column-start:1}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content dl dd{grid-column-start:2;text-align:right}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content code,.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content kbd{background:var(--ck-accessibility-help-dialog-code-background-color);border-radius:2px;display:inline-block;font-size:.9em;line-height:1;padding:.4em;text-align:center;vertical-align:middle}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content code{font-family:monospace}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content kbd{box-shadow:0 1px 1px var(--ck-accessibility-help-dialog-kbd-shadow-color);margin:0 1px;min-width:1.8em}.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content kbd+kbd{margin-left:2px}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/accessibilityhelp.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAQA,MACC,8CAA+C,CAC/C,+CAAgD,CAChD,mDAA8D,CAC9D,4DAAyE,CACzE,uDACD,CAEA,wEAOC,4BAA6B,CAJ7B,yDAA0D,CAD1D,uDAAwD,CAExD,aAAc,CAHd,+BAAgC,CAIhC,gBAgFD,CA5EC,8ECdA,2BAA2B,CCF3B,2CAA8B,CDC9B,YDkBA,CAZD,wEAcC,EACC,kBACD,CAqED,CAlEC,kFACC,YACD,CAEA,2EAEC,eAAgB,CADhB,eAED,CAEA,2EAEC,aAAc,CADd,eAED,CAEA,8SAIC,YACD,CAEA,2EAIC,kBAAmB,CADnB,qEAAsE,CAFtE,YAAa,CACb,6BAiBD,CAbC,4JACC,wEAAyE,CACzE,cACD,CAEA,8EACC,mBACD,CAEA,8EACC,mBAAoB,CACpB,gBACD,CAGD,yJAEC,oEAAqE,CAIrE,iBAAkB,CALlB,oBAAqB,CAOrB,cAAe,CAHf,aAAc,CAFd,YAAa,CAIb,iBAAkB,CAHlB,qBAKD,CAEA,6EACC,qBACD,CAEA,4EAEC,yEAA4E,CAC5E,YAAa,CAFb,eAOD,CAHC,gFACC,eACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-accessibility-help-dialog-max-width: 600px;\n\t--ck-accessibility-help-dialog-max-height: 400px;\n\t--ck-accessibility-help-dialog-border-color: hsl(220, 6%, 81%);\n\t--ck-accessibility-help-dialog-code-background-color: hsl(0deg 0% 92.94%);\n\t--ck-accessibility-help-dialog-kbd-shadow-color: hsl(0deg 0% 61%);\n}\n\n.ck.ck-accessibility-help-dialog .ck-accessibility-help-dialog__content {\n\tpadding: var(--ck-spacing-large);\n\tmax-width: var(--ck-accessibility-help-dialog-max-width);\n\tmax-height: var(--ck-accessibility-help-dialog-max-height);\n\toverflow: auto;\n\tuser-select: text;\n\n\tborder: 1px solid transparent;\n\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t* {\n\t\twhite-space: normal;\n\t}\n\n\t/* Hide the main label of the content container. */\n\t& .ck-label {\n\t\tdisplay: none;\n\t}\n\n\t& h3 {\n\t\tfont-weight: bold;\n\t\tfont-size: 1.2em;\n\t}\n\n\t& h4 {\n\t\tfont-weight: bold;\n\t\tfont-size: 1em;\n\t}\n\n\t& p,\n\t& h3,\n\t& h4,\n\t& table {\n\t\tmargin: 1em 0;\n\t}\n\n\t& dl {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 2fr 1fr;\n\t\tborder-top: 1px solid var(--ck-accessibility-help-dialog-border-color);\n\t\tborder-bottom: none;\n\n\t\t& dt, & dd {\n\t\t\tborder-bottom: 1px solid var(--ck-accessibility-help-dialog-border-color);\n\t\t\tpadding: .4em 0;\n\t\t}\n\n\t\t& dt {\n\t\t\tgrid-column-start: 1;\n\t\t}\n\n\t\t& dd {\n\t\t\tgrid-column-start: 2;\n\t\t\ttext-align: right;\n\t\t}\n\t}\n\n\t& kbd, & code {\n\t\tdisplay: inline-block;\n\t\tbackground: var(--ck-accessibility-help-dialog-code-background-color);\n\t\tpadding: .4em;\n\t\tvertical-align: middle;\n\t\tline-height: 1;\n\t\tborder-radius: 2px;\n\t\ttext-align: center;\n\t\tfont-size: .9em;\n\t}\n\n\t& code {\n\t\tfont-family: monospace;\n\t}\n\n\t& kbd {\n\t\tmin-width: 1.8em;\n\t\tbox-shadow: 0px 1px 1px var(--ck-accessibility-help-dialog-kbd-shadow-color);\n\t\tmargin: 0 1px;\n\n\t\t& + kbd {\n\t\t\tmargin-left: 2px;\n\t\t}\n\t}\n}\n\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},1185:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-editable-blur-selection:#d9d9d9}.ck.ck-editor__editable:not(.ck-editor__nested-editable){border-radius:0}.ck-rounded-corners .ck.ck-editor__editable:not(.ck-editor__nested-editable),.ck.ck-editor__editable.ck-rounded-corners:not(.ck-editor__nested-editable){border-radius:var(--ck-border-radius)}.ck.ck-editor__editable.ck-focused:not(.ck-editor__nested-editable){border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck.ck-editor__editable_inline{border:1px solid transparent;overflow:auto;padding:0 var(--ck-spacing-standard)}.ck.ck-editor__editable_inline[dir=ltr]{text-align:left}.ck.ck-editor__editable_inline[dir=rtl]{text-align:right}.ck.ck-editor__editable_inline>:first-child{margin-top:var(--ck-spacing-large)}.ck.ck-editor__editable_inline>:last-child{margin-bottom:var(--ck-spacing-large)}.ck.ck-editor__editable_inline.ck-blurred ::selection{background:var(--ck-color-editable-blur-selection)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_n]:after{border-bottom-color:var(--ck-color-panel-background)}.ck.ck-balloon-panel.ck-toolbar-container[class*=arrow_s]:after{border-top-color:var(--ck-color-panel-background)}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/editorui/editorui.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAWA,MACC,0CACD,CAEA,yDCJC,eDWD,CAPA,yJCAE,qCDOF,CAJC,oEEPA,2BAA2B,CCF3B,qCAA8B,CDC9B,YFWA,CAGD,+BAGC,4BAA6B,CAF7B,aAAc,CACd,oCA6BD,CA1BC,wCACC,eACD,CAEA,wCACC,gBACD,CAGA,4CACC,kCACD,CAGA,2CAKC,qCACD,CAGA,sDACC,kDACD,CAKA,gEACC,oDACD,CAIA,gEACC,iDACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_shadow.css";\n@import "../../../mixins/_focus.css";\n@import "../../mixins/_button.css";\n\n:root {\n\t--ck-color-editable-blur-selection: hsl(0, 0%, 85%);\n}\n\n.ck.ck-editor__editable:not(.ck-editor__nested-editable) {\n\t@mixin ck-rounded-corners;\n\n\t&.ck-focused {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\t}\n}\n\n.ck.ck-editor__editable_inline {\n\toverflow: auto;\n\tpadding: 0 var(--ck-spacing-standard);\n\tborder: 1px solid transparent;\n\n\t&[dir="ltr"] {\n\t\ttext-align: left;\n\t}\n\n\t&[dir="rtl"] {\n\t\ttext-align: right;\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/116 */\n\t& > *:first-child {\n\t\tmargin-top: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/847 */\n\t& > *:last-child {\n\t\t/*\n\t\t * This value should match with the default margins of the block elements (like .media or .image)\n\t\t * to avoid a content jumping when the fake selection container shows up (See https://github.com/ckeditor/ckeditor5/issues/9825).\n\t\t */\n\t\tmargin-bottom: var(--ck-spacing-large);\n\t}\n\n\t/* https://github.com/ckeditor/ckeditor5/issues/6517 */\n\t&.ck-blurred ::selection {\n\t\tbackground: var(--ck-color-editable-blur-selection);\n\t}\n}\n\n/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/111 */\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_n"] {\n\t&::after {\n\t\tborder-bottom-color: var(--ck-color-panel-background);\n\t}\n}\n\n.ck.ck-balloon-panel.ck-toolbar-container[class*="arrow_s"] {\n\t&::after {\n\t\tborder-top-color: var(--ck-color-panel-background);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},7913:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-form__header{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between}.ck.ck-form__header h2.ck-form__header__label{flex-grow:1}:root{--ck-form-header-height:44px}.ck.ck-form__header{border-bottom:1px solid var(--ck-color-base-border);height:var(--ck-form-header-height);line-height:var(--ck-form-header-height);padding:var(--ck-spacing-small) var(--ck-spacing-large)}[dir=ltr] .ck.ck-form__header>.ck-icon{margin-right:var(--ck-spacing-medium)}[dir=rtl] .ck.ck-form__header>.ck-icon{margin-left:var(--ck-spacing-medium)}.ck.ck-form__header .ck-form__header__label{--ck-font-size-base:15px;font-weight:700}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/formheader/formheader.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/formheader/formheader.css"],names:[],mappings:"AAKA,oBAIC,kBAAmB,CAHnB,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CAEjB,6BAKD,CAHC,8CACC,WACD,CCPD,MACC,4BACD,CAEA,oBAIC,mDAAoD,CAFpD,mCAAoC,CACpC,wCAAyC,CAFzC,uDAmBD,CAdC,uCAEE,qCAMF,CARA,uCAME,oCAEF,CAEA,4CACC,wBAAyB,CACzB,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-form__header {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\talign-items: center;\n\tjustify-content: space-between;\n\n\t& h2.ck-form__header__label {\n\t\tflex-grow: 1;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-form-header-height: 44px;\n}\n\n.ck.ck-form__header {\n\tpadding: var(--ck-spacing-small) var(--ck-spacing-large);\n\theight: var(--ck-form-header-height);\n\tline-height: var(--ck-form-header-height);\n\tborder-bottom: 1px solid var(--ck-color-base-border);\n\n\t& > .ck-icon {\n\t\t@mixin ck-dir ltr {\n\t\t\tmargin-right: var(--ck-spacing-medium);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\tmargin-left: var(--ck-spacing-medium);\n\t\t}\n\t}\n\n\t& .ck-form__header__label {\n\t\t--ck-font-size-base: 15px;\n\t\tfont-weight: bold;\n\t}\n}\n'],sourceRoot:""}]);const a=s},9529:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-highlighted-text mark{background:var(--ck-color-highlight-background);font-size:inherit;font-weight:inherit;line-height:inherit;vertical-align:initial}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/highlightedtext/highlightedtext.css"],names:[],mappings:"AAKA,6BACC,+CAAgD,CAIhD,iBAAkB,CAFlB,mBAAoB,CACpB,mBAAoB,CAFpB,sBAID",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-highlighted-text mark {\n\tbackground: var(--ck-color-highlight-background);\n\tvertical-align: initial;\n\tfont-weight: inherit;\n\tline-height: inherit;\n\tfont-size: inherit;\n}\n"],sourceRoot:""}]);const a=s},7621:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-icon{vertical-align:middle}:root{--ck-icon-size:calc(var(--ck-line-height-base)*var(--ck-font-size-normal))}.ck.ck-icon{font-size:.8333350694em;height:var(--ck-icon-size);width:var(--ck-icon-size);will-change:transform}.ck.ck-icon,.ck.ck-icon *{cursor:inherit}.ck.ck-icon.ck-icon_inherit-color,.ck.ck-icon.ck-icon_inherit-color *{color:inherit}.ck.ck-icon.ck-icon_inherit-color :not([fill]){fill:currentColor}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/icon/icon.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/icon/icon.css"],names:[],mappings:"AAKA,YACC,qBACD,CCFA,MACC,0EACD,CAEA,YAKC,uBAAwB,CAHxB,0BAA2B,CAD3B,yBAA0B,CAU1B,qBAoBD,CAlBC,0BALA,cAQA,CAMC,sEACC,aAMD,CAJC,+CAEC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-icon {\n\tvertical-align: middle;\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-icon-size: calc(var(--ck-line-height-base) * var(--ck-font-size-normal));\n}\n\n.ck.ck-icon {\n\twidth: var(--ck-icon-size);\n\theight: var(--ck-icon-size);\n\n\t/* Multiplied by the height of the line in "px" should give SVG "viewport" dimensions */\n\tfont-size: .8333350694em;\n\n\t/* Inherit cursor style (#5). */\n\tcursor: inherit;\n\n\t/* This will prevent blurry icons on Firefox. See #340. */\n\twill-change: transform;\n\n\t& * {\n\t\t/* Inherit cursor style (#5). */\n\t\tcursor: inherit;\n\t}\n\n\t/* Allows dynamic coloring of an icon by inheriting its color from the parent. */\n\t&.ck-icon_inherit-color {\n\t\tcolor: inherit;\n\n\t\t& * {\n\t\t\tcolor: inherit;\n\n\t\t\t&:not([fill]) {\n\t\t\t\t/* Needed by FF. */\n\t\t\t\tfill: currentColor;\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},253:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-input-width:18em;--ck-input-text-width:var(--ck-input-width)}.ck.ck-input{border-radius:0}.ck-rounded-corners .ck.ck-input,.ck.ck-input.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-input{background:var(--ck-color-input-background);border:1px solid var(--ck-color-input-border);min-height:var(--ck-ui-component-min-height);min-width:var(--ck-input-width);padding:var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);transition:box-shadow .1s ease-in-out,border .1s ease-in-out}.ck.ck-input:focus{border:var(--ck-focus-ring);box-shadow:var(--ck-focus-outer-shadow),0 0;outline:none}.ck.ck-input[readonly]{background:var(--ck-color-input-disabled-background);border:1px solid var(--ck-color-input-disabled-border);color:var(--ck-color-input-disabled-text)}.ck.ck-input[readonly]:focus{box-shadow:var(--ck-focus-disabled-outer-shadow),0 0}.ck.ck-input.ck-error{animation:ck-input-shake .3s ease both;border-color:var(--ck-color-input-error-border)}.ck.ck-input.ck-error:focus{box-shadow:var(--ck-focus-error-outer-shadow),0 0}@keyframes ck-input-shake{20%{transform:translateX(-2px)}40%{transform:translateX(2px)}60%{transform:translateX(-1px)}80%{transform:translateX(1px)}}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/input/input.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AASA,MACC,qBAAsB,CAGtB,2CACD,CAEA,aCLC,eD2CD,CAtCA,iECDE,qCDuCF,CAtCA,aAGC,2CAA4C,CAC5C,6CAA8C,CAK9C,4CAA6C,CAH7C,+BAAgC,CADhC,6DAA8D,CAO9D,4DA0BD,CAxBC,mBEnBA,2BAA2B,CCF3B,2CAA8B,CDC9B,YFuBA,CAEA,uBAEC,oDAAqD,CADrD,sDAAuD,CAEvD,yCAMD,CAJC,6BG/BD,oDHkCC,CAGD,sBAEC,sCAAuC,CADvC,+CAMD,CAHC,4BGzCD,iDH2CC,CAIF,0BACC,IACC,0BACD,CAEA,IACC,yBACD,CAEA,IACC,0BACD,CAEA,IACC,yBACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_focus.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-input-width: 18em;\n\n\t/* Backward compatibility. */\n\t--ck-input-text-width: var(--ck-input-width);\n}\n\n.ck.ck-input {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-input-background);\n\tborder: 1px solid var(--ck-color-input-border);\n\tpadding: var(--ck-spacing-extra-tiny) var(--ck-spacing-medium);\n\tmin-width: var(--ck-input-width);\n\n\t/* This is important to stay of the same height as surrounding buttons */\n\tmin-height: var(--ck-ui-component-min-height);\n\n\t/* Apply some smooth transition to the box-shadow and border. */\n\ttransition: box-shadow .1s ease-in-out, border .1s ease-in-out;\n\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-focus-outer-shadow);\n\t}\n\n\t&[readonly] {\n\t\tborder: 1px solid var(--ck-color-input-disabled-border);\n\t\tbackground: var(--ck-color-input-disabled-background);\n\t\tcolor: var(--ck-color-input-disabled-text);\n\n\t\t&:focus {\n\t\t\t/* The read-only input should have a slightly less visible shadow when focused. */\n\t\t\t@mixin ck-box-shadow var(--ck-focus-disabled-outer-shadow);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\tborder-color: var(--ck-color-input-error-border);\n\t\tanimation: ck-input-shake .3s ease both;\n\n\t\t&:focus {\n\t\t\t@mixin ck-box-shadow var(--ck-focus-error-outer-shadow);\n\t\t}\n\t}\n}\n\n@keyframes ck-input-shake {\n\t20% {\n\t\ttransform: translateX(-2px);\n\t}\n\n\t40% {\n\t\ttransform: translateX(2px);\n\t}\n\n\t60% {\n\t\ttransform: translateX(-1px);\n\t}\n\n\t80% {\n\t\ttransform: translateX(1px);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},7801:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-label{display:block}.ck.ck-voice-label{display:none}.ck.ck-label{font-weight:700}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/label/label.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/label/label.css"],names:[],mappings:"AAKA,aACC,aACD,CAEA,mBACC,YACD,CCNA,aACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tdisplay: block;\n}\n\n.ck.ck-voice-label {\n\tdisplay: none;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-label {\n\tfont-weight: bold;\n}\n"],sourceRoot:""}]);const a=s},4962:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{display:flex;position:relative}.ck.ck-labeled-field-view .ck.ck-label{display:block;position:absolute}:root{--ck-labeled-field-view-transition:.1s cubic-bezier(0,0,0.24,0.95);--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-spacing-medium);--ck-labeled-field-label-default-position-x:var(--ck-spacing-medium);--ck-labeled-field-label-default-position-y:calc(var(--ck-font-size-base)*0.6);--ck-color-labeled-field-label-background:var(--ck-color-base-background)}.ck.ck-labeled-field-view{border-radius:0}.ck-rounded-corners .ck.ck-labeled-field-view,.ck.ck-labeled-field-view.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper{width:100%}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{top:0}[dir=ltr] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{left:0;transform:translate(var(--ck-spacing-medium),-6px) scale(.75);transform-origin:0 0}[dir=rtl] .ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{right:0;transform:translate(calc(var(--ck-spacing-medium)*-1),-6px) scale(.75);transform-origin:100% 0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{background:var(--ck-color-labeled-field-label-background);font-weight:400;line-height:normal;max-width:100%;overflow:hidden;padding:0 calc(var(--ck-font-size-tiny)*.5);pointer-events:none;text-overflow:ellipsis;transition:transform var(--ck-labeled-field-view-transition),padding var(--ck-labeled-field-view-transition),background var(--ck-labeled-field-view-transition)}.ck.ck-labeled-field-view.ck-error .ck-input:not([readonly])+.ck.ck-label,.ck.ck-labeled-field-view.ck-error>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view .ck-labeled-field-view__status{font-size:var(--ck-font-size-small);margin-top:var(--ck-spacing-small);white-space:normal}.ck.ck-labeled-field-view .ck-labeled-field-view__status.ck-labeled-field-view__status_error{color:var(--ck-color-base-error)}.ck.ck-labeled-field-view.ck-disabled>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{color:var(--ck-color-input-disabled-text)}[dir=ltr] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty:not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=ltr] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder):not(.ck-error)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(var(--ck-labeled-field-label-default-position-x),var(--ck-labeled-field-label-default-position-y)) scale(1)}[dir=rtl] .ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty:not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,[dir=rtl] .ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder):not(.ck-error)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{transform:translate(calc(var(--ck-labeled-field-label-default-position-x)*-1),var(--ck-labeled-field-label-default-position-y)) scale(1)}.ck.ck-labeled-field-view.ck-disabled.ck-labeled-field-view_empty:not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label,.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder):not(.ck-error)>.ck.ck-labeled-field-view__input-wrapper>.ck.ck-label{background:transparent;max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width));padding:0}.ck.ck-labeled-field-view>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck.ck-button{background:transparent}.ck.ck-labeled-field-view.ck-labeled-field-view_empty>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown>.ck-button>.ck-button__label{opacity:0}.ck.ck-labeled-field-view.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder)>.ck.ck-labeled-field-view__input-wrapper>.ck-dropdown+.ck-label{max-width:calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard))}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/labeledfield/labeledfieldview.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAMC,mEACC,YAAa,CACb,iBACD,CAEA,uCACC,aAAc,CACd,iBACD,CCND,MACC,kEAAsE,CACtE,gFAAiF,CACjF,oEAAqE,CACrE,8EAAiF,CACjF,yEACD,CAEA,0BCLC,eD+GD,CA1GA,2FCDE,qCD2GF,CAvGC,mEACC,UAoCD,CAlCC,gFACC,KAgCD,CAjCA,0FAIE,MAAS,CAGT,6DAA+D,CAF/D,oBA4BF,CAjCA,0FAWE,OAAU,CAEV,sEAA0E,CAD1E,uBAqBF,CAjCA,gFAkBC,yDAA0D,CAG1D,eAAmB,CADnB,kBAAoB,CAOpB,cAAe,CAFf,eAAgB,CANhB,2CAA8C,CAH9C,mBAAoB,CAQpB,sBAAuB,CAKvB,+JAID,CAQA,mKACC,gCACD,CAGD,yDACC,mCAAoC,CACpC,kCAAmC,CAInC,kBAKD,CAHC,6FACC,gCACD,CAID,4OAEC,yCACD,CAIA,2XAGE,+HAYF,CAfA,2XAOE,wIAQF,CAfA,uWAaC,sBAAuB,CAFvB,iEAAkE,CAGlE,SACD,CAKA,8FACC,sBACD,CAGA,yIACC,SACD,CAGA,kMACC,8HACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-labeled-field-view {\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\tdisplay: flex;\n\t\tposition: relative;\n\t}\n\n\t& .ck.ck-label {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n@import "../../../mixins/_rounded.css";\n\n:root {\n\t--ck-labeled-field-view-transition: .1s cubic-bezier(0, 0, 0.24, 0.95);\n\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-spacing-medium);\n\t--ck-labeled-field-label-default-position-x: var(--ck-spacing-medium);\n\t--ck-labeled-field-label-default-position-y: calc(0.6 * var(--ck-font-size-base));\n\t--ck-color-labeled-field-label-background: var(--ck-color-base-background);\n}\n\n.ck.ck-labeled-field-view {\n\t@mixin ck-rounded-corners;\n\n\t& > .ck.ck-labeled-field-view__input-wrapper {\n\t\twidth: 100%;\n\n\t\t& > .ck.ck-label {\n\t\t\ttop: 0px;\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tleft: 0px;\n\t\t\t\ttransform-origin: 0 0;\n\t\t\t\t/* By default, display the label scaled down above the field. */\n\t\t\t\ttransform: translate(var(--ck-spacing-medium), -6px) scale(.75);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tright: 0px;\n\t\t\t\ttransform-origin: 100% 0;\n\t\t\t\ttransform: translate(calc(-1 * var(--ck-spacing-medium)), -6px) scale(.75);\n\t\t\t}\n\n\t\t\tpointer-events: none;\n\n\t\t\tbackground: var(--ck-color-labeled-field-label-background);\n\t\t\tpadding: 0 calc(.5 * var(--ck-font-size-tiny));\n\t\t\tline-height: initial;\n\t\t\tfont-weight: normal;\n\n\t\t\t/* Prevent overflow when the label is longer than the input */\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\n\t\t\tmax-width: 100%;\n\n\t\t\ttransition:\n\t\t\t\ttransform var(--ck-labeled-field-view-transition),\n\t\t\t\tpadding var(--ck-labeled-field-view-transition),\n\t\t\t\tbackground var(--ck-labeled-field-view-transition);\n\t\t}\n\t}\n\n\t&.ck-error {\n\t\t& > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\n\t\t& .ck-input:not([readonly]) + .ck.ck-label {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t& .ck-labeled-field-view__status {\n\t\tfont-size: var(--ck-font-size-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\n\t\t/* Let the info wrap to the next line to avoid stretching the layout horizontally.\n\t\tThe status could be very long. */\n\t\twhite-space: normal;\n\n\t\t&.ck-labeled-field-view__status_error {\n\t\t\tcolor: var(--ck-color-base-error);\n\t\t}\n\t}\n\n\t/* Disabled fields and fields that have no focus should fade out. */\n\t&.ck-disabled > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\tcolor: var(--ck-color-input-disabled-text);\n\t}\n\n\t/* Fields that are disabled or not focused and without a placeholder should have full-sized labels. */\n\t/* stylelint-disable-next-line no-descending-specificity */\n\t&.ck-disabled.ck-labeled-field-view_empty:not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label,\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder):not(.ck-error) > .ck.ck-labeled-field-view__input-wrapper > .ck.ck-label {\n\t\t@mixin ck-dir ltr {\n\t\t\ttransform: translate(var(--ck-labeled-field-label-default-position-x), var(--ck-labeled-field-label-default-position-y)) scale(1);\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttransform: translate(calc(-1 * var(--ck-labeled-field-label-default-position-x)), var(--ck-labeled-field-label-default-position-y)) scale(1);\n\t\t}\n\n\t\t/* Compensate for the default translate position. */\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width));\n\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t}\n\n\t/*------ DropdownView integration ----------------------------------------------------------------------------------- */\n\n\t/* Make sure dropdown\' background color in any of dropdown\'s state does not collide with labeled field. */\n\t& > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck.ck-button {\n\t\tbackground: transparent;\n\t}\n\n\t/* When the dropdown is "empty", the labeled field label replaces its label. */\n\t&.ck-labeled-field-view_empty > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown > .ck-button > .ck-button__label {\n\t\topacity: 0;\n\t}\n\n\t/* Make sure the label of the empty, unfocused input does not cover the dropdown arrow. */\n\t&.ck-labeled-field-view_empty:not(.ck-labeled-field-view_focused):not(.ck-labeled-field-view_placeholder) > .ck.ck-labeled-field-view__input-wrapper > .ck-dropdown + .ck-label {\n\t\tmax-width: calc(var(--ck-labeled-field-empty-unfocused-max-width) - var(--ck-dropdown-arrow-size) - var(--ck-spacing-standard));\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},5199:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-list{display:flex;flex-direction:column;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-list .ck-list__item,.ck.ck-list .ck-list__separator{display:block}.ck.ck-list .ck-list__item>:focus{position:relative;z-index:var(--ck-z-default)}:root{--ck-list-button-padding:calc(var(--ck-line-height-base)*0.11*var(--ck-font-size-base)) calc(var(--ck-line-height-base)*0.4*var(--ck-font-size-base))}.ck.ck-list{border-radius:0}.ck-rounded-corners .ck.ck-list,.ck.ck-list.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-list{background:var(--ck-color-list-background);list-style-type:none}.ck.ck-list__item{cursor:default;min-width:12em}.ck.ck-list__item>.ck-button{border-radius:0;min-height:unset;width:100%}[dir=ltr] .ck.ck-list__item>.ck-button{text-align:left}[dir=rtl] .ck.ck-list__item>.ck-button{text-align:right}.ck.ck-list__item>.ck-button{padding:var(--ck-list-button-padding)}.ck.ck-list__item>.ck-button:active{box-shadow:none}.ck.ck-list__item>.ck-button.ck-on{background:var(--ck-color-list-button-on-background);color:var(--ck-color-list-button-on-text)}.ck.ck-list__item>.ck-button.ck-on:active{box-shadow:none}.ck.ck-list__item>.ck-button.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-on-background-focus)}.ck.ck-list__item>.ck-button.ck-on:focus:not(.ck-switchbutton):not(.ck-disabled){border-color:var(--ck-color-base-background)}.ck.ck-list__item>.ck-button:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background)}.ck.ck-list__item>.ck-switchbutton.ck-on{background:var(--ck-color-list-background);color:inherit}.ck.ck-list__item>.ck-switchbutton.ck-on:hover:not(.ck-disabled){background:var(--ck-color-list-button-hover-background);color:inherit}.ck-list .ck-list__group{padding-top:var(--ck-spacing-medium);:not(.ck-hidden)~&{border-top:1px solid var(--ck-color-base-border)}}.ck-list .ck-list__group>.ck-label{font-size:11px;font-weight:700;padding:var(--ck-spacing-medium) var(--ck-spacing-medium) 0 var(--ck-spacing-medium)}.ck.ck-list__separator{background:var(--ck-color-base-border);height:1px;width:100%}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/list/list.css","webpack://./../ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/list/list.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,YAGC,YAAa,CACb,qBAAsB,CCFtB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBDaD,CAZC,2DAEC,aACD,CAKA,kCACC,iBAAkB,CAClB,2BACD,CEdD,MACC,qJAGD,CAEA,YCLC,eDUD,CALA,+DCDE,qCDMF,CALA,YAIC,0CAA2C,CAD3C,oBAED,CAEA,kBACC,cAAe,CACf,cA2DD,CAzDC,6BAGC,eAAgB,CAFhB,gBAAiB,CACjB,UAwCD,CA1CA,uCAME,eAoCF,CA1CA,uCAUE,gBAgCF,CA1CA,6BAgBC,qCA0BD,CAxBC,oCACC,eACD,CAEA,mCACC,oDAAqD,CACrD,yCAaD,CAXC,0CACC,eACD,CAEA,2DACC,0DACD,CAEA,iFACC,4CACD,CAGD,qDACC,uDACD,CAMA,yCACC,0CAA2C,CAC3C,aAMD,CAJC,iEACC,uDAAwD,CACxD,aACD,CAKH,yBACC,oCAAqC,CAGrC,mBACC,gDACD,CAOD,CALC,mCACC,cAAe,CACf,eAAiB,CACjB,oFACD,CAGD,uBAGC,sCAAuC,CAFvC,UAAW,CACX,UAED",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-list {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t& .ck-list__item,\n\t& .ck-list__separator {\n\t\tdisplay: block;\n\t}\n\n\t/* Make sure that whatever child of the list item gets focus, it remains on the\n\ttop. Thanks to that, styles like box-shadow, outline, etc. are not masked by\n\tadjacent list items. */\n\t& .ck-list__item > *:focus {\n\t\tposition: relative;\n\t\tz-index: var(--ck-z-default);\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_disabled.css";\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-list-button-padding:\n\t\tcalc(.11 * var(--ck-line-height-base) * var(--ck-font-size-base))\n\t\tcalc(.4 * var(--ck-line-height-base) * var(--ck-font-size-base));\n}\n\n.ck.ck-list {\n\t@mixin ck-rounded-corners;\n\n\tlist-style-type: none;\n\tbackground: var(--ck-color-list-background);\n}\n\n.ck.ck-list__item {\n\tcursor: default;\n\tmin-width: 12em;\n\n\t& > .ck-button {\n\t\tmin-height: unset;\n\t\twidth: 100%;\n\t\tborder-radius: 0;\n\n\t\t@mixin ck-dir ltr {\n\t\t\ttext-align: left;\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\ttext-align: right;\n\t\t}\n\n\t\t/* List items should have the same height. Use absolute units to make sure it is so\n\t\t because e.g. different heading styles may have different height\n\t\t https://github.com/ckeditor/ckeditor5-heading/issues/63 */\n\t\tpadding: var(--ck-list-button-padding);\n\n\t\t&:active {\n\t\t\tbox-shadow: none;\n\t\t}\n\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-button-on-background);\n\t\t\tcolor: var(--ck-color-list-button-on-text);\n\n\t\t\t&:active {\n\t\t\t\tbox-shadow: none;\n\t\t\t}\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-on-background-focus);\n\t\t\t}\n\n\t\t\t&:focus:not(.ck-switchbutton):not(.ck-disabled) {\n\t\t\t\tborder-color: var(--ck-color-base-background);\n\t\t\t}\n\t\t}\n\n\t\t&:hover:not(.ck-disabled) {\n\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t}\n\t}\n\n\t/* It\'s unnecessary to change the background/text of a switch toggle; it has different ways\n\tof conveying its state (like the switcher) */\n\t& > .ck-switchbutton {\n\t\t&.ck-on {\n\t\t\tbackground: var(--ck-color-list-background);\n\t\t\tcolor: inherit;\n\n\t\t\t&:hover:not(.ck-disabled) {\n\t\t\t\tbackground: var(--ck-color-list-button-hover-background);\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck-list .ck-list__group {\n\tpadding-top: var(--ck-spacing-medium);\n\n\t/* The group should have a border when it\'s not the first item. */\n\t*:not(.ck-hidden) ~ & {\n\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t}\n\n\t& > .ck-label {\n\t\tfont-size: 11px;\n\t\tfont-weight: bold;\n\t\tpadding: var(--ck-spacing-medium) var(--ck-spacing-medium) 0 var(--ck-spacing-medium);\n\t}\n}\n\n.ck.ck-list__separator {\n\theight: 1px;\n\twidth: 100%;\n\tbackground: var(--ck-color-base-border);\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},497:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-menu-bar{background:var(--ck-color-base-background);border:1px solid var(--ck-color-toolbar-border);display:flex;flex-wrap:wrap;gap:var(--ck-spacing-small);justify-content:flex-start;padding:var(--ck-spacing-small);width:100%}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/menubar/menubar.css"],names:[],mappings:"AAKA,gBAIC,0CAA2C,CAG3C,+CAAgD,CANhD,YAAa,CACb,cAAe,CAIf,2BAA4B,CAH5B,0BAA2B,CAE3B,+BAAgC,CAGhC,UACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-menu-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: flex-start;\n\tbackground: var(--ck-color-base-background);\n\tpadding: var(--ck-spacing-small);\n\tgap: var(--ck-spacing-small);\n\tborder: 1px solid var(--ck-color-toolbar-border);\n\twidth: 100%;\n}\n"],sourceRoot:""}]);const a=s},4:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-menu-bar__menu{display:block;font-size:inherit;position:relative}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level{max-width:100%}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/menubar/menubarmenu.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/menubar/menubarmenu.css"],names:[],mappings:"AAKA,sBACC,aAAc,CCCd,iBAAkB,CDAlB,iBACD,CCCC,kDACC,cACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-menu-bar__menu {\n\tdisplay: block;\n\tposition: relative;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-menu-bar__menu {\n\t/* Enable font size inheritance, which allows fluid UI scaling. */\n\tfont-size: inherit;\n\n\t&.ck-menu-bar__menu_top-level {\n\t\tmax-width: 100%;\n\t}\n}\n"],sourceRoot:""}]);const a=s},3344:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-menu-bar__menu>.ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{pointer-events:none;z-index:var(--ck-z-default)}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button{padding:var(--ck-list-button-padding);width:100%}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button>.ck-button__label{flex-grow:1;overflow:hidden;text-overflow:ellipsis}.ck.ck-menu-bar__menu>.ck-menu-bar__menu__button.ck-disabled>.ck-button__label{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-menu-bar__menu>.ck-menu-bar__menu__button:not(.ck-button_with-text){padding-left:var(--ck-spacing-small)}[dir=rtl] .ck.ck-menu-bar__menu>.ck-menu-bar__menu__button:not(.ck-button_with-text){padding-right:var(--ck-spacing-small)}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button{min-height:unset;padding:var(--ck-spacing-small) var(--ck-spacing-medium)}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button .ck-button__label{line-height:unset;width:unset}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button.ck-on{border-bottom-left-radius:0;border-bottom-right-radius:0}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__button .ck-icon{display:none}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button{border-radius:0}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button:focus{border-color:transparent;box-shadow:none}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button:focus:not(.ck-on){background:var(--ck-color-button-default-hover-background)}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button:not(:has(.ck-button__icon))>.ck-button__label{margin-left:calc(var(--ck-icon-size) - var(--ck-spacing-small))}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{width:var(--ck-dropdown-arrow-size)}[dir=ltr] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{transform:rotate(-90deg)}[dir=rtl] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{transform:rotate(90deg)}.ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button.ck-disabled>.ck-menu-bar__menu__button__arrow{opacity:var(--ck-disabled-opacity)}[dir=ltr] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{margin-left:var(--ck-spacing-standard);right:var(--ck-spacing-standard)}[dir=rtl] .ck.ck-menu-bar__menu:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button>.ck-menu-bar__menu__button__arrow{left:var(--ck-spacing-standard);margin-right:var(--ck-spacing-small)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/menubar/menubarmenubutton.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/menubar/menubarmenubutton.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_disabled.css"],names:[],mappings:"AAMC,mFACC,mBAAoB,CACpB,2BACD,CCIA,iDACC,qCAAsC,CACtC,UAuBD,CArBC,mEACC,WAAY,CACZ,eAAgB,CAChB,sBACD,CAEA,+ECdD,kCDgBC,CAGC,qFACC,oCACD,CAIA,qFACC,qCACD,CAOF,6EAEC,gBAAiB,CADjB,wDAgBD,CAbC,+FAEC,iBAAkB,CADlB,WAED,CAEA,mFACC,2BAA4B,CAC5B,4BACD,CAEA,sFACC,YACD,CAMD,mFACC,eAiDD,CA/CC,yFACC,wBAAyB,CACzB,eAKD,CAHC,qGACC,0DACD,CAID,iIACC,+DACD,CAEA,qHACC,mCASD,CAVA,+HAIE,wBAMF,CAVA,+HAQE,uBAEF,CAEA,iICrFD,kCDuFC,CAGC,+HAIC,sCAAuC,CAHvC,gCAID,CAIA,+HACC,+BAAgC,CAGhC,oCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-menu-bar__menu {\n\t& > .ck-menu-bar__menu__button > .ck-menu-bar__menu__button__arrow {\n\t\tpointer-events: none;\n\t\tz-index: var(--ck-z-default);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_disabled.css";\n@import "../../mixins/_button.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-menu-bar__menu {\n\t/*\n\t * All menu buttons.\n\t */\n\t& > .ck-menu-bar__menu__button {\n\t\tpadding: var(--ck-list-button-padding);\n\t\twidth: 100%;\n\n\t\t& > .ck-button__label {\n\t\t\tflex-grow: 1;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&.ck-disabled > .ck-button__label {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t@mixin ck-dir ltr {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\tpadding-left: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t&:not(.ck-button_with-text) {\n\t\t\t\tpadding-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Top-level menu buttons only.\n\t */\n\t&.ck-menu-bar__menu_top-level > .ck-menu-bar__menu__button {\n\t\tpadding: var(--ck-spacing-small) var(--ck-spacing-medium);\n\t\tmin-height: unset;\n\n\t\t& .ck-button__label {\n\t\t\twidth: unset;\n\t\t\tline-height: unset;\n\t\t}\n\n\t\t&.ck-on {\n\t\t\tborder-bottom-left-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t& .ck-icon {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/*\n\t * Sub-menu buttons.\n\t */\n\t&:not(.ck-menu-bar__menu_top-level) .ck-menu-bar__menu__button {\n\t\tborder-radius: 0;\n\n\t\t&:focus {\n\t\t\tborder-color: transparent;\n\t\t\tbox-shadow: none;\n\n\t\t\t&:not(.ck-on) {\n\t\t\t\tbackground: var(--ck-color-button-default-hover-background);\n\t\t\t}\n\t\t}\n\n\t\t/* Spacing in buttons that miss the icon. */\n\t\t&:not(:has(.ck-button__icon)) > .ck-button__label {\n\t\t\tmargin-left: calc(var(--ck-icon-size) - var(--ck-spacing-small));\n\t\t}\n\n\t\t& > .ck-menu-bar__menu__button__arrow {\n\t\t\twidth: var(--ck-dropdown-arrow-size);\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\ttransform: rotate(-90deg);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\ttransform: rotate(90deg);\n\t\t\t}\n\t\t}\n\n\t\t&.ck-disabled > .ck-menu-bar__menu__button__arrow {\n\t\t\t@mixin ck-disabled;\n\t\t}\n\n\t\t@mixin ck-dir ltr {\n\t\t\t& > .ck-menu-bar__menu__button__arrow {\n\t\t\t\tright: var(--ck-spacing-standard);\n\n\t\t\t\t/* A space to accommodate the triangle. */\n\t\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t\t}\n\t\t}\n\n\t\t@mixin ck-dir rtl {\n\t\t\t& > .ck-menu-bar__menu__button__arrow {\n\t\t\t\tleft: var(--ck-spacing-standard);\n\n\t\t\t\t/* A space to accommodate the triangle. */\n\t\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which indicates that an element holding it is disabled.\n */\n@define-mixin ck-disabled {\n\topacity: var(--ck-disabled-opacity);\n}\n"],sourceRoot:""}]);const a=s},9481:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-menu-bar-menu-item-min-width:18em}.ck.ck-menu-bar__menu .ck.ck-menu-bar__menu__item{min-width:var(--ck-menu-bar-menu-item-min-width)}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/menubar/menubarmenulistitem.css"],names:[],mappings:"AAKA,MACC,sCACD,CAEA,kDACC,gDACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-menu-bar-menu-item-min-width: 18em;\n}\n\n.ck.ck-menu-bar__menu .ck.ck-menu-bar__menu__item {\n\tmin-width: var(--ck-menu-bar-menu-item-min-width);\n}\n"],sourceRoot:""}]);const a=s},977:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button{border-radius:0}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button>.ck-spinner-container,.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button>.ck-spinner-container .ck-spinner{--ck-toolbar-spinner-size:20px}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button>.ck-spinner-container{margin-left:calc(var(--ck-spacing-small)*-1);margin-right:var(--ck-spacing-small)}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button:focus{border-color:transparent;box-shadow:none}.ck.ck-menu-bar__menu .ck-button.ck-menu-bar__menu__item__button:focus:not(.ck-on){background:var(--ck-color-button-default-hover-background)}.ck.ck-menu-bar__menu.ck-menu-bar__menu_top-level>.ck-menu-bar__menu__panel>ul>.ck-menu-bar__menu__item>.ck-menu-bar__menu__item__button:not(:has(.ck-button__icon))>.ck-button__label{margin-left:calc(var(--ck-icon-size) - var(--ck-spacing-small))}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/menubar/menubarmenulistitembutton.css"],names:[],mappings:"AASC,iEACC,eA0BD,CAxBC,0LAGC,8BACD,CAEA,uFAEC,4CAA+C,CAC/C,oCACD,CAMA,uEACC,wBAAyB,CACzB,eAKD,CAHC,mFACC,0DACD,CASD,uLACC,+DACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-menu-bar__menu {\n\t/*\n\t * List item buttons.\n\t */\n\t& .ck-button.ck-menu-bar__menu__item__button {\n\t\tborder-radius: 0;\n\n\t\t& > .ck-spinner-container,\n\t\t& > .ck-spinner-container .ck-spinner {\n\t\t\t/* These styles correspond to .ck-icon so that the spinner seamlessly replaces the icon. */\n\t\t\t--ck-toolbar-spinner-size: 20px;\n\t\t}\n\n\t\t& > .ck-spinner-container {\n\t\t\t/* These margins are the same as for .ck-icon. */\n\t\t\tmargin-left: calc(-1 * var(--ck-spacing-small));\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\n\t\t/*\n\t\t * Hovered items automatically get focused. Default focus styles look odd\n\t\t * while moving across a huge list of items so let's get rid of them\n\t\t */\n\t\t&:focus {\n\t\t\tborder-color: transparent;\n\t\t\tbox-shadow: none;\n\n\t\t\t&:not(.ck-on) {\n\t\t\t\tbackground: var(--ck-color-button-default-hover-background);\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * First-level sub-menu item buttons.\n\t */\n\t&.ck-menu-bar__menu_top-level > .ck-menu-bar__menu__panel > ul > .ck-menu-bar__menu__item > .ck-menu-bar__menu__item__button {\n\t\t/* Spacing in buttons that miss the icon. */\n\t\t&:not(:has(.ck-button__icon)) > .ck-button__label {\n\t\t\tmargin-left: calc(var(--ck-icon-size) - var(--ck-spacing-small));\n\t\t}\n\t}\n}\n\n\n"],sourceRoot:""}]);const a=s},9108:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-menu-bar-menu-max-width:75vw;--ck-menu-bar-nested-menu-horizontal-offset:5px}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel{max-width:var(--ck-menu-bar-menu-max-width);position:absolute;z-index:var(--ck-z-panel)}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ne,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_nw{bottom:100%}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_se,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_sw{bottom:auto;top:100%}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ne,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_se{left:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_nw,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_sw{right:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_en,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_es{left:calc(100% - var(--ck-menu-bar-nested-menu-horizontal-offset))}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_es{top:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_en{bottom:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_wn,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ws{right:calc(100% - var(--ck-menu-bar-nested-menu-horizontal-offset))}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ws{top:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_wn{bottom:0}:root{--ck-menu-bar-menu-panel-max-width:75vw}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel{border-radius:0}.ck-rounded-corners .ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel{background:var(--ck-color-dropdown-panel-background);border:1px solid var(--ck-color-dropdown-panel-border);bottom:0;box-shadow:var(--ck-drop-shadow),0 0;height:fit-content;max-width:var(--ck-menu-bar-menu-panel-max-width)}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_es,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_se{border-top-left-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_sw,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ws{border-top-right-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_en,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_ne{border-bottom-left-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_nw,.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel.ck-menu-bar__menu__panel_position_wn{border-bottom-right-radius:0}.ck.ck-menu-bar__menu>.ck.ck-menu-bar__menu__panel:focus{outline:none}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/menubar/menubarmenupanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/menubar/menubarmenupanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MACC,iCAAkC,CAClC,+CACD,CAEA,mDAEC,2CAA4C,CAC5C,iBAAkB,CAFlB,yBAkDD,CA9CC,gLAEC,WACD,CAEA,gLAGC,WAAY,CADZ,QAED,CAEA,gLAEC,MACD,CAEA,gLAEC,OACD,CAEA,gLAEC,kEACD,CAEA,wFACC,KACD,CAEA,wFACC,QACD,CAEA,gLAEC,mEACD,CAEA,wFACC,KACD,CAEA,wFACC,QACD,CCpDD,MACC,uCACD,CAEA,mDCDC,eDmCD,CAlCA,6ICGE,qCD+BF,CAlCA,mDAIC,oDAAqD,CACrD,sDAAuD,CACvD,QAAS,CETT,oCAA8B,CFU9B,kBAAmB,CACnB,iDA0BD,CAvBC,gLAEC,wBACD,CAEA,gLAEC,yBACD,CAEA,gLAEC,2BACD,CAEA,gLAEC,4BACD,CAEA,yDACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-menu-bar-menu-max-width: 75vw;\n\t--ck-menu-bar-nested-menu-horizontal-offset: 5px;\n}\n\n.ck.ck-menu-bar__menu > .ck.ck-menu-bar__menu__panel {\n\tz-index: var(--ck-z-panel);\n\tmax-width: var(--ck-menu-bar-menu-max-width);\n\tposition: absolute;\n\n\t&.ck-menu-bar__menu__panel_position_ne,\n\t&.ck-menu-bar__menu__panel_position_nw {\n\t\tbottom: 100%;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_se,\n\t&.ck-menu-bar__menu__panel_position_sw {\n\t\ttop: 100%;\n\t\tbottom: auto;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_ne,\n\t&.ck-menu-bar__menu__panel_position_se {\n\t\tleft: 0px;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_nw,\n\t&.ck-menu-bar__menu__panel_position_sw {\n\t\tright: 0px;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_es,\n\t&.ck-menu-bar__menu__panel_position_en {\n\t\tleft: calc( 100% - var(--ck-menu-bar-nested-menu-horizontal-offset) );\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_es {\n\t\ttop: 0px;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_en {\n\t\tbottom: 0px;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_ws,\n\t&.ck-menu-bar__menu__panel_position_wn {\n\t\tright: calc( 100% - var(--ck-menu-bar-nested-menu-horizontal-offset) );\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_ws {\n\t\ttop: 0px;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_wn {\n\t\tbottom: 0px;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-menu-bar-menu-panel-max-width: 75vw;\n}\n\n.ck.ck-menu-bar__menu > .ck.ck-menu-bar__menu__panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tbackground: var(--ck-color-dropdown-panel-background);\n\tborder: 1px solid var(--ck-color-dropdown-panel-border);\n\tbottom: 0;\n\theight: fit-content;\n\tmax-width: var(--ck-menu-bar-menu-panel-max-width);\n\n\t/* Corner border radius consistent with the button. */\n\t&.ck-menu-bar__menu__panel_position_es,\n\t&.ck-menu-bar__menu__panel_position_se {\n\t\tborder-top-left-radius: 0;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_ws,\n\t&.ck-menu-bar__menu__panel_position_sw {\n\t\tborder-top-right-radius: 0;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_en,\n\t&.ck-menu-bar__menu__panel_position_ne {\n\t\tborder-bottom-left-radius: 0;\n\t}\n\n\t&.ck-menu-bar__menu__panel_position_wn,\n\t&.ck-menu-bar__menu__panel_position_nw {\n\t\tborder-bottom-right-radius: 0;\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},3710:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,':root{--ck-balloon-panel-arrow-z-index:calc(var(--ck-z-default) - 3)}.ck.ck-balloon-panel{display:none;position:absolute;z-index:var(--ck-z-panel)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{content:"";position:absolute}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_n]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_n]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel[class*=arrow_s]:before{z-index:var(--ck-balloon-panel-arrow-z-index)}.ck.ck-balloon-panel[class*=arrow_s]:after{z-index:calc(var(--ck-balloon-panel-arrow-z-index) + 1)}.ck.ck-balloon-panel.ck-balloon-panel_visible{display:block}:root{--ck-balloon-border-width:1px;--ck-balloon-arrow-offset:2px;--ck-balloon-arrow-height:10px;--ck-balloon-arrow-half-width:8px;--ck-balloon-arrow-drop-shadow:0 2px 2px var(--ck-color-shadow-drop)}.ck.ck-balloon-panel{border-radius:0}.ck-rounded-corners .ck.ck-balloon-panel,.ck.ck-balloon-panel.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-balloon-panel{background:var(--ck-color-panel-background);border:var(--ck-balloon-border-width) solid var(--ck-color-panel-border);box-shadow:var(--ck-drop-shadow),0 0;min-height:15px}.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:after,.ck.ck-balloon-panel.ck-balloon-panel_with-arrow:before{border-style:solid;height:0;width:0}.ck.ck-balloon-panel[class*=arrow_n]:after,.ck.ck-balloon-panel[class*=arrow_n]:before{border-width:0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_n]:before{border-color:transparent transparent var(--ck-color-panel-border) transparent;margin-top:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_n]:after{border-color:transparent transparent var(--ck-color-panel-background) transparent;margin-top:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_s]:after,.ck.ck-balloon-panel[class*=arrow_s]:before{border-width:var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width)}.ck.ck-balloon-panel[class*=arrow_s]:before{border-color:var(--ck-color-panel-border) transparent transparent;filter:drop-shadow(var(--ck-balloon-arrow-drop-shadow));margin-bottom:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_s]:after{border-color:var(--ck-color-panel-background) transparent transparent transparent;margin-bottom:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_e]:after,.ck.ck-balloon-panel[class*=arrow_e]:before{border-width:var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height)}.ck.ck-balloon-panel[class*=arrow_e]:before{border-color:transparent transparent transparent var(--ck-color-panel-border);margin-right:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_e]:after{border-color:transparent transparent transparent var(--ck-color-panel-background);margin-right:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel[class*=arrow_w]:after,.ck.ck-balloon-panel[class*=arrow_w]:before{border-width:var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0}.ck.ck-balloon-panel[class*=arrow_w]:before{border-color:transparent var(--ck-color-panel-border) transparent transparent;margin-left:calc(var(--ck-balloon-border-width)*-1)}.ck.ck-balloon-panel[class*=arrow_w]:after{border-color:transparent var(--ck-color-panel-background) transparent transparent;margin-left:calc(var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width))}.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_n:before{left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nw:before{left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_ne:before{right:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_s:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:50%;margin-left:calc(var(--ck-balloon-arrow-half-width)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_se:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);right:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_sme:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_smw:before{bottom:calc(var(--ck-balloon-arrow-height)*-1);left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nme:before{margin-right:calc(var(--ck-balloon-arrow-half-width)*2);right:25%;top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_nmw:before{left:25%;margin-left:calc(var(--ck-balloon-arrow-half-width)*2);top:calc(var(--ck-balloon-arrow-height)*-1)}.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_e:before{margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);right:calc(var(--ck-balloon-arrow-height)*-1);top:50%}.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:after,.ck.ck-balloon-panel.ck-balloon-panel_arrow_w:before{left:calc(var(--ck-balloon-arrow-height)*-1);margin-top:calc(var(--ck-balloon-arrow-half-width)*-1);top:50%}',"",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/balloonpanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonpanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MAEC,8DACD,CAEA,qBACC,YAAa,CACb,iBAAkB,CAElB,yBAyCD,CAtCE,+GAEC,UAAW,CACX,iBACD,CAEA,wDACC,6CACD,CAEA,uDACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAIA,4CACC,6CACD,CAEA,2CACC,uDACD,CAGD,8CACC,aACD,CC9CD,MACC,6BAA8B,CAC9B,6BAA8B,CAC9B,8BAA+B,CAC/B,iCAAkC,CAClC,oEACD,CAEA,qBCLC,eDmMD,CA9LA,iFCDE,qCD+LF,CA9LA,qBAMC,2CAA4C,CAC5C,wEAAyE,CEdzE,oCAA8B,CFW9B,eA0LD,CApLE,+GAIC,kBAAmB,CADnB,QAAS,CADT,OAGD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,kDACD,CAEA,2CACC,iFAAkF,CAClF,gFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,iEAAkE,CAClE,uDAAwD,CACxD,qDACD,CAEA,2CACC,iFAAkF,CAClF,mFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,oDACD,CAEA,2CACC,iFAAkF,CAClF,kFACD,CAIA,uFAEC,mHACD,CAEA,4CACC,6EAA8E,CAC9E,mDACD,CAEA,2CACC,iFAAkF,CAClF,iFACD,CAIA,yGAEC,QAAS,CACT,uDAA0D,CAC1D,2CACD,CAIA,2GAEC,+CAAkD,CAClD,2CACD,CAIA,2GAEC,gDAAmD,CACnD,2CACD,CAIA,yGAIC,8CAAiD,CAFjD,QAAS,CACT,uDAED,CAIA,2GAGC,8CAAiD,CADjD,+CAED,CAIA,2GAGC,8CAAiD,CADjD,gDAED,CAIA,6GAIC,8CAAiD,CADjD,uDAA0D,CAD1D,SAGD,CAIA,6GAIC,8CAAiD,CAFjD,QAAS,CACT,sDAED,CAIA,6GAGC,uDAA0D,CAD1D,SAAU,CAEV,2CACD,CAIA,6GAEC,QAAS,CACT,sDAAyD,CACzD,2CACD,CAIA,yGAGC,sDAAyD,CADzD,6CAAgD,CAEhD,OACD,CAIA,yGAEC,4CAA+C,CAC/C,sDAAyD,CACzD,OACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* Make sure the balloon arrow does not float over its children. */\n\t--ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3);\n}\n\n.ck.ck-balloon-panel {\n\tdisplay: none;\n\tposition: absolute;\n\n\tz-index: var(--ck-z-panel);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tposition: absolute;\n\t\t}\n\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before {\n\t\t\tz-index: var(--ck-balloon-panel-arrow-z-index);\n\t\t}\n\n\t\t&::after {\n\t\t\tz-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1);\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_visible {\n\t\tdisplay: block;\n\t}\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-border-width: 1px;\n\t--ck-balloon-arrow-offset: 2px;\n\t--ck-balloon-arrow-height: 10px;\n\t--ck-balloon-arrow-half-width: 8px;\n\t--ck-balloon-arrow-drop-shadow: 0 2px 2px var(--ck-color-shadow-drop);\n}\n\n.ck.ck-balloon-panel {\n\t@mixin ck-rounded-corners;\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: var(--ck-balloon-border-width) solid var(--ck-color-panel-border);\n\n\t&.ck-balloon-panel_with-arrow {\n\t\t&::before,\n\t\t&::after {\n\t\t\twidth: 0;\n\t\t\theight: 0;\n\t\t\tborder-style: solid;\n\t\t}\n\t}\n\n\t&[class*="arrow_n"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-border) transparent;\n\t\t\tmargin-top: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent var(--ck-color-panel-background) transparent;\n\t\t\tmargin-top: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&[class*="arrow_s"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: var(--ck-color-panel-border) transparent transparent;\n\t\t\tfilter: drop-shadow(var(--ck-balloon-arrow-drop-shadow));\n\t\t\tmargin-bottom: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: var(--ck-color-panel-background) transparent transparent transparent;\n\t\t\tmargin-bottom: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&[class*="arrow_e"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-half-width) 0 var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height);\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent transparent transparent var(--ck-color-panel-border);\n\t\t\tmargin-right: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent transparent transparent var(--ck-color-panel-background);\n\t\t\tmargin-right: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&[class*="arrow_w"] {\n\t\t&::before,\n\t\t&::after {\n\t\t\tborder-width: var(--ck-balloon-arrow-half-width) var(--ck-balloon-arrow-height) var(--ck-balloon-arrow-half-width) 0;\n\t\t}\n\n\t\t&::before {\n\t\t\tborder-color: transparent var(--ck-color-panel-border) transparent transparent;\n\t\t\tmargin-left: calc( -1 * var(--ck-balloon-border-width) );\n\t\t}\n\n\t\t&::after {\n\t\t\tborder-color: transparent var(--ck-color-panel-background) transparent transparent;\n\t\t\tmargin-left: calc( var(--ck-balloon-arrow-offset) - var(--ck-balloon-border-width) );\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_n {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_ne {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_s {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 50%;\n\t\t\tmargin-left: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_se {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_sme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_smw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\tbottom: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nme {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: 25%;\n\t\t\tmargin-right: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_nmw {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: 25%;\n\t\t\tmargin-left: calc(2 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_e {\n\t\t&::before,\n\t\t&::after {\n\t\t\tright: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t\tmargin-top: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: 50%;\n\t\t}\n\t}\n\n\t&.ck-balloon-panel_arrow_w {\n\t\t&::before,\n\t\t&::after {\n\t\t\tleft: calc(-1 * var(--ck-balloon-arrow-height));\n\t\t\tmargin-top: calc(-1 * var(--ck-balloon-arrow-half-width));\n\t\t\ttop: 50%;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},991:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck .ck-balloon-rotator__navigation{align-items:center;display:flex;justify-content:center}.ck .ck-balloon-rotator__content .ck-toolbar{justify-content:center}.ck .ck-balloon-rotator__navigation{background:var(--ck-color-toolbar-background);border-bottom:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation>*{margin-bottom:var(--ck-spacing-small);margin-right:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck .ck-balloon-rotator__navigation .ck-balloon-rotator__counter{margin-left:var(--ck-spacing-small);margin-right:var(--ck-spacing-standard)}.ck .ck-balloon-rotator__content .ck.ck-annotation-wrapper{box-shadow:none}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/balloonrotator.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/balloonrotator.css"],names:[],mappings:"AAKA,oCAEC,kBAAmB,CADnB,YAAa,CAEb,sBACD,CAKA,6CACC,sBACD,CCXA,oCACC,6CAA8C,CAC9C,sDAAuD,CACvD,iCAgBD,CAbC,sCAGC,qCAAsC,CAFtC,oCAAqC,CACrC,kCAED,CAGA,iEAIC,mCAAoC,CAHpC,uCAID,CAMA,2DACC,eACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Buttons inside a toolbar should be centered when rotator bar is wider.\n * See: https://github.com/ckeditor/ckeditor5-ui/issues/495\n */\n.ck .ck-balloon-rotator__content .ck-toolbar {\n\tjustify-content: center;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-balloon-rotator__navigation {\n\tbackground: var(--ck-color-toolbar-background);\n\tborder-bottom: 1px solid var(--ck-color-toolbar-border);\n\tpadding: 0 var(--ck-spacing-small);\n\n\t/* Let's keep similar appearance to `ck-toolbar`. */\n\t& > * {\n\t\tmargin-right: var(--ck-spacing-small);\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t/* Gives counter more breath than buttons. */\n\t& .ck-balloon-rotator__counter {\n\t\tmargin-right: var(--ck-spacing-standard);\n\n\t\t/* We need to use smaller margin because of previous button's right margin. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n.ck .ck-balloon-rotator__content {\n\n\t/* Disable default annotation shadow inside rotator with fake panels. */\n\t& .ck.ck-annotation-wrapper {\n\t\tbox-shadow: none;\n\t}\n}\n"],sourceRoot:""}]);const a=s},5380:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck .ck-fake-panel{position:absolute;z-index:calc(var(--ck-z-panel) - 1)}.ck .ck-fake-panel div{position:absolute}.ck .ck-fake-panel div:first-child{z-index:2}.ck .ck-fake-panel div:nth-child(2){z-index:1}:root{--ck-balloon-fake-panel-offset-horizontal:6px;--ck-balloon-fake-panel-offset-vertical:6px}.ck .ck-fake-panel div{background:var(--ck-color-panel-background);border:1px solid var(--ck-color-panel-border);border-radius:var(--ck-border-radius);box-shadow:var(--ck-drop-shadow),0 0;height:100%;min-height:15px;width:100%}.ck .ck-fake-panel div:first-child{margin-left:var(--ck-balloon-fake-panel-offset-horizontal);margin-top:var(--ck-balloon-fake-panel-offset-vertical)}.ck .ck-fake-panel div:nth-child(2){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*2);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*2)}.ck .ck-fake-panel div:nth-child(3){margin-left:calc(var(--ck-balloon-fake-panel-offset-horizontal)*3);margin-top:calc(var(--ck-balloon-fake-panel-offset-vertical)*3)}.ck .ck-balloon-panel_arrow_s+.ck-fake-panel,.ck .ck-balloon-panel_arrow_se+.ck-fake-panel,.ck .ck-balloon-panel_arrow_sw+.ck-fake-panel{--ck-balloon-fake-panel-offset-vertical:-6px}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/fakepanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/fakepanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,mBACC,iBAAkB,CAGlB,mCACD,CAEA,uBACC,iBACD,CAEA,mCACC,SACD,CAEA,oCACC,SACD,CCfA,MACC,6CAA8C,CAC9C,2CACD,CAGA,uBAKC,2CAA4C,CAC5C,6CAA8C,CAC9C,qCAAsC,CCXtC,oCAA8B,CDc9B,WAAY,CAPZ,eAAgB,CAMhB,UAED,CAEA,mCACC,0DAA2D,CAC3D,uDACD,CAEA,oCACC,kEAAqE,CACrE,+DACD,CACA,oCACC,kEAAqE,CACrE,+DACD,CAGA,yIAGC,4CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-fake-panel {\n\tposition: absolute;\n\n\t/* Fake panels should be placed under main balloon content. */\n\tz-index: calc(var(--ck-z-panel) - 1);\n}\n\n.ck .ck-fake-panel div {\n\tposition: absolute;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tz-index: 2;\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tz-index: 1;\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n:root {\n\t--ck-balloon-fake-panel-offset-horizontal: 6px;\n\t--ck-balloon-fake-panel-offset-vertical: 6px;\n}\n\n/* Let\'s use `.ck-balloon-panel` appearance. See: balloonpanel.css. */\n.ck .ck-fake-panel div {\n\t@mixin ck-drop-shadow;\n\n\tmin-height: 15px;\n\n\tbackground: var(--ck-color-panel-background);\n\tborder: 1px solid var(--ck-color-panel-border);\n\tborder-radius: var(--ck-border-radius);\n\n\twidth: 100%;\n\theight: 100%;\n}\n\n.ck .ck-fake-panel div:nth-child( 1 ) {\n\tmargin-left: var(--ck-balloon-fake-panel-offset-horizontal);\n\tmargin-top: var(--ck-balloon-fake-panel-offset-vertical);\n}\n\n.ck .ck-fake-panel div:nth-child( 2 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 2);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 2);\n}\n.ck .ck-fake-panel div:nth-child( 3 ) {\n\tmargin-left: calc(var(--ck-balloon-fake-panel-offset-horizontal) * 3);\n\tmargin-top: calc(var(--ck-balloon-fake-panel-offset-vertical) * 3);\n}\n\n/* If balloon is positioned above element, we need to move fake panel to the top. */\n.ck .ck-balloon-panel_arrow_s + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_se + .ck-fake-panel,\n.ck .ck-balloon-panel_arrow_sw + .ck-fake-panel {\n\t--ck-balloon-fake-panel-offset-vertical: -6px;\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},8298:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-sticky-panel .ck-sticky-panel__content_sticky{position:fixed;top:0;z-index:var(--ck-z-panel)}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky_bottom-limit{position:absolute;top:auto}.ck.ck-sticky-panel .ck-sticky-panel__content_sticky{border-top-left-radius:0;border-top-right-radius:0;border-width:0 1px 1px;box-shadow:var(--ck-drop-shadow),0 0}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/panel/stickypanel.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/panel/stickypanel.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAMC,qDAEC,cAAe,CACf,KAAM,CAFN,yBAGD,CAEA,kEAEC,iBAAkB,CADlB,QAED,CCPA,qDAIC,wBAAyB,CACzB,yBAA0B,CAF1B,sBAAuB,CCFxB,oCDKA",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\tz-index: var(--ck-z-panel); /* #315 */\n\t\tposition: fixed;\n\t\ttop: 0;\n\t}\n\n\t& .ck-sticky-panel__content_sticky_bottom-limit {\n\t\ttop: auto;\n\t\tposition: absolute;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_shadow.css";\n\n.ck.ck-sticky-panel {\n\t& .ck-sticky-panel__content_sticky {\n\t\t@mixin ck-drop-shadow;\n\n\t\tborder-width: 0 1px 1px;\n\t\tborder-top-left-radius: 0;\n\t\tborder-top-right-radius: 0;\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},2722:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck-vertical-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck-vertical-form .ck-button:focus:after{display:none}@media screen and (max-width:600px){.ck.ck-responsive-form .ck-button:after{bottom:-1px;content:"";position:absolute;right:-1px;top:-1px;width:0;z-index:1}.ck.ck-responsive-form .ck-button:focus:after{display:none}}.ck-vertical-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form{padding:var(--ck-spacing-large)}.ck.ck-responsive-form:focus{outline:none}[dir=ltr] .ck.ck-responsive-form>:not(:first-child),[dir=rtl] .ck.ck-responsive-form>:not(:last-child){margin-left:var(--ck-spacing-standard)}@media screen and (max-width:600px){.ck.ck-responsive-form{padding:0;width:calc(var(--ck-input-width)*.8)}.ck.ck-responsive-form .ck-labeled-field-view{margin:var(--ck-spacing-large) var(--ck-spacing-large) 0}.ck.ck-responsive-form .ck-labeled-field-view .ck-input-text{min-width:0;width:100%}.ck.ck-responsive-form .ck-labeled-field-view .ck-labeled-field-view__error{white-space:normal}.ck.ck-responsive-form>.ck-button:nth-last-child(2):after{border-right:1px solid var(--ck-color-base-border)}.ck.ck-responsive-form>.ck-button:last-child,.ck.ck-responsive-form>.ck-button:nth-last-child(2){border-radius:0;margin-top:var(--ck-spacing-large);padding:var(--ck-spacing-standard)}.ck.ck-responsive-form>.ck-button:last-child:not(:focus),.ck.ck-responsive-form>.ck-button:nth-last-child(2):not(:focus){border-top:1px solid var(--ck-color-base-border)}[dir=ltr] .ck.ck-responsive-form>.ck-button:last-child,[dir=ltr] .ck.ck-responsive-form>.ck-button:nth-last-child(2),[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2){margin-left:0}[dir=rtl] .ck.ck-responsive-form>.ck-button:last-child:last-of-type,[dir=rtl] .ck.ck-responsive-form>.ck-button:nth-last-child(2):last-of-type{border-right:1px solid var(--ck-color-base-border)}}',"",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/responsive-form/responsiveform.css","webpack://./../ckeditor5-ui/theme/mixins/_rwd.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/responsive-form/responsiveform.css"],names:[],mappings:"AAQC,mCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,yCACC,YACD,CCdA,oCDoBE,wCAMC,WAAY,CALZ,UAAW,CAEX,iBAAkB,CAClB,UAAW,CACX,QAAS,CAHT,OAAQ,CAKR,SACD,CAEA,8CACC,YACD,CC9BF,CCAD,qDACC,kDACD,CAEA,uBACC,+BAmED,CAjEC,6BAEC,YACD,CASC,uGACC,sCACD,CDvBD,oCCMD,uBAqBE,SAAU,CACV,oCA8CF,CA5CE,8CACC,wDAWD,CATC,6DACC,WAAY,CACZ,UACD,CAGA,4EACC,kBACD,CAKA,0DACC,kDACD,CAGD,iGAIC,eAAgB,CADhB,kCAAmC,CADnC,kCAmBD,CAfC,yHACC,gDACD,CARD,0OAeE,aAMF,CAJE,+IACC,kDACD,CDpEH",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n\n.ck-vertical-form .ck-button {\n\t&::after {\n\t\tcontent: "";\n\t\twidth: 0;\n\t\tposition: absolute;\n\t\tright: -1px;\n\t\ttop: -1px;\n\t\tbottom: -1px;\n\t\tz-index: 1;\n\t}\n\n\t&:focus::after {\n\t\tdisplay: none;\n\t}\n}\n\n.ck.ck-responsive-form {\n\t@mixin ck-media-phone {\n\t\t& .ck-button {\n\t\t\t&::after {\n\t\t\t\tcontent: "";\n\t\t\t\twidth: 0;\n\t\t\t\tposition: absolute;\n\t\t\t\tright: -1px;\n\t\t\t\ttop: -1px;\n\t\t\t\tbottom: -1px;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\t&:focus::after {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@define-mixin ck-media-phone {\n\t@media screen and (max-width: 600px) {\n\t\t@mixin-content;\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck-vertical-form > .ck-button:nth-last-child(2)::after {\n\tborder-right: 1px solid var(--ck-color-base-border);\n}\n\n.ck.ck-responsive-form {\n\tpadding: var(--ck-spacing-large);\n\n\t&:focus {\n\t\t/* See: https://github.com/ckeditor/ckeditor5/issues/4773 */\n\t\toutline: none;\n\t}\n\n\t@mixin ck-dir ltr {\n\t\t& > :not(:first-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-dir rtl {\n\t\t& > :not(:last-child) {\n\t\t\tmargin-left: var(--ck-spacing-standard);\n\t\t}\n\t}\n\n\t@mixin ck-media-phone {\n\t\tpadding: 0;\n\t\twidth: calc(.8 * var(--ck-input-width));\n\n\t\t& .ck-labeled-field-view {\n\t\t\tmargin: var(--ck-spacing-large) var(--ck-spacing-large) 0;\n\n\t\t\t& .ck-input-text {\n\t\t\t\tmin-width: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t/* Let the long error messages wrap in the narrow form. */\n\t\t\t& .ck-labeled-field-view__error {\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\t\t}\n\n\t\t/* Styles for two last buttons in the form (save&cancel, edit&unlink, etc.). */\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\t&::after {\n\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\t\t}\n\n\t\t& > .ck-button:nth-last-child(1),\n\t\t& > .ck-button:nth-last-child(2) {\n\t\t\tpadding: var(--ck-spacing-standard);\n\t\t\tmargin-top: var(--ck-spacing-large);\n\t\t\tborder-radius: 0;\n\n\t\t\t&:not(:focus) {\n\t\t\t\tborder-top: 1px solid var(--ck-color-base-border);\n\t\t\t}\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tmargin-left: 0;\n\n\t\t\t\t&:last-of-type {\n\t\t\t\t\tborder-right: 1px solid var(--ck-color-base-border);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n'],sourceRoot:""}]);const a=s},8107:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-search>.ck-labeled-field-view>.ck-labeled-field-view__input-wrapper>.ck-icon{position:absolute;top:50%;transform:translateY(-50%)}[dir=ltr] .ck.ck-search>.ck-labeled-field-view>.ck-labeled-field-view__input-wrapper>.ck-icon{left:var(--ck-spacing-medium)}[dir=rtl] .ck.ck-search>.ck-labeled-field-view>.ck-labeled-field-view__input-wrapper>.ck-icon{right:var(--ck-spacing-medium)}.ck.ck-search>.ck-labeled-field-view .ck-search__reset{position:absolute;top:50%;transform:translateY(-50%)}.ck.ck-search>.ck-search__results>.ck-search__info>span:first-child{display:block}.ck.ck-search>.ck-search__results>.ck-search__info:not(.ck-hidden)~*{display:none}:root{--ck-search-field-view-horizontal-spacing:calc(var(--ck-icon-size) + var(--ck-spacing-medium))}.ck.ck-search>.ck-labeled-field-view .ck-input{width:100%}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon{--ck-labeled-field-label-default-position-x:var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon>.ck-labeled-field-view__input-wrapper>.ck-icon{opacity:.5;pointer-events:none}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon .ck-input{width:100%}[dir=ltr] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon .ck-input,[dir=rtl] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-icon .ck-input:not(.ck-input-text_empty){padding-left:var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset{--ck-labeled-field-empty-unfocused-max-width:100% - 2 * var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset.ck-labeled-field-view_empty{--ck-labeled-field-empty-unfocused-max-width:100% - var(--ck-search-field-view-horizontal-spacing) - var(--ck-spacing-medium)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset{background:none;min-height:auto;min-width:auto;opacity:.5;padding:0}[dir=ltr] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset{right:var(--ck-spacing-medium)}[dir=rtl] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset{left:var(--ck-spacing-medium)}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-search__reset:hover{opacity:1}.ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-input{width:100%}[dir=ltr] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-input:not(.ck-input-text_empty),[dir=rtl] .ck.ck-search>.ck-labeled-field-view.ck-search__query_with-reset .ck-input{padding-right:var(--ck-search-field-view-horizontal-spacing)}.ck.ck-search>.ck-search__results{min-width:100%}.ck.ck-search>.ck-search__results>.ck-search__info{padding:var(--ck-spacing-medium) var(--ck-spacing-large);width:100%}.ck.ck-search>.ck-search__results>.ck-search__info *{white-space:normal}.ck.ck-search>.ck-search__results>.ck-search__info>span:first-child{font-weight:700}.ck.ck-search>.ck-search__results>.ck-search__info>span:last-child{margin-top:var(--ck-spacing-medium)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/search/search.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/search/search.css"],names:[],mappings:"AASE,oFACC,iBAAkB,CAClB,OAAQ,CACR,0BASD,CAZA,8FAME,6BAMF,CAZA,8FAUE,8BAEF,CAEA,uDACC,iBAAkB,CAClB,OAAQ,CACR,0BACD,CAKC,oEACC,aACD,CAGA,qEACC,YACD,CChCH,MACC,8FACD,CAIE,+CACC,UACD,CAEA,gEACC,0FAoBD,CAlBC,+GACC,UAAW,CACX,mBACD,CAEA,0EACC,UAWD,CAJE,kMACC,2DACD,CAKH,iEACC,sGAwCD,CAtCC,6FACC,6HACD,CAEA,mFAIC,eAAgB,CAFhB,eAAgB,CADhB,cAAe,CAIf,UAAW,CACX,SAaD,CAnBA,6FASE,8BAUF,CAnBA,6FAaE,6BAMF,CAHC,yFACC,SACD,CAGD,2EACC,UAWD,CAZA,oMAUE,4DAEF,CAIF,kCACC,cAkBD,CAhBC,mDAEC,wDAAyD,CADzD,UAcD,CAXC,qDACC,kBACD,CAEA,oEACC,eACD,CAEA,mEACC,mCACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-search {\n\t& > .ck-labeled-field-view {\n\t\t& > .ck-labeled-field-view__input-wrapper > .ck-icon {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\ttransform: translateY(-50%);\n\n\t\t\t@mixin ck-dir ltr {\n\t\t\t\tleft: var(--ck-spacing-medium);\n\t\t\t}\n\n\t\t\t@mixin ck-dir rtl {\n\t\t\t\tright: var(--ck-spacing-medium);\n\t\t\t}\n\t\t}\n\n\t\t& .ck-search__reset {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\t}\n\n\t& > .ck-search__results {\n\t\t& > .ck-search__info {\n\t\t\t& > span:first-child {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t/* Hide the filtered view when nothing was found */\n\t\t\t&:not(.ck-hidden) ~ * {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\t}\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n:root {\n\t--ck-search-field-view-horizontal-spacing: calc(var(--ck-icon-size) + var(--ck-spacing-medium));\n}\n\n.ck.ck-search {\n\t& > .ck-labeled-field-view {\n\t\t& .ck-input {\n\t\t\twidth: 100%;\n\t\t}\n\n\t\t&.ck-search__query_with-icon {\n\t\t\t--ck-labeled-field-label-default-position-x: var(--ck-search-field-view-horizontal-spacing);\n\n\t\t\t& > .ck-labeled-field-view__input-wrapper > .ck-icon {\n\t\t\t\topacity: .5;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\n\t\t\t& .ck-input {\n\t\t\t\twidth: 100%;\n\n\t\t\t\t@mixin ck-dir ltr {\n\t\t\t\t\tpadding-left: var(--ck-search-field-view-horizontal-spacing);\n\t\t\t\t}\n\n\t\t\t\t@mixin ck-dir rtl {\n\t\t\t\t\t&:not(.ck-input-text_empty) {\n\t\t\t\t\t\tpadding-left: var(--ck-search-field-view-horizontal-spacing);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&.ck-search__query_with-reset {\n\t\t\t--ck-labeled-field-empty-unfocused-max-width: 100% - 2 * var(--ck-search-field-view-horizontal-spacing);\n\n\t\t\t&.ck-labeled-field-view_empty {\n\t\t\t\t--ck-labeled-field-empty-unfocused-max-width: 100% - var(--ck-search-field-view-horizontal-spacing) - var(--ck-spacing-medium);\n\t\t\t}\n\n\t\t\t& .ck-search__reset {\n\t\t\t\tmin-width: auto;\n\t\t\t\tmin-height: auto;\n\n\t\t\t\tbackground: none;\n\t\t\t\topacity: .5;\n\t\t\t\tpadding: 0;\n\n\t\t\t\t@mixin ck-dir ltr {\n\t\t\t\t\tright: var(--ck-spacing-medium);\n\t\t\t\t}\n\n\t\t\t\t@mixin ck-dir rtl {\n\t\t\t\t\tleft: var(--ck-spacing-medium);\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t& .ck-input {\n\t\t\t\twidth: 100%;\n\n\t\t\t\t@mixin ck-dir ltr {\n\t\t\t\t\t&:not(.ck-input-text_empty) {\n\t\t\t\t\t\tpadding-right: var(--ck-search-field-view-horizontal-spacing);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t@mixin ck-dir rtl {\n\t\t\t\t\tpadding-right: var(--ck-search-field-view-horizontal-spacing);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck-search__results {\n\t\tmin-width: 100%;\n\n\t\t& > .ck-search__info {\n\t\t\twidth: 100%;\n\t\t\tpadding: var(--ck-spacing-medium) var(--ck-spacing-large);\n\n\t\t\t& * {\n\t\t\t\twhite-space: normal;\n\t\t\t}\n\n\t\t\t& > span:first-child {\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\n\t\t\t& > span:last-child {\n\t\t\t\tmargin-top: var(--ck-spacing-medium);\n\t\t\t}\n\t\t}\n\t}\n}\n\n'],sourceRoot:""}]);const a=s},109:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-spinner-container{display:block;position:relative}.ck.ck-spinner{left:0;margin:0 auto;position:absolute;right:0;top:50%;transform:translateY(-50%);z-index:1}:root{--ck-toolbar-spinner-size:18px}.ck.ck-spinner-container{animation:rotate 1.5s linear infinite}.ck.ck-spinner,.ck.ck-spinner-container{height:var(--ck-toolbar-spinner-size);width:var(--ck-toolbar-spinner-size)}.ck.ck-spinner{border:2px solid var(--ck-color-text);border-radius:50%;border-top:2px solid transparent}@keyframes rotate{to{transform:rotate(1turn)}}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/spinner/spinner.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/spinner/spinner.css"],names:[],mappings:"AASA,yBACC,aAAc,CACd,iBACD,CAEA,eAGC,MAAO,CAEP,aAAc,CAJd,iBAAkB,CAGlB,OAAQ,CAFR,OAAQ,CAIR,0BAA2B,CAC3B,SACD,CCjBA,MACC,8BACD,CAEA,yBAGC,qCACD,CAEA,wCAJC,qCAAsC,CADtC,oCAWD,CANA,eAKC,qCAA6B,CAF7B,iBAAkB,CAElB,gCACD,CAEA,kBACC,GACC,uBACD,CACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-spinner-size: 18px;\n}\n\n.ck.ck-spinner-container {\n\tdisplay: block;\n\tposition: relative;\n}\n\n.ck.ck-spinner {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 0;\n\tright: 0;\n\tmargin: 0 auto;\n\ttransform: translateY(-50%);\n\tz-index: 1;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-toolbar-spinner-size: 18px;\n}\n\n.ck.ck-spinner-container {\n\twidth: var(--ck-toolbar-spinner-size);\n\theight: var(--ck-toolbar-spinner-size);\n\tanimation: 1.5s infinite rotate linear;\n}\n\n.ck.ck-spinner {\n\twidth: var(--ck-toolbar-spinner-size);\n\theight: var(--ck-toolbar-spinner-size);\n\tborder-radius: 50%;\n\tborder: 2px solid var(--ck-color-text);\n\tborder-top-color: transparent;\n}\n\n@keyframes rotate {\n\tto {\n\t\ttransform: rotate(360deg)\n\t}\n}\n\n"],sourceRoot:""}]);const a=s},1671:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-textarea{overflow-x:hidden}","",{version:3,sources:["webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/textarea/textarea.css"],names:[],mappings:"AASA,aACC,iBACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/*\n * This fixes a problem in Firefox when the initial height of the complement does not match the number of rows.\n * This bug is especially visible when rows=1.\n */\n.ck-textarea {\n\toverflow-x: hidden\n}\n"],sourceRoot:""}]);const a=s},2710:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-block-toolbar-button{position:absolute;z-index:var(--ck-z-default)}:root{--ck-color-block-toolbar-button:var(--ck-color-text);--ck-block-toolbar-button-size:var(--ck-font-size-normal)}.ck.ck-block-toolbar-button{color:var(--ck-color-block-toolbar-button);font-size:var(--ck-block-toolbar-size)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/toolbar/blocktoolbar.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/blocktoolbar.css"],names:[],mappings:"AAKA,4BACC,iBAAkB,CAClB,2BACD,CCHA,MACC,oDAAqD,CACrD,yDACD,CAEA,4BACC,0CAA2C,CAC3C,sCACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-block-toolbar-button {\n\tposition: absolute;\n\tz-index: var(--ck-z-default);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-block-toolbar-button: var(--ck-color-text);\n\t--ck-block-toolbar-button-size: var(--ck-font-size-normal);\n}\n\n.ck.ck-block-toolbar-button {\n\tcolor: var(--ck-color-block-toolbar-button);\n\tfont-size: var(--ck-block-toolbar-size);\n}\n"],sourceRoot:""}]);const a=s},9677:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-toolbar{align-items:center;display:flex;flex-flow:row nowrap;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ck.ck-toolbar>.ck-toolbar__items{align-items:center;display:flex;flex-flow:row wrap;flex-grow:1}.ck.ck-toolbar .ck.ck-toolbar__separator{display:inline-block}.ck.ck-toolbar .ck.ck-toolbar__separator:first-child,.ck.ck-toolbar .ck.ck-toolbar__separator:last-child{display:none}.ck.ck-toolbar .ck-toolbar__line-break{flex-basis:100%}.ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items{flex-direction:column}.ck.ck-toolbar.ck-toolbar_floating>.ck-toolbar__items{flex-wrap:nowrap}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck-dropdown__button .ck-dropdown__arrow{display:none}.ck.ck-toolbar{border-radius:0}.ck-rounded-corners .ck.ck-toolbar,.ck.ck-toolbar.ck-rounded-corners{border-radius:var(--ck-border-radius)}.ck.ck-toolbar{background:var(--ck-color-toolbar-background);border:1px solid var(--ck-color-toolbar-border);padding:0 var(--ck-spacing-small)}.ck.ck-toolbar .ck.ck-toolbar__separator{align-self:stretch;background:var(--ck-color-toolbar-border);margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small);min-width:1px;width:1px}.ck.ck-toolbar .ck-toolbar__line-break{height:0}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break){margin-right:var(--ck-spacing-small)}.ck.ck-toolbar>.ck-toolbar__items:empty+.ck.ck-toolbar__separator{display:none}.ck.ck-toolbar>.ck-toolbar__items>:not(.ck-toolbar__line-break),.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown{margin-bottom:var(--ck-spacing-small);margin-top:var(--ck-spacing-small)}.ck.ck-toolbar.ck-toolbar_vertical{padding:0}.ck.ck-toolbar.ck-toolbar_vertical>.ck-toolbar__items>.ck{border-radius:0;margin:0;width:100%}.ck.ck-toolbar.ck-toolbar_compact{padding:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>*{margin:0}.ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>:not(:first-child):not(:last-child){border-radius:0}.ck.ck-toolbar>.ck.ck-toolbar__grouped-dropdown>.ck.ck-button.ck-dropdown__button{padding-left:var(--ck-spacing-tiny)}.ck.ck-toolbar .ck-toolbar__nested-toolbar-dropdown>.ck-dropdown__panel{min-width:auto}.ck.ck-toolbar .ck-toolbar__nested-toolbar-dropdown>.ck-button>.ck-button__label{max-width:7em;width:auto}.ck.ck-toolbar:focus{outline:none}.ck-toolbar-container .ck.ck-toolbar{border:0}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck{margin-right:0}.ck.ck-toolbar[dir=rtl]:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck,[dir=rtl] .ck.ck-toolbar:not(.ck-toolbar_compact)>.ck-toolbar__items>.ck{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-left:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:first-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=rtl]>.ck-toolbar__items>.ck:last-child,[dir=rtl] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=rtl]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=rtl]>.ck.ck-toolbar__separator,[dir=rtl] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=rtl] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-left:var(--ck-spacing-small)}.ck.ck-toolbar[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar>.ck-toolbar__items>.ck:last-child{margin-right:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:first-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.ck.ck-toolbar.ck-toolbar_compact[dir=ltr]>.ck-toolbar__items>.ck:last-child,[dir=ltr] .ck.ck-toolbar.ck-toolbar_compact>.ck-toolbar__items>.ck:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.ck.ck-toolbar.ck-toolbar_grouping[dir=ltr]>.ck-toolbar__items:not(:empty):not(:only-child),.ck.ck-toolbar[dir=ltr]>.ck.ck-toolbar__separator,[dir=ltr] .ck.ck-toolbar.ck-toolbar_grouping>.ck-toolbar__items:not(:empty):not(:only-child),[dir=ltr] .ck.ck-toolbar>.ck.ck-toolbar__separator{margin-right:var(--ck-spacing-small)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/toolbar/toolbar.css","webpack://./../ckeditor5-ui/theme/mixins/_unselectable.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/toolbar/toolbar.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_rounded.css"],names:[],mappings:"AAOA,eAKC,kBAAmB,CAFnB,YAAa,CACb,oBAAqB,CCFrB,qBAAsB,CACtB,wBAAyB,CACzB,oBAAqB,CACrB,gBD6CD,CA3CC,kCAGC,kBAAmB,CAFnB,YAAa,CACb,kBAAmB,CAEnB,WAED,CAEA,yCACC,oBAWD,CAJC,yGAEC,YACD,CAGD,uCACC,eACD,CAEA,sDACC,gBACD,CAEA,sDACC,qBACD,CAEA,sDACC,gBACD,CAGC,yFACC,YACD,CE/CF,eCGC,eDwGD,CA3GA,qECOE,qCDoGF,CA3GA,eAGC,6CAA8C,CAE9C,+CAAgD,CADhD,iCAuGD,CApGC,yCACC,kBAAmB,CAGnB,yCAA0C,CAO1C,qCAAsC,CADtC,kCAAmC,CAPnC,aAAc,CADd,SAUD,CAEA,uCACC,QACD,CAGC,gEAEC,oCACD,CAIA,kEACC,YACD,CAGD,gHAIC,qCAAsC,CADtC,kCAED,CAEA,mCAEC,SAaD,CAVC,0DAQC,eAAgB,CAHhB,QAAS,CAHT,UAOD,CAGD,kCAEC,SAWD,CATC,uDAEC,QAMD,CAHC,yFACC,eACD,CASD,kFACC,mCACD,CAMA,wEACC,cACD,CAEA,iFACC,aAAc,CACd,UACD,CAGD,qBACC,YACD,CAtGD,qCAyGE,QAEF,CAYC,+FACC,cACD,CAEA,iJAEC,mCACD,CAEA,qHACC,aACD,CAIC,6JAEC,2BAA4B,CAD5B,wBAED,CAGA,2JAEC,4BAA6B,CAD7B,yBAED,CASD,8RACC,mCACD,CAWA,qHACC,cACD,CAIC,6JAEC,4BAA6B,CAD7B,yBAED,CAGA,2JAEC,2BAA4B,CAD5B,wBAED,CASD,8RACC,oCACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../mixins/_unselectable.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-unselectable;\n\n\tdisplay: flex;\n\tflex-flow: row nowrap;\n\talign-items: center;\n\n\t& > .ck-toolbar__items {\n\t\tdisplay: flex;\n\t\tflex-flow: row wrap;\n\t\talign-items: center;\n\t\tflex-grow: 1;\n\n\t}\n\n\t& .ck.ck-toolbar__separator {\n\t\tdisplay: inline-block;\n\n\t\t/*\n\t\t * A leading or trailing separator makes no sense (separates from nothing on one side).\n\t\t * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and\n\t\t * moved to another toolbar in the dropdown.\n\t\t */\n\t\t&:first-child,\n\t\t&:last-child {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\tflex-basis: 100%;\n\t}\n\n\t&.ck-toolbar_grouping > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.ck-toolbar_vertical > .ck-toolbar__items {\n\t\tflex-direction: column;\n\t}\n\n\t&.ck-toolbar_floating > .ck-toolbar__items {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t& > .ck-dropdown__button .ck-dropdown__arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Makes element unselectable.\n */\n@define-mixin ck-unselectable {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css";\n\n.ck.ck-toolbar {\n\t@mixin ck-rounded-corners;\n\n\tbackground: var(--ck-color-toolbar-background);\n\tpadding: 0 var(--ck-spacing-small);\n\tborder: 1px solid var(--ck-color-toolbar-border);\n\n\t& .ck.ck-toolbar__separator {\n\t\talign-self: stretch;\n\t\twidth: 1px;\n\t\tmin-width: 1px;\n\t\tbackground: var(--ck-color-toolbar-border);\n\n\t\t/*\n\t\t * These margins make the separators look better in balloon toolbars (when aligned with the "tip").\n\t\t * See https://github.com/ckeditor/ckeditor5/issues/7493.\n\t\t */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t& .ck-toolbar__line-break {\n\t\theight: 0;\n\t}\n\n\t& > .ck-toolbar__items {\n\t\t& > *:not(.ck-toolbar__line-break) {\n\t\t\t/* (#11) Separate toolbar items. */\n\t\t\tmargin-right: var(--ck-spacing-small);\n\t\t}\n\n\t\t/* Don\'t display a separator after an empty items container, for instance,\n\t\twhen all items were grouped */\n\t\t&:empty + .ck.ck-toolbar__separator {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t& > .ck-toolbar__items > *:not(.ck-toolbar__line-break),\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/* Make sure items wrapped to the next line have v-spacing */\n\t\tmargin-top: var(--ck-spacing-small);\n\t\tmargin-bottom: var(--ck-spacing-small);\n\t}\n\n\t&.ck-toolbar_vertical {\n\t\t/* Items in a vertical toolbar span the entire width. */\n\t\tpadding: 0;\n\n\t\t/* Specificity matters here. See https://github.com/ckeditor/ckeditor5-theme-lark/issues/168. */\n\t\t& > .ck-toolbar__items > .ck {\n\t\t\t/* Items in a vertical toolbar should span the horizontal space. */\n\t\t\twidth: 100%;\n\n\t\t\t/* Items in a vertical toolbar should have no margin. */\n\t\t\tmargin: 0;\n\n\t\t\t/* Items in a vertical toolbar span the entire width so rounded corners are pointless. */\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n\n\t&.ck-toolbar_compact {\n\t\t/* No spacing around items. */\n\t\tpadding: 0;\n\n\t\t& > .ck-toolbar__items > * {\n\t\t\t/* Compact toolbar items have no spacing between them. */\n\t\t\tmargin: 0;\n\n\t\t\t/* "Middle" children should have no rounded corners. */\n\t\t\t&:not(:first-child):not(:last-child) {\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t& > .ck.ck-toolbar__grouped-dropdown {\n\t\t/*\n\t\t * Dropdown button has asymmetric padding to fit the arrow.\n\t\t * This button has no arrow so let\'s revert that padding back to normal.\n\t\t */\n\t\t& > .ck.ck-button.ck-dropdown__button {\n\t\t\tpadding-left: var(--ck-spacing-tiny);\n\t\t}\n\t}\n\n\t/* A drop-down containing the nested toolbar with configured items. */\n\t& .ck-toolbar__nested-toolbar-dropdown {\n\t\t/* Prevent empty space in the panel when the dropdown label is visible and long but the toolbar has few items. */\n\t\t& > .ck-dropdown__panel {\n\t\t\tmin-width: auto;\n\t\t}\n\n\t\t& > .ck-button > .ck-button__label {\n\t\t\tmax-width: 7em;\n\t\t\twidth: auto;\n\t\t}\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n\n\t@nest .ck-toolbar-container & {\n\t\tborder: 0;\n\t}\n}\n\n/* stylelint-disable */\n\n/*\n * Styles for RTL toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="rtl"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="rtl"] {\n\t& > .ck-toolbar__items > .ck {\n\t\tmargin-right: 0;\n\t}\n\n\t&:not(.ck-toolbar_compact) > .ck-toolbar__items > .ck {\n\t\t/* (#11) Separate toolbar items. */\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-left: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-left: var(--ck-spacing-small);\n\t}\n}\n\n/*\n * Styles for LTR toolbars.\n *\n * Note: In some cases (e.g. a decoupled editor), the toolbar has its own "dir"\n * because its parent is not controlled by the editor framework.\n */\n[dir="ltr"] .ck.ck-toolbar,\n.ck.ck-toolbar[dir="ltr"] {\n\t& > .ck-toolbar__items > .ck:last-child {\n\t\tmargin-right: 0;\n\t}\n\n\t&.ck-toolbar_compact > .ck-toolbar__items > .ck {\n\t\t/* No rounded corners on the right side of the first child. */\n\t\t&:first-child {\n\t\t\tborder-top-right-radius: 0;\n\t\t\tborder-bottom-right-radius: 0;\n\t\t}\n\n\t\t/* No rounded corners on the left side of the last child. */\n\t\t&:last-child {\n\t\t\tborder-top-left-radius: 0;\n\t\t\tborder-bottom-left-radius: 0;\n\t\t}\n\t}\n\n\t/* Separate the the separator form the grouping dropdown when some items are grouped. */\n\t& > .ck.ck-toolbar__separator {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n\n\t/* Some spacing between the items and the separator before the grouped items dropdown. */\n\t&.ck-toolbar_grouping > .ck-toolbar__items:not(:empty):not(:only-child) {\n\t\tmargin-right: var(--ck-spacing-small);\n\t}\n}\n\n/* stylelint-enable */\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Implements rounded corner interface for .ck-rounded-corners class.\n *\n * @see $ck-border-radius\n */\n@define-mixin ck-rounded-corners {\n\tborder-radius: 0;\n\n\t@nest .ck-rounded-corners &,\n\t&.ck-rounded-corners {\n\t\tborder-radius: var(--ck-border-radius);\n\t\t@mixin-content;\n\t}\n}\n"],sourceRoot:""}]);const a=s},9205:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck.ck-balloon-panel.ck-tooltip{--ck-balloon-border-width:0px;--ck-balloon-arrow-offset:0px;--ck-balloon-arrow-half-width:4px;--ck-balloon-arrow-height:4px;--ck-tooltip-text-padding:4px;--ck-color-panel-background:var(--ck-color-tooltip-background);padding:0 var(--ck-spacing-medium);z-index:calc(var(--ck-z-dialog) + 100)}.ck.ck-balloon-panel.ck-tooltip .ck-tooltip__text{color:var(--ck-color-tooltip-text);font-size:.9em;line-height:1.5}.ck.ck-balloon-panel.ck-tooltip.ck-tooltip_multi-line .ck-tooltip__text{display:inline-block;max-width:200px;padding:var(--ck-tooltip-text-padding) 0;white-space:break-spaces}.ck.ck-balloon-panel.ck-tooltip{box-shadow:none}.ck.ck-balloon-panel.ck-tooltip:before{display:none}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/components/tooltip/tooltip.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/components/tooltip/tooltip.css"],names:[],mappings:"AAKA,gCCGC,6BAA8B,CAC9B,6BAA8B,CAC9B,iCAAkC,CAClC,6BAA8B,CAC9B,6BAA8B,CAC9B,8DAA+D,CAE/D,kCAAmC,CDTnC,sCACD,CCUC,kDAGC,kCAAmC,CAFnC,cAAe,CACf,eAED,CAEA,wEAEC,oBAAqB,CAErB,eAAgB,CADhB,wCAAyC,CAFzC,wBAID,CArBD,gCAwBC,eAMD,CAHC,uCACC,YACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-balloon-panel.ck-tooltip {\n\tz-index: calc( var(--ck-z-dialog) + 100 );\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../../../mixins/_rounded.css";\n\n.ck.ck-balloon-panel.ck-tooltip {\n\t--ck-balloon-border-width: 0px;\n\t--ck-balloon-arrow-offset: 0px;\n\t--ck-balloon-arrow-half-width: 4px;\n\t--ck-balloon-arrow-height: 4px;\n\t--ck-tooltip-text-padding: 4px;\n\t--ck-color-panel-background: var(--ck-color-tooltip-background);\n\n\tpadding: 0 var(--ck-spacing-medium);\n\n\t& .ck-tooltip__text {\n\t\tfont-size: .9em;\n\t\tline-height: 1.5;\n\t\tcolor: var(--ck-color-tooltip-text);\n\t}\n\n\t&.ck-tooltip_multi-line .ck-tooltip__text {\n\t\twhite-space: break-spaces;\n\t\tdisplay: inline-block;\n\t\tpadding: var(--ck-tooltip-text-padding) 0;\n\t\tmax-width: 200px;\n\t}\n\n\t/* Reset balloon panel styles */\n\tbox-shadow: none;\n\n\t/* Hide the default shadow of the .ck-balloon-panel tip */\n\t&::before {\n\t\tdisplay: none;\n\t}\n}\n'],sourceRoot:""}]);const a=s},7676:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck-hidden{display:none!important}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{box-sizing:border-box;height:auto;position:static;width:auto}:root{--ck-z-default:1;--ck-z-panel:calc(var(--ck-z-default) + 999);--ck-z-dialog:9999}.ck-transitions-disabled,.ck-transitions-disabled *{transition:none!important}:root{--ck-powered-by-line-height:10px;--ck-powered-by-padding-vertical:2px;--ck-powered-by-padding-horizontal:4px;--ck-powered-by-text-color:#4f4f4f;--ck-powered-by-border-radius:var(--ck-border-radius);--ck-powered-by-background:#fff;--ck-powered-by-border-color:var(--ck-color-focus-border)}.ck.ck-balloon-panel.ck-powered-by-balloon{--ck-border-radius:var(--ck-powered-by-border-radius);background:var(--ck-powered-by-background);box-shadow:none;min-height:unset;z-index:calc(var(--ck-z-panel) - 1)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by{line-height:var(--ck-powered-by-line-height)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by a{align-items:center;cursor:pointer;display:flex;filter:grayscale(80%);line-height:var(--ck-powered-by-line-height);opacity:.66;padding:var(--ck-powered-by-padding-vertical) var(--ck-powered-by-padding-horizontal)}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ck-powered-by__label{color:var(--ck-powered-by-text-color);cursor:pointer;font-size:7.5px;font-weight:700;letter-spacing:-.2px;line-height:normal;margin-right:4px;padding-left:2px;text-transform:uppercase}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by .ck-icon{cursor:pointer;display:block}.ck.ck-balloon-panel.ck-powered-by-balloon .ck.ck-powered-by:hover a{filter:grayscale(0);opacity:1}.ck.ck-balloon-panel.ck-powered-by-balloon[class*=position_inside]{border-color:transparent}.ck.ck-balloon-panel.ck-powered-by-balloon[class*=position_border]{border:var(--ck-focus-ring);border-color:var(--ck-powered-by-border-color)}:root{--ck-color-base-foreground:#fafafa;--ck-color-base-background:#fff;--ck-color-base-border:#ccced1;--ck-color-base-action:#53a336;--ck-color-base-focus:#6cb5f9;--ck-color-base-text:#333;--ck-color-base-active:#2977ff;--ck-color-base-active-focus:#0d65ff;--ck-color-base-error:#db3700;--ck-color-focus-border-coordinates:218,81.8%,56.9%;--ck-color-focus-border:hsl(var(--ck-color-focus-border-coordinates));--ck-color-focus-outer-shadow:#cae1fc;--ck-color-focus-disabled-shadow:rgba(119,186,248,.3);--ck-color-focus-error-shadow:rgba(255,64,31,.3);--ck-color-text:var(--ck-color-base-text);--ck-color-shadow-drop:rgba(0,0,0,.15);--ck-color-shadow-drop-active:rgba(0,0,0,.2);--ck-color-shadow-inner:rgba(0,0,0,.1);--ck-color-button-default-background:transparent;--ck-color-button-default-hover-background:#f0f0f0;--ck-color-button-default-active-background:#f0f0f0;--ck-color-button-default-disabled-background:transparent;--ck-color-button-on-background:#f0f7ff;--ck-color-button-on-hover-background:#dbecff;--ck-color-button-on-active-background:#dbecff;--ck-color-button-on-disabled-background:#f0f2f4;--ck-color-button-on-color:#2977ff;--ck-color-button-action-background:var(--ck-color-base-action);--ck-color-button-action-hover-background:#4d9d30;--ck-color-button-action-active-background:#4d9d30;--ck-color-button-action-disabled-background:#7ec365;--ck-color-button-action-text:var(--ck-color-base-background);--ck-color-button-save:#008a00;--ck-color-button-cancel:#db3700;--ck-color-switch-button-off-background:#939393;--ck-color-switch-button-off-hover-background:#7d7d7d;--ck-color-switch-button-on-background:var(--ck-color-button-action-background);--ck-color-switch-button-on-hover-background:#4d9d30;--ck-color-switch-button-inner-background:var(--ck-color-base-background);--ck-color-switch-button-inner-shadow:rgba(0,0,0,.1);--ck-color-dropdown-panel-background:var(--ck-color-base-background);--ck-color-dropdown-panel-border:var(--ck-color-base-border);--ck-color-dialog-background:var(--ck-custom-background);--ck-color-dialog-form-header-border:var(--ck-custom-border);--ck-color-input-background:var(--ck-color-base-background);--ck-color-input-border:var(--ck-color-base-border);--ck-color-input-error-border:var(--ck-color-base-error);--ck-color-input-text:var(--ck-color-base-text);--ck-color-input-disabled-background:#f2f2f2;--ck-color-input-disabled-border:var(--ck-color-base-border);--ck-color-input-disabled-text:#757575;--ck-color-list-background:var(--ck-color-base-background);--ck-color-list-button-hover-background:var(--ck-color-button-default-hover-background);--ck-color-list-button-on-background:var(--ck-color-button-on-color);--ck-color-list-button-on-background-focus:var(--ck-color-button-on-color);--ck-color-list-button-on-text:var(--ck-color-base-background);--ck-color-panel-background:var(--ck-color-base-background);--ck-color-panel-border:var(--ck-color-base-border);--ck-color-toolbar-background:var(--ck-color-base-background);--ck-color-toolbar-border:var(--ck-color-base-border);--ck-color-tooltip-background:var(--ck-color-base-text);--ck-color-tooltip-text:var(--ck-color-base-background);--ck-color-engine-placeholder-text:#707070;--ck-color-upload-bar-background:#6cb5f9;--ck-color-link-default:#0000f0;--ck-color-link-selected-background:rgba(31,176,255,.1);--ck-color-link-fake-selection:rgba(31,176,255,.3);--ck-color-highlight-background:#ff0;--ck-color-light-red:#fcc;--ck-disabled-opacity:.5;--ck-focus-outer-shadow-geometry:0 0 0 3px;--ck-focus-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);--ck-focus-disabled-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);--ck-focus-error-outer-shadow:var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);--ck-focus-ring:1px solid var(--ck-color-focus-border);--ck-font-size-base:13px;--ck-line-height-base:1.84615;--ck-font-face:Helvetica,Arial,Tahoma,Verdana,Sans-Serif;--ck-font-size-tiny:0.7em;--ck-font-size-small:0.75em;--ck-font-size-normal:1em;--ck-font-size-big:1.4em;--ck-font-size-large:1.8em;--ck-ui-component-min-height:2.3em}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset,.ck.ck-reset_all{word-wrap:break-word;background:transparent;border:0;margin:0;padding:0;text-decoration:none;transition:none;vertical-align:middle}.ck-reset_all :not(.ck-reset_all-excluded *),.ck.ck-reset_all{border-collapse:collapse;color:var(--ck-color-text);cursor:auto;float:none;font:normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);text-align:left;white-space:nowrap}.ck-reset_all .ck-rtl :not(.ck-reset_all-excluded *){text-align:right}.ck-reset_all iframe:not(.ck-reset_all-excluded *){vertical-align:inherit}.ck-reset_all textarea:not(.ck-reset_all-excluded *){white-space:pre-wrap}.ck-reset_all input[type=password]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text]:not(.ck-reset_all-excluded *),.ck-reset_all textarea:not(.ck-reset_all-excluded *){cursor:text}.ck-reset_all input[type=password][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all input[type=text][disabled]:not(.ck-reset_all-excluded *),.ck-reset_all textarea[disabled]:not(.ck-reset_all-excluded *){cursor:default}.ck-reset_all fieldset:not(.ck-reset_all-excluded *){border:2px groove #dfdee3;padding:10px}.ck-reset_all button:not(.ck-reset_all-excluded *)::-moz-focus-inner{border:0;padding:0}.ck[dir=rtl],.ck[dir=rtl] .ck{text-align:right}:root{--ck-border-radius:2px;--ck-inner-shadow:2px 2px 3px var(--ck-color-shadow-inner) inset;--ck-drop-shadow:0 1px 2px 1px var(--ck-color-shadow-drop);--ck-drop-shadow-active:0 3px 6px 1px var(--ck-color-shadow-drop-active);--ck-spacing-unit:0.6em;--ck-spacing-large:calc(var(--ck-spacing-unit)*1.5);--ck-spacing-standard:var(--ck-spacing-unit);--ck-spacing-medium:calc(var(--ck-spacing-unit)*0.8);--ck-spacing-small:calc(var(--ck-spacing-unit)*0.5);--ck-spacing-tiny:calc(var(--ck-spacing-unit)*0.3);--ck-spacing-extra-tiny:calc(var(--ck-spacing-unit)*0.16)}","",{version:3,sources:["webpack://./../ckeditor5-ui/theme/globals/_hidden.css","webpack://./../ckeditor5-ui/theme/globals/_reset.css","webpack://./../ckeditor5-ui/theme/globals/_zindex.css","webpack://./../ckeditor5-ui/theme/globals/_transition.css","webpack://./../ckeditor5-ui/theme/globals/_poweredby.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_colors.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_disabled.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_focus.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_fonts.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_reset.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_rounded.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_shadow.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-ui/globals/_spacing.css"],names:[],mappings:"AAQA,WAGC,sBACD,CCPA,2EAGC,qBAAsB,CAEtB,WAAY,CACZ,eAAgB,CAFhB,UAGD,CCPA,MACC,gBAAiB,CACjB,4CAA+C,CAC/C,kBACD,CCDA,oDAEC,yBACD,CCNA,MACC,gCAAiC,CACjC,oCAAqC,CACrC,sCAAuC,CACvC,kCAA2C,CAC3C,qDAAsD,CACtD,+BAA4C,CAC5C,yDACD,CAEA,2CACC,qDAAsD,CAGtD,0CAA2C,CAD3C,eAAgB,CAEhB,gBAAiB,CACjB,mCAiDD,CA/CC,6DACC,4CAoCD,CAlCC,+DAGC,kBAAmB,CAFnB,cAAe,CACf,YAAa,CAGb,qBAAsB,CACtB,4CAA6C,CAF7C,WAAY,CAGZ,qFACD,CAEA,mFASC,qCAAsC,CAFtC,cAAe,CANf,eAAgB,CAIhB,eAAiB,CAHjB,oBAAqB,CAMrB,kBAAmB,CAFnB,gBAAiB,CAHjB,gBAAiB,CACjB,wBAOD,CAEA,sEAEC,cAAe,CADf,aAED,CAGC,qEACC,mBAAqB,CACrB,SACD,CAIF,mEACC,wBACD,CAEA,mEACC,2BAA4B,CAC5B,8CACD,CChED,MACC,kCAAmD,CACnD,+BAAoD,CACpD,8BAAkD,CAClD,8BAAuD,CACvD,6BAAmD,CACnD,yBAA+C,CAC/C,8BAAsD,CACtD,oCAA4D,CAC5D,6BAAkD,CAIlD,mDAA4D,CAC5D,qEAA+E,CAC/E,qCAA4D,CAC5D,qDAA8D,CAC9D,gDAAyD,CACzD,yCAAqD,CACrD,sCAAsD,CACtD,4CAA0D,CAC1D,sCAAsD,CAItD,gDAAuD,CACvD,kDAAiE,CACjE,mDAAkE,CAClE,yDAA8D,CAE9D,uCAA6D,CAC7D,6CAAoE,CACpE,8CAAoE,CACpE,gDAAiE,CACjE,kCAAyD,CAGzD,+DAAsE,CACtE,iDAAsE,CACtE,kDAAsE,CACtE,oDAAoE,CACpE,6DAAsE,CAEtE,8BAAoD,CACpD,gCAAqD,CAErD,+CAA8D,CAC9D,qDAAiE,CACjE,+EAAqF,CACrF,oDAAuE,CACvE,yEAA8E,CAC9E,oDAAgE,CAIhE,oEAA2E,CAC3E,4DAAoE,CAIpE,wDAAiE,CACjE,4DAAmE,CAInE,2DAAoE,CACpE,mDAA6D,CAC7D,wDAAgE,CAChE,+CAA0D,CAC1D,4CAA2D,CAC3D,4DAAoE,CACpE,sCAAsD,CAItD,0DAAmE,CACnE,uFAA6F,CAC7F,oEAA2E,CAC3E,0EAA+E,CAC/E,8DAAsE,CAItE,2DAAoE,CACpE,mDAA6D,CAI7D,6DAAsE,CACtE,qDAA+D,CAI/D,uDAAgE,CAChE,uDAAiE,CAIjE,0CAAyD,CAIzD,wCAA2D,CAI3D,+BAAoD,CACpD,uDAAmE,CACnE,kDAAgE,CAIhE,oCAAyD,CAIzD,yBAAgD,CChHhD,wBAAyB,CCAzB,0CAA2C,CAK3C,gGAAiG,CAKjG,4GAA6G,CAK7G,sGAAuG,CAKvG,sDAAuD,CCvBvD,wBAAyB,CACzB,6BAA8B,CAC9B,wDAA6D,CAE7D,yBAA0B,CAC1B,2BAA4B,CAC5B,yBAA0B,CAC1B,wBAAyB,CACzB,0BAA2B,CCJ3B,kCJgHD,CI1GA,2EAaC,oBAAqB,CANrB,sBAAuB,CADvB,QAAS,CAFT,QAAS,CACT,SAAU,CAGV,oBAAqB,CAErB,eAAgB,CADhB,qBAKD,CAKA,8DAGC,wBAAyB,CAEzB,0BAA2B,CAG3B,WAAY,CACZ,UAAW,CALX,iGAAkG,CAElG,eAAgB,CAChB,kBAGD,CAGC,qDACC,gBACD,CAEA,mDAEC,sBACD,CAEA,qDACC,oBACD,CAEA,mLAGC,WACD,CAEA,iNAGC,cACD,CAEA,qDAEC,yBAAoC,CADpC,YAED,CAEA,qEAGC,QAAQ,CADR,SAED,CAMD,8BAEC,gBACD,CCnFA,MACC,sBAAuB,CCAvB,gEAAiE,CAKjE,0DAA2D,CAK3D,wEAAyE,CCbzE,uBAA8B,CAC9B,mDAA2D,CAC3D,4CAAkD,CAClD,oDAA4D,CAC5D,mDAA2D,CAC3D,kDAA2D,CAC3D,yDFFD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class which hides an element in DOM.\n */\n.ck-hidden {\n\t/* Override selector specificity. Otherwise, all elements with some display\n\tstyle defined will override this one, which is not a desired result. */\n\tdisplay: none !important;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\tbox-sizing: border-box;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-z-default: 1;\n\t--ck-z-panel: calc( var(--ck-z-default) + 999 );\n\t--ck-z-dialog: 9999;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A class that disables all transitions of the element and its children.\n */\n.ck-transitions-disabled,\n.ck-transitions-disabled * {\n\ttransition: none !important;\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-powered-by-line-height: 10px;\n\t--ck-powered-by-padding-vertical: 2px;\n\t--ck-powered-by-padding-horizontal: 4px;\n\t--ck-powered-by-text-color: hsl(0, 0%, 31%);\n\t--ck-powered-by-border-radius: var(--ck-border-radius);\n\t--ck-powered-by-background: hsl(0, 0%, 100%);\n\t--ck-powered-by-border-color: var(--ck-color-focus-border);\n}\n\n.ck.ck-balloon-panel.ck-powered-by-balloon {\n\t--ck-border-radius: var(--ck-powered-by-border-radius);\n\n\tbox-shadow: none;\n\tbackground: var(--ck-powered-by-background);\n\tmin-height: unset;\n\tz-index: calc( var(--ck-z-panel) - 1 );\n\n\t& .ck.ck-powered-by {\n\t\tline-height: var(--ck-powered-by-line-height);\n\n\t\t& a {\n\t\t\tcursor: pointer;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\topacity: .66;\n\t\t\tfilter: grayscale(80%);\n\t\t\tline-height: var(--ck-powered-by-line-height);\n\t\t\tpadding: var(--ck-powered-by-padding-vertical) var(--ck-powered-by-padding-horizontal);\n\t\t}\n\n\t\t& .ck-powered-by__label {\n\t\t\tfont-size: 7.5px;\n\t\t\tletter-spacing: -.2px;\n\t\t\tpadding-left: 2px;\n\t\t\ttext-transform: uppercase;\n\t\t\tfont-weight: bold;\n\t\t\tmargin-right: 4px;\n\t\t\tcursor: pointer;\n\t\t\tline-height: normal;\n\t\t\tcolor: var(--ck-powered-by-text-color);\n\n\t\t}\n\n\t\t& .ck-icon {\n\t\t\tdisplay: block;\n\t\t\tcursor: pointer;\n\t\t}\n\n\t\t&:hover {\n\t\t\t& a {\n\t\t\t\tfilter: grayscale(0%);\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n\n\t&[class*="position_inside"] {\n\t\tborder-color: transparent;\n\t}\n\n\t&[class*="position_border"] {\n\t\tborder: var(--ck-focus-ring);\n\t\tborder-color: var(--ck-powered-by-border-color);\n\t}\n}\n\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-base-foreground: \t\t\t\t\t\t\t\thsl(0, 0%, 98%);\n\t--ck-color-base-background: \t\t\t\t\t\t\t\thsl(0, 0%, 100%);\n\t--ck-color-base-border: \t\t\t\t\t\t\t\t\thsl(220, 6%, 81%);\n\t--ck-color-base-action: \t\t\t\t\t\t\t\t\thsl(104, 50.2%, 42.5%);\n\t--ck-color-base-focus: \t\t\t\t\t\t\t\t\t\thsl(209, 92%, 70%);\n\t--ck-color-base-text: \t\t\t\t\t\t\t\t\t\thsl(0, 0%, 20%);\n\t--ck-color-base-active: \t\t\t\t\t\t\t\t\thsl(218.1, 100%, 58%);\n\t--ck-color-base-active-focus:\t\t\t\t\t\t\t\thsl(218.2, 100%, 52.5%);\n\t--ck-color-base-error:\t\t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t/* -- Generic colors ------------------------------------------------------------------------ */\n\n\t--ck-color-focus-border-coordinates: \t\t\t\t\t\t218, 81.8%, 56.9%;\n\t--ck-color-focus-border: \t\t\t\t\t\t\t\t\thsl(var(--ck-color-focus-border-coordinates));\n\t--ck-color-focus-outer-shadow:\t\t\t\t\t\t\t\thsl(212.4, 89.3%, 89%);\n\t--ck-color-focus-disabled-shadow:\t\t\t\t\t\t\thsla(209, 90%, 72%,.3);\n\t--ck-color-focus-error-shadow:\t\t\t\t\t\t\t\thsla(9,100%,56%,.3);\n\t--ck-color-text: \t\t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-shadow-drop: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.15);\n\t--ck-color-shadow-drop-active:\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.2);\n\t--ck-color-shadow-inner: \t\t\t\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Buttons ------------------------------------------------------------------------------- */\n\n\t--ck-color-button-default-background: \t\t\t\t\t\ttransparent;\n\t--ck-color-button-default-hover-background: \t\t\t\thsl(0, 0%, 94.1%);\n\t--ck-color-button-default-active-background: \t\t\t\thsl(0, 0%, 94.1%);\n\t--ck-color-button-default-disabled-background: \t\t\t\ttransparent;\n\n\t--ck-color-button-on-background: \t\t\t\t\t\t\thsl(212, 100%, 97.1%);\n\t--ck-color-button-on-hover-background: \t\t\t\t\t\thsl(211.7, 100%, 92.9%);\n\t--ck-color-button-on-active-background: \t\t\t\t\thsl(211.7, 100%, 92.9%);\n\t--ck-color-button-on-disabled-background: \t\t\t\t\thsl(211, 15%, 95%);\n\t--ck-color-button-on-color:\t\t\t\t\t\t\t\t\thsl(218.1, 100%, 58%);\n\n\n\t--ck-color-button-action-background: \t\t\t\t\t\tvar(--ck-color-base-action);\n\t--ck-color-button-action-hover-background: \t\t\t\t\thsl(104, 53.2%, 40.2%);\n\t--ck-color-button-action-active-background: \t\t\t\thsl(104, 53.2%, 40.2%);\n\t--ck-color-button-action-disabled-background: \t\t\t\thsl(104, 44%, 58%);\n\t--ck-color-button-action-text: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t--ck-color-button-save: \t\t\t\t\t\t\t\t\thsl(120, 100%, 27%);\n\t--ck-color-button-cancel: \t\t\t\t\t\t\t\t\thsl(15, 100%, 43%);\n\n\t--ck-color-switch-button-off-background:\t\t\t\t\thsl(0, 0%, 57.6%);\n\t--ck-color-switch-button-off-hover-background:\t\t\t\thsl(0, 0%, 49%);\n\t--ck-color-switch-button-on-background:\t\t\t\t\t\tvar(--ck-color-button-action-background);\n\t--ck-color-switch-button-on-hover-background:\t\t\t\thsl(104, 53.2%, 40.2%);\n\t--ck-color-switch-button-inner-background:\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-switch-button-inner-shadow:\t\t\t\t\t\thsla(0, 0%, 0%, 0.1);\n\n\t/* -- Dropdown ------------------------------------------------------------------------------ */\n\n\t--ck-color-dropdown-panel-background: \t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-dropdown-panel-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Dialog -------------------------------------------------------------------------------- */\n\n\t--ck-color-dialog-background: \t\t\t\t\t\t\t\tvar(--ck-custom-background);\n\t--ck-color-dialog-form-header-border: \t\t\t\t\t\tvar(--ck-custom-border);\n\n\t/* -- Input --------------------------------------------------------------------------------- */\n\n\t--ck-color-input-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-input-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\t--ck-color-input-error-border:\t\t\t\t\t\t\t\tvar(--ck-color-base-error);\n\t--ck-color-input-text: \t\t\t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-input-disabled-background: \t\t\t\t\t\thsl(0, 0%, 95%);\n\t--ck-color-input-disabled-border: \t\t\t\t\t\t\tvar(--ck-color-base-border);\n\t--ck-color-input-disabled-text: \t\t\t\t\t\t\thsl(0, 0%, 46%);\n\n\t/* -- List ---------------------------------------------------------------------------------- */\n\n\t--ck-color-list-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-list-button-hover-background: \t\t\t\t\tvar(--ck-color-button-default-hover-background);\n\t--ck-color-list-button-on-background: \t\t\t\t\t\tvar(--ck-color-button-on-color);\n\t--ck-color-list-button-on-background-focus: \t\t\t\tvar(--ck-color-button-on-color);\n\t--ck-color-list-button-on-text:\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Panel --------------------------------------------------------------------------------- */\n\n\t--ck-color-panel-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-panel-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Toolbar ------------------------------------------------------------------------------- */\n\n\t--ck-color-toolbar-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\t--ck-color-toolbar-border: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-border);\n\n\t/* -- Tooltip ------------------------------------------------------------------------------- */\n\n\t--ck-color-tooltip-background: \t\t\t\t\t\t\t\tvar(--ck-color-base-text);\n\t--ck-color-tooltip-text: \t\t\t\t\t\t\t\t\tvar(--ck-color-base-background);\n\n\t/* -- Engine -------------------------------------------------------------------------------- */\n\n\t--ck-color-engine-placeholder-text: \t\t\t\t\t\thsl(0, 0%, 44%);\n\n\t/* -- Upload -------------------------------------------------------------------------------- */\n\n\t--ck-color-upload-bar-background:\t\t \t\t\t\t\thsl(209, 92%, 70%);\n\n\t/* -- Link -------------------------------------------------------------------------------- */\n\n\t--ck-color-link-default:\t\t\t\t\t\t\t\t\thsl(240, 100%, 47%);\n\t--ck-color-link-selected-background:\t\t\t\t\t\thsla(201, 100%, 56%, 0.1);\n\t--ck-color-link-fake-selection:\t\t\t\t\t\t\t\thsla(201, 100%, 56%, 0.3);\n\n\t/* -- Search result highlight ---------------------------------------------------------------- */\n\n\t--ck-color-highlight-background:\t\t\t\t\t\t\thsl(60, 100%, 50%);\n\n\t/* -- Generic colors ------------------------------------------------------------------------- */\n\n\t--ck-color-light-red:\t\t\t\t\t\t\t\t\t\thsl(0, 100%, 90%);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * An opacity value of disabled UI item.\n\t */\n\t--ck-disabled-opacity: .5;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * The geometry of the of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow-geometry: 0 0 0 3px;\n\n\t/**\n\t * A visual style of focused element's outer shadow.\n\t */\n\t--ck-focus-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-outer-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when disabled).\n\t */\n\t--ck-focus-disabled-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-disabled-shadow);\n\n\t/**\n\t * A visual style of focused element's outer shadow (when has errors).\n\t */\n\t--ck-focus-error-outer-shadow: var(--ck-focus-outer-shadow-geometry) var(--ck-color-focus-error-shadow);\n\n\t/**\n\t * A visual style of focused element's border or outline.\n\t */\n\t--ck-focus-ring: 1px solid var(--ck-color-focus-border);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-font-size-base: 13px;\n\t--ck-line-height-base: 1.84615;\n\t--ck-font-face: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;\n\n\t--ck-font-size-tiny: 0.7em;\n\t--ck-font-size-small: 0.75em;\n\t--ck-font-size-normal: 1em;\n\t--ck-font-size-big: 1.4em;\n\t--ck-font-size-large: 1.8em;\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/* This is super-important. This is **manually** adjusted so a button without an icon\n\tis never smaller than a button with icon, additionally making sure that text-less buttons\n\tare perfect squares. The value is also shared by other components which should stay "in-line"\n\twith buttons. */\n\t--ck-ui-component-min-height: 2.3em;\n}\n\n/**\n * Resets an element, ignoring its children.\n */\n.ck.ck-reset,\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\t/* Do not include inheritable rules here. */\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\ttext-decoration: none;\n\tvertical-align: middle;\n\ttransition: none;\n\n\t/* https://github.com/ckeditor/ckeditor5-theme-lark/issues/105 */\n\tword-wrap: break-word;\n}\n\n/**\n * Resets an element AND its children.\n */\n.ck.ck-reset_all,\n.ck-reset_all *:not(.ck-reset_all-excluded *) {\n\t/* These are rule inherited by all children elements. */\n\tborder-collapse: collapse;\n\tfont: normal normal normal var(--ck-font-size-base)/var(--ck-line-height-base) var(--ck-font-face);\n\tcolor: var(--ck-color-text);\n\ttext-align: left;\n\twhite-space: nowrap;\n\tcursor: auto;\n\tfloat: none;\n}\n\n.ck-reset_all {\n\t& .ck-rtl *:not(.ck-reset_all-excluded *) {\n\t\ttext-align: right;\n\t}\n\n\t& iframe:not(.ck-reset_all-excluded *) {\n\t\t/* For IE */\n\t\tvertical-align: inherit;\n\t}\n\n\t& textarea:not(.ck-reset_all-excluded *) {\n\t\twhite-space: pre-wrap;\n\t}\n\n\t& textarea:not(.ck-reset_all-excluded *),\n\t& input[type="text"]:not(.ck-reset_all-excluded *),\n\t& input[type="password"]:not(.ck-reset_all-excluded *) {\n\t\tcursor: text;\n\t}\n\n\t& textarea[disabled]:not(.ck-reset_all-excluded *),\n\t& input[type="text"][disabled]:not(.ck-reset_all-excluded *),\n\t& input[type="password"][disabled]:not(.ck-reset_all-excluded *) {\n\t\tcursor: default;\n\t}\n\n\t& fieldset:not(.ck-reset_all-excluded *) {\n\t\tpadding: 10px;\n\t\tborder: 2px groove hsl(255, 7%, 88%);\n\t}\n\n\t& button:not(.ck-reset_all-excluded *)::-moz-focus-inner {\n\t\t/* See http://stackoverflow.com/questions/5517744/remove-extra-button-spacing-padding-in-firefox */\n\t\tpadding: 0;\n\t\tborder: 0\n\t}\n}\n\n/**\n * Default UI rules for RTL languages.\n */\n.ck[dir="rtl"],\n.ck[dir="rtl"] .ck {\n\ttext-align: right;\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * Default border-radius value.\n */\n:root{\n\t--ck-border-radius: 2px;\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t/**\n\t * A visual style of element's inner shadow (i.e. input).\n\t */\n\t--ck-inner-shadow: 2px 2px 3px var(--ck-color-shadow-inner) inset;\n\n\t/**\n\t * A visual style of element's drop shadow (i.e. panel).\n\t */\n\t--ck-drop-shadow: 0 1px 2px 1px var(--ck-color-shadow-drop);\n\n\t/**\n\t * A visual style of element's active shadow (i.e. comment or suggestion).\n\t */\n\t--ck-drop-shadow-active: 0 3px 6px 1px var(--ck-color-shadow-drop-active);\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-spacing-unit: \t\t\t\t\t\t0.6em;\n\t--ck-spacing-large: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 1.5);\n\t--ck-spacing-standard: \t\t\t\t\tvar(--ck-spacing-unit);\n\t--ck-spacing-medium: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.8);\n\t--ck-spacing-small: \t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.5);\n\t--ck-spacing-tiny: \t\t\t\t\t\tcalc(var(--ck-spacing-unit) * 0.3);\n\t--ck-spacing-extra-tiny: \t\t\t\tcalc(var(--ck-spacing-unit) * 0.16);\n}\n"],sourceRoot:""}]);const a=s},695:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,":root{--ck-color-resizer:var(--ck-color-focus-border);--ck-color-resizer-tooltip-background:#262626;--ck-color-resizer-tooltip-text:#f2f2f2;--ck-resizer-border-radius:var(--ck-border-radius);--ck-resizer-tooltip-offset:10px;--ck-resizer-tooltip-height:calc(var(--ck-spacing-small)*2 + 10px)}.ck .ck-widget,.ck .ck-widget.ck-widget_with-selection-handle{position:relative}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{position:absolute}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{display:block}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{visibility:visible}.ck .ck-size-view{background:var(--ck-color-resizer-tooltip-background);border:1px solid var(--ck-color-resizer-tooltip-text);border-radius:var(--ck-resizer-border-radius);color:var(--ck-color-resizer-tooltip-text);display:block;font-size:var(--ck-font-size-tiny);height:var(--ck-resizer-tooltip-height);line-height:var(--ck-resizer-tooltip-height);padding:0 var(--ck-spacing-small)}.ck .ck-size-view.ck-orientation-above-center,.ck .ck-size-view.ck-orientation-bottom-left,.ck .ck-size-view.ck-orientation-bottom-right,.ck .ck-size-view.ck-orientation-top-left,.ck .ck-size-view.ck-orientation-top-right{position:absolute}.ck .ck-size-view.ck-orientation-top-left{left:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-top-right{right:var(--ck-resizer-tooltip-offset);top:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-right{bottom:var(--ck-resizer-tooltip-offset);right:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-bottom-left{bottom:var(--ck-resizer-tooltip-offset);left:var(--ck-resizer-tooltip-offset)}.ck .ck-size-view.ck-orientation-above-center{left:50%;top:calc(var(--ck-resizer-tooltip-height)*-1);transform:translate(-50%)}:root{--ck-widget-outline-thickness:3px;--ck-widget-handler-icon-size:16px;--ck-widget-handler-animation-duration:200ms;--ck-widget-handler-animation-curve:ease;--ck-color-widget-blurred-border:#dedede;--ck-color-widget-hover-border:#ffc83d;--ck-color-widget-editable-focus-background:var(--ck-color-base-background);--ck-color-widget-drag-handler-icon-color:var(--ck-color-base-background)}.ck .ck-widget{outline-color:transparent;outline-style:solid;outline-width:var(--ck-widget-outline-thickness);transition:outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_selected,.ck .ck-widget.ck-widget_selected:hover{outline:var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border)}.ck .ck-widget:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-editor__nested-editable{border:1px solid transparent}.ck .ck-editor__nested-editable.ck-editor__nested-editable_focused,.ck .ck-editor__nested-editable:focus{background-color:var(--ck-color-widget-editable-focus-background);border:var(--ck-focus-ring);box-shadow:var(--ck-inner-shadow),0 0;outline:none}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{background-color:transparent;border-radius:var(--ck-border-radius) var(--ck-border-radius) 0 0;box-sizing:border-box;left:calc(0px - var(--ck-widget-outline-thickness));opacity:0;padding:4px;top:0;transform:translateY(-100%);transition:background-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),visibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon{color:var(--ck-color-widget-drag-handler-icon-color);height:var(--ck-widget-handler-icon-size);width:var(--ck-widget-handler-icon-size)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:0;transition:opacity .3s var(--ck-widget-handler-animation-curve)}.ck .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover .ck-icon .ck-icon__selected-indicator{opacity:1}.ck .ck-widget.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle{background-color:var(--ck-color-widget-hover-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{background-color:var(--ck-color-focus-border);opacity:1}.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator,.ck .ck-widget.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle .ck-icon .ck-icon__selected-indicator{opacity:1}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle{left:auto;right:calc(0px - var(--ck-widget-outline-thickness))}.ck.ck-editor__editable.ck-read-only .ck-widget{transition:none}.ck.ck-editor__editable.ck-read-only .ck-widget:not(.ck-widget_selected){--ck-widget-outline-thickness:0px}.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle,.ck.ck-editor__editable.ck-read-only .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected:hover{outline-color:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle:hover>.ck-widget__selection-handle:hover,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle,.ck.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected.ck-widget_with-selection-handle>.ck-widget__selection-handle:hover{background:var(--ck-color-widget-blurred-border)}.ck.ck-editor__editable blockquote>.ck-widget.ck-widget_with-selection-handle:first-child,.ck.ck-editor__editable>.ck-widget.ck-widget_with-selection-handle:first-child{margin-top:calc(1em + var(--ck-widget-handler-icon-size))}","",{version:3,sources:["webpack://./../ckeditor5-widget/theme/widget.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-widget/widget.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_focus.css","webpack://./../ckeditor5-theme-lark/theme/mixins/_shadow.css"],names:[],mappings:"AAKA,MACC,+CAAgD,CAChD,6CAAsD,CACtD,uCAAgD,CAEhD,kDAAmD,CACnD,gCAAiC,CACjC,kEACD,CAOA,8DAEC,iBAqBD,CAnBC,4EACC,iBAOD,CALC,qFAGC,aACD,CASD,iLACC,kBACD,CAGD,kBACC,qDAAsD,CAEtD,qDAAsD,CACtD,6CAA8C,CAF9C,0CAA2C,CAI3C,aAAc,CADd,kCAAmC,CAGnC,uCAAwC,CACxC,4CAA6C,CAF7C,iCAsCD,CAlCC,8NAKC,iBACD,CAEA,0CAEC,qCAAsC,CADtC,oCAED,CAEA,2CAEC,sCAAuC,CADvC,oCAED,CAEA,8CACC,uCAAwC,CACxC,sCACD,CAEA,6CACC,uCAAwC,CACxC,qCACD,CAGA,8CAEC,QAAS,CADT,6CAAgD,CAEhD,yBACD,CCjFD,MACC,iCAAkC,CAClC,kCAAmC,CACnC,4CAA6C,CAC7C,wCAAyC,CAEzC,wCAAiD,CACjD,sCAAkD,CAClD,2EAA4E,CAC5E,yEACD,CAEA,eAGC,yBAA0B,CAD1B,mBAAoB,CADpB,gDAAiD,CAGjD,6GAUD,CARC,0EAEC,6EACD,CAEA,qBACC,iDACD,CAGD,gCACC,4BAWD,CAPC,yGAKC,iEAAkE,CCnCnE,2BAA2B,CCF3B,qCAA8B,CDC9B,YDqCA,CAIA,4EAKC,4BAA6B,CAa7B,iEAAkE,CAhBlE,qBAAsB,CAoBtB,mDAAoD,CAhBpD,SAAU,CALV,WAAY,CAsBZ,KAAM,CAFN,2BAA4B,CAT5B,6SAgCD,CAnBC,qFAIC,oDAAqD,CADrD,yCAA0C,CAD1C,wCAWD,CANC,kHACC,SAAU,CAGV,+DACD,CAID,wHACC,SACD,CAID,kFAEC,oDAAqD,CADrD,SAED,CAKC,oMAEC,6CAA8C,CAD9C,SAOD,CAHC,gRACC,SACD,CAOH,qFACC,SAAU,CACV,oDACD,CAGA,gDAEC,eAkBD,CAhBC,yEAOC,iCACD,CAGC,gOAEC,gDACD,CAOD,wIAEC,mDAQD,CALE,ghBAEC,gDACD,CAKH,yKAOC,yDACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-color-resizer: var(--ck-color-focus-border);\n\t--ck-color-resizer-tooltip-background: hsl(0, 0%, 15%);\n\t--ck-color-resizer-tooltip-text: hsl(0, 0%, 95%);\n\n\t--ck-resizer-border-radius: var(--ck-border-radius);\n\t--ck-resizer-tooltip-offset: 10px;\n\t--ck-resizer-tooltip-height: calc(var(--ck-spacing-small) * 2 + 10px);\n}\n\n.ck .ck-widget {\n\t/* This is neccessary for type around UI to be positioned properly. */\n\tposition: relative;\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n\n\t& .ck-widget__selection-handle {\n\t\tposition: absolute;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the icon in not a subject to font-size or line-height to avoid\n\t\t\tunnecessary spacing around it. */\n\t\t\tdisplay: block;\n\t\t}\n\t}\n\n\t/* Show the selection handle on mouse hover over the widget, but not for nested widgets. */\n\t&:hover > .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n\n\t/* Show the selection handle when the widget is selected, but not for nested widgets. */\n\t&.ck-widget_selected > .ck-widget__selection-handle {\n\t\tvisibility: visible;\n\t}\n}\n\n.ck .ck-size-view {\n\tbackground: var(--ck-color-resizer-tooltip-background);\n\tcolor: var(--ck-color-resizer-tooltip-text);\n\tborder: 1px solid var(--ck-color-resizer-tooltip-text);\n\tborder-radius: var(--ck-resizer-border-radius);\n\tfont-size: var(--ck-font-size-tiny);\n\tdisplay: block;\n\tpadding: 0 var(--ck-spacing-small);\n\theight: var(--ck-resizer-tooltip-height);\n\tline-height: var(--ck-resizer-tooltip-height);\n\n\t&.ck-orientation-top-left,\n\t&.ck-orientation-top-right,\n\t&.ck-orientation-bottom-right,\n\t&.ck-orientation-bottom-left,\n\t&.ck-orientation-above-center {\n\t\tposition: absolute;\n\t}\n\n\t&.ck-orientation-top-left {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-top-right {\n\t\ttop: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-right {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tright: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t&.ck-orientation-bottom-left {\n\t\tbottom: var(--ck-resizer-tooltip-offset);\n\t\tleft: var(--ck-resizer-tooltip-offset);\n\t}\n\n\t/* Class applied if the widget is too small to contain the size label */\n\t&.ck-orientation-above-center {\n\t\ttop: calc(var(--ck-resizer-tooltip-height) * -1);\n\t\tleft: 50%;\n\t\ttransform: translate(-50%);\n\t}\n}\n",'/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n@import "../mixins/_focus.css";\n@import "../mixins/_shadow.css";\n\n:root {\n\t--ck-widget-outline-thickness: 3px;\n\t--ck-widget-handler-icon-size: 16px;\n\t--ck-widget-handler-animation-duration: 200ms;\n\t--ck-widget-handler-animation-curve: ease;\n\n\t--ck-color-widget-blurred-border: hsl(0, 0%, 87%);\n\t--ck-color-widget-hover-border: hsl(43, 100%, 62%);\n\t--ck-color-widget-editable-focus-background: var(--ck-color-base-background);\n\t--ck-color-widget-drag-handler-icon-color: var(--ck-color-base-background);\n}\n\n.ck .ck-widget {\n\toutline-width: var(--ck-widget-outline-thickness);\n\toutline-style: solid;\n\toutline-color: transparent;\n\ttransition: outline-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline: var(--ck-widget-outline-thickness) solid var(--ck-color-focus-border);\n\t}\n\n\t&:hover {\n\t\toutline-color: var(--ck-color-widget-hover-border);\n\t}\n}\n\n.ck .ck-editor__nested-editable {\n\tborder: 1px solid transparent;\n\n\t/* The :focus style is applied before .ck-editor__nested-editable_focused class is rendered in the view.\n\tThese styles show a different border for a blink of an eye, so `:focus` need to have same styles applied. */\n\t&.ck-editor__nested-editable_focused,\n\t&:focus {\n\t\t@mixin ck-focus-ring;\n\t\t@mixin ck-box-shadow var(--ck-inner-shadow);\n\n\t\tbackground-color: var(--ck-color-widget-editable-focus-background);\n\t}\n}\n\n.ck .ck-widget.ck-widget_with-selection-handle {\n\t& .ck-widget__selection-handle {\n\t\tpadding: 4px;\n\t\tbox-sizing: border-box;\n\n\t\t/* Background and opacity will be animated as the handler shows up or the widget gets selected. */\n\t\tbackground-color: transparent;\n\t\topacity: 0;\n\n\t\t/* Transition:\n\t\t * background-color for the .ck-widget_selected state change,\n\t\t * visibility for hiding the handler,\n\t\t * opacity for the proper look of the icon when the handler disappears. */\n\t\ttransition:\n\t\t\tbackground-color var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\tvisibility var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),\n\t\t\topacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t/* Make only top corners round. */\n\t\tborder-radius: var(--ck-border-radius) var(--ck-border-radius) 0 0;\n\n\t\t/* Place the drag handler outside the widget wrapper. */\n\t\ttransform: translateY(-100%);\n\t\tleft: calc(0px - var(--ck-widget-outline-thickness));\n\t\ttop: 0;\n\n\t\t& .ck-icon {\n\t\t\t/* Make sure the dimensions of the icon are independent of the fon-size of the content. */\n\t\t\twidth: var(--ck-widget-handler-icon-size);\n\t\t\theight: var(--ck-widget-handler-icon-size);\n\t\t\tcolor: var(--ck-color-widget-drag-handler-icon-color);\n\n\t\t\t/* The "selected" part of the icon is invisible by default */\n\t\t\t& .ck-icon__selected-indicator {\n\t\t\t\topacity: 0;\n\n\t\t\t\t/* Note: The animation is longer on purpose. Simply feels better. */\n\t\t\t\ttransition: opacity 300ms var(--ck-widget-handler-animation-curve);\n\t\t\t}\n\t\t}\n\n\t\t/* Advertise using the look of the icon that once clicked the handler, the widget will be selected. */\n\t\t&:hover .ck-icon .ck-icon__selected-indicator {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t/* Show the selection handler on mouse hover over the widget, but not for nested widgets. */\n\t&:hover > .ck-widget__selection-handle {\n\t\topacity: 1;\n\t\tbackground-color: var(--ck-color-widget-hover-border);\n\t}\n\n\t/* Show the selection handler when the widget is selected, but not for nested widgets. */\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\t& > .ck-widget__selection-handle {\n\t\t\topacity: 1;\n\t\t\tbackground-color: var(--ck-color-focus-border);\n\n\t\t\t/* When the widget is selected, notify the user using the proper look of the icon. */\n\t\t\t& .ck-icon .ck-icon__selected-indicator {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* In a RTL environment, align the selection handler to the right side of the widget */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__selection-handle {\n\tleft: auto;\n\tright: calc(0px - var(--ck-widget-outline-thickness));\n}\n\n/* https://github.com/ckeditor/ckeditor5/issues/6415 */\n.ck.ck-editor__editable.ck-read-only .ck-widget {\n\t/* Prevent the :hover outline from showing up because of the used outline-color transition. */\n\ttransition: none;\n\n\t&:not(.ck-widget_selected) {\n\t\t/* Disable visual effects of hover/active widget when CKEditor is in readOnly mode.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/1261\n\t\t *\n\t\t * Leave the unit because this custom property is used in calc() by other features.\n\t\t * See: https://github.com/ckeditor/ckeditor5/issues/6775\n\t\t */\n\t\t--ck-widget-outline-thickness: 0px;\n\t}\n\n\t&.ck-widget_with-selection-handle {\n\t\t& .ck-widget__selection-handle,\n\t\t& .ck-widget__selection-handle:hover {\n\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t}\n\t}\n}\n\n/* Style the widget when it\'s selected but the editable it belongs to lost focus. */\n/* stylelint-disable-next-line no-descending-specificity */\n.ck.ck-editor__editable.ck-blurred .ck-widget {\n\t&.ck-widget_selected,\n\t&.ck-widget_selected:hover {\n\t\toutline-color: var(--ck-color-widget-blurred-border);\n\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t& > .ck-widget__selection-handle,\n\t\t\t& > .ck-widget__selection-handle:hover {\n\t\t\t\tbackground: var(--ck-color-widget-blurred-border);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.ck.ck-editor__editable > .ck-widget.ck-widget_with-selection-handle:first-child,\n.ck.ck-editor__editable blockquote > .ck-widget.ck-widget_with-selection-handle:first-child {\n\t/* Do not crop selection handler if a widget is a first-child in the blockquote or in the root editable.\n\tIn fact, anything with overflow: hidden.\n\thttps://github.com/ckeditor/ckeditor5-block-quote/issues/28\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/44\n\thttps://github.com/ckeditor/ckeditor5-widget/issues/66 */\n\tmargin-top: calc(1em + var(--ck-widget-handler-icon-size));\n}\n',"/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A visual style of focused element's border.\n */\n@define-mixin ck-focus-ring {\n\t/* Disable native outline. */\n\toutline: none;\n\tborder: var(--ck-focus-ring)\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * A helper to combine multiple shadows.\n */\n@define-mixin ck-box-shadow $shadowA, $shadowB: 0 0 {\n\tbox-shadow: $shadowA, $shadowB;\n}\n\n/**\n * Gives an element a drop shadow so it looks like a floating panel.\n */\n@define-mixin ck-drop-shadow {\n\t@mixin ck-box-shadow var(--ck-drop-shadow);\n}\n"],sourceRoot:""}]);const a=s},4095:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,".ck .ck-widget_with-resizer{position:relative}.ck .ck-widget__resizer{display:none;left:0;pointer-events:none;position:absolute;top:0}.ck-focused .ck-widget_with-resizer.ck-widget_selected>.ck-widget__resizer{display:block}.ck .ck-widget__resizer__handle{pointer-events:all;position:absolute}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{cursor:nwse-resize}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left,.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{cursor:nesw-resize}:root{--ck-resizer-size:10px;--ck-resizer-offset:calc(var(--ck-resizer-size)/-2 - 2px);--ck-resizer-border-width:1px}.ck .ck-widget__resizer{outline:1px solid var(--ck-color-resizer)}.ck .ck-widget__resizer__handle{background:var(--ck-color-focus-border);border:var(--ck-resizer-border-width) solid #fff;border-radius:var(--ck-resizer-border-radius);height:var(--ck-resizer-size);width:var(--ck-resizer-size)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-left{left:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-top-right{right:var(--ck-resizer-offset);top:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-right{bottom:var(--ck-resizer-offset);right:var(--ck-resizer-offset)}.ck .ck-widget__resizer__handle.ck-widget__resizer__handle-bottom-left{bottom:var(--ck-resizer-offset);left:var(--ck-resizer-offset)}","",{version:3,sources:["webpack://./../ckeditor5-widget/theme/widgetresize.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-widget/widgetresize.css"],names:[],mappings:"AAKA,4BAEC,iBACD,CAEA,wBACC,YAAa,CAMb,MAAO,CAFP,mBAAoB,CAHpB,iBAAkB,CAMlB,KACD,CAGC,2EACC,aACD,CAGD,gCAIC,kBAAmB,CAHnB,iBAcD,CATC,4IAEC,kBACD,CAEA,4IAEC,kBACD,CCpCD,MACC,sBAAuB,CAGvB,yDAAiE,CACjE,6BACD,CAEA,wBACC,yCACD,CAEA,gCAGC,uCAAwC,CACxC,gDAA6D,CAC7D,6CAA8C,CAH9C,6BAA8B,CAD9B,4BAyBD,CAnBC,oEAEC,6BAA8B,CAD9B,4BAED,CAEA,qEAEC,8BAA+B,CAD/B,4BAED,CAEA,wEACC,+BAAgC,CAChC,8BACD,CAEA,uEACC,+BAAgC,CAChC,6BACD",sourcesContent:["/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget_with-resizer {\n\t/* Make the widget wrapper a relative positioning container for the drag handle. */\n\tposition: relative;\n}\n\n.ck .ck-widget__resizer {\n\tdisplay: none;\n\tposition: absolute;\n\n\t/* The wrapper itself should not interfere with the pointer device, only the handles should. */\n\tpointer-events: none;\n\n\tleft: 0;\n\ttop: 0;\n}\n\n.ck-focused .ck-widget_with-resizer.ck-widget_selected {\n\t& > .ck-widget__resizer {\n\t\tdisplay: block;\n\t}\n}\n\n.ck .ck-widget__resizer__handle {\n\tposition: absolute;\n\n\t/* Resizers are the only UI elements that should interfere with a pointer device. */\n\tpointer-events: all;\n\n\t&.ck-widget__resizer__handle-top-left,\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tcursor: nwse-resize;\n\t}\n\n\t&.ck-widget__resizer__handle-top-right,\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tcursor: nesw-resize;\n\t}\n}\n","/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-resizer-size: 10px;\n\n\t/* Set the resizer with a 50% offset. */\n\t--ck-resizer-offset: calc( ( var(--ck-resizer-size) / -2 ) - 2px);\n\t--ck-resizer-border-width: 1px;\n}\n\n.ck .ck-widget__resizer {\n\toutline: 1px solid var(--ck-color-resizer);\n}\n\n.ck .ck-widget__resizer__handle {\n\twidth: var(--ck-resizer-size);\n\theight: var(--ck-resizer-size);\n\tbackground: var(--ck-color-focus-border);\n\tborder: var(--ck-resizer-border-width) solid hsl(0, 0%, 100%);\n\tborder-radius: var(--ck-resizer-border-radius);\n\n\t&.ck-widget__resizer__handle-top-left {\n\t\ttop: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-top-right {\n\t\ttop: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-right {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tright: var(--ck-resizer-offset);\n\t}\n\n\t&.ck-widget__resizer__handle-bottom-left {\n\t\tbottom: var(--ck-resizer-offset);\n\t\tleft: var(--ck-resizer-offset);\n\t}\n}\n"],sourceRoot:""}]);const a=s},8508:(t,e,n)=>{"use strict";n.d(e,{A:()=>a});var o=n(9372),i=n.n(o),r=n(935),s=n.n(r)()(i());s.push([t.id,'.ck .ck-widget .ck-widget__type-around__button{display:block;overflow:hidden;position:absolute;z-index:var(--ck-z-default)}.ck .ck-widget .ck-widget__type-around__button svg{left:50%;position:absolute;top:50%;z-index:calc(var(--ck-z-default) + 2)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_before{left:min(10%,30px);top:calc(var(--ck-widget-outline-thickness)*-.5);transform:translateY(-50%)}.ck .ck-widget .ck-widget__type-around__button.ck-widget__type-around__button_after{bottom:calc(var(--ck-widget-outline-thickness)*-.5);right:min(10%,30px);transform:translateY(50%)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{content:"";display:block;left:1px;position:absolute;top:1px;z-index:calc(var(--ck-z-default) + 1)}.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:none;left:0;position:absolute;right:0}.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__fake-caret{left:calc(var(--ck-widget-outline-thickness)*-1);right:calc(var(--ck-widget-outline-thickness)*-1)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__fake-caret{display:block;top:calc(var(--ck-widget-outline-thickness)*-1 - 1px)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__fake-caret{bottom:calc(var(--ck-widget-outline-thickness)*-1 - 1px);display:block}.ck.ck-editor__editable.ck-read-only .ck-widget__type-around,.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around,.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around{display:none}:root{--ck-widget-type-around-button-size:20px;--ck-color-widget-type-around-button-active:var(--ck-color-focus-border);--ck-color-widget-type-around-button-hover:var(--ck-color-widget-hover-border);--ck-color-widget-type-around-button-blurred-editable:var(--ck-color-widget-blurred-border);--ck-color-widget-type-around-button-radar-start-alpha:0;--ck-color-widget-type-around-button-radar-end-alpha:.3;--ck-color-widget-type-around-button-icon:var(--ck-color-base-background)}.ck .ck-widget .ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button);border-radius:100px;height:var(--ck-widget-type-around-button-size);opacity:0;pointer-events:none;transition:opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve),background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);width:var(--ck-widget-type-around-button-size)}.ck .ck-widget .ck-widget__type-around__button svg{height:8px;margin-top:1px;transform:translate(-50%,-50%);transition:transform .5s ease;width:10px}.ck .ck-widget .ck-widget__type-around__button svg *{stroke-dasharray:10;stroke-dashoffset:0;fill:none;stroke:var(--ck-color-widget-type-around-button-icon);stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.ck .ck-widget .ck-widget__type-around__button svg line{stroke-dasharray:7}.ck .ck-widget .ck-widget__type-around__button:hover{animation:ck-widget-type-around-button-sonar 1s ease infinite}.ck .ck-widget .ck-widget__type-around__button:hover svg polyline{animation:ck-widget-type-around-arrow-dash 2s linear}.ck .ck-widget .ck-widget__type-around__button:hover svg line{animation:ck-widget-type-around-arrow-tip-dash 2s linear}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:1;pointer-events:auto}.ck .ck-widget:not(.ck-widget_selected)>.ck-widget__type-around>.ck-widget__type-around__button{background:var(--ck-color-widget-type-around-button-hover)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover{background:var(--ck-color-widget-type-around-button-active)}.ck .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:after,.ck .ck-widget>.ck-widget__type-around>.ck-widget__type-around__button:hover:after{background:linear-gradient(135deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.3));border-radius:100px;height:calc(var(--ck-widget-type-around-button-size) - 2px);width:calc(var(--ck-widget-type-around-button-size) - 2px)}.ck .ck-widget.ck-widget_with-selection-handle>.ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:20px}.ck .ck-widget .ck-widget__type-around__fake-caret{animation:ck-widget-type-around-fake-caret-pulse 1s linear infinite normal forwards;background:var(--ck-color-base-text);height:1px;outline:1px solid hsla(0,0%,100%,.5);pointer-events:none}.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_after,.ck .ck-widget.ck-widget_selected.ck-widget_type-around_show-fake-caret_before{outline-color:transparent}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected:hover,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected:hover{outline-color:var(--ck-color-widget-hover-border)}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after>.ck-widget__type-around>.ck-widget__type-around__button,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_after.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_selected.ck-widget_with-resizer>.ck-widget__resizer,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected:hover>.ck-widget__selection-handle,.ck .ck-widget.ck-widget_type-around_show-fake-caret_before.ck-widget_with-selection-handle.ck-widget_selected>.ck-widget__selection-handle{opacity:0}.ck[dir=rtl] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around>.ck-widget__type-around__button_before{margin-left:0;margin-right:20px}.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button,.ck-editor__nested-editable.ck-editor__editable_selected .ck-widget:hover>.ck-widget__type-around>.ck-widget__type-around__button{opacity:0;pointer-events:none}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover){background:var(--ck-color-widget-type-around-button-blurred-editable)}.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected>.ck-widget__type-around>.ck-widget__type-around__button:not(:hover) svg *{stroke:#999}@keyframes ck-widget-type-around-arrow-dash{0%{stroke-dashoffset:10}20%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-arrow-tip-dash{0%,20%{stroke-dashoffset:7}40%,to{stroke-dashoffset:0}}@keyframes ck-widget-type-around-button-sonar{0%{box-shadow:0 0 0 0 hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}50%{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-end-alpha))}to{box-shadow:0 0 0 5px hsla(var(--ck-color-focus-border-coordinates),var(--ck-color-widget-type-around-button-radar-start-alpha))}}@keyframes ck-widget-type-around-fake-caret-pulse{0%{opacity:1}49%{opacity:1}50%{opacity:0}99%{opacity:0}to{opacity:1}}',"",{version:3,sources:["webpack://./../ckeditor5-widget/theme/widgettypearound.css","webpack://./../ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css"],names:[],mappings:"AASC,+CACC,aAAc,CAEd,eAAgB,CADhB,iBAAkB,CAElB,2BAwBD,CAtBC,mDAGC,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAEA,qFAGC,kBAAoB,CADpB,gDAAoD,CAGpD,0BACD,CAEA,oFAEC,mDAAuD,CACvD,mBAAqB,CAErB,yBACD,CAUA,mLACC,UAAW,CACX,aAAc,CAGd,QAAS,CAFT,iBAAkB,CAClB,OAAQ,CAER,qCACD,CAMD,2EACC,YAAa,CAEb,MAAO,CADP,iBAAkB,CAElB,OACD,CAOA,iFACC,gDAAqD,CACrD,iDACD,CAKA,wHAEC,aAAc,CADd,qDAED,CAKA,uHACC,wDAA6D,CAC7D,aACD,CAoBD,mOACC,YACD,CC3GA,MACC,wCAAyC,CACzC,wEAAyE,CACzE,8EAA+E,CAC/E,2FAA4F,CAC5F,wDAAyD,CACzD,uDAAwD,CACxD,yEACD,CAgBC,+CAGC,oDAAqD,CACrD,mBAAoB,CAFpB,+CAAgD,CAVjD,SAAU,CACV,mBAAoB,CAYnB,uMAAyM,CAJzM,8CAkDD,CA1CC,mDAEC,UAAW,CAGX,cAAe,CAFf,8BAA+B,CAC/B,6BAA8B,CAH9B,UAoBD,CAdC,qDACC,mBAAoB,CACpB,mBAAoB,CAEpB,SAAU,CACV,qDAAsD,CACtD,kBAAmB,CACnB,oBAAqB,CACrB,qBACD,CAEA,wDACC,kBACD,CAGD,qDAIC,6DAcD,CARE,kEACC,oDACD,CAEA,8DACC,wDACD,CAUF,uKAvED,SAAU,CACV,mBAwEC,CAOD,gGACC,0DACD,CAOA,uKAEC,2DAQD,CANC,mLAIC,uEAAkF,CADlF,mBAAoB,CADpB,2DAA4D,CAD5D,0DAID,CAOD,8GACC,gBACD,CAKA,mDAGC,mFAAoF,CAOpF,oCAAqC,CARrC,UAAW,CAOX,oCAAwC,CARxC,mBAUD,CAOC,6JAEC,yBACD,CAUA,yKACC,iDACD,CAMA,uOAlJD,SAAU,CACV,mBAmJC,CAoBA,6yBACC,SACD,CASF,uHACC,aAAc,CACd,iBACD,CAYG,iRAlMF,SAAU,CACV,mBAmME,CAQH,kIACC,qEAKD,CAHC,wIACC,WACD,CAGD,4CACC,GACC,oBACD,CACA,OACC,mBACD,CACD,CAEA,gDACC,OACC,mBACD,CACA,OACC,mBACD,CACD,CAEA,8CACC,GACC,6HACD,CACA,IACC,6HACD,CACA,GACC,+HACD,CACD,CAEA,kDACC,GACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,IACC,SACD,CACA,GACC,SACD,CACD",sourcesContent:['/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\toverflow: hidden;\n\t\tz-index: var(--ck-z-default);\n\n\t\t& svg {\n\t\t\tposition: absolute;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tz-index: calc(var(--ck-z-default) + 2);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_before {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\ttop: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tleft: min(10%, 30px);\n\n\t\t\ttransform: translateY(-50%);\n\t\t}\n\n\t\t&.ck-widget__type-around__button_after {\n\t\t\t/* Place it in the middle of the outline */\n\t\t\tbottom: calc(-0.5 * var(--ck-widget-outline-thickness));\n\t\t\tright: min(10%, 30px);\n\n\t\t\ttransform: translateY(50%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\t&::after {\n\t\t\tcontent: "";\n\t\t\tdisplay: block;\n\t\t\tposition: absolute;\n\t\t\ttop: 1px;\n\t\t\tleft: 1px;\n\t\t\tz-index: calc(var(--ck-z-default) + 1);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tright: 0;\n\t}\n\n\t/*\n\t * When the widget is hovered the "fake caret" would normally be narrower than the\n\t * extra outline displayed around the widget. Let\'s extend the "fake caret" to match\n\t * the full width of the widget.\n\t */\n\t&:hover > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tleft: calc( -1 * var(--ck-widget-outline-thickness) );\n\t\tright: calc( -1 * var(--ck-widget-outline-thickness) );\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed before the widget (backward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_before > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\ttop: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" when it should be displayed after the widget (forward keyboard navigation).\n\t */\n\t&.ck-widget_type-around_show-fake-caret_after > .ck-widget__type-around > .ck-widget__type-around__fake-caret {\n\t\tbottom: calc( -1 * var(--ck-widget-outline-thickness) - 1px );\n\t\tdisplay: block;\n\t}\n}\n\n/*\n * Integration with the read-only mode of the editor.\n */\n.ck.ck-editor__editable.ck-read-only .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the restricted editing mode (feature) of the editor.\n */\n.ck.ck-editor__editable.ck-restricted-editing_mode_restricted .ck-widget__type-around {\n\tdisplay: none;\n}\n\n/*\n * Integration with the #isEnabled property of the WidgetTypeAround plugin.\n */\n.ck.ck-editor__editable.ck-widget__type-around_disabled .ck-widget__type-around {\n\tdisplay: none;\n}\n','/*\n * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n:root {\n\t--ck-widget-type-around-button-size: 20px;\n\t--ck-color-widget-type-around-button-active: var(--ck-color-focus-border);\n\t--ck-color-widget-type-around-button-hover: var(--ck-color-widget-hover-border);\n\t--ck-color-widget-type-around-button-blurred-editable: var(--ck-color-widget-blurred-border);\n\t--ck-color-widget-type-around-button-radar-start-alpha: 0;\n\t--ck-color-widget-type-around-button-radar-end-alpha: .3;\n\t--ck-color-widget-type-around-button-icon: var(--ck-color-base-background);\n}\n\n@define-mixin ck-widget-type-around-button-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n@define-mixin ck-widget-type-around-button-hidden {\n\topacity: 0;\n\tpointer-events: none;\n}\n\n.ck .ck-widget {\n\t/*\n\t * Styles of the type around buttons\n\t */\n\t& .ck-widget__type-around__button {\n\t\twidth: var(--ck-widget-type-around-button-size);\n\t\theight: var(--ck-widget-type-around-button-size);\n\t\tbackground: var(--ck-color-widget-type-around-button);\n\t\tborder-radius: 100px;\n\t\ttransition: opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);\n\n\t\t@mixin ck-widget-type-around-button-hidden;\n\n\t\t& svg {\n\t\t\twidth: 10px;\n\t\t\theight: 8px;\n\t\t\ttransform: translate(-50%,-50%);\n\t\t\ttransition: transform .5s ease;\n\t\t\tmargin-top: 1px;\n\n\t\t\t& * {\n\t\t\t\tstroke-dasharray: 10;\n\t\t\t\tstroke-dashoffset: 0;\n\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--ck-color-widget-type-around-button-icon);\n\t\t\t\tstroke-width: 1.5px;\n\t\t\t\tstroke-linecap: round;\n\t\t\t\tstroke-linejoin: round;\n\t\t\t}\n\n\t\t\t& line {\n\t\t\t\tstroke-dasharray: 7;\n\t\t\t}\n\t\t}\n\n\t\t&:hover {\n\t\t\t/*\n\t\t\t * Display the "sonar" around the button when hovered.\n\t\t\t */\n\t\t\tanimation: ck-widget-type-around-button-sonar 1s ease infinite;\n\n\t\t\t/*\n\t\t\t * Animate active button\'s icon.\n\t\t\t */\n\t\t\t& svg {\n\t\t\t\t& polyline {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-dash 2s linear;\n\t\t\t\t}\n\n\t\t\t\t& line {\n\t\t\t\t\tanimation: ck-widget-type-around-arrow-tip-dash 2s linear;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Show type around buttons when the widget gets selected or being hovered.\n\t */\n\t&.ck-widget_selected,\n\t&:hover {\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-visible;\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the buttons when the widget is NOT selected (but the buttons are visible\n\t * and still can be hovered).\n\t */\n\t&:not(.ck-widget_selected) > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\tbackground: var(--ck-color-widget-type-around-button-hover);\n\t}\n\n\t/*\n\t * Styles for the buttons when:\n\t * - the widget is selected,\n\t * - or the button is being hovered (regardless of the widget state).\n\t */\n\t&.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button,\n\t& > .ck-widget__type-around > .ck-widget__type-around__button:hover {\n\t\tbackground: var(--ck-color-widget-type-around-button-active);\n\n\t\t&::after {\n\t\t\twidth: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\theight: calc(var(--ck-widget-type-around-button-size) - 2px);\n\t\t\tborder-radius: 100px;\n\t\t\tbackground: linear-gradient(135deg, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,.3) 100%);\n\t\t}\n\t}\n\n\t/*\n\t * Styles for the "before" button when the widget has a selection handle. Because some space\n\t * is consumed by the handle, the button must be moved slightly to the right to let it breathe.\n\t */\n\t&.ck-widget_with-selection-handle > .ck-widget__type-around > .ck-widget__type-around__button_before {\n\t\tmargin-left: 20px;\n\t}\n\n\t/*\n\t * Styles for the horizontal "fake caret" which is displayed when the user navigates using the keyboard.\n\t */\n\t& .ck-widget__type-around__fake-caret {\n\t\tpointer-events: none;\n\t\theight: 1px;\n\t\tanimation: ck-widget-type-around-fake-caret-pulse linear 1s infinite normal forwards;\n\n\t\t/*\n\t\t * The semi-transparent-outline+background combo improves the contrast\n\t\t * when the background underneath the fake caret is dark.\n\t\t */\n\t\toutline: solid 1px hsla(0, 0%, 100%, .5);\n\t\tbackground: var(--ck-color-base-text);\n\t}\n\n\t/*\n\t * Styles of the widget when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t * Despite the widget being physically selected in the model, its outline should disappear.\n\t */\n\t&.ck-widget_selected {\n\t\t&.ck-widget_type-around_show-fake-caret_before,\n\t\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t\toutline-color: transparent;\n\t\t}\n\t}\n\n\t&.ck-widget_type-around_show-fake-caret_before,\n\t&.ck-widget_type-around_show-fake-caret_after {\n\t\t/*\n\t\t * When the "fake caret" is visible we simulate that the widget is not selected\n\t\t * (despite being physically selected), so the outline color should be for the\n\t\t * unselected widget.\n\t\t */\n\t\t&.ck-widget_selected:hover {\n\t\t\toutline-color: var(--ck-color-widget-hover-border);\n\t\t}\n\n\t\t/*\n\t\t * Styles of the type around buttons when the "fake caret" is blinking (e.g. upon keyboard navigation).\n\t\t * In this state, the type around buttons would collide with the fake carets so they should disappear.\n\t\t */\n\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the selection handle. When the caret is visible, simply\n\t\t * hide the handle because it intersects with the caret (and does not make much sense anyway).\n\t\t */\n\t\t&.ck-widget_with-selection-handle {\n\t\t\t&.ck-widget_selected,\n\t\t\t&.ck-widget_selected:hover {\n\t\t\t\t& > .ck-widget__selection-handle {\n\t\t\t\t\topacity: 0\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Fake horizontal caret integration with the resize UI. When the caret is visible, simply\n\t\t * hide the resize UI because it creates too much noise. It can be visible when the user\n\t\t * hovers the widget, though.\n\t\t */\n\t\t&.ck-widget_selected.ck-widget_with-resizer > .ck-widget__resizer {\n\t\t\topacity: 0\n\t\t}\n\t}\n}\n\n/*\n * Styles for the "before" button when the widget has a selection handle in an RTL environment.\n * The selection handler is aligned to the right side of the widget so there is no need to create\n * additional space for it next to the "before" button.\n */\n.ck[dir="rtl"] .ck-widget.ck-widget_with-selection-handle .ck-widget__type-around > .ck-widget__type-around__button_before {\n\tmargin-left: 0;\n\tmargin-right: 20px;\n}\n\n/*\n * Hide type around buttons when the widget is selected as a child of a selected\n * nested editable (e.g. mulit-cell table selection).\n *\n * See https://github.com/ckeditor/ckeditor5/issues/7263.\n */\n.ck-editor__nested-editable.ck-editor__editable_selected {\n\t& .ck-widget {\n\t\t&.ck-widget_selected,\n\t\t&:hover {\n\t\t\t& > .ck-widget__type-around > .ck-widget__type-around__button {\n\t\t\t\t@mixin ck-widget-type-around-button-hidden;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n * Styles for the buttons when the widget is selected but the user clicked outside of the editor (blurred the editor).\n */\n.ck-editor__editable.ck-blurred .ck-widget.ck-widget_selected > .ck-widget__type-around > .ck-widget__type-around__button:not(:hover) {\n\tbackground: var(--ck-color-widget-type-around-button-blurred-editable);\n\n\t& svg * {\n\t\tstroke: hsl(0,0%,60%);\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-dash {\n\t0% {\n\t\tstroke-dashoffset: 10;\n\t}\n\t20%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-arrow-tip-dash {\n\t0%, 20% {\n\t\tstroke-dashoffset: 7;\n\t}\n\t40%, 100% {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes ck-widget-type-around-button-sonar {\n\t0% {\n\t\tbox-shadow: 0 0 0 0 hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n\t50% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-end-alpha));\n\t}\n\t100% {\n\t\tbox-shadow: 0 0 0 5px hsla(var(--ck-color-focus-border-coordinates), var(--ck-color-widget-type-around-button-radar-start-alpha));\n\t}\n}\n\n@keyframes ck-widget-type-around-fake-caret-pulse {\n\t0% {\n\t\topacity: 1;\n\t}\n\t49% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0;\n\t}\n\t99% {\n\t\topacity: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t}\n}\n'],sourceRoot:""}]);const a=s},935:t=>{"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var n=t(e);return e[2]?"@media ".concat(e[2]," {").concat(n,"}"):n})).join("")},e.i=function(t,n,o){"string"==typeof t&&(t=[[null,t,""]]);var i={};if(o)for(var r=0;r{"use strict";function e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=t&&("undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"]);if(null==n)return;var o,i,r=[],s=!0,a=!1;try{for(n=n.call(t);!(s=(o=n.next()).done)&&(r.push(o.value),!e||r.length!==e);s=!0);}catch(t){a=!0,i=t}finally{try{s||null==n.return||n.return()}finally{if(a)throw i}}return r}(t,e)||function(t,e){if(!t)return;if("string"==typeof t)return n(t,e);var o=Object.prototype.toString.call(t).slice(8,-1);"Object"===o&&t.constructor&&(o=t.constructor.name);if("Map"===o||"Set"===o)return Array.from(t);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return n(t,e)}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n{"use strict";var o,i=function(){return void 0===o&&(o=Boolean(window&&document&&document.all&&!window.atob)),o},r=function(){var t={};return function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(t){n=null}t[e]=n}return t[e]}}(),s=[];function a(t){for(var e=-1,n=0;n{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.nc=void 0;var o={};return(()=>{"use strict";function t({emitter:t,activator:e,callback:n,contextElements:o}){t.listenTo(document,"mousedown",((t,i)=>{if(!e())return;const r="function"==typeof i.composedPath?i.composedPath():[],s="function"==typeof o?o():o;for(const t of s)if(t.contains(i.target)||r.includes(t))return;n()}))}function e(t){return class extends t{disableCssTransitions(){this._isCssTransitionsDisabled=!0}enableCssTransitions(){this._isCssTransitionsDisabled=!1}constructor(...t){super(...t),this.set("_isCssTransitionsDisabled",!1),this.initializeCssTransitionDisablerMixin()}initializeCssTransitionDisablerMixin(){this.extendTemplate({attributes:{class:[this.bindTemplate.if("_isCssTransitionsDisabled","ck-transitions-disabled")]}})}}}function i({view:t}){t.listenTo(t.element,"submit",((e,n)=>{n.preventDefault(),t.fire("submit")}),{useCapture:!0})}function r({keystrokeHandler:t,focusTracker:e,gridItems:n,numberOfColumns:o,uiLanguageDirection:i}){const r="number"==typeof o?()=>o:o;function s(t){return o=>{const i=n.find((t=>t.element===e.focusedElement)),r=n.getIndex(i),s=t(r,n);n.get(s).focus(),o.stopPropagation(),o.preventDefault()}}function a(t,e){return t===e-1?0:t+1}function c(t,e){return 0===t?e-1:t-1}t.set("arrowright",s(((t,e)=>"rtl"===i?c(t,e.length):a(t,e.length)))),t.set("arrowleft",s(((t,e)=>"rtl"===i?a(t,e.length):c(t,e.length)))),t.set("arrowup",s(((t,e)=>{let n=t-r();return n<0&&(n=t+r()*Math.floor(e.length/r()),n>e.length-1&&(n-=r())),n}))),t.set("arrowdown",s(((t,e)=>{let n=t+r();return n>e.length-1&&(n=t%r()),n})))}n.d(o,{default:()=>NT});const s=function(){try{return navigator.userAgent.toLowerCase()}catch(t){return""}}();var a;const c={isMac:l(s),isWindows:(a=s,a.indexOf("windows")>-1),isGecko:function(t){return!!t.match(/gecko\/\d+/)}(s),isSafari:function(t){return t.indexOf(" applewebkit/")>-1&&-1===t.indexOf("chrome")}(s),isiOS:function(t){return!!t.match(/iphone|ipad/i)||l(t)&&navigator.maxTouchPoints>0}(s),isAndroid:function(t){return t.indexOf("android")>-1}(s),isBlink:function(t){return t.indexOf("chrome/")>-1&&t.indexOf("edge/")<0}(s),features:{isRegExpUnicodePropertySupported:function(){let t=!1;try{t=0==="ć".search(new RegExp("[\\p{L}]","u"))}catch(t){}return t}()}};function l(t){return t.indexOf("macintosh")>-1}function d(t,e,n,o){n=n||function(t,e){return t===e};const i=Array.isArray(t)?t:Array.prototype.slice.call(t),r=Array.isArray(e)?e:Array.prototype.slice.call(e),s=function(t,e,n){const o=u(t,e,n);if(-1===o)return{firstIndex:-1,lastIndexOld:-1,lastIndexNew:-1};const i=h(t,o),r=h(e,o),s=u(i,r,n),a=t.length-s,c=e.length-s;return{firstIndex:o,lastIndexOld:a,lastIndexNew:c}}(i,r,n),a=o?function(t,e){const{firstIndex:n,lastIndexOld:o,lastIndexNew:i}=t;if(-1===n)return Array(e).fill("equal");let r=[];n>0&&(r=r.concat(Array(n).fill("equal")));i-n>0&&(r=r.concat(Array(i-n).fill("insert")));o-n>0&&(r=r.concat(Array(o-n).fill("delete")));i0&&n.push({index:o,type:"insert",values:t.slice(o,r)});i-o>0&&n.push({index:o+(r-o),type:"delete",howMany:i-o});return n}(r,s);return a}function u(t,e,n){for(let o=0;o200||i>200||o+i>300)return g.fastDiff(t,e,n,!0);let r,s;if(il?-1:1;d[o+h]&&(d[o]=d[o+h].slice(0)),d[o]||(d[o]=[]),d[o].push(i>l?r:s);let g=Math.max(i,l),m=g-o;for(;ml;m--)u[m]=h(m);u[l]=h(l),p++}while(u[l]!==c);return d[l].slice(1)}g.fastDiff=d;const m=function(){return function t(){t.called=!0}};class p{constructor(t,e){this.source=t,this.name=e,this.path=[],this.stop=m(),this.off=m()}}const f=new Array(256).fill("").map(((t,e)=>("0"+e.toString(16)).slice(-2)));function k(){const t=4294967296*Math.random()>>>0,e=4294967296*Math.random()>>>0,n=4294967296*Math.random()>>>0,o=4294967296*Math.random()>>>0;return"e"+f[255&t]+f[t>>8&255]+f[t>>16&255]+f[t>>24&255]+f[255&e]+f[e>>8&255]+f[e>>16&255]+f[e>>24&255]+f[255&n]+f[n>>8&255]+f[n>>16&255]+f[n>>24&255]+f[255&o]+f[o>>8&255]+f[o>>16&255]+f[o>>24&255]}const b={get(t="normal"){return"number"!=typeof t?this[t]||this.normal:t},highest:1e5,high:1e3,normal:0,low:-1e3,lowest:-1e5};function w(t,e){const n=b.get(e.priority);for(let o=0;o{if("object"==typeof e&&null!==e){if(n.has(e))return`[object ${e.constructor.name}]`;n.add(e)}return e},i=e?` ${JSON.stringify(e,o)}`:"",r=y(t);return t+i+r}(t,n)),this.name="CKEditorError",this.context=e,this.data=n}is(t){return"CKEditorError"===t}static rethrowUnexpectedError(t,e){if(t.is&&t.is("CKEditorError"))throw t;const n=new _(t.message,e);throw n.stack=t.stack,n}}function C(t,e){console.warn(...x(t,e))}function v(t,e){console.error(...x(t,e))}function y(t){return`\nRead more: ${A}#error-${t}`}function x(t,e){const n=y(t);return e?[t,e,n]:[t,n]}const E="41.3.1",D=new Date(2024,3,16);if(globalThis.CKEDITOR_VERSION)throw new _("ckeditor-duplicated-modules",null);globalThis.CKEDITOR_VERSION=E;const I=Symbol("listeningTo"),M=Symbol("emitterId"),T=Symbol("delegations"),S=B(Object);function B(t){if(!t)return S;return class extends t{on(t,e,n){this.listenTo(this,t,e,n)}once(t,e,n){let o=!1;this.listenTo(this,t,((t,...n)=>{o||(o=!0,t.off(),e.call(this,t,...n))}),n)}off(t,e){this.stopListening(this,t,e)}listenTo(t,e,n,o={}){let i,r;this[I]||(this[I]={});const s=this[I];P(t)||N(t);const a=P(t);(i=s[a])||(i=s[a]={emitter:t,callbacks:{}}),(r=i.callbacks[e])||(r=i.callbacks[e]=[]),r.push(n),function(t,e,n,o,i){e._addEventListener?e._addEventListener(n,o,i):t._addEventListener.call(e,n,o,i)}(this,t,e,n,o)}stopListening(t,e,n){const o=this[I];let i=t&&P(t);const r=o&&i?o[i]:void 0,s=r&&e?r.callbacks[e]:void 0;if(!(!o||t&&!r||e&&!s))if(n){j(this,t,e,n);-1!==s.indexOf(n)&&(1===s.length?delete r.callbacks[e]:j(this,t,e,n))}else if(s){for(;n=s.pop();)j(this,t,e,n);delete r.callbacks[e]}else if(r){for(e in r.callbacks)this.stopListening(t,e);delete o[i]}else{for(i in o)this.stopListening(o[i].emitter);delete this[I]}}fire(t,...e){try{const n=t instanceof p?t:new p(this,t),o=n.name;let i=z(this,o);if(n.path.push(this),i){const t=[n,...e];i=Array.from(i);for(let e=0;e{this[T]||(this[T]=new Map),t.forEach((t=>{const o=this[T].get(t);o?o.set(e,n):this[T].set(t,new Map([[e,n]]))}))}}}stopDelegating(t,e){if(this[T])if(t)if(e){const n=this[T].get(t);n&&n.delete(e)}else this[T].delete(t);else this[T].clear()}_addEventListener(t,e,n){!function(t,e){const n=O(t);if(n[e])return;let o=e,i=null;const r=[];for(;""!==o&&!n[o];)n[o]={callbacks:[],childEvents:[]},r.push(n[o]),i&&n[o].childEvents.push(i),i=o,o=o.substr(0,o.lastIndexOf(":"));if(""!==o){for(const t of r)t.callbacks=n[o].callbacks.slice();n[o].childEvents.push(i)}}(this,t);const o=L(this,t),i={callback:e,priority:b.get(n.priority)};for(const t of o)w(t,i)}_removeEventListener(t,e){const n=L(this,t);for(const t of n)for(let n=0;n-1?z(t,e.substr(0,e.lastIndexOf(":"))):null}function R(t,e,n){for(let[o,i]of t){i?"function"==typeof i&&(i=i(e.name)):i=e.name;const t=new p(e.source,i);t.path=[...e.path],o.fire(t,...n)}}function j(t,e,n,o){e._removeEventListener?e._removeEventListener(n,o):t._removeEventListener.call(e,n,o)}["on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{B[t]=S.prototype[t]}));const F=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)},V=Symbol("observableProperties"),H=Symbol("boundObservables"),U=Symbol("boundProperties"),q=Symbol("decoratedMethods"),G=Symbol("decoratedOriginal"),W=K(B());function K(t){if(!t)return W;return class extends t{set(t,e){if(F(t))return void Object.keys(t).forEach((e=>{this.set(e,t[e])}),this);$(this);const n=this[V];if(t in this&&!n.has(t))throw new _("observable-set-cannot-override",this);Object.defineProperty(this,t,{enumerable:!0,configurable:!0,get:()=>n.get(t),set(e){const o=n.get(t);let i=this.fire(`set:${t}`,t,e,o);void 0===i&&(i=e),o===i&&n.has(t)||(n.set(t,i),this.fire(`change:${t}`,t,i,o))}}),this[t]=e}bind(...t){if(!t.length||!Z(t))throw new _("observable-bind-wrong-properties",this);if(new Set(t).size!==t.length)throw new _("observable-bind-duplicate-properties",this);$(this);const e=this[U];t.forEach((t=>{if(e.has(t))throw new _("observable-bind-rebind",this)}));const n=new Map;return t.forEach((t=>{const o={property:t,to:[]};e.set(t,o),n.set(t,o)})),{to:Y,toMany:Q,_observable:this,_bindProperties:t,_to:[],_bindings:n}}unbind(...t){if(!this[V])return;const e=this[U],n=this[H];if(t.length){if(!Z(t))throw new _("observable-unbind-wrong-properties",this);t.forEach((t=>{const o=e.get(t);o&&(o.to.forEach((([t,e])=>{const i=n.get(t),r=i[e];r.delete(o),r.size||delete i[e],Object.keys(i).length||(n.delete(t),this.stopListening(t,"change"))})),e.delete(t))}))}else n.forEach(((t,e)=>{this.stopListening(e,"change")})),n.clear(),e.clear()}decorate(t){$(this);const e=this[t];if(!e)throw new _("observablemixin-cannot-decorate-undefined",this,{object:this,methodName:t});this.on(t,((t,n)=>{t.return=e.apply(this,n)})),this[t]=function(...e){return this.fire(t,e)},this[t][G]=e,this[q]||(this[q]=[]),this[q].push(t)}stopListening(t,e,n){if(!t&&this[q]){for(const t of this[q])this[t]=this[t][G];delete this[q]}super.stopListening(t,e,n)}}}function $(t){t[V]||(Object.defineProperty(t,V,{value:new Map}),Object.defineProperty(t,H,{value:new Map}),Object.defineProperty(t,U,{value:new Map}))}function Y(...t){const e=function(...t){if(!t.length)throw new _("observable-bind-to-parse-error",null);const e={to:[]};let n;"function"==typeof t[t.length-1]&&(e.callback=t.pop());return t.forEach((t=>{if("string"==typeof t)n.properties.push(t);else{if("object"!=typeof t)throw new _("observable-bind-to-parse-error",null);n={observable:t,properties:[]},e.to.push(n)}})),e}(...t),n=Array.from(this._bindings.keys()),o=n.length;if(!e.callback&&e.to.length>1)throw new _("observable-bind-to-no-callback",this);if(o>1&&e.callback)throw new _("observable-bind-to-extra-callback",this);var i;e.to.forEach((t=>{if(t.properties.length&&t.properties.length!==o)throw new _("observable-bind-to-properties-length",this);t.properties.length||(t.properties=this._bindProperties)})),this._to=e.to,e.callback&&(this._bindings.get(n[0]).callback=e.callback),i=this._observable,this._to.forEach((t=>{const e=i[H];let n;e.get(t.observable)||i.listenTo(t.observable,"change",((o,r)=>{n=e.get(t.observable)[r],n&&n.forEach((t=>{J(i,t.property)}))}))})),function(t){let e;t._bindings.forEach(((n,o)=>{t._to.forEach((i=>{e=i.properties[n.callback?0:t._bindProperties.indexOf(o)],n.to.push([i.observable,e]),function(t,e,n,o){const i=t[H],r=i.get(n),s=r||{};s[o]||(s[o]=new Set);s[o].add(e),r||i.set(n,s)}(t._observable,n,i.observable,e)}))}))}(this),this._bindProperties.forEach((t=>{J(this._observable,t)}))}function Q(t,e,n){if(this._bindings.size>1)throw new _("observable-bind-to-many-not-one-binding",this);this.to(...function(t,e){const n=t.map((t=>[t,e]));return Array.prototype.concat.apply([],n)}(t,e),n)}function Z(t){return t.every((t=>"string"==typeof t))}function J(t,e){const n=t[U].get(e);let o;n.callback?o=n.callback.apply(t,n.to.map((t=>t[0][t[1]]))):(o=n.to[0],o=o[0][o[1]]),Object.prototype.hasOwnProperty.call(t,e)?t[e]=o:t.set(e,o)}["set","bind","unbind","decorate","on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{K[t]=W.prototype[t]}));class X{constructor(){this._replacedElements=[]}replace(t,e){this._replacedElements.push({element:t,newElement:e}),t.style.display="none",e&&t.parentNode.insertBefore(e,t.nextSibling)}restore(){this._replacedElements.forEach((({element:t,newElement:e})=>{t.style.display="",e&&e.remove()})),this._replacedElements=[]}}function tt(t){let e=0;for(const n of t)e++;return e}function et(t,e){const n=Math.min(t.length,e.length);for(let o=0;o-1};const Ot=function(t,e){var n=this.__data__,o=Tt(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this};function Lt(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&t-1&&t%1==0&&t<=9007199254740991};var We={};We["[object Float32Array]"]=We["[object Float64Array]"]=We["[object Int8Array]"]=We["[object Int16Array]"]=We["[object Int32Array]"]=We["[object Uint8Array]"]=We["[object Uint8ClampedArray]"]=We["[object Uint16Array]"]=We["[object Uint32Array]"]=!0,We["[object Arguments]"]=We["[object Array]"]=We["[object ArrayBuffer]"]=We["[object Boolean]"]=We["[object DataView]"]=We["[object Date]"]=We["[object Error]"]=We["[object Function]"]=We["[object Map]"]=We["[object Number]"]=We["[object Object]"]=We["[object RegExp]"]=We["[object Set]"]=We["[object String]"]=We["[object WeakMap]"]=!1;const Ke=function(t){return kt(t)&&Ge(t.length)&&!!We[pt(t)]};const $e=function(t){return function(e){return t(e)}};var Ye="object"==typeof exports&&exports&&!exports.nodeType&&exports,Qe=Ye&&"object"==typeof module&&module&&!module.nodeType&&module,Ze=Qe&&Qe.exports===Ye&&ot.process;const Je=function(){try{var t=Qe&&Qe.require&&Qe.require("util").types;return t||Ze&&Ze.binding&&Ze.binding("util")}catch(t){}}();var Xe=Je&&Je.isTypedArray;const tn=Xe?$e(Xe):Ke;var en=Object.prototype.hasOwnProperty;const nn=function(t,e){var n=ft(t),o=!n&&ze(t),i=!n&&!o&&He(t),r=!n&&!o&&!i&&tn(t),s=n||o||i||r,a=s?Be(t.length,String):[],c=a.length;for(var l in t)!e&&!en.call(t,l)||s&&("length"==l||i&&("offset"==l||"parent"==l)||r&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||qe(l,c))||a.push(l);return a};var on=Object.prototype;const rn=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||on)};const sn=At(Object.keys,Object);var an=Object.prototype.hasOwnProperty;const cn=function(t){if(!rn(t))return sn(t);var e=[];for(var n in Object(t))an.call(t,n)&&"constructor"!=n&&e.push(n);return e};const ln=function(t){return null!=t&&Ge(t.length)&&!Ht(t)};const dn=function(t){return ln(t)?nn(t):cn(t)};const un=function(t,e){return t&&Se(e,dn(e),t)};const hn=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e};var gn=Object.prototype.hasOwnProperty;const mn=function(t){if(!F(t))return hn(t);var e=rn(t),n=[];for(var o in t)("constructor"!=o||!e&&gn.call(t,o))&&n.push(o);return n};const pn=function(t){return ln(t)?nn(t,!0):mn(t)};const fn=function(t,e){return t&&Se(e,pn(e),t)};var kn="object"==typeof exports&&exports&&!exports.nodeType&&exports,bn=kn&&"object"==typeof module&&module&&!module.nodeType&&module,wn=bn&&bn.exports===kn?rt.Buffer:void 0,An=wn?wn.allocUnsafe:void 0;const _n=function(t,e){if(e)return t.slice();var n=t.length,o=An?An(n):new t.constructor(n);return t.copy(o),o};const Cn=function(t,e){var n=-1,o=t.length;for(e||(e=Array(o));++n{this._setToTarget(t,o,e[o],n)}))}}function Do(t){return yo(t,Io)}function Io(t){return xo(t)||"function"==typeof t?t:void 0}function Mo(t){if(t){if(t.defaultView)return t instanceof t.defaultView.Document;if(t.ownerDocument&&t.ownerDocument.defaultView)return t instanceof t.ownerDocument.defaultView.Node}return!1}function To(t){const e=Object.prototype.toString.apply(t);return"[object Window]"==e||"[object global]"==e}const So=Bo(B());function Bo(t){if(!t)return So;return class extends t{listenTo(t,e,n,o={}){if(Mo(t)||To(t)){const i={capture:!!o.useCapture,passive:!!o.usePassive},r=this._getProxyEmitter(t,i)||new No(t,i);this.listenTo(r,e,n,o)}else super.listenTo(t,e,n,o)}stopListening(t,e,n){if(Mo(t)||To(t)){const o=this._getAllProxyEmitters(t);for(const t of o)this.stopListening(t,e,n)}else super.stopListening(t,e,n)}_getProxyEmitter(t,e){return function(t,e){const n=t[I];return n&&n[e]?n[e].emitter:null}(this,Po(t,e))}_getAllProxyEmitters(t){return[{capture:!1,passive:!1},{capture:!1,passive:!0},{capture:!0,passive:!1},{capture:!0,passive:!0}].map((e=>this._getProxyEmitter(t,e))).filter((t=>!!t))}}}["_getProxyEmitter","_getAllProxyEmitters","on","once","off","listenTo","stopListening","fire","delegate","stopDelegating","_addEventListener","_removeEventListener"].forEach((t=>{Bo[t]=So.prototype[t]}));class No extends(B()){constructor(t,e){super(),N(this,Po(t,e)),this._domNode=t,this._options=e}attach(t){if(this._domListeners&&this._domListeners[t])return;const e=this._createDomListener(t);this._domNode.addEventListener(t,e,this._options),this._domListeners||(this._domListeners={}),this._domListeners[t]=e}detach(t){let e;!this._domListeners[t]||(e=this._events[t])&&e.callbacks.length||this._domListeners[t].removeListener()}_addEventListener(t,e,n){this.attach(t),B().prototype._addEventListener.call(this,t,e,n)}_removeEventListener(t,e){B().prototype._removeEventListener.call(this,t,e),this.detach(t)}_createDomListener(t){const e=e=>{this.fire(t,e)};return e.removeListener=()=>{this._domNode.removeEventListener(t,e,this._options),delete this._domListeners[t]},e}}function Po(t,e){let n=function(t){return t["data-ck-expando"]||(t["data-ck-expando"]=k())}(t);for(const t of Object.keys(e).sort())e[t]&&(n+="-"+t);return n}let Oo;try{Oo={window,document}}catch(t){Oo={window:{},document:{}}}const Lo=Oo;function zo(t){const e=t.ownerDocument.defaultView.getComputedStyle(t);return{top:parseInt(e.borderTopWidth,10),right:parseInt(e.borderRightWidth,10),bottom:parseInt(e.borderBottomWidth,10),left:parseInt(e.borderLeftWidth,10)}}function Ro(t){return"[object Text]"==Object.prototype.toString.call(t)}function jo(t){return"[object Range]"==Object.prototype.toString.apply(t)}function Fo(t){return t&&t.parentNode?t.offsetParent===Lo.document.body?null:t.offsetParent:null}const Vo=["top","right","bottom","left","width","height"];class Ho{constructor(t){const e=jo(t);if(Object.defineProperty(this,"_source",{value:t._source||t,writable:!0,enumerable:!1}),Go(t)||e)if(e){const e=Ho.getDomRangeRects(t);Uo(this,Ho.getBoundingRect(e))}else Uo(this,t.getBoundingClientRect());else if(To(t)){const{innerWidth:e,innerHeight:n}=t;Uo(this,{top:0,right:e,bottom:n,left:0,width:e,height:n})}else Uo(this,t)}clone(){return new Ho(this)}moveTo(t,e){return this.top=e,this.right=t+this.width,this.bottom=e+this.height,this.left=t,this}moveBy(t,e){return this.top+=e,this.right+=t,this.left+=t,this.bottom+=e,this}getIntersection(t){const e={top:Math.max(this.top,t.top),right:Math.min(this.right,t.right),bottom:Math.min(this.bottom,t.bottom),left:Math.max(this.left,t.left),width:0,height:0};if(e.width=e.right-e.left,e.height=e.bottom-e.top,e.width<0||e.height<0)return null;{const t=new Ho(e);return t._source=this._source,t}}getIntersectionArea(t){const e=this.getIntersection(t);return e?e.getArea():0}getArea(){return this.width*this.height}getVisible(){const t=this._source;let e=this.clone();if(qo(t))return e;let n,o=t,i=t.parentNode||t.commonAncestorContainer;for(;i&&!qo(i);){const t="visible"===((r=i)instanceof HTMLElement?r.ownerDocument.defaultView.getComputedStyle(r).overflow:"visible");o instanceof HTMLElement&&"absolute"===Wo(o)&&(n=o);const s=Wo(i);if(t||n&&("relative"===s&&t||"relative"!==s)){o=i,i=i.parentNode;continue}const a=new Ho(i),c=e.getIntersection(a);if(!c)return null;c.getArea(){for(const e of t){const t=Ko._getElementCallbacks(e.target);if(t)for(const n of t)n(e)}}))}};let $o=Ko;function Yo(t,e){t instanceof HTMLTextAreaElement&&(t.value=e),t.innerHTML=e}function Qo(t){return e=>e+t}function Zo(t){let e=0;for(;t.previousSibling;)t=t.previousSibling,e++;return e}function Jo(t,e,n){t.insertBefore(n,t.childNodes[e]||null)}function Xo(t){return t&&t.nodeType===Node.COMMENT_NODE}function ti(t){return!!(t&&t.getClientRects&&t.getClientRects().length)}$o._observerInstance=null,$o._elementCallbacks=null;var ei=Math.pow;function ni({element:t,target:e,positions:n,limiter:o,fitInViewport:i,viewportOffsetConfig:r}){Ht(e)&&(e=e()),Ht(o)&&(o=o());const s=Fo(t),a=function(t){t=Object.assign({top:0,bottom:0,left:0,right:0},t);const e=new Ho(Lo.window);return e.top+=t.top,e.height-=t.top,e.bottom-=t.bottom,e.height-=t.bottom,e}(r),c=new Ho(t),l=oi(e,a);let d;if(!l||!a.getIntersection(l))return null;const u={targetRect:l,elementRect:c,positionedElementAncestor:s,viewportRect:a};if(o||i){if(o){const t=oi(o,a);t&&(u.limiterRect=t)}d=function(t,e){const{elementRect:n}=e,o=n.getArea(),i=t.map((t=>new ii(t,e))).filter((t=>!!t.name));let r=0,s=null;for(const t of i){const{limiterIntersectionArea:e,viewportIntersectionArea:n}=t;if(e===o)return t;const i=ei(n,2)+ei(e,2);i>r&&(r=i,s=t)}return s}(n,u)}else d=new ii(n[0],u);return d}function oi(t,e){const n=new Ho(t).getVisible();return n?n.getIntersection(e):null}class ii{constructor(t,e){const n=t(e.targetRect,e.elementRect,e.viewportRect,e.limiterRect);if(!n)return;const{left:o,top:i,name:r,config:s}=n;this.name=r,this.config=s,this._positioningFunctionCoordinates={left:o,top:i},this._options=e}get left(){return this._absoluteRect.left}get top(){return this._absoluteRect.top}get limiterIntersectionArea(){const t=this._options.limiterRect;return t?t.getIntersectionArea(this._rect):0}get viewportIntersectionArea(){return this._options.viewportRect.getIntersectionArea(this._rect)}get _rect(){return this._cachedRect||(this._cachedRect=this._options.elementRect.clone().moveTo(this._positioningFunctionCoordinates.left,this._positioningFunctionCoordinates.top)),this._cachedRect}get _absoluteRect(){return this._cachedAbsoluteRect||(this._cachedAbsoluteRect=this._rect.toAbsoluteRect()),this._cachedAbsoluteRect}}function ri(t){const e=t.parentNode;e&&e.removeChild(t)}function si({window:t,rect:e,alignToTop:n,forceScroll:o,viewportOffset:i}){const r=e.clone().moveBy(0,i.bottom),s=e.clone().moveBy(0,-i.top),a=new Ho(t).excludeScrollbarsAndBorders(),c=n&&o,l=[s,r].every((t=>a.contains(t)));let{scrollX:d,scrollY:u}=t;const h=d,g=u;c?u-=a.top-e.top+i.top:l||(li(s,a)?u-=a.top-e.top+i.top:ci(r,a)&&(u+=n?e.top-a.top-i.top:e.bottom-a.bottom+i.bottom)),l||(di(e,a)?d-=a.left-e.left+i.left:ui(e,a)&&(d+=e.right-a.right+i.right)),d==h&&u===g||t.scrollTo(d,u)}function ai({parent:t,getRect:e,alignToTop:n,forceScroll:o,ancestorOffset:i=0,limiterElement:r}){const s=hi(t),a=n&&o;let c,l,d;const u=r||s.document.body;for(;t!=u;)l=e(),c=new Ho(t).excludeScrollbarsAndBorders(),d=c.contains(l),a?t.scrollTop-=c.top-l.top+i:d||(li(l,c)?t.scrollTop-=c.top-l.top+i:ci(l,c)&&(t.scrollTop+=n?l.top-c.top-i:l.bottom-c.bottom+i)),d||(di(l,c)?t.scrollLeft-=c.left-l.left+i:ui(l,c)&&(t.scrollLeft+=l.right-c.right+i)),t=t.parentNode}function ci(t,e){return t.bottom>e.bottom}function li(t,e){return t.tope.right}function hi(t){return jo(t)?t.startContainer.ownerDocument.defaultView:t.ownerDocument.defaultView}function gi(t){if(jo(t)){let e=t.commonAncestorContainer;return Ro(e)&&(e=e.parentNode),e}return t.parentNode}function mi(t,e){const n=hi(t),o=new Ho(t);if(n===e)return o;{let t=n;for(;t!=e;){const e=t.frameElement,n=new Ho(e).excludeScrollbarsAndBorders();o.moveBy(n.left,n.top),t=t.parent}}return o}const pi={ctrl:"⌃",cmd:"⌘",alt:"⌥",shift:"⇧"},fi={ctrl:"Ctrl+",alt:"Alt+",shift:"Shift+"},ki={37:"←",38:"↑",39:"→",40:"↓",9:"⇥",33:"Page Up",34:"Page Down"},bi=function(){const t={pageup:33,pagedown:34,arrowleft:37,arrowup:38,arrowright:39,arrowdown:40,backspace:8,delete:46,enter:13,space:32,esc:27,tab:9,ctrl:1114112,shift:2228224,alt:4456448,cmd:8912896};for(let e=65;e<=90;e++){t[String.fromCharCode(e).toLowerCase()]=e}for(let e=48;e<=57;e++)t[e-48]=e;for(let e=112;e<=123;e++)t["f"+(e-111)]=e;return Object.assign(t,{"'":222,",":108,"-":109,".":110,"/":111,";":186,"=":187,"[":219,"\\":220,"]":221,"`":223}),t}(),wi=Object.fromEntries(Object.entries(bi).map((([t,e])=>{let n;return n=e in ki?ki[e]:t.charAt(0).toUpperCase()+t.slice(1),[e,n]})));function Ai(t){let e;if("string"==typeof t){if(e=bi[t.toLowerCase()],!e)throw new _("keyboard-unknown-key",null,{key:t})}else e=t.keyCode+(t.altKey?bi.alt:0)+(t.ctrlKey?bi.ctrl:0)+(t.shiftKey?bi.shift:0)+(t.metaKey?bi.cmd:0);return e}function _i(t){return"string"==typeof t&&(t=function(t){return t.split("+").map((t=>t.trim()))}(t)),t.map((t=>"string"==typeof t?function(t){if(t.endsWith("!"))return Ai(t.slice(0,-1));const e=Ai(t);return(c.isMac||c.isiOS)&&e==bi.ctrl?bi.cmd:e}(t):t)).reduce(((t,e)=>e+t),0)}function Ci(t){let e=_i(t);return Object.entries(c.isMac||c.isiOS?pi:fi).reduce(((t,[n,o])=>(e&bi[n]&&(e&=~bi[n],t+=o),t)),"")+(e?wi[e]:"")}function vi(t,e){const n="ltr"===e;switch(t){case bi.arrowleft:return n?"left":"right";case bi.arrowright:return n?"right":"left";case bi.arrowup:return"up";case bi.arrowdown:return"down"}}function yi(t){return Array.isArray(t)?t:[t]}const xi=function(t,e,n){(void 0!==n&&!Mt(t[e],n)||void 0===n&&!(e in t))&&Ie(t,e,n)};const Ei=function(t){return function(e,n,o){for(var i=-1,r=Object(e),s=o(e),a=s.length;a--;){var c=s[t?a:++i];if(!1===n(r[c],c,r))break}return e}}();const Di=function(t){return kt(t)&&ln(t)};const Ii=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};const Mi=function(t){return Se(t,pn(t))};const Ti=function(t,e,n,o,i,r,s){var a=Ii(t,n),c=Ii(e,n),l=s.get(c);if(l)xi(t,n,l);else{var d=r?r(a,c,n+"",t,e,s):void 0,u=void 0===d;if(u){var h=ft(c),g=!h&&He(c),m=!h&&!g&&tn(c);d=c,h||g||m?ft(a)?d=a:Di(a)?d=Cn(a):g?(u=!1,d=_n(c,!0)):m?(u=!1,d=ao(c,!0)):d=[]:Dt(c)||ze(c)?(d=a,ze(a)?d=Mi(a):F(a)&&!Ht(a)||(d=ho(c))):u=!1}u&&(s.set(c,d),i(d,c,o,r,s),s.delete(c)),xi(t,n,d)}};const Si=function t(e,n,o,i,r){e!==n&&Ei(n,(function(s,a){if(r||(r=new xe),F(s))Ti(e,n,a,o,t,i,r);else{var c=i?i(Ii(e,a),s,a+"",e,n,r):void 0;void 0===c&&(c=s),xi(e,a,c)}}),pn)};const Bi=function(t){return t};const Ni=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)};var Pi=Math.max;const Oi=function(t,e,n){return e=Pi(void 0===e?t.length-1:e,0),function(){for(var o=arguments,i=-1,r=Pi(o.length-e,0),s=Array(r);++i0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}};const Fi=ji(zi);const Vi=function(t,e){return Fi(Oi(t,e,Bi),t+"")};const Hi=function(t,e,n){if(!F(n))return!1;var o=typeof e;return!!("number"==o?ln(n)&&qe(e,n.length):"string"==o&&e in n)&&Mt(n[e],t)};const Ui=function(t){return Vi((function(e,n){var o=-1,i=n.length,r=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(r=t.length>3&&"function"==typeof r?(i--,r):void 0,s&&Hi(n[0],n[1],s)&&(r=i<3?void 0:r,i=1),e=Object(e);++o1===t?0:1),l=a[s];if("string"==typeof l)return l;return l[Number(c(n))]}Lo.window.CKEDITOR_TRANSLATIONS||(Lo.window.CKEDITOR_TRANSLATIONS={});const Wi=["ar","ara","dv","div","fa","per","fas","he","heb","ku","kur","ug","uig"];function Ki(t){return Wi.includes(t)?"rtl":"ltr"}class $i{constructor({uiLanguage:t="en",contentLanguage:e,translations:n}={}){this.uiLanguage=t,this.contentLanguage=e||this.uiLanguage,this.uiLanguageDirection=Ki(this.uiLanguage),this.contentLanguageDirection=Ki(this.contentLanguage),this.translations=function(t){return Array.isArray(t)?t.reduce(((t,e)=>qi(t,e))):t}(n),this.t=(t,e)=>this._t(t,e)}get language(){return console.warn("locale-deprecated-language-property: The Locale#language property has been deprecated and will be removed in the near future. Please use #uiLanguage and #contentLanguage properties instead."),this.uiLanguage}_t(t,e=[]){e=yi(e),"string"==typeof t&&(t={string:t});const n=!!t.plural?e[0]:1;return function(t,e){return t.replace(/%(\d+)/g,((t,n)=>nthis._items.length||e<0)throw new _("collection-add-item-invalid-index",this);let n=0;for(const o of t){const t=this._getItemIdBeforeAdding(o),i=e+n;this._items.splice(i,0,o),this._itemMap.set(t,o),this.fire("add",o,i),n++}return this.fire("change",{added:t,removed:[],index:e}),this}get(t){let e;if("string"==typeof t)e=this._itemMap.get(t);else{if("number"!=typeof t)throw new _("collection-get-invalid-arg",this);e=this._items[t]}return e||null}has(t){if("string"==typeof t)return this._itemMap.has(t);{const e=t[this._idProperty];return e&&this._itemMap.has(e)}}getIndex(t){let e;return e="string"==typeof t?this._itemMap.get(t):t,e?this._items.indexOf(e):-1}remove(t){const[e,n]=this._remove(t);return this.fire("change",{added:[],removed:[e],index:n}),e}map(t,e){return this._items.map(t,e)}forEach(t,e){this._items.forEach(t,e)}find(t,e){return this._items.find(t,e)}filter(t,e){return this._items.filter(t,e)}clear(){this._bindToCollection&&(this.stopListening(this._bindToCollection),this._bindToCollection=null);const t=Array.from(this._items);for(;this.length;)this._remove(0);this.fire("change",{added:[],removed:t,index:0})}bindTo(t){if(this._bindToCollection)throw new _("collection-bind-to-rebind",this);return this._bindToCollection=t,{as:t=>{this._setUpBindToBinding((e=>new t(e)))},using:t=>{"function"==typeof t?this._setUpBindToBinding(t):this._setUpBindToBinding((e=>e[t]))}}}_setUpBindToBinding(t){const e=this._bindToCollection,n=(n,o,i)=>{const r=e._bindToCollection==this,s=e._bindToInternalToExternalMap.get(o);if(r&&s)this._bindToExternalToInternalMap.set(o,s),this._bindToInternalToExternalMap.set(s,o);else{const n=t(o);if(!n)return void this._skippedIndexesFromExternal.push(i);let r=i;for(const t of this._skippedIndexesFromExternal)i>t&&r--;for(const t of e._skippedIndexesFromExternal)r>=t&&r++;this._bindToExternalToInternalMap.set(o,n),this._bindToInternalToExternalMap.set(n,o),this.add(n,r);for(let t=0;t{const o=this._bindToExternalToInternalMap.get(e);o&&this.remove(o),this._skippedIndexesFromExternal=this._skippedIndexesFromExternal.reduce(((t,e)=>(ne&&t.push(e),t)),[])}))}_getItemIdBeforeAdding(t){const e=this._idProperty;let n;if(e in t){if(n=t[e],"string"!=typeof n)throw new _("collection-add-invalid-id",this);if(this.get(n))throw new _("collection-add-item-already-exists",this)}else t[e]=n=k();return n}_remove(t){let e,n,o,i=!1;const r=this._idProperty;if("string"==typeof t?(n=t,o=this._itemMap.get(n),i=!o,o&&(e=this._items.indexOf(o))):"number"==typeof t?(e=t,o=this._items[e],i=!o,o&&(n=o[r])):(o=t,n=o[r],e=this._items.indexOf(o),i=-1==e||!this._itemMap.get(n)),i)throw new _("collection-remove-404",this);this._items.splice(e,1),this._itemMap.delete(n);const s=this._bindToInternalToExternalMap.get(o);return this._bindToInternalToExternalMap.delete(o),this._bindToExternalToInternalMap.delete(s),this.fire("remove",o,e),[o,e]}[Symbol.iterator](){return this._items[Symbol.iterator]()}}function Qi(t){const e=t.next();return e.done?null:e.value}class Zi extends(Bo(K())){constructor(){super(),this._elements=new Set,this._nextEventLoopTimeout=null,this.set("isFocused",!1),this.set("focusedElement",null)}add(t){if(this._elements.has(t))throw new _("focustracker-add-element-already-exist",this);this.listenTo(t,"focus",(()=>this._focus(t)),{useCapture:!0}),this.listenTo(t,"blur",(()=>this._blur()),{useCapture:!0}),this._elements.add(t)}remove(t){t===this.focusedElement&&this._blur(),this._elements.has(t)&&(this.stopListening(t),this._elements.delete(t))}destroy(){this.stopListening()}_focus(t){clearTimeout(this._nextEventLoopTimeout),this.focusedElement=t,this.isFocused=!0}_blur(){clearTimeout(this._nextEventLoopTimeout),this._nextEventLoopTimeout=setTimeout((()=>{this.focusedElement=null,this.isFocused=!1}),0)}}class Ji{constructor(){this._listener=new(Bo())}listenTo(t){this._listener.listenTo(t,"keydown",((t,e)=>{this._listener.fire("_keydown:"+Ai(e),e)}))}set(t,e,n={}){const o=_i(t),i=n.priority;this._listener.listenTo(this._listener,"_keydown:"+o,((t,n)=>{e(n,(()=>{n.preventDefault(),n.stopPropagation(),t.stop()})),t.return=!0}),{priority:i})}press(t){return!!this._listener.fire("_keydown:"+Ai(t),t)}stopListening(t){this._listener.stopListening(t)}destroy(){this.stopListening()}}function Xi(t){return nt(t)?new Map(t):function(t){const e=new Map;for(const n in t)e.set(n,t[n]);return e}(t)}Math.pow;function tr(t,e){let n;function o(...i){o.cancel(),n=setTimeout((()=>t(...i)),e)}return o.cancel=()=>{clearTimeout(n)},o}function er(t,e){return!!(n=t.charAt(e-1))&&1==n.length&&/[\ud800-\udbff]/.test(n)&&function(t){return!!t&&1==t.length&&/[\udc00-\udfff]/.test(t)}(t.charAt(e));var n}function nr(t,e){return!!(n=t.charAt(e))&&1==n.length&&/[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/.test(n);var n}const or=function(){const t=[new RegExp("\\p{Emoji}[\\u{E0020}-\\u{E007E}]+\\u{E007F}","u"),new RegExp("\\p{Emoji}\\u{FE0F}?\\u{20E3}","u"),new RegExp("\\p{Emoji}\\u{FE0F}","u"),new RegExp("(?=\\p{General_Category=Other_Symbol})\\p{Emoji}\\p{Emoji_Modifier}*","u")],e=new RegExp("\\p{Regional_Indicator}{2}","u").source,n="(?:"+t.map((t=>t.source)).join("|")+")";return new RegExp(`${e}|${n}(?:‍${n})*`,"ug")}();function ir(t,e){const n=String(t).matchAll(or);return Array.from(n).some((t=>t.index{this.refresh()})),this.listenTo(t,"change:isReadOnly",(()=>{this.refresh()})),this.on("set:isEnabled",(e=>{if(!this.affectsData)return;const n=t.model.document.selection,o=!("$graveyard"==n.getFirstPosition().root.rootName)&&t.model.canEditAt(n);(t.isReadOnly||this._isEnabledBasedOnSelection&&!o)&&(e.return=!1,e.stop())}),{priority:"highest"}),this.on("execute",(t=>{this.isEnabled||t.stop()}),{priority:"high"})}get affectsData(){return this._affectsData}set affectsData(t){this._affectsData=t}refresh(){this.isEnabled=!0}forceDisabled(t){this._disableStack.add(t),1==this._disableStack.size&&(this.on("set:isEnabled",cr,{priority:"highest"}),this.isEnabled=!1)}clearForceDisabled(t){this._disableStack.delete(t),0==this._disableStack.size&&(this.off("set:isEnabled",cr),this.refresh())}execute(...t){}destroy(){this.stopListening()}}function cr(t){t.return=!1,t.stop()}class lr extends ar{constructor(){super(...arguments),this._childCommandsDefinitions=[]}refresh(){}execute(...t){const e=this._getFirstEnabledCommand();return!!e&&e.execute(t)}registerChildCommand(t,e={}){w(this._childCommandsDefinitions,{command:t,priority:e.priority||"normal"}),t.on("change:isEnabled",(()=>this._checkEnabled())),this._checkEnabled()}_checkEnabled(){this.isEnabled=!!this._getFirstEnabledCommand()}_getFirstEnabledCommand(){const t=this._childCommandsDefinitions.find((({command:t})=>t.isEnabled));return t&&t.command}}class dr extends(B()){constructor(t,e=[],n=[]){super(),this._plugins=new Map,this._context=t,this._availablePlugins=new Map;for(const t of e)t.pluginName&&this._availablePlugins.set(t.pluginName,t);this._contextPlugins=new Map;for(const[t,e]of n)this._contextPlugins.set(t,e),this._contextPlugins.set(e,t),t.pluginName&&this._availablePlugins.set(t.pluginName,t)}*[Symbol.iterator](){for(const t of this._plugins)"function"==typeof t[0]&&(yield t)}get(t){const e=this._plugins.get(t);if(!e){let e=t;throw"function"==typeof t&&(e=t.pluginName||t.name),new _("plugincollection-plugin-not-loaded",this._context,{plugin:e})}return e}has(t){return this._plugins.has(t)}init(t,e=[],n=[]){const o=this,i=this._context;!function t(e,n=new Set){e.forEach((e=>{a(e)&&(n.has(e)||(n.add(e),e.pluginName&&!o._availablePlugins.has(e.pluginName)&&o._availablePlugins.set(e.pluginName,e),e.requires&&t(e.requires,n)))}))}(t),u(t);const r=[...function t(e,n=new Set){return e.map((t=>a(t)?t:o._availablePlugins.get(t))).reduce(((e,o)=>n.has(o)?e:(n.add(o),o.requires&&(u(o.requires,o),t(o.requires,n).forEach((t=>e.add(t)))),e.add(o))),new Set)}(t.filter((t=>!l(t,e))))];!function(t,e){for(const n of e){if("function"!=typeof n)throw new _("plugincollection-replace-plugin-invalid-type",null,{pluginItem:n});const e=n.pluginName;if(!e)throw new _("plugincollection-replace-plugin-missing-name",null,{pluginItem:n});if(n.requires&&n.requires.length)throw new _("plugincollection-plugin-for-replacing-cannot-have-dependencies",null,{pluginName:e});const i=o._availablePlugins.get(e);if(!i)throw new _("plugincollection-plugin-for-replacing-not-exist",null,{pluginName:e});const r=t.indexOf(i);if(-1===r){if(o._contextPlugins.has(i))return;throw new _("plugincollection-plugin-for-replacing-not-loaded",null,{pluginName:e})}if(i.requires&&i.requires.length)throw new _("plugincollection-replaced-plugin-cannot-have-dependencies",null,{pluginName:e});t.splice(r,1,n),o._availablePlugins.set(e,n)}}(r,n);const s=r.map((t=>{let e=o._contextPlugins.get(t);return e=e||new t(i),o._add(t,e),e}));return h(s,"init").then((()=>h(s,"afterInit"))).then((()=>s));function a(t){return"function"==typeof t}function c(t){return a(t)&&!!t.isContextPlugin}function l(t,e){return e.some((e=>e===t||(d(t)===e||d(e)===t)))}function d(t){return a(t)?t.pluginName||t.name:t}function u(t,n=null){t.map((t=>a(t)?t:o._availablePlugins.get(t)||t)).forEach((t=>{!function(t,e){if(a(t))return;if(e)throw new _("plugincollection-soft-required",i,{missingPlugin:t,requiredBy:d(e)});throw new _("plugincollection-plugin-not-found",i,{plugin:t})}(t,n),function(t,e){if(!c(e))return;if(c(t))return;throw new _("plugincollection-context-required",i,{plugin:d(t),requiredBy:d(e)})}(t,n),function(t,n){if(!n)return;if(!l(t,e))return;throw new _("plugincollection-required",i,{plugin:d(t),requiredBy:d(n)})}(t,n)}))}function h(t,e){return t.reduce(((t,n)=>n[e]?o._contextPlugins.has(n)?t:t.then(n[e].bind(n)):t),Promise.resolve())}}destroy(){const t=[];for(const[,e]of this)"function"!=typeof e.destroy||this._contextPlugins.has(e)||t.push(e.destroy());return Promise.all(t)}_add(t,e){this._plugins.set(t,e);const n=t.pluginName;if(n){if(this._plugins.has(n))throw new _("plugincollection-plugin-name-conflict",null,{pluginName:n,plugin1:this._plugins.get(n).constructor,plugin2:t});this._plugins.set(n,e)}}}var ur=Object.getOwnPropertySymbols,hr=Object.prototype.hasOwnProperty,gr=Object.prototype.propertyIsEnumerable;class mr{constructor(t){this._contextOwner=null;const e=t||{},{translations:n}=e,o=((t,e)=>{var n={};for(var o in t)hr.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(null!=t&&ur)for(var o of ur(t))e.indexOf(o)<0&&gr.call(t,o)&&(n[o]=t[o]);return n})(e,["translations"]);this.config=new Eo(o,this.constructor.defaultConfig);const i=this.constructor.builtinPlugins;this.config.define("plugins",i),this.plugins=new dr(this,i);const r=this.config.get("language")||{};this.locale=new $i({uiLanguage:"string"==typeof r?r:r.ui,contentLanguage:this.config.get("language.content"),translations:n}),this.t=this.locale.t,this.editors=new Yi}initPlugins(){const t=this.config.get("plugins")||[],e=this.config.get("substitutePlugins")||[];for(const n of t.concat(e)){if("function"!=typeof n)throw new _("context-initplugins-constructor-only",null,{Plugin:n});if(!0!==n.isContextPlugin)throw new _("context-initplugins-invalid-plugin",null,{Plugin:n})}return this.plugins.init(t,[],e)}destroy(){return Promise.all(Array.from(this.editors,(t=>t.destroy()))).then((()=>this.plugins.destroy()))}_addEditor(t,e){if(this._contextOwner)throw new _("context-addeditor-private-context");this.editors.add(t),e&&(this._contextOwner=t)}_removeEditor(t){return this.editors.has(t)&&this.editors.remove(t),this._contextOwner===t?this.destroy():Promise.resolve()}_getEditorConfig(){const t={};for(const e of this.config.names())["plugins","removePlugins","extraPlugins"].includes(e)||(t[e]=this.config.get(e));return t}static create(t){return new Promise((e=>{const n=new this(t);e(n.initPlugins().then((()=>n)))}))}}class pr extends(K()){constructor(t){super(),this.context=t}destroy(){this.stopListening()}static get isContextPlugin(){return!0}}class fr extends Ji{constructor(t){super(),this.editor=t}set(t,e,n={}){if("string"==typeof e){const t=e;e=(e,n)=>{this.editor.execute(t),n()}}super.set(t,e,n)}}var kr=n(2591),br=n.n(kr),wr=n(4098),Ar={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(wr.A,Ar);wr.A.locals;const _r=new WeakMap;let Cr=!1;function vr({view:t,element:e,text:n,isDirectHost:o=!0,keepOnFocus:i=!1}){const r=t.document;function s(n){_r.get(r).set(e,{text:n,isDirectHost:o,keepOnFocus:i,hostElement:o?e:null}),t.change((t=>Dr(r,t)))}_r.has(r)||(_r.set(r,new Map),r.registerPostFixer((t=>Dr(r,t))),r.on("change:isComposing",(()=>{t.change((t=>Dr(r,t)))}),{priority:"high"})),e.is("editableElement")&&e.on("change:placeholder",((t,e,n)=>{s(n)})),e.placeholder?s(e.placeholder):n&&s(n),n&&function(){Cr||C("enableplaceholder-deprecated-text-option");Cr=!0}()}function yr(t,e){return!e.hasClass("ck-placeholder")&&(t.addClass("ck-placeholder",e),!0)}function xr(t,e){return!!e.hasClass("ck-placeholder")&&(t.removeClass("ck-placeholder",e),!0)}function Er(t,e){if(!t.isAttached())return!1;if(Array.from(t.getChildren()).some((t=>!t.is("uiElement"))))return!1;const n=t.document,o=n.selection.anchor;return(!n.isComposing||!o||o.parent!==t)&&(!!e||(!n.isFocused||!!o&&o.parent!==t))}function Dr(t,e){const n=_r.get(t),o=[];let i=!1;for(const[t,r]of n)r.isDirectHost&&(o.push(t),Ir(e,t,r)&&(i=!0));for(const[t,r]of n){if(r.isDirectHost)continue;const n=Mr(t);n&&(o.includes(n)||(r.hostElement=n,Ir(e,t,r)&&(i=!0)))}return i}function Ir(t,e,n){const{text:o,isDirectHost:i,hostElement:r}=n;let s=!1;r.getAttribute("data-placeholder")!==o&&(t.setAttribute("data-placeholder",o,r),s=!0);return(i||1==e.childCount)&&Er(r,n.keepOnFocus)?yr(t,r)&&(s=!0):xr(t,r)&&(s=!0),s}function Mr(t){if(t.childCount){const e=t.getChild(0);if(e.is("element")&&!e.is("uiElement")&&!e.is("attributeElement"))return e}return null}class Tr{is(){throw new Error("is() method is abstract")}}const Sr=function(t){return vo(t,4)};class Br extends(B(Tr)){constructor(t){super(),this.document=t,this.parent=null}get index(){let t;if(!this.parent)return null;if(-1==(t=this.parent.getChildIndex(this)))throw new _("view-node-not-found-in-parent",this);return t}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return this.root.is("rootElement")}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.index),e=e.parent;return t}getAncestors(t={}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e),o=t.getAncestors(e);let i=0;for(;n[i]==o[i]&&n[i];)i++;return 0===i?null:n[i-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),n=t.getPath(),o=et(e,n);switch(o){case"prefix":return!0;case"extension":return!1;default:return e[o]t.data.length)throw new _("view-textproxy-wrong-offsetintext",this);if(n<0||e+n>t.data.length)throw new _("view-textproxy-wrong-length",this);this.data=t.data.substring(e,e+n),this.offsetInText=e}get offsetSize(){return this.data.length}get isPartial(){return this.data.length!==this.textNode.data.length}get parent(){return this.textNode.parent}get root(){return this.textNode.root}get document(){return this.textNode.document}getAncestors(t={}){const e=[];let n=t.includeSelf?this.textNode:this.parent;for(;null!==n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}}Pr.prototype.is=function(t){return"$textProxy"===t||"view:$textProxy"===t||"textProxy"===t||"view:textProxy"===t};class Or{constructor(...t){this._patterns=[],this.add(...t)}add(...t){for(let e of t)("string"==typeof e||e instanceof RegExp)&&(e={name:e}),this._patterns.push(e)}match(...t){for(const e of t)for(const t of this._patterns){const n=Lr(e,t);if(n)return{element:e,pattern:t,match:n}}return null}matchAll(...t){const e=[];for(const n of t)for(const t of this._patterns){const o=Lr(n,t);o&&e.push({element:n,pattern:t,match:o})}return e.length>0?e:null}getElementName(){if(1!==this._patterns.length)return null;const t=this._patterns[0],e=t.name;return"function"==typeof t||!e||e instanceof RegExp?null:e}}function Lr(t,e){if("function"==typeof e)return e(t);const n={};return e.name&&(n.name=function(t,e){if(t instanceof RegExp)return!!e.match(t);return t===e}(e.name,t.name),!n.name)||e.attributes&&(n.attributes=function(t,e){const n=new Set(e.getAttributeKeys());Dt(t)?(void 0!==t.style&&C("matcher-pattern-deprecated-attributes-style-key",t),void 0!==t.class&&C("matcher-pattern-deprecated-attributes-class-key",t)):(n.delete("style"),n.delete("class"));return zr(t,n,(t=>e.getAttribute(t)))}(e.attributes,t),!n.attributes)||e.classes&&(n.classes=function(t,e){return zr(t,e.getClassNames(),(()=>{}))}(e.classes,t),!n.classes)||e.styles&&(n.styles=function(t,e){return zr(t,e.getStyleNames(!0),(t=>e.getStyle(t)))}(e.styles,t),!n.styles)?null:n}function zr(t,e,n){const o=function(t){if(Array.isArray(t))return t.map((t=>Dt(t)?(void 0!==t.key&&void 0!==t.value||C("matcher-pattern-missing-key-or-value",t),[t.key,t.value]):[t,!0]));if(Dt(t))return Object.entries(t);return[[t,!0]]}(t),i=Array.from(e),r=[];if(o.forEach((([t,e])=>{i.forEach((o=>{(function(t,e){return!0===t||t===e||t instanceof RegExp&&e.match(t)})(t,o)&&function(t,e,n){if(!0===t)return!0;const o=n(e);return t===o||t instanceof RegExp&&!!String(o).match(t)}(e,o,n)&&r.push(o)}))})),o.length&&!(r.lengthi?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var r=Array(i);++oe===t));return Array.isArray(e)}set(t,e){if(F(t))for(const[e,n]of Object.entries(t))this._styleProcessor.toNormalizedForm(e,n,this._styles);else this._styleProcessor.toNormalizedForm(t,e,this._styles)}remove(t){const e=gs(t);as(this._styles,e),delete this._styles[t],this._cleanEmptyObjectsOnPath(e)}getNormalized(t){return this._styleProcessor.getNormalized(t,this._styles)}toString(){return this.isEmpty?"":this.getStylesEntries().map((t=>t.join(":"))).sort().join(";")+";"}getAsString(t){if(this.isEmpty)return;if(this._styles[t]&&!F(this._styles[t]))return this._styles[t];const e=this._styleProcessor.getReducedForm(t,this._styles).find((([e])=>e===t));return Array.isArray(e)?e[1]:void 0}getStyleNames(t=!1){if(this.isEmpty)return[];if(t)return this._styleProcessor.getStyleNames(this._styles);return this.getStylesEntries().map((([t])=>t))}clear(){this._styles={}}getStylesEntries(){const t=[],e=Object.keys(this._styles);for(const n of e)t.push(...this._styleProcessor.getReducedForm(n,this._styles));return t}_cleanEmptyObjectsOnPath(t){const e=t.split(".");if(!(e.length>1))return;const n=e.splice(0,e.length-1).join("."),o=cs(this._styles,n);if(!o)return;!Object.keys(o).length&&this.remove(n)}}class hs{constructor(){this._normalizers=new Map,this._extractors=new Map,this._reducers=new Map,this._consumables=new Map}toNormalizedForm(t,e,n){if(F(e))ms(n,gs(t),e);else if(this._normalizers.has(t)){const o=this._normalizers.get(t),{path:i,value:r}=o(e);ms(n,i,r)}else ms(n,t,e)}getNormalized(t,e){if(!t)return qi({},e);if(void 0!==e[t])return e[t];if(this._extractors.has(t)){const n=this._extractors.get(t);if("string"==typeof n)return cs(e,n);const o=n(t,e);if(o)return o}return cs(e,gs(t))}getReducedForm(t,e){const n=this.getNormalized(t,e);if(void 0===n)return[];if(this._reducers.has(t)){return this._reducers.get(t)(n)}return[[t,n]]}getStyleNames(t){const e=Array.from(this._consumables.keys()).filter((e=>{const n=this.getNormalized(e,t);return n&&"object"==typeof n?Object.keys(n).length:n})),n=new Set([...e,...Object.keys(t)]);return Array.from(n)}getRelatedStyles(t){return this._consumables.get(t)||[]}setNormalizer(t,e){this._normalizers.set(t,e)}setExtractor(t,e){this._extractors.set(t,e)}setReducer(t,e){this._reducers.set(t,e)}setStyleRelation(t,e){this._mapStyleNames(t,e);for(const n of e)this._mapStyleNames(n,[t])}_mapStyleNames(t,e){this._consumables.has(t)||this._consumables.set(t,[]),this._consumables.get(t).push(...e)}}function gs(t){return t.replace("-",".")}function ms(t,e,n){let o=n;F(n)&&(o=qi({},cs(t,e),n)),ds(t,e,o)}class ps extends Br{constructor(t,e,n,o){if(super(t),this._unsafeAttributesToRender=[],this._customProperties=new Map,this.name=e,this._attrs=function(t){const e=Xi(t);for(const[t,n]of e)null===n?e.delete(t):"string"!=typeof n&&e.set(t,String(n));return e}(n),this._children=[],o&&this._insertChild(0,o),this._classes=new Set,this._attrs.has("class")){const t=this._attrs.get("class");fs(this._classes,t),this._attrs.delete("class")}this._styles=new us(this.document.stylesProcessor),this._attrs.has("style")&&(this._styles.setTo(this._attrs.get("style")),this._attrs.delete("style"))}get childCount(){return this._children.length}get isEmpty(){return 0===this._children.length}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}*getAttributeKeys(){this._classes.size>0&&(yield"class"),this._styles.isEmpty||(yield"style"),yield*this._attrs.keys()}*getAttributes(){yield*this._attrs.entries(),this._classes.size>0&&(yield["class",this.getAttribute("class")]),this._styles.isEmpty||(yield["style",this.getAttribute("style")])}getAttribute(t){if("class"==t)return this._classes.size>0?[...this._classes].join(" "):void 0;if("style"==t){const t=this._styles.toString();return""==t?void 0:t}return this._attrs.get(t)}hasAttribute(t){return"class"==t?this._classes.size>0:"style"==t?!this._styles.isEmpty:this._attrs.has(t)}isSimilar(t){if(!(t instanceof ps))return!1;if(this===t)return!0;if(this.name!=t.name)return!1;if(this._attrs.size!==t._attrs.size||this._classes.size!==t._classes.size||this._styles.size!==t._styles.size)return!1;for(const[e,n]of this._attrs)if(!t._attrs.has(e)||t._attrs.get(e)!==n)return!1;for(const e of this._classes)if(!t._classes.has(e))return!1;for(const e of this._styles.getStyleNames())if(!t._styles.has(e)||t._styles.getAsString(e)!==this._styles.getAsString(e))return!1;return!0}hasClass(...t){for(const e of t)if(!this._classes.has(e))return!1;return!0}getClassNames(){return this._classes.keys()}getStyle(t){return this._styles.getAsString(t)}getNormalizedStyle(t){return this._styles.getNormalized(t)}getStyleNames(t){return this._styles.getStyleNames(t)}hasStyle(...t){for(const e of t)if(!this._styles.has(e))return!1;return!0}findAncestor(...t){const e=new Or(...t);let n=this.parent;for(;n&&!n.is("documentFragment");){if(e.match(n))return n;n=n.parent}return null}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}getIdentity(){const t=Array.from(this._classes).sort().join(","),e=this._styles.toString(),n=Array.from(this._attrs).map((t=>`${t[0]}="${t[1]}"`)).sort().join(" ");return this.name+(""==t?"":` class="${t}"`)+(e?` style="${e}"`:"")+(""==n?"":` ${n}`)}shouldRenderUnsafeAttribute(t){return this._unsafeAttributesToRender.includes(t)}_clone(t=!1){const e=[];if(t)for(const n of this.getChildren())e.push(n._clone(t));const n=new this.constructor(this.document,this.name,this._attrs,e);return n._classes=new Set(this._classes),n._styles.set(this._styles.getNormalized()),n._customProperties=new Map(this._customProperties),n.getFillerOffset=this.getFillerOffset,n._unsafeAttributesToRender=this._unsafeAttributesToRender,n}_appendChild(t){return this._insertChild(this.childCount,t)}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=function(t,e){if("string"==typeof e)return[new Nr(t,e)];nt(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Nr(t,e):e instanceof Pr?new Nr(t,e.data):e))}(this.document,e);for(const e of o)null!==e.parent&&e._remove(),e.parent=this,e.document=this.document,this._children.splice(t,0,e),t++,n++;return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n0&&(this._classes.clear(),!0):"style"==t?!this._styles.isEmpty&&(this._styles.clear(),!0):this._attrs.delete(t)}_addClass(t){this._fireChange("attributes",this);for(const e of yi(t))this._classes.add(e)}_removeClass(t){this._fireChange("attributes",this);for(const e of yi(t))this._classes.delete(e)}_setStyle(t,e){this._fireChange("attributes",this),"string"!=typeof t?this._styles.set(t):this._styles.set(t,e)}_removeStyle(t){this._fireChange("attributes",this);for(const e of yi(t))this._styles.remove(e)}_setCustomProperty(t,e){this._customProperties.set(t,e)}_removeCustomProperty(t){return this._customProperties.delete(t)}}function fs(t,e){const n=e.split(/\s+/);t.clear(),n.forEach((e=>t.add(e)))}ps.prototype.is=function(t,e){return e?e===this.name&&("element"===t||"view:element"===t):"element"===t||"view:element"===t||"node"===t||"view:node"===t};class ks extends ps{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=bs}}function bs(){const t=[...this.getChildren()],e=t[this.childCount-1];if(e&&e.is("element","br"))return this.childCount;for(const e of t)if(!e.is("uiElement"))return null;return this.childCount}ks.prototype.is=function(t,e){return e?e===this.name&&("containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class ws extends(K(ks)){constructor(t,e,n,o){super(t,e,n,o),this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("placeholder",void 0),this.bind("isReadOnly").to(t),this.bind("isFocused").to(t,"isFocused",(e=>e&&t.selection.editableElement==this)),this.listenTo(t.selection,"change",(()=>{this.isFocused=t.isFocused&&t.selection.editableElement==this}))}destroy(){this.stopListening()}}ws.prototype.is=function(t,e){return e?e===this.name&&("editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};const As=Symbol("rootName");class _s extends ws{constructor(t,e){super(t,e),this.rootName="main"}get rootName(){return this.getCustomProperty(As)}set rootName(t){this._setCustomProperty(As,t)}set _name(t){this.name=t}}_s.prototype.is=function(t,e){return e?e===this.name&&("rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t):"rootElement"===t||"view:rootElement"===t||"editableElement"===t||"view:editableElement"===t||"containerElement"===t||"view:containerElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Cs{constructor(t={}){if(!t.boundaries&&!t.startPosition)throw new _("view-tree-walker-no-start-position",null);if(t.direction&&"forward"!=t.direction&&"backward"!=t.direction)throw new _("view-tree-walker-unknown-direction",t.startPosition,{direction:t.direction});this.boundaries=t.boundaries||null,t.startPosition?this._position=vs._createAt(t.startPosition):this._position=vs._createAt(t.boundaries["backward"==t.direction?"end":"start"]),this.direction=t.direction||"forward",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null}[Symbol.iterator](){return this}get position(){return this._position}skip(t){let e,n;do{n=this.position,e=this.next()}while(!e.done&&t(e.value));e.done||(this._position=n)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){let t=this.position.clone();const e=this.position,n=t.parent;if(null===n.parent&&t.offset===n.childCount)return{done:!0,value:void 0};if(n===this._boundaryEndParent&&t.offset==this.boundaries.end.offset)return{done:!0,value:void 0};let o;if(n instanceof Nr){if(t.isAtEnd)return this._position=vs._createAfter(n),this._next();o=n.data[t.offset]}else o=n.getChild(t.offset);if(o instanceof ps){if(this.shallow){if(this.boundaries&&this.boundaries.end.isBefore(t))return{done:!0,value:void 0};t.offset++}else t=new vs(o,0);return this._position=t,this._formatReturnValue("elementStart",o,e,t,1)}if(o instanceof Nr){if(this.singleCharacters)return t=new vs(o,0),this._position=t,this._next();let n,i=o.data.length;return o==this._boundaryEndParent?(i=this.boundaries.end.offset,n=new Pr(o,0,i),t=vs._createAfter(n)):(n=new Pr(o,0,o.data.length),t.offset++),this._position=t,this._formatReturnValue("text",n,e,t,i)}if("string"==typeof o){let o;if(this.singleCharacters)o=1;else{o=(n===this._boundaryEndParent?this.boundaries.end.offset:n.data.length)-t.offset}const i=new Pr(n,t.offset,o);return t.offset+=o,this._position=t,this._formatReturnValue("text",i,e,t,o)}return t=vs._createAfter(n),this._position=t,this.ignoreElementEnd?this._next():this._formatReturnValue("elementEnd",n,e,t)}_previous(){let t=this.position.clone();const e=this.position,n=t.parent;if(null===n.parent&&0===t.offset)return{done:!0,value:void 0};if(n==this._boundaryStartParent&&t.offset==this.boundaries.start.offset)return{done:!0,value:void 0};let o;if(n instanceof Nr){if(t.isAtStart)return this._position=vs._createBefore(n),this._previous();o=n.data[t.offset-1]}else o=n.getChild(t.offset-1);if(o instanceof ps)return this.shallow?(t.offset--,this._position=t,this._formatReturnValue("elementStart",o,e,t,1)):(t=new vs(o,o.childCount),this._position=t,this.ignoreElementEnd?this._previous():this._formatReturnValue("elementEnd",o,e,t));if(o instanceof Nr){if(this.singleCharacters)return t=new vs(o,o.data.length),this._position=t,this._previous();let n,i=o.data.length;if(o==this._boundaryStartParent){const e=this.boundaries.start.offset;n=new Pr(o,e,o.data.length-e),i=n.data.length,t=vs._createBefore(n)}else n=new Pr(o,0,o.data.length),t.offset--;return this._position=t,this._formatReturnValue("text",n,e,t,i)}if("string"==typeof o){let o;if(this.singleCharacters)o=1;else{const e=n===this._boundaryStartParent?this.boundaries.start.offset:0;o=t.offset-e}t.offset-=o;const i=new Pr(n,t.offset,o);return this._position=t,this._formatReturnValue("text",i,e,t,o)}return t=vs._createBefore(n),this._position=t,this._formatReturnValue("elementStart",n,e,t,1)}_formatReturnValue(t,e,n,o,i){return e instanceof Pr&&(e.offsetInText+e.data.length==e.textNode.data.length&&("forward"!=this.direction||this.boundaries&&this.boundaries.end.isEqual(this.position)?n=vs._createAfter(e.textNode):(o=vs._createAfter(e.textNode),this._position=o)),0===e.offsetInText&&("backward"!=this.direction||this.boundaries&&this.boundaries.start.isEqual(this.position)?n=vs._createBefore(e.textNode):(o=vs._createBefore(e.textNode),this._position=o))),{done:!1,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}}class vs extends Tr{constructor(t,e){super(),this.parent=t,this.offset=e}get nodeAfter(){return this.parent.is("$text")?null:this.parent.getChild(this.offset)||null}get nodeBefore(){return this.parent.is("$text")?null:this.parent.getChild(this.offset-1)||null}get isAtStart(){return 0===this.offset}get isAtEnd(){const t=this.parent.is("$text")?this.parent.data.length:this.parent.childCount;return this.offset===t}get root(){return this.parent.root}get editableElement(){let t=this.parent;for(;!(t instanceof ws);){if(!t.parent)return null;t=t.parent}return t}getShiftedBy(t){const e=vs._createAt(this),n=e.offset+t;return e.offset=n<0?0:n,e}getLastMatchingPosition(t,e={}){e.startPosition=this;const n=new Cs(e);return n.skip(t),n.position}getAncestors(){return this.parent.is("documentFragment")?[this.parent]:this.parent.getAncestors({includeSelf:!0})}getCommonAncestor(t){const e=this.getAncestors(),n=t.getAncestors();let o=0;for(;e[o]==n[o]&&e[o];)o++;return 0===o?null:e[o-1]}isEqual(t){return this.parent==t.parent&&this.offset==t.offset}isBefore(t){return"before"==this.compareWith(t)}isAfter(t){return"after"==this.compareWith(t)}compareWith(t){if(this.root!==t.root)return"different";if(this.isEqual(t))return"same";const e=this.parent.is("node")?this.parent.getPath():[],n=t.parent.is("node")?t.parent.getPath():[];e.push(this.offset),n.push(t.offset);const o=et(e,n);switch(o){case"prefix":return"before";case"extension":return"after";default:return e[o]0?new this(n,o):new this(o,n)}static _createIn(t){return this._createFromParentsAndOffsets(t,0,t,t.childCount)}static _createOn(t){const e=t.is("$textProxy")?t.offsetSize:1;return this._createFromPositionAndShift(vs._createBefore(t),e)}}function xs(t){return!(!t.item.is("attributeElement")&&!t.item.is("uiElement"))}ys.prototype.is=function(t){return"range"===t||"view:range"===t};class Es extends(B(Tr)){constructor(...t){super(),this._ranges=[],this._lastRangeBackward=!1,this._isFake=!1,this._fakeSelectionLabel="",t.length&&this.setTo(...t)}get isFake(){return this._isFake}get fakeSelectionLabel(){return this._fakeSelectionLabel}get anchor(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.end:t.start).clone()}get focus(){if(!this._ranges.length)return null;const t=this._ranges[this._ranges.length-1];return(this._lastRangeBackward?t.start:t.end).clone()}get isCollapsed(){return 1===this.rangeCount&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}get editableElement(){return this.anchor?this.anchor.editableElement:null}*getRanges(){for(const t of this._ranges)yield t.clone()}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?t.clone():null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?t.clone():null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}isEqual(t){if(this.isFake!=t.isFake)return!1;if(this.isFake&&this.fakeSelectionLabel!=t.fakeSelectionLabel)return!1;if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let n=!1;for(const o of t._ranges)if(e.isEqual(o)){n=!0;break}if(!n)return!1}return!0}isSimilar(t){if(this.isBackward!=t.isBackward)return!1;const e=tt(this.getRanges());if(e!=tt(t.getRanges()))return!1;if(0==e)return!0;for(let e of this.getRanges()){e=e.getTrimmed();let n=!1;for(let o of t.getRanges())if(o=o.getTrimmed(),e.start.isEqual(o.start)&&e.end.isEqual(o.end)){n=!0;break}if(!n)return!1}return!0}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}setTo(...t){let[e,n,o]=t;if("object"==typeof n&&(o=n,n=void 0),null===e)this._setRanges([]),this._setFakeOptions(o);else if(e instanceof Es||e instanceof Ds)this._setRanges(e.getRanges(),e.isBackward),this._setFakeOptions({fake:e.isFake,label:e.fakeSelectionLabel});else if(e instanceof ys)this._setRanges([e],o&&o.backward),this._setFakeOptions(o);else if(e instanceof vs)this._setRanges([new ys(e)]),this._setFakeOptions(o);else if(e instanceof Br){const t=!!o&&!!o.backward;let i;if(void 0===n)throw new _("view-selection-setto-required-second-parameter",this);i="in"==n?ys._createIn(e):"on"==n?ys._createOn(e):new ys(vs._createAt(e,n)),this._setRanges([i],t),this._setFakeOptions(o)}else{if(!nt(e))throw new _("view-selection-setto-not-selectable",this);this._setRanges(e,o&&o.backward),this._setFakeOptions(o)}this.fire("change")}setFocus(t,e){if(null===this.anchor)throw new _("view-selection-setfocus-no-ranges",this);const n=vs._createAt(t,e);if("same"==n.compareWith(this.focus))return;const o=this.anchor;this._ranges.pop(),"before"==n.compareWith(o)?this._addRange(new ys(n,o),!0):this._addRange(new ys(o,n)),this.fire("change")}_setRanges(t,e=!1){t=Array.from(t),this._ranges=[];for(const e of t)this._addRange(e);this._lastRangeBackward=!!e}_setFakeOptions(t={}){this._isFake=!!t.fake,this._fakeSelectionLabel=t.fake&&t.label||""}_addRange(t,e=!1){if(!(t instanceof ys))throw new _("view-selection-add-range-not-range",this);this._pushRange(t),this._lastRangeBackward=!!e}_pushRange(t){for(const e of this._ranges)if(t.isIntersecting(e))throw new _("view-selection-range-intersects",this,{addedRange:t,intersectingRange:e});this._ranges.push(new ys(t.start,t.end))}}Es.prototype.is=function(t){return"selection"===t||"view:selection"===t};class Ds extends(B(Tr)){constructor(...t){super(),this._selection=new Es,this._selection.delegate("change").to(this),t.length&&this._selection.setTo(...t)}get isFake(){return this._selection.isFake}get fakeSelectionLabel(){return this._selection.fakeSelectionLabel}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get isCollapsed(){return this._selection.isCollapsed}get rangeCount(){return this._selection.rangeCount}get isBackward(){return this._selection.isBackward}get editableElement(){return this._selection.editableElement}get _ranges(){return this._selection._ranges}*getRanges(){yield*this._selection.getRanges()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getSelectedElement(){return this._selection.getSelectedElement()}isEqual(t){return this._selection.isEqual(t)}isSimilar(t){return this._selection.isSimilar(t)}_setTo(...t){this._selection.setTo(...t)}_setFocus(t,e){this._selection.setFocus(t,e)}}Ds.prototype.is=function(t){return"selection"===t||"documentSelection"==t||"view:selection"==t||"view:documentSelection"==t};class Is extends p{constructor(t,e,n){super(t,e),this.startRange=n,this._eventPhase="none",this._currentTarget=null}get eventPhase(){return this._eventPhase}get currentTarget(){return this._currentTarget}}const Ms=Symbol("bubbling contexts");function Ts(t){return class extends t{fire(t,...e){try{const n=t instanceof p?t:new p(this,t),o=Ps(this);if(!o.size)return;if(Ss(n,"capturing",this),Bs(o,"$capture",n,...e))return n.return;const i=n.startRange||this.selection.getFirstRange(),r=i?i.getContainedElement():null,s=!!r&&Boolean(Ns(o,r));let a=r||function(t){if(!t)return null;const e=t.start.parent,n=t.end.parent,o=e.getPath(),i=n.getPath();return o.length>i.length?e:n}(i);if(Ss(n,"atTarget",a),!s){if(Bs(o,"$text",n,...e))return n.return;Ss(n,"bubbling",a)}for(;a;){if(a.is("rootElement")){if(Bs(o,"$root",n,...e))return n.return}else if(a.is("element")&&Bs(o,a.name,n,...e))return n.return;if(Bs(o,a,n,...e))return n.return;a=a.parent,Ss(n,"bubbling",a)}return Ss(n,"bubbling",this),Bs(o,"$document",n,...e),n.return}catch(t){_.rethrowUnexpectedError(t,this)}}_addEventListener(t,e,n){const o=yi(n.context||"$document"),i=Ps(this);for(const r of o){let o=i.get(r);o||(o=new(B()),i.set(r,o)),this.listenTo(o,t,e,n)}}_removeEventListener(t,e){const n=Ps(this);for(const o of n.values())this.stopListening(o,t,e)}}}{const t=Ts(Object);["fire","_addEventListener","_removeEventListener"].forEach((e=>{Ts[e]=t.prototype[e]}))}function Ss(t,e,n){t instanceof Is&&(t._eventPhase=e,t._currentTarget=n)}function Bs(t,e,n,...o){const i="string"==typeof e?t.get(e):Ns(t,e);return!!i&&(i.fire(n,...o),n.stop.called)}function Ns(t,e){for(const[n,o]of t)if("function"==typeof n&&n(e))return o;return null}function Ps(t){return t[Ms]||(t[Ms]=new Map),t[Ms]}class Os extends(Ts(K())){constructor(t){super(),this._postFixers=new Set,this.selection=new Ds,this.roots=new Yi({idProperty:"rootName"}),this.stylesProcessor=t,this.set("isReadOnly",!1),this.set("isFocused",!1),this.set("isSelecting",!1),this.set("isComposing",!1)}getRoot(t="main"){return this.roots.get(t)}registerPostFixer(t){this._postFixers.add(t)}destroy(){this.roots.forEach((t=>t.destroy())),this.stopListening()}_callPostFixers(t){let e=!1;do{for(const n of this._postFixers)if(e=n(t),e)break}while(e)}}class Ls extends ps{constructor(t,e,n,o){super(t,e,n,o),this._priority=10,this._id=null,this._clonesGroup=null,this.getFillerOffset=zs}get priority(){return this._priority}get id(){return this._id}getElementsWithSameId(){if(null===this.id)throw new _("attribute-element-get-elements-with-same-id-no-id",this);return new Set(this._clonesGroup)}isSimilar(t){return null!==this.id||null!==t.id?this.id===t.id:super.isSimilar(t)&&this.priority==t.priority}_clone(t=!1){const e=super._clone(t);return e._priority=this._priority,e._id=this._id,e}}function zs(){if(Rs(this))return null;let t=this.parent;for(;t&&t.is("attributeElement");){if(Rs(t)>1)return null;t=t.parent}return!t||Rs(t)>1?null:this.childCount}function Rs(t){return Array.from(t.getChildren()).filter((t=>!t.is("uiElement"))).length}Ls.DEFAULT_PRIORITY=10,Ls.prototype.is=function(t,e){return e?e===this.name&&("attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t):"attributeElement"===t||"view:attributeElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class js extends ps{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=Fs}_insertChild(t,e){if(e&&(e instanceof Br||Array.from(e).length>0))throw new _("view-emptyelement-cannot-add",[this,e]);return 0}}function Fs(){return null}js.prototype.is=function(t,e){return e?e===this.name&&("emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t):"emptyElement"===t||"view:emptyElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Vs extends ps{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=Us}_insertChild(t,e){if(e&&(e instanceof Br||Array.from(e).length>0))throw new _("view-uielement-cannot-add",[this,e]);return 0}render(t,e){return this.toDomElement(t)}toDomElement(t){const e=t.createElement(this.name);for(const t of this.getAttributeKeys())e.setAttribute(t,this.getAttribute(t));return e}}function Hs(t){t.document.on("arrowKey",((e,n)=>function(t,e,n){if(e.keyCode==bi.arrowright){const t=e.domTarget.ownerDocument.defaultView.getSelection(),o=1==t.rangeCount&&t.getRangeAt(0).collapsed;if(o||e.shiftKey){const e=t.focusNode,i=t.focusOffset,r=n.domPositionToView(e,i);if(null===r)return;let s=!1;const a=r.getLastMatchingPosition((t=>(t.item.is("uiElement")&&(s=!0),!(!t.item.is("uiElement")&&!t.item.is("attributeElement")))));if(s){const e=n.viewPositionToDom(a);o?t.collapse(e.parent,e.offset):t.extend(e.parent,e.offset)}}}}(0,n,t.domConverter)),{priority:"low"})}function Us(){return null}Vs.prototype.is=function(t,e){return e?e===this.name&&("uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t):"uiElement"===t||"view:uiElement"===t||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class qs extends ps{constructor(t,e,n,o){super(t,e,n,o),this.getFillerOffset=Gs}_insertChild(t,e){if(e&&(e instanceof Br||Array.from(e).length>0))throw new _("view-rawelement-cannot-add",[this,e]);return 0}render(t,e){}}function Gs(){return null}qs.prototype.is=function(t,e){return e?e===this.name&&("rawElement"===t||"view:rawElement"===t||"element"===t||"view:element"===t):"rawElement"===t||"view:rawElement"===t||t===this.name||t==="view:"+this.name||"element"===t||"view:element"===t||"node"===t||"view:node"===t};class Ws extends(B(Tr)){constructor(t,e){super(),this._children=[],this._customProperties=new Map,this.document=t,e&&this._insertChild(0,e)}[Symbol.iterator](){return this._children[Symbol.iterator]()}get childCount(){return this._children.length}get isEmpty(){return 0===this.childCount}get root(){return this}get parent(){return null}get name(){}get getFillerOffset(){}getCustomProperty(t){return this._customProperties.get(t)}*getCustomProperties(){yield*this._customProperties.entries()}_appendChild(t){return this._insertChild(this.childCount,t)}getChild(t){return this._children[t]}getChildIndex(t){return this._children.indexOf(t)}getChildren(){return this._children[Symbol.iterator]()}_insertChild(t,e){this._fireChange("children",this);let n=0;const o=function(t,e){if("string"==typeof e)return[new Nr(t,e)];nt(e)||(e=[e]);return Array.from(e).map((e=>"string"==typeof e?new Nr(t,e):e instanceof Pr?new Nr(t,e.data):e))}(this.document,e);for(const e of o)null!==e.parent&&e._remove(),e.parent=this,this._children.splice(t,0,e),t++,n++;return n}_removeChildren(t,e=1){this._fireChange("children",this);for(let n=t;n{const n=t[t.length-1],o=!e.is("uiElement");return n&&n.breakAttributes==o?n.nodes.push(e):t.push({breakAttributes:o,nodes:[e]}),t}),[]);let o=null,i=t;for(const{nodes:t,breakAttributes:e}of n){const n=this._insertNodes(i,t,e);o||(o=n.start),i=n.end}return o?new ys(o,i):new ys(t)}remove(t){const e=t instanceof ys?t:ys._createOn(t);if(na(e,this.document),e.isCollapsed)return new Ws(this.document);const{start:n,end:o}=this._breakAttributesRange(e,!0),i=n.parent,r=o.offset-n.offset,s=i._removeChildren(n.offset,r);for(const t of s)this._removeFromClonedElementsGroup(t);const a=this.mergeAttributes(n);return e.start=a,e.end=a.clone(),new Ws(this.document,s)}clear(t,e){na(t,this.document);const n=t.getWalker({direction:"backward",ignoreElementEnd:!0});for(const o of n){const n=o.item;let i;if(n.is("element")&&e.isSimilar(n))i=ys._createOn(n);else if(!o.nextPosition.isAfter(t.start)&&n.is("$textProxy")){const t=n.getAncestors().find((t=>t.is("element")&&e.isSimilar(t)));t&&(i=ys._createIn(t))}i&&(i.end.isAfter(t.end)&&(i.end=t.end),i.start.isBefore(t.start)&&(i.start=t.start),this.remove(i))}}move(t,e){let n;if(e.isAfter(t.end)){const o=(e=this._breakAttributes(e,!0)).parent,i=o.childCount;t=this._breakAttributesRange(t,!0),n=this.remove(t),e.offset+=o.childCount-i}else n=this.remove(t);return this.insert(e,n)}wrap(t,e){if(!(e instanceof Ls))throw new _("view-writer-wrap-invalid-attribute",this.document);if(na(t,this.document),t.isCollapsed){let o=t.start;o.parent.is("element")&&(n=o.parent,!Array.from(n.getChildren()).some((t=>!t.is("uiElement"))))&&(o=o.getLastMatchingPosition((t=>t.item.is("uiElement")))),o=this._wrapPosition(o,e);const i=this.document.selection;return i.isCollapsed&&i.getFirstPosition().isEqual(t.start)&&this.setSelection(o),new ys(o)}return this._wrapRange(t,e);var n}unwrap(t,e){if(!(e instanceof Ls))throw new _("view-writer-unwrap-invalid-attribute",this.document);if(na(t,this.document),t.isCollapsed)return t;const{start:n,end:o}=this._breakAttributesRange(t,!0),i=n.parent,r=this._unwrapChildren(i,n.offset,o.offset,e),s=this.mergeAttributes(r.start);s.isEqual(r.start)||r.end.offset--;const a=this.mergeAttributes(r.end);return new ys(s,a)}rename(t,e){const n=new ks(this.document,t,e.getAttributes());return this.insert(vs._createAfter(e),n),this.move(ys._createIn(e),vs._createAt(n,0)),this.remove(ys._createOn(e)),n}clearClonedElementsGroup(t){this._cloneGroups.delete(t)}createPositionAt(t,e){return vs._createAt(t,e)}createPositionAfter(t){return vs._createAfter(t)}createPositionBefore(t){return vs._createBefore(t)}createRange(t,e){return new ys(t,e)}createRangeOn(t){return ys._createOn(t)}createRangeIn(t){return ys._createIn(t)}createSelection(...t){return new Es(...t)}createSlot(t="children"){if(!this._slotFactory)throw new _("view-writer-invalid-create-slot-context",this.document);return this._slotFactory(this,t)}_registerSlotFactory(t){this._slotFactory=t}_clearSlotFactory(){this._slotFactory=null}_insertNodes(t,e,n){let o,i;if(o=n?$s(t):t.parent.is("$text")?t.parent.parent:t.parent,!o)throw new _("view-writer-invalid-position-container",this.document);i=n?this._breakAttributes(t,!0):t.parent.is("$text")?Zs(t):t;const r=o._insertChild(i.offset,e);for(const t of e)this._addToClonedElementsGroup(t);const s=i.getShiftedBy(r),a=this.mergeAttributes(i);a.isEqual(i)||s.offset--;const c=this.mergeAttributes(s);return new ys(a,c)}_wrapChildren(t,e,n,o){let i=e;const r=[];for(;i!1,t.parent._insertChild(t.offset,n);const o=new ys(t,t.getShiftedBy(1));this.wrap(o,e);const i=new vs(n.parent,n.index);n._remove();const r=i.nodeBefore,s=i.nodeAfter;return r instanceof Nr&&s instanceof Nr?Js(r,s):Qs(i)}_wrapAttributeElement(t,e){if(!oa(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const n of t.getAttributeKeys())if("class"!==n&&"style"!==n&&e.hasAttribute(n)&&e.getAttribute(n)!==t.getAttribute(n))return!1;for(const n of t.getStyleNames())if(e.hasStyle(n)&&e.getStyle(n)!==t.getStyle(n))return!1;for(const n of t.getAttributeKeys())"class"!==n&&"style"!==n&&(e.hasAttribute(n)||this.setAttribute(n,t.getAttribute(n),e));for(const n of t.getStyleNames())e.hasStyle(n)||this.setStyle(n,t.getStyle(n),e);for(const n of t.getClassNames())e.hasClass(n)||this.addClass(n,e);return!0}_unwrapAttributeElement(t,e){if(!oa(t,e))return!1;if(t.name!==e.name||t.priority!==e.priority)return!1;for(const n of t.getAttributeKeys())if("class"!==n&&"style"!==n&&(!e.hasAttribute(n)||e.getAttribute(n)!==t.getAttribute(n)))return!1;if(!e.hasClass(...t.getClassNames()))return!1;for(const n of t.getStyleNames())if(!e.hasStyle(n)||e.getStyle(n)!==t.getStyle(n))return!1;for(const n of t.getAttributeKeys())"class"!==n&&"style"!==n&&this.removeAttribute(n,e);return this.removeClass(Array.from(t.getClassNames()),e),this.removeStyle(Array.from(t.getStyleNames()),e),!0}_breakAttributesRange(t,e=!1){const n=t.start,o=t.end;if(na(t,this.document),t.isCollapsed){const n=this._breakAttributes(t.start,e);return new ys(n,n)}const i=this._breakAttributes(o,e),r=i.parent.childCount,s=this._breakAttributes(n,e);return i.offset+=i.parent.childCount-r,new ys(s,i)}_breakAttributes(t,e=!1){const n=t.offset,o=t.parent;if(t.parent.is("emptyElement"))throw new _("view-writer-cannot-break-empty-element",this.document);if(t.parent.is("uiElement"))throw new _("view-writer-cannot-break-ui-element",this.document);if(t.parent.is("rawElement"))throw new _("view-writer-cannot-break-raw-element",this.document);if(!e&&o.is("$text")&&ea(o.parent))return t.clone();if(ea(o))return t.clone();if(o.is("$text"))return this._breakAttributes(Zs(t),e);if(n==o.childCount){const t=new vs(o.parent,o.index+1);return this._breakAttributes(t,e)}if(0===n){const t=new vs(o.parent,o.index);return this._breakAttributes(t,e)}{const t=o.index+1,i=o._clone();o.parent._insertChild(t,i),this._addToClonedElementsGroup(i);const r=o.childCount-n,s=o._removeChildren(n,r);i._appendChild(s);const a=new vs(o.parent,t);return this._breakAttributes(a,e)}}_addToClonedElementsGroup(t){if(!t.root.is("rootElement"))return;if(t.is("element"))for(const e of t.getChildren())this._addToClonedElementsGroup(e);const e=t.id;if(!e)return;let n=this._cloneGroups.get(e);n||(n=new Set,this._cloneGroups.set(e,n)),n.add(t),t._clonesGroup=n}_removeFromClonedElementsGroup(t){if(t.is("element"))for(const e of t.getChildren())this._removeFromClonedElementsGroup(e);const e=t.id;if(!e)return;const n=this._cloneGroups.get(e);n&&n.delete(t)}}function $s(t){let e=t.parent;for(;!ea(e);){if(!e)return;e=e.parent}return e}function Ys(t,e){return t.prioritye.priority)&&t.getIdentity()n instanceof t)))throw new _("view-writer-insert-invalid-node-type",e);n.is("$text")||ta(n.getChildren(),e)}}function ea(t){return t&&(t.is("containerElement")||t.is("documentFragment"))}function na(t,e){const n=$s(t.start),o=$s(t.end);if(!n||!o||n!==o)throw new _("view-writer-invalid-range-container",e)}function oa(t,e){return null===t.id&&null===e.id}const ia=t=>t.createTextNode(" "),ra=t=>{const e=t.createElement("span");return e.dataset.ckeFiller="true",e.innerText=" ",e},sa=t=>{const e=t.createElement("br");return e.dataset.ckeFiller="true",e},aa=7,ca="⁠".repeat(aa);function la(t){return"string"==typeof t?t.substr(0,aa)===ca:Ro(t)&&t.data.substr(0,aa)===ca}function da(t){return t.data.length==aa&&la(t)}function ua(t){const e="string"==typeof t?t:t.data;return la(t)?e.slice(aa):e}function ha(t,e){if(e.keyCode==bi.arrowleft){const t=e.domTarget.ownerDocument.defaultView.getSelection();if(1==t.rangeCount&&t.getRangeAt(0).collapsed){const e=t.getRangeAt(0).startContainer,n=t.getRangeAt(0).startOffset;la(e)&&n<=aa&&t.collapse(e,0)}}}var ga=n(8264),ma={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ga.A,ma);ga.A.locals;class pa extends(K()){constructor(t,e){super(),this.domDocuments=new Set,this.markedAttributes=new Set,this.markedChildren=new Set,this.markedTexts=new Set,this._inlineFiller=null,this._fakeSelectionContainer=null,this.domConverter=t,this.selection=e,this.set("isFocused",!1),this.set("isSelecting",!1),c.isBlink&&!c.isAndroid&&this.on("change:isSelecting",(()=>{this.isSelecting||this.render()})),this.set("isComposing",!1),this.on("change:isComposing",(()=>{this.isComposing||this.render()}))}markToSync(t,e){if("text"===t)this.domConverter.mapViewToDom(e.parent)&&this.markedTexts.add(e);else{if(!this.domConverter.mapViewToDom(e))return;if("attributes"===t)this.markedAttributes.add(e);else{if("children"!==t){throw new _("view-renderer-unknown-type",this)}this.markedChildren.add(e)}}}render(){if(this.isComposing&&!c.isAndroid)return;let t=null;const e=!(c.isBlink&&!c.isAndroid)||!this.isSelecting;for(const t of this.markedChildren)this._updateChildrenMappings(t);e?(this._inlineFiller&&!this._isSelectionInInlineFiller()&&this._removeInlineFiller(),this._inlineFiller?t=this._getInlineFillerPosition():this._needsInlineFillerAtSelection()&&(t=this.selection.getFirstPosition(),this.markedChildren.add(t.parent))):this._inlineFiller&&this._inlineFiller.parentNode&&(t=this.domConverter.domPositionToView(this._inlineFiller),t&&t.parent.is("$text")&&(t=vs._createBefore(t.parent)));for(const t of this.markedAttributes)this._updateAttrs(t);for(const e of this.markedChildren)this._updateChildren(e,{inlineFillerPosition:t});for(const e of this.markedTexts)!this.markedChildren.has(e.parent)&&this.domConverter.mapViewToDom(e.parent)&&this._updateText(e,{inlineFillerPosition:t});if(e)if(t){const e=this.domConverter.viewPositionToDom(t),n=e.parent.ownerDocument;la(e.parent)?this._inlineFiller=e.parent:this._inlineFiller=fa(n,e.parent,e.offset)}else this._inlineFiller=null;this._updateFocus(),this._updateSelection(),this.domConverter._clearTemporaryCustomProperties(),this.markedTexts.clear(),this.markedAttributes.clear(),this.markedChildren.clear()}_updateChildrenMappings(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const n=Array.from(e.childNodes),o=Array.from(this.domConverter.viewChildrenToDom(t,{withChildren:!1})),i=this._diffNodeLists(n,o),r=this._findUpdateActions(i,n,o,ka);if(-1!==r.indexOf("update")){const e={equal:0,insert:0,delete:0};for(const i of r)if("update"===i){const i=e.equal+e.insert,r=e.equal+e.delete,s=t.getChild(i);!s||s.is("uiElement")||s.is("rawElement")||this._updateElementMappings(s,n[r]),ri(o[i]),e.equal++}else e[i]++}}_updateElementMappings(t,e){this.domConverter.unbindDomElement(e),this.domConverter.bindElements(e,t),this.markedChildren.add(t),this.markedAttributes.add(t)}_getInlineFillerPosition(){const t=this.selection.getFirstPosition();return t.parent.is("$text")?vs._createBefore(t.parent):t}_isSelectionInInlineFiller(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=this.domConverter.viewPositionToDom(t);return!!(e&&Ro(e.parent)&&la(e.parent))}_removeInlineFiller(){const t=this._inlineFiller;if(!la(t))throw new _("view-renderer-filler-was-lost",this);da(t)?t.remove():t.data=t.data.substr(aa),this._inlineFiller=null}_needsInlineFillerAtSelection(){if(1!=this.selection.rangeCount||!this.selection.isCollapsed)return!1;const t=this.selection.getFirstPosition(),e=t.parent,n=t.offset;if(!this.domConverter.mapViewToDom(e.root))return!1;if(!e.is("element"))return!1;if(!function(t){if("false"==t.getAttribute("contenteditable"))return!1;const e=t.findAncestor((t=>t.hasAttribute("contenteditable")));return!e||"true"==e.getAttribute("contenteditable")}(e))return!1;if(n===e.getFillerOffset())return!1;const o=t.nodeBefore,i=t.nodeAfter;return!(o instanceof Nr||i instanceof Nr)&&(!c.isAndroid||!o&&!i)}_updateText(t,e){const n=this.domConverter.findCorrespondingDomText(t);let o=this.domConverter.viewToDom(t).data;const i=e.inlineFillerPosition;i&&i.parent==t.parent&&i.offset==t.index&&(o=ca+o),Aa(n,o)}_updateAttrs(t){const e=this.domConverter.mapViewToDom(t);if(!e)return;const n=Array.from(e.attributes).map((t=>t.name)),o=t.getAttributeKeys();for(const n of o)this.domConverter.setDomElementAttribute(e,n,t.getAttribute(n),t);for(const o of n)t.hasAttribute(o)||this.domConverter.removeDomElementAttribute(e,o)}_updateChildren(t,e){const n=this.domConverter.mapViewToDom(t);if(!n)return;if(c.isAndroid){let t=null;for(const e of Array.from(n.childNodes)){if(t&&Ro(t)&&Ro(e)){n.normalize();break}t=e}}const o=e.inlineFillerPosition,i=n.childNodes,r=Array.from(this.domConverter.viewChildrenToDom(t,{bind:!0}));o&&o.parent===t&&fa(n.ownerDocument,r,o.offset);const s=this._diffNodeLists(i,r),a=this._findUpdateActions(s,i,r,ba);let l=0;const d=new Set;for(const t of a)"delete"===t?(d.add(i[l]),ri(i[l])):"equal"!==t&&"update"!==t||l++;l=0;for(const t of a)"insert"===t?(Jo(n,l,r[l]),l++):"update"===t?(Aa(i[l],r[l].data),l++):"equal"===t&&(this._markDescendantTextToSync(this.domConverter.domToView(r[l])),l++);for(const t of d)t.parentNode||this.domConverter.unbindDomElement(t)}_diffNodeLists(t,e){return t=function(t,e){const n=Array.from(t);if(0==n.length||!e)return n;const o=n[n.length-1];o==e&&n.pop();return n}(t,this._fakeSelectionContainer),g(t,e,wa.bind(null,this.domConverter))}_findUpdateActions(t,e,n,o){if(-1===t.indexOf("insert")||-1===t.indexOf("delete"))return t;let i=[],r=[],s=[];const a={equal:0,insert:0,delete:0};for(const c of t)"insert"===c?s.push(n[a.equal+a.insert]):"delete"===c?r.push(e[a.equal+a.delete]):(i=i.concat(g(r,s,o).map((t=>"equal"===t?"update":t))),i.push("equal"),r=[],s=[]),a[c]++;return i.concat(g(r,s,o).map((t=>"equal"===t?"update":t)))}_markDescendantTextToSync(t){if(t)if(t.is("$text"))this.markedTexts.add(t);else if(t.is("element"))for(const e of t.getChildren())this._markDescendantTextToSync(e)}_updateSelection(){if(c.isBlink&&!c.isAndroid&&this.isSelecting&&!this.markedChildren.size)return;if(0===this.selection.rangeCount)return this._removeDomSelection(),void this._removeFakeSelection();const t=this.domConverter.mapViewToDom(this.selection.editableElement);this.isFocused&&t&&(this.selection.isFake?this._updateFakeSelection(t):this._fakeSelectionContainer&&this._fakeSelectionContainer.isConnected?(this._removeFakeSelection(),this._updateDomSelection(t)):this.isComposing&&c.isAndroid||this._updateDomSelection(t))}_updateFakeSelection(t){const e=t.ownerDocument;this._fakeSelectionContainer||(this._fakeSelectionContainer=function(t){const e=t.createElement("div");return e.className="ck-fake-selection-container",Object.assign(e.style,{position:"fixed",top:0,left:"-9999px",width:"42px"}),e.textContent=" ",e}(e));const n=this._fakeSelectionContainer;if(this.domConverter.bindFakeSelection(n,this.selection),!this._fakeSelectionNeedsUpdate(t))return;n.parentElement&&n.parentElement==t||t.appendChild(n),n.textContent=this.selection.fakeSelectionLabel||" ";const o=e.getSelection(),i=e.createRange();o.removeAllRanges(),i.selectNodeContents(n),o.addRange(i)}_updateDomSelection(t){const e=t.ownerDocument.defaultView.getSelection();if(!this._domSelectionNeedsUpdate(e))return;const n=this.domConverter.viewPositionToDom(this.selection.anchor),o=this.domConverter.viewPositionToDom(this.selection.focus);e.setBaseAndExtent(n.parent,n.offset,o.parent,o.offset),c.isGecko&&function(t,e){const n=t.parent;if(n.nodeType!=Node.ELEMENT_NODE||t.offset!=n.childNodes.length-1)return;const o=n.childNodes[t.offset];o&&"BR"==o.tagName&&e.addRange(e.getRangeAt(0))}(o,e)}_domSelectionNeedsUpdate(t){if(!this.domConverter.isDomSelectionCorrect(t))return!0;const e=t&&this.domConverter.domSelectionToView(t);return(!e||!this.selection.isEqual(e))&&!(!this.selection.isCollapsed&&this.selection.isSimilar(e))}_fakeSelectionNeedsUpdate(t){const e=this._fakeSelectionContainer,n=t.ownerDocument.getSelection();return!e||e.parentElement!==t||(n.anchorNode!==e&&!e.contains(n.anchorNode)||e.textContent!==this.selection.fakeSelectionLabel)}_removeDomSelection(){for(const t of this.domDocuments){const e=t.getSelection();if(e.rangeCount){const n=t.activeElement,o=this.domConverter.mapDomToView(n);n&&o&&e.removeAllRanges()}}}_removeFakeSelection(){const t=this._fakeSelectionContainer;t&&t.remove()}_updateFocus(){if(this.isFocused){const t=this.selection.editableElement;t&&this.domConverter.focus(t)}}}function fa(t,e,n){const o=e instanceof Array?e:e.childNodes,i=o[n];if(Ro(i))return i.data=ca+i.data,i;{const i=t.createTextNode(ca);return Array.isArray(e)?o.splice(n,0,i):Jo(e,n,i),i}}function ka(t,e){return Mo(t)&&Mo(e)&&!Ro(t)&&!Ro(e)&&!Xo(t)&&!Xo(e)&&t.tagName.toLowerCase()===e.tagName.toLowerCase()}function ba(t,e){return Mo(t)&&Mo(e)&&Ro(t)&&Ro(e)}function wa(t,e,n){return e===n||(Ro(e)&&Ro(n)?e.data===n.data:!(!t.isBlockFiller(e)||!t.isBlockFiller(n)))}function Aa(t,e){const n=t.data;if(n==e)return;const o=d(n,e);for(const e of o)"insert"===e.type?t.insertData(e.index,e.values.join("")):t.deleteData(e.index,e.howMany)}const _a=sa(Lo.document),Ca=ia(Lo.document),va=ra(Lo.document),ya="data-ck-unsafe-attribute-",xa="data-ck-unsafe-element";class Ea{constructor(t,{blockFillerMode:e,renderingMode:n="editing"}={}){this._domToViewMapping=new WeakMap,this._viewToDomMapping=new WeakMap,this._fakeSelectionMapping=new WeakMap,this._rawContentElementMatcher=new Or,this._inlineObjectElementMatcher=new Or,this._elementsWithTemporaryCustomProperties=new Set,this.document=t,this.renderingMode=n,this.blockFillerMode=e||("editing"===n?"br":"nbsp"),this.preElements=["pre"],this.blockElements=["address","article","aside","blockquote","caption","center","dd","details","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","legend","li","main","menu","nav","ol","p","pre","section","summary","table","tbody","td","tfoot","th","thead","tr","ul"],this.inlineObjectElements=["object","iframe","input","button","textarea","select","option","video","embed","audio","img","canvas"],this.unsafeElements=["script","style"],this._domDocument="editing"===this.renderingMode?Lo.document:Lo.document.implementation.createHTMLDocument("")}bindFakeSelection(t,e){this._fakeSelectionMapping.set(t,new Es(e))}fakeSelectionToView(t){return this._fakeSelectionMapping.get(t)}bindElements(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}unbindDomElement(t){const e=this._domToViewMapping.get(t);if(e){this._domToViewMapping.delete(t),this._viewToDomMapping.delete(e);for(const e of Array.from(t.children))this.unbindDomElement(e)}}bindDocumentFragments(t,e){this._domToViewMapping.set(t,e),this._viewToDomMapping.set(e,t)}shouldRenderAttribute(t,e,n){return"data"===this.renderingMode||!(t=t.toLowerCase()).startsWith("on")&&(("srcdoc"!==t||!e.match(/\bon\S+\s*=|javascript:|<\s*\/*script/i))&&("img"===n&&("src"===t||"srcset"===t)||("source"===n&&"srcset"===t||!e.match(/^\s*(javascript:|data:(image\/svg|text\/x?html))/i))))}setContentOf(t,e){if("data"===this.renderingMode)return void(t.innerHTML=e);const n=(new DOMParser).parseFromString(e,"text/html"),o=n.createDocumentFragment(),i=n.body.childNodes;for(;i.length>0;)o.appendChild(i[0]);const r=n.createTreeWalker(o,NodeFilter.SHOW_ELEMENT),s=[];let a;for(;a=r.nextNode();)s.push(a);for(const t of s){for(const e of t.getAttributeNames())this.setDomElementAttribute(t,e,t.getAttribute(e));const e=t.tagName.toLowerCase();this._shouldRenameElement(e)&&(Ta(e),t.replaceWith(this._createReplacementDomElement(e,t)))}for(;t.firstChild;)t.firstChild.remove();t.append(o)}viewToDom(t,e={}){if(t.is("$text")){const e=this._processDataFromViewText(t);return this._domDocument.createTextNode(e)}{const n=t;if(this.mapViewToDom(n)){if(!n.getCustomProperty("editingPipeline:doNotReuseOnce"))return this.mapViewToDom(n);this._elementsWithTemporaryCustomProperties.add(n)}let o;if(n.is("documentFragment"))o=this._domDocument.createDocumentFragment(),e.bind&&this.bindDocumentFragments(o,n);else{if(n.is("uiElement"))return o="$comment"===n.name?this._domDocument.createComment(n.getCustomProperty("$rawContent")):n.render(this._domDocument,this),e.bind&&this.bindElements(o,n),o;this._shouldRenameElement(n.name)?(Ta(n.name),o=this._createReplacementDomElement(n.name)):o=n.hasAttribute("xmlns")?this._domDocument.createElementNS(n.getAttribute("xmlns"),n.name):this._domDocument.createElement(n.name),n.is("rawElement")&&n.render(o,this),e.bind&&this.bindElements(o,n);for(const t of n.getAttributeKeys())this.setDomElementAttribute(o,t,n.getAttribute(t),n)}if(!1!==e.withChildren)for(const t of this.viewChildrenToDom(n,e))o.appendChild(t);return o}}setDomElementAttribute(t,e,n,o){const i=this.shouldRenderAttribute(e,n,t.tagName.toLowerCase())||o&&o.shouldRenderUnsafeAttribute(e);i||C("domconverter-unsafe-attribute-detected",{domElement:t,key:e,value:n}),function(t){try{Lo.document.createAttribute(t)}catch(t){return!1}return!0}(e)?(t.hasAttribute(e)&&!i?t.removeAttribute(e):t.hasAttribute(ya+e)&&i&&t.removeAttribute(ya+e),t.setAttribute(i?e:ya+e,n)):C("domconverter-invalid-attribute-detected",{domElement:t,key:e,value:n})}removeDomElementAttribute(t,e){e!=xa&&(t.removeAttribute(e),t.removeAttribute(ya+e))}*viewChildrenToDom(t,e={}){const n=t.getFillerOffset&&t.getFillerOffset();let o=0;for(const i of t.getChildren()){n===o&&(yield this._getBlockFiller());const t=i.is("element")&&!!i.getCustomProperty("dataPipeline:transparentRendering")&&!Qi(i.getAttributes());t&&"data"==this.renderingMode?yield*this.viewChildrenToDom(i,e):(t&&C("domconverter-transparent-rendering-unsupported-in-editing-pipeline",{viewElement:i}),yield this.viewToDom(i,e)),o++}n===o&&(yield this._getBlockFiller())}viewRangeToDom(t){const e=this.viewPositionToDom(t.start),n=this.viewPositionToDom(t.end),o=this._domDocument.createRange();return o.setStart(e.parent,e.offset),o.setEnd(n.parent,n.offset),o}viewPositionToDom(t){const e=t.parent;if(e.is("$text")){const n=this.findCorrespondingDomText(e);if(!n)return null;let o=t.offset;return la(n)&&(o+=aa),{parent:n,offset:o}}{let n,o,i;if(0===t.offset){if(n=this.mapViewToDom(e),!n)return null;i=n.childNodes[0]}else{const e=t.nodeBefore;if(o=e.is("$text")?this.findCorrespondingDomText(e):this.mapViewToDom(e),!o)return null;n=o.parentNode,i=o.nextSibling}if(Ro(i)&&la(i))return{parent:i,offset:aa};return{parent:n,offset:o?Zo(o)+1:0}}}domToView(t,e={}){const n=[],o=this._domToView(t,e,n),i=o.next().value;return i?(o.next(),this._processDomInlineNodes(null,n,e),i.is("$text")&&0==i.data.length?null:i):null}*domChildrenToView(t,e={},n=[]){for(let o=0;o{const{scrollLeft:e,scrollTop:n}=t;o.push([e,n])})),e.focus(),Ia(e,(t=>{const[e,n]=o.shift();t.scrollLeft=e,t.scrollTop=n})),Lo.window.scrollTo(t,n)}}_clearDomSelection(){const t=this.mapViewToDom(this.document.selection.editableElement);if(!t)return;const e=t.ownerDocument.defaultView.getSelection(),n=this.domSelectionToView(e);n&&n.rangeCount>0&&e.removeAllRanges()}isElement(t){return t&&t.nodeType==Node.ELEMENT_NODE}isDocumentFragment(t){return t&&t.nodeType==Node.DOCUMENT_FRAGMENT_NODE}isBlockFiller(t){return"br"==this.blockFillerMode?t.isEqualNode(_a):!("BR"!==t.tagName||!Ma(t,this.blockElements)||1!==t.parentNode.childNodes.length)||(t.isEqualNode(va)||function(t,e){const n=t.isEqualNode(Ca);return n&&Ma(t,e)&&1===t.parentNode.childNodes.length}(t,this.blockElements))}isDomSelectionBackward(t){if(t.isCollapsed)return!1;const e=this._domDocument.createRange();try{e.setStart(t.anchorNode,t.anchorOffset),e.setEnd(t.focusNode,t.focusOffset)}catch(t){return!1}const n=e.collapsed;return e.detach(),n}getHostViewElement(t){const e=function(t){const e=[];let n=t;for(;n&&n.nodeType!=Node.DOCUMENT_NODE;)e.unshift(n),n=n.parentNode;return e}(t);for(e.pop();e.length;){const t=e.pop(),n=this._domToViewMapping.get(t);if(n&&(n.is("uiElement")||n.is("rawElement")))return n}return null}isDomSelectionCorrect(t){return this._isDomSelectionPositionCorrect(t.anchorNode,t.anchorOffset)&&this._isDomSelectionPositionCorrect(t.focusNode,t.focusOffset)}registerRawContentMatcher(t){this._rawContentElementMatcher.add(t)}registerInlineObjectMatcher(t){this._inlineObjectElementMatcher.add(t)}_clearTemporaryCustomProperties(){for(const t of this._elementsWithTemporaryCustomProperties)t._removeCustomProperty("editingPipeline:doNotReuseOnce");this._elementsWithTemporaryCustomProperties.clear()}_getBlockFiller(){switch(this.blockFillerMode){case"nbsp":return ia(this._domDocument);case"markedNbsp":return ra(this._domDocument);case"br":return sa(this._domDocument)}}_isDomSelectionPositionCorrect(t,e){if(Ro(t)&&la(t)&&e0?e[t-1]:null,c=t+1this.preElements.includes(t.name))))return e;if(" "==e.charAt(0)){const n=this._getTouchingInlineViewNode(t,!1);!(n&&n.is("$textProxy")&&this._nodeEndsWithSpace(n))&&n||(e=" "+e.substr(1))}if(" "==e.charAt(e.length-1)){const n=this._getTouchingInlineViewNode(t,!0),o=n&&n.is("$textProxy")&&" "==n.data.charAt(0);" "!=e.charAt(e.length-2)&&n&&!o||(e=e.substr(0,e.length-1)+" ")}return e.replace(/ {2}/g,"  ")}_nodeEndsWithSpace(t){if(t.getAncestors().some((t=>this.preElements.includes(t.name))))return!1;const e=this._processDataFromViewText(t);return" "==e.charAt(e.length-1)}_getTouchingInlineViewNode(t,e){const n=new Cs({startPosition:e?vs._createAfter(t):vs._createBefore(t),direction:e?"forward":"backward"});for(const t of n){if(t.item.is("element","br"))return null;if(this._isInlineObjectElement(t.item))return t.item;if(t.item.is("containerElement"))return null;if(t.item.is("$textProxy"))return t.item}return null}_isBlockDomElement(t){return this.isElement(t)&&this.blockElements.includes(t.tagName.toLowerCase())}_isBlockViewElement(t){return t.is("element")&&this.blockElements.includes(t.name)}_isInlineObjectElement(t){return!!t.is("element")&&("br"==t.name||this.inlineObjectElements.includes(t.name)||!!this._inlineObjectElementMatcher.match(t))}_createViewElement(t,e){if(Xo(t))return new Vs(this.document,"$comment");const n=e.keepOriginalCase?t.tagName:t.tagName.toLowerCase();return new ps(this.document,n)}_isViewElementWithRawContent(t,e){return!1!==e.withChildren&&t.is("element")&&!!this._rawContentElementMatcher.match(t)}_shouldRenameElement(t){const e=t.toLowerCase();return"editing"===this.renderingMode&&this.unsafeElements.includes(e)}_createReplacementDomElement(t,e){const n=this._domDocument.createElement("span");if(n.setAttribute(xa,t),e){for(;e.firstChild;)n.appendChild(e.firstChild);for(const t of e.getAttributeNames())n.setAttribute(t,e.getAttribute(t))}return n}}function Da(t,e){return t.getAncestors().some((t=>t.is("element")&&e.includes(t.name)))}function Ia(t,e){let n=t;for(;n;)e(n),n=n.parentElement}function Ma(t,e){const n=t.parentNode;return!!n&&!!n.tagName&&e.includes(n.tagName.toLowerCase())}function Ta(t){"script"===t&&C("domconverter-unsafe-script-element-detected"),"style"===t&&C("domconverter-unsafe-style-element-detected")}class Sa extends(Bo()){constructor(t){super(),this._isEnabled=!1,this.view=t,this.document=t.document}get isEnabled(){return this._isEnabled}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}destroy(){this.disable(),this.stopListening()}checkShouldIgnoreEventFromTarget(t){return t&&3===t.nodeType&&(t=t.parentNode),!(!t||1!==t.nodeType)&&t.matches("[data-cke-ignore-events], [data-cke-ignore-events] *")}}const Ba=Ui((function(t,e){Se(e,pn(e),t)}));class Na{constructor(t,e,n){this.view=t,this.document=t.document,this.domEvent=e,this.domTarget=e.target,Ba(this,n)}get target(){return this.view.domConverter.mapDomToView(this.domTarget)}preventDefault(){this.domEvent.preventDefault()}stopPropagation(){this.domEvent.stopPropagation()}}class Pa extends Sa{constructor(){super(...arguments),this.useCapture=!1}observe(t){("string"==typeof this.domEventType?[this.domEventType]:this.domEventType).forEach((e=>{this.listenTo(t,e,((t,e)=>{this.isEnabled&&!this.checkShouldIgnoreEventFromTarget(e.target)&&this.onDomEvent(e)}),{useCapture:this.useCapture})}))}stopObserving(t){this.stopListening(t)}fire(t,e,n){this.isEnabled&&this.document.fire(t,new Na(this.view,e,n))}}class Oa extends Pa{constructor(){super(...arguments),this.domEventType=["keydown","keyup"]}onDomEvent(t){const e={keyCode:t.keyCode,altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,get keystroke(){return Ai(this)}};this.fire(t.type,t,e)}}const La=function(){return rt.Date.now()};var za=/\s/;const Ra=function(t){for(var e=t.length;e--&&za.test(t.charAt(e)););return e};var ja=/^\s+/;const Fa=function(t){return t?t.slice(0,Ra(t)+1).replace(ja,""):t};var Va=/^[-+]0x[0-9a-f]+$/i,Ha=/^0b[01]+$/i,Ua=/^0o[0-7]+$/i,qa=parseInt;const Ga=function(t){if("number"==typeof t)return t;if(Rr(t))return NaN;if(F(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=F(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=Fa(t);var n=Ha.test(t);return n||Ua.test(t)?qa(t.slice(2),n?2:8):Va.test(t)?NaN:+t};var Wa=Math.max,Ka=Math.min;const $a=function(t,e,n){var o,i,r,s,a,c,l=0,d=!1,u=!1,h=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function g(e){var n=o,r=i;return o=i=void 0,l=e,s=t.apply(r,n)}function m(t){var n=t-c;return void 0===c||n>=e||n<0||u&&t-l>=r}function p(){var t=La();if(m(t))return f(t);a=setTimeout(p,function(t){var n=e-(t-c);return u?Ka(n,r-(t-l)):n}(t))}function f(t){return a=void 0,h&&o?g(t):(o=i=void 0,s)}function k(){var t=La(),n=m(t);if(o=arguments,i=this,c=t,n){if(void 0===a)return function(t){return l=t,a=setTimeout(p,e),d?g(t):s}(c);if(u)return clearTimeout(a),a=setTimeout(p,e),g(c)}return void 0===a&&(a=setTimeout(p,e)),s}return e=Ga(e)||0,F(n)&&(d=!!n.leading,r=(u="maxWait"in n)?Wa(Ga(n.maxWait)||0,e):r,h="trailing"in n?!!n.trailing:h),k.cancel=function(){void 0!==a&&clearTimeout(a),l=0,o=c=i=a=void 0},k.flush=function(){return void 0===a?s:f(La())},k};class Ya extends Sa{constructor(t){super(t),this._fireSelectionChangeDoneDebounced=$a((t=>{this.document.fire("selectionChangeDone",t)}),200)}observe(){const t=this.document;t.on("arrowKey",((e,n)=>{t.selection.isFake&&this.isEnabled&&n.preventDefault()}),{context:"$capture"}),t.on("arrowKey",((e,n)=>{t.selection.isFake&&this.isEnabled&&this._handleSelectionMove(n.keyCode)}),{priority:"lowest"})}stopObserving(){}destroy(){super.destroy(),this._fireSelectionChangeDoneDebounced.cancel()}_handleSelectionMove(t){const e=this.document.selection,n=new Es(e.getRanges(),{backward:e.isBackward,fake:!1});t!=bi.arrowleft&&t!=bi.arrowup||n.setTo(n.getFirstPosition()),t!=bi.arrowright&&t!=bi.arrowdown||n.setTo(n.getLastPosition());const o={oldSelection:e,newSelection:n,domSelection:null};this.document.fire("selectionChange",o),this._fireSelectionChangeDoneDebounced(o)}}const Qa=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const Za=function(t){return this.__data__.has(t)};function Ja(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new Ce;++ea))return!1;var l=r.get(t),d=r.get(e);if(l&&d)return l==e&&d==t;var u=-1,h=!0,g=2&n?new Xa:void 0;for(r.set(t,e),r.set(e,t);++u{this._isFocusChanging=!0,this._renderTimeoutId=setTimeout((()=>{this.flush(),t.change((()=>{}))}),50)})),e.on("blur",((n,o)=>{const i=e.selection.editableElement;null!==i&&i!==o.target||(e.isFocused=!1,this._isFocusChanging=!1,t.change((()=>{})))}))}flush(){this._isFocusChanging&&(this._isFocusChanging=!1,this.document.isFocused=!0)}onDomEvent(t){this.fire(t.type,t)}destroy(){this._renderTimeoutId&&clearTimeout(this._renderTimeoutId),super.destroy()}}class Ac extends Sa{constructor(t){super(t),this.mutationObserver=t.getObserver(kc),this.focusObserver=t.getObserver(wc),this.selection=this.document.selection,this.domConverter=t.domConverter,this._documents=new WeakSet,this._fireSelectionChangeDoneDebounced=$a((t=>{this.document.fire("selectionChangeDone",t)}),200),this._clearInfiniteLoopInterval=setInterval((()=>this._clearInfiniteLoop()),1e3),this._documentIsSelectingInactivityTimeoutDebounced=$a((()=>this.document.isSelecting=!1),5e3),this._loopbackCounter=0}observe(t){const e=t.ownerDocument,n=()=>{this.document.isSelecting&&(this._handleSelectionChange(null,e),this.document.isSelecting=!1,this._documentIsSelectingInactivityTimeoutDebounced.cancel())};this.listenTo(t,"selectstart",(()=>{this.document.isSelecting=!0,this._documentIsSelectingInactivityTimeoutDebounced()}),{priority:"highest"}),this.listenTo(t,"keydown",n,{priority:"highest",useCapture:!0}),this.listenTo(t,"keyup",n,{priority:"highest",useCapture:!0}),this._documents.has(e)||(this.listenTo(e,"mouseup",n,{priority:"highest",useCapture:!0}),this.listenTo(e,"selectionchange",((t,n)=>{this.document.isComposing&&!c.isAndroid||(this._handleSelectionChange(n,e),this._documentIsSelectingInactivityTimeoutDebounced())})),this._documents.add(e))}stopObserving(t){this.stopListening(t)}destroy(){super.destroy(),clearInterval(this._clearInfiniteLoopInterval),this._fireSelectionChangeDoneDebounced.cancel(),this._documentIsSelectingInactivityTimeoutDebounced.cancel()}_reportInfiniteLoop(){}_handleSelectionChange(t,e){if(!this.isEnabled)return;const n=e.defaultView.getSelection();if(this.checkShouldIgnoreEventFromTarget(n.anchorNode))return;this.mutationObserver.flush();const o=this.domConverter.domSelectionToView(n);if(0!=o.rangeCount){if(this.view.hasDomSelection=!0,this.focusObserver.flush(),!this.selection.isEqual(o)||!this.domConverter.isDomSelectionCorrect(n))if(++this._loopbackCounter>60)this._reportInfiniteLoop();else if(this.selection.isSimilar(o))this.view.forceRender();else{const t={oldSelection:this.selection,newSelection:o,domSelection:n};this.document.fire("selectionChange",t),this._fireSelectionChangeDoneDebounced(t)}}else this.view.hasDomSelection=!1}_clearInfiniteLoop(){this._loopbackCounter=0}}class _c extends Pa{constructor(t){super(t),this.domEventType=["compositionstart","compositionupdate","compositionend"];const e=this.document;e.on("compositionstart",(()=>{e.isComposing=!0}),{priority:"low"}),e.on("compositionend",(()=>{e.isComposing=!1}),{priority:"low"})}onDomEvent(t){this.fire(t.type,t,{data:t.data})}}class Cc{constructor(t,e={}){this._files=e.cacheFiles?vc(t):null,this._native=t}get files(){return this._files||(this._files=vc(this._native)),this._files}get types(){return this._native.types}getData(t){return this._native.getData(t)}setData(t,e){this._native.setData(t,e)}set effectAllowed(t){this._native.effectAllowed=t}get effectAllowed(){return this._native.effectAllowed}set dropEffect(t){this._native.dropEffect=t}get dropEffect(){return this._native.dropEffect}setDragImage(t,e,n){this._native.setDragImage(t,e,n)}get isCanceled(){return"none"==this._native.dropEffect||!!this._native.mozUserCancelled}}function vc(t){const e=Array.from(t.files||[]),n=Array.from(t.items||[]);return e.length?e:n.filter((t=>"file"===t.kind)).map((t=>t.getAsFile()))}class yc extends Pa{constructor(){super(...arguments),this.domEventType="beforeinput"}onDomEvent(t){const e=t.getTargetRanges(),n=this.view,o=n.document;let i=null,r=null,s=[];if(t.dataTransfer&&(i=new Cc(t.dataTransfer)),null!==t.data?r=t.data:i&&(r=i.getData("text/plain")),o.selection.isFake)s=Array.from(o.selection.getRanges());else if(e.length)s=e.map((t=>{const e=n.domConverter.domPositionToView(t.startContainer,t.startOffset),o=n.domConverter.domPositionToView(t.endContainer,t.endOffset);return e?n.createRange(e,o):o?n.createRange(o):void 0})).filter((t=>!!t));else if(c.isAndroid){const e=t.target.ownerDocument.defaultView.getSelection();s=Array.from(n.domConverter.domSelectionToView(e).getRanges())}if(c.isAndroid&&"insertCompositionText"==t.inputType&&r&&r.endsWith("\n"))this.fire(t.type,t,{inputType:"insertParagraph",targetRanges:[n.createRange(s[0].end)]});else if("insertText"==t.inputType&&r&&r.includes("\n")){const e=r.split(/\n{1,2}/g);let n=s;for(let r=0;r{if(this.isEnabled&&((n=e.keyCode)==bi.arrowright||n==bi.arrowleft||n==bi.arrowup||n==bi.arrowdown)){const n=new Is(this.document,"arrowKey",this.document.selection.getFirstRange());this.document.fire(n,e),n.stop.called&&t.stop()}var n}))}observe(){}stopObserving(){}}class Ec extends Sa{constructor(t){super(t);const e=this.document;e.on("keydown",((t,n)=>{if(!this.isEnabled||n.keyCode!=bi.tab||n.ctrlKey)return;const o=new Is(e,"tab",e.selection.getFirstRange());e.fire(o,n),o.stop.called&&t.stop()}))}observe(){}stopObserving(){}}const Dc=function(t){return vo(t,5)};class Ic extends(K()){constructor(t){super(),this.domRoots=new Map,this._initialDomRootAttributes=new WeakMap,this._observers=new Map,this._ongoingChange=!1,this._postFixersInProgress=!1,this._renderingDisabled=!1,this._hasChangedSinceTheLastRendering=!1,this.document=new Os(t),this.domConverter=new Ea(this.document),this.set("isRenderingInProgress",!1),this.set("hasDomSelection",!1),this._renderer=new pa(this.domConverter,this.document.selection),this._renderer.bind("isFocused","isSelecting","isComposing").to(this.document,"isFocused","isSelecting","isComposing"),this._writer=new Ks(this.document),this.addObserver(kc),this.addObserver(wc),this.addObserver(Ac),this.addObserver(Oa),this.addObserver(Ya),this.addObserver(_c),this.addObserver(xc),this.addObserver(yc),this.addObserver(Ec),this.document.on("arrowKey",ha,{priority:"low"}),Hs(this),this.on("render",(()=>{this._render(),this.document.fire("layoutChanged"),this._hasChangedSinceTheLastRendering=!1})),this.listenTo(this.document.selection,"change",(()=>{this._hasChangedSinceTheLastRendering=!0})),this.listenTo(this.document,"change:isFocused",(()=>{this._hasChangedSinceTheLastRendering=!0})),c.isiOS&&this.listenTo(this.document,"blur",((t,e)=>{this.domConverter.mapDomToView(e.domEvent.relatedTarget)||this.domConverter._clearDomSelection()}))}attachDomRoot(t,e="main"){const n=this.document.getRoot(e);n._name=t.tagName.toLowerCase();const o={};for(const{name:e,value:i}of Array.from(t.attributes))o[e]=i,"class"===e?this._writer.addClass(i.split(" "),n):this._writer.setAttribute(e,i,n);this._initialDomRootAttributes.set(t,o);const i=()=>{this._writer.setAttribute("contenteditable",(!n.isReadOnly).toString(),n),n.isReadOnly?this._writer.addClass("ck-read-only",n):this._writer.removeClass("ck-read-only",n)};i(),this.domRoots.set(e,t),this.domConverter.bindElements(t,n),this._renderer.markToSync("children",n),this._renderer.markToSync("attributes",n),this._renderer.domDocuments.add(t.ownerDocument),n.on("change:children",((t,e)=>this._renderer.markToSync("children",e))),n.on("change:attributes",((t,e)=>this._renderer.markToSync("attributes",e))),n.on("change:text",((t,e)=>this._renderer.markToSync("text",e))),n.on("change:isReadOnly",(()=>this.change(i))),n.on("change",(()=>{this._hasChangedSinceTheLastRendering=!0}));for(const n of this._observers.values())n.observe(t,e)}detachDomRoot(t){const e=this.domRoots.get(t);Array.from(e.attributes).forEach((({name:t})=>e.removeAttribute(t)));const n=this._initialDomRootAttributes.get(e);for(const t in n)e.setAttribute(t,n[t]);this.domRoots.delete(t),this.domConverter.unbindDomElement(e);for(const t of this._observers.values())t.stopObserving(e)}getDomRoot(t="main"){return this.domRoots.get(t)}addObserver(t){let e=this._observers.get(t);if(e)return e;e=new t(this),this._observers.set(t,e);for(const[t,n]of this.domRoots)e.observe(n,t);return e.enable(),e}getObserver(t){return this._observers.get(t)}disableObservers(){for(const t of this._observers.values())t.disable()}enableObservers(){for(const t of this._observers.values())t.enable()}scrollToTheSelection({alignToTop:t,forceScroll:e,viewportOffset:n=20,ancestorOffset:o=20}={}){const i=this.document.selection.getFirstRange();if(!i)return;const r=Dc({alignToTop:t,forceScroll:e,viewportOffset:n,ancestorOffset:o});"number"==typeof n&&(n={top:n,bottom:n,left:n,right:n});const s={target:this.domConverter.viewRangeToDom(i),viewportOffset:n,ancestorOffset:o,alignToTop:t,forceScroll:e};this.fire("scrollToTheSelection",s,r),function({target:t,viewportOffset:e=0,ancestorOffset:n=0,alignToTop:o,forceScroll:i}){const r=hi(t);let s=r,a=null;for(e=function(t){return"number"==typeof t?{top:t,bottom:t,left:t,right:t}:t}(e);s;){let c;c=gi(s==r?t:a),ai({parent:c,getRect:()=>mi(t,s),alignToTop:o,ancestorOffset:n,forceScroll:i});const l=mi(t,s);if(si({window:s,rect:l,viewportOffset:e,alignToTop:o,forceScroll:i}),s.parent!=s){if(a=s.frameElement,s=s.parent,!a)return}else s=null}}(s)}focus(){if(!this.document.isFocused){const t=this.document.selection.editableElement;t&&(this.domConverter.focus(t),this.forceRender())}}change(t){if(this.isRenderingInProgress||this._postFixersInProgress)throw new _("cannot-change-view-tree",this);try{if(this._ongoingChange)return t(this._writer);this._ongoingChange=!0;const e=t(this._writer);return this._ongoingChange=!1,!this._renderingDisabled&&this._hasChangedSinceTheLastRendering&&(this._postFixersInProgress=!0,this.document._callPostFixers(this._writer),this._postFixersInProgress=!1,this.fire("render")),e}catch(t){_.rethrowUnexpectedError(t,this)}}forceRender(){this._hasChangedSinceTheLastRendering=!0,this.getObserver(wc).flush(),this.change((()=>{}))}destroy(){for(const t of this._observers.values())t.destroy();this.document.destroy(),this.stopListening()}createPositionAt(t,e){return vs._createAt(t,e)}createPositionAfter(t){return vs._createAfter(t)}createPositionBefore(t){return vs._createBefore(t)}createRange(t,e){return new ys(t,e)}createRangeOn(t){return ys._createOn(t)}createRangeIn(t){return ys._createIn(t)}createSelection(...t){return new Es(...t)}_disableRendering(t){this._renderingDisabled=t,0==t&&this.change((()=>{}))}_render(){this.isRenderingInProgress=!0,this.disableObservers(),this._renderer.render(),this.enableObservers(),this.isRenderingInProgress=!1}}class Mc{is(){throw new Error("is() method is abstract")}}class Tc extends Mc{constructor(t){super(),this.parent=null,this._attrs=Xi(t)}get document(){return null}get index(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildIndex(this)))throw new _("model-node-not-found-in-parent",this);return t}get startOffset(){let t;if(!this.parent)return null;if(null===(t=this.parent.getChildStartOffset(this)))throw new _("model-node-not-found-in-parent",this);return t}get offsetSize(){return 1}get endOffset(){return this.parent?this.startOffset+this.offsetSize:null}get nextSibling(){const t=this.index;return null!==t&&this.parent.getChild(t+1)||null}get previousSibling(){const t=this.index;return null!==t&&this.parent.getChild(t-1)||null}get root(){let t=this;for(;t.parent;)t=t.parent;return t}isAttached(){return null!==this.parent&&this.root.isAttached()}getPath(){const t=[];let e=this;for(;e.parent;)t.unshift(e.startOffset),e=e.parent;return t}getAncestors(t={}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}getCommonAncestor(t,e={}){const n=this.getAncestors(e),o=t.getAncestors(e);let i=0;for(;n[i]==o[i]&&n[i];)i++;return 0===i?null:n[i-1]}isBefore(t){if(this==t)return!1;if(this.root!==t.root)return!1;const e=this.getPath(),n=t.getPath(),o=et(e,n);switch(o){case"prefix":return!0;case"extension":return!1;default:return e[o](t[e[0]]=e[1],t)),{})),t}_clone(t){return new this.constructor(this._attrs)}_remove(){this.parent._removeChildren(this.index)}_setAttribute(t,e){this._attrs.set(t,e)}_setAttributesTo(t){this._attrs=Xi(t)}_removeAttribute(t){return this._attrs.delete(t)}_clearAttributes(){this._attrs.clear()}}Tc.prototype.is=function(t){return"node"===t||"model:node"===t};class Sc{constructor(t){this._nodes=[],t&&this._insertNodes(0,t)}[Symbol.iterator](){return this._nodes[Symbol.iterator]()}get length(){return this._nodes.length}get maxOffset(){return this._nodes.reduce(((t,e)=>t+e.offsetSize),0)}getNode(t){return this._nodes[t]||null}getNodeIndex(t){const e=this._nodes.indexOf(t);return-1==e?null:e}getNodeStartOffset(t){const e=this.getNodeIndex(t);return null===e?null:this._nodes.slice(0,e).reduce(((t,e)=>t+e.offsetSize),0)}indexToOffset(t){if(t==this._nodes.length)return this.maxOffset;const e=this._nodes[t];if(!e)throw new _("model-nodelist-index-out-of-bounds",this);return this.getNodeStartOffset(e)}offsetToIndex(t){let e=0;for(const n of this._nodes){if(t>=e&&t1e4)return t.slice(0,n).concat(e).concat(t.slice(n+o,t.length));{const i=Array.from(t);return i.splice(n,o,...e),i}}(this._nodes,Array.from(e),t,0)}_removeNodes(t,e=1){return this._nodes.splice(t,e)}toJSON(){return this._nodes.map((t=>t.toJSON()))}}class Bc extends Tc{constructor(t,e){super(e),this._data=t||""}get offsetSize(){return this.data.length}get data(){return this._data}toJSON(){const t=super.toJSON();return t.data=this.data,t}_clone(){return new Bc(this.data,this.getAttributes())}static fromJSON(t){return new Bc(t.data,t.attributes)}}Bc.prototype.is=function(t){return"$text"===t||"model:$text"===t||"text"===t||"model:text"===t||"node"===t||"model:node"===t};class Nc extends Mc{constructor(t,e,n){if(super(),this.textNode=t,e<0||e>t.offsetSize)throw new _("model-textproxy-wrong-offsetintext",this);if(n<0||e+n>t.offsetSize)throw new _("model-textproxy-wrong-length",this);this.data=t.data.substring(e,e+n),this.offsetInText=e}get startOffset(){return null!==this.textNode.startOffset?this.textNode.startOffset+this.offsetInText:null}get offsetSize(){return this.data.length}get endOffset(){return null!==this.startOffset?this.startOffset+this.offsetSize:null}get isPartial(){return this.offsetSize!==this.textNode.offsetSize}get parent(){return this.textNode.parent}get root(){return this.textNode.root}getPath(){const t=this.textNode.getPath();return t.length>0&&(t[t.length-1]+=this.offsetInText),t}getAncestors(t={}){const e=[];let n=t.includeSelf?this:this.parent;for(;n;)e[t.parentFirst?"push":"unshift"](n),n=n.parent;return e}hasAttribute(t){return this.textNode.hasAttribute(t)}getAttribute(t){return this.textNode.getAttribute(t)}getAttributes(){return this.textNode.getAttributes()}getAttributeKeys(){return this.textNode.getAttributeKeys()}}Nc.prototype.is=function(t){return"$textProxy"===t||"model:$textProxy"===t||"textProxy"===t||"model:textProxy"===t};class Pc extends Tc{constructor(t,e,n){super(e),this._children=new Sc,this.name=t,n&&this._insertChild(0,n)}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}offsetToIndex(t){return this._children.offsetToIndex(t)}getNodeByPath(t){let e=this;for(const n of t)e=e.getChild(e.offsetToIndex(n));return e}findAncestor(t,e={}){let n=e.includeSelf?this:this.parent;for(;n;){if(n.name===t)return n;n=n.parent}return null}toJSON(){const t=super.toJSON();if(t.name=this.name,this._children.length>0){t.children=[];for(const e of this._children)t.children.push(e.toJSON())}return t}_clone(t=!1){const e=t?Array.from(this._children).map((t=>t._clone(!0))):void 0;return new Pc(this.name,this.getAttributes(),e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=function(t){if("string"==typeof t)return[new Bc(t)];nt(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new Bc(t):t instanceof Nc?new Bc(t.data,t.getAttributes()):t))}(e);for(const t of n)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n)t.parent=null;return n}static fromJSON(t){let e;if(t.children){e=[];for(const n of t.children)n.name?e.push(Pc.fromJSON(n)):e.push(Bc.fromJSON(n))}return new Pc(t.name,t.attributes,e)}}Pc.prototype.is=function(t,e){return e?e===this.name&&("element"===t||"model:element"===t):"element"===t||"model:element"===t||"node"===t||"model:node"===t};class Oc{constructor(t){if(!t||!t.boundaries&&!t.startPosition)throw new _("model-tree-walker-no-start-position",null);const e=t.direction||"forward";if("forward"!=e&&"backward"!=e)throw new _("model-tree-walker-unknown-direction",t,{direction:e});this.direction=e,this.boundaries=t.boundaries||null,t.startPosition?this._position=t.startPosition.clone():this._position=zc._createAt(this.boundaries["backward"==this.direction?"end":"start"]),this.position.stickiness="toNone",this.singleCharacters=!!t.singleCharacters,this.shallow=!!t.shallow,this.ignoreElementEnd=!!t.ignoreElementEnd,this._boundaryStartParent=this.boundaries?this.boundaries.start.parent:null,this._boundaryEndParent=this.boundaries?this.boundaries.end.parent:null,this._visitedParent=this.position.parent}[Symbol.iterator](){return this}get position(){return this._position}skip(t){let e,n,o,i;do{o=this.position,i=this._visitedParent,({done:e,value:n}=this.next())}while(!e&&t(n));e||(this._position=o,this._visitedParent=i)}next(){return"forward"==this.direction?this._next():this._previous()}_next(){const t=this.position,e=this.position.clone(),n=this._visitedParent;if(null===n.parent&&e.offset===n.maxOffset)return{done:!0,value:void 0};if(n===this._boundaryEndParent&&e.offset==this.boundaries.end.offset)return{done:!0,value:void 0};const o=Rc(e,n),i=o||jc(e,n,o);if(i instanceof Pc){if(this.shallow){if(this.boundaries&&this.boundaries.end.isBefore(e))return{done:!0,value:void 0};e.offset++}else e.path.push(0),this._visitedParent=i;return this._position=e,Lc("elementStart",i,t,e,1)}if(i instanceof Bc){let o;if(this.singleCharacters)o=1;else{let t=i.endOffset;this._boundaryEndParent==n&&this.boundaries.end.offsett&&(t=this.boundaries.start.offset),o=e.offset-t}const i=e.offset-r.startOffset,s=new Nc(r,i-o,o);return e.offset-=o,this._position=e,Lc("text",s,t,e,o)}return e.path.pop(),this._position=e,this._visitedParent=n.parent,Lc("elementStart",n,t,e,1)}}function Lc(t,e,n,o,i){return{done:!1,value:{type:t,item:e,previousPosition:n,nextPosition:o,length:i}}}class zc extends Mc{constructor(t,e,n="toNone"){if(super(),!t.is("element")&&!t.is("documentFragment"))throw new _("model-position-root-invalid",t);if(!(e instanceof Array)||0===e.length)throw new _("model-position-path-incorrect-format",t,{path:e});t.is("rootElement")?e=e.slice():(e=[...t.getPath(),...e],t=t.root),this.root=t,this.path=e,this.stickiness=n}get offset(){return this.path[this.path.length-1]}set offset(t){this.path[this.path.length-1]=t}get parent(){let t=this.root;for(let e=0;e1)return!1;if(1===e)return Vc(t,this,n);if(-1===e)return Vc(this,t,n)}return this.path.length===t.path.length||(this.path.length>t.path.length?Hc(this.path,e):Hc(t.path,e))}hasSameParentAs(t){if(this.root!==t.root)return!1;return"same"==et(this.getParentPath(),t.getParentPath())}getTransformedByOperation(t){let e;switch(t.type){case"insert":e=this._getTransformedByInsertOperation(t);break;case"move":case"remove":case"reinsert":e=this._getTransformedByMoveOperation(t);break;case"split":e=this._getTransformedBySplitOperation(t);break;case"merge":e=this._getTransformedByMergeOperation(t);break;default:e=zc._createAt(this)}return e}_getTransformedByInsertOperation(t){return this._getTransformedByInsertion(t.position,t.howMany)}_getTransformedByMoveOperation(t){return this._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany)}_getTransformedBySplitOperation(t){const e=t.movedRange;return e.containsPosition(this)||e.start.isEqual(this)&&"toNext"==this.stickiness?this._getCombined(t.splitPosition,t.moveTargetPosition):t.graveyardPosition?this._getTransformedByMove(t.graveyardPosition,t.insertionPosition,1):this._getTransformedByInsertion(t.insertionPosition,1)}_getTransformedByMergeOperation(t){const e=t.movedRange;let n;return e.containsPosition(this)||e.start.isEqual(this)?(n=this._getCombined(t.sourcePosition,t.targetPosition),t.sourcePosition.isBefore(t.targetPosition)&&(n=n._getTransformedByDeletion(t.deletionPosition,1))):n=this.isEqual(t.deletionPosition)?zc._createAt(t.deletionPosition):this._getTransformedByMove(t.deletionPosition,t.graveyardPosition,1),n}_getTransformedByDeletion(t,e){const n=zc._createAt(this);if(this.root!=t.root)return n;if("same"==et(t.getParentPath(),this.getParentPath())){if(t.offsetthis.offset)return null;n.offset-=e}}else if("prefix"==et(t.getParentPath(),this.getParentPath())){const o=t.path.length-1;if(t.offset<=this.path[o]){if(t.offset+e>this.path[o])return null;n.path[o]-=e}}return n}_getTransformedByInsertion(t,e){const n=zc._createAt(this);if(this.root!=t.root)return n;if("same"==et(t.getParentPath(),this.getParentPath()))(t.offset=e;){if(t.path[o]+i!==n.maxOffset)return!1;i=1,o--,n=n.parent}return!0}(t,n+1))}function Hc(t,e){for(;ee+1;){const e=o.maxOffset-n.offset;0!==e&&t.push(new Uc(n,n.getShiftedBy(e))),n.path=n.path.slice(0,-1),n.offset++,o=o.parent}for(;n.path.length<=this.end.path.length;){const e=this.end.path[n.path.length-1],o=e-n.offset;0!==o&&t.push(new Uc(n,n.getShiftedBy(o))),n.offset=e,n.path.push(0)}return t}getWalker(t={}){return t.boundaries=this,new Oc(t)}*getItems(t={}){t.boundaries=this,t.ignoreElementEnd=!0;const e=new Oc(t);for(const t of e)yield t.item}*getPositions(t={}){t.boundaries=this;const e=new Oc(t);yield e.position;for(const t of e)yield t.nextPosition}getTransformedByOperation(t){switch(t.type){case"insert":return this._getTransformedByInsertOperation(t);case"move":case"remove":case"reinsert":return this._getTransformedByMoveOperation(t);case"split":return[this._getTransformedBySplitOperation(t)];case"merge":return[this._getTransformedByMergeOperation(t)]}return[new Uc(this.start,this.end)]}getTransformedByOperations(t){const e=[new Uc(this.start,this.end)];for(const n of t)for(let t=0;t0?new this(n,o):new this(o,n)}static _createIn(t){return new this(zc._createAt(t,0),zc._createAt(t,t.maxOffset))}static _createOn(t){return this._createFromPositionAndShift(zc._createBefore(t),t.offsetSize)}static _createFromRanges(t){if(0===t.length)throw new _("range-create-from-ranges-empty-array",null);if(1==t.length)return t[0].clone();const e=t[0];t.sort(((t,e)=>t.start.isAfter(e.start)?1:-1));const n=t.indexOf(e),o=new this(e.start,e.end);if(n>0)for(let e=n-1;t[e].end.isEqual(o.start);e++)o.start=zc._createAt(t[e].start);for(let e=n+1;e{if(e.viewPosition)return;const n=this._modelToViewMapping.get(e.modelPosition.parent);if(!n)throw new _("mapping-model-position-view-parent-not-found",this,{modelPosition:e.modelPosition});e.viewPosition=this.findPositionIn(n,e.modelPosition.offset)}),{priority:"low"}),this.on("viewToModelPosition",((t,e)=>{if(e.modelPosition)return;const n=this.findMappedViewAncestor(e.viewPosition),o=this._viewToModelMapping.get(n),i=this._toModelOffset(e.viewPosition.parent,e.viewPosition.offset,n);e.modelPosition=zc._createAt(o,i)}),{priority:"low"})}bindElements(t,e){this._modelToViewMapping.set(t,e),this._viewToModelMapping.set(e,t)}unbindViewElement(t,e={}){const n=this.toModelElement(t);if(this._elementToMarkerNames.has(t))for(const e of this._elementToMarkerNames.get(t))this._unboundMarkerNames.add(e);e.defer?this._deferredBindingRemovals.set(t,t.root):(this._viewToModelMapping.delete(t),this._modelToViewMapping.get(n)==t&&this._modelToViewMapping.delete(n))}unbindModelElement(t){const e=this.toViewElement(t);this._modelToViewMapping.delete(t),this._viewToModelMapping.get(e)==t&&this._viewToModelMapping.delete(e)}bindElementToMarker(t,e){const n=this._markerNameToElements.get(e)||new Set;n.add(t);const o=this._elementToMarkerNames.get(t)||new Set;o.add(e),this._markerNameToElements.set(e,n),this._elementToMarkerNames.set(t,o)}unbindElementFromMarkerName(t,e){const n=this._markerNameToElements.get(e);n&&(n.delete(t),0==n.size&&this._markerNameToElements.delete(e));const o=this._elementToMarkerNames.get(t);o&&(o.delete(e),0==o.size&&this._elementToMarkerNames.delete(t))}flushUnboundMarkerNames(){const t=Array.from(this._unboundMarkerNames);return this._unboundMarkerNames.clear(),t}flushDeferredBindings(){for(const[t,e]of this._deferredBindingRemovals)t.root==e&&this.unbindViewElement(t);this._deferredBindingRemovals=new Map}clearBindings(){this._modelToViewMapping=new WeakMap,this._viewToModelMapping=new WeakMap,this._markerNameToElements=new Map,this._elementToMarkerNames=new Map,this._unboundMarkerNames=new Set,this._deferredBindingRemovals=new Map}toModelElement(t){return this._viewToModelMapping.get(t)}toViewElement(t){return this._modelToViewMapping.get(t)}toModelRange(t){return new Uc(this.toModelPosition(t.start),this.toModelPosition(t.end))}toViewRange(t){return new ys(this.toViewPosition(t.start),this.toViewPosition(t.end))}toModelPosition(t){const e={viewPosition:t,mapper:this};return this.fire("viewToModelPosition",e),e.modelPosition}toViewPosition(t,e={}){const n={modelPosition:t,mapper:this,isPhantom:e.isPhantom};return this.fire("modelToViewPosition",n),n.viewPosition}markerNameToElements(t){const e=this._markerNameToElements.get(t);if(!e)return null;const n=new Set;for(const t of e)if(t.is("attributeElement"))for(const e of t.getElementsWithSameId())n.add(e);else n.add(t);return n}registerViewToModelLength(t,e){this._viewToModelLengthCallbacks.set(t,e)}findMappedViewAncestor(t){let e=t.parent;for(;!this._viewToModelMapping.has(e);)e=e.parent;return e}_toModelOffset(t,e,n){if(n!=t){return this._toModelOffset(t.parent,t.index,n)+this._toModelOffset(t,e,t)}if(t.is("$text"))return e;let o=0;for(let n=0;n1?e[0]+":"+e[1]:e[0]}var Kc=Object.defineProperty,$c=Object.defineProperties,Yc=Object.getOwnPropertyDescriptors,Qc=Object.getOwnPropertySymbols,Zc=Object.prototype.hasOwnProperty,Jc=Object.prototype.propertyIsEnumerable,Xc=(t,e,n)=>e in t?Kc(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,tl=(t,e)=>{for(var n in e||(e={}))Zc.call(e,n)&&Xc(t,n,e[n]);if(Qc)for(var n of Qc(e))Jc.call(e,n)&&Xc(t,n,e[n]);return t},el=(t,e)=>$c(t,Yc(e));class nl extends(B()){constructor(t){super(),this._conversionApi=tl({dispatcher:this},t),this._firedEventsMap=new WeakMap}convertChanges(t,e,n){const o=this._createConversionApi(n,t.getRefreshedItems());for(const e of t.getMarkersToRemove())this._convertMarkerRemove(e.name,e.range,o);const i=this._reduceChanges(t.getChanges());for(const t of i)"insert"===t.type?this._convertInsert(Uc._createFromPositionAndShift(t.position,t.length),o):"reinsert"===t.type?this._convertReinsert(Uc._createFromPositionAndShift(t.position,t.length),o):"remove"===t.type?this._convertRemove(t.position,t.length,t.name,o):this._convertAttribute(t.range,t.attributeKey,t.attributeOldValue,t.attributeNewValue,o);o.mapper.flushDeferredBindings();for(const t of o.mapper.flushUnboundMarkerNames()){const n=e.get(t).getRange();this._convertMarkerRemove(t,n,o),this._convertMarkerAdd(t,n,o)}for(const e of t.getMarkersToAdd())this._convertMarkerAdd(e.name,e.range,o);o.consumable.verifyAllConsumed("insert")}convert(t,e,n,o={}){const i=this._createConversionApi(n,void 0,o);this._convertInsert(t,i);for(const[t,n]of e)this._convertMarkerAdd(t,n,i);i.consumable.verifyAllConsumed("insert")}convertSelection(t,e,n){const o=this._createConversionApi(n);this.fire("cleanSelection",{selection:t},o);const i=t.getFirstPosition().root;if(!o.mapper.toViewElement(i))return;const r=Array.from(e.getMarkersAtPosition(t.getFirstPosition()));if(this._addConsumablesForSelection(o.consumable,t,r),this.fire("selection",{selection:t},o),t.isCollapsed){for(const e of r)if(o.consumable.test(t,"addMarker:"+e.name)){const n=e.getRange();if(!ol(t.getFirstPosition(),e,o.mapper))continue;const i={item:t,markerName:e.name,markerRange:n};this.fire(`addMarker:${e.name}`,i,o)}for(const e of t.getAttributeKeys())if(o.consumable.test(t,"attribute:"+e)){const n={item:t,range:t.getFirstRange(),attributeKey:e,attributeOldValue:null,attributeNewValue:t.getAttribute(e)};this.fire(`attribute:${e}:$text`,n,o)}}}_convertInsert(t,e,n={}){n.doNotAddConsumables||this._addConsumablesForInsert(e.consumable,t);for(const n of Array.from(t.getWalker({shallow:!0})).map(il))this._testAndFire("insert",n,e)}_convertRemove(t,e,n,o){this.fire(`remove:${n}`,{position:t,length:e},o)}_convertAttribute(t,e,n,o,i){this._addConsumablesForRange(i.consumable,t,`attribute:${e}`);for(const r of t){const t={item:r.item,range:Uc._createFromPositionAndShift(r.previousPosition,r.length),attributeKey:e,attributeOldValue:n,attributeNewValue:o};this._testAndFire(`attribute:${e}`,t,i)}}_convertReinsert(t,e){const n=Array.from(t.getWalker({shallow:!0}));this._addConsumablesForInsert(e.consumable,n);for(const t of n.map(il))this._testAndFire("insert",el(tl({},t),{reconversion:!0}),e)}_convertMarkerAdd(t,e,n){if("$graveyard"==e.root.rootName)return;const o=`addMarker:${t}`;if(n.consumable.add(e,o),this.fire(o,{markerName:t,markerRange:e},n),n.consumable.consume(e,o)){this._addConsumablesForRange(n.consumable,e,o);for(const i of e.getItems()){if(!n.consumable.test(i,o))continue;const r={item:i,range:Uc._createOn(i),markerName:t,markerRange:e};this.fire(o,r,n)}}}_convertMarkerRemove(t,e,n){"$graveyard"!=e.root.rootName&&this.fire(`removeMarker:${t}`,{markerName:t,markerRange:e},n)}_reduceChanges(t){const e={changes:t};return this.fire("reduceChanges",e),e.changes}_addConsumablesForInsert(t,e){for(const n of e){const e=n.item;if(null===t.test(e,"insert")){t.add(e,"insert");for(const n of e.getAttributeKeys())t.add(e,"attribute:"+n)}}return t}_addConsumablesForRange(t,e,n){for(const o of e.getItems())t.add(o,n);return t}_addConsumablesForSelection(t,e,n){t.add(e,"selection");for(const o of n)t.add(e,"addMarker:"+o.name);for(const n of e.getAttributeKeys())t.add(e,"attribute:"+n);return t}_testAndFire(t,e,n){const o=function(t,e){const n=e.item.is("element")?e.item.name:"$text";return`${t}:${n}`}(t,e),i=e.item.is("$textProxy")?n.consumable._getSymbolForTextProxy(e.item):e.item,r=this._firedEventsMap.get(n),s=r.get(i);if(s){if(s.has(o))return;s.add(o)}else r.set(i,new Set([o]));this.fire(o,e,n)}_testAndFireAddAttributes(t,e){const n={item:t,range:Uc._createOn(t)};for(const t of n.item.getAttributeKeys())n.attributeKey=t,n.attributeOldValue=null,n.attributeNewValue=n.item.getAttribute(t),this._testAndFire(`attribute:${t}`,n,e)}_createConversionApi(t,e=new Set,n={}){const o=el(tl({},this._conversionApi),{consumable:new Gc,writer:t,options:n,convertItem:t=>this._convertInsert(Uc._createOn(t),o),convertChildren:t=>this._convertInsert(Uc._createIn(t),o,{doNotAddConsumables:!0}),convertAttributes:t=>this._testAndFireAddAttributes(t,o),canReuseView:t=>!e.has(o.mapper.toModelElement(t))});return this._firedEventsMap.set(o,new Map),o}}function ol(t,e,n){const o=e.getRange(),i=Array.from(t.getAncestors());i.shift(),i.reverse();return!i.some((t=>{if(o.containsItem(t)){return!!n.toViewElement(t).getCustomProperty("addHighlight")}}))}function il(t){return{item:t.item,range:Uc._createFromPositionAndShift(t.previousPosition,t.length)}}class rl extends(B(Mc)){constructor(...t){super(),this._lastRangeBackward=!1,this._attrs=new Map,this._ranges=[],t.length&&this.setTo(...t)}get anchor(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.end:t.start}return null}get focus(){if(this._ranges.length>0){const t=this._ranges[this._ranges.length-1];return this._lastRangeBackward?t.start:t.end}return null}get isCollapsed(){return 1===this._ranges.length&&this._ranges[0].isCollapsed}get rangeCount(){return this._ranges.length}get isBackward(){return!this.isCollapsed&&this._lastRangeBackward}isEqual(t){if(this.rangeCount!=t.rangeCount)return!1;if(0===this.rangeCount)return!0;if(!this.anchor.isEqual(t.anchor)||!this.focus.isEqual(t.focus))return!1;for(const e of this._ranges){let n=!1;for(const o of t._ranges)if(e.isEqual(o)){n=!0;break}if(!n)return!1}return!0}*getRanges(){for(const t of this._ranges)yield new Uc(t.start,t.end)}getFirstRange(){let t=null;for(const e of this._ranges)t&&!e.start.isBefore(t.start)||(t=e);return t?new Uc(t.start,t.end):null}getLastRange(){let t=null;for(const e of this._ranges)t&&!e.end.isAfter(t.end)||(t=e);return t?new Uc(t.start,t.end):null}getFirstPosition(){const t=this.getFirstRange();return t?t.start.clone():null}getLastPosition(){const t=this.getLastRange();return t?t.end.clone():null}setTo(...t){let[e,n,o]=t;if("object"==typeof n&&(o=n,n=void 0),null===e)this._setRanges([]);else if(e instanceof rl)this._setRanges(e.getRanges(),e.isBackward);else if(e&&"function"==typeof e.getRanges)this._setRanges(e.getRanges(),e.isBackward);else if(e instanceof Uc)this._setRanges([e],!!o&&!!o.backward);else if(e instanceof zc)this._setRanges([new Uc(e)]);else if(e instanceof Tc){const t=!!o&&!!o.backward;let i;if("in"==n)i=Uc._createIn(e);else if("on"==n)i=Uc._createOn(e);else{if(void 0===n)throw new _("model-selection-setto-required-second-parameter",[this,e]);i=new Uc(zc._createAt(e,n))}this._setRanges([i],t)}else{if(!nt(e))throw new _("model-selection-setto-not-selectable",[this,e]);this._setRanges(e,o&&!!o.backward)}}_setRanges(t,e=!1){const n=Array.from(t),o=n.some((e=>{if(!(e instanceof Uc))throw new _("model-selection-set-ranges-not-range",[this,t]);return this._ranges.every((t=>!t.isEqual(e)))}));(n.length!==this._ranges.length||o)&&(this._replaceAllRanges(n),this._lastRangeBackward=!!e,this.fire("change:range",{directChange:!0}))}setFocus(t,e){if(null===this.anchor)throw new _("model-selection-setfocus-no-ranges",[this,t]);const n=zc._createAt(t,e);if("same"==n.compareWith(this.focus))return;const o=this.anchor;this._ranges.length&&this._popRange(),"before"==n.compareWith(o)?(this._pushRange(new Uc(n,o)),this._lastRangeBackward=!0):(this._pushRange(new Uc(o,n)),this._lastRangeBackward=!1),this.fire("change:range",{directChange:!0})}getAttribute(t){return this._attrs.get(t)}getAttributes(){return this._attrs.entries()}getAttributeKeys(){return this._attrs.keys()}hasAttribute(t){return this._attrs.has(t)}removeAttribute(t){this.hasAttribute(t)&&(this._attrs.delete(t),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}setAttribute(t,e){this.getAttribute(t)!==e&&(this._attrs.set(t,e),this.fire("change:attribute",{attributeKeys:[t],directChange:!0}))}getSelectedElement(){return 1!==this.rangeCount?null:this.getFirstRange().getContainedElement()}*getSelectedBlocks(){const t=new WeakSet;for(const e of this.getRanges()){const n=cl(e.start,t);dl(n,e)&&(yield n);for(const n of e.getWalker()){const o=n.item;"elementEnd"==n.type&&al(o,t,e)&&(yield o)}const o=cl(e.end,t);ul(o,e)&&(yield o)}}containsEntireContent(t=this.anchor.root){const e=zc._createAt(t,0),n=zc._createAt(t,"end");return e.isTouching(this.getFirstPosition())&&n.isTouching(this.getLastPosition())}_pushRange(t){this._checkRange(t),this._ranges.push(new Uc(t.start,t.end))}_checkRange(t){for(let e=0;e0;)this._popRange()}_popRange(){this._ranges.pop()}}function sl(t,e){return!e.has(t)&&(e.add(t),t.root.document.model.schema.isBlock(t)&&!!t.parent)}function al(t,e,n){return sl(t,e)&&ll(t,n)}function cl(t,e){const n=t.parent.root.document.model.schema,o=t.parent.getAncestors({parentFirst:!0,includeSelf:!0});let i=!1;const r=o.find((t=>!i&&(i=n.isLimit(t),!i&&sl(t,e))));return o.forEach((t=>e.add(t))),r}function ll(t,e){const n=function(t){const e=t.root.document.model.schema;let n=t.parent;for(;n;){if(e.isBlock(n))return n;n=n.parent}}(t);if(!n)return!0;return!e.containsRange(Uc._createOn(n),!0)}function dl(t,e){return!!t&&(!(!e.isCollapsed&&!t.isEmpty)||!e.start.isTouching(zc._createAt(t,t.maxOffset))&&ll(t,e))}function ul(t,e){return!!t&&(!(!e.isCollapsed&&!t.isEmpty)||!e.end.isTouching(zc._createAt(t,0))&&ll(t,e))}rl.prototype.is=function(t){return"selection"===t||"model:selection"===t};class hl extends(B(Uc)){constructor(t,e){super(t,e),gl.call(this)}detach(){this.stopListening()}toRange(){return new Uc(this.start,this.end)}static fromRange(t){return new hl(t.start,t.end)}}function gl(){this.listenTo(this.root.document.model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&ml.call(this,n)}),{priority:"low"})}function ml(t){const e=this.getTransformedByOperation(t),n=Uc._createFromRanges(e),o=!n.isEqual(this),i=function(t,e){switch(e.type){case"insert":return t.containsPosition(e.position);case"move":case"remove":case"reinsert":case"merge":return t.containsPosition(e.sourcePosition)||t.start.isEqual(e.sourcePosition)||t.containsPosition(e.targetPosition);case"split":return t.containsPosition(e.splitPosition)||t.containsPosition(e.insertionPosition)}return!1}(this,t);let r=null;if(o){"$graveyard"==n.root.rootName&&(r="remove"==t.type?t.sourcePosition:t.deletionPosition);const e=this.toRange();this.start=n.start,this.end=n.end,this.fire("change:range",e,{deletionPosition:r})}else i&&this.fire("change:content",this.toRange(),{deletionPosition:r})}hl.prototype.is=function(t){return"liveRange"===t||"model:liveRange"===t||"range"==t||"model:range"===t};const pl="selection:";class fl extends(B(Mc)){constructor(t){super(),this._selection=new kl(t),this._selection.delegate("change:range").to(this),this._selection.delegate("change:attribute").to(this),this._selection.delegate("change:marker").to(this)}get isCollapsed(){return this._selection.isCollapsed}get anchor(){return this._selection.anchor}get focus(){return this._selection.focus}get rangeCount(){return this._selection.rangeCount}get hasOwnRange(){return this._selection.hasOwnRange}get isBackward(){return this._selection.isBackward}get isGravityOverridden(){return this._selection.isGravityOverridden}get markers(){return this._selection.markers}get _ranges(){return this._selection._ranges}getRanges(){return this._selection.getRanges()}getFirstPosition(){return this._selection.getFirstPosition()}getLastPosition(){return this._selection.getLastPosition()}getFirstRange(){return this._selection.getFirstRange()}getLastRange(){return this._selection.getLastRange()}getSelectedBlocks(){return this._selection.getSelectedBlocks()}getSelectedElement(){return this._selection.getSelectedElement()}containsEntireContent(t){return this._selection.containsEntireContent(t)}destroy(){this._selection.destroy()}getAttributeKeys(){return this._selection.getAttributeKeys()}getAttributes(){return this._selection.getAttributes()}getAttribute(t){return this._selection.getAttribute(t)}hasAttribute(t){return this._selection.hasAttribute(t)}refresh(){this._selection.updateMarkers(),this._selection._updateAttributes(!1)}observeMarkers(t){this._selection.observeMarkers(t)}_setFocus(t,e){this._selection.setFocus(t,e)}_setTo(...t){this._selection.setTo(...t)}_setAttribute(t,e){this._selection.setAttribute(t,e)}_removeAttribute(t){this._selection.removeAttribute(t)}_getStoredAttributes(){return this._selection.getStoredAttributes()}_overrideGravity(){return this._selection.overrideGravity()}_restoreGravity(t){this._selection.restoreGravity(t)}static _getStoreAttributeKey(t){return pl+t}static _isStoreAttributeKey(t){return t.startsWith(pl)}}fl.prototype.is=function(t){return"selection"===t||"model:selection"==t||"documentSelection"==t||"model:documentSelection"==t};class kl extends rl{constructor(t){super(),this.markers=new Yi({idProperty:"name"}),this._attributePriority=new Map,this._selectionRestorePosition=null,this._hasChangedRange=!1,this._overriddenGravityRegister=new Set,this._observedMarkers=new Set,this._model=t.model,this._document=t,this.listenTo(this._model,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&"marker"!=n.type&&"rename"!=n.type&&"noop"!=n.type&&(0==this._ranges.length&&this._selectionRestorePosition&&this._fixGraveyardSelection(this._selectionRestorePosition),this._selectionRestorePosition=null,this._hasChangedRange&&(this._hasChangedRange=!1,this.fire("change:range",{directChange:!1})))}),{priority:"lowest"}),this.on("change:range",(()=>{this._validateSelectionRanges(this.getRanges())})),this.listenTo(this._model.markers,"update",((t,e,n,o)=>{this._updateMarker(e,o)})),this.listenTo(this._document,"change",((t,e)=>{!function(t,e){const n=t.document.differ;for(const o of n.getChanges()){if("insert"!=o.type)continue;const n=o.position.parent;o.length===n.maxOffset&&t.enqueueChange(e,(t=>{const e=Array.from(n.getAttributeKeys()).filter((t=>t.startsWith(pl)));for(const o of e)t.removeAttribute(o,n)}))}}(this._model,e)}))}get isCollapsed(){return 0===this._ranges.length?this._document._getDefaultRange().isCollapsed:super.isCollapsed}get anchor(){return super.anchor||this._document._getDefaultRange().start}get focus(){return super.focus||this._document._getDefaultRange().end}get rangeCount(){return this._ranges.length?this._ranges.length:1}get hasOwnRange(){return this._ranges.length>0}get isGravityOverridden(){return!!this._overriddenGravityRegister.size}destroy(){for(let t=0;t{if(this._hasChangedRange=!0,e.root==this._document.graveyard){this._selectionRestorePosition=o.deletionPosition;const t=this._ranges.indexOf(e);this._ranges.splice(t,1),e.detach()}})),e}updateMarkers(){if(!this._observedMarkers.size)return;const t=[];let e=!1;for(const e of this._model.markers){const n=e.name.split(":",1)[0];if(!this._observedMarkers.has(n))continue;const o=e.getRange();for(const n of this.getRanges())o.containsRange(n,!n.isCollapsed)&&t.push(e)}const n=Array.from(this.markers);for(const n of t)this.markers.has(n)||(this.markers.add(n),e=!0);for(const n of Array.from(this.markers))t.includes(n)||(this.markers.remove(n),e=!0);e&&this.fire("change:marker",{oldMarkers:n,directChange:!1})}_updateMarker(t,e){const n=t.name.split(":",1)[0];if(!this._observedMarkers.has(n))return;let o=!1;const i=Array.from(this.markers),r=this.markers.has(t);if(e){let n=!1;for(const t of this.getRanges())if(e.containsRange(t,!t.isCollapsed)){n=!0;break}n&&!r?(this.markers.add(t),o=!0):!n&&r&&(this.markers.remove(t),o=!0)}else r&&(this.markers.remove(t),o=!0);o&&this.fire("change:marker",{oldMarkers:i,directChange:!1})}_updateAttributes(t){const e=Xi(this._getSurroundingAttributes()),n=Xi(this.getAttributes());if(t)this._attributePriority=new Map,this._attrs=new Map;else for(const[t,e]of this._attributePriority)"low"==e&&(this._attrs.delete(t),this._attributePriority.delete(t));this._setAttributesTo(e);const o=[];for(const[t,e]of this.getAttributes())n.has(t)&&n.get(t)===e||o.push(t);for(const[t]of n)this.hasAttribute(t)||o.push(t);o.length>0&&this.fire("change:attribute",{attributeKeys:o,directChange:!1})}_setAttribute(t,e,n=!0){const o=n?"normal":"low";if("low"==o&&"normal"==this._attributePriority.get(t))return!1;return super.getAttribute(t)!==e&&(this._attrs.set(t,e),this._attributePriority.set(t,o),!0)}_removeAttribute(t,e=!0){const n=e?"normal":"low";return("low"!=n||"normal"!=this._attributePriority.get(t))&&(this._attributePriority.set(t,n),!!super.hasAttribute(t)&&(this._attrs.delete(t),!0))}_setAttributesTo(t){const e=new Set;for(const[e,n]of this.getAttributes())t.get(e)!==n&&this._removeAttribute(e,!1);for(const[n,o]of t){this._setAttribute(n,o,!1)&&e.add(n)}return e}*getStoredAttributes(){const t=this.getFirstPosition().parent;if(this.isCollapsed&&t.isEmpty)for(const e of t.getAttributeKeys())if(e.startsWith(pl)){const n=e.substr(10);yield[n,t.getAttribute(e)]}}_getSurroundingAttributes(){const t=this.getFirstPosition(),e=this._model.schema;if("$graveyard"==t.root.rootName)return null;let n=null;if(this.isCollapsed){const o=t.textNode?t.textNode:t.nodeBefore,i=t.textNode?t.textNode:t.nodeAfter;if(this.isGravityOverridden||(n=bl(o,e)),n||(n=bl(i,e)),!this.isGravityOverridden&&!n){let t=o;for(;t&&!n;)t=t.previousSibling,n=bl(t,e)}if(!n){let t=i;for(;t&&!n;)t=t.nextSibling,n=bl(t,e)}n||(n=this.getStoredAttributes())}else{const t=this.getFirstRange();for(const o of t){if(o.item.is("element")&&e.isObject(o.item)){n=bl(o.item,e);break}if("text"==o.type){n=o.item.getAttributes();break}}}return n}_fixGraveyardSelection(t){const e=this._model.schema.getNearestSelectionRange(t);e&&this._pushRange(e)}}function bl(t,e){if(!t)return null;if(t instanceof Nc||t instanceof Bc)return t.getAttributes();if(!e.isInline(t))return null;if(!e.isObject(t))return[];const n=[];for(const[o,i]of t.getAttributes())e.checkAttribute("$text",o)&&!1!==e.getAttributeProperties(o).copyFromObject&&n.push([o,i]);return n}class wl{constructor(t){this._dispatchers=t}add(t){for(const e of this._dispatchers)t(e);return this}}class Al extends wl{elementToElement(t){return this.add(function(t){const e=vl(t.model),n=yl(t.view,"container");e.attributes.length&&(e.children=!0);return o=>{o.on(`insert:${e.name}`,function(t,e=Bl){return(n,o,i)=>{if(!e(o.item,i.consumable,{preflight:!0}))return;const r=t(o.item,i,o);if(!r)return;e(o.item,i.consumable);const s=i.mapper.toViewPosition(o.range.start);i.mapper.bindElements(o.item,r),i.writer.insert(s,r),i.convertAttributes(o.item),Tl(r,o.item.getChildren(),i,{reconversion:o.reconversion})}}(n,Ml(e)),{priority:t.converterPriority||"normal"}),(e.children||e.attributes.length)&&o.on("reduceChanges",Il(e),{priority:"low"})}}(t))}elementToStructure(t){return this.add(function(t){const e=vl(t.model),n=yl(t.view,"container");return e.children=!0,o=>{if(o._conversionApi.schema.checkChild(e.name,"$text"))throw new _("conversion-element-to-structure-disallowed-text",o,{elementName:e.name});var i,r;o.on(`insert:${e.name}`,(i=n,r=Ml(e),(t,e,n)=>{if(!r(e.item,n.consumable,{preflight:!0}))return;const o=new Map;n.writer._registerSlotFactory(function(t,e,n){return(o,i)=>{const r=o.createContainerElement("$slot");let s=null;if("children"===i)s=Array.from(t.getChildren());else{if("function"!=typeof i)throw new _("conversion-slot-mode-unknown",n.dispatcher,{modeOrFilter:i});s=Array.from(t.getChildren()).filter((t=>i(t)))}return e.set(r,s),r}}(e.item,o,n));const s=i(e.item,n,e);if(n.writer._clearSlotFactory(),!s)return;!function(t,e,n){const o=Array.from(e.values()).flat(),i=new Set(o);if(i.size!=o.length)throw new _("conversion-slot-filter-overlap",n.dispatcher,{element:t});if(i.size!=t.childCount)throw new _("conversion-slot-filter-incomplete",n.dispatcher,{element:t})}(e.item,o,n),r(e.item,n.consumable);const a=n.mapper.toViewPosition(e.range.start);n.mapper.bindElements(e.item,s),n.writer.insert(a,s),n.convertAttributes(e.item),function(t,e,n,o){n.mapper.on("modelToViewPosition",s,{priority:"highest"});let i=null,r=null;for([i,r]of e)Tl(t,r,n,o),n.writer.move(n.writer.createRangeIn(i),n.writer.createPositionBefore(i)),n.writer.remove(i);function s(t,e){const n=e.modelPosition.nodeAfter,o=r.indexOf(n);o<0||(e.viewPosition=e.mapper.findPositionIn(i,o))}n.mapper.off("modelToViewPosition",s)}(s,o,n,{reconversion:e.reconversion})}),{priority:t.converterPriority||"normal"}),o.on("reduceChanges",Il(e),{priority:"low"})}}(t))}attributeToElement(t){return this.add(function(t){t=Dc(t);let e=t.model;"string"==typeof e&&(e={key:e});let n=`attribute:${e.key}`;e.name&&(n+=":"+e.name);if(e.values)for(const n of e.values)t.view[n]=yl(t.view[n],"attribute");else t.view=yl(t.view,"attribute");const o=xl(t);return e=>{e.on(n,function(t){return(e,n,o)=>{if(!o.consumable.test(n.item,e.name))return;const i=t(n.attributeOldValue,o,n),r=t(n.attributeNewValue,o,n);if(!i&&!r)return;o.consumable.consume(n.item,e.name);const s=o.writer,a=s.document.selection;if(n.item instanceof rl||n.item instanceof fl)s.wrap(a.getFirstRange(),r);else{let t=o.mapper.toViewRange(n.range);null!==n.attributeOldValue&&i&&(t=s.unwrap(t,i)),null!==n.attributeNewValue&&r&&s.wrap(t,r)}}}(o),{priority:t.converterPriority||"normal"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=Dc(t);let e=t.model;"string"==typeof e&&(e={key:e});let n=`attribute:${e.key}`;e.name&&(n+=":"+e.name);if(e.values)for(const n of e.values)t.view[n]=El(t.view[n]);else t.view=El(t.view);const o=xl(t);return e=>{var i;e.on(n,(i=o,(t,e,n)=>{if(!n.consumable.test(e.item,t.name))return;const o=i(e.attributeOldValue,n,e),r=i(e.attributeNewValue,n,e);if(!o&&!r)return;n.consumable.consume(e.item,t.name);const s=n.mapper.toViewElement(e.item),a=n.writer;if(!s)throw new _("conversion-attribute-to-attribute-on-text",n.dispatcher,e);if(null!==e.attributeOldValue&&o)if("class"==o.key){const t="string"==typeof o.value?o.value.split(/\s+/):o.value;for(const e of t)a.removeClass(e,s)}else if("style"==o.key)if("string"==typeof o.value){const t=new us(a.document.stylesProcessor);t.setTo(o.value);for(const[e]of t.getStylesEntries())a.removeStyle(e,s)}else{const t=Object.keys(o.value);for(const e of t)a.removeStyle(e,s)}else a.removeAttribute(o.key,s);if(null!==e.attributeNewValue&&r)if("class"==r.key){const t="string"==typeof r.value?r.value.split(/\s+/):r.value;for(const e of t)a.addClass(e,s)}else if("style"==r.key)if("string"==typeof r.value){const t=new us(a.document.stylesProcessor);t.setTo(r.value);for(const[e,n]of t.getStylesEntries())a.setStyle(e,n,s)}else{const t=Object.keys(r.value);for(const e of t)a.setStyle(e,r.value[e],s)}else a.setAttribute(r.key,r.value,s)}),{priority:t.converterPriority||"normal"})}}(t))}markerToElement(t){return this.add(function(t){const e=yl(t.view,"ui");return n=>{var o;n.on(`addMarker:${t.model}`,(o=e,(t,e,n)=>{e.isOpening=!0;const i=o(e,n);e.isOpening=!1;const r=o(e,n);if(!i||!r)return;const s=e.markerRange;if(s.isCollapsed&&!n.consumable.consume(s,t.name))return;for(const e of s)if(!n.consumable.consume(e.item,t.name))return;const a=n.mapper,c=n.writer;c.insert(a.toViewPosition(s.start),i),n.mapper.bindElementToMarker(i,e.markerName),s.isCollapsed||(c.insert(a.toViewPosition(s.end),r),n.mapper.bindElementToMarker(r,e.markerName)),t.stop()}),{priority:t.converterPriority||"normal"}),n.on(`removeMarker:${t.model}`,((t,e,n)=>{const o=n.mapper.markerNameToElements(e.markerName);if(o){for(const t of o)n.mapper.unbindElementFromMarkerName(t,e.markerName),n.writer.clear(n.writer.createRangeOn(t),t);n.writer.clearClonedElementsGroup(e.markerName),t.stop()}}),{priority:t.converterPriority||"normal"})}}(t))}markerToHighlight(t){return this.add(function(t){return e=>{var n;e.on(`addMarker:${t.model}`,(n=t.view,(t,e,o)=>{if(!e.item)return;if(!(e.item instanceof rl||e.item instanceof fl||e.item.is("$textProxy")))return;const i=Dl(n,e,o);if(!i)return;if(!o.consumable.consume(e.item,t.name))return;const r=o.writer,s=_l(r,i),a=r.document.selection;if(e.item instanceof rl||e.item instanceof fl)r.wrap(a.getFirstRange(),s);else{const t=o.mapper.toViewRange(e.range),n=r.wrap(t,s);for(const t of n.getItems())if(t.is("attributeElement")&&t.isSimilar(s)){o.mapper.bindElementToMarker(t,e.markerName);break}}}),{priority:t.converterPriority||"normal"}),e.on(`addMarker:${t.model}`,function(t){return(e,n,o)=>{if(!n.item)return;if(!(n.item instanceof Pc))return;const i=Dl(t,n,o);if(!i)return;if(!o.consumable.test(n.item,e.name))return;const r=o.mapper.toViewElement(n.item);if(r&&r.getCustomProperty("addHighlight")){o.consumable.consume(n.item,e.name);for(const t of Uc._createIn(n.item))o.consumable.consume(t.item,e.name);r.getCustomProperty("addHighlight")(r,i,o.writer),o.mapper.bindElementToMarker(r,n.markerName)}}}(t.view),{priority:t.converterPriority||"normal"}),e.on(`removeMarker:${t.model}`,function(t){return(e,n,o)=>{if(n.markerRange.isCollapsed)return;const i=Dl(t,n,o);if(!i)return;const r=_l(o.writer,i),s=o.mapper.markerNameToElements(n.markerName);if(s){for(const t of s)if(o.mapper.unbindElementFromMarkerName(t,n.markerName),t.is("attributeElement"))o.writer.unwrap(o.writer.createRangeOn(t),r);else{t.getCustomProperty("removeHighlight")(t,i.id,o.writer)}o.writer.clearClonedElementsGroup(n.markerName),e.stop()}}}(t.view),{priority:t.converterPriority||"normal"})}}(t))}markerToData(t){return this.add(function(t){t=Dc(t);const e=t.model;let n=t.view;n||(n=n=>({group:e,name:n.substr(t.model.length+1)}));return o=>{var i;o.on(`addMarker:${e}`,(i=n,(t,e,n)=>{const o=i(e.markerName,n);if(!o)return;const r=e.markerRange;n.consumable.consume(r,t.name)&&(Cl(r,!1,n,e,o),Cl(r,!0,n,e,o),t.stop())}),{priority:t.converterPriority||"normal"}),o.on(`removeMarker:${e}`,function(t){return(e,n,o)=>{const i=t(n.markerName,o);if(!i)return;const r=o.mapper.markerNameToElements(n.markerName);if(r){for(const t of r)o.mapper.unbindElementFromMarkerName(t,n.markerName),t.is("containerElement")?(s(`data-${i.group}-start-before`,t),s(`data-${i.group}-start-after`,t),s(`data-${i.group}-end-before`,t),s(`data-${i.group}-end-after`,t)):o.writer.clear(o.writer.createRangeOn(t),t);o.writer.clearClonedElementsGroup(n.markerName),e.stop()}function s(t,e){if(e.hasAttribute(t)){const n=new Set(e.getAttribute(t).split(","));n.delete(i.name),0==n.size?o.writer.removeAttribute(t,e):o.writer.setAttribute(t,Array.from(n).join(","),e)}}}}(n),{priority:t.converterPriority||"normal"})}}(t))}}function _l(t,e){const n=t.createAttributeElement("span",e.attributes);return e.classes&&n._addClass(e.classes),"number"==typeof e.priority&&(n._priority=e.priority),n._id=e.id,n}function Cl(t,e,n,o,i){const r=e?t.start:t.end,s=r.nodeAfter&&r.nodeAfter.is("element")?r.nodeAfter:null,a=r.nodeBefore&&r.nodeBefore.is("element")?r.nodeBefore:null;if(s||a){let t,r;e&&s||!e&&!a?(t=s,r=!0):(t=a,r=!1);const c=n.mapper.toViewElement(t);if(c)return void function(t,e,n,o,i,r){const s=`data-${r.group}-${e?"start":"end"}-${n?"before":"after"}`,a=t.hasAttribute(s)?t.getAttribute(s).split(","):[];a.unshift(r.name),o.writer.setAttribute(s,a.join(","),t),o.mapper.bindElementToMarker(t,i.markerName)}(c,e,r,n,o,i)}!function(t,e,n,o,i){const r=`${i.group}-${e?"start":"end"}`,s=i.name?{name:i.name}:null,a=n.writer.createUIElement(r,s);n.writer.insert(t,a),n.mapper.bindElementToMarker(a,o.markerName)}(n.mapper.toViewPosition(r),e,n,o,i)}function vl(t){return"string"==typeof t&&(t={name:t}),{name:t.name,attributes:t.attributes?yi(t.attributes):[],children:!!t.children}}function yl(t,e){return"function"==typeof t?t:(n,o)=>function(t,e,n){"string"==typeof t&&(t={name:t});let o;const i=e.writer,r=Object.assign({},t.attributes);if("container"==n)o=i.createContainerElement(t.name,r);else if("attribute"==n){const e={priority:t.priority||Ls.DEFAULT_PRIORITY};o=i.createAttributeElement(t.name,r,e)}else o=i.createUIElement(t.name,r);if(t.styles){const e=Object.keys(t.styles);for(const n of e)i.setStyle(n,t.styles[n],o)}if(t.classes){const e=t.classes;if("string"==typeof e)i.addClass(e,o);else for(const t of e)i.addClass(t,o)}return o}(t,o,e)}function xl(t){return t.model.values?(e,n,o)=>{const i=t.view[e];return i?i(e,n,o):null}:t.view}function El(t){return"string"==typeof t?e=>({key:t,value:e}):"object"==typeof t?t.value?()=>t:e=>({key:t.key,value:e}):t}function Dl(t,e,n){const o="function"==typeof t?t(e,n):t;return o?(o.priority||(o.priority=10),o.id||(o.id=e.markerName),o):null}function Il(t){const e=function(t){return(e,n)=>{if(!e.is("element",t.name))return!1;if("attribute"==n.type){if(t.attributes.includes(n.attributeKey))return!0}else if(t.children)return!0;return!1}}(t);return(t,n)=>{const o=[];n.reconvertedElements||(n.reconvertedElements=new Set);for(const t of n.changes){const i="attribute"==t.type?t.range.start.nodeAfter:t.position.parent;if(i&&e(i,t)){if(!n.reconvertedElements.has(i)){n.reconvertedElements.add(i);const t=zc._createBefore(i);let e=o.length;for(let n=o.length-1;n>=0;n--){const i=o[n],r=("attribute"==i.type?i.range.start:i.position).compareWith(t);if("before"==r||"remove"==i.type&&"same"==r)break;e=n}o.splice(e,0,{type:"remove",name:i.name,position:t,length:1},{type:"reinsert",name:i.name,position:t,length:1})}}else o.push(t)}n.changes=o}}function Ml(t){return(e,n,o={})=>{const i=["insert"];for(const n of t.attributes)e.hasAttribute(n)&&i.push(`attribute:${n}`);return!!i.every((t=>n.test(e,t)))&&(o.preflight||i.forEach((t=>n.consume(e,t))),!0)}}function Tl(t,e,n,o){for(const i of e)Sl(t.root,i,n,o)||n.convertItem(i)}function Sl(t,e,n,o){const{writer:i,mapper:r}=n;if(!o.reconversion)return!1;const s=r.toViewElement(e);return!(!s||s.root==t)&&(!!n.canReuseView(s)&&(i.move(i.createRangeOn(s),r.toViewPosition(zc._createBefore(e))),!0))}function Bl(t,e,{preflight:n}={}){return n?e.test(t,"insert"):e.consume(t,"insert")}function Nl(t){const{schema:e,document:n}=t.model;for(const o of n.getRoots())if(o.isEmpty&&!e.checkChild(o,"$text")&&e.checkChild(o,"paragraph"))return t.insertElement("paragraph",o),!0;return!1}function Pl(t,e,n){const o=n.createContext(t);return!!n.checkChild(o,"paragraph")&&!!n.checkChild(o.push("paragraph"),e)}function Ol(t,e){const n=e.createElement("paragraph");return e.insert(n,t),e.createPositionAt(n,0)}var Ll=Object.defineProperty,zl=Object.defineProperties,Rl=Object.getOwnPropertyDescriptors,jl=Object.getOwnPropertySymbols,Fl=Object.prototype.hasOwnProperty,Vl=Object.prototype.propertyIsEnumerable,Hl=(t,e,n)=>e in t?Ll(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class Ul extends wl{elementToElement(t){return this.add(ql(t))}elementToAttribute(t){return this.add(function(t){t=Dc(t),Kl(t);const e=$l(t,!1),n=Gl(t.view),o=n?`element:${n}`:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"low"})}}(t))}attributeToAttribute(t){return this.add(function(t){t=Dc(t);let e=null;("string"==typeof t.view||t.view.key)&&(e=function(t){"string"==typeof t.view&&(t.view={key:t.view});const e=t.view.key,n=void 0===t.view.value?/[\s\S]*/:t.view.value;let o;if("class"==e||"style"==e){const t="class"==e?"classes":"styles";o={[t]:n}}else o={attributes:{[e]:n}};t.view.name&&(o.name=t.view.name);return t.view=o,e}(t));Kl(t,e);const n=$l(t,!0);return e=>{e.on("element",n,{priority:t.converterPriority||"low"})}}(t))}elementToMarker(t){return this.add(function(t){const e=function(t){return(e,n)=>{const o="string"==typeof t?t:t(e,n);return n.writer.createElement("$marker",{"data-name":o})}}(t.model);return ql((n=((t,e)=>{for(var n in e||(e={}))Fl.call(e,n)&&Hl(t,n,e[n]);if(jl)for(var n of jl(e))Vl.call(e,n)&&Hl(t,n,e[n]);return t})({},t),o={model:e},zl(n,Rl(o))));var n,o}(t))}dataToMarker(t){return this.add(function(t){t=Dc(t),t.model||(t.model=e=>e?t.view+":"+e:t.view);const e={view:t.view,model:t.model},n=Wl(Yl(e,"start")),o=Wl(Yl(e,"end"));return i=>{i.on(`element:${t.view}-start`,n,{priority:t.converterPriority||"normal"}),i.on(`element:${t.view}-end`,o,{priority:t.converterPriority||"normal"});const r=b.low,s=b.highest,a=b.get(t.converterPriority)/s;i.on("element",function(t){return(e,n,o)=>{const i=`data-${t.view}`;function r(e,i){for(const r of i){const i=t.model(r,o),s=o.writer.createElement("$marker",{"data-name":i});o.writer.insert(s,e),n.modelCursor.isEqual(e)?n.modelCursor=n.modelCursor.getShiftedBy(1):n.modelCursor=n.modelCursor._getTransformedByInsertion(e,1),n.modelRange=n.modelRange._getTransformedByInsertion(e,1)[0]}}(o.consumable.test(n.viewItem,{attributes:i+"-end-after"})||o.consumable.test(n.viewItem,{attributes:i+"-start-after"})||o.consumable.test(n.viewItem,{attributes:i+"-end-before"})||o.consumable.test(n.viewItem,{attributes:i+"-start-before"}))&&(n.modelRange||Object.assign(n,o.convertChildren(n.viewItem,n.modelCursor)),o.consumable.consume(n.viewItem,{attributes:i+"-end-after"})&&r(n.modelRange.end,n.viewItem.getAttribute(i+"-end-after").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-start-after"})&&r(n.modelRange.end,n.viewItem.getAttribute(i+"-start-after").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-end-before"})&&r(n.modelRange.start,n.viewItem.getAttribute(i+"-end-before").split(",")),o.consumable.consume(n.viewItem,{attributes:i+"-start-before"})&&r(n.modelRange.start,n.viewItem.getAttribute(i+"-start-before").split(",")))}}(e),{priority:r+a})}}(t))}}function ql(t){const e=Wl(t=Dc(t)),n=Gl(t.view),o=n?`element:${n}`:"element";return n=>{n.on(o,e,{priority:t.converterPriority||"normal"})}}function Gl(t){return"string"==typeof t?t:"object"==typeof t&&"string"==typeof t.name?t.name:null}function Wl(t){const e=new Or(t.view);return(n,o,i)=>{const r=e.match(o.viewItem);if(!r)return;const s=r.match;if(s.name=!0,!i.consumable.test(o.viewItem,s))return;const a=function(t,e,n){return t instanceof Function?t(e,n):n.writer.createElement(t)}(t.model,o.viewItem,i);a&&i.safeInsert(a,o.modelCursor)&&(i.consumable.consume(o.viewItem,s),i.convertChildren(o.viewItem,a),i.updateConversionResult(a,o))}}function Kl(t,e=null){const n=null===e||(t=>t.getAttribute(e)),o="object"!=typeof t.model?t.model:t.model.key,i="object"!=typeof t.model||void 0===t.model.value?n:t.model.value;t.model={key:o,value:i}}function $l(t,e){const n=new Or(t.view);return(o,i,r)=>{if(!i.modelRange&&e)return;const s=n.match(i.viewItem);if(!s)return;if(!function(t,e){const n="function"==typeof t?t(e):t;if("object"==typeof n&&!Gl(n))return!1;return!n.classes&&!n.attributes&&!n.styles}(t.view,i.viewItem)?delete s.match.name:s.match.name=!0,!r.consumable.test(i.viewItem,s.match))return;const a=t.model.key,c="function"==typeof t.model.value?t.model.value(i.viewItem,r):t.model.value;if(null===c)return;i.modelRange||Object.assign(i,r.convertChildren(i.viewItem,i.modelCursor));const l=function(t,e,n,o){let i=!1;for(const r of Array.from(t.getItems({shallow:n})))o.schema.checkAttribute(r,e.key)&&(i=!0,r.hasAttribute(e.key)||o.writer.setAttribute(e.key,e.value,r));return i}(i.modelRange,{key:a,value:c},e,r);l&&(r.consumable.test(i.viewItem,{name:!0})&&(s.match.name=!0),r.consumable.consume(i.viewItem,s.match))}}function Yl(t,e){return{view:`${t.view}-${e}`,model:(e,n)=>{const o=e.getAttribute("name"),i=t.model(o,n);return n.writer.createElement("$marker",{"data-name":i})}}}function Ql(t){t.document.registerPostFixer((e=>function(t,e){const n=e.document.selection,o=e.schema,i=[];let r=!1;for(const t of n.getRanges()){const e=Zl(t,o);e&&!e.isEqual(t)?(i.push(e),r=!0):i.push(t)}r&&t.setSelection(function(t){const e=[...t],n=new Set;let o=1;for(;o!n.has(e)))}(i),{backward:n.isBackward});return!1}(e,t)))}function Zl(t,e){return t.isCollapsed?function(t,e){const n=t.start,o=e.getNearestSelectionRange(n);if(!o){const t=n.getAncestors().reverse().find((t=>e.isObject(t)));return t?Uc._createOn(t):null}if(!o.isCollapsed)return o;const i=o.start;if(n.isEqual(i))return null;return new Uc(i)}(t,e):function(t,e){const{start:n,end:o}=t,i=e.checkChild(n,"$text"),r=e.checkChild(o,"$text"),s=e.getLimitElement(n),a=e.getLimitElement(o);if(s===a){if(i&&r)return null;if(function(t,e,n){const o=t.nodeAfter&&!n.isLimit(t.nodeAfter)||n.checkChild(t,"$text"),i=e.nodeBefore&&!n.isLimit(e.nodeBefore)||n.checkChild(e,"$text");return o||i}(n,o,e)){const t=n.nodeAfter&&e.isSelectable(n.nodeAfter)?null:e.getNearestSelectionRange(n,"forward"),i=o.nodeBefore&&e.isSelectable(o.nodeBefore)?null:e.getNearestSelectionRange(o,"backward"),r=t?t.start:n,s=i?i.end:o;return new Uc(r,s)}}const c=s&&!s.is("rootElement"),l=a&&!a.is("rootElement");if(c||l){const t=n.nodeAfter&&o.nodeBefore&&n.nodeAfter.parent===o.nodeBefore.parent,i=c&&(!t||!Xl(n.nodeAfter,e)),r=l&&(!t||!Xl(o.nodeBefore,e));let d=n,u=o;return i&&(d=zc._createBefore(Jl(s,e))),r&&(u=zc._createAfter(Jl(a,e))),new Uc(d,u)}return null}(t,e)}function Jl(t,e){let n=t,o=n;for(;e.isLimit(o)&&o.parent;)n=o,o=o.parent;return n}function Xl(t,e){return t&&e.isSelectable(t)}class td extends(K()){constructor(t,e){super(),this.model=t,this.view=new Ic(e),this.mapper=new qc,this.downcastDispatcher=new nl({mapper:this.mapper,schema:t.schema});const n=this.model.document,o=n.selection,i=this.model.markers;var r,s,a;this.listenTo(this.model,"_beforeChanges",(()=>{this.view._disableRendering(!0)}),{priority:"highest"}),this.listenTo(this.model,"_afterChanges",(()=>{this.view._disableRendering(!1)}),{priority:"lowest"}),this.listenTo(n,"change",(()=>{this.view.change((t=>{this.downcastDispatcher.convertChanges(n.differ,i,t),this.downcastDispatcher.convertSelection(o,i,t)}))}),{priority:"low"}),this.listenTo(this.view.document,"selectionChange",function(t,e){return(n,o)=>{const i=o.newSelection,r=[];for(const t of i.getRanges())r.push(e.toModelRange(t));const s=t.createSelection(r,{backward:i.isBackward});s.isEqual(t.document.selection)||t.change((t=>{t.setSelection(s)}))}}(this.model,this.mapper)),this.listenTo(this.view.document,"beforeinput",(r=this.mapper,s=this.model.schema,a=this.view,(t,e)=>{if(!a.document.isComposing||c.isAndroid)for(let t=0;t{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewPosition(e.range.start),r=o.createText(e.item.data);o.insert(i,r)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,n)=>{n.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||n.convertChildren(e.item)}),{priority:"lowest"}),this.downcastDispatcher.on("remove",((t,e,n)=>{const o=n.mapper.toViewPosition(e.position),i=e.position.getShiftedBy(e.length),r=n.mapper.toViewPosition(i,{isPhantom:!0}),s=n.writer.createRange(o,r),a=n.writer.remove(s.getTrimmed());for(const t of n.writer.createRangeIn(a).getItems())n.mapper.unbindViewElement(t,{defer:!0})}),{priority:"low"}),this.downcastDispatcher.on("cleanSelection",((t,e,n)=>{const o=n.writer,i=o.document.selection;for(const t of i.getRanges())t.isCollapsed&&t.end.parent.isAttached()&&n.writer.mergeAttributes(t.start);o.setSelection(null)})),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=e.selection;if(o.isCollapsed)return;if(!n.consumable.consume(o,"selection"))return;const i=[];for(const t of o.getRanges())i.push(n.mapper.toViewRange(t));n.writer.setSelection(i,{backward:o.isBackward})}),{priority:"low"}),this.downcastDispatcher.on("selection",((t,e,n)=>{const o=e.selection;if(!o.isCollapsed)return;if(!n.consumable.consume(o,"selection"))return;const i=n.writer,r=o.getFirstPosition(),s=n.mapper.toViewPosition(r),a=i.breakAttributes(s);i.setSelection(a)}),{priority:"low"}),this.view.document.roots.bindTo(this.model.document.roots).using((t=>{if("$graveyard"==t.rootName)return null;const e=new _s(this.view.document,t.name);return e.rootName=t.rootName,this.mapper.bindElements(t,e),e}))}destroy(){this.view.destroy(),this.stopListening()}reconvertMarker(t){const e="string"==typeof t?t:t.name,n=this.model.markers.get(e);if(!n)throw new _("editingcontroller-reconvertmarker-marker-not-exist",this,{markerName:e});this.model.change((()=>{this.model.markers._refresh(n)}))}reconvertItem(t){this.model.change((()=>{this.model.document.differ._refreshItem(t)}))}}class ed{constructor(){this._consumables=new Map}add(t,e){let n;t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):(this._consumables.has(t)?n=this._consumables.get(t):(n=new od(t),this._consumables.set(t,n)),n.add(e))}test(t,e){const n=this._consumables.get(t);return void 0===n?null:t.is("$text")||t.is("documentFragment")?n:n.test(e)}consume(t,e){return!!this.test(t,e)&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!1):this._consumables.get(t).consume(e),!0)}revert(t,e){const n=this._consumables.get(t);void 0!==n&&(t.is("$text")||t.is("documentFragment")?this._consumables.set(t,!0):n.revert(e))}static consumablesFromElement(t){const e={element:t,name:!0,attributes:[],classes:[],styles:[]},n=t.getAttributeKeys();for(const t of n)"style"!=t&&"class"!=t&&e.attributes.push(t);const o=t.getClassNames();for(const t of o)e.classes.push(t);const i=t.getStyleNames();for(const t of i)e.styles.push(t);return e}static createFrom(t,e){if(e||(e=new ed),t.is("$text"))return e.add(t),e;t.is("element")&&e.add(t,ed.consumablesFromElement(t)),t.is("documentFragment")&&e.add(t);for(const n of t.getChildren())e=ed.createFrom(n,e);return e}}const nd=["attributes","classes","styles"];class od{constructor(t){this.element=t,this._canConsumeName=null,this._consumables={attributes:new Map,styles:new Map,classes:new Map}}add(t){t.name&&(this._canConsumeName=!0);for(const e of nd)e in t&&this._add(e,t[e])}test(t){if(t.name&&!this._canConsumeName)return this._canConsumeName;for(const e of nd)if(e in t){const n=this._test(e,t[e]);if(!0!==n)return n}return!0}consume(t){t.name&&(this._canConsumeName=!1);for(const e of nd)e in t&&this._consume(e,t[e])}revert(t){t.name&&(this._canConsumeName=!0);for(const e of nd)e in t&&this._revert(e,t[e])}_add(t,e){const n=yi(e),o=this._consumables[t];for(const e of n){if("attributes"===t&&("class"===e||"style"===e))throw new _("viewconsumable-invalid-attribute",this);if(o.set(e,!0),"styles"===t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))o.set(t,!0)}}_test(t,e){const n=yi(e),o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){const t=o.get(e);if(void 0===t)return null;if(!t)return!1}else{const t="class"==e?"classes":"styles",n=this._test(t,[...this._consumables[t].keys()]);if(!0!==n)return n}return!0}_consume(t,e){const n=yi(e),o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){if(o.set(e,!1),"styles"==t)for(const t of this.element.document.stylesProcessor.getRelatedStyles(e))o.set(t,!1)}else{const t="class"==e?"classes":"styles";this._consume(t,[...this._consumables[t].keys()])}}_revert(t,e){const n=yi(e),o=this._consumables[t];for(const e of n)if("attributes"!==t||"class"!==e&&"style"!==e){!1===o.get(e)&&o.set(e,!0)}else{const t="class"==e?"classes":"styles";this._revert(t,[...this._consumables[t].keys()])}}}class id extends(K()){constructor(){super(),this._sourceDefinitions={},this._attributeProperties={},this.decorate("checkChild"),this.decorate("checkAttribute"),this.on("checkAttribute",((t,e)=>{e[0]=new rd(e[0])}),{priority:"highest"}),this.on("checkChild",((t,e)=>{e[0]=new rd(e[0]),e[1]=this.getDefinition(e[1])}),{priority:"highest"})}register(t,e){if(this._sourceDefinitions[t])throw new _("schema-cannot-register-item-twice",this,{itemName:t});this._sourceDefinitions[t]=[Object.assign({},e)],this._clearCache()}extend(t,e){if(!this._sourceDefinitions[t])throw new _("schema-cannot-extend-missing-item",this,{itemName:t});this._sourceDefinitions[t].push(Object.assign({},e)),this._clearCache()}getDefinitions(){return this._compiledDefinitions||this._compile(),this._compiledDefinitions}getDefinition(t){let e;return e="string"==typeof t?t:"is"in t&&(t.is("$text")||t.is("$textProxy"))?"$text":t.name,this.getDefinitions()[e]}isRegistered(t){return!!this.getDefinition(t)}isBlock(t){const e=this.getDefinition(t);return!(!e||!e.isBlock)}isLimit(t){const e=this.getDefinition(t);return!!e&&!(!e.isLimit&&!e.isObject)}isObject(t){const e=this.getDefinition(t);return!!e&&!!(e.isObject||e.isLimit&&e.isSelectable&&e.isContent)}isInline(t){const e=this.getDefinition(t);return!(!e||!e.isInline)}isSelectable(t){const e=this.getDefinition(t);return!!e&&!(!e.isSelectable&&!e.isObject)}isContent(t){const e=this.getDefinition(t);return!!e&&!(!e.isContent&&!e.isObject)}checkChild(t,e){return!!e&&this._checkContextMatch(e,t)}checkAttribute(t,e){const n=this.getDefinition(t.last);return!!n&&n.allowAttributes.includes(e)}checkMerge(t,e){if(t instanceof zc){const e=t.nodeBefore,n=t.nodeAfter;if(!(e instanceof Pc))throw new _("schema-check-merge-no-element-before",this);if(!(n instanceof Pc))throw new _("schema-check-merge-no-element-after",this);return this.checkMerge(e,n)}for(const n of e.getChildren())if(!this.checkChild(t,n))return!1;return!0}addChildCheck(t){this.on("checkChild",((e,[n,o])=>{if(!o)return;const i=t(n,o);"boolean"==typeof i&&(e.stop(),e.return=i)}),{priority:"high"})}addAttributeCheck(t){this.on("checkAttribute",((e,[n,o])=>{const i=t(n,o);"boolean"==typeof i&&(e.stop(),e.return=i)}),{priority:"high"})}setAttributeProperties(t,e){this._attributeProperties[t]=Object.assign(this.getAttributeProperties(t),e)}getAttributeProperties(t){return this._attributeProperties[t]||{}}getLimitElement(t){let e;if(t instanceof zc)e=t.parent;else{e=(t instanceof Uc?[t]:Array.from(t.getRanges())).reduce(((t,e)=>{const n=e.getCommonAncestor();return t?t.getCommonAncestor(n,{includeSelf:!0}):n}),null)}for(;!this.isLimit(e)&&e.parent;)e=e.parent;return e}checkAttributeInSelection(t,e){if(t.isCollapsed){const n=[...t.getFirstPosition().getAncestors(),new Bc("",t.getAttributes())];return this.checkAttribute(n,e)}{const n=t.getRanges();for(const t of n)for(const n of t)if(this.checkAttribute(n.item,e))return!0}return!1}*getValidRanges(t,e){t=function*(t){for(const e of t)yield*e.getMinimalFlatRanges()}(t);for(const n of t)yield*this._getValidRangesForRange(n,e)}getNearestSelectionRange(t,e="both"){if("$graveyard"==t.root.rootName)return null;if(this.checkChild(t,"$text"))return new Uc(t);let n,o;const i=t.getAncestors().reverse().find((t=>this.isLimit(t)))||t.root;"both"!=e&&"backward"!=e||(n=new Oc({boundaries:Uc._createIn(i),startPosition:t,direction:"backward"})),"both"!=e&&"forward"!=e||(o=new Oc({boundaries:Uc._createIn(i),startPosition:t}));for(const t of function*(t,e){let n=!1;for(;!n;){if(n=!0,t){const e=t.next();e.done||(n=!1,yield{walker:t,value:e.value})}if(e){const t=e.next();t.done||(n=!1,yield{walker:e,value:t.value})}}}(n,o)){const e=t.walker==n?"elementEnd":"elementStart",o=t.value;if(o.type==e&&this.isObject(o.item))return Uc._createOn(o.item);if(this.checkChild(o.nextPosition,"$text"))return new Uc(o.nextPosition)}return null}findAllowedParent(t,e){let n=t.parent;for(;n;){if(this.checkChild(n,e))return n;if(this.isLimit(n))return null;n=n.parent}return null}setAllowedAttributes(t,e,n){const o=n.model;for(const[i,r]of Object.entries(e))o.schema.checkAttribute(t,i)&&n.setAttribute(i,r,t)}removeDisallowedAttributes(t,e){for(const n of t)if(n.is("$text"))bd(this,n,e);else{const t=Uc._createIn(n).getPositions();for(const n of t){bd(this,n.nodeBefore||n.parent,e)}}}getAttributesWithProperty(t,e,n){const o={};for(const[i,r]of t.getAttributes()){const t=this.getAttributeProperties(i);void 0!==t[e]&&(void 0!==n&&n!==t[e]||(o[i]=r))}return o}createContext(t){return new rd(t)}_clearCache(){this._compiledDefinitions=null}_compile(){const t={},e=this._sourceDefinitions,n=Object.keys(e);for(const o of n)t[o]=sd(e[o],o);for(const e of n)ad(t,e);for(const e of n)cd(t,e);for(const e of n)ld(t,e);for(const e of n)dd(t,e),ud(t,e);for(const e of n)hd(t,e),gd(t,e),md(t,e);this._compiledDefinitions=t}_checkContextMatch(t,e,n=e.length-1){const o=e.getItem(n);if(t.allowIn.includes(o.name)){if(0==n)return!0;{const t=this.getDefinition(o);return this._checkContextMatch(t,e,n-1)}}return!1}*_getValidRangesForRange(t,e){let n=t.start,o=t.start;for(const i of t.getItems({shallow:!0}))i.is("element")&&(yield*this._getValidRangesForRange(Uc._createIn(i),e)),this.checkAttribute(i,e)||(n.isEqual(o)||(yield new Uc(n,o)),n=zc._createAfter(i)),o=zc._createAfter(i);n.isEqual(o)||(yield new Uc(n,o))}findOptimalInsertionRange(t,e){const n=t.getSelectedElement();if(n&&this.isObject(n)&&!this.isInline(n))return"before"==e||"after"==e?new Uc(zc._createAt(n,e)):Uc._createOn(n);const o=Qi(t.getSelectedBlocks());if(!o)return new Uc(t.focus);if(o.isEmpty)return new Uc(zc._createAt(o,0));const i=zc._createAfter(o);return t.focus.isTouching(i)?new Uc(i):new Uc(zc._createBefore(o))}}class rd{constructor(t){if(t instanceof rd)return t;let e;e="string"==typeof t?[t]:Array.isArray(t)?t:t.getAncestors({includeSelf:!0}),this._items=e.map(kd)}get length(){return this._items.length}get last(){return this._items[this._items.length-1]}[Symbol.iterator](){return this._items[Symbol.iterator]()}push(t){const e=new rd([t]);return e._items=[...this._items,...e._items],e}getItem(t){return this._items[t]}*getNames(){yield*this._items.map((t=>t.name))}endsWith(t){return Array.from(this.getNames()).join(" ").endsWith(t)}startsWith(t){return Array.from(this.getNames()).join(" ").startsWith(t)}}function sd(t,e){const n={name:e,allowIn:[],allowContentOf:[],allowWhere:[],allowAttributes:[],allowAttributesOf:[],allowChildren:[],inheritTypesFrom:[]};return function(t,e){for(const n of t){const t=Object.keys(n).filter((t=>t.startsWith("is")));for(const o of t)e[o]=!!n[o]}}(t,n),pd(t,n,"allowIn"),pd(t,n,"allowContentOf"),pd(t,n,"allowWhere"),pd(t,n,"allowAttributes"),pd(t,n,"allowAttributesOf"),pd(t,n,"allowChildren"),pd(t,n,"inheritTypesFrom"),function(t,e){for(const n of t){const t=n.inheritAllFrom;t&&(e.allowContentOf.push(t),e.allowWhere.push(t),e.allowAttributesOf.push(t),e.inheritTypesFrom.push(t))}}(t,n),n}function ad(t,e){const n=t[e];for(const o of n.allowChildren){const n=t[o];n&&n.allowIn.push(e)}n.allowChildren.length=0}function cd(t,e){for(const n of t[e].allowContentOf)if(t[n]){fd(t,n).forEach((t=>{t.allowIn.push(e)}))}delete t[e].allowContentOf}function ld(t,e){for(const n of t[e].allowWhere){const o=t[n];if(o){const n=o.allowIn;t[e].allowIn.push(...n)}}delete t[e].allowWhere}function dd(t,e){for(const n of t[e].allowAttributesOf){const o=t[n];if(o){const n=o.allowAttributes;t[e].allowAttributes.push(...n)}}delete t[e].allowAttributesOf}function ud(t,e){const n=t[e];for(const e of n.inheritTypesFrom){const o=t[e];if(o){const t=Object.keys(o).filter((t=>t.startsWith("is")));for(const e of t)e in n||(n[e]=o[e])}}delete n.inheritTypesFrom}function hd(t,e){const n=t[e],o=n.allowIn.filter((e=>t[e]));n.allowIn=Array.from(new Set(o))}function gd(t,e){const n=t[e];for(const o of n.allowIn){t[o].allowChildren.push(e)}}function md(t,e){const n=t[e];n.allowAttributes=Array.from(new Set(n.allowAttributes))}function pd(t,e,n){for(const o of t){const t=o[n];"string"==typeof t?e[n].push(t):Array.isArray(t)&&e[n].push(...t)}}function fd(t,e){const n=t[e];return(o=t,Object.keys(o).map((t=>o[t]))).filter((t=>t.allowIn.includes(n.name)));var o}function kd(t){return"string"==typeof t||t.is("documentFragment")?{name:"string"==typeof t?t:"$documentFragment",*getAttributeKeys(){},getAttribute(){}}:{name:t.is("element")?t.name:"$text",*getAttributeKeys(){yield*t.getAttributeKeys()},getAttribute:e=>t.getAttribute(e)}}function bd(t,e,n){for(const o of e.getAttributeKeys())t.checkAttribute(e,o)||n.removeAttribute(o,e)}var wd=Object.defineProperty,Ad=Object.defineProperties,_d=Object.getOwnPropertyDescriptors,Cd=Object.getOwnPropertySymbols,vd=Object.prototype.hasOwnProperty,yd=Object.prototype.propertyIsEnumerable,xd=(t,e,n)=>e in t?wd(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class Ed extends(B()){constructor(t){var e;super(),this._splitParts=new Map,this._cursorParents=new Map,this._modelCursor=null,this._emptyElementsToKeep=new Set,this.conversionApi=(e=((t,e)=>{for(var n in e||(e={}))vd.call(e,n)&&xd(t,n,e[n]);if(Cd)for(var n of Cd(e))yd.call(e,n)&&xd(t,n,e[n]);return t})({},t),Ad(e,_d({consumable:null,writer:null,store:null,convertItem:(t,e)=>this._convertItem(t,e),convertChildren:(t,e)=>this._convertChildren(t,e),safeInsert:(t,e)=>this._safeInsert(t,e),updateConversionResult:(t,e)=>this._updateConversionResult(t,e),splitToAllowedParent:(t,e)=>this._splitToAllowedParent(t,e),getSplitParts:t=>this._getSplitParts(t),keepEmptyElement:t=>this._keepEmptyElement(t)})))}convert(t,e,n=["$root"]){this.fire("viewCleanup",t),this._modelCursor=function(t,e){let n;for(const o of new rd(t)){const t={};for(const e of o.getAttributeKeys())t[e]=o.getAttribute(e);const i=e.createElement(o.name,t);n&&e.insert(i,n),n=zc._createAt(i,0)}return n}(n,e),this.conversionApi.writer=e,this.conversionApi.consumable=ed.createFrom(t),this.conversionApi.store={};const{modelRange:o}=this._convertItem(t,this._modelCursor),i=e.createDocumentFragment();if(o){this._removeEmptyElements();for(const t of Array.from(this._modelCursor.parent.getChildren()))e.append(t,i);i.markers=function(t,e){const n=new Set,o=new Map,i=Uc._createIn(t).getItems();for(const t of i)t.is("element","$marker")&&n.add(t);for(const t of n){const n=t.getAttribute("data-name"),i=e.createPositionBefore(t);o.has(n)?o.get(n).end=i.clone():o.set(n,new Uc(i.clone())),e.remove(t)}return o}(i,e)}return this._modelCursor=null,this._splitParts.clear(),this._cursorParents.clear(),this._emptyElementsToKeep.clear(),this.conversionApi.writer=null,this.conversionApi.store=null,i}_convertItem(t,e){const n={viewItem:t,modelCursor:e,modelRange:null};if(t.is("element")?this.fire(`element:${t.name}`,n,this.conversionApi):t.is("$text")?this.fire("text",n,this.conversionApi):this.fire("documentFragment",n,this.conversionApi),n.modelRange&&!(n.modelRange instanceof Uc))throw new _("view-conversion-dispatcher-incorrect-result",this);return{modelRange:n.modelRange,modelCursor:n.modelCursor}}_convertChildren(t,e){let n=e.is("position")?e:zc._createAt(e,0);const o=new Uc(n);for(const e of Array.from(t.getChildren())){const t=this._convertItem(e,n);t.modelRange instanceof Uc&&(o.end=t.modelRange.end,n=t.modelCursor)}return{modelRange:o,modelCursor:n}}_safeInsert(t,e){const n=this._splitToAllowedParent(t,e);return!!n&&(this.conversionApi.writer.insert(t,n.position),!0)}_updateConversionResult(t,e){const n=this._getSplitParts(t),o=this.conversionApi.writer;e.modelRange||(e.modelRange=o.createRange(o.createPositionBefore(t),o.createPositionAfter(n[n.length-1])));const i=this._cursorParents.get(t);e.modelCursor=i?o.createPositionAt(i,0):e.modelRange.end}_splitToAllowedParent(t,e){const{schema:n,writer:o}=this.conversionApi;let i=n.findAllowedParent(e,t);if(i){if(i===e.parent)return{position:e};this._modelCursor.parent.getAncestors().includes(i)&&(i=null)}if(!i)return Pl(e,t,n)?{position:Ol(e,o)}:null;const r=this.conversionApi.writer.split(e,i),s=[];for(const t of r.range.getWalker())if("elementEnd"==t.type)s.push(t.item);else{const e=s.pop(),n=t.item;this._registerSplitPair(e,n)}const a=r.range.end.parent;return this._cursorParents.set(t,a),{position:r.position,cursorParent:a}}_registerSplitPair(t,e){this._splitParts.has(t)||this._splitParts.set(t,[t]);const n=this._splitParts.get(t);this._splitParts.set(e,n),n.push(e)}_getSplitParts(t){let e;return e=this._splitParts.has(t)?this._splitParts.get(t):[t],e}_keepEmptyElement(t){this._emptyElementsToKeep.add(t)}_removeEmptyElements(){let t=!1;for(const e of this._splitParts.keys())e.isEmpty&&!this._emptyElementsToKeep.has(e)&&(this.conversionApi.writer.remove(e),this._splitParts.delete(e),t=!0);t&&this._removeEmptyElements()}}class Dd{getHtml(t){const e=Lo.document.implementation.createHTMLDocument("").createElement("div");return e.appendChild(t),e.innerHTML}}class Id{constructor(t){this.skipComments=!0,this.domParser=new DOMParser,this.domConverter=new Ea(t,{renderingMode:"data"}),this.htmlWriter=new Dd}toData(t){const e=this.domConverter.viewToDom(t);return this.htmlWriter.getHtml(e)}toView(t){const e=this._toDom(t);return this.domConverter.domToView(e,{skipComments:this.skipComments})}registerRawContentMatcher(t){this.domConverter.registerRawContentMatcher(t)}useFillerType(t){this.domConverter.blockFillerMode="marked"==t?"markedNbsp":"nbsp"}_toDom(t){t.match(/<(?:html|body|head|meta)(?:\s[^>]*)?>/i)||(t=`${t}`);const e=this.domParser.parseFromString(t,"text/html"),n=e.createDocumentFragment(),o=e.body.childNodes;for(;o.length>0;)n.appendChild(o[0]);return n}}class Md extends(B()){constructor(t,e){super(),this.model=t,this.mapper=new qc,this.downcastDispatcher=new nl({mapper:this.mapper,schema:t.schema}),this.downcastDispatcher.on("insert:$text",((t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=n.writer,i=n.mapper.toViewPosition(e.range.start),r=o.createText(e.item.data);o.insert(i,r)}),{priority:"lowest"}),this.downcastDispatcher.on("insert",((t,e,n)=>{n.convertAttributes(e.item),e.reconversion||!e.item.is("element")||e.item.isEmpty||n.convertChildren(e.item)}),{priority:"lowest"}),this.upcastDispatcher=new Ed({schema:t.schema}),this.viewDocument=new Os(e),this.stylesProcessor=e,this.htmlProcessor=new Id(this.viewDocument),this.processor=this.htmlProcessor,this._viewWriter=new Ks(this.viewDocument),this.upcastDispatcher.on("text",((t,e,{schema:n,consumable:o,writer:i})=>{let r=e.modelCursor;if(!o.test(e.viewItem))return;if(!n.checkChild(r,"$text")){if(!Pl(r,"$text",n))return;if(0==e.viewItem.data.trim().length)return;const t=r.nodeBefore;r=Ol(r,i),t&&t.is("element","$marker")&&(i.move(i.createRangeOn(t),r),r=i.createPositionAfter(t))}o.consume(e.viewItem);const s=i.createText(e.viewItem.data);i.insert(s,r),e.modelRange=i.createRange(r,r.getShiftedBy(s.offsetSize)),e.modelCursor=e.modelRange.end}),{priority:"lowest"}),this.upcastDispatcher.on("element",((t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=o}}),{priority:"lowest"}),this.upcastDispatcher.on("documentFragment",((t,e,n)=>{if(!e.modelRange&&n.consumable.consume(e.viewItem,{name:!0})){const{modelRange:t,modelCursor:o}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=t,e.modelCursor=o}}),{priority:"lowest"}),K().prototype.decorate.call(this,"init"),K().prototype.decorate.call(this,"set"),K().prototype.decorate.call(this,"get"),K().prototype.decorate.call(this,"toView"),K().prototype.decorate.call(this,"toModel"),this.on("init",(()=>{this.fire("ready")}),{priority:"lowest"}),this.on("ready",(()=>{this.model.enqueueChange({isUndoable:!1},Nl)}),{priority:"lowest"})}get(t={}){const{rootName:e="main",trim:n="empty"}=t;if(!this._checkIfRootsExists([e]))throw new _("datacontroller-get-non-existent-root",this);const o=this.model.document.getRoot(e);return o.isAttached()||C("datacontroller-get-detached-root",this),"empty"!==n||this.model.hasContent(o,{ignoreWhitespaces:!0})?this.stringify(o,t):""}stringify(t,e={}){const n=this.toView(t,e);return this.processor.toData(n)}toView(t,e={}){const n=this.viewDocument,o=this._viewWriter;this.mapper.clearBindings();const i=Uc._createIn(t),r=new Ws(n);this.mapper.bindElements(t,r);const s=t.is("documentFragment")?t.markers:function(t){const e=[],n=t.root.document;if(!n)return new Map;const o=Uc._createIn(t);for(const t of n.model.markers){const n=t.getRange(),i=n.isCollapsed,r=n.start.isEqual(o.start)||n.end.isEqual(o.end);if(i&&r)e.push([t.name,n]);else{const i=o.getIntersection(n);i&&e.push([t.name,i])}}return e.sort((([t,e],[n,o])=>{if("after"!==e.end.compareWith(o.start))return 1;if("before"!==e.start.compareWith(o.end))return-1;switch(e.start.compareWith(o.start)){case"before":return 1;case"after":return-1;default:switch(e.end.compareWith(o.end)){case"before":return 1;case"after":return-1;default:return n.localeCompare(t)}}})),new Map(e)}(t);return this.downcastDispatcher.convert(i,s,o,e),r}init(t){if(this.model.document.version)throw new _("datacontroller-init-document-not-empty",this);let e={};if("string"==typeof t?e.main=t:e=t,!this._checkIfRootsExists(Object.keys(e)))throw new _("datacontroller-init-non-existent-root",this);return this.model.enqueueChange({isUndoable:!1},(t=>{for(const n of Object.keys(e)){const o=this.model.document.getRoot(n);t.insert(this.parse(e[n],o),o,0)}})),Promise.resolve()}set(t,e={}){let n={};if("string"==typeof t?n.main=t:n=t,!this._checkIfRootsExists(Object.keys(n)))throw new _("datacontroller-set-non-existent-root",this);this.model.enqueueChange(e.batchType||{},(t=>{t.setSelection(null),t.removeSelectionAttribute(this.model.document.selection.getAttributeKeys());for(const e of Object.keys(n)){const o=this.model.document.getRoot(e);t.remove(t.createRangeIn(o)),t.insert(this.parse(n[e],o),o,0)}}))}parse(t,e="$root"){const n=this.processor.toView(t);return this.toModel(n,e)}toModel(t,e="$root"){return this.model.change((n=>this.upcastDispatcher.convert(t,n,e)))}addStyleProcessorRules(t){t(this.stylesProcessor)}registerRawContentMatcher(t){this.processor&&this.processor!==this.htmlProcessor&&this.processor.registerRawContentMatcher(t),this.htmlProcessor.registerRawContentMatcher(t)}destroy(){this.stopListening()}_checkIfRootsExists(t){for(const e of t)if(!this.model.document.getRoot(e))return!1;return!0}}class Td{constructor(t,e){this._helpers=new Map,this._downcast=yi(t),this._createConversionHelpers({name:"downcast",dispatchers:this._downcast,isDowncast:!0}),this._upcast=yi(e),this._createConversionHelpers({name:"upcast",dispatchers:this._upcast,isDowncast:!1})}addAlias(t,e){const n=this._downcast.includes(e);if(!this._upcast.includes(e)&&!n)throw new _("conversion-add-alias-dispatcher-not-registered",this);this._createConversionHelpers({name:t,dispatchers:[e],isDowncast:n})}for(t){if(!this._helpers.has(t))throw new _("conversion-for-unknown-group",this);return this._helpers.get(t)}elementToElement(t){this.for("downcast").elementToElement(t);for(const{model:e,view:n}of Sd(t))this.for("upcast").elementToElement({model:e,view:n,converterPriority:t.converterPriority})}attributeToElement(t){this.for("downcast").attributeToElement(t);for(const{model:e,view:n}of Sd(t))this.for("upcast").elementToAttribute({view:n,model:e,converterPriority:t.converterPriority})}attributeToAttribute(t){this.for("downcast").attributeToAttribute(t);for(const{model:e,view:n}of Sd(t))this.for("upcast").attributeToAttribute({view:n,model:e})}_createConversionHelpers({name:t,dispatchers:e,isDowncast:n}){if(this._helpers.has(t))throw new _("conversion-group-exists",this);const o=n?new Al(e):new Ul(e);this._helpers.set(t,o)}}function*Sd(t){if(t.model.values)for(const e of t.model.values){const n={key:t.model.key,value:e},o=t.view[e],i=t.upcastAlso?t.upcastAlso[e]:void 0;yield*Bd(n,o,i)}else yield*Bd(t.model,t.view,t.upcastAlso)}function*Bd(t,e,n){if(yield{model:t,view:e},n)for(const e of yi(n))yield{model:t,view:e}}class Nd{constructor(t){this.baseVersion=t,this.isDocumentOperation=null!==this.baseVersion,this.batch=null}_validate(){}toJSON(){const t=Object.assign({},this);return t.__className=this.constructor.className,delete t.batch,delete t.isDocumentOperation,t}static get className(){return"Operation"}static fromJSON(t,e){return new this(t.baseVersion)}}function Pd(t,e){const n=zd(e),o=n.reduce(((t,e)=>t+e.offsetSize),0),i=t.parent;jd(t);const r=t.index;return i._insertChild(r,n),Rd(i,r+n.length),Rd(i,r),new Uc(t,t.getShiftedBy(o))}function Od(t){if(!t.isFlat)throw new _("operation-utils-remove-range-not-flat",this);const e=t.start.parent;jd(t.start),jd(t.end);const n=e._removeChildren(t.start.index,t.end.index-t.start.index);return Rd(e,t.start.index),n}function Ld(t,e){if(!t.isFlat)throw new _("operation-utils-move-range-not-flat",this);const n=Od(t);return Pd(e=e._getTransformedByDeletion(t.start,t.end.offset-t.start.offset),n)}function zd(t){const e=[];!function t(n){if("string"==typeof n)e.push(new Bc(n));else if(n instanceof Nc)e.push(new Bc(n.data,n.getAttributes()));else if(n instanceof Tc)e.push(n);else if(nt(n))for(const e of n)t(e);else{}}(t);for(let t=1;tt.maxOffset)throw new _("move-operation-nodes-do-not-exist",this);if(t===e&&n=n&&this.targetPosition.path[t]t._clone(!0)))),e=new Hd(this.position,t,this.baseVersion);return e.shouldReceiveAttributes=this.shouldReceiveAttributes,e}getReversed(){const t=this.position.root.document.graveyard,e=new zc(t,[0]);return new Vd(this.position,this.nodes.maxOffset,e,this.baseVersion+1)}_validate(){const t=this.position.parent;if(!t||t.maxOffsett._clone(!0)))),Pd(this.position,t)}toJSON(){const t=super.toJSON();return t.position=this.position.toJSON(),t.nodes=this.nodes.toJSON(),t}static get className(){return"InsertOperation"}static fromJSON(t,e){const n=[];for(const e of t.nodes)e.name?n.push(Pc.fromJSON(e)):n.push(Bc.fromJSON(e));const o=new Hd(zc.fromJSON(t.position,e),n,t.baseVersion);return o.shouldReceiveAttributes=t.shouldReceiveAttributes,o}}class Ud extends Nd{constructor(t,e,n,o,i){super(i),this.splitPosition=t.clone(),this.splitPosition.stickiness="toNext",this.howMany=e,this.insertionPosition=n,this.graveyardPosition=o?o.clone():null,this.graveyardPosition&&(this.graveyardPosition.stickiness="toNext")}get type(){return"split"}get moveTargetPosition(){const t=this.insertionPosition.path.slice();return t.push(0),new zc(this.insertionPosition.root,t)}get movedRange(){const t=this.splitPosition.getShiftedBy(Number.POSITIVE_INFINITY);return new Uc(this.splitPosition,t)}get affectedSelectable(){const t=[Uc._createFromPositionAndShift(this.splitPosition,0),Uc._createFromPositionAndShift(this.insertionPosition,0)];return this.graveyardPosition&&t.push(Uc._createFromPositionAndShift(this.graveyardPosition,0)),t}clone(){return new Ud(this.splitPosition,this.howMany,this.insertionPosition,this.graveyardPosition,this.baseVersion)}getReversed(){const t=this.splitPosition.root.document.graveyard,e=new zc(t,[0]);return new qd(this.moveTargetPosition,this.howMany,this.splitPosition,e,this.baseVersion+1)}_validate(){const t=this.splitPosition.parent,e=this.splitPosition.offset;if(!t||t.maxOffset0&&(t.sourcePosition.isEqual(e.sourcePosition.getShiftedBy(e.howMany))&&this._setRelation(t,e,"mergeSourceAffected"),t.targetPosition.isEqual(e.sourcePosition)&&this._setRelation(t,e,"mergeTargetWasBefore"));else if(t instanceof Gd){const n=t.newRange;if(!n)return;if(e instanceof Vd){const o=Uc._createFromPositionAndShift(e.sourcePosition,e.howMany),i=o.containsPosition(n.start)||o.start.isEqual(n.start),r=o.containsPosition(n.end)||o.end.isEqual(n.end);!i&&!r||o.containsRange(n)||this._setRelation(t,e,{side:i?"left":"right",path:i?n.start.path.slice():n.end.path.slice()})}else if(e instanceof qd){const o=n.start.isEqual(e.targetPosition),i=n.start.isEqual(e.deletionPosition),r=n.end.isEqual(e.deletionPosition),s=n.end.isEqual(e.sourcePosition);(o||i||r||s)&&this._setRelation(t,e,{wasInLeftElement:o,wasStartBeforeMergedElement:i,wasEndBeforeMergedElement:r,wasInRightElement:s})}}}getContext(t,e,n){return{aIsStrong:n,aWasUndone:this._wasUndone(t),bWasUndone:this._wasUndone(e),abRelation:this._useRelations?this._getRelation(t,e):null,baRelation:this._useRelations?this._getRelation(e,t):null,forceWeakRemove:this._forceWeakRemove}}_wasUndone(t){const e=this.originalOperations.get(t);return e.wasUndone||this._history.isUndoneOperation(e)}_getRelation(t,e){const n=this.originalOperations.get(e),o=this._history.getUndoneOperation(n);if(!o)return null;const i=this.originalOperations.get(t),r=this._relations.get(i);return r&&r.get(o)||null}_setRelation(t,e,n){const o=this.originalOperations.get(t),i=this.originalOperations.get(e);let r=this._relations.get(o);r||(r=new Map,this._relations.set(o,r)),r.set(i,n)}}function su(t,e){for(const n of t)n.baseVersion=e++}function au(t,e){for(let n=0;n{if(t.key===e.key&&t.range.start.hasSameParentAs(e.range.start)){const o=t.range.getDifference(e.range).map((e=>new Kd(e,t.key,t.oldValue,t.newValue,0))),i=t.range.getIntersection(e.range);return i&&n.aIsStrong&&o.push(new Kd(i,e.key,e.newValue,t.newValue,0)),0==o.length?[new $d(0)]:o}return[t]})),eu(Kd,Hd,((t,e)=>{if(t.range.start.hasSameParentAs(e.position)&&t.range.containsPosition(e.position)){const n=t.range._getTransformedByInsertion(e.position,e.howMany,!e.shouldReceiveAttributes).map((e=>new Kd(e,t.key,t.oldValue,t.newValue,t.baseVersion)));if(e.shouldReceiveAttributes){const o=cu(e,t.key,t.oldValue);o&&n.unshift(o)}return n}return t.range=t.range._getTransformedByInsertion(e.position,e.howMany,!1)[0],[t]})),eu(Kd,qd,((t,e)=>{const n=[];t.range.start.hasSameParentAs(e.deletionPosition)&&(t.range.containsPosition(e.deletionPosition)||t.range.start.isEqual(e.deletionPosition))&&n.push(Uc._createFromPositionAndShift(e.graveyardPosition,1));const o=t.range._getTransformedByMergeOperation(e);return o.isCollapsed||n.push(o),n.map((e=>new Kd(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),eu(Kd,Vd,((t,e)=>{const n=function(t,e){const n=Uc._createFromPositionAndShift(e.sourcePosition,e.howMany);let o=null,i=[];n.containsRange(t,!0)?o=t:t.start.hasSameParentAs(n.start)?(i=t.getDifference(n),o=t.getIntersection(n)):i=[t];const r=[];for(let t of i){t=t._getTransformedByDeletion(e.sourcePosition,e.howMany);const n=e.getMovedRangeStart(),o=t.start.hasSameParentAs(n),i=t._getTransformedByInsertion(n,e.howMany,o);r.push(...i)}o&&r.push(o._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany,!1)[0]);return r}(t.range,e);return n.map((e=>new Kd(e,t.key,t.oldValue,t.newValue,t.baseVersion)))})),eu(Kd,Ud,((t,e)=>{if(t.range.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.range.end.offset++,[t];if(t.range.start.hasSameParentAs(e.splitPosition)&&t.range.containsPosition(e.splitPosition)){const n=t.clone();return n.range=new Uc(e.moveTargetPosition.clone(),t.range.end._getCombined(e.splitPosition,e.moveTargetPosition)),t.range.end=e.splitPosition.clone(),t.range.end.stickiness="toPrevious",[t,n]}return t.range=t.range._getTransformedBySplitOperation(e),[t]})),eu(Hd,Kd,((t,e)=>{const n=[t];if(t.shouldReceiveAttributes&&t.position.hasSameParentAs(e.range.start)&&e.range.containsPosition(t.position)){const o=cu(t,e.key,e.newValue);o&&n.push(o)}return n})),eu(Hd,Hd,((t,e,n)=>(t.position.isEqual(e.position)&&n.aIsStrong||(t.position=t.position._getTransformedByInsertOperation(e)),[t]))),eu(Hd,Vd,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),eu(Hd,Ud,((t,e)=>(t.position=t.position._getTransformedBySplitOperation(e),[t]))),eu(Hd,qd,((t,e)=>(t.position=t.position._getTransformedByMergeOperation(e),[t]))),eu(Gd,Hd,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByInsertOperation(e)[0]),t.newRange&&(t.newRange=t.newRange._getTransformedByInsertOperation(e)[0]),[t]))),eu(Gd,Gd,((t,e,n)=>{if(t.name==e.name){if(!n.aIsStrong)return[new $d(0)];t.oldRange=e.newRange?e.newRange.clone():null}return[t]})),eu(Gd,qd,((t,e)=>(t.oldRange&&(t.oldRange=t.oldRange._getTransformedByMergeOperation(e)),t.newRange&&(t.newRange=t.newRange._getTransformedByMergeOperation(e)),[t]))),eu(Gd,Vd,((t,e,n)=>{if(t.oldRange&&(t.oldRange=Uc._createFromRanges(t.oldRange._getTransformedByMoveOperation(e))),t.newRange){if(n.abRelation){const o=Uc._createFromRanges(t.newRange._getTransformedByMoveOperation(e));if("left"==n.abRelation.side&&e.targetPosition.isEqual(t.newRange.start))return t.newRange.end=o.end,t.newRange.start.path=n.abRelation.path,[t];if("right"==n.abRelation.side&&e.targetPosition.isEqual(t.newRange.end))return t.newRange.start=o.start,t.newRange.end.path=n.abRelation.path,[t]}t.newRange=Uc._createFromRanges(t.newRange._getTransformedByMoveOperation(e))}return[t]})),eu(Gd,Ud,((t,e,n)=>{if(t.oldRange&&(t.oldRange=t.oldRange._getTransformedBySplitOperation(e)),t.newRange){if(n.abRelation){const o=t.newRange._getTransformedBySplitOperation(e);return t.newRange.start.isEqual(e.splitPosition)&&n.abRelation.wasStartBeforeMergedElement?t.newRange.start=zc._createAt(e.insertionPosition):t.newRange.start.isEqual(e.splitPosition)&&!n.abRelation.wasInLeftElement&&(t.newRange.start=zc._createAt(e.moveTargetPosition)),t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasInRightElement?t.newRange.end=zc._createAt(e.moveTargetPosition):t.newRange.end.isEqual(e.splitPosition)&&n.abRelation.wasEndBeforeMergedElement?t.newRange.end=zc._createAt(e.insertionPosition):t.newRange.end=o.end,[t]}t.newRange=t.newRange._getTransformedBySplitOperation(e)}return[t]})),eu(qd,Hd,((t,e)=>(t.sourcePosition.hasSameParentAs(e.position)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByInsertOperation(e),t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e),[t]))),eu(qd,qd,((t,e,n)=>{if(t.sourcePosition.isEqual(e.sourcePosition)&&t.targetPosition.isEqual(e.targetPosition)){if(n.bWasUndone){const n=e.graveyardPosition.path.slice();return n.push(0),t.sourcePosition=new zc(e.graveyardPosition.root,n),t.howMany=0,[t]}return[new $d(0)]}if(t.sourcePosition.isEqual(e.sourcePosition)&&!t.targetPosition.isEqual(e.targetPosition)&&!n.bWasUndone&&"splitAtSource"!=n.abRelation){const o="$graveyard"==t.targetPosition.root.rootName,i="$graveyard"==e.targetPosition.root.rootName;if(i&&!o||!(o&&!i)&&n.aIsStrong){const n=e.targetPosition._getTransformedByMergeOperation(e),o=t.targetPosition._getTransformedByMergeOperation(e);return[new Vd(n,t.howMany,o,0)]}return[new $d(0)]}return t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition=t.sourcePosition._getTransformedByMergeOperation(e),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),t.graveyardPosition.isEqual(e.graveyardPosition)&&n.aIsStrong||(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),eu(qd,Vd,((t,e,n)=>{const o=Uc._createFromPositionAndShift(e.sourcePosition,e.howMany);return"remove"==e.type&&!n.bWasUndone&&!n.forceWeakRemove&&t.deletionPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.sourcePosition)?[new $d(0)]:(e.sourcePosition.getShiftedBy(e.howMany).isEqual(t.sourcePosition)?t.sourcePosition.stickiness="toNone":e.targetPosition.isEqual(t.sourcePosition)&&"mergeSourceAffected"==n.abRelation?t.sourcePosition.stickiness="toNext":e.sourcePosition.isEqual(t.targetPosition)?(t.targetPosition.stickiness="toNone",t.howMany-=e.howMany):e.targetPosition.isEqual(t.targetPosition)&&"mergeTargetWasBefore"==n.abRelation?(t.targetPosition.stickiness="toPrevious",t.howMany+=e.howMany):(t.sourcePosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.sourcePosition.hasSameParentAs(e.sourcePosition)&&(t.howMany-=e.howMany)),t.sourcePosition=t.sourcePosition._getTransformedByMoveOperation(e),t.targetPosition=t.targetPosition._getTransformedByMoveOperation(e),t.sourcePosition.stickiness="toPrevious",t.targetPosition.stickiness="toNext",t.graveyardPosition.isEqual(e.targetPosition)||(t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)),[t])})),eu(qd,Ud,((t,e,n)=>{if(e.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByDeletion(e.graveyardPosition,1),t.deletionPosition.isEqual(e.graveyardPosition)&&(t.howMany=e.howMany)),t.targetPosition.isEqual(e.splitPosition)){const o=0!=e.howMany,i=e.graveyardPosition&&t.deletionPosition.isEqual(e.graveyardPosition);if(o||i||"mergeTargetNotMoved"==n.abRelation)return t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),[t]}if(t.sourcePosition.isEqual(e.splitPosition)){if("mergeSourceNotMoved"==n.abRelation)return t.howMany=0,t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t];if("mergeSameElement"==n.abRelation||t.sourcePosition.offset>0)return t.sourcePosition=e.moveTargetPosition.clone(),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]}return t.sourcePosition.hasSameParentAs(e.splitPosition)&&(t.howMany=e.splitPosition.offset),t.sourcePosition=t.sourcePosition._getTransformedBySplitOperation(e),t.targetPosition=t.targetPosition._getTransformedBySplitOperation(e),[t]})),eu(Vd,Hd,((t,e)=>{const n=Uc._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByInsertOperation(e,!1)[0];return t.sourcePosition=n.start,t.howMany=n.end.offset-n.start.offset,t.targetPosition.isEqual(e.position)||(t.targetPosition=t.targetPosition._getTransformedByInsertOperation(e)),[t]})),eu(Vd,Vd,((t,e,n)=>{const o=Uc._createFromPositionAndShift(t.sourcePosition,t.howMany),i=Uc._createFromPositionAndShift(e.sourcePosition,e.howMany);let r,s=n.aIsStrong,a=!n.aIsStrong;if("insertBefore"==n.abRelation||"insertAfter"==n.baRelation?a=!0:"insertAfter"!=n.abRelation&&"insertBefore"!=n.baRelation||(a=!1),r=t.targetPosition.isEqual(e.targetPosition)&&a?t.targetPosition._getTransformedByDeletion(e.sourcePosition,e.howMany):t.targetPosition._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),lu(t,e)&&lu(e,t))return[e.getReversed()];if(o.containsPosition(e.targetPosition)&&o.containsRange(i,!0))return o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),du([o],r);if(i.containsPosition(t.targetPosition)&&i.containsRange(o,!0))return o.start=o.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),o.end=o.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),du([o],r);const c=et(t.sourcePosition.getParentPath(),e.sourcePosition.getParentPath());if("prefix"==c||"extension"==c)return o.start=o.start._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),o.end=o.end._getTransformedByMove(e.sourcePosition,e.targetPosition,e.howMany),du([o],r);"remove"!=t.type||"remove"==e.type||n.aWasUndone||n.forceWeakRemove?"remove"==t.type||"remove"!=e.type||n.bWasUndone||n.forceWeakRemove||(s=!1):s=!0;const l=[],d=o.getDifference(i);for(const t of d){t.start=t.start._getTransformedByDeletion(e.sourcePosition,e.howMany),t.end=t.end._getTransformedByDeletion(e.sourcePosition,e.howMany);const n="same"==et(t.start.getParentPath(),e.getMovedRangeStart().getParentPath()),o=t._getTransformedByInsertion(e.getMovedRangeStart(),e.howMany,n);l.push(...o)}const u=o.getIntersection(i);return null!==u&&s&&(u.start=u.start._getCombined(e.sourcePosition,e.getMovedRangeStart()),u.end=u.end._getCombined(e.sourcePosition,e.getMovedRangeStart()),0===l.length?l.push(u):1==l.length?i.start.isBefore(o.start)||i.start.isEqual(o.start)?l.unshift(u):l.push(u):l.splice(1,0,u)),0===l.length?[new $d(t.baseVersion)]:du(l,r)})),eu(Vd,Ud,((t,e,n)=>{let o=t.targetPosition.clone();t.targetPosition.isEqual(e.insertionPosition)&&e.graveyardPosition&&"moveTargetAfter"!=n.abRelation||(o=t.targetPosition._getTransformedBySplitOperation(e));const i=Uc._createFromPositionAndShift(t.sourcePosition,t.howMany);if(i.end.isEqual(e.insertionPosition))return e.graveyardPosition||t.howMany++,t.targetPosition=o,[t];if(i.start.hasSameParentAs(e.splitPosition)&&i.containsPosition(e.splitPosition)){let t=new Uc(e.splitPosition,i.end);t=t._getTransformedBySplitOperation(e);return du([new Uc(i.start,e.splitPosition),t],o)}t.targetPosition.isEqual(e.splitPosition)&&"insertAtSource"==n.abRelation&&(o=e.moveTargetPosition),t.targetPosition.isEqual(e.insertionPosition)&&"insertBetween"==n.abRelation&&(o=t.targetPosition);const r=[i._getTransformedBySplitOperation(e)];if(e.graveyardPosition){const o=i.start.isEqual(e.graveyardPosition)||i.containsPosition(e.graveyardPosition);t.howMany>1&&o&&!n.aWasUndone&&r.push(Uc._createFromPositionAndShift(e.insertionPosition,1))}return du(r,o)})),eu(Vd,qd,((t,e,n)=>{const o=Uc._createFromPositionAndShift(t.sourcePosition,t.howMany);if(e.deletionPosition.hasSameParentAs(t.sourcePosition)&&o.containsPosition(e.sourcePosition))if("remove"!=t.type||n.forceWeakRemove){if(1==t.howMany)return n.bWasUndone?(t.sourcePosition=e.graveyardPosition.clone(),t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]):[new $d(0)]}else if(!n.aWasUndone){const n=[];let o=e.graveyardPosition.clone(),i=e.targetPosition._getTransformedByMergeOperation(e);t.howMany>1&&(n.push(new Vd(t.sourcePosition,t.howMany-1,t.targetPosition,0)),o=o._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1),i=i._getTransformedByMove(t.sourcePosition,t.targetPosition,t.howMany-1));const r=e.deletionPosition._getCombined(t.sourcePosition,t.targetPosition),s=new Vd(o,1,r,0),a=s.getMovedRangeStart().path.slice();a.push(0);const c=new zc(s.targetPosition.root,a);i=i._getTransformedByMove(o,r,1);const l=new Vd(i,e.howMany,c,0);return n.push(s),n.push(l),n}const i=Uc._createFromPositionAndShift(t.sourcePosition,t.howMany)._getTransformedByMergeOperation(e);return t.sourcePosition=i.start,t.howMany=i.end.offset-i.start.offset,t.targetPosition=t.targetPosition._getTransformedByMergeOperation(e),[t]})),eu(Yd,Hd,((t,e)=>(t.position=t.position._getTransformedByInsertOperation(e),[t]))),eu(Yd,qd,((t,e)=>t.position.isEqual(e.deletionPosition)?(t.position=e.graveyardPosition.clone(),t.position.stickiness="toNext",[t]):(t.position=t.position._getTransformedByMergeOperation(e),[t]))),eu(Yd,Vd,((t,e)=>(t.position=t.position._getTransformedByMoveOperation(e),[t]))),eu(Yd,Yd,((t,e,n)=>{if(t.position.isEqual(e.position)){if(!n.aIsStrong)return[new $d(0)];t.oldName=e.newName}return[t]})),eu(Yd,Ud,((t,e)=>{if("same"==et(t.position.path,e.splitPosition.getParentPath())&&!e.graveyardPosition){const e=new Yd(t.position.getShiftedBy(1),t.oldName,t.newName,0);return[t,e]}return t.position=t.position._getTransformedBySplitOperation(e),[t]})),eu(Qd,Qd,((t,e,n)=>{if(t.root===e.root&&t.key===e.key){if(!n.aIsStrong||t.newValue===e.newValue)return[new $d(0)];t.oldValue=e.newValue}return[t]})),eu(Zd,Zd,((t,e)=>t.rootName===e.rootName&&t.isAdd===e.isAdd?[new $d(0)]:[t])),eu(Ud,Hd,((t,e)=>(t.splitPosition.hasSameParentAs(e.position)&&t.splitPosition.offset{if(!t.graveyardPosition&&!n.bWasUndone&&t.splitPosition.hasSameParentAs(e.sourcePosition)){const n=e.graveyardPosition.path.slice();n.push(0);const o=new zc(e.graveyardPosition.root,n),i=Ud.getInsertionPosition(new zc(e.graveyardPosition.root,n)),r=new Ud(o,0,i,null,0);return t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=Ud.getInsertionPosition(t.splitPosition),t.graveyardPosition=r.insertionPosition.clone(),t.graveyardPosition.stickiness="toNext",[r,t]}return t.splitPosition.hasSameParentAs(e.deletionPosition)&&!t.splitPosition.isAfter(e.deletionPosition)&&t.howMany--,t.splitPosition.hasSameParentAs(e.targetPosition)&&(t.howMany+=e.howMany),t.splitPosition=t.splitPosition._getTransformedByMergeOperation(e),t.insertionPosition=Ud.getInsertionPosition(t.splitPosition),t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedByMergeOperation(e)),[t]})),eu(Ud,Vd,((t,e,n)=>{const o=Uc._createFromPositionAndShift(e.sourcePosition,e.howMany);if(t.graveyardPosition){const i=o.start.isEqual(t.graveyardPosition)||o.containsPosition(t.graveyardPosition);if(!n.bWasUndone&&i){const n=t.splitPosition._getTransformedByMoveOperation(e),o=t.graveyardPosition._getTransformedByMoveOperation(e),i=o.path.slice();i.push(0);const r=new zc(o.root,i);return[new Vd(n,t.howMany,r,0)]}t.graveyardPosition=t.graveyardPosition._getTransformedByMoveOperation(e)}const i=t.splitPosition.isEqual(e.targetPosition);if(i&&("insertAtSource"==n.baRelation||"splitBefore"==n.abRelation))return t.howMany+=e.howMany,t.splitPosition=t.splitPosition._getTransformedByDeletion(e.sourcePosition,e.howMany),t.insertionPosition=Ud.getInsertionPosition(t.splitPosition),[t];if(i&&n.abRelation&&n.abRelation.howMany){const{howMany:e,offset:o}=n.abRelation;return t.howMany+=e,t.splitPosition=t.splitPosition.getShiftedBy(o),[t]}if(t.splitPosition.hasSameParentAs(e.sourcePosition)&&o.containsPosition(t.splitPosition)){const n=e.howMany-(t.splitPosition.offset-e.sourcePosition.offset);return t.howMany-=n,t.splitPosition.hasSameParentAs(e.targetPosition)&&t.splitPosition.offset{if(t.splitPosition.isEqual(e.splitPosition)){if(!t.graveyardPosition&&!e.graveyardPosition)return[new $d(0)];if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition))return[new $d(0)];if("splitBefore"==n.abRelation)return t.howMany=0,t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e),[t]}if(t.graveyardPosition&&e.graveyardPosition&&t.graveyardPosition.isEqual(e.graveyardPosition)){const o="$graveyard"==t.splitPosition.root.rootName,i="$graveyard"==e.splitPosition.root.rootName;if(i&&!o||!(o&&!i)&&n.aIsStrong){const n=[];return e.howMany&&n.push(new Vd(e.moveTargetPosition,e.howMany,e.splitPosition,0)),t.howMany&&n.push(new Vd(t.splitPosition,t.howMany,t.moveTargetPosition,0)),n}return[new $d(0)]}if(t.graveyardPosition&&(t.graveyardPosition=t.graveyardPosition._getTransformedBySplitOperation(e)),t.splitPosition.isEqual(e.insertionPosition)&&"splitBefore"==n.abRelation)return t.howMany++,[t];if(e.splitPosition.isEqual(t.insertionPosition)&&"splitBefore"==n.baRelation){const n=e.insertionPosition.path.slice();n.push(0);const o=new zc(e.insertionPosition.root,n);return[t,new Vd(t.insertionPosition,1,o,0)]}return t.splitPosition.hasSameParentAs(e.splitPosition)&&t.splitPosition.offset{const n=e[0];n.isDocumentOperation&&gu.call(this,n)}),{priority:"low"})}function gu(t){const e=this.getTransformedByOperation(t);if(!this.isEqual(e)){const t=this.toPosition();this.path=e.path,this.root=e.root,this.fire("change",t)}}uu.prototype.is=function(t){return"livePosition"===t||"model:livePosition"===t||"position"==t||"model:position"===t};class mu{constructor(t={}){"string"==typeof t&&(t="transparent"===t?{isUndoable:!1}:{},C("batch-constructor-deprecated-string-type"));const{isUndoable:e=!0,isLocal:n=!0,isUndo:o=!1,isTyping:i=!1}=t;this.operations=[],this.isUndoable=e,this.isLocal=n,this.isUndo=o,this.isTyping=i}get type(){return C("batch-type-deprecated"),"default"}get baseVersion(){for(const t of this.operations)if(null!==t.baseVersion)return t.baseVersion;return null}addOperation(t){return t.batch=this,this.operations.push(t),t}}var pu=Object.defineProperty,fu=Object.defineProperties,ku=Object.getOwnPropertyDescriptors,bu=Object.getOwnPropertySymbols,wu=Object.prototype.hasOwnProperty,Au=Object.prototype.propertyIsEnumerable,_u=(t,e,n)=>e in t?pu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Cu=(t,e)=>{for(var n in e||(e={}))wu.call(e,n)&&_u(t,n,e[n]);if(bu)for(var n of bu(e))Au.call(e,n)&&_u(t,n,e[n]);return t};class vu{constructor(t){this._changesInElement=new Map,this._elementSnapshots=new Map,this._changedMarkers=new Map,this._changedRoots=new Map,this._changeCount=0,this._cachedChanges=null,this._cachedChangesWithGraveyard=null,this._refreshedItems=new Set,this._markerCollection=t}get isEmpty(){return 0==this._changesInElement.size&&0==this._changedMarkers.size&&0==this._changedRoots.size}bufferOperation(t){const e=t;switch(e.type){case"insert":if(this._isInInsertedElement(e.position.parent))return;this._markInsert(e.position.parent,e.position.offset,e.nodes.maxOffset);break;case"addAttribute":case"removeAttribute":case"changeAttribute":for(const t of e.range.getItems({shallow:!0}))this._isInInsertedElement(t.parent)||this._markAttribute(t);break;case"remove":case"move":case"reinsert":{if(e.sourcePosition.isEqual(e.targetPosition)||e.sourcePosition.getShiftedBy(e.howMany).isEqual(e.targetPosition))return;const t=this._isInInsertedElement(e.sourcePosition.parent),n=this._isInInsertedElement(e.targetPosition.parent);t||this._markRemove(e.sourcePosition.parent,e.sourcePosition.offset,e.howMany),n||this._markInsert(e.targetPosition.parent,e.getMovedRangeStart().offset,e.howMany);break}case"rename":{if(this._isInInsertedElement(e.position.parent))return;this._markRemove(e.position.parent,e.position.offset,1),this._markInsert(e.position.parent,e.position.offset,1);const t=Uc._createFromPositionAndShift(e.position,1);for(const e of this._markerCollection.getMarkersIntersectingRange(t)){const t=e.getData();this.bufferMarkerChange(e.name,t,t)}break}case"split":{const t=e.splitPosition.parent;this._isInInsertedElement(t)||this._markRemove(t,e.splitPosition.offset,e.howMany),this._isInInsertedElement(e.insertionPosition.parent)||this._markInsert(e.insertionPosition.parent,e.insertionPosition.offset,1),e.graveyardPosition&&this._markRemove(e.graveyardPosition.parent,e.graveyardPosition.offset,1);break}case"merge":{const t=e.sourcePosition.parent;this._isInInsertedElement(t.parent)||this._markRemove(t.parent,t.startOffset,1);const n=e.graveyardPosition.parent;this._markInsert(n,e.graveyardPosition.offset,1);const o=e.targetPosition.parent;this._isInInsertedElement(o)||this._markInsert(o,e.targetPosition.offset,t.maxOffset);break}case"detachRoot":case"addRoot":{const t=e.affectedSelectable;if(!t._isLoaded)return;if(t.isAttached()==e.isAdd)return;this._bufferRootStateChange(e.rootName,e.isAdd);break}case"addRootAttribute":case"removeRootAttribute":case"changeRootAttribute":{if(!e.root._isLoaded)return;const t=e.root.rootName;this._bufferRootAttributeChange(t,e.key,e.oldValue,e.newValue);break}}this._cachedChanges=null}bufferMarkerChange(t,e,n){e.range&&e.range.root.is("rootElement")&&!e.range.root._isLoaded&&(e.range=null),n.range&&n.range.root.is("rootElement")&&!n.range.root._isLoaded&&(n.range=null);let o=this._changedMarkers.get(t);o?o.newMarkerData=n:(o={newMarkerData:n,oldMarkerData:e},this._changedMarkers.set(t,o)),null==o.oldMarkerData.range&&null==n.range&&this._changedMarkers.delete(t)}getMarkersToRemove(){const t=[];for(const[e,n]of this._changedMarkers)null!=n.oldMarkerData.range&&t.push({name:e,range:n.oldMarkerData.range});return t}getMarkersToAdd(){const t=[];for(const[e,n]of this._changedMarkers)null!=n.newMarkerData.range&&t.push({name:e,range:n.newMarkerData.range});return t}getChangedMarkers(){return Array.from(this._changedMarkers).map((([t,e])=>({name:t,data:{oldRange:e.oldMarkerData.range,newRange:e.newMarkerData.range}})))}hasDataChanges(){if(this.getChanges().length)return!0;if(this._changedRoots.size>0)return!0;for(const{newMarkerData:t,oldMarkerData:e}of this._changedMarkers.values()){if(t.affectsData!==e.affectsData)return!0;if(t.affectsData){const n=t.range&&!e.range,o=!t.range&&e.range,i=t.range&&e.range&&!t.range.isEqual(e.range);if(n||o||i)return!0}}return!1}getChanges(t={}){if(this._cachedChanges)return t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice();let e=[];for(const t of this._changesInElement.keys()){const n=this._changesInElement.get(t).sort(((t,e)=>t.offset===e.offset?t.type!=e.type?"remove"==t.type?-1:1:0:t.offsett.position.root!=e.position.root?t.position.root.rootNamet));for(const t of e)delete t.changeCount,"attribute"==t.type&&(delete t.position,delete t.length);return this._changeCount=0,this._cachedChangesWithGraveyard=e,this._cachedChanges=e.filter(Eu),t.includeChangesInGraveyard?this._cachedChangesWithGraveyard.slice():this._cachedChanges.slice()}getChangedRoots(){return Array.from(this._changedRoots.values()).map((t=>{const e=Cu({},t);return void 0!==e.state&&delete e.attributes,e}))}getRefreshedItems(){return new Set(this._refreshedItems)}reset(){this._changesInElement.clear(),this._elementSnapshots.clear(),this._changedMarkers.clear(),this._changedRoots.clear(),this._refreshedItems=new Set,this._cachedChanges=null}_bufferRootStateChange(t,e){if(!this._changedRoots.has(t))return void this._changedRoots.set(t,{name:t,state:e?"attached":"detached"});const n=this._changedRoots.get(t);void 0!==n.state?(delete n.state,void 0===n.attributes&&this._changedRoots.delete(t)):n.state=e?"attached":"detached"}_bufferRootAttributeChange(t,e,n,o){const i=this._changedRoots.get(t)||{name:t},r=i.attributes||{};if(r[e]){const t=r[e];o===t.oldValue?delete r[e]:t.newValue=o}else r[e]={oldValue:n,newValue:o};0===Object.entries(r).length?(delete i.attributes,void 0===i.state&&this._changedRoots.delete(t)):(i.attributes=r,this._changedRoots.set(t,i))}_refreshItem(t){if(this._isInInsertedElement(t.parent))return;this._markRemove(t.parent,t.startOffset,t.offsetSize),this._markInsert(t.parent,t.startOffset,t.offsetSize),this._refreshedItems.add(t);const e=Uc._createOn(t);for(const t of this._markerCollection.getMarkersIntersectingRange(e)){const e=t.getData();this.bufferMarkerChange(t.name,e,e)}this._cachedChanges=null}_bufferRootLoad(t){if(t.isAttached()){this._bufferRootStateChange(t.rootName,!0),this._markInsert(t,0,t.maxOffset);for(const e of t.getAttributeKeys())this._bufferRootAttributeChange(t.rootName,e,null,t.getAttribute(e));for(const n of this._markerCollection)if(n.getRange().root==t){const t=n.getData();this.bufferMarkerChange(n.name,(e=Cu({},t),fu(e,ku({range:null}))),t)}var e}}_markInsert(t,e,n){if(t.root.is("rootElement")&&!t.root._isLoaded)return;const o={type:"insert",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o)}_markRemove(t,e,n){if(t.root.is("rootElement")&&!t.root._isLoaded)return;const o={type:"remove",offset:e,howMany:n,count:this._changeCount++};this._markChange(t,o),this._removeAllNestedChanges(t,e,n)}_markAttribute(t){if(t.root.is("rootElement")&&!t.root._isLoaded)return;const e={type:"attribute",offset:t.startOffset,howMany:t.offsetSize,count:this._changeCount++};this._markChange(t.parent,e)}_markChange(t,e){this._makeSnapshot(t);const n=this._getChangesForElement(t);this._handleChange(e,n),n.push(e);for(let t=0;tn.offset){if(o>i){const t={type:"attribute",offset:i,howMany:o-i,count:this._changeCount++};this._handleChange(t,e),e.push(t)}t.nodesToHandle=n.offset-t.offset,t.howMany=t.nodesToHandle}else t.offset>=n.offset&&t.offseti?(t.nodesToHandle=o-i,t.offset=i):t.nodesToHandle=0);if("remove"==n.type&&t.offsetn.offset){const i={type:"attribute",offset:n.offset,howMany:o-n.offset,count:this._changeCount++};this._handleChange(i,e),e.push(i),t.nodesToHandle=n.offset-t.offset,t.howMany=t.nodesToHandle}"attribute"==n.type&&(t.offset>=n.offset&&o<=i?(t.nodesToHandle=0,t.howMany=0,t.offset=0):t.offset<=n.offset&&o>=i&&(n.howMany=0))}}t.howMany=t.nodesToHandle,delete t.nodesToHandle}_getInsertDiff(t,e,n){return{type:"insert",position:zc._createAt(t,e),name:n.name,attributes:new Map(n.attributes),length:1,changeCount:this._changeCount++,_element:n.element}}_getRemoveDiff(t,e,n){return{type:"remove",position:zc._createAt(t,e),name:n.name,attributes:new Map(n.attributes),length:1,changeCount:this._changeCount++,_element:n.element}}_getAttributesDiff(t,e,n){const o=[];n=new Map(n);for(const[i,r]of e){const e=n.has(i)?n.get(i):null;e!==r&&o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:i,attributeOldValue:r,attributeNewValue:e,changeCount:this._changeCount++}),n.delete(i)}for(const[e,i]of n)o.push({type:"attribute",position:t.start,range:t.clone(),length:1,attributeKey:e,attributeOldValue:null,attributeNewValue:i,changeCount:this._changeCount++});return o}_isInInsertedElement(t){const e=t.parent;if(!e)return!1;const n=this._changesInElement.get(e),o=t.startOffset;if(n)for(const t of n)if("insert"==t.type&&o>=t.offset&&oo){for(let e=0;ethis._version+1&&this._gaps.set(this._version,t),this._version=t}get lastOperation(){return this._operations[this._operations.length-1]}addOperation(t){if(t.baseVersion!==this.version)throw new _("model-document-history-addoperation-incorrect-version",this,{operation:t,historyVersion:this.version});this._operations.push(t),this._version++,this._baseVersionToOperationIndex.set(t.baseVersion,this._operations.length-1)}getOperations(t,e=this.version){if(!this._operations.length)return[];const n=this._operations[0];void 0===t&&(t=n.baseVersion);let o=e-1;for(const[e,n]of this._gaps)t>e&&te&&othis.lastOperation.baseVersion)return[];let i=this._baseVersionToOperationIndex.get(t);void 0===i&&(i=0);let r=this._baseVersionToOperationIndex.get(o);return void 0===r&&(r=this._operations.length-1),this._operations.slice(i,r+1)}getOperation(t){const e=this._baseVersionToOperationIndex.get(t);if(void 0!==e)return this._operations[e]}setOperationAsUndone(t,e){this._undoPairs.set(e,t),this._undoneOperations.add(t)}isUndoingOperation(t){return this._undoPairs.has(t)}isUndoneOperation(t){return this._undoneOperations.has(t)}getUndoneOperation(t){return this._undoPairs.get(t)}reset(){this._version=0,this._undoPairs=new Map,this._operations=[],this._undoneOperations=new Set,this._gaps=new Map,this._baseVersionToOperationIndex=new Map}}class Iu extends Pc{constructor(t,e,n="main"){super(e),this._isAttached=!0,this._isLoaded=!0,this._document=t,this.rootName=n}get document(){return this._document}isAttached(){return this._isAttached}toJSON(){return this.rootName}}Iu.prototype.is=function(t,e){return e?e===this.name&&("rootElement"===t||"model:rootElement"===t||"element"===t||"model:element"===t):"rootElement"===t||"model:rootElement"===t||"element"===t||"model:element"===t||"node"===t||"model:node"===t};var Mu=Object.defineProperty,Tu=Object.defineProperties,Su=Object.getOwnPropertyDescriptors,Bu=Object.getOwnPropertySymbols,Nu=Object.prototype.hasOwnProperty,Pu=Object.prototype.propertyIsEnumerable,Ou=(t,e,n)=>e in t?Mu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Lu=(t,e)=>{for(var n in e||(e={}))Nu.call(e,n)&&Ou(t,n,e[n]);if(Bu)for(var n of Bu(e))Pu.call(e,n)&&Ou(t,n,e[n]);return t},zu=(t,e)=>Tu(t,Su(e));const Ru="$graveyard";class ju extends(B()){constructor(t){super(),this.model=t,this.history=new Du,this.selection=new fl(this),this.roots=new Yi({idProperty:"rootName"}),this.differ=new vu(t.markers),this.isReadOnly=!1,this._postFixers=new Set,this._hasSelectionChangedFromTheLastChangeBlock=!1,this.createRoot("$root",Ru),this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&this.differ.bufferOperation(n)}),{priority:"high"}),this.listenTo(t,"applyOperation",((t,e)=>{const n=e[0];n.isDocumentOperation&&this.history.addOperation(n)}),{priority:"low"}),this.listenTo(this.selection,"change",(()=>{this._hasSelectionChangedFromTheLastChangeBlock=!0})),this.listenTo(t.markers,"update",((t,e,n,o,i)=>{const r=zu(Lu({},e.getData()),{range:o});this.differ.bufferMarkerChange(e.name,i,r),null===n&&e.on("change",((t,n)=>{const o=e.getData();this.differ.bufferMarkerChange(e.name,zu(Lu({},o),{range:n}),o)}))})),this.registerPostFixer((t=>{let e=!1;for(const n of this.roots)n.isAttached()||n.isEmpty||(t.remove(t.createRangeIn(n)),e=!0);for(const n of this.model.markers)n.getRange().root.isAttached()||(t.removeMarker(n),e=!0);return e}))}get version(){return this.history.version}set version(t){this.history.version=t}get graveyard(){return this.getRoot(Ru)}createRoot(t="$root",e="main"){if(this.roots.get(e))throw new _("model-document-createroot-name-exists",this,{name:e});const n=new Iu(this,t,e);return this.roots.add(n),n}destroy(){this.selection.destroy(),this.stopListening()}getRoot(t="main"){return this.roots.get(t)}getRootNames(t=!1){return this.getRoots(t).map((t=>t.rootName))}getRoots(t=!1){return this.roots.filter((e=>e!=this.graveyard&&(t||e.isAttached())&&e._isLoaded))}registerPostFixer(t){this._postFixers.add(t)}toJSON(){const t=Sr(this);return t.selection="[engine.model.DocumentSelection]",t.model="[engine.model.Model]",t}_handleChangeBlock(t){this._hasDocumentChangedFromTheLastChangeBlock()&&(this._callPostFixers(t),this.selection.refresh(),this.differ.hasDataChanges()?this.fire("change:data",t.batch):this.fire("change",t.batch),this.selection.refresh(),this.differ.reset()),this._hasSelectionChangedFromTheLastChangeBlock=!1}_hasDocumentChangedFromTheLastChangeBlock(){return!this.differ.isEmpty||this._hasSelectionChangedFromTheLastChangeBlock}_getDefaultRoot(){const t=this.getRoots();return t.length?t[0]:this.graveyard}_getDefaultRange(){const t=this._getDefaultRoot(),e=this.model,n=e.schema,o=e.createPositionFromPath(t,[0]);return n.getNearestSelectionRange(o)||e.createRange(o)}_validateSelectionRange(t){return Fu(t.start)&&Fu(t.end)}_callPostFixers(t){let e=!1;do{for(const n of this._postFixers)if(this.selection.refresh(),e=n(t),e)break}while(e)}}function Fu(t){const e=t.textNode;if(e){const n=e.data,o=t.offset-e.startOffset;return!er(n,o)&&!nr(n,o)}return!0}var Vu=Object.defineProperty,Hu=Object.defineProperties,Uu=Object.getOwnPropertyDescriptors,qu=Object.getOwnPropertySymbols,Gu=Object.prototype.hasOwnProperty,Wu=Object.prototype.propertyIsEnumerable,Ku=(t,e,n)=>e in t?Vu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class $u extends(B()){constructor(){super(...arguments),this._markers=new Map}[Symbol.iterator](){return this._markers.values()}has(t){const e=t instanceof Yu?t.name:t;return this._markers.has(e)}get(t){return this._markers.get(t)||null}_set(t,e,n=!1,o=!1){const i=t instanceof Yu?t.name:t;if(i.includes(","))throw new _("markercollection-incorrect-marker-name",this);const r=this._markers.get(i);if(r){const t=r.getData(),s=r.getRange();let a=!1;return s.isEqual(e)||(r._attachLiveRange(hl.fromRange(e)),a=!0),n!=r.managedUsingOperations&&(r._managedUsingOperations=n,a=!0),"boolean"==typeof o&&o!=r.affectsData&&(r._affectsData=o,a=!0),a&&this.fire(`update:${i}`,r,s,e,t),r}const s=hl.fromRange(e),a=new Yu(i,s,n,o);var c;return this._markers.set(i,a),this.fire(`update:${i}`,a,null,e,(c=((t,e)=>{for(var n in e||(e={}))Gu.call(e,n)&&Ku(t,n,e[n]);if(qu)for(var n of qu(e))Wu.call(e,n)&&Ku(t,n,e[n]);return t})({},a.getData()),Hu(c,Uu({range:null})))),a}_remove(t){const e=t instanceof Yu?t.name:t,n=this._markers.get(e);return!!n&&(this._markers.delete(e),this.fire(`update:${e}`,n,n.getRange(),null,n.getData()),this._destroyMarker(n),!0)}_refresh(t){const e=t instanceof Yu?t.name:t,n=this._markers.get(e);if(!n)throw new _("markercollection-refresh-marker-not-exists",this);const o=n.getRange();this.fire(`update:${e}`,n,o,o,n.getData())}*getMarkersAtPosition(t){for(const e of this)e.getRange().containsPosition(t)&&(yield e)}*getMarkersIntersectingRange(t){for(const e of this)null!==e.getRange().getIntersection(t)&&(yield e)}destroy(){for(const t of this._markers.values())this._destroyMarker(t);this._markers=null,this.stopListening()}*getMarkersGroup(t){for(const e of this._markers.values())e.name.startsWith(t+":")&&(yield e)}_destroyMarker(t){t.stopListening(),t._detachLiveRange()}}class Yu extends(B(Mc)){constructor(t,e,n,o){super(),this.name=t,this._liveRange=this._attachLiveRange(e),this._managedUsingOperations=n,this._affectsData=o}get managedUsingOperations(){if(!this._liveRange)throw new _("marker-destroyed",this);return this._managedUsingOperations}get affectsData(){if(!this._liveRange)throw new _("marker-destroyed",this);return this._affectsData}getData(){return{range:this.getRange(),affectsData:this.affectsData,managedUsingOperations:this.managedUsingOperations}}getStart(){if(!this._liveRange)throw new _("marker-destroyed",this);return this._liveRange.start.clone()}getEnd(){if(!this._liveRange)throw new _("marker-destroyed",this);return this._liveRange.end.clone()}getRange(){if(!this._liveRange)throw new _("marker-destroyed",this);return this._liveRange.toRange()}_attachLiveRange(t){return this._liveRange&&this._detachLiveRange(),t.delegate("change:range").to(this),t.delegate("change:content").to(this),this._liveRange=t,t}_detachLiveRange(){this._liveRange.stopDelegating("change:range",this),this._liveRange.stopDelegating("change:content",this),this._liveRange.detach(),this._liveRange=null}}Yu.prototype.is=function(t){return"marker"===t||"model:marker"===t};class Qu extends Nd{constructor(t,e){super(null),this.sourcePosition=t.clone(),this.howMany=e}get type(){return"detach"}get affectedSelectable(){return null}toJSON(){const t=super.toJSON();return t.sourcePosition=this.sourcePosition.toJSON(),t}_validate(){if(this.sourcePosition.root.document)throw new _("detach-operation-on-document-node",this)}_execute(){Od(Uc._createFromPositionAndShift(this.sourcePosition,this.howMany))}static get className(){return"DetachOperation"}}class Zu extends Mc{constructor(t){super(),this.markers=new Map,this._children=new Sc,t&&this._insertChild(0,t)}[Symbol.iterator](){return this.getChildren()}get childCount(){return this._children.length}get maxOffset(){return this._children.maxOffset}get isEmpty(){return 0===this.childCount}get nextSibling(){return null}get previousSibling(){return null}get root(){return this}get parent(){return null}get document(){return null}isAttached(){return!1}getAncestors(){return[]}getChild(t){return this._children.getNode(t)}getChildren(){return this._children[Symbol.iterator]()}getChildIndex(t){return this._children.getNodeIndex(t)}getChildStartOffset(t){return this._children.getNodeStartOffset(t)}getPath(){return[]}getNodeByPath(t){let e=this;for(const n of t)e=e.getChild(e.offsetToIndex(n));return e}offsetToIndex(t){return this._children.offsetToIndex(t)}toJSON(){const t=[];for(const e of this._children)t.push(e.toJSON());return t}static fromJSON(t){const e=[];for(const n of t)n.name?e.push(Pc.fromJSON(n)):e.push(Bc.fromJSON(n));return new Zu(e)}_appendChild(t){this._insertChild(this.childCount,t)}_insertChild(t,e){const n=function(t){if("string"==typeof t)return[new Bc(t)];nt(t)||(t=[t]);return Array.from(t).map((t=>"string"==typeof t?new Bc(t):t instanceof Nc?new Bc(t.data,t.getAttributes()):t))}(e);for(const t of n)null!==t.parent&&t._remove(),t.parent=this;this._children._insertNodes(t,n)}_removeChildren(t,e=1){const n=this._children._removeNodes(t,e);for(const t of n)t.parent=null;return n}}Zu.prototype.is=function(t){return"documentFragment"===t||"model:documentFragment"===t};class Ju{constructor(t,e){this.model=t,this.batch=e}createText(t,e){return new Bc(t,e)}createElement(t,e){return new Pc(t,e)}createDocumentFragment(){return new Zu}cloneElement(t,e=!0){return t._clone(e)}insert(t,e,n=0){if(this._assertWriterUsedCorrectly(),t instanceof Bc&&""==t.data)return;const o=zc._createAt(e,n);if(t.parent){if(oh(t.root,o.root))return void this.move(Uc._createOn(t),o);if(t.root.document)throw new _("model-writer-insert-forbidden-move",this);this.remove(t)}const i=o.root.document?o.root.document.version:null,r=new Hd(o,t,i);if(t instanceof Bc&&(r.shouldReceiveAttributes=!0),this.batch.addOperation(r),this.model.applyOperation(r),t instanceof Zu)for(const[e,n]of t.markers){const t=zc._createAt(n.root,0),i={range:new Uc(n.start._getCombined(t,o),n.end._getCombined(t,o)),usingOperation:!0,affectsData:!0};this.model.markers.has(e)?this.updateMarker(e,i):this.addMarker(e,i)}}insertText(t,e,n,o){e instanceof Zu||e instanceof Pc||e instanceof zc?this.insert(this.createText(t),e,n):this.insert(this.createText(t,e),n,o)}insertElement(t,e,n,o){e instanceof Zu||e instanceof Pc||e instanceof zc?this.insert(this.createElement(t),e,n):this.insert(this.createElement(t,e),n,o)}append(t,e){this.insert(t,e,"end")}appendText(t,e,n){e instanceof Zu||e instanceof Pc?this.insert(this.createText(t),e,"end"):this.insert(this.createText(t,e),n,"end")}appendElement(t,e,n){e instanceof Zu||e instanceof Pc?this.insert(this.createElement(t),e,"end"):this.insert(this.createElement(t,e),n,"end")}setAttribute(t,e,n){if(this._assertWriterUsedCorrectly(),n instanceof Uc){const o=n.getMinimalFlatRanges();for(const n of o)Xu(this,t,e,n)}else th(this,t,e,n)}setAttributes(t,e){for(const[n,o]of Xi(t))this.setAttribute(n,o,e)}removeAttribute(t,e){if(this._assertWriterUsedCorrectly(),e instanceof Uc){const n=e.getMinimalFlatRanges();for(const e of n)Xu(this,t,null,e)}else th(this,t,null,e)}clearAttributes(t){this._assertWriterUsedCorrectly();const e=t=>{for(const e of t.getAttributeKeys())this.removeAttribute(e,t)};if(t instanceof Uc)for(const n of t.getItems())e(n);else e(t)}move(t,e,n){if(this._assertWriterUsedCorrectly(),!(t instanceof Uc))throw new _("writer-move-invalid-range",this);if(!t.isFlat)throw new _("writer-move-range-not-flat",this);const o=zc._createAt(e,n);if(o.isEqual(t.start))return;if(this._addOperationForAffectedMarkers("move",t),!oh(t.root,o.root))throw new _("writer-move-different-document",this);const i=t.root.document?t.root.document.version:null,r=new Vd(t.start,t.end.offset-t.start.offset,o,i);this.batch.addOperation(r),this.model.applyOperation(r)}remove(t){this._assertWriterUsedCorrectly();const e=(t instanceof Uc?t:Uc._createOn(t)).getMinimalFlatRanges().reverse();for(const t of e)this._addOperationForAffectedMarkers("move",t),nh(t.start,t.end.offset-t.start.offset,this.batch,this.model)}merge(t){this._assertWriterUsedCorrectly();const e=t.nodeBefore,n=t.nodeAfter;if(this._addOperationForAffectedMarkers("merge",t),!(e instanceof Pc))throw new _("writer-merge-no-element-before",this);if(!(n instanceof Pc))throw new _("writer-merge-no-element-after",this);t.root.document?this._merge(t):this._mergeDetached(t)}createPositionFromPath(t,e,n){return this.model.createPositionFromPath(t,e,n)}createPositionAt(t,e){return this.model.createPositionAt(t,e)}createPositionAfter(t){return this.model.createPositionAfter(t)}createPositionBefore(t){return this.model.createPositionBefore(t)}createRange(t,e){return this.model.createRange(t,e)}createRangeIn(t){return this.model.createRangeIn(t)}createRangeOn(t){return this.model.createRangeOn(t)}createSelection(...t){return this.model.createSelection(...t)}_mergeDetached(t){const e=t.nodeBefore,n=t.nodeAfter;this.move(Uc._createIn(n),zc._createAt(e,"end")),this.remove(n)}_merge(t){const e=zc._createAt(t.nodeBefore,"end"),n=zc._createAt(t.nodeAfter,0),o=t.root.document.graveyard,i=new zc(o,[0]),r=t.root.document.version,s=new qd(n,t.nodeAfter.maxOffset,e,i,r);this.batch.addOperation(s),this.model.applyOperation(s)}rename(t,e){if(this._assertWriterUsedCorrectly(),!(t instanceof Pc))throw new _("writer-rename-not-element-instance",this);const n=t.root.document?t.root.document.version:null,o=new Yd(zc._createBefore(t),t.name,e,n);this.batch.addOperation(o),this.model.applyOperation(o)}split(t,e){this._assertWriterUsedCorrectly();let n,o,i=t.parent;if(!i.parent)throw new _("writer-split-element-no-parent",this);if(e||(e=i.parent),!t.parent.getAncestors({includeSelf:!0}).includes(e))throw new _("writer-split-invalid-limit-element",this);do{const e=i.root.document?i.root.document.version:null,r=i.maxOffset-t.offset,s=Ud.getInsertionPosition(t),a=new Ud(t,r,s,null,e);this.batch.addOperation(a),this.model.applyOperation(a),n||o||(n=i,o=t.parent.nextSibling),i=(t=this.createPositionAfter(t.parent)).parent}while(i!==e);return{position:t,range:new Uc(zc._createAt(n,"end"),zc._createAt(o,0))}}wrap(t,e){if(this._assertWriterUsedCorrectly(),!t.isFlat)throw new _("writer-wrap-range-not-flat",this);const n=e instanceof Pc?e:new Pc(e);if(n.childCount>0)throw new _("writer-wrap-element-not-empty",this);if(null!==n.parent)throw new _("writer-wrap-element-attached",this);this.insert(n,t.start);const o=new Uc(t.start.getShiftedBy(1),t.end.getShiftedBy(1));this.move(o,zc._createAt(n,0))}unwrap(t){if(this._assertWriterUsedCorrectly(),null===t.parent)throw new _("writer-unwrap-element-no-parent",this);this.move(Uc._createIn(t),this.createPositionAfter(t)),this.remove(t)}addMarker(t,e){if(this._assertWriterUsedCorrectly(),!e||"boolean"!=typeof e.usingOperation)throw new _("writer-addmarker-no-usingoperation",this);const n=e.usingOperation,o=e.range,i=void 0!==e.affectsData&&e.affectsData;if(this.model.markers.has(t))throw new _("writer-addmarker-marker-exists",this);if(!o)throw new _("writer-addmarker-no-range",this);return n?(eh(this,t,null,o,i),this.model.markers.get(t)):this.model.markers._set(t,o,n,i)}updateMarker(t,e){this._assertWriterUsedCorrectly();const n="string"==typeof t?t:t.name,o=this.model.markers.get(n);if(!o)throw new _("writer-updatemarker-marker-not-exists",this);if(!e)return C("writer-updatemarker-reconvert-using-editingcontroller",{markerName:n}),void this.model.markers._refresh(o);const i="boolean"==typeof e.usingOperation,r="boolean"==typeof e.affectsData,s=r?e.affectsData:o.affectsData;if(!i&&!e.range&&!r)throw new _("writer-updatemarker-wrong-options",this);const a=o.getRange(),c=e.range?e.range:a;i&&e.usingOperation!==o.managedUsingOperations?e.usingOperation?eh(this,n,null,c,s):(eh(this,n,a,null,s),this.model.markers._set(n,c,void 0,s)):o.managedUsingOperations?eh(this,n,a,c,s):this.model.markers._set(n,c,void 0,s)}removeMarker(t){this._assertWriterUsedCorrectly();const e="string"==typeof t?t:t.name;if(!this.model.markers.has(e))throw new _("writer-removemarker-no-marker",this);const n=this.model.markers.get(e);if(!n.managedUsingOperations)return void this.model.markers._remove(e);eh(this,e,n.getRange(),null,n.affectsData)}addRoot(t,e="$root"){this._assertWriterUsedCorrectly();const n=this.model.document.getRoot(t);if(n&&n.isAttached())throw new _("writer-addroot-root-exists",this);const o=this.model.document,i=new Zd(t,e,!0,o,o.version);return this.batch.addOperation(i),this.model.applyOperation(i),this.model.document.getRoot(t)}detachRoot(t){this._assertWriterUsedCorrectly();const e="string"==typeof t?this.model.document.getRoot(t):t;if(!e||!e.isAttached())throw new _("writer-detachroot-no-root",this);for(const t of this.model.markers)t.getRange().root===e&&this.removeMarker(t);for(const t of e.getAttributeKeys())this.removeAttribute(t,e);this.remove(this.createRangeIn(e));const n=this.model.document,o=new Zd(e.rootName,e.name,!1,n,n.version);this.batch.addOperation(o),this.model.applyOperation(o)}setSelection(...t){this._assertWriterUsedCorrectly(),this.model.document.selection._setTo(...t)}setSelectionFocus(t,e){this._assertWriterUsedCorrectly(),this.model.document.selection._setFocus(t,e)}setSelectionAttribute(t,e){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._setSelectionAttribute(t,e);else for(const[e,n]of Xi(t))this._setSelectionAttribute(e,n)}removeSelectionAttribute(t){if(this._assertWriterUsedCorrectly(),"string"==typeof t)this._removeSelectionAttribute(t);else for(const e of t)this._removeSelectionAttribute(e)}overrideSelectionGravity(){return this.model.document.selection._overrideGravity()}restoreSelectionGravity(t){this.model.document.selection._restoreGravity(t)}_setSelectionAttribute(t,e){const n=this.model.document.selection;if(n.isCollapsed&&n.anchor.parent.isEmpty){const o=fl._getStoreAttributeKey(t);this.setAttribute(o,e,n.anchor.parent)}n._setAttribute(t,e)}_removeSelectionAttribute(t){const e=this.model.document.selection;if(e.isCollapsed&&e.anchor.parent.isEmpty){const n=fl._getStoreAttributeKey(t);this.removeAttribute(n,e.anchor.parent)}e._removeAttribute(t)}_assertWriterUsedCorrectly(){if(this.model._currentWriter!==this)throw new _("writer-incorrect-use",this)}_addOperationForAffectedMarkers(t,e){for(const n of this.model.markers){if(!n.managedUsingOperations)continue;const o=n.getRange();let i=!1;if("move"===t){const t=e;i=t.containsPosition(o.start)||t.start.isEqual(o.start)||t.containsPosition(o.end)||t.end.isEqual(o.end)}else{const t=e,n=t.nodeBefore,r=t.nodeAfter,s=o.start.parent==n&&o.start.isAtEnd,a=o.end.parent==r&&0==o.end.offset,c=o.end.nodeAfter==r,l=o.start.nodeAfter==r;i=s||a||c||l}i&&this.updateMarker(n.name,{range:o})}}}function Xu(t,e,n,o){const i=t.model,r=i.document;let s,a,c,l=o.start;for(const t of o.getWalker({shallow:!0}))c=t.item.getAttribute(e),s&&a!=c&&(a!=n&&d(),l=s),s=t.nextPosition,a=c;function d(){const o=new Uc(l,s),c=o.root.document?r.version:null,d=new Kd(o,e,a,n,c);t.batch.addOperation(d),i.applyOperation(d)}s instanceof zc&&s!=l&&a!=n&&d()}function th(t,e,n,o){const i=t.model,r=i.document,s=o.getAttribute(e);let a,c;if(s!=n){if(o.root===o){const t=o.document?r.version:null;c=new Qd(o,e,s,n,t)}else{a=new Uc(zc._createBefore(o),t.createPositionAfter(o));const i=a.root.document?r.version:null;c=new Kd(a,e,s,n,i)}t.batch.addOperation(c),i.applyOperation(c)}}function eh(t,e,n,o,i){const r=t.model,s=r.document,a=new Gd(e,n,o,r.markers,!!i,s.version);t.batch.addOperation(a),r.applyOperation(a)}function nh(t,e,n,o){let i;if(t.root.document){const n=o.document,r=new zc(n.graveyard,[0]);i=new Vd(t,e,r,n.version)}else i=new Qu(t,e);n.addOperation(i),o.applyOperation(i)}function oh(t,e){return t===e||t instanceof Iu&&e instanceof Iu}function ih(t,e,n={}){if(e.isCollapsed)return;const o=e.getFirstRange();if("$graveyard"==o.root.rootName)return;const i=t.schema;t.change((t=>{if(!n.doNotResetEntireContent&&function(t,e){const n=t.getLimitElement(e);if(!e.containsEntireContent(n))return!1;const o=e.getFirstRange();if(o.start.parent==o.end.parent)return!1;return t.checkChild(n,"paragraph")}(i,e))return void function(t,e){const n=t.model.schema.getLimitElement(e);t.remove(t.createRangeIn(n)),ch(t,t.createPositionAt(n,0),e)}(t,e);const r={};if(!n.doNotAutoparagraph){const t=e.getSelectedElement();t&&Object.assign(r,i.getAttributesWithProperty(t,"copyOnReplace",!0))}const[s,a]=function(t){const e=t.root.document.model,n=t.start;let o=t.end;if(e.hasContent(t,{ignoreMarkers:!0})){const n=function(t){const e=t.parent,n=e.root.document.model.schema,o=e.getAncestors({parentFirst:!0,includeSelf:!0});for(const t of o){if(n.isLimit(t))return null;if(n.isBlock(t))return t}}(o);if(n&&o.isTouching(e.createPositionAt(n,0))){const n=e.createSelection(t);e.modifySelection(n,{direction:"backward"});const i=n.getLastPosition(),r=e.createRange(i,o);e.hasContent(r,{ignoreMarkers:!0})||(o=i)}}return[uu.fromPosition(n,"toPrevious"),uu.fromPosition(o,"toNext")]}(o);s.isTouching(a)||t.remove(t.createRange(s,a)),n.leaveUnmerged||(!function(t,e,n){const o=t.model;if(!ah(t.model.schema,e,n))return;const[i,r]=function(t,e){const n=t.getAncestors(),o=e.getAncestors();let i=0;for(;n[i]&&n[i]==o[i];)i++;return[n[i],o[i]]}(e,n);if(!i||!r)return;!o.hasContent(i,{ignoreMarkers:!0})&&o.hasContent(r,{ignoreMarkers:!0})?sh(t,e,n,i.parent):rh(t,e,n,i.parent)}(t,s,a),i.removeDisallowedAttributes(s.parent.getChildren(),t)),lh(t,e,s),!n.doNotAutoparagraph&&function(t,e){const n=t.checkChild(e,"$text"),o=t.checkChild(e,"paragraph");return!n&&o}(i,s)&&ch(t,s,e,r),s.detach(),a.detach()}))}function rh(t,e,n,o){const i=e.parent,r=n.parent;if(i!=o&&r!=o){for(e=t.createPositionAfter(i),(n=t.createPositionBefore(r)).isEqual(e)||t.insert(r,e),t.merge(e);n.parent.isEmpty;){const e=n.parent;n=t.createPositionBefore(e),t.remove(e)}ah(t.model.schema,e,n)&&rh(t,e,n,o)}}function sh(t,e,n,o){const i=e.parent,r=n.parent;if(i!=o&&r!=o){for(e=t.createPositionAfter(i),(n=t.createPositionBefore(r)).isEqual(e)||t.insert(i,n);e.parent.isEmpty;){const n=e.parent;e=t.createPositionBefore(n),t.remove(n)}n=t.createPositionBefore(r),function(t,e){const n=e.nodeBefore,o=e.nodeAfter;n.name!=o.name&&t.rename(n,o.name);t.clearAttributes(n),t.setAttributes(Object.fromEntries(o.getAttributes()),n),t.merge(e)}(t,n),ah(t.model.schema,e,n)&&sh(t,e,n,o)}}function ah(t,e,n){const o=e.parent,i=n.parent;return o!=i&&(!t.isLimit(o)&&!t.isLimit(i)&&function(t,e,n){const o=new Uc(t,e);for(const t of o.getWalker())if(n.isLimit(t.item))return!1;return!0}(e,n,t))}function ch(t,e,n,o={}){const i=t.createElement("paragraph");t.model.schema.setAllowedAttributes(i,o,t),t.insert(i,e),lh(t,n,t.createPositionAt(i,0))}function lh(t,e,n){e instanceof fl?t.setSelection(n):e.setTo(n)}function dh(t,e){const n=[];Array.from(t.getItems({direction:"backward"})).map((t=>e.createRangeOn(t))).filter((e=>(e.start.isAfter(t.start)||e.start.isEqual(t.start))&&(e.end.isBefore(t.end)||e.end.isEqual(t.end)))).forEach((t=>{n.push(t.start.parent),e.remove(t)})),n.forEach((t=>{let n=t;for(;n.parent&&n.isEmpty;){const t=e.createRangeOn(n);n=n.parent,e.remove(t)}}))}class uh{constructor(t,e,n){this._firstNode=null,this._lastNode=null,this._lastAutoParagraph=null,this._filterAttributesOf=[],this._affectedStart=null,this._affectedEnd=null,this._nodeToSelect=null,this.model=t,this.writer=e,this.position=n,this.canMergeWith=new Set([this.position.parent]),this.schema=t.schema,this._documentFragment=e.createDocumentFragment(),this._documentFragmentPosition=e.createPositionAt(this._documentFragment,0)}handleNodes(t){for(const e of Array.from(t))this._handleNode(e);this._insertPartialFragment(),this._lastAutoParagraph&&this._updateLastNodeFromAutoParagraph(this._lastAutoParagraph),this._mergeOnRight(),this.schema.removeDisallowedAttributes(this._filterAttributesOf,this.writer),this._filterAttributesOf=[]}_updateLastNodeFromAutoParagraph(t){const e=this.writer.createPositionAfter(this._lastNode),n=this.writer.createPositionAfter(t);if(n.isAfter(e)){if(this._lastNode=t,this.position.parent!=t||!this.position.isAtEnd)throw new _("insertcontent-invalid-insertion-position",this);this.position=n,this._setAffectedBoundaries(this.position)}}getSelectionRange(){return this._nodeToSelect?Uc._createOn(this._nodeToSelect):this.model.schema.getNearestSelectionRange(this.position)}getAffectedRange(){return this._affectedStart?new Uc(this._affectedStart,this._affectedEnd):null}destroy(){this._affectedStart&&this._affectedStart.detach(),this._affectedEnd&&this._affectedEnd.detach()}_handleNode(t){if(this.schema.isObject(t))return void this._handleObject(t);let e=this._checkAndAutoParagraphToAllowedPosition(t);e||(e=this._checkAndSplitToAllowedPosition(t),e)?(this._appendToFragment(t),this._firstNode||(this._firstNode=t),this._lastNode=t):this._handleDisallowedNode(t)}_insertPartialFragment(){if(this._documentFragment.isEmpty)return;const t=uu.fromPosition(this.position,"toNext");this._setAffectedBoundaries(this.position),this._documentFragment.getChild(0)==this._firstNode&&(this.writer.insert(this._firstNode,this.position),this._mergeOnLeft(),this.position=t.toPosition()),this._documentFragment.isEmpty||this.writer.insert(this._documentFragment,this.position),this._documentFragmentPosition=this.writer.createPositionAt(this._documentFragment,0),this.position=t.toPosition(),t.detach()}_handleObject(t){this._checkAndSplitToAllowedPosition(t)?this._appendToFragment(t):this._tryAutoparagraphing(t)}_handleDisallowedNode(t){t.is("element")?this.handleNodes(t.getChildren()):this._tryAutoparagraphing(t)}_appendToFragment(t){if(!this.schema.checkChild(this.position,t))throw new _("insertcontent-wrong-position",this,{node:t,position:this.position});this.writer.insert(t,this._documentFragmentPosition),this._documentFragmentPosition=this._documentFragmentPosition.getShiftedBy(t.offsetSize),this.schema.isObject(t)&&!this.schema.checkChild(this.position,"$text")?this._nodeToSelect=t:this._nodeToSelect=null,this._filterAttributesOf.push(t)}_setAffectedBoundaries(t){this._affectedStart||(this._affectedStart=uu.fromPosition(t,"toPrevious")),this._affectedEnd&&!this._affectedEnd.isBefore(t)||(this._affectedEnd&&this._affectedEnd.detach(),this._affectedEnd=uu.fromPosition(t,"toNext"))}_mergeOnLeft(){const t=this._firstNode;if(!(t instanceof Pc))return;if(!this._canMergeLeft(t))return;const e=uu._createBefore(t);e.stickiness="toNext";const n=uu.fromPosition(this.position,"toNext");this._affectedStart.isEqual(e)&&(this._affectedStart.detach(),this._affectedStart=uu._createAt(e.nodeBefore,"end","toPrevious")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.isEqual(this._affectedEnd)&&this._firstNode===this._lastNode&&(this._affectedEnd.detach(),this._affectedEnd=uu._createAt(e.nodeBefore,"end","toNext")),this.position=n.toPosition(),n.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_mergeOnRight(){const t=this._lastNode;if(!(t instanceof Pc))return;if(!this._canMergeRight(t))return;const e=uu._createAfter(t);if(e.stickiness="toNext",!this.position.isEqual(e))throw new _("insertcontent-invalid-insertion-position",this);this.position=zc._createAt(e.nodeBefore,"end");const n=uu.fromPosition(this.position,"toPrevious");this._affectedEnd.isEqual(e)&&(this._affectedEnd.detach(),this._affectedEnd=uu._createAt(e.nodeBefore,"end","toNext")),this._firstNode===this._lastNode&&(this._firstNode=e.nodeBefore,this._lastNode=e.nodeBefore),this.writer.merge(e),e.getShiftedBy(-1).isEqual(this._affectedStart)&&this._firstNode===this._lastNode&&(this._affectedStart.detach(),this._affectedStart=uu._createAt(e.nodeBefore,0,"toPrevious")),this.position=n.toPosition(),n.detach(),this._filterAttributesOf.push(this.position.parent),e.detach()}_canMergeLeft(t){const e=t.previousSibling;return e instanceof Pc&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(e,t)}_canMergeRight(t){const e=t.nextSibling;return e instanceof Pc&&this.canMergeWith.has(e)&&this.model.schema.checkMerge(t,e)}_tryAutoparagraphing(t){const e=this.writer.createElement("paragraph");this._getAllowedIn(this.position.parent,e)&&this.schema.checkChild(e,t)&&(e._appendChild(t),this._handleNode(e))}_checkAndAutoParagraphToAllowedPosition(t){if(this.schema.checkChild(this.position.parent,t))return!0;if(!this.schema.checkChild(this.position.parent,"paragraph")||!this.schema.checkChild("paragraph",t))return!1;this._insertPartialFragment();const e=this.writer.createElement("paragraph");return this.writer.insert(e,this.position),this._setAffectedBoundaries(this.position),this._lastAutoParagraph=e,this.position=this.writer.createPositionAt(e,0),!0}_checkAndSplitToAllowedPosition(t){const e=this._getAllowedIn(this.position.parent,t);if(!e)return!1;for(e!=this.position.parent&&this._insertPartialFragment();e!=this.position.parent;)if(this.position.isAtStart){const t=this.position.parent;this.position=this.writer.createPositionBefore(t),t.isEmpty&&t.parent===e&&this.writer.remove(t)}else if(this.position.isAtEnd)this.position=this.writer.createPositionAfter(this.position.parent);else{const t=this.writer.createPositionAfter(this.position.parent);this._setAffectedBoundaries(this.position),this.writer.split(this.position),this.position=t,this.canMergeWith.add(this.position.nodeAfter)}return!0}_getAllowedIn(t,e){return this.schema.checkChild(t,e)?t:this.schema.isLimit(t)?null:this._getAllowedIn(t.parent,e)}}function hh(t,e,n,o={}){if(!t.schema.isObject(e))throw new _("insertobject-element-not-an-object",t,{object:e});const i=n||t.document.selection;let r=i;o.findOptimalPosition&&t.schema.isBlock(e)&&(r=t.createSelection(t.schema.findOptimalInsertionRange(i,o.findOptimalPosition)));const s=Qi(i.getSelectedBlocks()),a={};return s&&Object.assign(a,t.schema.getAttributesWithProperty(s,"copyOnReplace",!0)),t.change((n=>{r.isCollapsed||t.deleteContent(r,{doNotAutoparagraph:!0});let i=e;const s=r.anchor.parent;!t.schema.checkChild(s,e)&&t.schema.checkChild(s,"paragraph")&&t.schema.checkChild("paragraph",e)&&(i=n.createElement("paragraph"),n.insert(e,i)),t.schema.setAllowedAttributes(i,a,n);const c=t.insertContent(i,r);return c.isCollapsed||o.setSelection&&function(t,e,n,o){const i=t.model;if("on"==n)return void t.setSelection(e,"on");if("after"!=n)throw new _("insertobject-invalid-place-parameter-value",i);let r=e.nextSibling;if(i.schema.isInline(e))return void t.setSelection(e,"after");const s=r&&i.schema.checkChild(r,"$text");!s&&i.schema.checkChild(e.parent,"paragraph")&&(r=t.createElement("paragraph"),i.schema.setAllowedAttributes(r,o,t),i.insertContent(r,t.createPositionAfter(e)));r&&t.setSelection(r,0)}(n,e,o.setSelection,a),c}))}const gh=' ,.?!:;"-()';function mh(t,e){const{isForward:n,walker:o,unit:i,schema:r,treatEmojiAsSingleUnit:s}=t,{type:a,item:c,nextPosition:l}=e;if("text"==a)return"word"===t.unit?function(t,e){let n=t.position.textNode;n||(n=e?t.position.nodeAfter:t.position.nodeBefore);for(;n&&n.is("$text");){const o=t.position.offset-n.startOffset;if(kh(n,o,e))n=e?t.position.nodeAfter:t.position.nodeBefore;else{if(fh(n.data,o,e))break;t.next()}}return t.position}(o,n):function(t,e,n){const o=t.position.textNode;if(o){const i=o.data;let r=t.position.offset-o.startOffset;for(;er(i,r)||"character"==e&&nr(i,r)||n&&ir(i,r);)t.next(),r=t.position.offset-o.startOffset}return t.position}(o,i,s);if(a==(n?"elementStart":"elementEnd")){if(r.isSelectable(c))return zc._createAt(c,n?"after":"before");if(r.checkChild(l,"$text"))return l}else{if(r.isLimit(c))return void o.skip((()=>!0));if(r.checkChild(l,"$text"))return l}}function ph(t,e){const n=t.root,o=zc._createAt(n,e?"end":0);return e?new Uc(t,o):new Uc(o,t)}function fh(t,e,n){const o=e+(n?0:-1);return gh.includes(t.charAt(o))}function kh(t,e,n){return e===(n?t.offsetSize:0)}class bh extends(K()){constructor(){super(),this.markers=new $u,this.document=new ju(this),this.schema=new id,this._pendingChanges=[],this._currentWriter=null,["deleteContent","modifySelection","getSelectedContent","applyOperation"].forEach((t=>this.decorate(t))),this.on("applyOperation",((t,e)=>{e[0]._validate()}),{priority:"highest"}),this.schema.register("$root",{isLimit:!0}),this.schema.register("$container",{allowIn:["$root","$container"]}),this.schema.register("$block",{allowIn:["$root","$container"],isBlock:!0}),this.schema.register("$blockObject",{allowWhere:"$block",isBlock:!0,isObject:!0}),this.schema.register("$inlineObject",{allowWhere:"$text",allowAttributesOf:"$text",isInline:!0,isObject:!0}),this.schema.register("$text",{allowIn:"$block",isInline:!0,isContent:!0}),this.schema.register("$clipboardHolder",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$documentFragment",{allowContentOf:"$root",allowChildren:"$text",isLimit:!0}),this.schema.register("$marker"),this.schema.addChildCheck(((t,e)=>{if("$marker"===e.name)return!0})),Ql(this),this.document.registerPostFixer(Nl),this.on("insertContent",((t,[e,n])=>{t.return=function(t,e,n){return t.change((o=>{const i=n||t.document.selection;i.isCollapsed||t.deleteContent(i,{doNotAutoparagraph:!0});const r=new uh(t,o,i.anchor),s=[];let a;if(e.is("documentFragment")){if(e.markers.size){const t=[];for(const[n,o]of e.markers){const{start:e,end:i}=o,r=e.isEqual(i);t.push({position:e,name:n,isCollapsed:r},{position:i,name:n,isCollapsed:r})}t.sort((({position:t},{position:e})=>t.isBefore(e)?1:-1));for(const{position:n,name:i,isCollapsed:r}of t){let t=null,a=null;const c=n.parent===e&&n.isAtStart,l=n.parent===e&&n.isAtEnd;c||l?r&&(a=c?"start":"end"):(t=o.createElement("$marker"),o.insert(t,n)),s.push({name:i,element:t,collapsed:a})}}a=e.getChildren()}else a=[e];r.handleNodes(a);let c=r.getSelectionRange();if(e.is("documentFragment")&&s.length){const t=c?hl.fromRange(c):null,e={};for(let t=s.length-1;t>=0;t--){const{name:n,element:i,collapsed:a}=s[t],c=!e[n];if(c&&(e[n]=[]),i){const t=o.createPositionAt(i,"before");e[n].push(t),o.remove(i)}else{const t=r.getAffectedRange();if(!t){a&&e[n].push(r.position);continue}a?e[n].push(t[a]):e[n].push(c?t.start:t.end)}}for(const[t,[n,i]]of Object.entries(e))n&&i&&n.root===i.root&&n.root.document&&!o.model.markers.has(t)&&o.addMarker(t,{usingOperation:!0,affectsData:!0,range:new Uc(n,i)});t&&(c=t.toRange(),t.detach())}c&&(i instanceof fl?o.setSelection(c):i.setTo(c));const l=r.getAffectedRange()||t.createRange(i.anchor);return r.destroy(),l}))}(this,e,n)})),this.on("insertObject",((t,[e,n,o])=>{t.return=hh(this,e,n,o)})),this.on("canEditAt",(t=>{const e=!this.document.isReadOnly;t.return=e,e||t.stop()}))}change(t){try{return 0===this._pendingChanges.length?(this._pendingChanges.push({batch:new mu,callback:t}),this._runPendingChanges()[0]):t(this._currentWriter)}catch(t){_.rethrowUnexpectedError(t,this)}}enqueueChange(t,e){try{t?"function"==typeof t?(e=t,t=new mu):t instanceof mu||(t=new mu(t)):t=new mu,this._pendingChanges.push({batch:t,callback:e}),1==this._pendingChanges.length&&this._runPendingChanges()}catch(t){_.rethrowUnexpectedError(t,this)}}applyOperation(t){t._execute()}insertContent(t,e,n,...o){const i=wh(e,n);return this.fire("insertContent",[t,i,n,...o])}insertObject(t,e,n,o,...i){const r=wh(e,n);return this.fire("insertObject",[t,r,o,o,...i])}deleteContent(t,e){ih(this,t,e)}modifySelection(t,e){!function(t,e,n={}){const o=t.schema,i="backward"!=n.direction,r=n.unit?n.unit:"character",s=!!n.treatEmojiAsSingleUnit,a=e.focus,c=new Oc({boundaries:ph(a,i),singleCharacters:!0,direction:i?"forward":"backward"}),l={walker:c,schema:o,isForward:i,unit:r,treatEmojiAsSingleUnit:s};let d;for(;d=c.next();){if(d.done)return;const n=mh(l,d.value);if(n)return void(e instanceof fl?t.change((t=>{t.setSelectionFocus(n)})):e.setFocus(n))}}(this,t,e)}getSelectedContent(t){return function(t,e){return t.change((t=>{const n=t.createDocumentFragment(),o=e.getFirstRange();if(!o||o.isCollapsed)return n;const i=o.start.root,r=o.start.getCommonPath(o.end),s=i.getNodeByPath(r);let a;a=o.start.parent==o.end.parent?o:t.createRange(t.createPositionAt(s,o.start.path[r.length]),t.createPositionAt(s,o.end.path[r.length]+1));const c=a.end.offset-a.start.offset;for(const e of a.getItems({shallow:!0}))e.is("$textProxy")?t.appendText(e.data,e.getAttributes(),n):t.append(t.cloneElement(e,!0),n);if(a!=o){const e=o._getTransformedByMove(a.start,t.createPositionAt(n,0),c)[0],i=t.createRange(t.createPositionAt(n,0),e.start);dh(t.createRange(e.end,t.createPositionAt(n,"end")),t),dh(i,t)}return n}))}(this,t)}hasContent(t,e={}){const n=t instanceof Uc?t:Uc._createIn(t);if(n.isCollapsed)return!1;const{ignoreWhitespaces:o=!1,ignoreMarkers:i=!1}=e;if(!i)for(const t of this.markers.getMarkersIntersectingRange(n))if(t.affectsData)return!0;for(const t of n.getItems())if(this.schema.isContent(t)){if(!t.is("$textProxy"))return!0;if(!o)return!0;if(-1!==t.data.search(/\S/))return!0}return!1}canEditAt(t){const e=wh(t);return this.fire("canEditAt",[e])}createPositionFromPath(t,e,n){return new zc(t,e,n)}createPositionAt(t,e){return zc._createAt(t,e)}createPositionAfter(t){return zc._createAfter(t)}createPositionBefore(t){return zc._createBefore(t)}createRange(t,e){return new Uc(t,e)}createRangeIn(t){return Uc._createIn(t)}createRangeOn(t){return Uc._createOn(t)}createSelection(...t){return new rl(...t)}createBatch(t){return new mu(t)}createOperationFromJSON(t){return Xd.fromJSON(t,this.document)}destroy(){this.document.destroy(),this.stopListening()}_runPendingChanges(){const t=[];this.fire("_beforeChanges");try{for(;this._pendingChanges.length;){const e=this._pendingChanges[0].batch;this._currentWriter=new Ju(this,e);const n=this._pendingChanges[0].callback(this._currentWriter);t.push(n),this.document._handleChangeBlock(this._currentWriter),this._pendingChanges.shift(),this._currentWriter=null}}finally{this._pendingChanges.length=0,this._currentWriter=null,this.fire("_afterChanges")}return t}}function wh(t,e){if(t)return t instanceof rl||t instanceof fl?t:t instanceof Tc?e||0===e?new rl(t,e):t.is("rootElement")?new rl(t,"in"):new rl(t,"on"):new rl(t)}class Ah extends Pa{constructor(){super(...arguments),this.domEventType="click"}onDomEvent(t){this.fire(t.type,t)}}class _h extends Pa{constructor(){super(...arguments),this.domEventType=["mousedown","mouseup","mouseover","mouseout"]}onDomEvent(t){this.fire(t.type,t)}}class Ch{constructor(t){this.document=t}createDocumentFragment(t){return new Ws(this.document,t)}createElement(t,e,n){return new ps(this.document,t,e,n)}createText(t){return new Nr(this.document,t)}clone(t,e=!1){return t._clone(e)}appendChild(t,e){return e._appendChild(t)}insertChild(t,e,n){return n._insertChild(t,e)}removeChildren(t,e,n){return n._removeChildren(t,e)}remove(t){const e=t.parent;return e?this.removeChildren(e.getChildIndex(t),1,e):[]}replace(t,e){const n=t.parent;if(n){const o=n.getChildIndex(t);return this.removeChildren(o,1,n),this.insertChild(o,e,n),!0}return!1}unwrapElement(t){const e=t.parent;if(e){const n=e.getChildIndex(t);this.remove(t),this.insertChild(n,t.getChildren(),e)}}rename(t,e){const n=new ps(this.document,t,e.getAttributes(),e.getChildren());return this.replace(e,n)?n:null}setAttribute(t,e,n){n._setAttribute(t,e)}removeAttribute(t,e){e._removeAttribute(t)}addClass(t,e){e._addClass(t)}removeClass(t,e){e._removeClass(t)}setStyle(t,e,n){Dt(t)&&void 0===n?e._setStyle(t):n._setStyle(t,e)}removeStyle(t,e){e._removeStyle(t)}setCustomProperty(t,e,n){n._setCustomProperty(t,e)}removeCustomProperty(t,e){return e._removeCustomProperty(t)}createPositionAt(t,e){return vs._createAt(t,e)}createPositionAfter(t){return vs._createAfter(t)}createPositionBefore(t){return vs._createBefore(t)}createRange(t,e){return new ys(t,e)}createRangeOn(t){return ys._createOn(t)}createRangeIn(t){return ys._createIn(t)}createSelection(...t){return new Es(...t)}}class vh{constructor(){this._commands=new Map}add(t,e){this._commands.set(t,e)}get(t){return this._commands.get(t)}execute(t,...e){const n=this.get(t);if(!n)throw new _("commandcollection-command-not-found",this,{commandName:t});return n.execute(...e)}*names(){yield*this._commands.keys()}*commands(){yield*this._commands.values()}[Symbol.iterator](){return this._commands[Symbol.iterator]()}destroy(){for(const t of this.commands())t.destroy()}}var yh=Object.defineProperty,xh=Object.getOwnPropertySymbols,Eh=Object.prototype.hasOwnProperty,Dh=Object.prototype.propertyIsEnumerable,Ih=(t,e,n)=>e in t?yh(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;const Mh="contentEditing",Th="common";class Sh{constructor(t){this.keystrokeInfos=new Map,this._editor=t;const e=t.config.get("menuBar.isVisible"),n=t.locale.t;this.addKeystrokeInfoCategory({id:Mh,label:n("Content editing keystrokes"),description:n("These keyboard shortcuts allow for quick access to content editing features.")});const o=[{label:n("Close contextual balloons, dropdowns, and dialogs"),keystroke:"Esc"},{label:n("Open the accessibility help dialog"),keystroke:"Alt+0"},{label:n("Move focus between form fields (inputs, buttons, etc.)"),keystroke:[["Tab"],["Shift+Tab"]]},{label:n("Move focus to the toolbar, navigate between toolbars"),keystroke:"Alt+F10",mayRequireFn:!0},{label:n("Navigate through the toolbar or menu bar"),keystroke:[["arrowup"],["arrowright"],["arrowdown"],["arrowleft"]]},{label:n("Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content."),keystroke:[["Enter"],["Space"]]}];e&&o.push({label:n("Move focus to the menu bar, navigate between menu bars"),keystroke:"Alt+F9",mayRequireFn:!0}),this.addKeystrokeInfoCategory({id:"navigation",label:n("User interface and content navigation keystrokes"),description:n("Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface."),groups:[{id:"common",keystrokes:o}]})}addKeystrokeInfoCategory({id:t,label:e,description:n,groups:o}){this.keystrokeInfos.set(t,{id:t,label:e,description:n,groups:new Map}),this.addKeystrokeInfoGroup({categoryId:t,id:Th}),o&&o.forEach((e=>{this.addKeystrokeInfoGroup(((t,e)=>{for(var n in e||(e={}))Eh.call(e,n)&&Ih(t,n,e[n]);if(xh)for(var n of xh(e))Dh.call(e,n)&&Ih(t,n,e[n]);return t})({categoryId:t},e))}))}addKeystrokeInfoGroup({categoryId:t=Mh,id:e,label:n,keystrokes:o}){const i=this.keystrokeInfos.get(t);if(!i)throw new _("accessibility-unknown-keystroke-info-category",this._editor,{groupId:e,categoryId:t});i.groups.set(e,{id:e,label:n,keystrokes:o||[]})}addKeystrokeInfos({categoryId:t=Mh,groupId:e=Th,keystrokes:n}){if(!this.keystrokeInfos.has(t))throw new _("accessibility-unknown-keystroke-info-category",this._editor,{categoryId:t,keystrokes:n});const o=this.keystrokeInfos.get(t);if(!o.groups.has(e))throw new _("accessibility-unknown-keystroke-info-group",this._editor,{groupId:e,categoryId:t,keystrokes:n});o.groups.get(e).keystrokes.push(...n)}}var Bh=Object.getOwnPropertySymbols,Nh=Object.prototype.hasOwnProperty,Ph=Object.prototype.propertyIsEnumerable,Oh=(t,e)=>{var n={};for(var o in t)Nh.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(null!=t&&Bh)for(var o of Bh(t))e.indexOf(o)<0&&Ph.call(t,o)&&(n[o]=t[o]);return n};class Lh extends(K()){constructor(t={}){super();const e=this.constructor,n=e.defaultConfig||{},{translations:o}=n,i=Oh(n,["translations"]),r=t,{translations:s=o}=r,a=Oh(r,["translations"]),c=t.language||i.language;this._context=t.context||new mr({language:c,translations:s}),this._context._addEditor(this,!t.context);const l=Array.from(e.builtinPlugins||[]);this.config=new Eo(a,i),this.config.define("plugins",l),this.config.define(this._context._getEditorConfig()),this.plugins=new dr(this,l,this._context.plugins),this.locale=this._context.locale,this.t=this.locale.t,this._readOnlyLocks=new Set,this.commands=new vh,this.set("state","initializing"),this.once("ready",(()=>this.state="ready"),{priority:"high"}),this.once("destroy",(()=>this.state="destroyed"),{priority:"high"}),this.model=new bh,this.on("change:isReadOnly",(()=>{this.model.document.isReadOnly=this.isReadOnly}));const d=new hs;this.data=new Md(this.model,d),this.editing=new td(this.model,d),this.editing.view.document.bind("isReadOnly").to(this),this.conversion=new Td([this.editing.downcastDispatcher,this.data.downcastDispatcher],this.data.upcastDispatcher),this.conversion.addAlias("dataDowncast",this.data.downcastDispatcher),this.conversion.addAlias("editingDowncast",this.editing.downcastDispatcher),this.keystrokes=new fr(this),this.keystrokes.listenTo(this.editing.view.document),this.accessibility=new Sh(this)}get isReadOnly(){return this._readOnlyLocks.size>0}set isReadOnly(t){throw new _("editor-isreadonly-has-no-setter")}enableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new _("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)||(this._readOnlyLocks.add(t),1===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!0,!1))}disableReadOnlyMode(t){if("string"!=typeof t&&"symbol"!=typeof t)throw new _("editor-read-only-lock-id-invalid",null,{lockId:t});this._readOnlyLocks.has(t)&&(this._readOnlyLocks.delete(t),0===this._readOnlyLocks.size&&this.fire("change:isReadOnly","isReadOnly",!1,!0))}setData(t){this.data.set(t)}getData(t){return this.data.get(t)}initPlugins(){const t=this.config,e=t.get("plugins"),n=t.get("removePlugins")||[],o=t.get("extraPlugins")||[],i=t.get("substitutePlugins")||[];return this.plugins.init(e.concat(o),n,i)}destroy(){let t=Promise.resolve();return"initializing"==this.state&&(t=new Promise((t=>this.once("ready",t)))),t.then((()=>{this.fire("destroy"),this.stopListening(),this.commands.destroy()})).then((()=>this.plugins.destroy())).then((()=>{this.model.destroy(),this.data.destroy(),this.editing.destroy(),this.keystrokes.destroy()})).then((()=>this._context._removeEditor(this)))}execute(t,...e){try{return this.commands.execute(t,...e)}catch(t){_.rethrowUnexpectedError(t,this)}}focus(){this.editing.view.focus()}static create(...t){throw new Error("This is an abstract method.")}}function zh(t){return class extends t{updateSourceElement(t){if(!this.sourceElement)throw new _("editor-missing-sourceelement",this);const e=this.config.get("updateSourceElementOnDestroy"),n=this.sourceElement instanceof HTMLTextAreaElement;if(!e&&!n)return void Yo(this.sourceElement,"");const o="string"==typeof t?t:this.data.get();Yo(this.sourceElement,o)}}}zh.updateSourceElement=zh(Object).prototype.updateSourceElement;class Rh extends pr{static get pluginName(){return"PendingActions"}init(){this.set("hasAny",!1),this._actions=new Yi({idProperty:"_id"}),this._actions.delegate("add","remove").to(this)}add(t){if("string"!=typeof t)throw new _("pendingactions-add-invalid-message",this);const e=new(K());return e.set("message",t),this._actions.add(e),this.hasAny=!0,e}remove(t){this._actions.remove(t),this.hasAny=!!this._actions.length}get first(){return this._actions.get(0)}[Symbol.iterator](){return this._actions[Symbol.iterator]()}}const jh={bold:'',cancel:'',caption:'',check:'',cog:'',colorPalette:'',eraser:'',history:'',image:'',imageUpload:'',imageAssetManager:'',imageUrl:'',lowVision:'',textAlternative:'',loupe:'',previousArrow:'',nextArrow:'',importExport:'',paragraph:'',plus:'',text:'',alignBottom:'',alignMiddle:'',alignTop:'',alignLeft:'',alignCenter:'',alignRight:'',alignJustify:'',objectLeft:'',objectCenter:'',objectRight:'',objectFullWidth:'',objectInline:'',objectBlockLeft:'',objectBlockRight:'',objectSizeFull:'',objectSizeLarge:'',objectSizeSmall:'',objectSizeMedium:'',pencil:'',pilcrow:'',quote:'',threeVerticalDots:'',dragIndicator:'',redo:'',undo:'',bulletedList:'',numberedList:'',todoList:'',codeBlock:'',browseFiles:'',heading1:'',heading2:'',heading3:'',heading4:'',heading5:'',heading6:'',horizontalLine:'',html:'',indent:'',outdent:'',table:''};class Fh extends Yi{constructor(t=[]){super(t,{idProperty:"viewUid"}),this.on("add",((t,e,n)=>{this._renderViewIntoCollectionParent(e,n)})),this.on("remove",((t,e)=>{e.element&&this._parentElement&&e.element.remove()})),this._parentElement=null}destroy(){this.map((t=>t.destroy()))}setParent(t){this._parentElement=t;for(const t of this)this._renderViewIntoCollectionParent(t)}delegate(...t){if(!t.length||!t.every((t=>"string"==typeof t)))throw new _("ui-viewcollection-delegate-wrong-events",this);return{to:e=>{for(const n of this)for(const o of t)n.delegate(o).to(e);this.on("add",((n,o)=>{for(const n of t)o.delegate(n).to(e)})),this.on("remove",((n,o)=>{for(const n of t)o.stopDelegating(n,e)}))}}}_renderViewIntoCollectionParent(t,e){t.isRendered||t.render(),t.element&&this._parentElement&&this._parentElement.insertBefore(t.element,this._parentElement.children[e])}remove(t){return super.remove(t)}}class Vh extends(B()){constructor(t){super(),Object.assign(this,Zh(Qh(t))),this._isRendered=!1,this._revertData=null}render(){const t=this._renderNode({intoFragment:!0});return this._isRendered=!0,t}apply(t){return this._revertData={children:[],bindings:[],attributes:{}},this._renderNode({node:t,intoFragment:!1,isApplying:!0,revertData:this._revertData}),t}revert(t){if(!this._revertData)throw new _("ui-template-revert-not-applied",[this,t]);this._revertTemplateFromNode(t,this._revertData)}*getViews(){yield*function*t(e){if(e.children)for(const n of e.children)og(n)?yield n:ig(n)&&(yield*t(n))}(this)}static bind(t,e){return{to:(n,o)=>new Uh({eventNameOrFunction:n,attribute:n,observable:t,emitter:e,callback:o}),if:(n,o,i)=>new qh({observable:t,emitter:e,attribute:n,valueIfTrue:o,callback:i})}}static extend(t,e){if(t._isRendered)throw new _("template-extend-render",[this,t]);eg(t,Zh(Qh(e)))}_renderNode(t){let e;if(e=t.node?this.tag&&this.text:this.tag?this.text:!this.text,e)throw new _("ui-template-wrong-syntax",this);return this.text?this._renderText(t):this._renderElement(t)}_renderElement(t){let e=t.node;return e||(e=t.node=document.createElementNS(this.ns||"http://www.w3.org/1999/xhtml",this.tag)),this._renderAttributes(t),this._renderElementChildren(t),this._setUpListeners(t),e}_renderText(t){let e=t.node;return e?t.revertData.text=e.textContent:e=t.node=document.createTextNode(""),Gh(this.text)?this._bindToObservable({schema:this.text,updater:Kh(e),data:t}):e.textContent=this.text.join(""),e}_renderAttributes(t){if(!this.attributes)return;const e=t.node,n=t.revertData;for(const o in this.attributes){const i=e.getAttribute(o),r=this.attributes[o];n&&(n.attributes[o]=i);const s=sg(r)?r[0].ns:null;if(Gh(r)){const a=sg(r)?r[0].value:r;n&&ag(o)&&a.unshift(i),this._bindToObservable({schema:a,updater:$h(e,o,s),data:t})}else if("style"==o&&"string"!=typeof r[0])this._renderStyleAttribute(r[0],t);else{n&&i&&ag(o)&&r.unshift(i);const t=r.map((t=>t&&t.value||t)).reduce(((t,e)=>t.concat(e)),[]).reduce(Xh,"");ng(t)||e.setAttributeNS(s,o,t)}}}_renderStyleAttribute(t,e){const n=e.node;for(const o in t){const i=t[o];Gh(i)?this._bindToObservable({schema:[i],updater:Yh(n,o),data:e}):n.style[o]=i}}_renderElementChildren(t){const e=t.node,n=t.intoFragment?document.createDocumentFragment():e,o=t.isApplying;let i=0;for(const r of this.children)if(rg(r)){if(!o){r.setParent(e);for(const t of r)n.appendChild(t.element)}}else if(og(r))o||(r.isRendered||r.render(),n.appendChild(r.element));else if(Mo(r))n.appendChild(r);else if(o){const e={children:[],bindings:[],attributes:{}};t.revertData.children.push(e),r._renderNode({intoFragment:!1,node:n.childNodes[i++],isApplying:!0,revertData:e})}else n.appendChild(r.render());t.intoFragment&&e.appendChild(n)}_setUpListeners(t){if(this.eventListeners)for(const e in this.eventListeners){const n=this.eventListeners[e].map((n=>{const[o,i]=e.split("@");return n.activateDomEventListener(o,i,t)}));t.revertData&&t.revertData.bindings.push(n)}}_bindToObservable({schema:t,updater:e,data:n}){const o=n.revertData;Wh(t,e,n);const i=t.filter((t=>!ng(t))).filter((t=>t.observable)).map((o=>o.activateAttributeListener(t,e,n)));o&&o.bindings.push(i)}_revertTemplateFromNode(t,e){for(const t of e.bindings)for(const e of t)e();if(e.text)return void(t.textContent=e.text);const n=t;for(const t in e.attributes){const o=e.attributes[t];null===o?n.removeAttribute(t):n.setAttribute(t,o)}for(let t=0;tWh(t,e,n);return this.emitter.listenTo(this.observable,`change:${this.attribute}`,o),()=>{this.emitter.stopListening(this.observable,`change:${this.attribute}`,o)}}}class Uh extends Hh{constructor(t){super(t),this.eventNameOrFunction=t.eventNameOrFunction}activateDomEventListener(t,e,n){const o=(t,n)=>{e&&!n.target.matches(e)||("function"==typeof this.eventNameOrFunction?this.eventNameOrFunction(n):this.observable.fire(this.eventNameOrFunction,n))};return this.emitter.listenTo(n.node,t,o),()=>{this.emitter.stopListening(n.node,t,o)}}}class qh extends Hh{constructor(t){super(t),this.valueIfTrue=t.valueIfTrue}getValue(t){return!ng(super.getValue(t))&&(this.valueIfTrue||!0)}}function Gh(t){return!!t&&(t.value&&(t=t.value),Array.isArray(t)?t.some(Gh):t instanceof Hh)}function Wh(t,e,{node:n}){const o=function(t,e){return t.map((t=>t instanceof Hh?t.getValue(e):t))}(t,n);let i;i=1==t.length&&t[0]instanceof qh?o[0]:o.reduce(Xh,""),ng(i)?e.remove():e.set(i)}function Kh(t){return{set(e){t.textContent=e},remove(){t.textContent=""}}}function $h(t,e,n){return{set(o){t.setAttributeNS(n,e,o)},remove(){t.removeAttributeNS(n,e)}}}function Yh(t,e){return{set(n){t.style[e]=n},remove(){t.style[e]=null}}}function Qh(t){return yo(t,(t=>{if(t&&(t instanceof Hh||ig(t)||og(t)||rg(t)))return t}))}function Zh(t){if("string"==typeof t?t=function(t){return{text:[t]}}(t):t.text&&function(t){t.text=yi(t.text)}(t),t.on&&(t.eventListeners=function(t){for(const e in t)Jh(t,e);return t}(t.on),delete t.on),!t.text){t.attributes&&function(t){for(const e in t)t[e].value&&(t[e].value=yi(t[e].value)),Jh(t,e)}(t.attributes);const e=[];if(t.children)if(rg(t.children))e.push(t.children);else for(const n of t.children)ig(n)||og(n)||Mo(n)?e.push(n):e.push(new Vh(n));t.children=e}return t}function Jh(t,e){t[e]=yi(t[e])}function Xh(t,e){return ng(e)?t:ng(t)?e:`${t} ${e}`}function tg(t,e){for(const n in e)t[n]?t[n].push(...e[n]):t[n]=e[n]}function eg(t,e){if(e.attributes&&(t.attributes||(t.attributes={}),tg(t.attributes,e.attributes)),e.eventListeners&&(t.eventListeners||(t.eventListeners={}),tg(t.eventListeners,e.eventListeners)),e.text&&t.text.push(...e.text),e.children&&e.children.length){if(t.children.length!=e.children.length)throw new _("ui-template-extend-children-mismatch",t);let n=0;for(const o of e.children)eg(t.children[n++],o)}}function ng(t){return!t&&0!==t}function og(t){return t instanceof dg}function ig(t){return t instanceof Vh}function rg(t){return t instanceof Fh}function sg(t){return F(t[0])&&t[0].ns}function ag(t){return"class"==t||"style"==t}var cg=n(7676),lg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(cg.A,lg);cg.A.locals;class dg extends(Bo(K())){constructor(t){super(),this.element=null,this.isRendered=!1,this.locale=t,this.t=t&&t.t,this._viewCollections=new Yi,this._unboundChildren=this.createCollection(),this._viewCollections.on("add",((e,n)=>{n.locale=t,n.t=t&&t.t})),this.decorate("render")}get bindTemplate(){return this._bindTemplate?this._bindTemplate:this._bindTemplate=Vh.bind(this,this)}createCollection(t){const e=new Fh(t);return this._viewCollections.add(e),e}registerChild(t){nt(t)||(t=[t]);for(const e of t)this._unboundChildren.add(e)}deregisterChild(t){nt(t)||(t=[t]);for(const e of t)this._unboundChildren.remove(e)}setTemplate(t){this.template=new Vh(t)}extendTemplate(t){Vh.extend(this.template,t)}render(){if(this.isRendered)throw new _("ui-view-render-already-rendered",this);this.template&&(this.element=this.template.render(),this.registerChild(this.template.getViews())),this.isRendered=!0}destroy(){this.stopListening(),this._viewCollections.map((t=>t.destroy())),this.template&&this.template._revertData&&this.template.revert(this.element)}}var ug=n(7801),hg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ug.A,hg);ug.A.locals;class gg extends dg{constructor(t){super(t),this.set("text",void 0),this.set("for",void 0),this.id=`ck-editor__label_${k()}`;const e=this.bindTemplate;this.setTemplate({tag:"label",attributes:{class:["ck","ck-label"],id:this.id,for:e.to("for")},children:[{text:e.to("text")}]})}}class mg extends dg{constructor(t,e){super(t);const n=t.t,o=new gg;o.text=n("Help Contents. To close this dialog press ESC."),this.setTemplate({tag:"div",attributes:{class:["ck","ck-accessibility-help-dialog__content"],"aria-labelledby":o.id,role:"document",tabindex:-1},children:[wt(document,"p",{},n("Below, you can find a list of keyboard shortcuts that can be used in the editor.")),...this._createCategories(Array.from(e.values())),o]})}focus(){this.element.focus()}_createCategories(t){return t.map((t=>{const e=[wt(document,"h3",{},t.label),...Array.from(t.groups.values()).map((t=>this._createGroup(t))).flat()];return t.description&&e.splice(1,0,wt(document,"p",{},t.description)),wt(document,"section",{},e)}))}_createGroup(t){const e=t.keystrokes.sort(((t,e)=>t.label.localeCompare(e.label))).map((t=>this._createGroupRow(t))).flat(),n=[wt(document,"dl",{},e)];return t.label&&n.unshift(wt(document,"h4",{},t.label)),n}_createGroupRow(t){const e=this.locale.t,n=wt(document,"dt"),o=wt(document,"dd"),i=function(t){if("string"==typeof t)return[[t]];if("string"==typeof t[0])return[t];return t}(t.keystroke),r=[];for(const t of i)r.push(t.map(pg).join(""));return n.innerHTML=t.label,o.innerHTML=r.join(", ")+(t.mayRequireFn&&c.isMac?` ${e("(may require Fn)")}`:""),[n,o]}}function pg(t){return Ci(t).split("+").map((t=>`${t}`)).join("+")}const fg='';var kg=n(8527),bg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(kg.A,bg);kg.A.locals;class wg extends rr{constructor(){super(...arguments),this.contentView=null}static get requires(){return[Ap]}static get pluginName(){return"AccessibilityHelp"}init(){const t=this.editor,e=t.locale.t;t.ui.componentFactory.add("accessibilityHelp",(()=>{const t=this._createButton(Ig);return t.set({tooltip:!0,withText:!1,label:e("Accessibility help")}),t})),t.ui.componentFactory.add("menuBar:accessibilityHelp",(()=>{const t=this._createButton(Wk);return t.label=e("Accessibility"),t})),t.keystrokes.set("Alt+0",((t,e)=>{this._showDialog(),e()})),this._setupRootLabels()}_createButton(t){const e=new t(this.editor.locale);return e.set({keystroke:"Alt+0",icon:fg}),e.on("execute",(()=>this._showDialog())),e}_setupRootLabels(){const t=this.editor,e=t.editing.view,n=t.t;function o(t,e){const o=`${e.getAttribute("aria-label")}. ${n("Press %0 for help.",[Ci("Alt+0")])}`;t.setAttribute("aria-label",o,e)}t.ui.on("ready",(()=>{e.change((t=>{for(const n of e.document.roots)o(t,n)})),t.on("addRoot",((n,i)=>{const r=t.editing.view.document.getRoot(i.rootName);e.change((t=>o(t,r)))}),{priority:"low"})}))}_showDialog(){const t=this.editor,e=t.plugins.get("Dialog"),n=t.locale.t;this.contentView||(this.contentView=new mg(t.locale,t.accessibility.keystrokeInfos)),e.show({id:"accessibilityHelp",className:"ck-accessibility-help-dialog",title:n("Accessibility help"),icon:fg,hasCloseButton:!0,content:this.contentView})}}class Ag extends Fh{constructor(t,e=[]){super(e),this.locale=t}get bodyCollectionContainer(){return this._bodyCollectionContainer}attachToDom(){this._bodyCollectionContainer=new Vh({tag:"div",attributes:{class:["ck","ck-reset_all","ck-body","ck-rounded-corners"],dir:this.locale.uiLanguageDirection},children:this}).render();let t=document.querySelector(".ck-body-wrapper");t||(t=wt(document,"div",{class:"ck-body-wrapper"}),document.body.appendChild(t)),t.appendChild(this._bodyCollectionContainer)}detachFromDom(){super.destroy(),this._bodyCollectionContainer&&this._bodyCollectionContainer.remove();const t=document.querySelector(".ck-body-wrapper");t&&0==t.childElementCount&&t.remove()}}var _g=n(7621),Cg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(_g.A,Cg);_g.A.locals;const vg=class extends dg{constructor(){super();const t=this.bindTemplate;this.set("content",""),this.set("viewBox","0 0 20 20"),this.set("fillColor",""),this.set("isColorInherited",!0),this.set("isVisible",!0),this.setTemplate({tag:"svg",ns:"http://www.w3.org/2000/svg",attributes:{class:["ck","ck-icon",t.if("isVisible","ck-hidden",(t=>!t)),"ck-reset_all-excluded",t.if("isColorInherited","ck-icon_inherit-color")],viewBox:t.to("viewBox")}})}render(){super.render(),this._updateXMLContent(),this._colorFillPaths(),this.on("change:content",(()=>{this._updateXMLContent(),this._colorFillPaths()})),this.on("change:fillColor",(()=>{this._colorFillPaths()}))}_updateXMLContent(){if(this.content){const t=(new DOMParser).parseFromString(this.content.trim(),"image/svg+xml").querySelector("svg"),e=t.getAttribute("viewBox");e&&(this.viewBox=e);for(const{name:e,value:n}of Array.from(t.attributes))vg.presentationalAttributeNames.includes(e)&&this.element.setAttribute(e,n);for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);for(;t.childNodes.length>0;)this.element.appendChild(t.childNodes[0])}}_colorFillPaths(){this.fillColor&&this.element.querySelectorAll(".ck-icon__fill").forEach((t=>{t.style.fill=this.fillColor}))}};let yg=vg;yg.presentationalAttributeNames=["alignment-baseline","baseline-shift","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-rendering","cursor","direction","display","dominant-baseline","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","image-rendering","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","mask","opacity","overflow","paint-order","pointer-events","shape-rendering","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-overflow","text-rendering","transform","unicode-bidi","vector-effect","visibility","white-space","word-spacing","writing-mode"];class xg extends dg{constructor(){super(),this.set({style:void 0,text:void 0,id:void 0});const t=this.bindTemplate;this.setTemplate({tag:"span",attributes:{class:["ck","ck-button__label"],style:t.to("style"),id:t.to("id")},children:[{text:t.to("text")}]})}}var Eg=n(9715),Dg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Eg.A,Dg);Eg.A.locals;class Ig extends dg{constructor(t,e=new xg){super(t),this._focusDelayed=null;const n=this.bindTemplate,o=k();this.set("ariaLabel",void 0),this.set("ariaLabelledBy",`ck-editor__aria-label_${o}`),this.set("class",void 0),this.set("labelStyle",void 0),this.set("icon",void 0),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isVisible",!0),this.set("isToggleable",!1),this.set("keystroke",void 0),this.set("label",void 0),this.set("role",void 0),this.set("tabindex",-1),this.set("tooltip",!1),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.set("withKeystroke",!1),this.children=this.createCollection(),this.labelView=this._setupLabelView(e),this.iconView=new yg,this.iconView.extendTemplate({attributes:{class:"ck-button__icon"}}),this.keystrokeView=this._createKeystrokeView(),this.bind("_tooltipString").to(this,"tooltip",this,"label",this,"keystroke",this._getTooltipString.bind(this));const i={tag:"button",attributes:{class:["ck","ck-button",n.to("class"),n.if("isEnabled","ck-disabled",(t=>!t)),n.if("isVisible","ck-hidden",(t=>!t)),n.to("isOn",(t=>t?"ck-on":"ck-off")),n.if("withText","ck-button_with-text"),n.if("withKeystroke","ck-button_with-keystroke")],role:n.to("role"),type:n.to("type",(t=>t||"button")),tabindex:n.to("tabindex"),"aria-checked":n.to("ariaChecked"),"aria-label":n.to("ariaLabel"),"aria-labelledby":n.to("ariaLabelledBy"),"aria-disabled":n.if("isEnabled",!0,(t=>!t)),"aria-pressed":n.to("isOn",(t=>!!this.isToggleable&&String(!!t))),"data-cke-tooltip-text":n.to("_tooltipString"),"data-cke-tooltip-position":n.to("tooltipPosition")},children:this.children,on:{click:n.to((t=>{this.isEnabled?this.fire("execute"):t.preventDefault()}))}};c.isSafari&&(this._focusDelayed||(this._focusDelayed=tr((()=>this.focus()),0)),i.on.mousedown=n.to((()=>{this._focusDelayed()})),i.on.mouseup=n.to((()=>{this._focusDelayed.cancel()}))),this.setTemplate(i)}render(){super.render(),this.icon&&(this.iconView.bind("content").to(this,"icon"),this.children.add(this.iconView)),this.children.add(this.labelView),this.withKeystroke&&this.keystroke&&this.children.add(this.keystrokeView)}focus(){this.element.focus()}destroy(){this._focusDelayed&&this._focusDelayed.cancel(),super.destroy()}_setupLabelView(t){return t.bind("text","style","id").to(this,"label","labelStyle","ariaLabelledBy"),t}_createKeystrokeView(){const t=new dg;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__keystroke"]},children:[{text:this.bindTemplate.to("keystroke",(t=>Ci(t)))}]}),t}_getTooltipString(t,e,n){return t?"string"==typeof t?t:(n&&(n=Ci(n)),t instanceof Function?t(e,n):`${e}${n?` (${n})`:""}`):""}}var Mg=n(4391),Tg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Mg.A,Tg);Mg.A.locals;class Sg extends Ig{constructor(t){super(t),this.isToggleable=!0,this.toggleSwitchView=this._createToggleView(),this.extendTemplate({attributes:{class:"ck-switchbutton"}})}render(){super.render(),this.children.add(this.toggleSwitchView)}_createToggleView(){const t=new dg;return t.setTemplate({tag:"span",attributes:{class:["ck","ck-button__toggle"]},children:[{tag:"span",attributes:{class:["ck","ck-button__toggle__inner"]}}]}),t}}class Bg extends Ig{constructor(t){super(t),this.buttonView=this,this._fileInputView=new Ng(t),this._fileInputView.bind("acceptedType").to(this),this._fileInputView.bind("allowMultipleFiles").to(this),this._fileInputView.delegate("done").to(this),this.on("execute",(()=>{this._fileInputView.open()})),this.extendTemplate({attributes:{class:"ck-file-dialog-button"}})}render(){super.render(),this.children.add(this._fileInputView)}}class Ng extends dg{constructor(t){super(t),this.set("acceptedType",void 0),this.set("allowMultipleFiles",!1);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck-hidden"],type:"file",tabindex:"-1",accept:e.to("acceptedType"),multiple:e.to("allowMultipleFiles")},on:{change:e.to((()=>{this.element&&this.element.files&&this.element.files.length&&this.fire("done",this.element.files),this.element.value=""}))}})}open(){this.element.click()}}const Pg='';var Og=n(25),Lg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Og.A,Lg);Og.A.locals;class zg extends dg{constructor(t,e){super(t);const n=this.bindTemplate;this.set("isCollapsed",!1),this.set("label",""),this.buttonView=this._createButtonView(),this.children=this.createCollection(),this.set("_collapsibleAriaLabelUid",void 0),e&&this.children.addMany(e),this.setTemplate({tag:"div",attributes:{class:["ck","ck-collapsible",n.if("isCollapsed","ck-collapsible_collapsed")]},children:[this.buttonView,{tag:"div",attributes:{class:["ck","ck-collapsible__children"],role:"region",hidden:n.if("isCollapsed","hidden"),"aria-labelledby":n.to("_collapsibleAriaLabelUid")},children:this.children}]})}render(){super.render(),this._collapsibleAriaLabelUid=this.buttonView.labelView.element.id}focus(){this.buttonView.focus()}_createButtonView(){const t=new Ig(this.locale),e=t.bindTemplate;return t.set({withText:!0,icon:Pg}),t.extendTemplate({attributes:{"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("label").to(this),t.bind("isOn").to(this,"isCollapsed",(t=>!t)),t.on("execute",(()=>{this.isCollapsed=!this.isCollapsed})),t}}var Rg=n(7317),jg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Rg.A,jg);Rg.A.locals;n(6931);n(9047);var Fg=n(4962),Vg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Fg.A,Vg);Fg.A.locals;class Hg extends dg{constructor(t,e){super(t);const n=`ck-labeled-field-view-${k()}`,o=`ck-labeled-field-view-status-${k()}`;this.fieldView=e(this,n,o),this.set("label",void 0),this.set("isEnabled",!0),this.set("isEmpty",!0),this.set("isFocused",!1),this.set("errorText",null),this.set("infoText",null),this.set("class",void 0),this.set("placeholder",void 0),this.labelView=this._createLabelView(n),this.statusView=this._createStatusView(o),this.fieldWrapperChildren=this.createCollection([this.fieldView,this.labelView]),this.bind("_statusText").to(this,"errorText",this,"infoText",((t,e)=>t||e));const i=this.bindTemplate;this.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view",i.to("class"),i.if("isEnabled","ck-disabled",(t=>!t)),i.if("isEmpty","ck-labeled-field-view_empty"),i.if("isFocused","ck-labeled-field-view_focused"),i.if("placeholder","ck-labeled-field-view_placeholder"),i.if("errorText","ck-error")]},children:[{tag:"div",attributes:{class:["ck","ck-labeled-field-view__input-wrapper"]},children:this.fieldWrapperChildren},this.statusView]})}_createLabelView(t){const e=new gg(this.locale);return e.for=t,e.bind("text").to(this,"label"),e}_createStatusView(t){const e=new dg(this.locale),n=this.bindTemplate;return e.setTemplate({tag:"div",attributes:{class:["ck","ck-labeled-field-view__status",n.if("errorText","ck-labeled-field-view__status_error"),n.if("_statusText","ck-hidden",(t=>!t))],id:t,role:n.if("errorText","alert")},children:[{text:n.to("_statusText")}]}),e}focus(t){this.fieldView.focus(t)}}class Ug extends dg{constructor(t){super(t),this.set("value",void 0),this.set("id",void 0),this.set("placeholder",void 0),this.set("tabIndex",void 0),this.set("isReadOnly",!1),this.set("hasError",!1),this.set("ariaDescribedById",void 0),this.set("ariaLabel",void 0),this.focusTracker=new Zi,this.bind("isFocused").to(this.focusTracker),this.set("isEmpty",!0);const e=this.bindTemplate;this.setTemplate({tag:"input",attributes:{class:["ck","ck-input",e.if("isFocused","ck-input_focused"),e.if("isEmpty","ck-input-text_empty"),e.if("hasError","ck-error")],id:e.to("id"),placeholder:e.to("placeholder"),tabindex:e.to("tabIndex"),readonly:e.to("isReadOnly"),"aria-invalid":e.if("hasError",!0),"aria-describedby":e.to("ariaDescribedById"),"aria-label":e.to("ariaLabel")},on:{input:e.to(((...t)=>{this.fire("input",...t),this._updateIsEmpty()})),change:e.to(this._updateIsEmpty.bind(this))}})}render(){super.render(),this.focusTracker.add(this.element),this._setDomElementValue(this.value),this._updateIsEmpty(),this.on("change:value",((t,e,n)=>{this._setDomElementValue(n),this._updateIsEmpty()}))}destroy(){super.destroy(),this.focusTracker.destroy()}select(){this.element.select()}focus(){this.element.focus()}reset(){this.value=this.element.value="",this._updateIsEmpty()}_updateIsEmpty(){this.isEmpty=!this.element.value}_setDomElementValue(t){this.element.value=t||0===t?t:""}}var qg=n(253),Gg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(qg.A,Gg);qg.A.locals;class Wg extends Ug{constructor(t){super(t),this.set("inputMode","text");const e=this.bindTemplate;this.extendTemplate({attributes:{inputmode:e.to("inputMode")}})}}class Kg extends Wg{constructor(t){super(t),this.extendTemplate({attributes:{type:"text",class:["ck-input-text"]}})}}var $g=n(1671),Yg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()($g.A,Yg);$g.A.locals;class Qg extends dg{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-dropdown__panel",e.to("position",(t=>`ck-dropdown__panel_${t}`)),e.if("isVisible","ck-dropdown__panel-visible")],tabindex:"-1"},children:this.children,on:{selectstart:e.to((t=>{"input"!==t.target.tagName.toLocaleLowerCase()&&t.preventDefault()}))}})}focus(){if(this.children.length){const t=this.children.first;"function"==typeof t.focus?t.focus():C("ui-dropdown-panel-focus-child-missing-focus",{childView:this.children.first,dropdownPanel:this})}}focusLast(){if(this.children.length){const t=this.children.last;"function"==typeof t.focusLast?t.focusLast():t.focus()}}}var Zg=n(8149),Jg={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Zg.A,Jg);Zg.A.locals;const Xg=class extends dg{constructor(t,e,n){super(t);const o=this.bindTemplate;this.buttonView=e,this.panelView=n,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("class",void 0),this.set("id",void 0),this.set("panelPosition","auto"),this.panelView.bind("isVisible").to(this,"isOpen"),this.keystrokes=new Ji,this.focusTracker=new Zi,this.setTemplate({tag:"div",attributes:{class:["ck","ck-dropdown",o.to("class"),o.if("isEnabled","ck-disabled",(t=>!t))],id:o.to("id"),"aria-describedby":o.to("ariaDescribedById")},children:[e,n]}),e.extendTemplate({attributes:{class:["ck-dropdown__button"],"data-cke-tooltip-disabled":o.to("isOpen")}})}render(){super.render(),this.focusTracker.add(this.buttonView.element),this.focusTracker.add(this.panelView.element),this.listenTo(this.buttonView,"open",(()=>{this.isOpen=!this.isOpen})),this.on("change:isOpen",((t,e,n)=>{if(n)if("auto"===this.panelPosition){const t=Xg._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions});this.panelView.position=t?t.name:this._panelPositions[0].name}else this.panelView.position=this.panelPosition})),this.keystrokes.listenTo(this.element);const t=(t,e)=>{this.isOpen&&(this.isOpen=!1,e())};this.keystrokes.set("arrowdown",((t,e)=>{this.buttonView.isEnabled&&!this.isOpen&&(this.isOpen=!0,e())})),this.keystrokes.set("arrowright",((t,e)=>{this.isOpen&&e()})),this.keystrokes.set("arrowleft",t),this.keystrokes.set("esc",t)}focus(){this.buttonView.focus()}get _panelPositions(){const{south:t,north:e,southEast:n,southWest:o,northEast:i,northWest:r,southMiddleEast:s,southMiddleWest:a,northMiddleEast:c,northMiddleWest:l}=Xg.defaultPanelPositions;return"rtl"!==this.locale.uiLanguageDirection?[n,o,s,a,t,i,r,c,l,e]:[o,n,a,s,t,r,i,l,c,e]}};let tm=Xg;tm.defaultPanelPositions={south:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/2,name:"s"}),southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),southMiddleEast:(t,e)=>({top:t.bottom,left:t.left-(e.width-t.width)/4,name:"sme"}),southMiddleWest:(t,e)=>({top:t.bottom,left:t.left-3*(e.width-t.width)/4,name:"smw"}),north:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/2,name:"n"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),northMiddleEast:(t,e)=>({top:t.top-e.height,left:t.left-(e.width-t.width)/4,name:"nme"}),northMiddleWest:(t,e)=>({top:t.top-e.height,left:t.left-3*(e.width-t.width)/4,name:"nmw"})},tm._getOptimalPosition=ni;class em extends Ig{constructor(t){super(t),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{"aria-haspopup":!0,"aria-expanded":this.bindTemplate.to("isOn",(t=>String(t)))}}),this.delegate("execute").to(this,"open")}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const t=new yg;return t.content=Pg,t.extendTemplate({attributes:{class:"ck-dropdown__arrow"}}),t}}class nm extends(B()){constructor(t){if(super(),this.focusables=t.focusables,this.focusTracker=t.focusTracker,this.keystrokeHandler=t.keystrokeHandler,this.actions=t.actions,t.actions&&t.keystrokeHandler)for(const e in t.actions){let n=t.actions[e];"string"==typeof n&&(n=[n]);for(const o of n)t.keystrokeHandler.set(o,((t,n)=>{this[e](),n()}))}this.on("forwardCycle",(()=>this.focusFirst()),{priority:"low"}),this.on("backwardCycle",(()=>this.focusLast()),{priority:"low"})}get first(){return this.focusables.find(om)||null}get last(){return this.focusables.filter(om).slice(-1)[0]||null}get next(){return this._getDomFocusableItem(1)}get previous(){return this._getDomFocusableItem(-1)}get current(){let t=null;return null===this.focusTracker.focusedElement?null:(this.focusables.find(((e,n)=>{const o=e.element===this.focusTracker.focusedElement;return o&&(t=n),o})),t)}focusFirst(){this._focus(this.first,1)}focusLast(){this._focus(this.last,-1)}focusNext(){const t=this.next;t&&this.focusables.getIndex(t)===this.current||t===this.first?this.fire("forwardCycle"):this._focus(t,1)}focusPrevious(){const t=this.previous;t&&this.focusables.getIndex(t)===this.current||t===this.last?this.fire("backwardCycle"):this._focus(t,-1)}_focus(t,e){t&&this.focusTracker.focusedElement!==t.element&&t.focus(e)}_getDomFocusableItem(t){const e=this.focusables.length;if(!e)return null;const n=this.current;if(null===n)return this[1===t?"first":"last"];let o=this.focusables.get(n),i=(n+e+t)%e;do{const n=this.focusables.get(i);if(om(n)){o=n;break}i=(i+e+t)%e}while(i!==n);return o}}function om(t){return im(t)&&ti(t.element)}function im(t){return!(!("focus"in t)||"function"!=typeof t.focus)}class rm extends dg{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__separator"]}})}}class sm extends dg{constructor(t){super(t),this.setTemplate({tag:"span",attributes:{class:["ck","ck-toolbar__line-break"]}})}}var am=Object.defineProperty,cm=Object.getOwnPropertySymbols,lm=Object.prototype.hasOwnProperty,dm=Object.prototype.propertyIsEnumerable,um=(t,e,n)=>e in t?am(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,hm=(t,e)=>{for(var n in e||(e={}))lm.call(e,n)&&um(t,n,e[n]);if(cm)for(var n of cm(e))dm.call(e,n)&&um(t,n,e[n]);return t};function gm(t){if(Array.isArray(t))return{items:t,removeItems:[]};const e={items:[],removeItems:[]};return t?hm(hm({},e),t):e}var mm=n(9677),pm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(mm.A,pm);mm.A.locals;const{threeVerticalDots:fm}=jh,km={alignLeft:jh.alignLeft,bold:jh.bold,importExport:jh.importExport,paragraph:jh.paragraph,plus:jh.plus,text:jh.text,threeVerticalDots:jh.threeVerticalDots,pilcrow:jh.pilcrow,dragIndicator:jh.dragIndicator};class bm extends dg{constructor(t,e){super(t);const n=this.bindTemplate,o=this.t;this.options=e||{},this.set("ariaLabel",o("Editor toolbar")),this.set("maxWidth","auto"),this.items=this.createCollection(),this.focusTracker=new Zi,this.keystrokes=new Ji,this.set("class",void 0),this.set("isCompact",!1),this.itemsView=new wm(t),this.children=this.createCollection(),this.children.add(this.itemsView),this.focusables=this.createCollection();const i="rtl"===t.uiLanguageDirection;this._focusCycler=new nm({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:[i?"arrowright":"arrowleft","arrowup"],focusNext:[i?"arrowleft":"arrowright","arrowdown"]}});const r=["ck","ck-toolbar",n.to("class"),n.if("isCompact","ck-toolbar_compact")];var s;this.options.shouldGroupWhenFull&&this.options.isFloating&&r.push("ck-toolbar_floating"),this.setTemplate({tag:"div",attributes:{class:r,role:"toolbar","aria-label":n.to("ariaLabel"),style:{maxWidth:n.to("maxWidth")},tabindex:-1},children:this.children,on:{mousedown:(s=this,s.bindTemplate.to((t=>{t.target===s.element&&t.preventDefault()})))}}),this._behavior=this.options.shouldGroupWhenFull?new _m(this):new Am(this)}render(){super.render(),this.focusTracker.add(this.element);for(const t of this.items)this.focusTracker.add(t.element);this.items.on("add",((t,e)=>{this.focusTracker.add(e.element)})),this.items.on("remove",((t,e)=>{this.focusTracker.remove(e.element)})),this.keystrokes.listenTo(this.element),this._behavior.render(this)}destroy(){return this._behavior.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy(),super.destroy()}focus(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}fillFromConfig(t,e,n){this.items.addMany(this._buildItemsFromConfig(t,e,n))}_buildItemsFromConfig(t,e,n){const o=gm(t),i=n||o.removeItems;return this._cleanItemsConfiguration(o.items,e,i).map((t=>F(t)?this._createNestedToolbarDropdown(t,e,i):"|"===t?new rm:"-"===t?new sm:e.create(t))).filter((t=>!!t))}_cleanItemsConfiguration(t,e,n){const o=t.filter(((t,o,i)=>"|"===t||-1===n.indexOf(t)&&("-"===t?!this.options.shouldGroupWhenFull||(C("toolbarview-line-break-ignored-when-grouping-items",i),!1):!(!F(t)&&!e.has(t))||(C("toolbarview-item-unavailable",{item:t}),!1))));return this._cleanSeparatorsAndLineBreaks(o)}_cleanSeparatorsAndLineBreaks(t){const e=t=>"-"!==t&&"|"!==t,n=t.length,o=t.findIndex(e);if(-1===o)return[];const i=n-t.slice().reverse().findIndex(e);return t.slice(o,i).filter(((t,n,o)=>{if(e(t))return!0;return!(n>0&&o[n-1]===t)}))}_createNestedToolbarDropdown(t,e,n){let{label:o,icon:i,items:r,tooltip:s=!0,withText:a=!1}=t;if(r=this._cleanItemsConfiguration(r,e,n),!r.length)return null;const c=Om(this.locale);return o||C("toolbarview-nested-toolbar-dropdown-missing-label",t),c.class="ck-toolbar__nested-toolbar-dropdown",c.buttonView.set({label:o,tooltip:s,withText:!!a}),!1!==i?c.buttonView.icon=km[i]||i||fm:c.buttonView.withText=!0,Lm(c,(()=>c.toolbarView._buildItemsFromConfig(r,e,n))),c}}class wm extends dg{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-toolbar__items"]},children:this.children})}}class Am{constructor(t){const e=t.bindTemplate;t.set("isVertical",!1),t.itemsView.children.bindTo(t.items).using((t=>t)),t.focusables.bindTo(t.items).using((t=>im(t)?t:null)),t.extendTemplate({attributes:{class:[e.if("isVertical","ck-toolbar_vertical")]}})}render(){}destroy(){}}class _m{constructor(t){this.resizeObserver=null,this.cachedPadding=null,this.shouldUpdateGroupingOnNextResize=!1,this.view=t,this.viewChildren=t.children,this.viewFocusables=t.focusables,this.viewItemsView=t.itemsView,this.viewFocusTracker=t.focusTracker,this.viewLocale=t.locale,this.ungroupedItems=t.createCollection(),this.groupedItems=t.createCollection(),this.groupedItemsDropdown=this._createGroupedItemsDropdown(),t.itemsView.children.bindTo(this.ungroupedItems).using((t=>t)),this.ungroupedItems.on("change",this._updateFocusCyclableItems.bind(this)),t.children.on("change",this._updateFocusCyclableItems.bind(this)),t.items.on("change",((t,e)=>{const n=e.index,o=Array.from(e.added);for(const t of e.removed)n>=this.ungroupedItems.length?this.groupedItems.remove(t):this.ungroupedItems.remove(t);for(let t=n;tthis.ungroupedItems.length?this.groupedItems.add(e,t-this.ungroupedItems.length):this.ungroupedItems.add(e,t)}this._updateGrouping()})),t.extendTemplate({attributes:{class:["ck-toolbar_grouping"]}})}render(t){this.viewElement=t.element,this._enableGroupingOnResize(),this._enableGroupingOnMaxWidthChange(t)}destroy(){this.groupedItemsDropdown.destroy(),this.resizeObserver.destroy()}_updateGrouping(){if(!this.viewElement.ownerDocument.body.contains(this.viewElement))return;if(!ti(this.viewElement))return void(this.shouldUpdateGroupingOnNextResize=!0);const t=this.groupedItems.length;let e;for(;this._areItemsOverflowing;)this._groupLastItem(),e=!0;if(!e&&this.groupedItems.length){for(;this.groupedItems.length&&!this._areItemsOverflowing;)this._ungroupFirstItem();this._areItemsOverflowing&&this._groupLastItem()}this.groupedItems.length!==t&&this.view.fire("groupedItemsUpdate")}get _areItemsOverflowing(){if(!this.ungroupedItems.length)return!1;const t=this.viewElement,e=this.viewLocale.uiLanguageDirection,n=new Ho(t.lastChild),o=new Ho(t);if(!this.cachedPadding){const n=Lo.window.getComputedStyle(t),o="ltr"===e?"paddingRight":"paddingLeft";this.cachedPadding=Number.parseInt(n[o])}return"ltr"===e?n.right>o.right-this.cachedPadding:n.left{t&&t===e.contentRect.width&&!this.shouldUpdateGroupingOnNextResize||(this.shouldUpdateGroupingOnNextResize=!1,this._updateGrouping(),t=e.contentRect.width)})),this._updateGrouping()}_enableGroupingOnMaxWidthChange(t){t.on("change:maxWidth",(()=>{this._updateGrouping()}))}_groupLastItem(){this.groupedItems.length||(this.viewChildren.add(new rm),this.viewChildren.add(this.groupedItemsDropdown),this.viewFocusTracker.add(this.groupedItemsDropdown.element)),this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last),0)}_ungroupFirstItem(){this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)),this.groupedItems.length||(this.viewChildren.remove(this.groupedItemsDropdown),this.viewChildren.remove(this.viewChildren.last),this.viewFocusTracker.remove(this.groupedItemsDropdown.element))}_createGroupedItemsDropdown(){const t=this.viewLocale,e=t.t,n=Om(t);return n.class="ck-toolbar__grouped-dropdown",n.panelPosition="ltr"===t.uiLanguageDirection?"sw":"se",Lm(n,this.groupedItems),n.buttonView.set({label:e("Show more items"),tooltip:!0,tooltipPosition:"rtl"===t.uiLanguageDirection?"se":"sw",icon:fm}),n}_updateFocusCyclableItems(){this.viewFocusables.clear(),this.ungroupedItems.map((t=>{im(t)&&this.viewFocusables.add(t)})),this.groupedItems.length&&this.viewFocusables.add(this.groupedItemsDropdown)}}class Cm extends dg{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!0),this.children=this.createCollection(),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__item",e.if("isVisible","ck-hidden",(t=>!t))],role:"presentation"},children:this.children})}focus(){this.children.first&&this.children.first.focus()}}class vm extends dg{constructor(t){super(t),this.setTemplate({tag:"li",attributes:{class:["ck","ck-list__separator"]}})}}class ym extends dg{constructor(t,e=new gg){super(t);const n=this.bindTemplate,o=new Dm(t);this.set({label:"",isVisible:!0}),this.labelView=e,this.labelView.bind("text").to(this,"label"),this.children=this.createCollection(),this.children.addMany([this.labelView,o]),o.set({role:"group",ariaLabelledBy:e.id}),o.focusTracker.destroy(),o.keystrokes.destroy(),this.items=o.items,this.setTemplate({tag:"li",attributes:{role:"presentation",class:["ck","ck-list__group",n.if("isVisible","ck-hidden",(t=>!t))]},children:this.children})}focus(){if(this.items){const t=this.items.find((t=>!(t instanceof vm)));t&&t.focus()}}}var xm=n(5199),Em={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(xm.A,Em);xm.A.locals;class Dm extends dg{constructor(t){super(t),this._listItemGroupToChangeListeners=new WeakMap;const e=this.bindTemplate;this.focusables=new Fh,this.items=this.createCollection(),this.focusTracker=new Zi,this.keystrokes=new Ji,this._focusCycler=new nm({focusables:this.focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"arrowup",focusNext:"arrowdown"}}),this.set("ariaLabel",void 0),this.set("ariaLabelledBy",void 0),this.set("role",void 0),this.setTemplate({tag:"ul",attributes:{class:["ck","ck-reset","ck-list"],role:e.to("role"),"aria-label":e.to("ariaLabel"),"aria-labelledby":e.to("ariaLabelledBy")},children:this.items})}render(){super.render();for(const t of this.items)t instanceof ym?this._registerFocusableItemsGroup(t):t instanceof Cm&&this._registerFocusableListItem(t);this.items.on("change",((t,e)=>{for(const t of e.removed)t instanceof ym?this._deregisterFocusableItemsGroup(t):t instanceof Cm&&this._deregisterFocusableListItem(t);for(const t of Array.from(e.added).reverse())t instanceof ym?this._registerFocusableItemsGroup(t,e.index):this._registerFocusableListItem(t,e.index)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}focusFirst(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}_registerFocusableListItem(t,e){this.focusTracker.add(t.element),this.focusables.add(t,e)}_deregisterFocusableListItem(t){this.focusTracker.remove(t.element),this.focusables.remove(t)}_getOnGroupItemsChangeCallback(t){return(e,n)=>{for(const t of n.removed)this._deregisterFocusableListItem(t);for(const e of Array.from(n.added).reverse())this._registerFocusableListItem(e,this.items.getIndex(t)+n.index)}}_registerFocusableItemsGroup(t,e){Array.from(t.items).forEach(((t,n)=>{const o=void 0!==e?e+n:void 0;this._registerFocusableListItem(t,o)}));const n=this._getOnGroupItemsChangeCallback(t);this._listItemGroupToChangeListeners.set(t,n),t.items.on("change",n)}_deregisterFocusableItemsGroup(t){for(const e of t.items)this._deregisterFocusableListItem(e);t.items.off("change",this._listItemGroupToChangeListeners.get(t)),this._listItemGroupToChangeListeners.delete(t)}}var Im=n(1792),Mm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Im.A,Mm);Im.A.locals;class Tm extends dg{constructor(t,e){super(t);const n=this.bindTemplate;this.set("class",void 0),this.set("labelStyle",void 0),this.set("icon",void 0),this.set("isEnabled",!0),this.set("isOn",!1),this.set("isToggleable",!1),this.set("isVisible",!0),this.set("keystroke",void 0),this.set("withKeystroke",!1),this.set("label",void 0),this.set("tabindex",-1),this.set("tooltip",!1),this.set("tooltipPosition","s"),this.set("type","button"),this.set("withText",!1),this.children=this.createCollection(),this.actionView=this._createActionView(e),this.arrowView=this._createArrowView(),this.keystrokes=new Ji,this.focusTracker=new Zi,this.setTemplate({tag:"div",attributes:{class:["ck","ck-splitbutton",n.to("class"),n.if("isVisible","ck-hidden",(t=>!t)),this.arrowView.bindTemplate.if("isOn","ck-splitbutton_open")]},children:this.children})}render(){super.render(),this.children.add(this.actionView),this.children.add(this.arrowView),this.focusTracker.add(this.actionView.element),this.focusTracker.add(this.arrowView.element),this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",((t,e)=>{this.focusTracker.focusedElement===this.actionView.element&&(this.arrowView.focus(),e())})),this.keystrokes.set("arrowleft",((t,e)=>{this.focusTracker.focusedElement===this.arrowView.element&&(this.actionView.focus(),e())}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this.actionView.focus()}_createActionView(t){const e=t||new Ig;return t||e.bind("icon","isEnabled","isOn","isToggleable","keystroke","label","tabindex","tooltip","tooltipPosition","type","withText").to(this),e.extendTemplate({attributes:{class:"ck-splitbutton__action"}}),e.delegate("execute").to(this),e}_createArrowView(){const t=new Ig,e=t.bindTemplate;return t.icon=Pg,t.extendTemplate({attributes:{class:["ck-splitbutton__arrow"],"data-cke-tooltip-disabled":e.to("isOn"),"aria-haspopup":!0,"aria-expanded":e.to("isOn",(t=>String(t)))}}),t.bind("isEnabled").to(this),t.bind("label").to(this),t.bind("tooltip").to(this),t.delegate("execute").to(this,"open"),t}}var Sm=n(1666),Bm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Sm.A,Bm);Sm.A.locals;var Nm=n(3629),Pm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Nm.A,Pm);Nm.A.locals;function Om(e,n=em){const o="function"==typeof n?new n(e):n,i=new Qg(e),r=new tm(e,o,i);return o.bind("isEnabled").to(r),o instanceof Tm?o.arrowView.bind("isOn").to(r,"isOpen"):o.bind("isOn").to(r,"isOpen"),function(e){(function(e){e.on("render",(()=>{t({emitter:e,activator:()=>e.isOpen,callback:()=>{e.isOpen=!1},contextElements:()=>[e.element,...e.focusTracker._elements]})}))})(e),function(t){t.on("execute",(e=>{e.source instanceof Sg||(t.isOpen=!1)}))}(e),function(t){t.focusTracker.on("change:isFocused",((e,n,o)=>{t.isOpen&&!o&&(t.isOpen=!1)}))}(e),function(t){t.keystrokes.set("arrowdown",((e,n)=>{t.isOpen&&(t.panelView.focus(),n())})),t.keystrokes.set("arrowup",((e,n)=>{t.isOpen&&(t.panelView.focusLast(),n())}))}(e),function(t){t.on("change:isOpen",((e,n,o)=>{if(o)return;const i=t.panelView.element;i&&i.contains(Lo.document.activeElement)&&t.buttonView.focus()}))}(e),function(t){t.on("change:isOpen",((e,n,o)=>{o&&t.panelView.focus()}),{priority:"low"})}(e)}(r),r}function Lm(t,e,n={}){t.extendTemplate({attributes:{class:["ck-toolbar-dropdown"]}}),t.isOpen?zm(t,e,n):t.once("change:isOpen",(()=>zm(t,e,n)),{priority:"highest"}),n.enableActiveItemFocusOnDropdownOpen&&Fm(t,(()=>t.toolbarView.items.find((t=>t.isOn))))}function zm(t,e,n){const o=t.locale,i=o.t,r=t.toolbarView=new bm(o),s="function"==typeof e?e():e;r.ariaLabel=n.ariaLabel||i("Dropdown toolbar"),n.maxWidth&&(r.maxWidth=n.maxWidth),n.class&&(r.class=n.class),n.isCompact&&(r.isCompact=n.isCompact),n.isVertical&&(r.isVertical=!0),s instanceof Fh?r.items.bindTo(s).using((t=>t)):r.items.addMany(s),t.panelView.children.add(r),r.items.delegate("execute").to(t)}function Rm(t,e,n={}){t.isOpen?jm(t,e,n):t.once("change:isOpen",(()=>jm(t,e,n)),{priority:"highest"}),Fm(t,(()=>t.listView.items.find((t=>t instanceof Cm&&t.children.first.isOn))))}function jm(t,e,n){const o=t.locale,i=t.listView=new Dm(o),r="function"==typeof e?e():e;i.ariaLabel=n.ariaLabel,i.role=n.role,Vm(t,i.items,r,o),t.panelView.children.add(i),i.items.delegate("execute").to(t)}function Fm(t,e){t.on("change:isOpen",(()=>{if(!t.isOpen)return;const n=e();n&&("function"==typeof n.focus?n.focus():C("ui-dropdown-focus-child-on-open-child-missing-focus",{view:n}))}),{priority:b.low-10})}function Vm(t,e,n,o){e.bindTo(n).using((e=>{if("separator"===e.type)return new vm(o);if("group"===e.type){const n=new ym(o);return n.set({label:e.label}),Vm(t,n.items,e.items,o),n.items.delegate("execute").to(t),n}if("button"===e.type||"switchbutton"===e.type){const t=new Cm(o);let n;return"button"===e.type?(n=new Ig(o),n.bind("ariaChecked").to(n,"isOn")):n=new Sg(o),n.bind(...Object.keys(e.model)).to(e.model),n.delegate("execute").to(t),t.children.add(n),t}return null}))}const Hm=(t,e,n)=>{const o=new Kg(t.locale);return o.set({id:e,ariaDescribedById:n}),o.bind("isReadOnly").to(t,"isEnabled",(t=>!t)),o.bind("hasError").to(t,"errorText",(t=>!!t)),o.on("input",(()=>{t.errorText=null})),t.bind("isEmpty","isFocused","placeholder").to(o),o};Math.PI;const Um=Symbol("same"),qm=(Symbol("color"),Symbol("hsva"),Symbol("update")),Gm=(Symbol("parts"),Symbol("css")),Wm=Symbol("sliders");HTMLElement;var Km=n(1905),$m={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Km.A,$m);Km.A.locals;K(Yi);const{eraser:Ym,colorPalette:Qm}=jh;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var Zm=n(6309),Jm={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Zm.A,Jm);Zm.A.locals;class Xm{constructor(t){this._components=new Map,this.editor=t}*names(){for(const t of this._components.values())yield t.originalName}add(t,e){this._components.set(tp(t),{callback:e,originalName:t})}create(t){if(!this.has(t))throw new _("componentfactory-item-missing",this,{name:t});return this._components.get(tp(t)).callback(this.editor.locale)}has(t){return this._components.has(tp(t))}}function tp(t){return String(t).toLowerCase()}var ep=n(7913),np={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ep.A,np);ep.A.locals;class op extends dg{constructor(t,e={}){super(t);const n=this.bindTemplate;this.set("label",e.label||""),this.set("class",e.class||null),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-form__header",n.to("class")]},children:this.children}),e.icon&&(this.iconView=new yg,this.iconView.content=e.icon,this.children.add(this.iconView));const o=new dg(t);o.setTemplate({tag:"h2",attributes:{class:["ck","ck-form__header__label"],role:"presentation"},children:[{text:n.to("label")}]}),this.children.add(o)}}var ip=n(9822),rp={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ip.A,rp);ip.A.locals;class sp extends dg{constructor(t){super(t),this.children=this.createCollection(),this.keystrokes=new Ji,this._focusTracker=new Zi,this._focusables=new Fh,this.focusCycler=new nm({focusables:this._focusables,focusTracker:this._focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-dialog__actions"]},children:this.children})}render(){super.render(),this.keystrokes.listenTo(this.element)}setButtons(t){for(const e of t){const t=new Ig(this.locale);let n;for(n in t.on("execute",(()=>e.onExecute())),e.onCreate&&e.onCreate(t),e)"onExecute"!=n&&"onCreate"!=n&&t.set(n,e[n]);this.children.add(t)}this._updateFocusCyclableItems()}focus(t){-1===t?this.focusCycler.focusLast():this.focusCycler.focusFirst()}_updateFocusCyclableItems(){Array.from(this.children).forEach((t=>{this._focusables.add(t),this._focusTracker.add(t.element)}))}}class ap extends dg{constructor(t){super(t),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-dialog__content"]},children:this.children})}reset(){for(;this.children.length;)this.children.remove(0)}}var cp=n(9819),lp={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(cp.A,lp);cp.A.locals;const dp="screen-center",up="editor-center",hp="editor-top-side",gp="editor-top-center",mp="editor-bottom-center",pp="editor-above-center",fp="editor-below-center",kp=Qo("px"),bp=class extends(function(t){return class extends t{constructor(...t){super(...t),this._onDragBound=this._onDrag.bind(this),this._onDragEndBound=this._onDragEnd.bind(this),this._lastDraggingCoordinates={x:0,y:0},this.on("render",(()=>{this._attachListeners()})),this.set("isDragging",!1)}_attachListeners(){this.listenTo(this.element,"mousedown",this._onDragStart.bind(this)),this.listenTo(this.element,"touchstart",this._onDragStart.bind(this))}_attachDragListeners(){this.listenTo(Lo.document,"mouseup",this._onDragEndBound),this.listenTo(Lo.document,"touchend",this._onDragEndBound),this.listenTo(Lo.document,"mousemove",this._onDragBound),this.listenTo(Lo.document,"touchmove",this._onDragBound)}_detachDragListeners(){this.stopListening(Lo.document,"mouseup",this._onDragEndBound),this.stopListening(Lo.document,"touchend",this._onDragEndBound),this.stopListening(Lo.document,"mousemove",this._onDragBound),this.stopListening(Lo.document,"touchmove",this._onDragBound)}_onDragStart(t,e){if(!this._isHandleElementPressed(e))return;this._attachDragListeners();let n=0,o=0;e instanceof MouseEvent?(n=e.clientX,o=e.clientY):(n=e.touches[0].clientX,o=e.touches[0].clientY),this._lastDraggingCoordinates={x:n,y:o},this.isDragging=!0}_onDrag(t,e){if(!this.isDragging)return void this._detachDragListeners();let n=0,o=0;e instanceof MouseEvent?(n=e.clientX,o=e.clientY):(n=e.touches[0].clientX,o=e.touches[0].clientY),e.preventDefault(),this.fire("drag",{deltaX:Math.round(n-this._lastDraggingCoordinates.x),deltaY:Math.round(o-this._lastDraggingCoordinates.y)}),this._lastDraggingCoordinates={x:n,y:o}}_onDragEnd(){this._detachDragListeners(),this.isDragging=!1}_isHandleElementPressed(t){return!!this.dragHandleElement&&(this.dragHandleElement===t.target||t.target instanceof HTMLElement&&this.dragHandleElement.contains(t.target))}}}(dg)){constructor(t,{getCurrentDomRoot:e,getViewportOffset:n}){super(t),this.wasMoved=!1;const o=this.bindTemplate,i=t.t;this.set("className",""),this.set("ariaLabel",i("Editor dialog")),this.set("isModal",!1),this.set("position",dp),this.set("_isVisible",!1),this.set("_isTransparent",!1),this.set("_top",0),this.set("_left",0),this._getCurrentDomRoot=e,this._getViewportOffset=n,this.decorate("moveTo"),this.parts=this.createCollection(),this.keystrokes=new Ji,this.focusTracker=new Zi,this._focusables=new Fh,this._focusCycler=new nm({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-dialog-overlay",o.if("isModal","ck-dialog-overlay__transparent",(t=>!t)),o.if("_isVisible","ck-hidden",(t=>!t))],tabindex:"-1"},children:[{tag:"div",attributes:{tabindex:"-1",class:["ck","ck-dialog",o.to("className")],role:"dialog","aria-label":o.to("ariaLabel"),style:{top:o.to("_top",(t=>kp(t))),left:o.to("_left",(t=>kp(t))),visibility:o.if("_isTransparent","hidden")}},children:this.parts}]})}render(){super.render(),this.keystrokes.set("Esc",((t,e)=>{this.fire("close",{source:"escKeyPress"}),e()})),this.on("drag",((t,{deltaX:e,deltaY:n})=>{this.wasMoved=!0,this.moveBy(e,n)})),this.listenTo(Lo.window,"resize",(()=>{this._isVisible&&!this.wasMoved&&this.updatePosition()})),this.listenTo(Lo.document,"scroll",(()=>{this._isVisible&&!this.wasMoved&&this.updatePosition()})),this.on("change:_isVisible",((t,e,n)=>{n&&(this._isTransparent=!0,setTimeout((()=>{this.updatePosition(),this._isTransparent=!1,this.focus()}),10))})),this.keystrokes.listenTo(this.element)}get dragHandleElement(){return this.headerView?this.headerView.element:null}setupParts({icon:t,title:e,hasCloseButton:n=!0,content:o,actionButtons:i}){e&&(this.headerView=new op(this.locale,{icon:t}),n&&(this.closeButtonView=this._createCloseButton(),this.headerView.children.add(this.closeButtonView)),this.headerView.label=e,this.ariaLabel=e,this.parts.add(this.headerView,0)),o&&(o instanceof dg&&(o=[o]),this.contentView=new ap(this.locale),this.contentView.children.addMany(o),this.parts.add(this.contentView)),i&&(this.actionsView=new sp(this.locale),this.actionsView.setButtons(i),this.parts.add(this.actionsView)),this._updateFocusCyclableItems()}focus(){this._focusCycler.focusFirst()}moveTo(t,e){const n=this._getViewportRect(),o=this._getDialogRect();t+o.width>n.right&&(t=n.right-o.width),t{var e;this._focusables.add(t),this.focusTracker.add(t.element),im(e=t)&&"focusCycler"in e&&e.focusCycler instanceof nm&&(this.listenTo(t.focusCycler,"forwardCycle",(t=>{this._focusCycler.focusNext(),this._focusCycler.next!==this._focusCycler.focusables.get(this._focusCycler.current)&&t.stop()})),this.listenTo(t.focusCycler,"backwardCycle",(t=>{this._focusCycler.focusPrevious(),this._focusCycler.previous!==this._focusCycler.focusables.get(this._focusCycler.current)&&t.stop()})))}))}_createCloseButton(){const t=new Ig(this.locale),e=this.locale.t;return t.set({label:e("Close"),tooltip:!0,icon:jh.cancel}),t.on("execute",(()=>this.fire("close",{source:"closeButton"}))),t}};let wp=bp;wp.defaultOffset=15;class Ap extends rr{constructor(t){super(t);const e=t.t;this._initShowHideListeners(),this._initFocusToggler(),this._initMultiRootIntegration(),this.set("id",null),t.accessibility.addKeystrokeInfos({categoryId:"navigation",keystrokes:[{label:e("Move focus in and out of an active dialog window"),keystroke:"Ctrl+F6",mayRequireFn:!0}]})}static get pluginName(){return"Dialog"}_initShowHideListeners(){this.on("show",((t,e)=>{this._show(e)})),this.on("show",((t,e)=>{e.onShow&&e.onShow(this)}),{priority:"low"}),this.on("hide",(()=>{Ap._visibleDialogPlugin&&Ap._visibleDialogPlugin._hide()})),this.on("hide",(()=>{this._onHide&&(this._onHide(this),this._onHide=void 0)}),{priority:"low"})}_initFocusToggler(){const t=this.editor;t.keystrokes.set("Ctrl+F6",((e,n)=>{this.isOpen&&!this.view.isModal&&(this.view.focusTracker.isFocused?t.editing.view.focus():this.view.focus(),n())}))}_initMultiRootIntegration(){const t=this.editor.model;t.document.on("change:data",(()=>{if(!this.view)return;const e=t.document.differ.getChangedRoots();for(const t of e)t.state&&this.view.updatePosition()}))}show(t){this.hide(),this.fire(`show:${t.id}`,t)}_show({id:t,icon:e,title:n,hasCloseButton:o=!0,content:i,actionButtons:r,className:s,isModal:a,position:c,onHide:l}){const d=this.editor;this.view=new wp(d.locale,{getCurrentDomRoot:()=>d.editing.view.getDomRoot(d.model.document.selection.anchor.root.rootName),getViewportOffset:()=>d.ui.viewportOffset});const u=this.view;u.on("close",(()=>{this.hide()})),d.ui.view.body.add(u),d.ui.focusTracker.add(u.element),d.keystrokes.listenTo(u.element),c||(c=a?dp:up),u.set({position:c,_isVisible:!0,className:s,isModal:a}),u.setupParts({icon:e,title:n,hasCloseButton:o,content:i,actionButtons:r}),this.id=t,l&&(this._onHide=l),this.isOpen=!0,Ap._visibleDialogPlugin=this}hide(){Ap._visibleDialogPlugin&&Ap._visibleDialogPlugin.fire(`hide:${Ap._visibleDialogPlugin.id}`)}_hide(){if(!this.view)return;const t=this.editor,e=this.view;e.contentView&&e.contentView.reset(),t.ui.view.body.remove(e),t.ui.focusTracker.remove(e.element),t.keystrokes.stopListening(e.element),e.destroy(),t.editing.view.focus(),this.id=null,this.isOpen=!1,Ap._visibleDialogPlugin=null}}var _p=n(3710),Cp={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(_p.A,Cp);_p.A.locals;var vp=Object.defineProperty,yp=Object.getOwnPropertySymbols,xp=Object.prototype.hasOwnProperty,Ep=Object.prototype.propertyIsEnumerable,Dp=(t,e,n)=>e in t?vp(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Ip=(t,e)=>{for(var n in e||(e={}))xp.call(e,n)&&Dp(t,n,e[n]);if(yp)for(var n of yp(e))Ep.call(e,n)&&Dp(t,n,e[n]);return t};const Mp=Qo("px"),Tp=Lo.document.body,Sp={top:-99999,left:-99999,name:"arrowless",config:{withArrow:!1}},Bp=class extends dg{constructor(t){super(t);const e=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("position","arrow_nw"),this.set("isVisible",!1),this.set("withArrow",!0),this.set("class",void 0),this._pinWhenIsVisibleCallback=null,this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-panel",e.to("position",(t=>`ck-balloon-panel_${t}`)),e.if("isVisible","ck-balloon-panel_visible"),e.if("withArrow","ck-balloon-panel_with-arrow"),e.to("class")],style:{top:e.to("top",Mp),left:e.to("left",Mp)}},children:this.content})}show(){this.isVisible=!0}hide(){this.isVisible=!1}attachTo(t){this.show();const e=Bp.defaultPositions,n=Object.assign({},{element:this.element,positions:[e.southArrowNorth,e.southArrowNorthMiddleWest,e.southArrowNorthMiddleEast,e.southArrowNorthWest,e.southArrowNorthEast,e.northArrowSouth,e.northArrowSouthMiddleWest,e.northArrowSouthMiddleEast,e.northArrowSouthWest,e.northArrowSouthEast,e.viewportStickyNorth],limiter:Tp,fitInViewport:!0},t),o=Bp._getOptimalPosition(n)||Sp,i=parseInt(o.left),r=parseInt(o.top),s=o.name,a=o.config||{},{withArrow:c=!0}=a;this.top=r,this.left=i,this.position=s,this.withArrow=c}pin(t){this.unpin(),this._pinWhenIsVisibleCallback=()=>{this.isVisible?this._startPinning(t):this._stopPinning()},this._startPinning(t),this.listenTo(this,"change:isVisible",this._pinWhenIsVisibleCallback)}unpin(){this._pinWhenIsVisibleCallback&&(this._stopPinning(),this.stopListening(this,"change:isVisible",this._pinWhenIsVisibleCallback),this._pinWhenIsVisibleCallback=null,this.hide())}_startPinning(t){this.attachTo(t);const e=Pp(t.target),n=t.limiter?Pp(t.limiter):Tp;this.listenTo(Lo.document,"scroll",((o,i)=>{const r=i.target,s=e&&r.contains(e),a=n&&r.contains(n);!s&&!a&&e&&n||this.attachTo(t)}),{useCapture:!0}),this.listenTo(Lo.window,"resize",(()=>{this.attachTo(t)}))}_stopPinning(){this.stopListening(Lo.document,"scroll"),this.stopListening(Lo.window,"resize")}};let Np=Bp;function Pp(t){return xo(t)?t:jo(t)?t.commonAncestorContainer:"function"==typeof t?Pp(t()):null}function Op(t={}){const{sideOffset:e=Np.arrowSideOffset,heightOffset:n=Np.arrowHeightOffset,stickyVerticalOffset:o=Np.stickyVerticalOffset,config:i}=t;return{northWestArrowSouthWest:(t,n)=>Ip({top:r(t,n),left:t.left-e,name:"arrow_sw"},i&&{config:i}),northWestArrowSouthMiddleWest:(t,n)=>Ip({top:r(t,n),left:t.left-.25*n.width-e,name:"arrow_smw"},i&&{config:i}),northWestArrowSouth:(t,e)=>Ip({top:r(t,e),left:t.left-e.width/2,name:"arrow_s"},i&&{config:i}),northWestArrowSouthMiddleEast:(t,n)=>Ip({top:r(t,n),left:t.left-.75*n.width+e,name:"arrow_sme"},i&&{config:i}),northWestArrowSouthEast:(t,n)=>Ip({top:r(t,n),left:t.left-n.width+e,name:"arrow_se"},i&&{config:i}),northArrowSouthWest:(t,n)=>Ip({top:r(t,n),left:t.left+t.width/2-e,name:"arrow_sw"},i&&{config:i}),northArrowSouthMiddleWest:(t,n)=>Ip({top:r(t,n),left:t.left+t.width/2-.25*n.width-e,name:"arrow_smw"},i&&{config:i}),northArrowSouth:(t,e)=>Ip({top:r(t,e),left:t.left+t.width/2-e.width/2,name:"arrow_s"},i&&{config:i}),northArrowSouthMiddleEast:(t,n)=>Ip({top:r(t,n),left:t.left+t.width/2-.75*n.width+e,name:"arrow_sme"},i&&{config:i}),northArrowSouthEast:(t,n)=>Ip({top:r(t,n),left:t.left+t.width/2-n.width+e,name:"arrow_se"},i&&{config:i}),northEastArrowSouthWest:(t,n)=>Ip({top:r(t,n),left:t.right-e,name:"arrow_sw"},i&&{config:i}),northEastArrowSouthMiddleWest:(t,n)=>Ip({top:r(t,n),left:t.right-.25*n.width-e,name:"arrow_smw"},i&&{config:i}),northEastArrowSouth:(t,e)=>Ip({top:r(t,e),left:t.right-e.width/2,name:"arrow_s"},i&&{config:i}),northEastArrowSouthMiddleEast:(t,n)=>Ip({top:r(t,n),left:t.right-.75*n.width+e,name:"arrow_sme"},i&&{config:i}),northEastArrowSouthEast:(t,n)=>Ip({top:r(t,n),left:t.right-n.width+e,name:"arrow_se"},i&&{config:i}),southWestArrowNorthWest:t=>Ip({top:s(t),left:t.left-e,name:"arrow_nw"},i&&{config:i}),southWestArrowNorthMiddleWest:(t,n)=>Ip({top:s(t),left:t.left-.25*n.width-e,name:"arrow_nmw"},i&&{config:i}),southWestArrowNorth:(t,e)=>Ip({top:s(t),left:t.left-e.width/2,name:"arrow_n"},i&&{config:i}),southWestArrowNorthMiddleEast:(t,n)=>Ip({top:s(t),left:t.left-.75*n.width+e,name:"arrow_nme"},i&&{config:i}),southWestArrowNorthEast:(t,n)=>Ip({top:s(t),left:t.left-n.width+e,name:"arrow_ne"},i&&{config:i}),southArrowNorthWest:t=>Ip({top:s(t),left:t.left+t.width/2-e,name:"arrow_nw"},i&&{config:i}),southArrowNorthMiddleWest:(t,n)=>Ip({top:s(t),left:t.left+t.width/2-.25*n.width-e,name:"arrow_nmw"},i&&{config:i}),southArrowNorth:(t,e)=>Ip({top:s(t),left:t.left+t.width/2-e.width/2,name:"arrow_n"},i&&{config:i}),southArrowNorthMiddleEast:(t,n)=>Ip({top:s(t),left:t.left+t.width/2-.75*n.width+e,name:"arrow_nme"},i&&{config:i}),southArrowNorthEast:(t,n)=>Ip({top:s(t),left:t.left+t.width/2-n.width+e,name:"arrow_ne"},i&&{config:i}),southEastArrowNorthWest:t=>Ip({top:s(t),left:t.right-e,name:"arrow_nw"},i&&{config:i}),southEastArrowNorthMiddleWest:(t,n)=>Ip({top:s(t),left:t.right-.25*n.width-e,name:"arrow_nmw"},i&&{config:i}),southEastArrowNorth:(t,e)=>Ip({top:s(t),left:t.right-e.width/2,name:"arrow_n"},i&&{config:i}),southEastArrowNorthMiddleEast:(t,n)=>Ip({top:s(t),left:t.right-.75*n.width+e,name:"arrow_nme"},i&&{config:i}),southEastArrowNorthEast:(t,n)=>Ip({top:s(t),left:t.right-n.width+e,name:"arrow_ne"},i&&{config:i}),westArrowEast:(t,e)=>Ip({top:t.top+t.height/2-e.height/2,left:t.left-e.width-n,name:"arrow_e"},i&&{config:i}),eastArrowWest:(t,e)=>Ip({top:t.top+t.height/2-e.height/2,left:t.right+n,name:"arrow_w"},i&&{config:i}),viewportStickyNorth:(t,e,n,r)=>{const s=r||n;return t.getIntersection(s)?s.height-t.height>o?null:{top:s.top+o,left:t.left+t.width/2-e.width/2,name:"arrowless",config:Ip({withArrow:!1},i)}:null}};function r(t,e){return t.top-e.height-n}function s(t){return t.bottom+n}}Np.arrowSideOffset=25,Np.arrowHeightOffset=10,Np.stickyVerticalOffset=20,Np._getOptimalPosition=ni,Np.defaultPositions=Op();var Lp=n(9205),zp={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Lp.A,zp);Lp.A.locals;const Rp="ck-tooltip",jp=class extends(Bo()){constructor(t){if(super(),this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this._resizeObserver=null,this._mutationObserver=null,jp._editors.add(t),jp._instance)return jp._instance;jp._instance=this,this.tooltipTextView=new dg(t.locale),this.tooltipTextView.set("text",""),this.tooltipTextView.setTemplate({tag:"span",attributes:{class:["ck","ck-tooltip__text"]},children:[{text:this.tooltipTextView.bindTemplate.to("text")}]}),this.balloonPanelView=new Np(t.locale),this.balloonPanelView.class=Rp,this.balloonPanelView.content.add(this.tooltipTextView),this._mutationObserver=function(t){const e=new MutationObserver((()=>{t()}));return{attach(t){e.observe(t,{attributes:!0,attributeFilter:["data-cke-tooltip-text","data-cke-tooltip-position"]})},detach(){e.disconnect()}}}((()=>{this._updateTooltipPosition()})),this._pinTooltipDebounced=$a(this._pinTooltip,600),this._unpinTooltipDebounced=$a(this._unpinTooltip,400),this.listenTo(Lo.document,"keydown",this._onKeyDown.bind(this),{useCapture:!0}),this.listenTo(Lo.document,"mouseenter",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(Lo.document,"mouseleave",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(Lo.document,"focus",this._onEnterOrFocus.bind(this),{useCapture:!0}),this.listenTo(Lo.document,"blur",this._onLeaveOrBlur.bind(this),{useCapture:!0}),this.listenTo(Lo.document,"scroll",this._onScroll.bind(this),{useCapture:!0}),this._watchdogExcluded=!0}destroy(t){const e=t.ui.view&&t.ui.view.body;jp._editors.delete(t),this.stopListening(t.ui),e&&e.has(this.balloonPanelView)&&e.remove(this.balloonPanelView),jp._editors.size||(this._unpinTooltip(),this.balloonPanelView.destroy(),this.stopListening(),jp._instance=null)}static getPositioningFunctions(t){const e=jp.defaultBalloonPositions;return{s:[e.southArrowNorth,e.southArrowNorthEast,e.southArrowNorthWest],n:[e.northArrowSouth],e:[e.eastArrowWest],w:[e.westArrowEast],sw:[e.southArrowNorthEast],se:[e.southArrowNorthWest]}[t]}_onKeyDown(t,e){"Escape"===e.key&&this._currentElementWithTooltip&&(this._unpinTooltip(),e.stopPropagation())}_onEnterOrFocus(t,{target:e}){const n=Vp(e);n?n!==this._currentElementWithTooltip&&(this._unpinTooltip(),this._pinTooltipDebounced(n,Hp(n))):"focus"===t.name&&this._unpinTooltip()}_onLeaveOrBlur(t,{target:e,relatedTarget:n}){if("mouseleave"===t.name){if(!xo(e))return;const t=this.balloonPanelView.element,o=t&&(t===n||t.contains(n)),i=!o&&e===t;if(o)return void this._unpinTooltipDebounced.cancel();if(!i&&this._currentElementWithTooltip&&e!==this._currentElementWithTooltip)return;const r=Vp(e),s=Vp(n);(i||r&&r!==s)&&this._unpinTooltipDebounced()}else{if(this._currentElementWithTooltip&&e!==this._currentElementWithTooltip)return;this._unpinTooltipDebounced()}}_onScroll(t,{target:e}){this._currentElementWithTooltip&&(e.contains(this.balloonPanelView.element)&&e.contains(this._currentElementWithTooltip)||this._unpinTooltip())}_pinTooltip(t,{text:e,position:n,cssClass:o}){this._unpinTooltip();const i=Qi(jp._editors.values()).ui.view.body;i.has(this.balloonPanelView)||i.add(this.balloonPanelView),this.tooltipTextView.text=e,this.balloonPanelView.pin({target:t,positions:jp.getPositioningFunctions(n)}),this._resizeObserver=new $o(t,(()=>{ti(t)||this._unpinTooltip()})),this._mutationObserver.attach(t),this.balloonPanelView.class=[Rp,o].filter((t=>t)).join(" ");for(const t of jp._editors)this.listenTo(t.ui,"update",this._updateTooltipPosition.bind(this),{priority:"low"});this._currentElementWithTooltip=t,this._currentTooltipPosition=n}_unpinTooltip(){this._unpinTooltipDebounced.cancel(),this._pinTooltipDebounced.cancel(),this.balloonPanelView.unpin();for(const t of jp._editors)this.stopListening(t.ui,"update");this._currentElementWithTooltip=null,this._currentTooltipPosition=null,this.tooltipTextView.text="",this._resizeObserver&&this._resizeObserver.destroy(),this._mutationObserver.detach()}_updateTooltipPosition(){const t=Hp(this._currentElementWithTooltip);ti(this._currentElementWithTooltip)&&t.text?this.balloonPanelView.pin({target:this._currentElementWithTooltip,positions:jp.getPositioningFunctions(t.position)}):this._unpinTooltip()}};let Fp=jp;function Vp(t){return xo(t)?t.closest("[data-cke-tooltip-text]:not([data-cke-tooltip-disabled])"):null}function Hp(t){return{text:t.dataset.ckeTooltipText,position:t.dataset.ckeTooltipPosition||"s",cssClass:t.dataset.ckeTooltipClass||""}}Fp.defaultBalloonPositions=Op({heightOffset:5,sideOffset:13}),Fp._editors=new Set,Fp._instance=null;const Up=function(t,e,n){var o=!0,i=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return F(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),$a(t,e,{leading:o,maxWait:e,trailing:i})};var qp=Object.defineProperty,Gp=Object.getOwnPropertySymbols,Wp=Object.prototype.hasOwnProperty,Kp=Object.prototype.propertyIsEnumerable,$p=(t,e,n)=>e in t?qp(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Yp=(t,e)=>{for(var n in e||(e={}))Wp.call(e,n)&&$p(t,n,e[n]);if(Gp)for(var n of Gp(e))Kp.call(e,n)&&$p(t,n,e[n]);return t};const Qp=50,Zp=350,Jp="Powered by";class Xp extends(Bo()){constructor(t){super(),this.editor=t,this._balloonView=null,this._lastFocusedEditableElement=null,this._showBalloonThrottled=Up(this._showBalloon.bind(this),50,{leading:!0}),t.on("ready",this._handleEditorReady.bind(this))}destroy(){const t=this._balloonView;t&&(t.unpin(),this._balloonView=null),this._showBalloonThrottled.cancel(),this.stopListening()}_handleEditorReady(){const t=this.editor;(!!t.config.get("ui.poweredBy.forceVisible")||"VALID"!==function(t){function e(t){return t.length>=40&&t.length<=255?"VALID":"INVALID"}if(!t)return"INVALID";let n="";try{n=atob(t)}catch(t){return"INVALID"}const o=n.split("-"),i=o[0],r=o[1];if(!r)return e(t);try{atob(r)}catch(n){try{if(atob(i),!atob(i).length)return e(t)}catch(n){return e(t)}}if(i.length<40||i.length>255)return"INVALID";let s="";try{atob(i),s=atob(r)}catch(t){return"INVALID"}if(8!==s.length)return"INVALID";const a=Number(s.substring(0,4)),c=Number(s.substring(4,6))-1,l=Number(s.substring(6,8)),d=new Date(a,c,l);return d{this._updateLastFocusedEditableElement(),n?this._showBalloon():this._hideBalloon()})),t.ui.focusTracker.on("change:focusedElement",((t,e,n)=>{this._updateLastFocusedEditableElement(),n&&this._showBalloon()})),t.ui.on("update",(()=>{this._showBalloonThrottled()})))}_createBalloonView(){const t=this.editor,e=this._balloonView=new Np,n=nf(t),o=new tf(t.locale,n.label);e.content.add(o),e.set({class:"ck-powered-by-balloon"}),t.ui.view.body.add(e),t.ui.focusTracker.add(e.element),this._balloonView=e}_showBalloon(){if(!this._lastFocusedEditableElement)return;const t=function(t,e){const n=nf(t),o="right"===n.side?function(t,e){return ef(t,e,((t,n)=>t.left+t.width-n.width-e.horizontalOffset))}(e,n):function(t,e){return ef(t,e,(t=>t.left+e.horizontalOffset))}(e,n);return{target:e,positions:[o]}}(this.editor,this._lastFocusedEditableElement);t&&(this._balloonView||this._createBalloonView(),this._balloonView.pin(t))}_hideBalloon(){this._balloonView&&this._balloonView.unpin()}_updateLastFocusedEditableElement(){const t=this.editor,e=t.ui.focusTracker.isFocused,n=t.ui.focusTracker.focusedElement;if(!e||!n)return void(this._lastFocusedEditableElement=null);const o=Array.from(t.ui.getEditableElementsNames()).map((e=>t.ui.getEditableElement(e)));o.includes(n)?this._lastFocusedEditableElement=n:this._lastFocusedEditableElement=o[0]}}class tf extends dg{constructor(t,e){super(t);const n=new yg,o=this.bindTemplate;n.set({content:'\n',isColorInherited:!1}),n.extendTemplate({attributes:{style:{width:"53px",height:"10px"}}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-powered-by"],"aria-hidden":!0},children:[{tag:"a",attributes:{href:"https://ckeditor.com/?utm_source=ckeditor&utm_medium=referral&utm_campaign=701Dn000000hVgmIAE_powered_by_ckeditor_logo",target:"_blank",tabindex:"-1"},children:[...e?[{tag:"span",attributes:{class:["ck","ck-powered-by__label"]},children:[e]}]:[],n],on:{dragstart:o.to((t=>t.preventDefault()))}}]})}}function ef(t,e,n){return(o,i)=>{const r=new Ho(t);if(r.widthe.regionName===t));i||(i=new lf(this.view.locale),this.view.regionViews.add(i)),i.set({regionName:t,text:e,politeness:n})}}class cf extends dg{constructor(t){super(t),this.regionViews=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-aria-live-announcer"]},children:this.regionViews})}}class lf extends dg{constructor(t){super(t);const e=this.bindTemplate;this.set("regionName",""),this.set("text",""),this.set("politeness",sf),this.setTemplate({tag:"div",attributes:{role:"region","data-region":e.to("regionName"),"aria-live":e.to("politeness")},children:[{text:e.to("text")}]})}}var df=Object.defineProperty,uf=Object.getOwnPropertySymbols,hf=Object.prototype.hasOwnProperty,gf=Object.prototype.propertyIsEnumerable,mf=(t,e,n)=>e in t?df(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class pf extends(K()){constructor(t){super(),this.isReady=!1,this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[];const e=t.editing.view;this.editor=t,this.componentFactory=new Xm(t),this.focusTracker=new Zi,this.tooltipManager=new Fp(t),this.poweredBy=new Xp(t),this.ariaLiveAnnouncer=new af(t),this.set("viewportOffset",this._readViewportOffsetFromConfig()),this.once("ready",(()=>{this.isReady=!0})),this.listenTo(e.document,"layoutChanged",this.update.bind(this)),this.listenTo(e,"scrollToTheSelection",this._handleScrollToTheSelection.bind(this)),this._initFocusTracking()}get element(){return null}update(){this.fire("update")}destroy(){this.stopListening(),this.focusTracker.destroy(),this.tooltipManager.destroy(this.editor),this.poweredBy.destroy();for(const t of this._editableElementsMap.values())t.ckeditorInstance=null,this.editor.keystrokes.stopListening(t);this._editableElementsMap=new Map,this._focusableToolbarDefinitions=[]}setEditableElement(t,e){this._editableElementsMap.set(t,e),e.ckeditorInstance||(e.ckeditorInstance=this.editor),this.focusTracker.add(e);const n=()=>{this.editor.editing.view.getDomRoot(t)||this.editor.keystrokes.listenTo(e)};this.isReady?n():this.once("ready",n)}removeEditableElement(t){const e=this._editableElementsMap.get(t);e&&(this._editableElementsMap.delete(t),this.editor.keystrokes.stopListening(e),this.focusTracker.remove(e),e.ckeditorInstance=null)}getEditableElement(t="main"){return this._editableElementsMap.get(t)}getEditableElementsNames(){return this._editableElementsMap.keys()}addToolbar(t,e={}){t.isRendered?(this.focusTracker.add(t.element),this.editor.keystrokes.listenTo(t.element)):t.once("render",(()=>{this.focusTracker.add(t.element),this.editor.keystrokes.listenTo(t.element)})),this._focusableToolbarDefinitions.push({toolbarView:t,options:e})}get _editableElements(){return console.warn("editor-ui-deprecated-editable-elements: The EditorUI#_editableElements property has been deprecated and will be removed in the near future.",{editorUI:this}),this._editableElementsMap}_readViewportOffsetFromConfig(){const t=this.editor,e=t.config.get("ui.viewportOffset");if(e)return e;const n=t.config.get("toolbar.viewportTopOffset");return n?(console.warn("editor-ui-deprecated-viewport-offset-config: The `toolbar.vieportTopOffset` configuration option is deprecated. It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead."),{top:n}):{top:0}}_initFocusTracking(){const t=this.editor,e=t.editing.view;let n,o;t.keystrokes.set("Alt+F10",((t,i)=>{const r=this.focusTracker.focusedElement;Array.from(this._editableElementsMap.values()).includes(r)&&!Array.from(e.domRoots.values()).includes(r)&&(n=r);const s=this._getCurrentFocusedToolbarDefinition();s&&o||(o=this._getFocusableCandidateToolbarDefinitions());for(let t=0;t{const i=this._getCurrentFocusedToolbarDefinition();i&&(n?(n.focus(),n=null):t.editing.view.focus(),i.options.afterBlur&&i.options.afterBlur(),o())}))}_getFocusableCandidateToolbarDefinitions(){const t=[];for(const e of this._focusableToolbarDefinitions){const{toolbarView:n,options:o}=e;(ti(n.element)||o.beforeFocus)&&t.push(e)}return t.sort(((t,e)=>ff(t)-ff(e))),t}_getCurrentFocusedToolbarDefinition(){for(const t of this._focusableToolbarDefinitions)if(t.toolbarView.element&&t.toolbarView.element.contains(this.focusTracker.focusedElement))return t;return null}_focusFocusableCandidateToolbar(t){const{toolbarView:e,options:{beforeFocus:n}}=t;return n&&n(),!!ti(e.element)&&(e.focus(),!0)}_handleScrollToTheSelection(t,e){const n=((t,e)=>{for(var n in e||(e={}))hf.call(e,n)&&mf(t,n,e[n]);if(uf)for(var n of uf(e))gf.call(e,n)&&mf(t,n,e[n]);return t})({top:0,bottom:0,left:0,right:0},this.viewportOffset);e.viewportOffset.top+=n.top,e.viewportOffset.bottom+=n.bottom,e.viewportOffset.left+=n.left,e.viewportOffset.right+=n.right}}function ff(t){const{toolbarView:e,options:n}=t;let o=10;return ti(e.element)&&o--,n.isContextual&&o--,o}var kf=n(1185),bf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(kf.A,bf);kf.A.locals;class wf extends dg{constructor(t){super(t),this.body=new Ag(t)}render(){super.render(),this.body.attachToDom()}destroy(){return this.body.detachFromDom(),super.destroy()}}class Af extends wf{constructor(t){super(t),this.top=this.createCollection(),this.main=this.createCollection(),this._voiceLabelView=this._createVoiceLabel(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-editor","ck-rounded-corners"],role:"application",dir:t.uiLanguageDirection,lang:t.uiLanguage,"aria-labelledby":this._voiceLabelView.id},children:[this._voiceLabelView,{tag:"div",attributes:{class:["ck","ck-editor__top","ck-reset_all"],role:"presentation"},children:this.top},{tag:"div",attributes:{class:["ck","ck-editor__main"],role:"presentation"},children:this.main}]})}_createVoiceLabel(){const t=this.t,e=new gg;return e.text=t("Rich Text Editor"),e.extendTemplate({attributes:{class:"ck-voice-label"}}),e}}class _f extends dg{constructor(t,e,n){super(t),this.name=null,this.setTemplate({tag:"div",attributes:{class:["ck","ck-content","ck-editor__editable","ck-rounded-corners"],lang:t.contentLanguage,dir:t.contentLanguageDirection}}),this.set("isFocused",!1),this._editableElement=n,this._hasExternalElement=!!this._editableElement,this._editingView=e}render(){super.render(),this._hasExternalElement?this.template.apply(this.element=this._editableElement):this._editableElement=this.element,this.on("change:isFocused",(()=>this._updateIsFocusedClasses())),this._updateIsFocusedClasses()}destroy(){this._hasExternalElement&&this.template.revert(this._editableElement),super.destroy()}get hasExternalElement(){return this._hasExternalElement}_updateIsFocusedClasses(){const t=this._editingView;function e(e){t.change((n=>{const o=t.document.getRoot(e.name);n.addClass(e.isFocused?"ck-focused":"ck-blurred",o),n.removeClass(e.isFocused?"ck-blurred":"ck-focused",o)}))}t.isRenderingInProgress?function n(o){t.once("change:isRenderingInProgress",((t,i,r)=>{r?n(o):e(o)}))}(this):e(this)}}class Cf extends _f{constructor(t,e,n,o={}){super(t,e,n);const i=t.t;this.extendTemplate({attributes:{role:"textbox",class:"ck-editor__editable_inline"}}),this._generateLabel=o.label||(()=>i("Editor editing area: %0",this.name))}render(){super.render();const t=this._editingView;t.change((e=>{const n=t.document.getRoot(this.name);e.setAttribute("aria-label",this._generateLabel(this),n)}))}}class vf extends pr{static get pluginName(){return"Notification"}init(){this.on("show:warning",((t,e)=>{window.alert(e.message)}),{priority:"lowest"})}showSuccess(t,e={}){this._showNotification({message:t,type:"success",namespace:e.namespace,title:e.title})}showInfo(t,e={}){this._showNotification({message:t,type:"info",namespace:e.namespace,title:e.title})}showWarning(t,e={}){this._showNotification({message:t,type:"warning",namespace:e.namespace,title:e.title})}_showNotification(t){const e=t.namespace?`show:${t.type}:${t.namespace}`:`show:${t.type}`;this.fire(e,{message:t.message,type:t.type,title:t.title||""})}}class yf extends(K()){constructor(t,e){super(),e&&Ba(this,e),t&&this.set(t)}}var xf=n(991),Ef={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(xf.A,Ef);xf.A.locals;var Df=n(5380),If={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Df.A,If);Df.A.locals;const Mf=Qo("px");class Tf extends rr{constructor(t){super(t),this._viewToStack=new Map,this._idToStack=new Map,this._view=null,this._rotatorView=null,this._fakePanelsView=null,this.positionLimiter=()=>{const t=this.editor.editing.view,e=t.document.selection.editableElement;return e?t.domConverter.mapViewToDom(e.root):null},this.set("visibleView",null),this.set("_numberOfStacks",0),this.set("_singleViewMode",!1)}static get pluginName(){return"ContextualBalloon"}destroy(){super.destroy(),this._view&&this._view.destroy(),this._rotatorView&&this._rotatorView.destroy(),this._fakePanelsView&&this._fakePanelsView.destroy()}get view(){return this._view||this._createPanelView(),this._view}hasView(t){return Array.from(this._viewToStack.keys()).includes(t)}add(t){if(this._view||this._createPanelView(),this.hasView(t.view))throw new _("contextualballoon-add-view-exist",[this,t]);const e=t.stackId||"main";if(!this._idToStack.has(e))return this._idToStack.set(e,new Map([[t.view,t]])),this._viewToStack.set(t.view,this._idToStack.get(e)),this._numberOfStacks=this._idToStack.size,void(this._visibleStack&&!t.singleViewMode||this.showStack(e));const n=this._idToStack.get(e);t.singleViewMode&&this.showStack(e),n.set(t.view,t),this._viewToStack.set(t.view,n),n===this._visibleStack&&this._showView(t)}remove(t){if(!this.hasView(t))throw new _("contextualballoon-remove-view-not-exist",[this,t]);const e=this._viewToStack.get(t);this._singleViewMode&&this.visibleView===t&&(this._singleViewMode=!1),this.visibleView===t&&(1===e.size?this._idToStack.size>1?this._showNextStack():(this.view.hide(),this.visibleView=null,this._rotatorView.hideView()):this._showView(Array.from(e.values())[e.size-2])),1===e.size?(this._idToStack.delete(this._getStackId(e)),this._numberOfStacks=this._idToStack.size):e.delete(t),this._viewToStack.delete(t)}updatePosition(t){t&&(this._visibleStack.get(this.visibleView).position=t),this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition()}showStack(t){this.visibleStack=t;const e=this._idToStack.get(t);if(!e)throw new _("contextualballoon-showstack-stack-not-exist",this);this._visibleStack!==e&&this._showView(Array.from(e.values()).pop())}_createPanelView(){this._view=new Np(this.editor.locale),this.editor.ui.view.body.add(this._view),this.editor.ui.focusTracker.add(this._view.element),this._rotatorView=this._createRotatorView(),this._fakePanelsView=this._createFakePanelsView()}get _visibleStack(){return this._viewToStack.get(this.visibleView)}_getStackId(t){return Array.from(this._idToStack.entries()).find((e=>e[1]===t))[0]}_showNextStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)+1;t[e]||(e=0),this.showStack(this._getStackId(t[e]))}_showPrevStack(){const t=Array.from(this._idToStack.values());let e=t.indexOf(this._visibleStack)-1;t[e]||(e=t.length-1),this.showStack(this._getStackId(t[e]))}_createRotatorView(){const t=new Sf(this.editor.locale),e=this.editor.locale.t;return this.view.content.add(t),t.bind("isNavigationVisible").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>1)),t.on("change:isNavigationVisible",(()=>this.updatePosition()),{priority:"low"}),t.bind("counter").to(this,"visibleView",this,"_numberOfStacks",((t,n)=>{if(n<2)return"";const o=Array.from(this._idToStack.values()).indexOf(this._visibleStack)+1;return e("%0 of %1",[o,n])})),t.buttonNextView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showNextStack()})),t.buttonPrevView.on("execute",(()=>{t.focusTracker.isFocused&&this.editor.editing.view.focus(),this._showPrevStack()})),t}_createFakePanelsView(){const t=new Bf(this.editor.locale,this.view);return t.bind("numberOfPanels").to(this,"_numberOfStacks",this,"_singleViewMode",((t,e)=>!e&&t>=2?Math.min(t-1,2):0)),t.listenTo(this.view,"change:top",(()=>t.updatePosition())),t.listenTo(this.view,"change:left",(()=>t.updatePosition())),this.editor.ui.view.body.add(t),t}_showView({view:t,balloonClassName:e="",withArrow:n=!0,singleViewMode:o=!1}){this.view.class=e,this.view.withArrow=n,this._rotatorView.showView(t),this.visibleView=t,this.view.pin(this._getBalloonPosition()),this._fakePanelsView.updatePosition(),o&&(this._singleViewMode=!0)}_getBalloonPosition(){let t=Array.from(this._visibleStack.values()).pop().position;return t&&(t.limiter||(t=Object.assign({},t,{limiter:this.positionLimiter})),t=Object.assign({},t,{viewportOffsetConfig:this.editor.ui.viewportOffset})),t}}class Sf extends dg{constructor(t){super(t);const e=t.t,n=this.bindTemplate;this.set("isNavigationVisible",!0),this.focusTracker=new Zi,this.buttonPrevView=this._createButtonView(e("Previous"),jh.previousArrow),this.buttonNextView=this._createButtonView(e("Next"),jh.nextArrow),this.content=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-balloon-rotator"],"z-index":"-1"},children:[{tag:"div",attributes:{class:["ck-balloon-rotator__navigation",n.to("isNavigationVisible",(t=>t?"":"ck-hidden"))]},children:[this.buttonPrevView,{tag:"span",attributes:{class:["ck-balloon-rotator__counter"]},children:[{text:n.to("counter")}]},this.buttonNextView]},{tag:"div",attributes:{class:"ck-balloon-rotator__content"},children:this.content}]})}render(){super.render(),this.focusTracker.add(this.element)}destroy(){super.destroy(),this.focusTracker.destroy()}showView(t){this.hideView(),this.content.add(t)}hideView(){this.content.clear()}_createButtonView(t,e){const n=new Ig(this.locale);return n.set({label:t,icon:e,tooltip:!0}),n}}class Bf extends dg{constructor(t,e){super(t);const n=this.bindTemplate;this.set("top",0),this.set("left",0),this.set("height",0),this.set("width",0),this.set("numberOfPanels",0),this.content=this.createCollection(),this._balloonPanelView=e,this.setTemplate({tag:"div",attributes:{class:["ck-fake-panel",n.to("numberOfPanels",(t=>t?"":"ck-hidden"))],style:{top:n.to("top",Mf),left:n.to("left",Mf),width:n.to("width",Mf),height:n.to("height",Mf)}},children:this.content}),this.on("change:numberOfPanels",((t,e,n,o)=>{n>o?this._addPanels(n-o):this._removePanels(o-n),this.updatePosition()}))}_addPanels(t){for(;t--;){const t=new dg;t.setTemplate({tag:"div"}),this.content.add(t),this.registerChild(t)}}_removePanels(t){for(;t--;){const t=this.content.last;this.content.remove(t),this.deregisterChild(t),t.destroy()}}updatePosition(){if(this.numberOfPanels){const{top:t,left:e}=this._balloonPanelView,{width:n,height:o}=new Ho(this._balloonPanelView.element);Object.assign(this,{top:t,left:e,width:n,height:o})}}}var Nf=n(8298),Pf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Nf.A,Pf);Nf.A.locals;const Of=Qo("px");class Lf extends dg{constructor(t){super(t);const e=this.bindTemplate;this.set("isActive",!1),this.set("isSticky",!1),this.set("limiterElement",null),this.set("limiterBottomOffset",50),this.set("viewportTopOffset",0),this.set("_marginLeft",null),this.set("_isStickyToTheBottomOfLimiter",!1),this.set("_stickyTopOffset",null),this.set("_stickyBottomOffset",null),this.content=this.createCollection(),this._contentPanelPlaceholder=new Vh({tag:"div",attributes:{class:["ck","ck-sticky-panel__placeholder"],style:{display:e.to("isSticky",(t=>t?"block":"none")),height:e.to("isSticky",(t=>t?Of(this._contentPanelRect.height):null))}}}).render(),this.contentPanelElement=new Vh({tag:"div",attributes:{class:["ck","ck-sticky-panel__content",e.if("isSticky","ck-sticky-panel__content_sticky"),e.if("_isStickyToTheBottomOfLimiter","ck-sticky-panel__content_sticky_bottom-limit")],style:{width:e.to("isSticky",(t=>t?Of(this._contentPanelPlaceholder.getBoundingClientRect().width):null)),top:e.to("_stickyTopOffset",(t=>t?Of(t):t)),bottom:e.to("_stickyBottomOffset",(t=>t?Of(t):t)),marginLeft:e.to("_marginLeft")}},children:this.content}).render(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-sticky-panel"]},children:[this._contentPanelPlaceholder,this.contentPanelElement]})}render(){super.render(),this.checkIfShouldBeSticky(),this.listenTo(Lo.document,"scroll",(()=>{this.checkIfShouldBeSticky()}),{useCapture:!0}),this.listenTo(this,"change:isActive",(()=>{this.checkIfShouldBeSticky()}))}checkIfShouldBeSticky(){if(!this.limiterElement||!this.isActive)return void this._unstick();const t=new Ho(this.limiterElement);let e=t.getVisible();if(e){const t=new Ho(Lo.window);t.top+=this.viewportTopOffset,t.height-=this.viewportTopOffset,e=e.getIntersection(t)}if(e&&t.tope.bottom){const n=Math.max(t.bottom-e.bottom,0)+this.limiterBottomOffset;t.bottom-n>t.top+this._contentPanelRect.height?this._stickToBottomOfLimiter(n):this._unstick()}else this._contentPanelRect.height+this.limiterBottomOffset{this.reset(),this.focus(),this.fire("reset")})),this.resetButtonView.bind("isVisible").to(this.fieldView,"isEmpty",(t=>!t)),this.fieldWrapperChildren.add(this.resetButtonView),this.extendTemplate({attributes:{class:"ck-search__query_with-reset"}}))}reset(){this.fieldView.reset(),this._viewConfig.showResetButton&&(this.resetButtonView.isVisible=!1)}}class Rf extends dg{constructor(){super();const t=this.bindTemplate;this.set({isVisible:!1,primaryText:"",secondaryText:""}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-search__info",t.if("isVisible","ck-hidden",(t=>!t))],tabindex:-1},children:[{tag:"span",children:[{text:[t.to("primaryText")]}]},{tag:"span",children:[{text:[t.to("secondaryText")]}]}]})}focus(){this.element.focus()}}class jf extends dg{constructor(t){super(t),this.children=this.createCollection(),this.focusTracker=new Zi,this.setTemplate({tag:"div",attributes:{class:["ck","ck-search__results"],tabindex:-1},children:this.children}),this._focusCycler=new nm({focusables:this.children,focusTracker:this.focusTracker})}render(){super.render();for(const t of this.children)this.focusTracker.add(t.element)}focus(){this._focusCycler.focusFirst()}focusFirst(){this._focusCycler.focusFirst()}focusLast(){this._focusCycler.focusLast()}}var Ff=/[\\^$.*+?()[\]{}|]/g,Vf=RegExp(Ff.source);const Hf=function(t){return(t=Xr(t))&&Vf.test(t)?t.replace(Ff,"\\$&"):t};var Uf=n(8107),qf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Uf.A,qf);Uf.A.locals;var Gf=Object.defineProperty,Wf=Object.getOwnPropertySymbols,Kf=Object.prototype.hasOwnProperty,$f=Object.prototype.propertyIsEnumerable,Yf=(t,e,n)=>e in t?Gf(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class Qf extends dg{constructor(t,e){super(t),this._config=e,this.filteredView=e.filteredView,this.queryView=this._createSearchTextQueryView(),this.focusTracker=new Zi,this.keystrokes=new Ji,this.resultsView=new jf(t),this.children=this.createCollection(),this.focusableChildren=this.createCollection([this.queryView,this.resultsView]),this.set("isEnabled",!0),this.set("resultsCount",0),this.set("totalItemsCount",0),e.infoView&&e.infoView.instance?this.infoView=e.infoView.instance:(this.infoView=new Rf,this._enableDefaultInfoViewBehavior(),this.on("render",(()=>{this.search("")}))),this.resultsView.children.addMany([this.infoView,this.filteredView]),this.focusCycler=new nm({focusables:this.focusableChildren,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.on("search",((t,{resultsCount:e,totalItemsCount:n})=>{this.resultsCount=e,this.totalItemsCount=n})),this.setTemplate({tag:"div",attributes:{class:["ck","ck-search",e.class||null],tabindex:"-1"},children:this.children})}render(){super.render(),this.children.addMany([this.queryView,this.resultsView]);const t=t=>t.stopPropagation();for(const t of this.focusableChildren)this.focusTracker.add(t.element);this.keystrokes.listenTo(this.element),this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t)}focus(){this.queryView.focus()}reset(){this.queryView.reset(),this.search("")}search(t){const e=t?new RegExp(Hf(t),"ig"):null,n=this.filteredView.filter(e);this.fire("search",((t,e)=>{for(var n in e||(e={}))Kf.call(e,n)&&Yf(t,n,e[n]);if(Wf)for(var n of Wf(e))$f.call(e,n)&&Yf(t,n,e[n]);return t})({query:t},n))}_createSearchTextQueryView(){const t=new zf(this.locale,this._config.queryView);return this.listenTo(t.fieldView,"input",(()=>{this.search(t.fieldView.element.value)})),t.on("reset",(()=>this.reset())),t.bind("isEnabled").to(this),t}_enableDefaultInfoViewBehavior(){const t=this.locale.t,e=this.infoView;function n(t,{query:e,resultsCount:n,totalItemsCount:o}){return"function"==typeof t?t(e,n,o):t}this.on("search",((o,i)=>{if(i.resultsCount)e.set({isVisible:!1});else{const o=this._config.infoView&&this._config.infoView.text;let r,s;i.totalItemsCount?o&&o.notFound?(r=o.notFound.primary,s=o.notFound.secondary):(r=t("No results found"),s=""):o&&o.noSearchableItems?(r=o.noSearchableItems.primary,s=o.noSearchableItems.secondary):(r=t("No searchable items"),s=""),e.set({primaryText:n(r,i),secondaryText:n(s,i),isVisible:!0})}}))}}var Zf=n(5727),Jf={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Zf.A,Jf);Zf.A.locals;const Xf=class extends Qf{constructor(t,e){super(t,e),this._config=e;const n=Qo("px");this.extendTemplate({attributes:{class:["ck-autocomplete"]}});const o=this.resultsView.bindTemplate;this.resultsView.set("isVisible",!1),this.resultsView.set("_position","s"),this.resultsView.set("_width",0),this.resultsView.extendTemplate({attributes:{class:[o.if("isVisible","ck-hidden",(t=>!t)),o.to("_position",(t=>`ck-search__results_${t}`))],style:{width:o.to("_width",n)}}}),this.focusTracker.on("change:isFocused",((t,n,o)=>{this._updateResultsVisibility(),o?this.resultsView.element.scrollTop=0:e.resetOnBlur&&this.queryView.reset()})),this.on("search",(()=>{this._updateResultsVisibility(),this._updateResultsViewWidthAndPosition()})),this.keystrokes.set("esc",((t,e)=>{this.resultsView.isVisible&&(this.queryView.focus(),this.resultsView.isVisible=!1,e())})),this.listenTo(Lo.document,"scroll",(()=>{this._updateResultsViewWidthAndPosition()})),this.on("change:isEnabled",(()=>{this._updateResultsVisibility()})),this.filteredView.on("execute",((t,{value:e})=>{this.focus(),this.reset(),this.queryView.fieldView.value=this.queryView.fieldView.element.value=e,this.resultsView.isVisible=!1})),this.resultsView.on("change:isVisible",(()=>{this._updateResultsViewWidthAndPosition()}))}_updateResultsViewWidthAndPosition(){if(!this.resultsView.isVisible)return;this.resultsView._width=new Ho(this.queryView.fieldView.element).width;const t=Xf._getOptimalPosition({element:this.resultsView.element,target:this.queryView.element,fitInViewport:!0,positions:Xf.defaultResultsPositions});this.resultsView._position=t?t.name:"s"}_updateResultsVisibility(){const t=void 0===this._config.queryMinChars?0:this._config.queryMinChars,e=this.queryView.fieldView.element.value.length;this.resultsView.isVisible=this.focusTracker.isFocused&&this.isEnabled&&e>=t}};let tk=Xf;tk.defaultResultsPositions=[t=>({top:t.bottom,left:t.left,name:"s"}),(t,e)=>({top:t.top-e.height,left:t.left,name:"n"})],tk._getOptimalPosition=ni;ek={"&":"&","<":"<",">":">",'"':""","'":"'"};var ek;var nk=/[&<>"']/g;RegExp(nk.source);var ok=n(9529),ik={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ok.A,ik);ok.A.locals;var rk=n(109),sk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(rk.A,sk);rk.A.locals;Qo("px");var ak=n(2710),ck={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ak.A,ck);ak.A.locals,Qo("px");Qo("px");var lk=n(3344),dk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(lk.A,dk);lk.A.locals;class uk extends Ig{constructor(t){super(t);const e=this.bindTemplate;this.set({withText:!0,role:"menuitem"}),this.arrowView=this._createArrowView(),this.extendTemplate({attributes:{class:["ck-menu-bar__menu__button"],"aria-haspopup":!0,"aria-expanded":this.bindTemplate.to("isOn",(t=>String(t))),"data-cke-tooltip-disabled":e.to("isOn")},on:{mouseenter:e.to("mouseenter")}})}render(){super.render(),this.children.add(this.arrowView)}_createArrowView(){const t=new yg;return t.content=Pg,t.extendTemplate({attributes:{class:"ck-menu-bar__menu__button__arrow"}}),t}}var hk=n(9481),gk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(hk.A,gk);hk.A.locals;class mk extends Cm{constructor(t,e){super(t);const n=this.bindTemplate;this.extendTemplate({attributes:{class:["ck-menu-bar__menu__item"]},on:{mouseenter:n.to("mouseenter")}}),this.delegate("mouseenter").to(e)}}var pk=Object.defineProperty,fk=Object.getOwnPropertySymbols,kk=Object.prototype.hasOwnProperty,bk=Object.prototype.propertyIsEnumerable,wk=(t,e,n)=>e in t?pk(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Ak=(t,e)=>{for(var n in e||(e={}))kk.call(e,n)&&wk(t,n,e[n]);if(fk)for(var n of fk(e))bk.call(e,n)&&wk(t,n,e[n]);return t};const _k={toggleMenusAndFocusItemsOnHover(t){t.on("menu:mouseenter",(e=>{if(t.isOpen){for(const n of t.menus){const t=e.path[0],o=t instanceof mk&&t.children.first===n;n.isOpen=(e.path.includes(n)||o)&&n.isEnabled}e.source.focus()}}))},focusCycleMenusOnArrows(t){const e="rtl"===t.locale.uiLanguageDirection;function n(e,n){const o=t.children.getIndex(e),i=e.isOpen,r=t.children.length,s=t.children.get((o+r+n)%r);e.isOpen=!1,i&&(s.isOpen=!0),s.buttonView.focus()}t.on("menu:arrowright",(t=>{n(t.source,e?-1:1)})),t.on("menu:arrowleft",(t=>{n(t.source,e?1:-1)}))},closeMenusWhenTheBarCloses(t){t.on("change:isOpen",(()=>{t.isOpen||t.menus.forEach((t=>{t.isOpen=!1}))}))},closeMenuWhenAnotherOnTheSameLevelOpens(t){t.on("menu:change:isOpen",((e,n,o)=>{o&&t.menus.filter((t=>e.source.parentMenuView===t.parentMenuView&&e.source!==t&&t.isOpen)).forEach((t=>{t.isOpen=!1}))}))},closeOnClickOutside(e){t({emitter:e,activator:()=>e.isOpen,callback:()=>e.close(),contextElements:()=>e.children.map((t=>t.element))})}},Ck={openAndFocusPanelOnArrowDownKey(t){t.keystrokes.set("arrowdown",((e,n)=>{t.focusTracker.focusedElement===t.buttonView.element&&(t.isOpen||(t.isOpen=!0),t.panelView.focus(),n())}))},openOnArrowRightKey(t){const e="rtl"===t.locale.uiLanguageDirection?"arrowleft":"arrowright";t.keystrokes.set(e,((e,n)=>{t.focusTracker.focusedElement===t.buttonView.element&&t.isEnabled&&(t.isOpen||(t.isOpen=!0),t.panelView.focus(),n())}))},openOnButtonClick(t){t.buttonView.on("execute",(()=>{t.isOpen=!0,t.panelView.focus()}))},toggleOnButtonClick(t){t.buttonView.on("execute",(()=>{t.isOpen=!t.isOpen,t.isOpen&&t.panelView.focus()}))},closeOnArrowLeftKey(t){const e="rtl"===t.locale.uiLanguageDirection?"arrowright":"arrowleft";t.keystrokes.set(e,((e,n)=>{t.isOpen&&(t.isOpen=!1,t.focus(),n())}))},closeOnEscKey(t){t.keystrokes.set("esc",((e,n)=>{t.isOpen&&(t.isOpen=!1,t.focus(),n())}))},closeOnParentClose(t){t.parentMenuView.on("change:isOpen",((e,n,o)=>{o||e.source!==t.parentMenuView||(t.isOpen=!1)}))}},vk={southEast:t=>({top:t.bottom,left:t.left,name:"se"}),southWest:(t,e)=>({top:t.bottom,left:t.left-e.width+t.width,name:"sw"}),northEast:(t,e)=>({top:t.top-e.height,left:t.left,name:"ne"}),northWest:(t,e)=>({top:t.top-e.height,left:t.left-e.width+t.width,name:"nw"}),eastSouth:t=>({top:t.top,left:t.right-5,name:"es"}),eastNorth:(t,e)=>({top:t.top-e.height,left:t.right-5,name:"en"}),westSouth:(t,e)=>({top:t.top,left:t.left-e.width+5,name:"ws"}),westNorth:(t,e)=>({top:t.top-e.height,left:t.left-e.width+5,name:"wn"})},yk=[{menuId:"file",label:"File",groups:[{groupId:"export",items:["menuBar:exportPdf","menuBar:exportWord"]},{groupId:"import",items:["menuBar:importWord"]},{groupId:"revisionHistory",items:["menuBar:revisionHistory"]}]},{menuId:"edit",label:"Edit",groups:[{groupId:"undo",items:["menuBar:undo","menuBar:redo"]},{groupId:"selectAll",items:["menuBar:selectAll"]},{groupId:"findAndReplace",items:["menuBar:findAndReplace"]}]},{menuId:"view",label:"View",groups:[{groupId:"sourceEditing",items:["menuBar:sourceEditing"]},{groupId:"showBlocks",items:["menuBar:showBlocks"]},{groupId:"restrictedEditingException",items:["menuBar:restrictedEditingException"]}]},{menuId:"insert",label:"Insert",groups:[{groupId:"insertMainWidgets",items:["menuBar:uploadImage","menuBar:ckbox","menuBar:ckfinder","menuBar:insertTable"]},{groupId:"insertInline",items:["menuBar:link","menuBar:comment"]},{groupId:"insertMinorWidgets",items:["menuBar:insertTemplate","menuBar:blockQuote","menuBar:codeBlock","menuBar:htmlEmbed"]},{groupId:"insertStructureWidgets",items:["menuBar:horizontalLine","menuBar:pageBreak","menuBar:tableOfContents"]},{groupId:"restrictedEditing",items:["menuBar:restrictedEditing"]}]},{menuId:"format",label:"Format",groups:[{groupId:"textAndFont",items:[{menuId:"text",label:"Text",groups:[{groupId:"basicStyles",items:["menuBar:bold","menuBar:italic","menuBar:underline","menuBar:strikethrough","menuBar:superscript","menuBar:subscript","menuBar:code"]},{groupId:"textPartLanguage",items:["menuBar:textPartLanguage"]}]},{menuId:"font",label:"Font",groups:[{groupId:"fontProperties",items:["menuBar:fontSize","menuBar:fontFamily"]},{groupId:"fontColors",items:["menuBar:fontColor","menuBar:fontBackgroundColor"]},{groupId:"highlight",items:["menuBar:highlight"]}]},"menuBar:heading"]},{groupId:"list",items:["menuBar:bulletedList","menuBar:numberedList","menuBar:todoList"]},{groupId:"indent",items:["menuBar:alignment","menuBar:indent","menuBar:outdent"]},{groupId:"caseChange",items:["menuBar:caseChange"]},{groupId:"removeFormat",items:["menuBar:removeFormat"]}]},{menuId:"tools",label:"Tools",groups:[{groupId:"aiTools",items:["menuBar:aiAssistant","menuBar:aiCommands"]},{groupId:"tools",items:["menuBar:trackChanges","menuBar:commentsArchive"]}]},{menuId:"help",label:"Help",groups:[{groupId:"help",items:["menuBar:accessibilityHelp"]}]}];function xk({normalizedConfig:t,locale:e,componentFactory:n}){const o=Dc(t);return function(t,e){const n=e.removeItems,o=[];e.items=e.items.filter((({menuId:t})=>!n.includes(t)||(o.push(t),!1))),Mk(e.items,(t=>{t.groups=t.groups.filter((({groupId:t})=>!n.includes(t)||(o.push(t),!1)));for(const e of t.groups)e.items=e.items.filter((t=>{const e=Pk(t);return!n.includes(e)||(o.push(e),!1)}))}));for(const e of n)o.includes(e)||C("menu-bar-item-could-not-be-removed",{menuBarConfig:t,itemName:e})}(t,o),function(t,e){const n=e.addItems,o=[];for(const t of n){const n=Bk(t.position),i=Nk(t.position);if(Tk(t))if(i){const r=e.items.findIndex((t=>t.menuId===i));if(-1!=r)"before"===n?(e.items.splice(r,0,t.menu),o.push(t)):"after"===n&&(e.items.splice(r+1,0,t.menu),o.push(t));else{Ek(e,t.menu,i,n)&&o.push(t)}}else"start"===n?(e.items.unshift(t.menu),o.push(t)):"end"===n&&(e.items.push(t.menu),o.push(t));else if(Sk(t))Mk(e.items,(e=>{if(e.menuId===i)"start"===n?(e.groups.unshift(t.group),o.push(t)):"end"===n&&(e.groups.push(t.group),o.push(t));else{const r=e.groups.findIndex((t=>t.groupId===i));-1!==r&&("before"===n?(e.groups.splice(r,0,t.group),o.push(t)):"after"===n&&(e.groups.splice(r+1,0,t.group),o.push(t)))}}));else{Ek(e,t.item,i,n)&&o.push(t)}}for(const e of n)o.includes(e)||C("menu-bar-item-could-not-be-added",{menuBarConfig:t,addedItemConfig:e})}(t,o),function(t,e,n){Mk(e.items,(o=>{for(const i of o.groups)i.items=i.items.filter((i=>{const r="string"==typeof i&&!n.has(i);return r&&!e.isUsingDefaultConfig&&C("menu-bar-item-unavailable",{menuBarConfig:t,parentMenuConfig:Dc(o),componentName:i}),!r}))}))}(t,o,n),Dk(t,o),function(t,e){const n=e.t,o={File:n({string:"File",id:"MENU_BAR_MENU_FILE"}),Edit:n({string:"Edit",id:"MENU_BAR_MENU_EDIT"}),View:n({string:"View",id:"MENU_BAR_MENU_VIEW"}),Insert:n({string:"Insert",id:"MENU_BAR_MENU_INSERT"}),Format:n({string:"Format",id:"MENU_BAR_MENU_FORMAT"}),Tools:n({string:"Tools",id:"MENU_BAR_MENU_TOOLS"}),Help:n({string:"Help",id:"MENU_BAR_MENU_HELP"}),Text:n({string:"Text",id:"MENU_BAR_MENU_TEXT"}),Font:n({string:"Font",id:"MENU_BAR_MENU_FONT"})};Mk(t.items,(t=>{t.label in o&&(t.label=o[t.label])}))}(o,e),o}function Ek(t,e,n,o){let i=!1;return Mk(t.items,(t=>{for(const{groupId:r,items:s}of t.groups){if(i)return;if(r===n)"start"===o?(s.unshift(e),i=!0):"end"===o&&(s.push(e),i=!0);else{const t=s.findIndex((t=>Pk(t)===n));-1!==t&&("before"===o?(s.splice(t,0,e),i=!0):"after"===o&&(s.splice(t+1,0,e),i=!0))}}})),i}function Dk(t,e){const n=e.isUsingDefaultConfig;let o=!1;e.items=e.items.filter((e=>!!e.groups.length||(Ik(t,e,n),!1))),e.items.length?(Mk(e.items,(e=>{e.groups=e.groups.filter((t=>!!t.items.length||(o=!0,!1)));for(const i of e.groups)i.items=i.items.filter((e=>!(Ok(e)&&!e.groups.length)||(Ik(t,e,n),o=!0,!1)))})),o&&Dk(t,e)):Ik(t,t,n)}function Ik(t,e,n){n||C("menu-bar-menu-empty",{menuBarConfig:t,emptyMenuConfig:e})}function Mk(t,e){if(Array.isArray(t))for(const e of t)n(e);function n(t){e(t);for(const e of t.groups)for(const t of e.items)Ok(t)&&n(t)}}function Tk(t){return"object"==typeof t&&"menu"in t}function Sk(t){return"object"==typeof t&&"group"in t}function Bk(t){return t.startsWith("start")?"start":t.startsWith("end")?"end":t.startsWith("after")?"after":"before"}function Nk(t){const e=t.match(/^[^:]+:(.+)/);return e?e[1]:null}function Pk(t){return"string"==typeof t?t:t.menuId}function Ok(t){return"object"==typeof t&&"menuId"in t}var Lk=n(9108),zk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Lk.A,zk);Lk.A.locals;class Rk extends dg{constructor(t){super(t);const e=this.bindTemplate;this.set("isVisible",!1),this.set("position","se"),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-reset","ck-menu-bar__menu__panel",e.to("position",(t=>`ck-menu-bar__menu__panel_position_${t}`)),e.if("isVisible","ck-hidden",(t=>!t))],tabindex:"-1"},children:this.children,on:{selectstart:e.to((t=>{"input"!==t.target.tagName.toLocaleLowerCase()&&t.preventDefault()}))}})}focus(t=1){this.children.length&&(1===t?this.children.first.focus():this.children.last.focus())}}var jk=n(4),Fk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(jk.A,Fk);jk.A.locals;const Vk=class extends dg{constructor(t){super(t);const e=this.bindTemplate;this.buttonView=new uk(t),this.buttonView.delegate("mouseenter").to(this),this.buttonView.bind("isOn","isEnabled").to(this,"isOpen","isEnabled"),this.panelView=new Rk(t),this.panelView.bind("isVisible").to(this,"isOpen"),this.keystrokes=new Ji,this.focusTracker=new Zi,this.set("isOpen",!1),this.set("isEnabled",!0),this.set("panelPosition","w"),this.set("class",void 0),this.set("parentMenuView",null),this.setTemplate({tag:"div",attributes:{class:["ck","ck-menu-bar__menu",e.to("class"),e.if("isEnabled","ck-disabled",(t=>!t)),e.if("parentMenuView","ck-menu-bar__menu_top-level",(t=>!t))]},children:[this.buttonView,this.panelView]})}render(){super.render(),this.focusTracker.add(this.buttonView.element),this.focusTracker.add(this.panelView.element),this.keystrokes.listenTo(this.element),Ck.closeOnEscKey(this),this._repositionPanelOnOpen()}_attachBehaviors(){this.parentMenuView?(Ck.openOnButtonClick(this),Ck.openOnArrowRightKey(this),Ck.closeOnArrowLeftKey(this),Ck.closeOnParentClose(this)):(this._propagateArrowKeystrokeEvents(),Ck.openAndFocusPanelOnArrowDownKey(this),Ck.toggleOnButtonClick(this))}_propagateArrowKeystrokeEvents(){this.keystrokes.set("arrowright",((t,e)=>{this.fire("arrowright"),e()})),this.keystrokes.set("arrowleft",((t,e)=>{this.fire("arrowleft"),e()}))}_repositionPanelOnOpen(){this.on("change:isOpen",((t,e,n)=>{if(!n)return;const o=Vk._getOptimalPosition({element:this.panelView.element,target:this.buttonView.element,fitInViewport:!0,positions:this._panelPositions});this.panelView.position=o?o.name:this._panelPositions[0].name}))}focus(){this.buttonView.focus()}get _panelPositions(){const{southEast:t,southWest:e,northEast:n,northWest:o,westSouth:i,eastSouth:r,westNorth:s,eastNorth:a}=vk;return"ltr"===this.locale.uiLanguageDirection?this.parentMenuView?[r,a,i,s]:[t,e,n,o]:this.parentMenuView?[i,s,r,a]:[e,t,o,n]}};let Hk=Vk;Hk._getOptimalPosition=ni;class Uk extends Dm{constructor(t){super(t),this.role="menu"}}var qk=n(977),Gk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(qk.A,Gk);qk.A.locals;class Wk extends Ig{constructor(t){super(t),this.set({withText:!0,withKeystroke:!0,tooltip:!1,role:"menuitem"}),this.extendTemplate({attributes:{class:["ck-menu-bar__menu__item__button"]}})}}class Kk extends Bg{constructor(t){super(t),this.set({withText:!0,withKeystroke:!0,tooltip:!1,role:"menuitem"}),this.extendTemplate({attributes:{class:["ck-menu-bar__menu__item__button"]}})}}var $k=n(497),Yk={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()($k.A,Yk);$k.A.locals;const Qk=["mouseenter","arrowleft","arrowright","change:isOpen"];class Zk extends dg{constructor(t){super(t),this.menus=[];const e=t.t;this.set("isOpen",!1),this._setupIsOpenUpdater(),this.children=this.createCollection(),this.setTemplate({tag:"div",attributes:{class:["ck","ck-menu-bar"],"aria-label":e("Editor menu bar"),role:"menubar"},children:this.children})}fillFromConfig(t,e){const n=xk({normalizedConfig:t,locale:this.locale,componentFactory:e}).items.map((t=>this._createMenu({componentFactory:e,menuDefinition:t})));this.children.addMany(n)}render(){super.render(),_k.toggleMenusAndFocusItemsOnHover(this),_k.closeMenusWhenTheBarCloses(this),_k.closeMenuWhenAnotherOnTheSameLevelOpens(this),_k.focusCycleMenusOnArrows(this),_k.closeOnClickOutside(this)}focus(){this.children.first&&this.children.first.focus()}close(){for(const t of this.children)t.isOpen=!1}registerMenu(t,e=null){e?(t.delegate(...Qk).to(e),t.parentMenuView=e):t.delegate(...Qk).to(this,(t=>"menu:"+t)),t._attachBehaviors(),this.menus.push(t)}_createMenu({componentFactory:t,menuDefinition:e,parentMenuView:n}){const o=this.locale,i=new Hk(o);return this.registerMenu(i,n),i.buttonView.set({label:e.label}),i.once("change:isOpen",(()=>{const n=new Uk(o);n.ariaLabel=e.label,i.panelView.children.add(n),n.items.addMany(this._createMenuItems({menuDefinition:e,parentMenuView:i,componentFactory:t}))})),i}_createMenuItems({menuDefinition:t,parentMenuView:e,componentFactory:n}){const o=this.locale,i=[];for(const r of t.groups){for(const t of r.items){const r=new mk(o,e);if(F(t))r.children.add(this._createMenu({componentFactory:n,menuDefinition:t,parentMenuView:e}));else{const o=this._createMenuItemContentFromFactory({componentName:t,componentFactory:n,parentMenuView:e});if(!o)continue;r.children.add(o)}i.push(r)}r!==t.groups[t.groups.length-1]&&i.push(new vm(o))}return i}_createMenuItemContentFromFactory({componentName:t,parentMenuView:e,componentFactory:n}){const o=n.create(t);return o instanceof Hk||o instanceof Wk||o instanceof Kk?(this._registerMenuTree(o,e),o.on("execute",(()=>{this.close()})),o):(C("menu-bar-component-unsupported",{componentName:t,componentView:o}),null)}_registerMenuTree(t,e){if(!(t instanceof Hk))return void t.delegate("mouseenter").to(e);this.registerMenu(t,e);const n=t.panelView.children.filter((t=>t instanceof Uk))[0];if(!n)return void t.delegate("mouseenter").to(e);const o=n.items.filter((t=>t instanceof Cm));for(const e of o)this._registerMenuTree(e.children.get(0),t)}_setupIsOpenUpdater(){let t;this.on("menu:change:isOpen",((e,n,o)=>{clearTimeout(t),o?this.isOpen=!0:t=setTimeout((()=>{this.isOpen=Array.from(this.children).some((t=>t.isOpen))}),0)}))}}class Jk extends pf{constructor(t,e){super(t),this.view=e,this._toolbarConfig=gm(t.config.get("toolbar")),this._menuBarConfig=function(t){let e;return e="items"in t&&t.items?Ak({items:t.items,removeItems:[],addItems:[],isVisible:!0,isUsingDefaultConfig:!1},t):Ak({items:Dc(yk),addItems:[],removeItems:[],isVisible:!0,isUsingDefaultConfig:!0},t),e}(t.config.get("menuBar")||{}),this._elementReplacer=new X,this.listenTo(t.editing.view,"scrollToTheSelection",this._handleScrollToTheSelectionWithStickyPanel.bind(this))}get element(){return this.view.element}init(t){const e=this.editor,n=this.view,o=e.editing.view,i=n.editable,r=o.document.getRoot();i.name=r.rootName,n.render();const s=i.element;this.setEditableElement(i.name,s),n.editable.bind("isFocused").to(this.focusTracker),o.attachDomRoot(s),t&&this._elementReplacer.replace(t,this.element),this._initPlaceholder(),this._initToolbar(),this._initMenuBar(),this._initDialogPluginIntegration(),this.fire("ready")}destroy(){super.destroy();const t=this.view,e=this.editor.editing.view;this._elementReplacer.restore(),e.detachDomRoot(t.editable.name),t.destroy()}_initToolbar(){const t=this.view;t.stickyPanel.bind("isActive").to(this.focusTracker,"isFocused"),t.stickyPanel.limiterElement=t.element,t.stickyPanel.bind("viewportTopOffset").to(this,"viewportOffset",(({top:t})=>t||0)),t.toolbar.fillFromConfig(this._toolbarConfig,this.componentFactory),this.addToolbar(t.toolbar)}_initMenuBar(){const t=this.view;t.menuBarView&&(this._setupMenuBarBehaviors(t.menuBarView.element),t.menuBarView.fillFromConfig(this._menuBarConfig,this.componentFactory))}_initPlaceholder(){const t=this.editor,e=t.editing.view,n=e.document.getRoot(),o=t.sourceElement;let i;const r=t.config.get("placeholder");r&&(i="string"==typeof r?r:r[this.view.editable.name]),!i&&o&&"textarea"===o.tagName.toLowerCase()&&(i=o.getAttribute("placeholder")),i&&(n.placeholder=i),vr({view:e,element:n,isDirectHost:!1,keepOnFocus:!0})}_handleScrollToTheSelectionWithStickyPanel(t,e,n){const o=this.view.stickyPanel;if(o.isSticky){const t=new Ho(o.element).height;e.viewportOffset.top+=t}else{const t=()=>{this.editor.editing.view.scrollToTheSelection(n)};this.listenTo(o,"change:isSticky",t),setTimeout((()=>{this.stopListening(o,"change:isSticky",t)}),20)}}_initDialogPluginIntegration(){if(!this.editor.plugins.has("Dialog"))return;const t=this.view.stickyPanel,e=this.editor.plugins.get("Dialog");e.on("show",(()=>{const n=e.view;n.on("moveTo",((e,o)=>{if(!t.isSticky||n.wasMoved)return;const i=new Ho(t.contentPanelElement);o[1]{t.contains(this.focusTracker.focusedElement)&&(e.editing.view.focus(),o())})),e.keystrokes.set("Alt+F9",((e,n)=>{t.contains(this.focusTracker.focusedElement)||(this.view.menuBarView.focus(),n())}))}}var Xk=n(7388),tb={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Xk.A,tb);Xk.A.locals;class eb extends Af{constructor(t,e,n={}){super(t),this.stickyPanel=new Lf(t),this.toolbar=new bm(t,{shouldGroupWhenFull:n.shouldToolbarGroupWhenFull}),n.useMenuBar&&(this.menuBarView=new Zk(t)),this.editable=new Cf(t,e)}render(){super.render(),this.menuBarView?this.stickyPanel.content.addMany([this.menuBarView,this.toolbar]):this.stickyPanel.content.add(this.toolbar),this.top.add(this.stickyPanel),this.main.add(this.editable)}}class nb{constructor(t){if(this.crashes=[],this.state="initializing",this._now=Date.now,this.crashes=[],this._crashNumberLimit="number"==typeof t.crashNumberLimit?t.crashNumberLimit:3,this._minimumNonErrorTimePeriod="number"==typeof t.minimumNonErrorTimePeriod?t.minimumNonErrorTimePeriod:5e3,this._boundErrorHandler=t=>{const e="error"in t?t.error:t.reason;e instanceof Error&&this._handleError(e,t)},this._listeners={},!this._restart)throw new Error("The Watchdog class was split into the abstract `Watchdog` class and the `EditorWatchdog` class. Please, use `EditorWatchdog` if you have used the `Watchdog` class previously.")}destroy(){this._stopErrorHandling(),this._listeners={}}on(t,e){this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e)}off(t,e){this._listeners[t]=this._listeners[t].filter((t=>t!==e))}_fire(t,...e){const n=this._listeners[t]||[];for(const t of n)t.apply(this,[null,...e])}_startErrorHandling(){window.addEventListener("error",this._boundErrorHandler),window.addEventListener("unhandledrejection",this._boundErrorHandler)}_stopErrorHandling(){window.removeEventListener("error",this._boundErrorHandler),window.removeEventListener("unhandledrejection",this._boundErrorHandler)}_handleError(t,e){if(this._shouldReactToError(t)){this.crashes.push({message:t.message,stack:t.stack,filename:e instanceof ErrorEvent?e.filename:void 0,lineno:e instanceof ErrorEvent?e.lineno:void 0,colno:e instanceof ErrorEvent?e.colno:void 0,date:this._now()});const n=this._shouldRestart();this.state="crashed",this._fire("stateChange"),this._fire("error",{error:t,causesRestart:n}),n?this._restart():(this.state="crashedPermanently",this._fire("stateChange"))}}_shouldReactToError(t){return t.is&&t.is("CKEditorError")&&void 0!==t.context&&null!==t.context&&"ready"===this.state&&this._isErrorComingFromThisItem(t)}_shouldRestart(){if(this.crashes.length<=this._crashNumberLimit)return!0;return(this.crashes[this.crashes.length-1].date-this.crashes[this.crashes.length-1-this._crashNumberLimit].date)/this._crashNumberLimit>this._minimumNonErrorTimePeriod}}function ob(t,e=new Set){const n=[t],o=new Set;let i=0;for(;n.length>i;){const t=n[i++];if(!o.has(t)&&ib(t)&&!e.has(t))if(o.add(t),Symbol.iterator in t)try{for(const e of t)n.push(e)}catch(t){}else for(const e in t)"defaultValue"!==e&&n.push(t[e])}return o}function ib(t){const e=Object.prototype.toString.call(t),n=typeof t;return!("number"===n||"boolean"===n||"string"===n||"symbol"===n||"function"===n||"[object Date]"===e||"[object RegExp]"===e||"[object Module]"===e||null==t||t._watchdogExcluded||t instanceof EventTarget||t instanceof Event)}function rb(t,e,n=new Set){if(t===e&&("object"==typeof(o=t)&&null!==o))return!0;var o;const i=ob(t,n),r=ob(e,n);for(const t of i)if(r.has(t))return!0;return!1}var sb=Object.defineProperty,ab=Object.defineProperties,cb=Object.getOwnPropertyDescriptors,lb=Object.getOwnPropertySymbols,db=Object.prototype.hasOwnProperty,ub=Object.prototype.propertyIsEnumerable,hb=(t,e,n)=>e in t?sb(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,gb=(t,e)=>{for(var n in e||(e={}))db.call(e,n)&&hb(t,n,e[n]);if(lb)for(var n of lb(e))ub.call(e,n)&&hb(t,n,e[n]);return t};class mb extends nb{constructor(t,e={}){super(e),this._editor=null,this._lifecyclePromise=null,this._initUsingData=!0,this._editables={},this._throttledSave=Up(this._save.bind(this),"number"==typeof e.saveInterval?e.saveInterval:5e3),t&&(this._creator=(e,n)=>t.create(e,n)),this._destructor=t=>t.destroy()}get editor(){return this._editor}get _item(){return this._editor}setCreator(t){this._creator=t}setDestructor(t){this._destructor=t}_restart(){return Promise.resolve().then((()=>(this.state="initializing",this._fire("stateChange"),this._destroy()))).catch((t=>{console.error("An error happened during the editor destroying.",t)})).then((()=>{const t={},e=[],n=this._config.rootsAttributes||{},o={};for(const[i,r]of Object.entries(this._data.roots))r.isLoaded?(t[i]="",o[i]=n[i]||{}):e.push(i);const i=(r=gb({},this._config),s={extraPlugins:this._config.extraPlugins||[],lazyRoots:e,rootsAttributes:o,_watchdogInitialData:this._data},ab(r,cb(s)));var r,s;return delete i.initialData,i.extraPlugins.push(pb),this._initUsingData?this.create(t,i,i.context):xo(this._elementOrData)?this.create(this._elementOrData,i,i.context):this.create(this._editables,i,i.context)})).then((()=>{this._fire("restart")}))}create(t=this._elementOrData,e=this._config,n){return this._lifecyclePromise=Promise.resolve(this._lifecyclePromise).then((()=>(super._startErrorHandling(),this._elementOrData=t,this._initUsingData="string"==typeof t||Object.keys(t).length>0&&"string"==typeof Object.values(t)[0],this._config=this._cloneEditorConfiguration(e)||{},this._config.context=n,this._creator(t,this._config)))).then((t=>{this._editor=t,t.model.document.on("change:data",this._throttledSave),this._lastDocumentVersion=t.model.document.version,this._data=this._getData(),this._initUsingData||(this._editables=this._getEditables()),this.state="ready",this._fire("stateChange")})).finally((()=>{this._lifecyclePromise=null})),this._lifecyclePromise}destroy(){return this._lifecyclePromise=Promise.resolve(this._lifecyclePromise).then((()=>(this.state="destroyed",this._fire("stateChange"),super.destroy(),this._destroy()))).finally((()=>{this._lifecyclePromise=null})),this._lifecyclePromise}_destroy(){return Promise.resolve().then((()=>{this._stopErrorHandling(),this._throttledSave.cancel();const t=this._editor;return this._editor=null,t.model.document.off("change:data",this._throttledSave),this._destructor(t)}))}_save(){const t=this._editor.model.document.version;try{this._data=this._getData(),this._initUsingData||(this._editables=this._getEditables()),this._lastDocumentVersion=t}catch(t){console.error(t,"An error happened during restoring editor data. Editor will be restored from the previously saved data.")}}_setExcludedProperties(t){this._excludedProps=t}_getData(){const t=this._editor,e=t.model.document.roots.filter((t=>t.isAttached()&&"$graveyard"!=t.rootName)),{plugins:n}=t,o=n.has("CommentsRepository")&&n.get("CommentsRepository"),i=n.has("TrackChanges")&&n.get("TrackChanges"),r={roots:{},markers:{},commentThreads:JSON.stringify([]),suggestions:JSON.stringify([])};e.forEach((t=>{r.roots[t.rootName]={content:JSON.stringify(Array.from(t.getChildren())),attributes:JSON.stringify(Array.from(t.getAttributes())),isLoaded:t._isLoaded}}));for(const e of t.model.markers)e._affectsData&&(r.markers[e.name]={rangeJSON:e.getRange().toJSON(),usingOperation:e._managedUsingOperations,affectsData:e._affectsData});return o&&(r.commentThreads=JSON.stringify(o.getCommentThreads({toJSON:!0,skipNotAttached:!0}))),i&&(r.suggestions=JSON.stringify(i.getSuggestions({toJSON:!0,skipNotAttached:!0}))),r}_getEditables(){const t={};for(const e of this.editor.model.document.getRootNames()){const n=this.editor.ui.getEditableElement(e);n&&(t[e]=n)}return t}_isErrorComingFromThisItem(t){return rb(this._editor,t.context,this._excludedProps)}_cloneEditorConfiguration(t){return yo(t,((t,e)=>xo(t)||"context"===e?t:void 0))}}class pb{constructor(t){this.editor=t,this._data=t.config.get("_watchdogInitialData")}init(){this.editor.data.on("init",(t=>{t.stop(),this.editor.model.enqueueChange({isUndoable:!1},(t=>{this._restoreCollaborationData(),this._restoreEditorData(t)})),this.editor.data.fire("ready")}),{priority:999})}_createNode(t,e){if("name"in e){const n=t.createElement(e.name,e.attributes);if(e.children)for(const o of e.children)n._appendChild(this._createNode(t,o));return n}return t.createText(e.data,e.attributes)}_restoreEditorData(t){const e=this.editor;Object.entries(this._data.roots).forEach((([n,{content:o,attributes:i}])=>{const r=JSON.parse(o),s=JSON.parse(i),a=e.model.document.getRoot(n);for(const[e,n]of s)t.setAttribute(e,n,a);for(const e of r){const n=this._createNode(t,e);t.insert(n,a,"end")}})),Object.entries(this._data.markers).forEach((([n,o])=>{const{document:i}=e.model,r=o,{rangeJSON:{start:s,end:a}}=r,c=((t,e)=>{var n={};for(var o in t)db.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(null!=t&&lb)for(var o of lb(t))e.indexOf(o)<0&&ub.call(t,o)&&(n[o]=t[o]);return n})(r,["rangeJSON"]),l=i.getRoot(s.root),d=t.createPositionFromPath(l,s.path,s.stickiness),u=t.createPositionFromPath(l,a.path,a.stickiness),h=t.createRange(d,u);t.addMarker(n,gb({range:h},c))}))}_restoreCollaborationData(){const t=JSON.parse(this._data.commentThreads),e=JSON.parse(this._data.suggestions);t.forEach((t=>{const e=this.editor.config.get("collaboration.channelId"),n=this.editor.plugins.get("CommentsRepository");if(n.hasCommentThread(t.threadId)){n.getCommentThread(t.threadId).remove()}n.addCommentThread(gb({channelId:e},t))})),e.forEach((t=>{const e=this.editor.plugins.get("TrackChangesEditing");if(e.hasSuggestion(t.id)){e.getSuggestion(t.id).attributes=t.attributes}else e.addSuggestionData(t)}))}}const fb=Symbol("MainQueueId");class kb{constructor(){this._onEmptyCallbacks=[],this._queues=new Map,this._activeActions=0}onEmpty(t){this._onEmptyCallbacks.push(t)}enqueue(t,e){const n=t===fb;this._activeActions++,this._queues.get(t)||this._queues.set(t,Promise.resolve());const o=(n?Promise.all(this._queues.values()):Promise.all([this._queues.get(fb),this._queues.get(t)])).then(e),i=o.catch((()=>{}));return this._queues.set(t,i),o.finally((()=>{this._activeActions--,this._queues.get(t)===i&&0===this._activeActions&&this._onEmptyCallbacks.forEach((t=>t()))}))}}function bb(t){return Array.isArray(t)?t:[t]}class wb extends(zh(Lh)){constructor(t,e={}){if(!Ab(t)&&void 0!==e.initialData)throw new _("editor-create-initial-data",null);super(e),this.config.define("menuBar.isVisible",!1),void 0===this.config.get("initialData")&&this.config.set("initialData",function(t){return Ab(t)?(e=t,e instanceof HTMLTextAreaElement?e.value:e.innerHTML):t;var e}(t)),Ab(t)&&(this.sourceElement=t),this.model.document.createRoot();const n=!this.config.get("toolbar.shouldNotGroupWhenFull"),o=this.config.get("menuBar"),i=new eb(this.locale,this.editing.view,{shouldToolbarGroupWhenFull:n,useMenuBar:o.isVisible});this.ui=new Jk(this,i),function(t){if(!Ht(t.updateSourceElement))throw new _("attachtoform-missing-elementapi-interface",t);const e=t.sourceElement;if(function(t){return!!t&&"textarea"===t.tagName.toLowerCase()}(e)&&e.form){let n;const o=e.form,i=()=>t.updateSourceElement();Ht(o.submit)&&(n=o.submit,o.submit=()=>{i(),n.apply(o)}),o.addEventListener("submit",i),t.on("destroy",(()=>{o.removeEventListener("submit",i),n&&(o.submit=n)}))}}(this)}destroy(){return this.sourceElement&&this.updateSourceElement(),this.ui.destroy(),super.destroy()}static create(t,e={}){return new Promise((n=>{const o=new this(t,e);n(o.initPlugins().then((()=>o.ui.init(Ab(t)?t:null))).then((()=>o.data.init(o.config.get("initialData")))).then((()=>o.fire("ready"))).then((()=>o)))}))}}function Ab(t){return xo(t)}wb.Context=mr,wb.EditorWatchdog=mb,wb.ContextWatchdog=class extends nb{constructor(t,e={}){super(e),this._watchdogs=new Map,this._context=null,this._contextProps=new Set,this._actionQueues=new kb,this._watchdogConfig=e,this._creator=e=>t.create(e),this._destructor=t=>t.destroy(),this._actionQueues.onEmpty((()=>{"initializing"===this.state&&(this.state="ready",this._fire("stateChange"))}))}setCreator(t){this._creator=t}setDestructor(t){this._destructor=t}get context(){return this._context}create(t={}){return this._actionQueues.enqueue(fb,(()=>(this._contextConfig=t,this._create())))}getItem(t){return this._getWatchdog(t)._item}getItemState(t){return this._getWatchdog(t).state}add(t){const e=bb(t);return Promise.all(e.map((t=>this._actionQueues.enqueue(t.id,(()=>{if("destroyed"===this.state)throw new Error("Cannot add items to destroyed watchdog.");if(!this._context)throw new Error("Context was not created yet. You should call the `ContextWatchdog#create()` method first.");let e;if(this._watchdogs.has(t.id))throw new Error(`Item with the given id is already added: '${t.id}'.`);if("editor"===t.type)return e=new mb(null,this._watchdogConfig),e.setCreator(t.creator),e._setExcludedProperties(this._contextProps),t.destructor&&e.setDestructor(t.destructor),this._watchdogs.set(t.id,e),e.on("error",((n,{error:o,causesRestart:i})=>{this._fire("itemError",{itemId:t.id,error:o}),i&&this._actionQueues.enqueue(t.id,(()=>new Promise((n=>{const o=()=>{e.off("restart",o),this._fire("itemRestart",{itemId:t.id}),n()};e.on("restart",o)}))))})),e.create(t.sourceElementOrData,t.config,this._context);throw new Error(`Not supported item type: '${t.type}'.`)})))))}remove(t){const e=bb(t);return Promise.all(e.map((t=>this._actionQueues.enqueue(t,(()=>{const e=this._getWatchdog(t);return this._watchdogs.delete(t),e.destroy()})))))}destroy(){return this._actionQueues.enqueue(fb,(()=>(this.state="destroyed",this._fire("stateChange"),super.destroy(),this._destroy())))}_restart(){return this._actionQueues.enqueue(fb,(()=>(this.state="initializing",this._fire("stateChange"),this._destroy().catch((t=>{console.error("An error happened during destroying the context or items.",t)})).then((()=>this._create())).then((()=>this._fire("restart"))))))}_create(){return Promise.resolve().then((()=>(this._startErrorHandling(),this._creator(this._contextConfig)))).then((t=>(this._context=t,this._contextProps=ob(this._context),Promise.all(Array.from(this._watchdogs.values()).map((t=>(t._setExcludedProperties(this._contextProps),t.create(void 0,void 0,this._context))))))))}_destroy(){return Promise.resolve().then((()=>{this._stopErrorHandling();const t=this._context;return this._context=null,this._contextProps=new Set,Promise.all(Array.from(this._watchdogs.values()).map((t=>t.destroy()))).then((()=>this._destructor(t)))}))}_getWatchdog(t){const e=this._watchdogs.get(t);if(!e)throw new Error(`Item with the given id was not registered: ${t}.`);return e}_isErrorComingFromThisItem(t){for(const e of this._watchdogs.values())if(e._isErrorComingFromThisItem(t))return!1;return rb(this._context,t.context)}};class _b extends Pa{constructor(t){super(t),this.domEventType=["paste","copy","cut","drop","dragover","dragstart","dragend","dragenter","dragleave"];const e=this.document;function n(t){return(n,o)=>{o.preventDefault();const i=o.dropRange?[o.dropRange]:null,r=new p(e,t);e.fire(r,{dataTransfer:o.dataTransfer,method:n.name,targetRanges:i,target:o.target,domEvent:o.domEvent}),r.stop.called&&o.stopPropagation()}}this.listenTo(e,"paste",n("clipboardInput"),{priority:"low"}),this.listenTo(e,"drop",n("clipboardInput"),{priority:"low"}),this.listenTo(e,"dragover",n("dragging"),{priority:"low"})}onDomEvent(t){const e="clipboardData"in t?t.clipboardData:t.dataTransfer,n="drop"==t.type||"paste"==t.type,o={dataTransfer:new Cc(e,{cacheFiles:n})};"drop"!=t.type&&"dragover"!=t.type||(o.dropRange=function(t,e){const n=e.target.ownerDocument,o=e.clientX,i=e.clientY;let r;n.caretRangeFromPoint&&n.caretRangeFromPoint(o,i)?r=n.caretRangeFromPoint(o,i):e.rangeParent&&(r=n.createRange(),r.setStart(e.rangeParent,e.rangeOffset),r.collapse(!0));if(r)return t.domConverter.domRangeToView(r);return null}(this.view,t)),this.fire(t.type,t,o)}}const Cb=["figcaption","li"],vb=["ol","ul"];function yb(t){if(t.is("$text")||t.is("$textProxy"))return t.data;if(t.is("element","img")&&t.hasAttribute("alt"))return t.getAttribute("alt");if(t.is("element","br"))return"\n";let e="",n=null;for(const o of t.getChildren())e+=xb(o,n)+yb(o),n=o;return e}function xb(t,e){return e?t.is("element","li")&&!t.isEmpty&&t.getChild(0).is("containerElement")||vb.includes(t.name)&&vb.includes(e.name)?"\n\n":t.is("containerElement")||e.is("containerElement")?Cb.includes(t.name)||Cb.includes(e.name)?"\n":"\n\n":"":""}const Eb=function(t,e){return t&&Ei(t,e,dn)};const Db=function(t,e,n,o){var i=n.length,r=i,s=!o;if(null==t)return!r;for(t=Object(t);i--;){var a=n[i];if(s&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++ie in t?Vb(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class $b extends rr{constructor(){super(...arguments),this._markersToCopy=new Map}static get pluginName(){return"ClipboardMarkersUtils"}_registerMarkerToCopy(t,e){this._markersToCopy.set(t,e)}_copySelectedFragmentWithMarkers(t,e,n=(t=>t.model.getSelectedContent(t.model.document.selection))){return this.editor.model.change((o=>{const i=o.model.document.selection;o.setSelection(e);const r=this._insertFakeMarkersIntoSelection(o,o.model.document.selection,t),s=n(o),a=this._removeFakeMarkersInsideElement(o,s);for(const[t,e]of Object.entries(r)){a[t]||(a[t]=o.createRangeIn(s));for(const t of e)o.remove(t)}s.markers.clear();for(const[t,e]of Object.entries(a))s.markers.set(t,e);return o.setSelection(i),s}))}_pasteMarkersIntoTransformedElement(t,e){const n=this._getPasteMarkersFromRangeMap(t);return this.editor.model.change((t=>{const o=this._insertFakeMarkersElements(t,n),i=e(t),r=this._removeFakeMarkersInsideElement(t,i);for(const e of Object.values(o).flat())t.remove(e);for(const[e,n]of Object.entries(r))t.model.markers.has(e)||t.addMarker(e,{usingOperation:!0,affectsData:!0,range:n});return i}))}_pasteFragmentWithMarkers(t){const e=this._getPasteMarkersFromRangeMap(t.markers);t.markers.clear();for(const n of e)t.markers.set(n.name,n.range);return this.editor.model.insertContent(t)}_forceMarkersCopy(t,e,n={allowedActions:"all",copyPartiallySelected:!0,duplicateOnPaste:!0}){const o=this._markersToCopy.get(t);this._markersToCopy.set(t,n),e(),o?this._markersToCopy.set(t,o):this._markersToCopy.delete(t)}_isMarkerCopyable(t,e){const n=this._getMarkerClipboardConfig(t);if(!n)return!1;if(!e)return!0;const{allowedActions:o}=n;return"all"===o||o.includes(e)}_hasMarkerConfiguration(t){return!!this._getMarkerClipboardConfig(t)}_getMarkerClipboardConfig(t){const[e]=t.split(":");return this._markersToCopy.get(e)||null}_insertFakeMarkersIntoSelection(t,e,n){const o=this._getCopyableMarkersFromSelection(t,e,n);return this._insertFakeMarkersElements(t,o)}_getCopyableMarkersFromSelection(t,e,n){const o=Array.from(e.getRanges()),i=new Set(o.flatMap((e=>Array.from(t.model.markers.getMarkersIntersectingRange(e)))));return Array.from(i).filter((t=>{if(!this._isMarkerCopyable(t.name,n))return!1;const{copyPartiallySelected:e}=this._getMarkerClipboardConfig(t.name);if(!e){const e=t.getRange();return o.some((t=>t.containsRange(e,!0)))}return!0})).map((t=>({name:"dragstart"===n?this._getUniqueMarkerName(t.name):t.name,range:t.getRange()})))}_getPasteMarkersFromRangeMap(t,e=null){const{model:n}=this.editor;return(t instanceof Map?Array.from(t.entries()):Object.entries(t)).flatMap((([t,o])=>{if(!this._hasMarkerConfiguration(t))return[{name:t,range:o}];if(this._isMarkerCopyable(t,e)){const e=this._getMarkerClipboardConfig(t),i=n.markers.has(t)&&"$graveyard"===n.markers.get(t).getRange().root.rootName;return(e.duplicateOnPaste||i)&&(t=this._getUniqueMarkerName(t)),[{name:t,range:o}]}return[]}))}_insertFakeMarkersElements(t,e){const n={},o=e.flatMap((t=>{const{start:e,end:n}=t.range;return[{position:e,marker:t,type:"start"},{position:n,marker:t,type:"end"}]})).sort((({position:t},{position:e})=>t.isBefore(e)?1:-1));for(const{position:e,marker:i,type:r}of o){const o=t.createElement("$marker",{"data-name":i.name,"data-type":r});n[i.name]||(n[i.name]=[]),n[i.name].push(o),t.insert(o,e)}return n}_removeFakeMarkersInsideElement(t,e){const n=this._getAllFakeMarkersFromElement(t,e).reduce(((e,n)=>{const o=n.markerElement&&t.createPositionBefore(n.markerElement);let i=e[n.name],r=!1;if(i&&i.start&&i.end){this._getMarkerClipboardConfig(n.name).duplicateOnPaste?e[this._getUniqueMarkerName(n.name)]=e[n.name]:r=!0,i=null}var s,a;return r||(e[n.name]=(s=((t,e)=>{for(var n in e||(e={}))Gb.call(e,n)&&Kb(t,n,e[n]);if(qb)for(var n of qb(e))Wb.call(e,n)&&Kb(t,n,e[n]);return t})({},i),a={[n.type]:o},Hb(s,Ub(a)))),n.markerElement&&t.remove(n.markerElement),e}),{});return Fb(n,(n=>new Uc(n.start||t.createPositionFromPath(e,[0]),n.end||t.createPositionAt(e,"end"))))}_getAllFakeMarkersFromElement(t,e){const n=Array.from(t.createRangeIn(e)).flatMap((({item:t})=>{if(!t.is("element","$marker"))return[];const e=t.getAttribute("data-name"),n=t.getAttribute("data-type");return[{markerElement:t,name:e,type:n}]})),o=[],i=[];for(const t of n){if("end"===t.type){n.some((e=>e.name===t.name&&"start"===e.type))||o.push({markerElement:null,name:t.name,type:"start"})}if("start"===t.type){n.some((e=>e.name===t.name&&"end"===e.type))||i.unshift({markerElement:null,name:t.name,type:"end"})}}return[...o,...n,...i]}_getUniqueMarkerName(t){const e=t.split(":"),n=k().substring(1,6);return 3===e.length?`${e.slice(0,2).join(":")}:${n}`:`${e.join(":")}:${n}`}}class Yb extends rr{static get pluginName(){return"ClipboardPipeline"}static get requires(){return[$b]}init(){this.editor.editing.view.addObserver(_b),this._setupPasteDrop(),this._setupCopyCut()}_fireOutputTransformationEvent(t,e,n){const o=this.editor.plugins.get("ClipboardMarkersUtils");this.editor.model.enqueueChange({isUndoable:"cut"===n},(()=>{const i=o._copySelectedFragmentWithMarkers(n,e);this.fire("outputTransformation",{dataTransfer:t,content:i,method:n})}))}_setupPasteDrop(){const t=this.editor,e=t.model,n=t.editing.view,o=n.document,i=this.editor.plugins.get("ClipboardMarkersUtils");this.listenTo(o,"clipboardInput",((e,n)=>{"paste"!=n.method||t.model.canEditAt(t.model.document.selection)||e.stop()}),{priority:"highest"}),this.listenTo(o,"clipboardInput",((t,e)=>{const o=e.dataTransfer;let i;if(e.content)i=e.content;else{let t="";o.getData("text/html")?t=function(t){return t.replace(/(\s+)<\/span>/g,((t,e)=>1==e.length?" ":e)).replace(//g,"")}(o.getData("text/html")):o.getData("text/plain")&&(((r=(r=o.getData("text/plain")).replace(/&/g,"&").replace(//g,">").replace(/\r?\n\r?\n/g,"

").replace(/\r?\n/g,"
").replace(/\t/g,"    ").replace(/^\s/," ").replace(/\s$/," ").replace(/\s\s/g,"  ")).includes("

")||r.includes("
"))&&(r=`

${r}

`),t=r),i=this.editor.data.htmlProcessor.toView(t)}var r;const s=new p(this,"inputTransformation");this.fire(s,{content:i,dataTransfer:o,targetRanges:e.targetRanges,method:e.method}),s.stop.called&&t.stop(),n.scrollToTheSelection()}),{priority:"low"}),this.listenTo(this,"inputTransformation",((t,n)=>{if(n.content.isEmpty)return;const o=this.editor.data.toModel(n.content,"$clipboardHolder");0!=o.childCount&&(t.stop(),e.change((()=>{this.fire("contentInsertion",{content:o,method:n.method,dataTransfer:n.dataTransfer,targetRanges:n.targetRanges})})))}),{priority:"low"}),this.listenTo(this,"contentInsertion",((t,e)=>{e.resultRange=i._pasteFragmentWithMarkers(e.content)}),{priority:"low"})}_setupCopyCut(){const t=this.editor,e=t.model.document,n=t.editing.view.document,o=(t,n)=>{const o=n.dataTransfer;n.preventDefault(),this._fireOutputTransformationEvent(o,e.selection,t.name)};this.listenTo(n,"copy",o,{priority:"low"}),this.listenTo(n,"cut",((e,n)=>{t.model.canEditAt(t.model.document.selection)?o(e,n):n.preventDefault()}),{priority:"low"}),this.listenTo(this,"outputTransformation",((e,o)=>{const i=t.data.toView(o.content);n.fire("clipboardOutput",{dataTransfer:o.dataTransfer,content:i,method:o.method})}),{priority:"low"}),this.listenTo(n,"clipboardOutput",((n,o)=>{o.content.isEmpty||(o.dataTransfer.setData("text/html",this.editor.data.htmlProcessor.toData(o.content)),o.dataTransfer.setData("text/plain",yb(o.content))),"cut"==o.method&&t.model.deleteContent(e.selection)}),{priority:"low"})}}class Qb{constructor(t,e=20){this._batch=null,this.model=t,this._size=0,this.limit=e,this._isLocked=!1,this._changeCallback=(t,e)=>{e.isLocal&&e.isUndoable&&e!==this._batch&&this._reset(!0)},this._selectionChangeCallback=()=>{this._reset()},this.model.document.on("change",this._changeCallback),this.model.document.selection.on("change:range",this._selectionChangeCallback),this.model.document.selection.on("change:attribute",this._selectionChangeCallback)}get batch(){return this._batch||(this._batch=this.model.createBatch({isTyping:!0})),this._batch}get size(){return this._size}input(t){this._size+=t,this._size>=this.limit&&this._reset(!0)}get isLocked(){return this._isLocked}lock(){this._isLocked=!0}unlock(){this._isLocked=!1}destroy(){this.model.document.off("change",this._changeCallback),this.model.document.selection.off("change:range",this._selectionChangeCallback),this.model.document.selection.off("change:attribute",this._selectionChangeCallback)}_reset(t=!1){this.isLocked&&!t||(this._batch=null,this._size=0)}}class Zb extends ar{constructor(t,e){super(t),this._buffer=new Qb(t.model,e),this._isEnabledBasedOnSelection=!1}get buffer(){return this._buffer}destroy(){super.destroy(),this._buffer.destroy()}execute(t={}){const e=this.editor.model,n=e.document,o=t.text||"",i=o.length;let r=n.selection;if(t.selection?r=t.selection:t.range&&(r=e.createSelection(t.range)),!e.canEditAt(r))return;const s=t.resultRange;e.enqueueChange(this._buffer.batch,(t=>{this._buffer.lock();const a=Array.from(n.selection.getAttributes());e.deleteContent(r),o&&e.insertContent(t.createText(o,a),r),s?t.setSelection(s):r.is("documentSelection")||t.setSelection(r),this._buffer.unlock(),this._buffer.input(i)}))}}const Jb=["insertText","insertReplacementText"];class Xb extends Sa{constructor(t){super(t),this.focusObserver=t.getObserver(wc),c.isAndroid&&Jb.push("insertCompositionText");const e=t.document;e.on("beforeinput",((n,o)=>{if(!this.isEnabled)return;const{data:i,targetRanges:r,inputType:s,domEvent:a}=o;if(!Jb.includes(s))return;this.focusObserver.flush();const c=new p(e,"insertText");e.fire(c,new Na(t,a,{text:i,selection:t.createSelection(r)})),c.stop.called&&n.stop()})),e.on("compositionend",((n,{data:o,domEvent:i})=>{this.isEnabled&&!c.isAndroid&&o&&e.fire("insertText",new Na(t,i,{text:o,selection:e.selection}))}),{priority:"lowest"})}observe(){}stopObserving(){}}class tw extends rr{static get pluginName(){return"Input"}init(){const t=this.editor,e=t.model,n=t.editing.view,o=e.document.selection;n.addObserver(Xb);const i=new Zb(t,t.config.get("typing.undoStep")||20);t.commands.add("insertText",i),t.commands.add("input",i),this.listenTo(n.document,"insertText",((o,i)=>{n.document.isComposing||i.preventDefault();const{text:r,selection:s,resultRange:a}=i,l=Array.from(s.getRanges()).map((e=>t.editing.mapper.toModelRange(e)));let d=r;if(c.isAndroid){const t=Array.from(l[0].getItems()).reduce(((t,e)=>t+(e.is("$textProxy")?e.data:"")),"");t&&(t.length<=d.length?d.startsWith(t)&&(d=d.substring(t.length),l[0].start=l[0].start.getShiftedBy(t.length)):t.startsWith(d)&&(l[0].start=l[0].start.getShiftedBy(d.length),d=""))}const u={text:d,selection:e.createSelection(l)};a&&(u.resultRange=t.editing.mapper.toModelRange(a)),t.execute("insertText",u),n.scrollToTheSelection()})),c.isAndroid?this.listenTo(n.document,"keydown",((t,r)=>{!o.isCollapsed&&229==r.keyCode&&n.document.isComposing&&ew(e,i)})):this.listenTo(n.document,"compositionstart",(()=>{o.isCollapsed||ew(e,i)}))}}function ew(t,e){if(!e.isEnabled)return;const n=e.buffer;n.lock(),t.enqueueChange(n.batch,(()=>{t.deleteContent(t.document.selection)})),n.unlock()}class nw extends ar{constructor(t,e){super(t),this.direction=e,this._buffer=new Qb(t.model,t.config.get("typing.undoStep")),this._isEnabledBasedOnSelection=!1}get buffer(){return this._buffer}execute(t={}){const e=this.editor.model,n=e.document;e.enqueueChange(this._buffer.batch,(o=>{this._buffer.lock();const i=o.createSelection(t.selection||n.selection);if(!e.canEditAt(i))return;const r=t.sequence||1,s=i.isCollapsed;if(i.isCollapsed&&e.modifySelection(i,{direction:this.direction,unit:t.unit,treatEmojiAsSingleUnit:!0}),this._shouldEntireContentBeReplacedWithParagraph(r))return void this._replaceEntireContentWithParagraph(o);if(this._shouldReplaceFirstBlockWithParagraph(i,r))return void this.editor.execute("paragraph",{selection:i});if(i.isCollapsed)return;let a=0;i.getFirstRange().getMinimalFlatRanges().forEach((t=>{a+=tt(t.getWalker({singleCharacters:!0,ignoreElementEnd:!0,shallow:!0}))})),e.deleteContent(i,{doNotResetEntireContent:s,direction:this.direction}),this._buffer.input(a),o.setSelection(i),this._buffer.unlock()}))}_shouldEntireContentBeReplacedWithParagraph(t){if(t>1)return!1;const e=this.editor.model,n=e.document.selection,o=e.schema.getLimitElement(n);if(!(n.isCollapsed&&n.containsEntireContent(o)))return!1;if(!e.schema.checkChild(o,"paragraph"))return!1;const i=o.getChild(0);return!i||!i.is("element","paragraph")}_replaceEntireContentWithParagraph(t){const e=this.editor.model,n=e.document.selection,o=e.schema.getLimitElement(n),i=t.createElement("paragraph");t.remove(t.createRangeIn(o)),t.insert(i,o),t.setSelection(i,0)}_shouldReplaceFirstBlockWithParagraph(t,e){const n=this.editor.model;if(e>1||"backward"!=this.direction)return!1;if(!t.isCollapsed)return!1;const o=t.getFirstPosition(),i=n.schema.getLimitElement(o),r=i.getChild(0);return o.parent==r&&(!!t.containsEntireContent(r)&&(!!n.schema.checkChild(i,"paragraph")&&"paragraph"!=r.name))}}const ow="word",iw="selection",rw="backward",sw="forward",aw={deleteContent:{unit:iw,direction:rw},deleteContentBackward:{unit:"codePoint",direction:rw},deleteWordBackward:{unit:ow,direction:rw},deleteHardLineBackward:{unit:iw,direction:rw},deleteSoftLineBackward:{unit:iw,direction:rw},deleteContentForward:{unit:"character",direction:sw},deleteWordForward:{unit:ow,direction:sw},deleteHardLineForward:{unit:iw,direction:sw},deleteSoftLineForward:{unit:iw,direction:sw}};class cw extends Sa{constructor(t){super(t);const e=t.document;let n=0;e.on("keydown",(()=>{n++})),e.on("keyup",(()=>{n=0})),e.on("beforeinput",((o,i)=>{if(!this.isEnabled)return;const{targetRanges:r,domEvent:s,inputType:a}=i,l=aw[a];if(!l)return;const d={direction:l.direction,unit:l.unit,sequence:n};d.unit==iw&&(d.selectionToRemove=t.createSelection(r[0])),"deleteContentBackward"===a&&(c.isAndroid&&(d.sequence=1),function(t){if(1!=t.length||t[0].isCollapsed)return!1;const e=t[0].getWalker({direction:"backward",singleCharacters:!0,ignoreElementEnd:!0});let n=0;for(const{nextPosition:t}of e){if(t.parent.is("$text")){const e=t.parent.data,o=t.offset;if(er(e,o)||nr(e,o)||ir(e,o))continue;n++}else n++;if(n>1)return!0}return!1}(r)&&(d.unit=iw,d.selectionToRemove=t.createSelection(r)));const u=new Is(e,"delete",r[0]);e.fire(u,new Na(t,s,d)),u.stop.called&&o.stop()})),c.isBlink&&function(t){const e=t.view,n=e.document;let o=null,i=!1;function r(t){return t==bi.backspace||t==bi.delete}function s(t){return t==bi.backspace?rw:sw}n.on("keydown",((t,{keyCode:e})=>{o=e,i=!1})),n.on("keyup",((a,{keyCode:c,domEvent:l})=>{const d=n.selection,u=t.isEnabled&&c==o&&r(c)&&!d.isCollapsed&&!i;if(o=null,u){const t=d.getFirstRange(),o=new Is(n,"delete",t),i={unit:iw,direction:s(c),selectionToRemove:d};n.fire(o,new Na(e,l,i))}})),n.on("beforeinput",((t,{inputType:e})=>{const n=aw[e];r(o)&&n&&n.direction==s(o)&&(i=!0)}),{priority:"high"}),n.on("beforeinput",((t,{inputType:e,data:n})=>{o==bi.delete&&"insertText"==e&&""==n&&t.stop()}),{priority:"high"})}(this)}observe(){}stopObserving(){}}class lw extends rr{static get pluginName(){return"Delete"}init(){const t=this.editor,e=t.editing.view,n=e.document,o=t.model.document;e.addObserver(cw),this._undoOnBackspace=!1;const i=new nw(t,"forward");t.commands.add("deleteForward",i),t.commands.add("forwardDelete",i),t.commands.add("delete",new nw(t,"backward")),this.listenTo(n,"delete",((o,i)=>{n.isComposing||i.preventDefault();const{direction:r,sequence:s,selectionToRemove:a,unit:c}=i,l="forward"===r?"deleteForward":"delete",d={sequence:s};if("selection"==c){const e=Array.from(a.getRanges()).map((e=>t.editing.mapper.toModelRange(e)));d.selection=t.model.createSelection(e)}else d.unit=c;t.execute(l,d),e.scrollToTheSelection()}),{priority:"low"}),this.editor.plugins.has("UndoEditing")&&(this.listenTo(n,"delete",((e,n)=>{this._undoOnBackspace&&"backward"==n.direction&&1==n.sequence&&"codePoint"==n.unit&&(this._undoOnBackspace=!1,t.execute("undo"),n.preventDefault(),e.stop())}),{context:"$capture"}),this.listenTo(o,"change",(()=>{this._undoOnBackspace=!1})))}requestUndoOnBackspace(){this.editor.plugins.has("UndoEditing")&&(this._undoOnBackspace=!0)}}class dw extends rr{static get requires(){return[tw,lw]}static get pluginName(){return"Typing"}}function uw(t,e){let n=t.start;return{text:Array.from(t.getWalker({ignoreElementEnd:!1})).reduce(((t,{item:o})=>o.is("$text")||o.is("$textProxy")?t+o.data:(n=e.createPositionAfter(o),"")),""),range:e.createRange(n,t.end)}}class hw extends(K()){constructor(t,e){super(),this.model=t,this.testCallback=e,this._hasMatch=!1,this.set("isEnabled",!0),this.on("change:isEnabled",(()=>{this.isEnabled?this._startListening():(this.stopListening(t.document.selection),this.stopListening(t.document))})),this._startListening()}get hasMatch(){return this._hasMatch}_startListening(){const t=this.model.document;this.listenTo(t.selection,"change:range",((e,{directChange:n})=>{n&&(t.selection.isCollapsed?this._evaluateTextBeforeSelection("selection"):this.hasMatch&&(this.fire("unmatched"),this._hasMatch=!1))})),this.listenTo(t,"change:data",((t,e)=>{!e.isUndo&&e.isLocal&&this._evaluateTextBeforeSelection("data",{batch:e})}))}_evaluateTextBeforeSelection(t,e={}){const n=this.model,o=n.document.selection,i=n.createRange(n.createPositionAt(o.focus.parent,0),o.focus),{text:r,range:s}=uw(i,n),a=this.testCallback(r);if(!a&&this.hasMatch&&this.fire("unmatched"),this._hasMatch=!!a,a){const n=Object.assign(e,{text:r,range:s});"object"==typeof a&&Object.assign(n,a),this.fire(`matched:${t}`,n)}}}class gw extends rr{constructor(t){super(t),this._isNextGravityRestorationSkipped=!1,this.attributes=new Set,this._overrideUid=null}static get pluginName(){return"TwoStepCaretMovement"}init(){const t=this.editor,e=t.model,n=t.editing.view,o=t.locale,i=e.document.selection;this.listenTo(n.document,"arrowKey",((t,e)=>{if(!i.isCollapsed)return;if(e.shiftKey||e.altKey||e.ctrlKey)return;const n=e.keyCode==bi.arrowright,r=e.keyCode==bi.arrowleft;if(!n&&!r)return;const s=o.contentLanguageDirection;let a=!1;a="ltr"===s&&n||"rtl"===s&&r?this._handleForwardMovement(e):this._handleBackwardMovement(e),!0===a&&t.stop()}),{context:"$text",priority:"highest"}),this.listenTo(i,"change:range",((t,e)=>{this._isNextGravityRestorationSkipped?this._isNextGravityRestorationSkipped=!1:this._isGravityOverridden&&(!e.directChange&&ww(i.getFirstPosition(),this.attributes)||this._restoreGravity())})),this._enableClickingAfterNode(),this._enableInsertContentSelectionAttributesFixer(),this._handleDeleteContentAfterNode()}registerAttribute(t){this.attributes.add(t)}_handleForwardMovement(t){const e=this.attributes,n=this.editor.model,o=n.document.selection,i=o.getFirstPosition();return!this._isGravityOverridden&&((!i.isAtStart||!mw(o,e))&&(!!ww(i,e)&&(kw(t),mw(o,e)&&ww(i,e,!0)?fw(n,e):this._overrideGravity(),!0)))}_handleBackwardMovement(t){const e=this.attributes,n=this.editor.model,o=n.document.selection,i=o.getFirstPosition();return this._isGravityOverridden?(kw(t),this._restoreGravity(),ww(i,e,!0)?fw(n,e):pw(n,e,i),!0):i.isAtStart?!!mw(o,e)&&(kw(t),pw(n,e,i),!0):!mw(o,e)&&ww(i,e,!0)?(kw(t),pw(n,e,i),!0):!!bw(i,e)&&(i.isAtEnd&&!mw(o,e)&&ww(i,e)?(kw(t),pw(n,e,i),!0):(this._isNextGravityRestorationSkipped=!0,this._overrideGravity(),!1))}_enableClickingAfterNode(){const t=this.editor,e=t.model,n=e.document.selection,o=t.editing.view.document;t.editing.view.addObserver(_h);let i=!1;this.listenTo(o,"mousedown",(()=>{i=!0})),this.listenTo(o,"selectionChange",(()=>{const t=this.attributes;if(!i)return;if(i=!1,!n.isCollapsed)return;if(!mw(n,t))return;const o=n.getFirstPosition();ww(o,t)&&(o.isAtStart||ww(o,t,!0)?fw(e,t):this._isGravityOverridden||this._overrideGravity())}))}_enableInsertContentSelectionAttributesFixer(){const t=this.editor.model,e=t.document.selection,n=this.attributes;this.listenTo(t,"insertContent",(()=>{const o=e.getFirstPosition();mw(e,n)&&ww(o,n)&&fw(t,n)}),{priority:"low"})}_handleDeleteContentAfterNode(){const t=this.editor,e=t.model,n=e.document.selection,o=t.editing.view;let i=!1,r=!1;this.listenTo(o.document,"delete",((t,e)=>{i="backward"===e.direction}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{if(!i)return;const t=n.getFirstPosition();r=mw(n,this.attributes)&&!bw(t,this.attributes)}),{priority:"high"}),this.listenTo(e,"deleteContent",(()=>{i&&(i=!1,r||t.model.enqueueChange((()=>{const t=n.getFirstPosition();mw(n,this.attributes)&&ww(t,this.attributes)&&(t.isAtStart||ww(t,this.attributes,!0)?fw(e,this.attributes):this._isGravityOverridden||this._overrideGravity())})))}),{priority:"low"})}get _isGravityOverridden(){return!!this._overrideUid}_overrideGravity(){this._overrideUid=this.editor.model.change((t=>t.overrideSelectionGravity()))}_restoreGravity(){this.editor.model.change((t=>{t.restoreSelectionGravity(this._overrideUid),this._overrideUid=null}))}}function mw(t,e){for(const n of e)if(t.hasAttribute(n))return!0;return!1}function pw(t,e,n){const o=n.nodeBefore;t.change((n=>{if(o){const e=[],i=t.schema.isObject(o)&&t.schema.isInline(o);for(const[n,r]of o.getAttributes())!t.schema.checkAttribute("$text",n)||i&&!1===t.schema.getAttributeProperties(n).copyFromObject||e.push([n,r]);n.setSelectionAttribute(e)}else n.removeSelectionAttribute(e)}))}function fw(t,e){t.change((t=>{t.removeSelectionAttribute(e)}))}function kw(t){t.preventDefault()}function bw(t,e){return ww(t.getShiftedBy(-1),e)}function ww(t,e,n=!1){const{nodeBefore:o,nodeAfter:i}=t;for(const t of e){const e=o?o.getAttribute(t):void 0,r=i?i.getAttribute(t):void 0;if((!n||void 0!==e&&void 0!==r)&&r!==e)return!0}return!1}const Aw={copyright:{from:"(c)",to:"©"},registeredTrademark:{from:"(r)",to:"®"},trademark:{from:"(tm)",to:"™"},oneHalf:{from:/(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i,to:[null,"½",null]},oneThird:{from:/(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i,to:[null,"⅓",null]},twoThirds:{from:/(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i,to:[null,"⅔",null]},oneForth:{from:/(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i,to:[null,"¼",null]},threeQuarters:{from:/(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i,to:[null,"¾",null]},lessThanOrEqual:{from:"<=",to:"≤"},greaterThanOrEqual:{from:">=",to:"≥"},notEqual:{from:"!=",to:"≠"},arrowLeft:{from:"<-",to:"←"},arrowRight:{from:"->",to:"→"},horizontalEllipsis:{from:"...",to:"…"},enDash:{from:/(^| )(--)( )$/,to:[null,"–",null]},emDash:{from:/(^| )(---)( )$/,to:[null,"—",null]},quotesPrimary:{from:Ew('"'),to:[null,"“",null,"”"]},quotesSecondary:{from:Ew("'"),to:[null,"‘",null,"’"]},quotesPrimaryEnGb:{from:Ew("'"),to:[null,"‘",null,"’"]},quotesSecondaryEnGb:{from:Ew('"'),to:[null,"“",null,"”"]},quotesPrimaryPl:{from:Ew('"'),to:[null,"„",null,"”"]},quotesSecondaryPl:{from:Ew("'"),to:[null,"‚",null,"’"]}},_w={symbols:["copyright","registeredTrademark","trademark"],mathematical:["oneHalf","oneThird","twoThirds","oneForth","threeQuarters","lessThanOrEqual","greaterThanOrEqual","notEqual","arrowLeft","arrowRight"],typography:["horizontalEllipsis","enDash","emDash"],quotes:["quotesPrimary","quotesSecondary"]},Cw=["symbols","mathematical","typography","quotes"];function vw(t){return"string"==typeof t?new RegExp(`(${Hf(t)})$`):t}function yw(t){return"string"==typeof t?()=>[t]:t instanceof Array?()=>t:t}function xw(t){return(t.textNode?t.textNode:t.nodeAfter).getAttributes()}function Ew(t){return new RegExp(`(^|\\s)(${t})([^${t}]*)(${t})$`)}function Dw(t,e,n,o){return o.createRange(Iw(t,e,n,!0,o),Iw(t,e,n,!1,o))}function Iw(t,e,n,o,i){let r=t.textNode||(o?t.nodeBefore:t.nodeAfter),s=null;for(;r&&r.getAttribute(e)==n;)s=r,r=o?r.previousSibling:r.nextSibling;return s?i.createPositionAt(s,o?"before":"after"):t}function*Mw(t,e){for(const n of e)n&&t.getAttributeProperties(n[0]).copyOnEnter&&(yield n)}class Tw extends ar{execute(){this.editor.model.change((t=>{this.enterBlock(t),this.fire("afterExecute",{writer:t})}))}enterBlock(t){const e=this.editor.model,n=e.document.selection,o=e.schema,i=n.isCollapsed,r=n.getFirstRange(),s=r.start.parent,a=r.end.parent;if(o.isLimit(s)||o.isLimit(a))return i||s!=a||e.deleteContent(n),!1;if(i){const e=Mw(t.model.schema,n.getAttributes());return Sw(t,r.start),t.setSelectionAttribute(e),!0}{const o=!(r.start.isAtStart&&r.end.isAtEnd),i=s==a;if(e.deleteContent(n,{leaveUnmerged:o}),o){if(i)return Sw(t,n.focus),!0;t.setSelection(a,0)}}return!1}}function Sw(t,e){t.split(e),t.setSelection(e.parent.nextSibling,0)}const Bw={insertParagraph:{isSoft:!1},insertLineBreak:{isSoft:!0}};class Nw extends Sa{constructor(t){super(t);const e=this.document;let n=!1;e.on("keydown",((t,e)=>{n=e.shiftKey})),e.on("beforeinput",((o,i)=>{if(!this.isEnabled)return;let r=i.inputType;c.isSafari&&n&&"insertParagraph"==r&&(r="insertLineBreak");const s=i.domEvent,a=Bw[r];if(!a)return;const l=new Is(e,"enter",i.targetRanges[0]);e.fire(l,new Na(t,s,{isSoft:a.isSoft})),l.stop.called&&o.stop()}))}observe(){}stopObserving(){}}class Pw extends rr{static get pluginName(){return"Enter"}init(){const t=this.editor,e=t.editing.view,n=e.document,o=this.editor.t;e.addObserver(Nw),t.commands.add("enter",new Tw(t)),this.listenTo(n,"enter",((o,i)=>{n.isComposing||i.preventDefault(),i.isSoft||(t.execute("enter"),e.scrollToTheSelection())}),{priority:"low"}),t.accessibility.addKeystrokeInfos({keystrokes:[{label:o("Insert a hard break (a new paragraph)"),keystroke:"Enter"}]})}}class Ow extends ar{execute(){const t=this.editor.model,e=t.document;t.change((n=>{!function(t,e,n){const o=n.isCollapsed,i=n.getFirstRange(),r=i.start.parent,s=i.end.parent,a=r==s;if(o){const o=Mw(t.schema,n.getAttributes());Lw(t,e,i.end),e.removeSelectionAttribute(n.getAttributeKeys()),e.setSelectionAttribute(o)}else{const o=!(i.start.isAtStart&&i.end.isAtEnd);t.deleteContent(n,{leaveUnmerged:o}),a?Lw(t,e,n.focus):o&&e.setSelection(s,0)}}(t,n,e.selection),this.fire("afterExecute",{writer:n})}))}refresh(){const t=this.editor.model,e=t.document;this.isEnabled=function(t,e){if(e.rangeCount>1)return!1;const n=e.anchor;if(!n||!t.checkChild(n,"softBreak"))return!1;const o=e.getFirstRange(),i=o.start.parent,r=o.end.parent;if((zw(i,t)||zw(r,t))&&i!==r)return!1;return!0}(t.schema,e.selection)}}function Lw(t,e,n){const o=e.createElement("softBreak");t.insertContent(o,n),e.setSelection(o,"after")}function zw(t,e){return!t.is("rootElement")&&(e.isLimit(t)||zw(t.parent,e))}class Rw extends rr{static get pluginName(){return"ShiftEnter"}init(){const t=this.editor,e=t.model.schema,n=t.conversion,o=t.editing.view,i=o.document,r=this.editor.t;e.register("softBreak",{allowWhere:"$text",isInline:!0}),n.for("upcast").elementToElement({model:"softBreak",view:"br"}),n.for("downcast").elementToElement({model:"softBreak",view:(t,{writer:e})=>e.createEmptyElement("br")}),o.addObserver(Nw),t.commands.add("shiftEnter",new Ow(t)),this.listenTo(i,"enter",((e,n)=>{i.isComposing||n.preventDefault(),n.isSoft&&(t.execute("shiftEnter"),o.scrollToTheSelection())}),{priority:"low"}),t.accessibility.addKeystrokeInfos({keystrokes:[{label:r("Insert a soft break (a <br> element)"),keystroke:"Shift+Enter"}]})}}class jw extends(B()){constructor(){super(...arguments),this._stack=[]}add(t,e){const n=this._stack,o=n[0];this._insertDescriptor(t);const i=n[0];o===i||Fw(o,i)||this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}remove(t,e){const n=this._stack,o=n[0];this._removeDescriptor(t);const i=n[0];o===i||Fw(o,i)||this.fire("change:top",{oldDescriptor:o,newDescriptor:i,writer:e})}_insertDescriptor(t){const e=this._stack,n=e.findIndex((e=>e.id===t.id));if(Fw(t,e[n]))return;n>-1&&e.splice(n,1);let o=0;for(;e[o]&&Vw(e[o],t);)o++;e.splice(o,0,t)}_removeDescriptor(t){const e=this._stack,n=e.findIndex((e=>e.id===t));n>-1&&e.splice(n,1)}}function Fw(t,e){return t&&e&&t.priority==e.priority&&Hw(t.classes)==Hw(e.classes)}function Vw(t,e){return t.priority>e.priority||!(t.priorityHw(e.classes)}function Hw(t){return Array.isArray(t)?t.sort().join(","):t}const Uw='',qw="ck-widget",Gw="ck-widget_selected";function Ww(t){return!!t.is("element")&&!!t.getCustomProperty("widget")}function Kw(t,e,n={}){if(!t.is("containerElement"))throw new _("widget-to-widget-wrong-element-type",null,{element:t});return e.setAttribute("contenteditable","false",t),e.addClass(qw,t),e.setCustomProperty("widget",!0,t),t.getFillerOffset=Xw,e.setCustomProperty("widgetLabel",[],t),n.label&&function(t,e){const n=t.getCustomProperty("widgetLabel");n.push(e)}(t,n.label),n.hasSelectionHandle&&function(t,e){const n=e.createUIElement("div",{class:"ck ck-widget__selection-handle"},(function(t){const e=this.toDomElement(t),n=new yg;return n.set("content",Uw),n.render(),e.appendChild(n.element),e}));e.insert(e.createPositionAt(t,0),n),e.addClass(["ck-widget_with-selection-handle"],t)}(t,e),Qw(t,e),t}function $w(t,e,n){if(e.classes&&n.addClass(yi(e.classes),t),e.attributes)for(const o in e.attributes)n.setAttribute(o,e.attributes[o],t)}function Yw(t,e,n){if(e.classes&&n.removeClass(yi(e.classes),t),e.attributes)for(const o in e.attributes)n.removeAttribute(o,t)}function Qw(t,e,n=$w,o=Yw){const i=new jw;i.on("change:top",((e,i)=>{i.oldDescriptor&&o(t,i.oldDescriptor,i.writer),i.newDescriptor&&n(t,i.newDescriptor,i.writer)}));e.setCustomProperty("addHighlight",((t,e,n)=>i.add(e,n)),t),e.setCustomProperty("removeHighlight",((t,e,n)=>i.remove(e,n)),t)}function Zw(t,e,n={}){return e.addClass(["ck-editor__editable","ck-editor__nested-editable"],t),e.setAttribute("role","textbox",t),e.setAttribute("tabindex","-1",t),n.label&&e.setAttribute("aria-label",n.label,t),e.setAttribute("contenteditable",t.isReadOnly?"false":"true",t),t.on("change:isReadOnly",((n,o,i)=>{e.setAttribute("contenteditable",i?"false":"true",t)})),t.on("change:isFocused",((n,o,i)=>{i?e.addClass("ck-editor__nested-editable_focused",t):e.removeClass("ck-editor__nested-editable_focused",t)})),Qw(t,e),t}function Jw(t,e){const n=t.getSelectedElement();if(n){const o=nA(t);if(o)return e.createRange(e.createPositionAt(n,o))}return e.schema.findOptimalInsertionRange(t)}function Xw(){return null}const tA="widget-type-around";function eA(t,e,n){return!!t&&Ww(t)&&!n.isInline(e)}function nA(t){return t.getAttribute(tA)}var oA=n(8508),iA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(oA.A,iA);oA.A.locals;const rA=["before","after"],sA=(new DOMParser).parseFromString('',"image/svg+xml").firstChild,aA="ck-widget__type-around_disabled";class cA extends rr{constructor(){super(...arguments),this._currentFakeCaretModelElement=null}static get pluginName(){return"WidgetTypeAround"}static get requires(){return[Pw,lw]}init(){const t=this.editor,e=t.editing.view;this.on("change:isEnabled",((n,o,i)=>{e.change((t=>{for(const n of e.document.roots)i?t.removeClass(aA,n):t.addClass(aA,n)})),i||t.model.change((t=>{t.removeSelectionAttribute(tA)}))})),this._enableTypeAroundUIInjection(),this._enableInsertingParagraphsOnButtonClick(),this._enableInsertingParagraphsOnEnterKeypress(),this._enableInsertingParagraphsOnTypingKeystroke(),this._enableTypeAroundFakeCaretActivationUsingKeyboardArrows(),this._enableDeleteIntegration(),this._enableInsertContentIntegration(),this._enableInsertObjectIntegration(),this._enableDeleteContentIntegration()}destroy(){super.destroy(),this._currentFakeCaretModelElement=null}_insertParagraph(t,e){const n=this.editor,o=n.editing.view,i=n.model.schema.getAttributesWithProperty(t,"copyOnReplace",!0);n.execute("insertParagraph",{position:n.model.createPositionAt(t,e),attributes:i}),o.focus(),o.scrollToTheSelection()}_listenToIfEnabled(t,e,n,o){this.listenTo(t,e,((...t)=>{this.isEnabled&&n(...t)}),o)}_insertParagraphAccordingToFakeCaretPosition(){const t=this.editor.model.document.selection,e=nA(t);if(!e)return!1;const n=t.getSelectedElement();return this._insertParagraph(n,e),!0}_enableTypeAroundUIInjection(){const t=this.editor,e=t.model.schema,n=t.locale.t,o={before:n("Insert paragraph before block"),after:n("Insert paragraph after block")};t.editing.downcastDispatcher.on("insert",((t,i,r)=>{const s=r.mapper.toViewElement(i.item);if(s&&eA(s,i.item,e)){!function(t,e,n){const o=t.createUIElement("div",{class:"ck ck-reset_all ck-widget__type-around"},(function(t){const n=this.toDomElement(t);return function(t,e){for(const n of rA){const o=new Vh({tag:"div",attributes:{class:["ck","ck-widget__type-around__button",`ck-widget__type-around__button_${n}`],title:e[n],"aria-hidden":"true"},children:[t.ownerDocument.importNode(sA,!0)]});t.appendChild(o.render())}}(n,e),function(t){const e=new Vh({tag:"div",attributes:{class:["ck","ck-widget__type-around__fake-caret"]}});t.appendChild(e.render())}(n),n}));t.insert(t.createPositionAt(n,"end"),o)}(r.writer,o,s);s.getCustomProperty("widgetLabel").push((()=>this.isEnabled?n("Press Enter to type after or press Shift + Enter to type before the widget"):""))}}),{priority:"low"})}_enableTypeAroundFakeCaretActivationUsingKeyboardArrows(){const t=this.editor,e=t.model,n=e.document.selection,o=e.schema,i=t.editing.view;function r(t){return`ck-widget_type-around_show-fake-caret_${t}`}this._listenToIfEnabled(i.document,"arrowKey",((t,e)=>{this._handleArrowKeyPress(t,e)}),{context:[Ww,"$text"],priority:"high"}),this._listenToIfEnabled(n,"change:range",((e,n)=>{n.directChange&&t.model.change((t=>{t.removeSelectionAttribute(tA)}))})),this._listenToIfEnabled(e.document,"change:data",(()=>{const e=n.getSelectedElement();if(e){if(eA(t.editing.mapper.toViewElement(e),e,o))return}t.model.change((t=>{t.removeSelectionAttribute(tA)}))})),this._listenToIfEnabled(t.editing.downcastDispatcher,"selection",((t,e,n)=>{const i=n.writer;if(this._currentFakeCaretModelElement){const t=n.mapper.toViewElement(this._currentFakeCaretModelElement);t&&(i.removeClass(rA.map(r),t),this._currentFakeCaretModelElement=null)}const s=e.selection.getSelectedElement();if(!s)return;const a=n.mapper.toViewElement(s);if(!eA(a,s,o))return;const c=nA(e.selection);c&&(i.addClass(r(c),a),this._currentFakeCaretModelElement=s)})),this._listenToIfEnabled(t.ui.focusTracker,"change:isFocused",((e,n,o)=>{o||t.model.change((t=>{t.removeSelectionAttribute(tA)}))}))}_handleArrowKeyPress(t,e){const n=this.editor,o=n.model,i=o.document.selection,r=o.schema,s=n.editing.view,a=function(t,e){const n=vi(t,e);return"down"===n||"right"===n}(e.keyCode,n.locale.contentLanguageDirection),c=s.document.selection.getSelectedElement();let l;eA(c,n.editing.mapper.toModelElement(c),r)?l=this._handleArrowKeyPressOnSelectedWidget(a):i.isCollapsed?l=this._handleArrowKeyPressWhenSelectionNextToAWidget(a):e.shiftKey||(l=this._handleArrowKeyPressWhenNonCollapsedSelection(a)),l&&(e.preventDefault(),t.stop())}_handleArrowKeyPressOnSelectedWidget(t){const e=this.editor.model,n=nA(e.document.selection);return e.change((e=>{if(!n)return e.setSelectionAttribute(tA,t?"after":"before"),!0;if(!(n===(t?"after":"before")))return e.removeSelectionAttribute(tA),!0;return!1}))}_handleArrowKeyPressWhenSelectionNextToAWidget(t){const e=this.editor,n=e.model,o=n.schema,i=e.plugins.get("Widget"),r=i._getObjectElementNextToSelection(t);return!!eA(e.editing.mapper.toViewElement(r),r,o)&&(n.change((e=>{i._setSelectionOverElement(r),e.setSelectionAttribute(tA,t?"before":"after")})),!0)}_handleArrowKeyPressWhenNonCollapsedSelection(t){const e=this.editor,n=e.model,o=n.schema,i=e.editing.mapper,r=n.document.selection,s=t?r.getLastPosition().nodeBefore:r.getFirstPosition().nodeAfter;return!!eA(i.toViewElement(s),s,o)&&(n.change((e=>{e.setSelection(s,"on"),e.setSelectionAttribute(tA,t?"after":"before")})),!0)}_enableInsertingParagraphsOnButtonClick(){const t=this.editor,e=t.editing.view;this._listenToIfEnabled(e.document,"mousedown",((n,o)=>{const i=o.domTarget.closest(".ck-widget__type-around__button");if(!i)return;const r=function(t){return t.classList.contains("ck-widget__type-around__button_before")?"before":"after"}(i),s=function(t,e){const n=t.closest(".ck-widget");return e.mapDomToView(n)}(i,e.domConverter),a=t.editing.mapper.toModelElement(s);this._insertParagraph(a,r),o.preventDefault(),n.stop()}))}_enableInsertingParagraphsOnEnterKeypress(){const t=this.editor,e=t.model.document.selection,n=t.editing.view;this._listenToIfEnabled(n.document,"enter",((n,o)=>{if("atTarget"!=n.eventPhase)return;const i=e.getSelectedElement(),r=t.editing.mapper.toViewElement(i),s=t.model.schema;let a;this._insertParagraphAccordingToFakeCaretPosition()?a=!0:eA(r,i,s)&&(this._insertParagraph(i,o.isSoft?"before":"after"),a=!0),a&&(o.preventDefault(),n.stop())}),{context:Ww})}_enableInsertingParagraphsOnTypingKeystroke(){const t=this.editor.editing.view.document;this._listenToIfEnabled(t,"insertText",((e,n)=>{this._insertParagraphAccordingToFakeCaretPosition()&&(n.selection=t.selection)}),{priority:"high"}),c.isAndroid?this._listenToIfEnabled(t,"keydown",((t,e)=>{229==e.keyCode&&this._insertParagraphAccordingToFakeCaretPosition()})):this._listenToIfEnabled(t,"compositionstart",(()=>{this._insertParagraphAccordingToFakeCaretPosition()}),{priority:"high"})}_enableDeleteIntegration(){const t=this.editor,e=t.editing.view,n=t.model,o=n.schema;this._listenToIfEnabled(e.document,"delete",((e,i)=>{if("atTarget"!=e.eventPhase)return;const r=nA(n.document.selection);if(!r)return;const s=i.direction,a=n.document.selection.getSelectedElement(),c="forward"==s;if("before"===r===c)t.execute("delete",{selection:n.createSelection(a,"on")});else{const e=o.getNearestSelectionRange(n.createPositionAt(a,r),s);if(e)if(e.isCollapsed){const i=n.createSelection(e.start);if(n.modifySelection(i,{direction:s}),i.focus.isEqual(e.start)){const t=function(t,e){let n=e;for(const o of e.getAncestors({parentFirst:!0})){if(o.childCount>1||t.isLimit(o))break;n=o}return n}(o,e.start.parent);n.deleteContent(n.createSelection(t,"on"),{doNotAutoparagraph:!0})}else n.change((n=>{n.setSelection(e),t.execute(c?"deleteForward":"delete")}))}else n.change((n=>{n.setSelection(e),t.execute(c?"deleteForward":"delete")}))}i.preventDefault(),e.stop()}),{context:Ww})}_enableInsertContentIntegration(){const t=this.editor,e=this.editor.model,n=e.document.selection;this._listenToIfEnabled(t.model,"insertContent",((t,[o,i])=>{if(i&&!i.is("documentSelection"))return;const r=nA(n);return r?(t.stop(),e.change((t=>{const i=n.getSelectedElement(),s=e.createPositionAt(i,r),a=t.createSelection(s),c=e.insertContent(o,a);return t.setSelection(a),c}))):void 0}),{priority:"high"})}_enableInsertObjectIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"insertObject",((t,n)=>{const[,o,i={}]=n;if(o&&!o.is("documentSelection"))return;const r=nA(e);r&&(i.findOptimalPosition=r,n[3]=i)}),{priority:"high"})}_enableDeleteContentIntegration(){const t=this.editor,e=this.editor.model.document.selection;this._listenToIfEnabled(t.model,"deleteContent",((t,[n])=>{if(n&&!n.is("documentSelection"))return;nA(e)&&t.stop()}),{priority:"high"})}}function lA(t){const e=t.model;return(n,o)=>{const i=o.keyCode==bi.arrowup,r=o.keyCode==bi.arrowdown,s=o.shiftKey,a=e.document.selection;if(!i&&!r)return;const c=r;if(s&&function(t,e){return!t.isCollapsed&&t.isBackward==e}(a,c))return;const l=function(t,e,n){const o=t.model;if(n){const t=e.isCollapsed?e.focus:e.getLastPosition(),n=dA(o,t,"forward");if(!n)return null;const i=o.createRange(t,n),r=uA(o.schema,i,"backward");return r?o.createRange(t,r):null}{const t=e.isCollapsed?e.focus:e.getFirstPosition(),n=dA(o,t,"backward");if(!n)return null;const i=o.createRange(n,t),r=uA(o.schema,i,"forward");return r?o.createRange(r,t):null}}(t,a,c);if(l){if(l.isCollapsed){if(a.isCollapsed)return;if(s)return}(l.isCollapsed||function(t,e,n){const o=t.model,i=t.view.domConverter;if(n){const t=o.createSelection(e.start);o.modifySelection(t),t.focus.isAtEnd||e.start.isEqual(t.focus)||(e=o.createRange(t.focus,e.end))}const r=t.mapper.toViewRange(e),s=i.viewRangeToDom(r),a=Ho.getDomRangeRects(s);let c;for(const t of a)if(void 0!==c){if(Math.round(t.top)>=c)return!1;c=Math.max(c,Math.round(t.bottom))}else c=Math.round(t.bottom);return!0}(t,l,c))&&(e.change((t=>{const n=c?l.end:l.start;if(s){const o=e.createSelection(a.anchor);o.setFocus(n),t.setSelection(o)}else t.setSelection(n)})),n.stop(),o.preventDefault(),o.stopPropagation())}}}function dA(t,e,n){const o=t.schema,i=t.createRangeIn(e.root),r="forward"==n?"elementStart":"elementEnd";for(const{previousPosition:t,item:s,type:a}of i.getWalker({startPosition:e,direction:n})){if(o.isLimit(s)&&!o.isInline(s))return t;if(a==r&&o.isBlock(s))return null}return null}function uA(t,e,n){const o="backward"==n?e.end:e.start;if(t.checkChild(o,"$text"))return o;for(const{nextPosition:o}of e.getWalker({direction:n}))if(t.checkChild(o,"$text"))return o;return null}var hA=n(695),gA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(hA.A,gA);hA.A.locals;class mA extends rr{constructor(){super(...arguments),this._previouslySelected=new Set}static get pluginName(){return"Widget"}static get requires(){return[cA,lw]}init(){const t=this.editor,e=t.editing.view,n=e.document,o=t.t;this.editor.editing.downcastDispatcher.on("selection",((e,n,o)=>{const i=o.writer,r=n.selection;if(r.isCollapsed)return;const s=r.getSelectedElement();if(!s)return;const a=t.editing.mapper.toViewElement(s);var c;Ww(a)&&(o.consumable.consume(r,"selection")&&i.setSelection(i.createRangeOn(a),{fake:!0,label:(c=a,c.getCustomProperty("widgetLabel").reduce(((t,e)=>"function"==typeof e?t?t+". "+e():e():t?t+". "+e:e),""))}))})),this.editor.editing.downcastDispatcher.on("selection",((t,e,n)=>{this._clearPreviouslySelectedWidgets(n.writer);const o=n.writer,i=o.document.selection;let r=null;for(const t of i.getRanges())for(const e of t){const t=e.item;Ww(t)&&!pA(t,r)&&(o.addClass(Gw,t),this._previouslySelected.add(t),r=t)}}),{priority:"low"}),e.addObserver(_h),this.listenTo(n,"mousedown",((...t)=>this._onMousedown(...t))),this.listenTo(n,"arrowKey",((...t)=>{this._handleSelectionChangeOnArrowKeyPress(...t)}),{context:[Ww,"$text"]}),this.listenTo(n,"arrowKey",((...t)=>{this._preventDefaultOnArrowKeyPress(...t)}),{context:"$root"}),this.listenTo(n,"arrowKey",lA(this.editor.editing),{context:"$text"}),this.listenTo(n,"delete",((t,e)=>{this._handleDelete("forward"==e.direction)&&(e.preventDefault(),t.stop())}),{context:"$root"}),this.listenTo(n,"tab",((t,e)=>{"atTarget"==t.eventPhase&&(e.shiftKey||this._selectFirstNestedEditable()&&(e.preventDefault(),t.stop()))}),{context:Ww,priority:"low"}),this.listenTo(n,"tab",((t,e)=>{e.shiftKey&&this._selectAncestorWidget()&&(e.preventDefault(),t.stop())}),{priority:"low"}),this.listenTo(n,"keydown",((t,e)=>{e.keystroke==bi.esc&&this._selectAncestorWidget()&&(e.preventDefault(),t.stop())}),{priority:"low"}),t.accessibility.addKeystrokeInfoGroup({id:"widget",label:o("Keystrokes that can be used when a widget is selected (for example: image, table, etc.)"),keystrokes:[{label:o("Insert a new paragraph directly after a widget"),keystroke:"Enter"},{label:o("Insert a new paragraph directly before a widget"),keystroke:"Shift+Enter"},{label:o("Move the caret to allow typing directly before a widget"),keystroke:[["arrowup"],["arrowleft"]]},{label:o("Move the caret to allow typing directly after a widget"),keystroke:[["arrowdown"],["arrowright"]]}]})}_onMousedown(t,e){const n=this.editor,o=n.editing.view,i=o.document;let r=e.target;if(e.domEvent.detail>=3)return void(this._selectBlockContent(r)&&e.preventDefault());if(function(t){let e=t;for(;e;){if(e.is("editableElement")&&!e.is("rootElement"))return!0;if(Ww(e))return!1;e=e.parent}return!1}(r))return;if(!Ww(r)&&(r=r.findAncestor(Ww),!r))return;c.isAndroid&&e.preventDefault(),i.isFocused||o.focus();const s=n.editing.mapper.toModelElement(r);this._setSelectionOverElement(s)}_selectBlockContent(t){const e=this.editor,n=e.model,o=e.editing.mapper,i=n.schema,r=o.findMappedViewAncestor(this.editor.editing.view.createPositionAt(t,0)),s=function(t,e){for(const n of t.getAncestors({includeSelf:!0,parentFirst:!0})){if(e.checkChild(n,"$text"))return n;if(e.isLimit(n)&&!e.isObject(n))break}return null}(o.toModelElement(r),n.schema);return!!s&&(n.change((t=>{const e=i.isLimit(s)?null:function(t,e){const n=new Oc({startPosition:t});for(const{item:t}of n){if(e.isLimit(t)||!t.is("element"))return null;if(e.checkChild(t,"$text"))return t}return null}(t.createPositionAfter(s),i),n=t.createPositionAt(s,0),o=e?t.createPositionAt(e,0):t.createPositionAt(s,"end");t.setSelection(t.createRange(n,o))})),!0)}_handleSelectionChangeOnArrowKeyPress(t,e){const n=e.keyCode,o=this.editor.model,i=o.schema,r=o.document.selection,s=r.getSelectedElement(),a=vi(n,this.editor.locale.contentLanguageDirection),c="down"==a||"right"==a,l="up"==a||"down"==a;if(s&&i.isObject(s)){const n=c?r.getLastPosition():r.getFirstPosition(),s=i.getNearestSelectionRange(n,c?"forward":"backward");return void(s&&(o.change((t=>{t.setSelection(s)})),e.preventDefault(),t.stop()))}if(!r.isCollapsed&&!e.shiftKey){const n=r.getFirstPosition(),s=r.getLastPosition(),a=n.nodeAfter,l=s.nodeBefore;return void((a&&i.isObject(a)||l&&i.isObject(l))&&(o.change((t=>{t.setSelection(c?s:n)})),e.preventDefault(),t.stop()))}if(!r.isCollapsed)return;const d=this._getObjectElementNextToSelection(c);if(d&&i.isObject(d)){if(i.isInline(d)&&l)return;this._setSelectionOverElement(d),e.preventDefault(),t.stop()}}_preventDefaultOnArrowKeyPress(t,e){const n=this.editor.model,o=n.schema,i=n.document.selection.getSelectedElement();i&&o.isObject(i)&&(e.preventDefault(),t.stop())}_handleDelete(t){const e=this.editor.model.document.selection;if(!this.editor.model.canEditAt(e))return;if(!e.isCollapsed)return;const n=this._getObjectElementNextToSelection(t);return n?(this.editor.model.change((t=>{let o=e.anchor.parent;for(;o.isEmpty;){const e=o;o=e.parent,t.remove(e)}this._setSelectionOverElement(n)})),!0):void 0}_setSelectionOverElement(t){this.editor.model.change((e=>{e.setSelection(e.createRangeOn(t))}))}_getObjectElementNextToSelection(t){const e=this.editor.model,n=e.schema,o=e.document.selection,i=e.createSelection(o);if(e.modifySelection(i,{direction:t?"forward":"backward"}),i.isEqual(o))return null;const r=t?i.focus.nodeBefore:i.focus.nodeAfter;return r&&n.isObject(r)?r:null}_clearPreviouslySelectedWidgets(t){for(const e of this._previouslySelected)t.removeClass(Gw,e);this._previouslySelected.clear()}_selectFirstNestedEditable(){const t=this.editor,e=this.editor.editing.view.document;for(const n of e.selection.getFirstRange().getItems())if(n.is("editableElement")){const e=t.editing.mapper.toModelElement(n);if(!e)continue;const o=t.model.createPositionAt(e,0),i=t.model.schema.getNearestSelectionRange(o,"forward");return t.model.change((t=>{t.setSelection(i)})),!0}return!1}_selectAncestorWidget(){const t=this.editor,e=t.editing.mapper,n=t.editing.view.document.selection.getFirstPosition().parent,o=(n.is("$text")?n.parent:n).findAncestor(Ww);if(!o)return!1;const i=e.toModelElement(o);return!!i&&(t.model.change((t=>{t.setSelection(i,"on")})),!0)}}function pA(t,e){return!!e&&Array.from(t.getAncestors()).includes(e)}class fA extends rr{constructor(){super(...arguments),this._toolbarDefinitions=new Map}static get requires(){return[Tf]}static get pluginName(){return"WidgetToolbarRepository"}init(){const t=this.editor;if(t.plugins.has("BalloonToolbar")){const e=t.plugins.get("BalloonToolbar");this.listenTo(e,"show",(e=>{(function(t){const e=t.getSelectedElement();return!(!e||!Ww(e))})(t.editing.view.document.selection)&&e.stop()}),{priority:"high"})}this._balloon=this.editor.plugins.get("ContextualBalloon"),this.on("change:isEnabled",(()=>{this._updateToolbarsVisibility()})),this.listenTo(t.ui,"update",(()=>{this._updateToolbarsVisibility()})),this.listenTo(t.ui.focusTracker,"change:isFocused",(()=>{this._updateToolbarsVisibility()}),{priority:"low"})}destroy(){super.destroy();for(const t of this._toolbarDefinitions.values())t.view.destroy()}register(t,{ariaLabel:e,items:n,getRelatedElement:o,balloonClassName:i="ck-toolbar-container"}){if(!n.length)return void C("widget-toolbar-no-items",{toolbarId:t});const r=this.editor,s=r.t,a=new bm(r.locale);if(a.ariaLabel=e||s("Widget toolbar"),this._toolbarDefinitions.has(t))throw new _("widget-toolbar-duplicated",this,{toolbarId:t});const c={view:a,getRelatedElement:o,balloonClassName:i,itemsConfig:n,initialized:!1};r.ui.addToolbar(a,{isContextual:!0,beforeFocus:()=>{const t=o(r.editing.view.document.selection);t&&this._showToolbar(c,t)},afterBlur:()=>{this._hideToolbar(c)}}),this._toolbarDefinitions.set(t,c)}_updateToolbarsVisibility(){let t=0,e=null,n=null;for(const o of this._toolbarDefinitions.values()){const i=o.getRelatedElement(this.editor.editing.view.document.selection);if(this.isEnabled&&i)if(this.editor.ui.focusTracker.isFocused){const r=i.getAncestors().length;r>t&&(t=r,e=i,n=o)}else this._isToolbarVisible(o)&&this._hideToolbar(o);else this._isToolbarInBalloon(o)&&this._hideToolbar(o)}n&&this._showToolbar(n,e)}_hideToolbar(t){this._balloon.remove(t.view),this.stopListening(this._balloon,"change:visibleView")}_showToolbar(t,e){this._isToolbarVisible(t)?kA(this.editor,e):this._isToolbarInBalloon(t)||(t.initialized||(t.initialized=!0,t.view.fillFromConfig(t.itemsConfig,this.editor.ui.componentFactory)),this._balloon.add({view:t.view,position:bA(this.editor,e),balloonClassName:t.balloonClassName}),this.listenTo(this._balloon,"change:visibleView",(()=>{for(const t of this._toolbarDefinitions.values())if(this._isToolbarVisible(t)){const e=t.getRelatedElement(this.editor.editing.view.document.selection);kA(this.editor,e)}})))}_isToolbarVisible(t){return this._balloon.visibleView===t.view}_isToolbarInBalloon(t){return this._balloon.hasView(t.view)}}function kA(t,e){const n=t.plugins.get("ContextualBalloon"),o=bA(t,e);n.updatePosition(o)}function bA(t,e){const n=t.editing.view,o=Np.defaultPositions;return{target:n.domConverter.mapViewToDom(e),positions:[o.northArrowSouth,o.northArrowSouthWest,o.northArrowSouthEast,o.southArrowNorth,o.southArrowNorthWest,o.southArrowNorthEast,o.viewportStickyNorth]}}K();Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;K();var wA=n(4095),AA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(wA.A,AA);wA.A.locals;const _A=Qo("px");class CA extends dg{constructor(){super();const t=this.bindTemplate;this.set({isVisible:!1,left:null,top:null,width:null}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-clipboard-drop-target-line",t.if("isVisible","ck-hidden",(t=>!t))],style:{left:t.to("left",(t=>_A(t))),top:t.to("top",(t=>_A(t))),width:t.to("width",(t=>_A(t)))}}})}}class vA extends rr{constructor(){super(...arguments),this.removeDropMarkerDelayed=tr((()=>this.removeDropMarker()),40),this._updateDropMarkerThrottled=Up((t=>this._updateDropMarker(t)),40),this._reconvertMarkerThrottled=Up((()=>{this.editor.model.markers.has("drop-target")&&this.editor.editing.reconvertMarker("drop-target")}),0),this._dropTargetLineView=new CA,this._domEmitter=new(Bo()),this._scrollables=new Map}static get pluginName(){return"DragDropTarget"}init(){this._setupDropMarker()}destroy(){this._domEmitter.stopListening();for(const{resizeObserver:t}of this._scrollables.values())t.destroy();return this._updateDropMarkerThrottled.cancel(),this.removeDropMarkerDelayed.cancel(),this._reconvertMarkerThrottled.cancel(),super.destroy()}updateDropMarker(t,e,n,o,i,r){this.removeDropMarkerDelayed.cancel();const s=yA(this.editor,t,e,n,o,i,r);if(s)return r&&r.containsRange(s)?this.removeDropMarker():void this._updateDropMarkerThrottled(s)}getFinalDropRange(t,e,n,o,i,r){const s=yA(this.editor,t,e,n,o,i,r);return this.removeDropMarker(),s}removeDropMarker(){const t=this.editor.model;this.removeDropMarkerDelayed.cancel(),this._updateDropMarkerThrottled.cancel(),this._dropTargetLineView.isVisible=!1,t.markers.has("drop-target")&&t.change((t=>{t.removeMarker("drop-target")}))}_setupDropMarker(){const t=this.editor;t.ui.view.body.add(this._dropTargetLineView),t.conversion.for("editingDowncast").markerToHighlight({model:"drop-target",view:{classes:["ck-clipboard-drop-target-range"]}}),t.conversion.for("editingDowncast").markerToElement({model:"drop-target",view:(e,{writer:n})=>{if(t.model.schema.checkChild(e.markerRange.start,"$text"))return this._dropTargetLineView.isVisible=!1,this._createDropTargetPosition(n);e.markerRange.isCollapsed?this._updateDropTargetLine(e.markerRange):this._dropTargetLineView.isVisible=!1}})}_updateDropMarker(t){const e=this.editor,n=e.model.markers;e.model.change((e=>{n.has("drop-target")?n.get("drop-target").getRange().isEqual(t)||e.updateMarker("drop-target",{range:t}):e.addMarker("drop-target",{range:t,usingOperation:!1,affectsData:!1})}))}_createDropTargetPosition(t){return t.createUIElement("span",{class:"ck ck-clipboard-drop-target-position"},(function(t){const e=this.toDomElement(t);return e.append("⁠",t.createElement("span"),"⁠"),e}))}_updateDropTargetLine(t){const e=this.editor.editing,n=t.start.nodeBefore,o=t.start.nodeAfter,i=t.start.parent,r=n?e.mapper.toViewElement(n):null,s=r?e.view.domConverter.mapViewToDom(r):null,a=o?e.mapper.toViewElement(o):null,c=a?e.view.domConverter.mapViewToDom(a):null,l=e.mapper.toViewElement(i);if(!l)return;const d=e.view.domConverter.mapViewToDom(l),u=this._getScrollableRect(l),{scrollX:h,scrollY:g}=Lo.window,m=s?new Ho(s):null,p=c?new Ho(c):null,f=new Ho(d).excludeScrollbarsAndBorders(),k=m?m.bottom:f.top,b=p?p.top:f.bottom,w=Lo.window.getComputedStyle(d),A=k<=b?(k+b)/2:b;if(u.topa.schema.checkChild(r,t)))){if(a.schema.checkChild(r,"$text"))return a.createRange(r);if(e)return EA(t,IA(t,e.parent),o,i)}}}else if(a.schema.isInline(l))return EA(t,l,o,i);if(a.schema.isBlock(l))return EA(t,l,o,i);if(a.schema.checkChild(l,"$block")){const e=Array.from(l.getChildren()).filter((e=>e.is("element")&&!xA(t,e)));let n=0,r=e.length;if(0==r)return a.createRange(a.createPositionAt(l,"end"));for(;ne in t?MA(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class LA extends rr{constructor(){super(...arguments),this._isBlockDragging=!1,this._domEmitter=new(Bo())}static get pluginName(){return"DragDropBlockToolbar"}init(){const t=this.editor;if(this.listenTo(t,"change:isReadOnly",((t,e,n)=>{n?(this.forceDisabled("readOnlyMode"),this._isBlockDragging=!1):this.clearForceDisabled("readOnlyMode")})),c.isAndroid&&this.forceDisabled("noAndroidSupport"),t.plugins.has("BlockToolbar")){const e=t.plugins.get("BlockToolbar").buttonView.element;this._domEmitter.listenTo(e,"dragstart",((t,e)=>this._handleBlockDragStart(e))),this._domEmitter.listenTo(Lo.document,"dragover",((t,e)=>this._handleBlockDragging(e))),this._domEmitter.listenTo(Lo.document,"drop",((t,e)=>this._handleBlockDragging(e))),this._domEmitter.listenTo(Lo.document,"dragend",(()=>this._handleBlockDragEnd()),{useCapture:!0}),this.isEnabled&&e.setAttribute("draggable","true"),this.on("change:isEnabled",((t,n,o)=>{e.setAttribute("draggable",o?"true":"false")}))}}destroy(){return this._domEmitter.stopListening(),super.destroy()}_handleBlockDragStart(t){if(!this.isEnabled)return;const e=this.editor.model,n=e.document.selection,o=this.editor.editing.view,i=Array.from(n.getSelectedBlocks()),r=e.createRange(e.createPositionBefore(i[0]),e.createPositionAfter(i[i.length-1]));e.change((t=>t.setSelection(r))),this._isBlockDragging=!0,o.focus(),o.getObserver(_b).onDomEvent(t)}_handleBlockDragging(t){if(!this.isEnabled||!this._isBlockDragging)return;const e=t.clientX+("ltr"==this.editor.locale.contentLanguageDirection?100:-100),n=t.clientY,o=document.elementFromPoint(e,n),i=this.editor.editing.view;var r,s;o&&o.closest(".ck-editor__editable")&&i.getObserver(_b).onDomEvent((r=((t,e)=>{for(var n in e||(e={}))NA.call(e,n)&&OA(t,n,e[n]);if(BA)for(var n of BA(e))PA.call(e,n)&&OA(t,n,e[n]);return t})({},t),s={type:t.type,dataTransfer:t.dataTransfer,target:o,clientX:e,clientY:n,preventDefault:()=>t.preventDefault(),stopPropagation:()=>t.stopPropagation()},TA(r,SA(s))))}_handleBlockDragEnd(){this._isBlockDragging=!1}}var zA=n(7793),RA={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(zA.A,RA);zA.A.locals;class jA extends rr{constructor(){super(...arguments),this._clearDraggableAttributesDelayed=tr((()=>this._clearDraggableAttributes()),40),this._blockMode=!1,this._domEmitter=new(Bo())}static get pluginName(){return"DragDrop"}static get requires(){return[Yb,mA,vA,LA]}init(){const t=this.editor,e=t.editing.view;this._draggedRange=null,this._draggingUid="",this._draggableElement=null,e.addObserver(_b),e.addObserver(_h),this._setupDragging(),this._setupContentInsertionIntegration(),this._setupClipboardInputIntegration(),this._setupDraggableAttributeHandling(),this.listenTo(t,"change:isReadOnly",((t,e,n)=>{n?this.forceDisabled("readOnlyMode"):this.clearForceDisabled("readOnlyMode")})),this.on("change:isEnabled",((t,e,n)=>{n||this._finalizeDragging(!1)})),c.isAndroid&&this.forceDisabled("noAndroidSupport")}destroy(){return this._draggedRange&&(this._draggedRange.detach(),this._draggedRange=null),this._previewContainer&&this._previewContainer.remove(),this._domEmitter.stopListening(),this._clearDraggableAttributesDelayed.cancel(),super.destroy()}_setupDragging(){const t=this.editor,e=t.model,n=t.editing.view,o=n.document,i=t.plugins.get(vA);this.listenTo(o,"dragstart",((t,n)=>{if(n.target&&n.target.is("editableElement"))return void n.preventDefault();if(this._prepareDraggedRange(n.target),!this._draggedRange)return void n.preventDefault();this._draggingUid=k(),n.dataTransfer.effectAllowed=this.isEnabled?"copyMove":"copy",n.dataTransfer.setData("application/ckeditor5-dragging-uid",this._draggingUid);const o=e.createSelection(this._draggedRange.toRange());this.editor.plugins.get("ClipboardPipeline")._fireOutputTransformationEvent(n.dataTransfer,o,"dragstart");const{dataTransfer:i,domTarget:r,domEvent:s}=n,{clientX:a}=s;this._updatePreview({dataTransfer:i,domTarget:r,clientX:a}),n.stopPropagation(),this.isEnabled||(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="")}),{priority:"low"}),this.listenTo(o,"dragend",((t,e)=>{this._finalizeDragging(!e.dataTransfer.isCanceled&&"move"==e.dataTransfer.dropEffect)}),{priority:"low"}),this._domEmitter.listenTo(Lo.document,"dragend",(()=>{this._blockMode=!1}),{useCapture:!0}),this.listenTo(o,"dragenter",(()=>{this.isEnabled&&n.focus()})),this.listenTo(o,"dragleave",(()=>{i.removeDropMarkerDelayed()})),this.listenTo(o,"dragging",((t,e)=>{if(!this.isEnabled)return void(e.dataTransfer.dropEffect="none");const{clientX:n,clientY:o}=e.domEvent;i.updateDropMarker(e.target,e.targetRanges,n,o,this._blockMode,this._draggedRange),this._draggedRange||(e.dataTransfer.dropEffect="copy"),c.isGecko||("copy"==e.dataTransfer.effectAllowed?e.dataTransfer.dropEffect="copy":["all","copyMove"].includes(e.dataTransfer.effectAllowed)&&(e.dataTransfer.dropEffect="move")),t.stop()}),{priority:"low"})}_setupClipboardInputIntegration(){const t=this.editor,e=t.editing.view.document,n=t.plugins.get(vA);this.listenTo(e,"clipboardInput",((e,o)=>{if("drop"!=o.method)return;const{clientX:i,clientY:r}=o.domEvent,s=n.getFinalDropRange(o.target,o.targetRanges,i,r,this._blockMode,this._draggedRange);if(!s)return this._finalizeDragging(!1),void e.stop();this._draggedRange&&this._draggingUid!=o.dataTransfer.getData("application/ckeditor5-dragging-uid")&&(this._draggedRange.detach(),this._draggedRange=null,this._draggingUid="");if("move"==FA(o.dataTransfer)&&this._draggedRange&&this._draggedRange.containsRange(s,!0))return this._finalizeDragging(!1),void e.stop();o.targetRanges=[t.editing.mapper.toViewRange(s)]}),{priority:"high"})}_setupContentInsertionIntegration(){const t=this.editor.plugins.get(Yb);t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const n=e.targetRanges.map((t=>this.editor.editing.mapper.toModelRange(t)));this.editor.model.change((t=>t.setSelection(n)))}),{priority:"high"}),t.on("contentInsertion",((t,e)=>{if(!this.isEnabled||"drop"!==e.method)return;const n="move"==FA(e.dataTransfer),o=!e.resultRange||!e.resultRange.isCollapsed;this._finalizeDragging(o&&n)}),{priority:"lowest"})}_setupDraggableAttributeHandling(){const t=this.editor,e=t.editing.view,n=e.document;this.listenTo(n,"mousedown",((o,i)=>{if(c.isAndroid||!i)return;this._clearDraggableAttributesDelayed.cancel();let r=VA(i.target);if(c.isBlink&&!t.isReadOnly&&!r&&!n.selection.isCollapsed){const t=n.selection.getSelectedElement();t&&Ww(t)||(r=n.selection.editableElement)}r&&(e.change((t=>{t.setAttribute("draggable","true",r)})),this._draggableElement=t.editing.mapper.toModelElement(r))})),this.listenTo(n,"mouseup",(()=>{c.isAndroid||this._clearDraggableAttributesDelayed()}))}_clearDraggableAttributes(){const t=this.editor.editing;t.view.change((e=>{this._draggableElement&&"$graveyard"!=this._draggableElement.root.rootName&&e.removeAttribute("draggable",t.mapper.toViewElement(this._draggableElement)),this._draggableElement=null}))}_finalizeDragging(t){const e=this.editor,n=e.model;if(e.plugins.get(vA).removeDropMarker(),this._clearDraggableAttributes(),e.plugins.has("WidgetToolbarRepository")){e.plugins.get("WidgetToolbarRepository").clearForceDisabled("dragDrop")}this._draggingUid="",this._previewContainer&&(this._previewContainer.remove(),this._previewContainer=void 0),this._draggedRange&&(t&&this.isEnabled&&n.change((t=>{const e=n.createSelection(this._draggedRange);n.deleteContent(e,{doNotAutoparagraph:!0});const o=e.getFirstPosition().parent;o.isEmpty&&!n.schema.checkChild(o,"$text")&&n.schema.checkChild(o,"paragraph")&&t.insertElement("paragraph",o,0)})),this._draggedRange.detach(),this._draggedRange=null)}_prepareDraggedRange(t){const e=this.editor,n=e.model,o=n.document.selection,i=t?VA(t):null;if(i){const t=e.editing.mapper.toModelElement(i);if(this._draggedRange=hl.fromRange(n.createRangeOn(t)),this._blockMode=n.schema.isBlock(t),e.plugins.has("WidgetToolbarRepository")){e.plugins.get("WidgetToolbarRepository").forceDisabled("dragDrop")}return}if(o.isCollapsed&&!o.getFirstPosition().parent.isEmpty)return;const r=Array.from(o.getSelectedBlocks()),s=o.getFirstRange();if(0==r.length)return void(this._draggedRange=hl.fromRange(s));const a=HA(n,r);if(r.length>1)this._draggedRange=hl.fromRange(a),this._blockMode=!0;else if(1==r.length){const t=s.start.isTouching(a.start)&&s.end.isTouching(a.end);this._draggedRange=hl.fromRange(t?a:s),this._blockMode=t}n.change((t=>t.setSelection(this._draggedRange.toRange())))}_updatePreview({dataTransfer:t,domTarget:e,clientX:n}){const o=this.editor.editing.view,i=o.document.selection.editableElement,r=o.domConverter.mapViewToDom(i),s=Lo.window.getComputedStyle(r);this._previewContainer?this._previewContainer.firstElementChild&&this._previewContainer.removeChild(this._previewContainer.firstElementChild):(this._previewContainer=wt(Lo.document,"div",{style:"position: fixed; left: -999999px;"}),Lo.document.body.appendChild(this._previewContainer));const a=new Ho(r);if(r.contains(e))return;const l=parseFloat(s.paddingLeft),d=wt(Lo.document,"div");d.className="ck ck-content",d.style.width=s.width,d.style.paddingLeft=`${a.left-n+l}px`,c.isiOS&&(d.style.backgroundColor="white"),d.innerHTML=t.getData("text/html"),t.setDragImage(d,0,0),this._previewContainer.appendChild(d)}}function FA(t){return c.isGecko?t.dropEffect:["all","copyMove"].includes(t.effectAllowed)?"move":"copy"}function VA(t){if(t.is("editableElement"))return null;if(t.hasClass("ck-widget__selection-handle"))return t.findAncestor(Ww);if(Ww(t))return t;const e=t.findAncestor((t=>Ww(t)||t.is("editableElement")));return Ww(e)?e:null}function HA(t,e){const n=e[0],o=e[e.length-1],i=n.getCommonAncestor(o),r=t.createPositionBefore(n),s=t.createPositionAfter(o);if(i&&i.is("element")&&!t.schema.isLimit(i)){const e=t.createRangeOn(i),n=r.isTouching(e.start),o=s.isTouching(e.end);if(n&&o)return HA(t,[i])}return t.createRange(r,s)}class UA extends rr{static get pluginName(){return"PastePlainText"}static get requires(){return[Yb]}init(){const t=this.editor,e=t.model,n=t.editing.view,o=n.document,i=e.document.selection;let r=!1;n.addObserver(_b),this.listenTo(o,"keydown",((t,e)=>{r=e.shiftKey})),t.plugins.get(Yb).on("contentInsertion",((t,n)=>{(r||function(t,e){if(t.childCount>1)return!1;const n=t.getChild(0);if(e.isObject(n))return!1;return 0==Array.from(n.getAttributeKeys()).length}(n.content,e.schema))&&e.change((t=>{const o=Array.from(i.getAttributes()).filter((([t])=>e.schema.getAttributeProperties(t).isFormatting));i.isCollapsed||e.deleteContent(i,{doNotAutoparagraph:!0}),o.push(...i.getAttributes());const r=t.createRangeIn(n.content);for(const e of r.getItems())e.is("$textProxy")&&t.setAttributes(o,e)}))}))}}class qA extends rr{static get pluginName(){return"Clipboard"}static get requires(){return[$b,Yb,jA,UA]}init(){const t=this.editor,e=this.editor.t;t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Copy selected content"),keystroke:"CTRL+C"},{label:e("Paste content"),keystroke:"CTRL+V"},{label:e("Paste content as plain text"),keystroke:"CTRL+SHIFT+V"}]})}}class GA extends ar{constructor(t){super(t),this.affectsData=!1}execute(){const t=this.editor.model,e=t.document.selection;let n=t.schema.getLimitElement(e);if(e.containsEntireContent(n)||!WA(t.schema,n))do{if(n=n.parent,!n)return}while(!WA(t.schema,n));t.change((t=>{t.setSelection(n,"in")}))}}function WA(t,e){return t.isLimit(e)&&(t.checkChild(e,"$text")||t.checkChild(e,"paragraph"))}const KA=_i("Ctrl+A");class $A extends rr{static get pluginName(){return"SelectAllEditing"}init(){const t=this.editor,e=t.t,n=t.editing.view.document;t.commands.add("selectAll",new GA(t)),this.listenTo(n,"keydown",((e,n)=>{Ai(n)===KA&&(t.execute("selectAll"),n.preventDefault())})),t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Select all"),keystroke:"CTRL+A"}]})}}class YA extends rr{static get pluginName(){return"SelectAllUI"}init(){const t=this.editor;t.ui.componentFactory.add("selectAll",(()=>{const t=this._createButton(Ig);return t.set({tooltip:!0}),t})),t.ui.componentFactory.add("menuBar:selectAll",(()=>this._createButton(Wk)))}_createButton(t){const e=this.editor,n=e.locale,o=e.commands.get("selectAll"),i=new t(e.locale),r=n.t;return i.set({label:r("Select all"),icon:'',keystroke:"Ctrl+A"}),i.bind("isEnabled").to(o,"isEnabled"),this.listenTo(i,"execute",(()=>{e.execute("selectAll"),e.editing.view.focus()})),i}}class QA extends rr{static get requires(){return[$A,YA]}static get pluginName(){return"SelectAll"}}var ZA=Object.defineProperty,JA=Object.getOwnPropertySymbols,XA=Object.prototype.hasOwnProperty,t_=Object.prototype.propertyIsEnumerable,e_=(t,e,n)=>e in t?ZA(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class n_ extends ar{constructor(t){super(t),this._stack=[],this._createdBatches=new WeakSet,this.refresh(),this._isEnabledBasedOnSelection=!1,this.listenTo(t.data,"set",((t,e)=>{e[1]=((t,e)=>{for(var n in e||(e={}))XA.call(e,n)&&e_(t,n,e[n]);if(JA)for(var n of JA(e))t_.call(e,n)&&e_(t,n,e[n]);return t})({},e[1]);const n=e[1];n.batchType||(n.batchType={isUndoable:!1})}),{priority:"high"}),this.listenTo(t.data,"set",((t,e)=>{e[1].batchType.isUndoable||this.clearStack()}))}refresh(){this.isEnabled=this._stack.length>0}get createdBatches(){return this._createdBatches}addBatch(t){const e=this.editor.model.document.selection,n={ranges:e.hasOwnRange?Array.from(e.getRanges()):[],isBackward:e.isBackward};this._stack.push({batch:t,selection:n}),this.refresh()}clearStack(){this._stack=[],this.refresh()}_restoreSelection(t,e,n){const o=this.editor.model,i=o.document,r=[],s=t.map((t=>t.getTransformedByOperations(n))),a=s.flat();for(const t of s){const e=t.filter((t=>t.root!=i.graveyard)).filter((t=>!i_(t,a)));e.length&&(o_(e),r.push(e[0]))}r.length&&o.change((t=>{t.setSelection(r,{backward:e})}))}_undo(t,e){const n=this.editor.model,o=n.document;this._createdBatches.add(e);const i=t.operations.slice().filter((t=>t.isDocumentOperation));i.reverse();for(const t of i){const i=t.baseVersion+1,r=Array.from(o.history.getOperations(i)),s=iu([t.getReversed()],r,{useRelations:!0,document:this.editor.model.document,padWithNoOps:!1,forceWeakRemove:!0}).operationsA;for(let i of s){const r=i.affectedSelectable;r&&!n.canEditAt(r)&&(i=new $d(i.baseVersion)),e.addOperation(i),n.applyOperation(i),o.history.setOperationAsUndone(t,i)}}}}function o_(t){t.sort(((t,e)=>t.start.isBefore(e.start)?-1:1));for(let e=1;ee!==t&&e.containsRange(t,!0)))}class r_ extends n_{execute(t=null){const e=t?this._stack.findIndex((e=>e.batch==t)):this._stack.length-1,n=this._stack.splice(e,1)[0],o=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(o,(()=>{this._undo(n.batch,o);const t=this.editor.model.document.history.getOperations(n.batch.baseVersion);this._restoreSelection(n.selection.ranges,n.selection.isBackward,t)})),this.fire("revert",n.batch,o),this.refresh()}}class s_ extends n_{execute(){const t=this._stack.pop(),e=this.editor.model.createBatch({isUndo:!0});this.editor.model.enqueueChange(e,(()=>{const n=t.batch.operations[t.batch.operations.length-1].baseVersion+1,o=this.editor.model.document.history.getOperations(n);this._restoreSelection(t.selection.ranges,t.selection.isBackward,o),this._undo(t.batch,e)})),this.refresh()}}class a_ extends rr{constructor(){super(...arguments),this._batchRegistry=new WeakSet}static get pluginName(){return"UndoEditing"}init(){const t=this.editor,e=t.t;this._undoCommand=new r_(t),this._redoCommand=new s_(t),t.commands.add("undo",this._undoCommand),t.commands.add("redo",this._redoCommand),this.listenTo(t.model,"applyOperation",((t,e)=>{const n=e[0];if(!n.isDocumentOperation)return;const o=n.batch,i=this._redoCommand.createdBatches.has(o),r=this._undoCommand.createdBatches.has(o);this._batchRegistry.has(o)||(this._batchRegistry.add(o),o.isUndoable&&(i?this._undoCommand.addBatch(o):r||(this._undoCommand.addBatch(o),this._redoCommand.clearStack())))}),{priority:"highest"}),this.listenTo(this._undoCommand,"revert",((t,e,n)=>{this._redoCommand.addBatch(n)})),t.keystrokes.set("CTRL+Z","undo"),t.keystrokes.set("CTRL+Y","redo"),t.keystrokes.set("CTRL+SHIFT+Z","redo"),t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Undo"),keystroke:"CTRL+Z"},{label:e("Redo"),keystroke:[["CTRL+Y"],["CTRL+SHIFT+Z"]]}]})}}class c_ extends rr{static get pluginName(){return"UndoUI"}init(){const t=this.editor,e=t.locale,n=t.t,o="ltr"==e.uiLanguageDirection?jh.undo:jh.redo,i="ltr"==e.uiLanguageDirection?jh.redo:jh.undo;this._addButtonsToFactory("undo",n("Undo"),"CTRL+Z",o),this._addButtonsToFactory("redo",n("Redo"),"CTRL+Y",i)}_addButtonsToFactory(t,e,n,o){const i=this.editor;i.ui.componentFactory.add(t,(()=>{const i=this._createButton(Ig,t,e,n,o);return i.set({tooltip:!0}),i})),i.ui.componentFactory.add("menuBar:"+t,(()=>this._createButton(Wk,t,e,n,o)))}_createButton(t,e,n,o,i){const r=this.editor,s=r.locale,a=r.commands.get(e),c=new t(s);return c.set({label:n,icon:i,keystroke:o}),c.bind("isEnabled").to(a,"isEnabled"),this.listenTo(c,"execute",(()=>{r.execute(e),r.editing.view.focus()})),c}}class l_ extends rr{static get requires(){return[a_,c_]}static get pluginName(){return"Undo"}}class d_ extends(K()){constructor(){super();const t=new window.FileReader;this._reader=t,this._data=void 0,this.set("loaded",0),t.onprogress=t=>{this.loaded=t.loaded}}get error(){return this._reader.error}get data(){return this._data}read(t){const e=this._reader;return this.total=t.size,new Promise(((n,o)=>{e.onload=()=>{const t=e.result;this._data=t,n(t)},e.onerror=()=>{o("error")},e.onabort=()=>{o("aborted")},this._reader.readAsDataURL(t)}))}abort(){this._reader.abort()}}class u_ extends rr{constructor(){super(...arguments),this.loaders=new Yi,this._loadersMap=new Map,this._pendingAction=null}static get pluginName(){return"FileRepository"}static get requires(){return[Rh]}init(){this.loaders.on("change",(()=>this._updatePendingAction())),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0))}getLoader(t){return this._loadersMap.get(t)||null}createLoader(t){if(!this.createUploadAdapter)return C("filerepository-no-upload-adapter"),null;const e=new h_(Promise.resolve(t),this.createUploadAdapter);return this.loaders.add(e),this._loadersMap.set(t,e),t instanceof Promise&&e.file.then((t=>{this._loadersMap.set(t,e)})).catch((()=>{})),e.on("change:uploaded",(()=>{let t=0;for(const e of this.loaders)t+=e.uploaded;this.uploaded=t})),e.on("change:uploadTotal",(()=>{let t=0;for(const e of this.loaders)e.uploadTotal&&(t+=e.uploadTotal);this.uploadTotal=t})),e}destroyLoader(t){const e=t instanceof h_?t:this.getLoader(t);e._destroy(),this.loaders.remove(e),this._loadersMap.forEach(((t,n)=>{t===e&&this._loadersMap.delete(n)}))}_updatePendingAction(){const t=this.editor.plugins.get(Rh);if(this.loaders.length){if(!this._pendingAction){const e=this.editor.t,n=t=>`${e("Upload in progress")} ${parseInt(t)}%.`;this._pendingAction=t.add(n(this.uploadedPercent)),this._pendingAction.bind("message").to(this,"uploadedPercent",n)}}else t.remove(this._pendingAction),this._pendingAction=null}}class h_ extends(K()){constructor(t,e){super(),this.id=k(),this._filePromiseWrapper=this._createFilePromiseWrapper(t),this._adapter=e(this),this._reader=new d_,this.set("status","idle"),this.set("uploaded",0),this.set("uploadTotal",null),this.bind("uploadedPercent").to(this,"uploaded",this,"uploadTotal",((t,e)=>e?t/e*100:0)),this.set("uploadResponse",null)}get file(){return this._filePromiseWrapper?this._filePromiseWrapper.promise.then((t=>this._filePromiseWrapper?t:null)):Promise.resolve(null)}get data(){return this._reader.data}read(){if("idle"!=this.status)throw new _("filerepository-read-wrong-status",this);return this.status="reading",this.file.then((t=>this._reader.read(t))).then((t=>{if("reading"!==this.status)throw this.status;return this.status="idle",t})).catch((t=>{if("aborted"===t)throw this.status="aborted","aborted";throw this.status="error",this._reader.error?this._reader.error:t}))}upload(){if("idle"!=this.status)throw new _("filerepository-upload-wrong-status",this);return this.status="uploading",this.file.then((()=>this._adapter.upload())).then((t=>(this.uploadResponse=t,this.status="idle",t))).catch((t=>{if("aborted"===this.status)throw"aborted";throw this.status="error",t}))}abort(){const t=this.status;this.status="aborted",this._filePromiseWrapper.isFulfilled?"reading"==t?this._reader.abort():"uploading"==t&&this._adapter.abort&&this._adapter.abort():(this._filePromiseWrapper.promise.catch((()=>{})),this._filePromiseWrapper.rejecter("aborted")),this._destroy()}_destroy(){this._filePromiseWrapper=void 0,this._reader=void 0,this._adapter=void 0,this.uploadResponse=void 0}_createFilePromiseWrapper(t){const e={};return e.promise=new Promise(((n,o)=>{e.rejecter=o,e.isFulfilled=!1,t.then((t=>{e.isFulfilled=!0,n(t)})).catch((t=>{e.isFulfilled=!0,o(t)}))})),e}}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;const g_="ckCsrfToken",m_="abcdefghijklmnopqrstuvwxyz0123456789";function p_(){let t=function(t){t=t.toLowerCase();const e=document.cookie.split(";");for(const n of e){const e=n.split("=");if(decodeURIComponent(e[0].trim().toLowerCase())===t)return decodeURIComponent(e[1])}return null}(g_);var e,n;return t&&40==t.length||(t=function(t){let e="";const n=new Uint8Array(t);window.crypto.getRandomValues(n);for(let t=0;t.5?o.toUpperCase():o}return e}(40),e=g_,n=t,document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(n)+";path=/"),t}class f_{constructor(t,e,n){this.loader=t,this.url=e,this.t=n}upload(){return this.loader.file.then((t=>new Promise(((e,n)=>{this._initRequest(),this._initListeners(e,n,t),this._sendRequest(t)}))))}abort(){this.xhr&&this.xhr.abort()}_initRequest(){const t=this.xhr=new XMLHttpRequest;t.open("POST",this.url,!0),t.responseType="json"}_initListeners(t,e,n){const o=this.xhr,i=this.loader,r=(0,this.t)("Cannot upload file:")+` ${n.name}.`;o.addEventListener("error",(()=>e(r))),o.addEventListener("abort",(()=>e())),o.addEventListener("load",(()=>{const n=o.response;if(!n||!n.uploaded)return e(n&&n.error&&n.error.message?n.error.message:r);t({default:n.url})})),o.upload&&o.upload.addEventListener("progress",(t=>{t.lengthComputable&&(i.uploadTotal=t.total,i.uploaded=t.loaded)}))}_sendRequest(t){const e=new FormData;e.append("upload",t),e.append("ckCsrfToken",p_()),this.xhr.send(e)}}function k_(t,e,n,o){let i,r=null;"function"==typeof o?i=o:(r=t.commands.get(o),i=()=>{t.execute(o)}),t.model.document.on("change:data",((s,a)=>{if(r&&!r.isEnabled||!e.isEnabled)return;const c=Qi(t.model.document.selection.getRanges());if(!c.isCollapsed)return;if(a.isUndo||!a.isLocal)return;const l=Array.from(t.model.document.differ.getChanges()),d=l[0];if(1!=l.length||"insert"!==d.type||"$text"!=d.name||1!=d.length)return;const u=d.position.parent;if(u.is("element","codeBlock"))return;if(u.is("element","listItem")&&"function"!=typeof o&&!["numberedList","bulletedList","todoList"].includes(o))return;if(r&&!0===r.value)return;const h=u.getChild(0),g=t.model.createRangeOn(h);if(!g.containsRange(c)&&!c.end.isEqual(g.end))return;const m=n.exec(h.data.substr(0,c.end.offset));m&&t.model.enqueueChange((e=>{const n=e.createPositionAt(u,0),o=e.createPositionAt(u,m[0].length),r=new hl(n,o);if(!1!==i({match:m})){e.remove(r);const n=t.model.document.selection.getFirstRange(),o=e.createRangeIn(u);!u.isEmpty||o.isEqual(n)||o.containsRange(n,!0)||e.remove(u)}r.detach(),t.model.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}))}))}function b_(t,e,n,o){let i,r;n instanceof RegExp?i=n:r=n,r=r||(t=>{let e;const n=[],o=[];for(;null!==(e=i.exec(t))&&!(e&&e.length<4);){let{index:t,1:i,2:r,3:s}=e;const a=i+r+s;t+=e[0].length-a.length;const c=[t,t+i.length],l=[t+i.length+r.length,t+i.length+r.length+s.length];n.push(c),n.push(l),o.push([t+i.length,t+i.length+r.length])}return{remove:n,format:o}}),t.model.document.on("change:data",((n,i)=>{if(i.isUndo||!i.isLocal||!e.isEnabled)return;const s=t.model,a=s.document.selection;if(!a.isCollapsed)return;const c=Array.from(s.document.differ.getChanges()),l=c[0];if(1!=c.length||"insert"!==l.type||"$text"!=l.name||1!=l.length)return;const d=a.focus,u=d.parent,{text:h,range:g}=function(t,e){let n=t.start;const o=Array.from(t.getItems()).reduce(((t,o)=>!o.is("$text")&&!o.is("$textProxy")||o.getAttribute("code")?(n=e.createPositionAfter(o),""):t+o.data),"");return{text:o,range:e.createRange(n,t.end)}}(s.createRange(s.createPositionAt(u,0),d),s),m=r(h),p=w_(g.start,m.format,s),f=w_(g.start,m.remove,s);p.length&&f.length&&s.enqueueChange((e=>{if(!1!==o(e,p)){for(const t of f.reverse())e.remove(t);s.enqueueChange((()=>{t.plugins.get("Delete").requestUndoOnBackspace()}))}}))}))}function w_(t,e,n){return e.filter((t=>void 0!==t[0]&&void 0!==t[1])).map((e=>n.createRange(t.getShiftedBy(e[0]),t.getShiftedBy(e[1]))))}function A_(t,e){return(n,o)=>{if(!t.commands.get(e).isEnabled)return!1;const i=t.model.schema.getValidRanges(o,e);for(const t of i)n.setAttribute(e,!0,t);n.removeSelectionAttribute(e)}}class __ extends ar{constructor(t,e){super(t),this.attributeKey=e}refresh(){const t=this.editor.model,e=t.document;this.value=this._getValueFromFirstAllowedNode(),this.isEnabled=t.schema.checkAttributeInSelection(e.selection,this.attributeKey)}execute(t={}){const e=this.editor.model,n=e.document.selection,o=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(n.isCollapsed)o?t.setSelectionAttribute(this.attributeKey,!0):t.removeSelectionAttribute(this.attributeKey);else{const i=e.schema.getValidRanges(n.getRanges(),this.attributeKey);for(const e of i)o?t.setAttribute(this.attributeKey,o,e):t.removeAttribute(this.attributeKey,e)}}))}_getValueFromFirstAllowedNode(){const t=this.editor.model,e=t.schema,n=t.document.selection;if(n.isCollapsed)return n.hasAttribute(this.attributeKey);for(const t of n.getRanges())for(const n of t.getItems())if(e.checkAttribute(n,this.attributeKey))return n.hasAttribute(this.attributeKey);return!1}}const C_="bold";class v_ extends rr{static get pluginName(){return"BoldEditing"}init(){const t=this.editor,e=this.editor.t;t.model.schema.extend("$text",{allowAttributes:C_}),t.model.schema.setAttributeProperties(C_,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:C_,view:"strong",upcastAlso:["b",t=>{const e=t.getStyle("font-weight");return e&&("bold"==e||Number(e)>=600)?{name:!0,styles:["font-weight"]}:null}]}),t.commands.add(C_,new __(t,C_)),t.keystrokes.set("CTRL+B",C_),t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Bold text"),keystroke:"CTRL+B"}]})}}function y_({editor:t,commandName:e,plugin:n,icon:o,label:i,keystroke:r}){return s=>{const a=t.commands.get(e),c=new s(t.locale);return c.set({label:i,icon:o,keystroke:r,isToggleable:!0}),c.bind("isEnabled").to(a,"isEnabled"),n.listenTo(c,"execute",(()=>{t.execute(e),t.editing.view.focus()})),c}}const x_="bold";class E_ extends rr{static get pluginName(){return"BoldUI"}init(){const t=this.editor,e=t.locale.t,n=t.commands.get(x_),o=y_({editor:t,commandName:x_,plugin:this,icon:jh.bold,label:e("Bold"),keystroke:"CTRL+B"});t.ui.componentFactory.add(x_,(()=>{const t=o(Ig);return t.set({tooltip:!0}),t.bind("isOn").to(n,"value"),t})),t.ui.componentFactory.add("menuBar:"+x_,(()=>o(Wk)))}}var D_=n(4199),I_={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(D_.A,I_);D_.A.locals;const M_="italic";class T_ extends rr{static get pluginName(){return"ItalicEditing"}init(){const t=this.editor,e=this.editor.t;t.model.schema.extend("$text",{allowAttributes:M_}),t.model.schema.setAttributeProperties(M_,{isFormatting:!0,copyOnEnter:!0}),t.conversion.attributeToElement({model:M_,view:"i",upcastAlso:["em",{styles:{"font-style":"italic"}}]}),t.commands.add(M_,new __(t,M_)),t.keystrokes.set("CTRL+I",M_),t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Italic text"),keystroke:"CTRL+I"}]})}}const S_="italic";class B_ extends rr{static get pluginName(){return"ItalicUI"}init(){const t=this.editor,e=t.commands.get(S_),n=t.locale.t,o=y_({editor:t,commandName:S_,plugin:this,icon:'',keystroke:"CTRL+I",label:n("Italic")});t.ui.componentFactory.add(S_,(()=>{const t=o(Ig);return t.set({tooltip:!0}),t.bind("isOn").to(e,"value"),t})),t.ui.componentFactory.add("menuBar:"+S_,(()=>o(Wk)))}}class N_ extends ar{refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,n=e.schema,o=e.document.selection,i=Array.from(o.getSelectedBlocks()),r=void 0===t.forceValue?!this.value:t.forceValue;e.change((t=>{if(r){const e=i.filter((t=>P_(t)||L_(n,t)));this._applyQuote(t,e)}else this._removeQuote(t,i.filter(P_))}))}_getValue(){const t=Qi(this.editor.model.document.selection.getSelectedBlocks());return!(!t||!P_(t))}_checkEnabled(){if(this.value)return!0;const t=this.editor.model.document.selection,e=this.editor.model.schema,n=Qi(t.getSelectedBlocks());return!!n&&L_(e,n)}_removeQuote(t,e){O_(t,e).reverse().forEach((e=>{if(e.start.isAtStart&&e.end.isAtEnd)return void t.unwrap(e.start.parent);if(e.start.isAtStart){const n=t.createPositionBefore(e.start.parent);return void t.move(e,n)}e.end.isAtEnd||t.split(e.end);const n=t.createPositionAfter(e.end.parent);t.move(e,n)}))}_applyQuote(t,e){const n=[];O_(t,e).reverse().forEach((e=>{let o=P_(e.start);o||(o=t.createElement("blockQuote"),t.wrap(e,o)),n.push(o)})),n.reverse().reduce(((e,n)=>e.nextSibling==n?(t.merge(t.createPositionAfter(e)),e):n))}}function P_(t){return"blockQuote"==t.parent.name?t.parent:null}function O_(t,e){let n,o=0;const i=[];for(;o{const o=t.model.document.differ.getChanges();for(const t of o)if("insert"==t.type){const o=t.position.nodeAfter;if(!o)continue;if(o.is("element","blockQuote")&&o.isEmpty)return n.remove(o),!0;if(o.is("element","blockQuote")&&!e.checkChild(t.position,o))return n.unwrap(o),!0;if(o.is("element")){const t=n.createRangeIn(o);for(const o of t.getItems())if(o.is("element","blockQuote")&&!e.checkChild(n.createPositionBefore(o),o))return n.unwrap(o),!0}}else if("remove"==t.type){const e=t.position.parent;if(e.is("element","blockQuote")&&e.isEmpty)return n.remove(e),!0}return!1}));const n=this.editor.editing.view.document,o=t.model.document.selection,i=t.commands.get("blockQuote");this.listenTo(n,"enter",((e,n)=>{if(!o.isCollapsed||!i.value)return;o.getLastPosition().parent.isEmpty&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),n.preventDefault(),e.stop())}),{context:"blockquote"}),this.listenTo(n,"delete",((e,n)=>{if("backward"!=n.direction||!o.isCollapsed||!i.value)return;const r=o.getLastPosition().parent;r.isEmpty&&!r.previousSibling&&(t.execute("blockQuote"),t.editing.view.scrollToTheSelection(),n.preventDefault(),e.stop())}),{context:"blockquote"})}}var R_=n(8708),j_={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(R_.A,j_);R_.A.locals;class F_ extends rr{static get pluginName(){return"BlockQuoteUI"}init(){const t=this.editor,e=t.commands.get("blockQuote");t.ui.componentFactory.add("blockQuote",(()=>{const t=this._createButton(Ig);return t.set({tooltip:!0}),t.bind("isOn").to(e,"value"),t})),t.ui.componentFactory.add("menuBar:blockQuote",(()=>this._createButton(Wk)))}_createButton(t){const e=this.editor,n=e.locale,o=e.commands.get("blockQuote"),i=new t(e.locale),r=n.t;return i.set({label:r("Block quote"),icon:jh.quote,isToggleable:!0}),i.bind("isEnabled").to(o,"isEnabled"),this.listenTo(i,"execute",(()=>{e.execute("blockQuote"),e.editing.view.focus()})),i}}class V_ extends rr{static get pluginName(){return"CKBoxUI"}afterInit(){const t=this.editor;if(!t.commands.get("ckbox"))return;const e=t.t,n=t.ui.componentFactory;if(n.add("ckbox",(()=>{const t=this._createButton(Ig);return t.tooltip=!0,t})),n.add("menuBar:ckbox",(()=>this._createButton(Wk))),t.plugins.has("ImageInsertUI")){const n=t.plugins.get("ImageInsertUI");n.registerIntegration({name:"assetManager",observable:()=>t.commands.get("ckbox"),buttonViewCreator:()=>{const t=this.editor.ui.componentFactory.create("ckbox");return t.icon=jh.imageAssetManager,t.bind("label").to(n,"isImageSelected",(t=>e(t?"Replace image with file manager":"Insert image with file manager"))),t},formViewCreator:()=>{const t=this.editor.ui.componentFactory.create("ckbox");return t.icon=jh.imageAssetManager,t.withText=!0,t.bind("label").to(n,"isImageSelected",(t=>e(t?"Replace with file manager":"Insert with file manager"))),t.on("execute",(()=>{n.dropdownView.isOpen=!1})),t}})}}_createButton(t){const e=this.editor,n=e.locale,o=new t(n),i=e.commands.get("ckbox"),r=n.t;return o.set({label:r("Open file manager"),icon:jh.browseFiles}),o.bind("isOn","isEnabled").to(i,"value","isEnabled"),o.on("execute",(()=>{e.execute("ckbox")})),o}}var H_=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","#","$","%","*","+",",","-",".",":",";","=","?","@","[","]","^","_","{","|","}","~"],U_=t=>{let e=0;for(let n=0;n{let e=t/255;return e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)},G_=t=>{let e=Math.max(0,Math.min(1,t));return e<=.0031308?Math.trunc(12.92*e*255+.5):Math.trunc(255*(1.055*Math.pow(e,.4166666666666667)-.055)+.5)},W_=(t,e)=>(t=>t<0?-1:1)(t)*Math.pow(Math.abs(t),e),K_=class extends Error{constructor(t){super(t),this.name="ValidationError",this.message=t}},$_=t=>{if(!t||t.length<6)throw new K_("The blurhash string must be at least 6 characters");let e=U_(t[0]),n=Math.floor(e/9)+1,o=e%9+1;if(t.length!==4+2*o*n)throw new K_(`blurhash length mismatch: length is ${t.length} but it should be ${4+2*o*n}`)},Y_=t=>{let e=t>>8&255,n=255&t;return[q_(t>>16),q_(e),q_(n)]},Q_=(t,e)=>{let n=Math.floor(t/361),o=Math.floor(t/19)%19,i=t%19;return[W_((n-9)/9,2)*e,W_((o-9)/9,2)*e,W_((i-9)/9,2)*e]},Z_=(t,e,n,o)=>{$_(t),o|=1;let i=U_(t[0]),r=Math.floor(i/9)+1,s=i%9+1,a=(U_(t[1])+1)/166,c=new Array(s*r);for(let e=0;ee in t?J_(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;function oC(t){const e=[];let n=0;for(const o in t){const i=parseInt(o,10);isNaN(i)||(i>n&&(n=i),e.push(`${t[o]} ${o}w`))}const o=[{srcset:e.join(","),sizes:`(max-width: ${n}px) 100vw, ${n}px`,type:"image/webp"}];return{imageFallbackUrl:t.default,imageSources:o}}const iC=32;function rC({url:t,method:e="GET",data:n,onUploadProgress:o,signal:i,authorization:r}){const s=new XMLHttpRequest;s.open(e,t.toString()),s.setRequestHeader("Authorization",r),s.setRequestHeader("CKBox-Version","CKEditor 5"),s.responseType="json";const a=()=>{s.abort()};return new Promise(((t,e)=>{i.throwIfAborted(),i.addEventListener("abort",a),s.addEventListener("loadstart",(()=>{i.addEventListener("abort",a)})),s.addEventListener("loadend",(()=>{i.removeEventListener("abort",a)})),s.addEventListener("error",(()=>{e()})),s.addEventListener("abort",(()=>{e()})),s.addEventListener("load",(()=>{const n=s.response;if(!n||n.statusCode>=400)return e(n&&n.message);t(n)})),o&&s.upload.addEventListener("progress",(t=>{o(t)})),s.send(n)}))}const sC={"image/gif":"gif","image/jpeg":"jpg","image/png":"png","image/webp":"webp","image/bmp":"bmp","image/tiff":"tiff"};function aC(t,e){return n=this,o=null,i=function*(){try{const n=yield fetch(t,((t,e)=>{for(var n in e||(e={}))tC.call(e,n)&&nC(t,n,e[n]);if(X_)for(var n of X_(e))eC.call(e,n)&&nC(t,n,e[n]);return t})({method:"HEAD",cache:"force-cache"},e));return n.ok&&n.headers.get("content-type")||""}catch(t){return""}},new Promise(((t,e)=>{var r=t=>{try{a(i.next(t))}catch(t){e(t)}},s=t=>{try{a(i.throw(t))}catch(t){e(t)}},a=e=>e.done?t(e.value):Promise.resolve(e.value).then(r,s);a((i=i.apply(n,o)).next())}));var n,o,i}var cC=Object.defineProperty,lC=Object.getOwnPropertySymbols,dC=Object.prototype.hasOwnProperty,uC=Object.prototype.propertyIsEnumerable,hC=(t,e,n)=>e in t?cC(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,gC=(t,e)=>{for(var n in e||(e={}))dC.call(e,n)&&hC(t,n,e[n]);if(lC)for(var n of lC(e))uC.call(e,n)&&hC(t,n,e[n]);return t};class mC extends ar{constructor(t){super(t),this._chosenAssets=new Set,this._wrapper=null,this._initListeners()}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(){this.fire("ckbox:open")}_getValue(){return null!==this._wrapper}_checkEnabled(){const t=this.editor.commands.get("insertImage"),e=this.editor.commands.get("link");return!(!t.isEnabled&&!e.isEnabled)}_prepareOptions(){const t=this.editor.config.get("ckbox");return{theme:t.theme,language:t.language,tokenUrl:t.tokenUrl,serviceOrigin:t.serviceOrigin,forceDemoLabel:t.forceDemoLabel,dialog:{onClose:()=>this.fire("ckbox:close")},assets:{onChoose:t=>this.fire("ckbox:choose",t)}}}_initListeners(){const t=this.editor,e=t.model,n=!t.config.get("ckbox.ignoreDataId");this.on("ckbox",(()=>{this.refresh()}),{priority:"low"}),this.on("ckbox:open",(()=>{this.isEnabled&&!this.value&&(this._wrapper=wt(document,"div",{class:"ck ckbox-wrapper"}),document.body.appendChild(this._wrapper),window.CKBox.mount(this._wrapper,this._prepareOptions()))})),this.on("ckbox:close",(()=>{this.value&&(this._wrapper.remove(),this._wrapper=null,t.editing.view.focus())})),this.on("ckbox:choose",((o,i)=>{if(!this.isEnabled)return;const r=t.commands.get("insertImage"),s=t.commands.get("link"),a=function({assets:t,isImageAllowed:e,isLinkAllowed:n}){return t.map((t=>function(t){const e=t.data.metadata;if(!e)return!1;return e.width&&e.height}(t)?{id:t.data.id,type:"image",attributes:pC(t)}:{id:t.data.id,type:"link",attributes:fC(t)})).filter((t=>"image"===t.type?e:n))}({assets:i,isImageAllowed:r.isEnabled,isLinkAllowed:s.isEnabled}),c=a.length;0!==c&&(e.change((t=>{for(const e of a){const o=e===a[c-1],i=1===c;this._insertAsset(e,o,t,i),n&&(setTimeout((()=>this._chosenAssets.delete(e)),1e3),this._chosenAssets.add(e))}})),t.editing.view.focus())})),this.listenTo(t,"destroy",(()=>{this.fire("ckbox:close"),this._chosenAssets.clear()}))}_insertAsset(t,e,n,o){const i=this.editor.model.document.selection;n.removeSelectionAttribute("linkHref"),"image"===t.type?this._insertImage(t):this._insertLink(t,n,o),e||n.setSelection(i.getLastPosition())}_insertImage(t){const e=this.editor,{imageFallbackUrl:n,imageSources:o,imageTextAlternative:i,imageWidth:r,imageHeight:s,imagePlaceholder:a}=t.attributes;e.execute("insertImage",{source:gC({src:n,sources:o,alt:i,width:r,height:s},a?{placeholder:a}:null)})}_insertLink(t,e,n){const o=this.editor,i=o.model,r=i.document.selection,{linkName:s,linkHref:a}=t.attributes;if(r.isCollapsed){const t=Xi(r.getAttributes()),c=e.createText(s,t);if(!n){const t=r.getLastPosition(),n=t.parent;"paragraph"===n.name&&n.isEmpty||o.execute("insertParagraph",{position:t});const s=i.insertContent(c);return e.setSelection(s),void o.execute("link",a)}const l=i.insertContent(c);e.setSelection(l)}o.execute("link",a)}}function pC(t){const{imageFallbackUrl:e,imageSources:n}=oC(t.data.imageUrls),{description:o,width:i,height:r,blurHash:s}=t.data.metadata,a=function(t){if(t)try{const e=`${iC}px`,n=document.createElement("canvas");n.setAttribute("width",e),n.setAttribute("height",e);const o=n.getContext("2d");if(!o)return;const i=o.createImageData(iC,iC),r=Z_(t,iC,iC);return i.data.set(r),o.putImageData(i,0,0),n.toDataURL()}catch(t){return}}(s);return gC({imageFallbackUrl:e,imageSources:n,imageTextAlternative:o||"",imageWidth:i,imageHeight:r},a?{imagePlaceholder:a}:null)}function fC(t){return{linkName:t.data.name,linkHref:kC(t)}}function kC(t){const e=new URL(t.data.url);return e.searchParams.set("download","true"),e.toString()}var bC=(t,e,n)=>new Promise(((o,i)=>{var r=t=>{try{a(n.next(t))}catch(t){i(t)}},s=t=>{try{a(n.throw(t))}catch(t){i(t)}},a=t=>t.done?o(t.value):Promise.resolve(t.value).then(r,s);a((n=n.apply(t,e)).next())}));class wC extends rr{static get pluginName(){return"CKBoxUtils"}static get requires(){return["CloudServices"]}init(){return bC(this,null,(function*(){const t=this.editor,e=!!t.config.get("ckbox"),n=!!window.CKBox;if(!e&&!n)return;t.config.define("ckbox",{serviceOrigin:"https://api.ckbox.io",defaultUploadCategories:null,ignoreDataId:!1,language:t.locale.uiLanguage,theme:"lark",tokenUrl:t.config.get("cloudServices.tokenUrl")});const o=t.plugins.get("CloudServices"),i=t.config.get("cloudServices.tokenUrl"),r=t.config.get("ckbox.tokenUrl");if(!r)throw new _("ckbox-plugin-missing-token-url",this);this._token=r==i?o.token:yield o.registerTokenUrl(r)}))}getToken(){return this._token}getWorkspaceId(){const t=(0,this.editor.t)("Cannot access default workspace."),e=this.editor.config.get("ckbox.defaultUploadWorkspaceId"),n=function(t,e){const[,n]=t.value.split("."),o=JSON.parse(atob(n)),i=o.auth&&o.auth.ckbox&&o.auth.ckbox.workspaces||[o.aud];return e?"superadmin"==(o.auth&&o.auth.ckbox&&o.auth.ckbox.role)||i.includes(e)?e:null:i[0]}(this._token,e);if(null==n)throw v("ckbox-access-default-workspace-error"),t;return n}getCategoryIdForFile(t,e){return bC(this,null,(function*(){const n=(0,this.editor.t)("Cannot determine a category for the uploaded file."),o=this.editor.config.get("ckbox.defaultUploadCategories"),i=this._getAvailableCategories(e),r="string"==typeof t?(s=yield aC(t,e),sC[s]):function(t){const e=t.name,n=new RegExp("\\.(?[^.]+)$");return e.match(n).groups.ext.toLowerCase()}(t);var s;const a=yield i;if(!a)throw n;if(o){const t=Object.keys(o).find((t=>o[t].find((t=>t.toLowerCase()==r))));if(t){const e=a.find((e=>e.id===t||e.name===t));if(!e)throw n;return e.id}}const c=a.find((t=>t.extensions.find((t=>t.toLowerCase()==r))));if(!c)throw n;return c.id}))}_getAvailableCategories(t){return bC(this,null,(function*(){const e=this.editor,n=this._token,{signal:o}=t,i=e.config.get("ckbox.serviceOrigin"),r=this.getWorkspaceId();try{const t=[];let e,n=0;do{const o=yield s(n);t.push(...o.items),e=o.totalCount-(n+50),n+=50}while(e>0);return t}catch(t){return o.throwIfAborted(),void v("ckbox-fetch-category-http-error")}function s(t){const e=new URL("categories",i);return e.searchParams.set("limit",50..toString()),e.searchParams.set("offset",t.toString()),e.searchParams.set("workspaceId",r),rC({url:e,signal:o,authorization:n.value})}}))}}var AC=(t,e,n)=>new Promise(((o,i)=>{var r=t=>{try{a(n.next(t))}catch(t){i(t)}},s=t=>{try{a(n.throw(t))}catch(t){i(t)}},a=t=>t.done?o(t.value):Promise.resolve(t.value).then(r,s);a((n=n.apply(t,e)).next())}));class _C extends rr{static get requires(){return["ImageUploadEditing","ImageUploadProgress",u_,vC]}static get pluginName(){return"CKBoxUploadAdapter"}afterInit(){return AC(this,null,(function*(){const t=this.editor,e=!!t.config.get("ckbox"),n=!!window.CKBox;if(!e&&!n)return;const o=t.plugins.get(u_),i=t.plugins.get(wC);o.createUploadAdapter=e=>new CC(e,t,i);const r=!t.config.get("ckbox.ignoreDataId"),s=t.plugins.get("ImageUploadEditing");r&&s.on("uploadComplete",((e,{imageElement:n,data:o})=>{t.model.change((t=>{t.setAttribute("ckboxImageId",o.ckboxImageId,n)}))}))}))}}class CC{constructor(t,e,n){this.loader=t,this.token=n.getToken(),this.ckboxUtils=n,this.editor=e,this.controller=new AbortController,this.serviceOrigin=e.config.get("ckbox.serviceOrigin")}upload(){return AC(this,null,(function*(){const t=this.ckboxUtils,e=this.editor.t,n=yield this.loader.file,o=yield t.getCategoryIdForFile(n,{signal:this.controller.signal}),i=new URL("assets",this.serviceOrigin),r=new FormData;i.searchParams.set("workspaceId",t.getWorkspaceId()),r.append("categoryId",o),r.append("file",n);return rC({method:"POST",url:i,data:r,onUploadProgress:t=>{t.lengthComputable&&(this.loader.uploadTotal=t.total,this.loader.uploaded=t.loaded)},signal:this.controller.signal,authorization:this.token.value}).then((t=>AC(this,null,(function*(){const e=oC(t.imageUrls);return{ckboxImageId:t.id,default:e.imageFallbackUrl,sources:e.imageSources}})))).catch((()=>{const t=e("Cannot upload file:")+` ${n.name}.`;return Promise.reject(t)}))}))}abort(){this.controller.abort()}}class vC extends rr{static get pluginName(){return"CKBoxEditing"}static get requires(){return["LinkEditing","PictureEditing",_C,wC]}init(){const t=this.editor;this._shouldBeInitialised()&&(this._checkImagePlugins(),DC()&&t.commands.add("ckbox",new mC(t)))}afterInit(){const t=this.editor;this._shouldBeInitialised()&&(t.config.get("ckbox.ignoreDataId")||(this._initSchema(),this._initConversion(),this._initFixers()))}_shouldBeInitialised(){return!!this.editor.config.get("ckbox")||DC()}_checkImagePlugins(){const t=this.editor;t.plugins.has("ImageBlockEditing")||t.plugins.has("ImageInlineEditing")||v("ckbox-plugin-image-feature-missing",t)}_initSchema(){const t=this.editor.model.schema;t.extend("$text",{allowAttributes:"ckboxLinkId"}),t.isRegistered("imageBlock")&&t.extend("imageBlock",{allowAttributes:["ckboxImageId","ckboxLinkId"]}),t.isRegistered("imageInline")&&t.extend("imageInline",{allowAttributes:["ckboxImageId","ckboxLinkId"]}),t.addAttributeCheck(((t,e)=>{if(!!!t.last.getAttribute("linkHref")&&"ckboxLinkId"===e)return!1}))}_initConversion(){const t=this.editor;t.conversion.for("downcast").add((t=>{t.on("attribute:ckboxLinkId:imageBlock",((t,e,n)=>{const{writer:o,mapper:i,consumable:r}=n;if(!r.consume(e.item,t.name))return;const s=[...i.toViewElement(e.item).getChildren()].find((t=>"a"===t.name));s&&(e.item.hasAttribute("ckboxLinkId")?o.setAttribute("data-ckbox-resource-id",e.item.getAttribute("ckboxLinkId"),s):o.removeAttribute("data-ckbox-resource-id",s))}),{priority:"low"}),t.on("attribute:ckboxLinkId",((t,e,n)=>{const{writer:o,mapper:i,consumable:r}=n;if(r.consume(e.item,t.name)){if(e.attributeOldValue){const t=xC(o,e.attributeOldValue);o.unwrap(i.toViewRange(e.range),t)}if(e.attributeNewValue){const t=xC(o,e.attributeNewValue);if(e.item.is("selection")){const e=o.document.selection;o.wrap(e.getFirstRange(),t)}else o.wrap(i.toViewRange(e.range),t)}}}),{priority:"low"})})),t.conversion.for("upcast").add((t=>{t.on("element:a",((t,e,n)=>{const{writer:o,consumable:i}=n;if(!e.viewItem.getAttribute("href"))return;if(!i.consume(e.viewItem,{attributes:["data-ckbox-resource-id"]}))return;const r=e.viewItem.getAttribute("data-ckbox-resource-id");if(r)if(e.modelRange)for(let t of e.modelRange.getItems())t.is("$textProxy")&&(t=t.textNode),EC(t)&&o.setAttribute("ckboxLinkId",r,t);else{const t=e.modelCursor.nodeBefore||e.modelCursor.parent;o.setAttribute("ckboxLinkId",r,t)}}),{priority:"low"})})),t.conversion.for("downcast").attributeToAttribute({model:"ckboxImageId",view:"data-ckbox-resource-id"}),t.conversion.for("upcast").elementToAttribute({model:{key:"ckboxImageId",value:t=>t.getAttribute("data-ckbox-resource-id")},view:{attributes:{"data-ckbox-resource-id":/[\s\S]+/}}});const e=t.commands.get("replaceImageSource");e&&this.listenTo(e,"cleanupImage",((t,[e,n])=>{e.removeAttribute("ckboxImageId",n)}))}_initFixers(){const t=this.editor,e=t.model,n=e.document.selection;e.document.registerPostFixer(function(t){return e=>{let n=!1;const o=t.model,i=t.commands.get("ckbox");if(!i)return n;for(const t of o.document.differ.getChanges()){if("insert"!==t.type&&"attribute"!==t.type)continue;const o="insert"===t.type?new Uc(t.position,t.position.getShiftedBy(t.length)):t.range,r="attribute"===t.type&&"linkHref"===t.attributeKey&&null===t.attributeNewValue;for(const t of o.getItems()){if(r&&t.hasAttribute("ckboxLinkId")){e.removeAttribute("ckboxLinkId",t),n=!0;continue}const o=yC(t,i._chosenAssets);for(const i of o){const o="image"===i.type?"ckboxImageId":"ckboxLinkId";i.id!==t.getAttribute(o)&&(e.setAttribute(o,i.id,t),n=!0)}}}return n}}(t)),e.document.registerPostFixer(function(t){return e=>!(t.hasAttribute("linkHref")||!t.hasAttribute("ckboxLinkId"))&&(e.removeSelectionAttribute("ckboxLinkId"),!0)}(n))}}function yC(t,e){const n=t.is("element","imageInline")||t.is("element","imageBlock"),o=t.hasAttribute("linkHref");return[...e].filter((e=>"image"===e.type&&n?e.attributes.imageFallbackUrl===t.getAttribute("src"):"link"===e.type&&o?e.attributes.linkHref===t.getAttribute("linkHref"):void 0))}function xC(t,e){const n=t.createAttributeElement("a",{"data-ckbox-resource-id":e},{priority:5});return t.setCustomProperty("link",!0,n),n}function EC(t){return!!t.is("$text")||!(!t.is("element","imageInline")&&!t.is("element","imageBlock"))}function DC(){return!!window.CKBox}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;var IC=n(1866),MC={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(IC.A,MC);IC.A.locals;class TC extends rr{static get pluginName(){return"CKFinderUI"}init(){const t=this.editor,e=t.ui.componentFactory,n=t.t;if(e.add("ckfinder",(t=>{const e=this._createButton(Ig),n=t.t;return e.set({label:n("Insert image or file"),tooltip:!0}),e})),e.add("menuBar:ckfinder",(t=>{const e=this._createButton(Wk),n=t.t;return e.label=n("Image or file"),e})),t.plugins.has("ImageInsertUI")){const e=t.plugins.get("ImageInsertUI");e.registerIntegration({name:"assetManager",observable:()=>t.commands.get("ckfinder"),buttonViewCreator:()=>{const t=this.editor.ui.componentFactory.create("ckfinder");return t.icon=jh.imageAssetManager,t.bind("label").to(e,"isImageSelected",(t=>n(t?"Replace image with file manager":"Insert image with file manager"))),t},formViewCreator:()=>{const t=this.editor.ui.componentFactory.create("ckfinder");return t.icon=jh.imageAssetManager,t.withText=!0,t.bind("label").to(e,"isImageSelected",(t=>n(t?"Replace with file manager":"Insert with file manager"))),t.on("execute",(()=>{e.dropdownView.isOpen=!1})),t}})}}_createButton(t){const e=this.editor,n=new t(e.locale),o=e.commands.get("ckfinder");return n.icon=jh.browseFiles,n.bind("isEnabled").to(o),n.on("execute",(()=>{e.execute("ckfinder"),e.editing.view.focus()})),n}}class SC extends ar{constructor(t){super(t),this.affectsData=!1,this.stopListening(this.editor.model.document,"change"),this.listenTo(this.editor.model.document,"change",(()=>this.refresh()),{priority:"low"})}refresh(){const t=this.editor.commands.get("insertImage"),e=this.editor.commands.get("link");this.isEnabled=t.isEnabled||e.isEnabled}execute(){const t=this.editor,e=this.editor.config.get("ckfinder.openerMethod")||"modal";if("popup"!=e&&"modal"!=e)throw new _("ckfinder-unknown-openermethod",t);const n=this.editor.config.get("ckfinder.options")||{};n.chooseFiles=!0;const o=n.onInit;n.language||(n.language=t.locale.uiLanguage),n.onInit=e=>{o&&o(e),e.on("files:choose",(n=>{const o=n.data.files.toArray(),i=o.filter((t=>!t.isImage())),r=o.filter((t=>t.isImage()));for(const e of i)t.execute("link",e.getUrl());const s=[];for(const t of r){const n=t.getUrl();s.push(n||e.request("file:getProxyUrl",{file:t}))}s.length&&BC(t,s)})),e.on("file:choose:resizedImage",(e=>{const n=e.data.resizedUrl;if(n)BC(t,[n]);else{const e=t.plugins.get("Notification"),n=t.locale.t;e.showWarning(n("Could not obtain resized image URL."),{title:n("Selecting resized image failed"),namespace:"ckfinder"})}}))},window.CKFinder[e](n)}}function BC(t,e){if(t.commands.get("insertImage").isEnabled)t.execute("insertImage",{source:e});else{const e=t.plugins.get("Notification"),n=t.locale.t;e.showWarning(n("Could not insert image at the current position."),{title:n("Inserting image failed"),namespace:"ckfinder"})}}class NC extends rr{static get pluginName(){return"CKFinderEditing"}static get requires(){return[vf,"LinkEditing"]}init(){const t=this.editor;if(!t.plugins.has("ImageBlockEditing")&&!t.plugins.has("ImageInlineEditing"))throw new _("ckfinder-missing-image-plugin",t);t.commands.add("ckfinder",new SC(t))}}class PC extends rr{static get pluginName(){return"CloudServicesUploadAdapter"}static get requires(){return["CloudServices",u_]}init(){const t=this.editor,e=t.plugins.get("CloudServices"),n=e.token,o=e.uploadUrl;if(!n)return;const i=t.plugins.get("CloudServicesCore");this._uploadGateway=i.createUploadGateway(n,o),t.plugins.get(u_).createUploadAdapter=t=>new OC(this._uploadGateway,t)}}class OC{constructor(t,e){this.uploadGateway=t,this.loader=e}upload(){return this.loader.file.then((t=>(this.fileUploader=this.uploadGateway.upload(t),this.fileUploader.on("progress",((t,e)=>{this.loader.uploadTotal=e.total,this.loader.uploaded=e.uploaded})),this.fileUploader.send())))}abort(){this.fileUploader.abort()}}class LC extends ar{constructor(t){super(t),this._isEnabledBasedOnSelection=!1}refresh(){const t=this.editor.model,e=Qi(t.document.selection.getSelectedBlocks());this.value=!!e&&e.is("element","paragraph"),this.isEnabled=!!e&&zC(e,t.schema)}execute(t={}){const e=this.editor.model,n=e.document,o=t.selection||n.selection;e.canEditAt(o)&&e.change((t=>{const n=o.getSelectedBlocks();for(const o of n)!o.is("element","paragraph")&&zC(o,e.schema)&&t.rename(o,"paragraph")}))}}function zC(t,e){return e.checkChild(t.parent,"paragraph")&&!e.isObject(t)}class RC extends ar{constructor(t){super(t),this._isEnabledBasedOnSelection=!1}execute(t){const e=this.editor.model,n=t.attributes;let o=t.position;e.canEditAt(o)&&e.change((t=>{if(o=this._findPositionToInsertParagraph(o,t),!o)return;const i=t.createElement("paragraph");n&&e.schema.setAllowedAttributes(i,n,t),e.insertContent(i,o),t.setSelection(i,"in")}))}_findPositionToInsertParagraph(t,e){const n=this.editor.model;if(n.schema.checkChild(t,"paragraph"))return t;const o=n.schema.findAllowedParent(t,"paragraph");if(!o)return null;const i=t.parent,r=n.schema.checkChild(i,"$text");return i.isEmpty||r&&t.isAtEnd?n.createPositionAfter(i):!i.isEmpty&&r&&t.isAtStart?n.createPositionBefore(i):e.split(t,o).position}}const jC=class extends rr{static get pluginName(){return"Paragraph"}init(){const t=this.editor,e=t.model;t.commands.add("paragraph",new LC(t)),t.commands.add("insertParagraph",new RC(t)),e.schema.register("paragraph",{inheritAllFrom:"$block"}),t.conversion.elementToElement({model:"paragraph",view:"p"}),t.conversion.for("upcast").elementToElement({model:(t,{writer:e})=>jC.paragraphLikeElements.has(t.name)?t.isEmpty?null:e.createElement("paragraph"):null,view:/.+/,converterPriority:"low"})}};let FC=jC;FC.paragraphLikeElements=new Set(["blockquote","dd","div","dt","h1","h2","h3","h4","h5","h6","li","p","td","th"]);class VC extends ar{constructor(t,e){super(t),this.modelElements=e}refresh(){const t=Qi(this.editor.model.document.selection.getSelectedBlocks());this.value=!!t&&this.modelElements.includes(t.name)&&t.name,this.isEnabled=!!t&&this.modelElements.some((e=>HC(t,e,this.editor.model.schema)))}execute(t){const e=this.editor.model,n=e.document,o=t.value;e.change((t=>{const i=Array.from(n.selection.getSelectedBlocks()).filter((t=>HC(t,o,e.schema)));for(const e of i)e.is("element",o)||t.rename(e,o)}))}}function HC(t,e,n){return n.checkChild(t.parent,e)&&!n.isObject(t)}const UC="paragraph";class qC extends rr{static get pluginName(){return"HeadingEditing"}constructor(t){super(t),t.config.define("heading",{options:[{model:"paragraph",title:"Paragraph",class:"ck-heading_paragraph"},{model:"heading1",view:"h2",title:"Heading 1",class:"ck-heading_heading1"},{model:"heading2",view:"h3",title:"Heading 2",class:"ck-heading_heading2"},{model:"heading3",view:"h4",title:"Heading 3",class:"ck-heading_heading3"}]})}static get requires(){return[FC]}init(){const t=this.editor,e=t.config.get("heading.options"),n=[];for(const o of e)"paragraph"!==o.model&&(t.model.schema.register(o.model,{inheritAllFrom:"$block"}),t.conversion.elementToElement(o),n.push(o.model));this._addDefaultH1Conversion(t),t.commands.add("heading",new VC(t,n))}afterInit(){const t=this.editor,e=t.commands.get("enter"),n=t.config.get("heading.options");e&&this.listenTo(e,"afterExecute",((e,o)=>{const i=t.model.document.selection.getFirstPosition().parent;n.some((t=>i.is("element",t.model)))&&!i.is("element",UC)&&0===i.childCount&&o.writer.rename(i,UC)}))}_addDefaultH1Conversion(t){t.conversion.for("upcast").elementToElement({model:"heading1",view:"h1",converterPriority:b.low+1})}}var GC=n(6269),WC={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(GC.A,WC);GC.A.locals;class KC extends rr{static get pluginName(){return"HeadingUI"}init(){const t=this.editor,e=t.t,n=function(t){const e=t.t,n={Paragraph:e("Paragraph"),"Heading 1":e("Heading 1"),"Heading 2":e("Heading 2"),"Heading 3":e("Heading 3"),"Heading 4":e("Heading 4"),"Heading 5":e("Heading 5"),"Heading 6":e("Heading 6")};return t.config.get("heading.options").map((t=>{const e=n[t.title];return e&&e!=t.title&&(t.title=e),t}))}(t),o=e("Choose heading"),i=e("Heading");t.ui.componentFactory.add("heading",(e=>{const r={},s=new Yi,a=t.commands.get("heading"),c=t.commands.get("paragraph"),l=[a];for(const t of n){const e={type:"button",model:new yf({label:t.title,class:t.class,role:"menuitemradio",withText:!0})};"paragraph"===t.model?(e.model.bind("isOn").to(c,"value"),e.model.set("commandName","paragraph"),l.push(c)):(e.model.bind("isOn").to(a,"value",(e=>e===t.model)),e.model.set({commandName:"heading",commandValue:t.model})),s.add(e),r[t.model]=t.title}const d=Om(e);return Rm(d,s,{ariaLabel:i,role:"menu"}),d.buttonView.set({ariaLabel:i,ariaLabelledBy:void 0,isOn:!1,withText:!0,tooltip:i}),d.extendTemplate({attributes:{class:["ck-heading-dropdown"]}}),d.bind("isEnabled").toMany(l,"isEnabled",((...t)=>t.some((t=>t)))),d.buttonView.bind("label").to(a,"value",c,"value",((t,e)=>{const n=e?"paragraph":t;return"boolean"==typeof n?o:r[n]?r[n]:o})),d.buttonView.bind("ariaLabel").to(a,"value",c,"value",((t,e)=>{const n=e?"paragraph":t;return"boolean"==typeof n?i:r[n]?`${r[n]}, ${i}`:i})),this.listenTo(d,"execute",(e=>{const{commandName:n,commandValue:o}=e.source;t.execute(n,o?{value:o}:void 0),t.editing.view.focus()})),d})),t.ui.componentFactory.add("menuBar:heading",(o=>{const i=new Hk(o),r=t.commands.get("heading"),s=t.commands.get("paragraph"),a=[r],c=new Uk(o);i.set({class:"ck-heading-dropdown"}),c.set({ariaLabel:e("Heading"),role:"menu"}),i.buttonView.set({label:e("Heading")}),i.panelView.children.add(c);for(const e of n){const n=new mk(o,i),l=new Wk(o);n.children.add(l),c.items.add(n),l.set({label:e.title,role:"menuitemradio",class:e.class}),l.bind("ariaChecked").to(l,"isOn"),l.delegate("execute").to(i),l.on("execute",(()=>{const n="paragraph"===e.model?"paragraph":"heading";t.execute(n,{value:e.model}),t.editing.view.focus()})),"paragraph"===e.model?(l.bind("isOn").to(s,"value"),a.push(s)):l.bind("isOn").to(r,"value",(t=>t===e.model))}return i.bind("isEnabled").toMany(a,"isEnabled",((...t)=>t.some((t=>t)))),i}))}}function $C(t){return t.createContainerElement("figure",{class:"image"},[t.createEmptyElement("img"),t.createSlot("children")])}function YC(t,e){const n=t.plugins.get("ImageUtils"),o=t.plugins.has("ImageInlineEditing")&&t.plugins.has("ImageBlockEditing");return t=>{if(!n.isInlineImageView(t))return null;if(!o)return i(t);return("block"==t.getStyle("display")||t.findAncestor(n.isBlockImageView)?"imageBlock":"imageInline")!==e?null:i(t)};function i(t){const e={name:!0};return t.hasAttribute("src")&&(e.attributes=["src"]),e}}function QC(t,e){const n=Qi(e.getSelectedBlocks());return!n||t.isObject(n)||n.isEmpty&&"listItem"!=n.name?"imageBlock":"imageInline"}function ZC(t){return t&&t.endsWith("px")?parseInt(t):null}function JC(t){const e=ZC(t.getStyle("width")),n=ZC(t.getStyle("height"));return!(!e||!n)}var XC=Object.defineProperty,tv=Object.getOwnPropertySymbols,ev=Object.prototype.hasOwnProperty,nv=Object.prototype.propertyIsEnumerable,ov=(t,e,n)=>e in t?XC(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,iv=(t,e)=>{for(var n in e||(e={}))ev.call(e,n)&&ov(t,n,e[n]);if(tv)for(var n of tv(e))nv.call(e,n)&&ov(t,n,e[n]);return t};const rv=/^(image|image-inline)$/;class sv extends rr{constructor(){super(...arguments),this._domEmitter=new(Bo())}static get pluginName(){return"ImageUtils"}isImage(t){return this.isInlineImage(t)||this.isBlockImage(t)}isInlineImageView(t){return!!t&&t.is("element","img")}isBlockImageView(t){return!!t&&t.is("element","figure")&&t.hasClass("image")}insertImage(t={},e=null,n=null,o={}){const i=this.editor,r=i.model,s=r.document.selection,a=av(i,e||s,n);t=iv(iv({},Object.fromEntries(s.getAttributes())),t);for(const e in t)r.schema.checkAttribute(a,e)||delete t[e];return r.change((n=>{const{setImageSizes:i=!0}=o,s=n.createElement(a,t);return r.insertObject(s,e,null,{setSelection:"on",findOptimalPosition:e||"imageInline"==a?void 0:"auto"}),s.parent?(i&&this.setImageNaturalSizeAttributes(s),s):null}))}setImageNaturalSizeAttributes(t){const e=t.getAttribute("src");e&&(t.getAttribute("width")||t.getAttribute("height")||this.editor.model.change((n=>{const o=new Lo.window.Image;this._domEmitter.listenTo(o,"load",(()=>{t.getAttribute("width")||t.getAttribute("height")||this.editor.model.enqueueChange(n.batch,(e=>{e.setAttribute("width",o.naturalWidth,t),e.setAttribute("height",o.naturalHeight,t)})),this._domEmitter.stopListening(o,"load")})),o.src=e})))}getClosestSelectedImageWidget(t){const e=t.getFirstPosition();if(!e)return null;const n=t.getSelectedElement();if(n&&this.isImageWidget(n))return n;let o=e.parent;for(;o;){if(o.is("element")&&this.isImageWidget(o))return o;o=o.parent}return null}getClosestSelectedImageElement(t){const e=t.getSelectedElement();return this.isImage(e)?e:t.getFirstPosition().findAncestor("imageBlock")}getImageWidgetFromImageView(t){return t.findAncestor({classes:rv})}isImageAllowed(){const t=this.editor.model.document.selection;return function(t,e){const n=av(t,e,null);if("imageBlock"==n){const n=function(t,e){const n=Jw(t,e),o=n.start.parent;if(o.isEmpty&&!o.is("element","$root"))return o.parent;return o}(e,t.model);if(t.model.schema.checkChild(n,"imageBlock"))return!0}else if(t.model.schema.checkChild(e.focus,"imageInline"))return!0;return!1}(this.editor,t)&&function(t){return[...t.focus.getAncestors()].every((t=>!t.is("element","imageBlock")))}(t)}toImageWidget(t,e,n){e.setCustomProperty("image",!0,t);return Kw(t,e,{label:()=>{const e=this.findViewImgElement(t).getAttribute("alt");return e?`${e} ${n}`:n}})}isImageWidget(t){return!!t.getCustomProperty("image")&&Ww(t)}isBlockImage(t){return!!t&&t.is("element","imageBlock")}isInlineImage(t){return!!t&&t.is("element","imageInline")}findViewImgElement(t){if(this.isInlineImageView(t))return t;const e=this.editor.editing.view;for(const{item:n}of e.createRangeIn(t))if(this.isInlineImageView(n))return n}destroy(){return this._domEmitter.stopListening(),super.destroy()}}function av(t,e,n){const o=t.model.schema,i=t.config.get("image.insert.type");return t.plugins.has("ImageBlockEditing")?t.plugins.has("ImageInlineEditing")?n||("inline"===i?"imageInline":"auto"!==i?"imageBlock":e.is("selection")?QC(o,e):o.checkChild(e,"imageInline")?"imageInline":"imageBlock"):"imageBlock":"imageInline"}Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;new RegExp(String(/^(http(s)?:\/\/)?[\w-]+\.[\w.~:/[\]@!$&'()*+,;=%-]+/.source+/\.(jpg|jpeg|png|gif|ico|webp|JPG|JPEG|PNG|GIF|ICO|WEBP)/.source+/(\?[\w.~:/[\]@!$&'()*+,;=%-]*)?/.source+/(#[\w.~:/[\]@!$&'()*+,;=%-]*)?$/.source));class cv extends ar{refresh(){const t=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!t,this.isEnabled&&t.hasAttribute("alt")?this.value=t.getAttribute("alt"):this.value=!1}execute(t){const e=this.editor,n=e.plugins.get("ImageUtils"),o=e.model,i=n.getClosestSelectedImageElement(o.document.selection);o.change((e=>{e.setAttribute("alt",t.newValue,i)}))}}class lv extends rr{static get requires(){return[sv]}static get pluginName(){return"ImageTextAlternativeEditing"}init(){this.editor.commands.add("imageTextAlternative",new cv(this.editor))}}var dv=n(4062),uv={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(dv.A,uv);dv.A.locals;var hv=n(2722),gv={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(hv.A,gv);hv.A.locals;class mv extends dg{constructor(t){super(t);const e=this.locale.t;this.focusTracker=new Zi,this.keystrokes=new Ji,this.labeledInput=this._createLabeledInputView(),this.saveButtonView=this._createButton(e("Save"),jh.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(e("Cancel"),jh.cancel,"ck-button-cancel","cancel"),this._focusables=new Fh,this._focusCycler=new nm({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"form",attributes:{class:["ck","ck-text-alternative-form","ck-responsive-form"],tabindex:"-1"},children:[this.labeledInput,this.saveButtonView,this.cancelButtonView]})}render(){super.render(),this.keystrokes.listenTo(this.element),i({view:this}),[this.labeledInput,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)}))}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}_createButton(t,e,n,o){const i=new Ig(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}_createLabeledInputView(){const t=this.locale.t,e=new Hg(this.locale,Hm);return e.label=t("Text alternative"),e}}function pv(t){const e=t.editing.view,n=Np.defaultPositions,o=t.plugins.get("ImageUtils");return{target:e.domConverter.mapViewToDom(o.getClosestSelectedImageWidget(e.document.selection)),positions:[n.northArrowSouth,n.northArrowSouthWest,n.northArrowSouthEast,n.southArrowNorth,n.southArrowNorthWest,n.southArrowNorthEast,n.viewportStickyNorth]}}class fv extends rr{static get requires(){return[Tf]}static get pluginName(){return"ImageTextAlternativeUI"}init(){this._createButton()}destroy(){super.destroy(),this._form&&this._form.destroy()}_createButton(){const t=this.editor,e=t.t;t.ui.componentFactory.add("imageTextAlternative",(n=>{const o=t.commands.get("imageTextAlternative"),i=new Ig(n);return i.set({label:e("Change image text alternative"),icon:jh.textAlternative,tooltip:!0}),i.bind("isEnabled").to(o,"isEnabled"),i.bind("isOn").to(o,"value",(t=>!!t)),this.listenTo(i,"execute",(()=>{this._showForm()})),i}))}_createForm(){const n=this.editor,o=n.editing.view.document,i=n.plugins.get("ImageUtils");this._balloon=this.editor.plugins.get("ContextualBalloon"),this._form=new(e(mv))(n.locale),this._form.render(),this.listenTo(this._form,"submit",(()=>{n.execute("imageTextAlternative",{newValue:this._form.labeledInput.fieldView.element.value}),this._hideForm(!0)})),this.listenTo(this._form,"cancel",(()=>{this._hideForm(!0)})),this._form.keystrokes.set("Esc",((t,e)=>{this._hideForm(!0),e()})),this.listenTo(n.ui,"update",(()=>{i.getClosestSelectedImageWidget(o.selection)?this._isVisible&&function(t){const e=t.plugins.get("ContextualBalloon");if(t.plugins.get("ImageUtils").getClosestSelectedImageWidget(t.editing.view.document.selection)){const n=pv(t);e.updatePosition(n)}}(n):this._hideForm(!0)})),t({emitter:this._form,activator:()=>this._isVisible,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideForm()})}_showForm(){if(this._isVisible)return;this._form||this._createForm();const t=this.editor,e=t.commands.get("imageTextAlternative"),n=this._form.labeledInput;this._form.disableCssTransitions(),this._isInBalloon||this._balloon.add({view:this._form,position:pv(t)}),n.fieldView.value=n.fieldView.element.value=e.value||"",this._form.labeledInput.fieldView.select(),this._form.enableCssTransitions()}_hideForm(t=!1){this._isInBalloon&&(this._form.focusTracker.isFocused&&this._form.saveButtonView.focus(),this._balloon.remove(this._form),t&&this.editor.editing.view.focus())}get _isVisible(){return!!this._balloon&&this._balloon.visibleView===this._form}get _isInBalloon(){return!!this._balloon&&this._balloon.hasView(this._form)}}class kv extends rr{static get requires(){return[lv,fv]}static get pluginName(){return"ImageTextAlternative"}}function bv(t,e){const n=(e,n,o)=>{if(!o.consumable.consume(n.item,e.name))return;const i=o.writer,r=o.mapper.toViewElement(n.item),s=t.findViewImgElement(r);null===n.attributeNewValue?(i.removeAttribute("srcset",s),i.removeAttribute("sizes",s)):n.attributeNewValue&&(i.setAttribute("srcset",n.attributeNewValue,s),i.setAttribute("sizes","100vw",s))};return t=>{t.on(`attribute:srcset:${e}`,n)}}function wv(t,e,n){const o=(e,n,o)=>{if(!o.consumable.consume(n.item,e.name))return;const i=o.writer,r=o.mapper.toViewElement(n.item),s=t.findViewImgElement(r);i.setAttribute(n.attributeKey,n.attributeNewValue||"",s)};return t=>{t.on(`attribute:${n}:${e}`,o)}}class Av extends Sa{observe(t){this.listenTo(t,"load",((t,e)=>{const n=e.target;this.checkShouldIgnoreEventFromTarget(n)||"IMG"==n.tagName&&this._fireEvents(e)}),{useCapture:!0})}stopObserving(t){this.stopListening(t)}_fireEvents(t){this.isEnabled&&(this.document.fire("layoutChanged"),this.document.fire("imageLoaded",t))}}var _v=Object.defineProperty,Cv=Object.getOwnPropertySymbols,vv=Object.prototype.hasOwnProperty,yv=Object.prototype.propertyIsEnumerable,xv=(t,e,n)=>e in t?_v(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Ev=(t,e)=>{for(var n in e||(e={}))vv.call(e,n)&&xv(t,n,e[n]);if(Cv)for(var n of Cv(e))yv.call(e,n)&&xv(t,n,e[n]);return t};class Dv extends ar{constructor(t){super(t);const e=t.config.get("image.insert.type");t.plugins.has("ImageBlockEditing")||"block"===e&&C("image-block-plugin-required"),t.plugins.has("ImageInlineEditing")||"inline"===e&&C("image-inline-plugin-required")}refresh(){const t=this.editor.plugins.get("ImageUtils");this.isEnabled=t.isImageAllowed()}execute(t){const e=yi(t.source),n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageUtils"),i=Object.fromEntries(n.getAttributes());e.forEach(((t,e)=>{const r=n.getSelectedElement();if("string"==typeof t&&(t={src:t}),e&&r&&o.isImage(r)){const e=this.editor.model.createPositionAfter(r);o.insertImage(Ev(Ev({},t),i),e)}else o.insertImage(Ev(Ev({},t),i))}))}}class Iv extends ar{constructor(t){super(t),this.decorate("cleanupImage")}refresh(){const t=this.editor.plugins.get("ImageUtils"),e=this.editor.model.document.selection.getSelectedElement();this.isEnabled=t.isImage(e),this.value=this.isEnabled?e.getAttribute("src"):null}execute(t){const e=this.editor.model.document.selection.getSelectedElement(),n=this.editor.plugins.get("ImageUtils");this.editor.model.change((o=>{o.setAttribute("src",t.source,e),this.cleanupImage(o,e),n.setImageNaturalSizeAttributes(e)}))}cleanupImage(t,e){t.removeAttribute("srcset",e),t.removeAttribute("sizes",e),t.removeAttribute("sources",e),t.removeAttribute("width",e),t.removeAttribute("height",e),t.removeAttribute("alt",e)}}class Mv extends rr{static get requires(){return[sv]}static get pluginName(){return"ImageEditing"}init(){const t=this.editor,e=t.conversion;t.editing.view.addObserver(Av),e.for("upcast").attributeToAttribute({view:{name:"img",key:"alt"},model:"alt"}).attributeToAttribute({view:{name:"img",key:"srcset"},model:"srcset"});const n=new Dv(t),o=new Iv(t);t.commands.add("insertImage",n),t.commands.add("replaceImageSource",o),t.commands.add("imageInsert",n)}}class Tv extends rr{static get requires(){return[sv]}static get pluginName(){return"ImageSizeAttributes"}afterInit(){this._registerSchema(),this._registerConverters("imageBlock"),this._registerConverters("imageInline")}_registerSchema(){this.editor.plugins.has("ImageBlockEditing")&&this.editor.model.schema.extend("imageBlock",{allowAttributes:["width","height"]}),this.editor.plugins.has("ImageInlineEditing")&&this.editor.model.schema.extend("imageInline",{allowAttributes:["width","height"]})}_registerConverters(t){const e=this.editor,n=e.plugins.get("ImageUtils"),o="imageBlock"===t?"figure":"img";function i(e,o,i,r){e.on(`attribute:${o}:${t}`,((e,o,s)=>{if(!s.consumable.consume(o.item,e.name))return;const a=s.writer,c=s.mapper.toViewElement(o.item),l=n.findViewImgElement(c);if(null!==o.attributeNewValue?a.setAttribute(i,o.attributeNewValue,l):a.removeAttribute(i,l),o.item.hasAttribute("sources"))return;const d=o.item.hasAttribute("resizedWidth");if("imageInline"===t&&!d&&!r)return;const u=o.item.getAttribute("width"),h=o.item.getAttribute("height");u&&h&&a.setStyle("aspect-ratio",`${u}/${h}`,l)}))}e.conversion.for("upcast").attributeToAttribute({view:{name:o,styles:{width:/.+/}},model:{key:"width",value:t=>JC(t)?ZC(t.getStyle("width")):null}}).attributeToAttribute({view:{name:o,key:"width"},model:"width"}).attributeToAttribute({view:{name:o,styles:{height:/.+/}},model:{key:"height",value:t=>JC(t)?ZC(t.getStyle("height")):null}}).attributeToAttribute({view:{name:o,key:"height"},model:"height"}),e.conversion.for("editingDowncast").add((t=>{i(t,"width","width",!0),i(t,"height","height",!0)})),e.conversion.for("dataDowncast").add((t=>{i(t,"width","width",!1),i(t,"height","height",!1)}))}}class Sv extends ar{constructor(t,e){super(t),this._modelElementName=e}refresh(){const t=this.editor.plugins.get("ImageUtils"),e=t.getClosestSelectedImageElement(this.editor.model.document.selection);"imageBlock"===this._modelElementName?this.isEnabled=t.isInlineImage(e):this.isEnabled=t.isBlockImage(e)}execute(t={}){const e=this.editor,n=this.editor.model,o=e.plugins.get("ImageUtils"),i=o.getClosestSelectedImageElement(n.document.selection),r=Object.fromEntries(i.getAttributes());return r.src||r.uploadId?n.change((e=>{const{setImageSizes:s=!0}=t,a=Array.from(n.markers).filter((t=>t.getRange().containsItem(i))),c=o.insertImage(r,n.createSelection(i,"on"),this._modelElementName,{setImageSizes:s});if(!c)return null;const l=e.createRangeOn(c);for(const t of a){const n=t.getRange(),o="$graveyard"!=n.root.rootName?n.getJoined(l,!0):l;e.updateMarker(t,{range:o})}return{oldElement:i,newElement:c}})):null}}var Bv=n(7378),Nv={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Bv.A,Nv);Bv.A.locals;class Pv extends rr{static get requires(){return[sv]}static get pluginName(){return"ImagePlaceholder"}afterInit(){this._setupSchema(),this._setupConversion(),this._setupLoadListener()}_setupSchema(){const t=this.editor.model.schema;t.isRegistered("imageBlock")&&t.extend("imageBlock",{allowAttributes:["placeholder"]}),t.isRegistered("imageInline")&&t.extend("imageInline",{allowAttributes:["placeholder"]})}_setupConversion(){const t=this.editor,e=t.conversion,n=t.plugins.get("ImageUtils");e.for("editingDowncast").add((t=>{t.on("attribute:placeholder",((t,e,o)=>{if(!o.consumable.test(e.item,t.name))return;if(!e.item.is("element","imageBlock")&&!e.item.is("element","imageInline"))return;o.consumable.consume(e.item,t.name);const i=o.writer,r=o.mapper.toViewElement(e.item),s=n.findViewImgElement(r);e.attributeNewValue?(i.addClass("image_placeholder",s),i.setStyle("background-image",`url(${e.attributeNewValue})`,s),i.setCustomProperty("editingPipeline:doNotReuseOnce",!0,s)):(i.removeClass("image_placeholder",s),i.removeStyle("background-image",s))}))}))}_setupLoadListener(){const t=this.editor,e=t.model,n=t.editing,o=n.view,i=t.plugins.get("ImageUtils");o.addObserver(Av),this.listenTo(o.document,"imageLoaded",((t,r)=>{const s=o.domConverter.mapDomToView(r.target);if(!s)return;const a=i.getImageWidgetFromImageView(s);if(!a)return;const c=n.mapper.toModelElement(a);c&&c.hasAttribute("placeholder")&&e.enqueueChange({isUndoable:!1},(t=>{t.removeAttribute("placeholder",c)}))}))}}class Ov extends rr{static get requires(){return[Mv,Tv,sv,Pv,Yb]}static get pluginName(){return"ImageBlockEditing"}init(){const t=this.editor;t.model.schema.register("imageBlock",{inheritAllFrom:"$blockObject",allowAttributes:["alt","src","srcset"]}),this._setupConversion(),t.plugins.has("ImageInlineEditing")&&(t.commands.add("imageTypeBlock",new Sv(this.editor,"imageBlock")),this._setupClipboardIntegration())}_setupConversion(){const t=this.editor,e=t.t,n=t.conversion,o=t.plugins.get("ImageUtils");n.for("dataDowncast").elementToStructure({model:"imageBlock",view:(t,{writer:e})=>$C(e)}),n.for("editingDowncast").elementToStructure({model:"imageBlock",view:(t,{writer:n})=>o.toImageWidget($C(n),n,e("image widget"))}),n.for("downcast").add(wv(o,"imageBlock","src")).add(wv(o,"imageBlock","alt")).add(bv(o,"imageBlock")),n.for("upcast").elementToElement({view:YC(t,"imageBlock"),model:(t,{writer:e})=>e.createElement("imageBlock",t.hasAttribute("src")?{src:t.getAttribute("src")}:void 0)}).add(function(t){const e=(e,n,o)=>{if(!o.consumable.test(n.viewItem,{name:!0,classes:"image"}))return;const i=t.findViewImgElement(n.viewItem);if(!i||!o.consumable.test(i,{name:!0}))return;o.consumable.consume(n.viewItem,{name:!0,classes:"image"});const r=Qi(o.convertItem(i,n.modelCursor).modelRange.getItems());r?(o.convertChildren(n.viewItem,r),o.updateConversionResult(r,n)):o.consumable.revert(n.viewItem,{name:!0,classes:"image"})};return t=>{t.on("element:figure",e)}}(o))}_setupClipboardIntegration(){const t=this.editor,e=t.model,n=t.editing.view,o=t.plugins.get("ImageUtils"),i=t.plugins.get("ClipboardPipeline");this.listenTo(i,"inputTransformation",((i,r)=>{const s=Array.from(r.content.getChildren());let a;if(!s.every(o.isInlineImageView))return;a=r.targetRanges?t.editing.mapper.toModelRange(r.targetRanges[0]):e.document.selection.getFirstRange();const c=e.createSelection(a);if("imageBlock"===QC(e.schema,c)){const t=new Ch(n.document),e=s.map((e=>t.createElement("figure",{class:"image"},e)));r.content=t.createDocumentFragment(e)}})),this.listenTo(i,"contentInsertion",((t,n)=>{"paste"===n.method&&e.change((t=>{const e=t.createRangeIn(n.content);for(const t of e.getItems())t.is("element","imageBlock")&&o.setImageNaturalSizeAttributes(t)}))}))}}var Lv=n(3350),zv={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Lv.A,zv);Lv.A.locals;class Rv extends dg{constructor(t,e=[]){super(t),this.focusTracker=new Zi,this.keystrokes=new Ji,this._focusables=new Fh,this.children=this.createCollection(),this._focusCycler=new nm({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});for(const t of e)this.children.add(t),this._focusables.add(t),t instanceof zg&&this._focusables.addMany(t.children);if(this._focusables.length>1)for(const t of this._focusables)jv(t)&&(t.focusCycler.on("forwardCycle",(t=>{this._focusCycler.focusNext(),t.stop()})),t.focusCycler.on("backwardCycle",(t=>{this._focusCycler.focusPrevious(),t.stop()})));this.setTemplate({tag:"form",attributes:{class:["ck","ck-image-insert-form"],tabindex:-1},children:this.children})}render(){super.render(),i({view:this});for(const t of this._focusables)this.focusTracker.add(t.element);this.keystrokes.listenTo(this.element);const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}}function jv(t){return"focusCycler"in t}class Fv extends rr{constructor(t){super(t),this._integrations=new Map,t.config.define("image.insert.integrations",["upload","assetManager","url"])}static get pluginName(){return"ImageInsertUI"}static get requires(){return[sv]}init(){const t=this.editor,e=t.model.document.selection,n=t.plugins.get("ImageUtils");this.set("isImageSelected",!1),this.listenTo(t.model.document,"change",(()=>{this.isImageSelected=n.isImage(e.getSelectedElement())}));const o=t=>this._createToolbarComponent(t);t.ui.componentFactory.add("insertImage",o),t.ui.componentFactory.add("imageInsert",o)}registerIntegration({name:t,observable:e,buttonViewCreator:n,formViewCreator:o,requiresForm:i}){this._integrations.has(t)&&C("image-insert-integration-exists",{name:t}),this._integrations.set(t,{observable:e,buttonViewCreator:n,formViewCreator:o,requiresForm:!!i})}_createToolbarComponent(t){const e=this.editor,n=t.t,o=this._prepareIntegrations();if(!o.length)return null;let i;const r=o[0];if(1==o.length){if(!r.requiresForm)return r.buttonViewCreator(!0);i=r.buttonViewCreator(!0)}else{const e=r.buttonViewCreator(!1);i=new Tm(t,e),i.tooltip=!0,i.bind("label").to(this,"isImageSelected",(t=>n(t?"Replace image":"Insert image")))}const s=this.dropdownView=Om(t,i),a=o.map((({observable:t})=>"function"==typeof t?t():t));return s.bind("isEnabled").toMany(a,"isEnabled",((...t)=>t.some((t=>t)))),s.once("change:isOpen",(()=>{const t=o.map((({formViewCreator:t})=>t(1==o.length))),n=new Rv(e.locale,t);s.panelView.children.add(n)})),s}_prepareIntegrations(){const t=this.editor.config.get("image.insert.integrations"),e=[];if(!t.length)return C("image-insert-integrations-not-specified"),e;for(const n of t)this._integrations.has(n)?e.push(this._integrations.get(n)):["upload","assetManager","url"].includes(n)||C("image-insert-unknown-integration",{item:n});return e.length||C("image-insert-integrations-not-registered"),e}}var Vv=n(265),Hv={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Vv.A,Hv);Vv.A.locals;class Uv extends rr{static get requires(){return[Ov,mA,kv,Fv]}static get pluginName(){return"ImageBlock"}}class qv extends rr{static get requires(){return[Mv,Tv,sv,Pv,Yb]}static get pluginName(){return"ImageInlineEditing"}init(){const t=this.editor,e=t.model.schema;e.register("imageInline",{inheritAllFrom:"$inlineObject",allowAttributes:["alt","src","srcset"]}),e.addChildCheck(((t,e)=>{if(t.endsWith("caption")&&"imageInline"===e.name)return!1})),this._setupConversion(),t.plugins.has("ImageBlockEditing")&&(t.commands.add("imageTypeInline",new Sv(this.editor,"imageInline")),this._setupClipboardIntegration())}_setupConversion(){const t=this.editor,e=t.t,n=t.conversion,o=t.plugins.get("ImageUtils");n.for("dataDowncast").elementToElement({model:"imageInline",view:(t,{writer:e})=>e.createEmptyElement("img")}),n.for("editingDowncast").elementToStructure({model:"imageInline",view:(t,{writer:n})=>o.toImageWidget(function(t){return t.createContainerElement("span",{class:"image-inline"},t.createEmptyElement("img"))}(n),n,e("image widget"))}),n.for("downcast").add(wv(o,"imageInline","src")).add(wv(o,"imageInline","alt")).add(bv(o,"imageInline")),n.for("upcast").elementToElement({view:YC(t,"imageInline"),model:(t,{writer:e})=>e.createElement("imageInline",t.hasAttribute("src")?{src:t.getAttribute("src")}:void 0)})}_setupClipboardIntegration(){const t=this.editor,e=t.model,n=t.editing.view,o=t.plugins.get("ImageUtils"),i=t.plugins.get("ClipboardPipeline");this.listenTo(i,"inputTransformation",((i,r)=>{const s=Array.from(r.content.getChildren());let a;if(!s.every(o.isBlockImageView))return;a=r.targetRanges?t.editing.mapper.toModelRange(r.targetRanges[0]):e.document.selection.getFirstRange();const c=e.createSelection(a);if("imageInline"===QC(e.schema,c)){const t=new Ch(n.document),e=s.map((e=>1===e.childCount?(Array.from(e.getAttributes()).forEach((n=>t.setAttribute(...n,o.findViewImgElement(e)))),e.getChild(0)):e));r.content=t.createDocumentFragment(e)}})),this.listenTo(i,"contentInsertion",((t,n)=>{"paste"===n.method&&e.change((t=>{const e=t.createRangeIn(n.content);for(const t of e.getItems())t.is("element","imageInline")&&o.setImageNaturalSizeAttributes(t)}))}))}}class Gv extends rr{static get requires(){return[qv,mA,kv,Fv]}static get pluginName(){return"ImageInline"}}class Wv extends rr{static get pluginName(){return"ImageCaptionUtils"}static get requires(){return[sv]}getCaptionFromImageModelElement(t){for(const e of t.getChildren())if(e&&e.is("element","caption"))return e;return null}getCaptionFromModelSelection(t){const e=this.editor.plugins.get("ImageUtils"),n=t.getFirstPosition().findAncestor("caption");return n&&e.isBlockImage(n.parent)?n:null}matchImageCaptionViewElement(t){const e=this.editor.plugins.get("ImageUtils");return"figcaption"==t.name&&e.isBlockImageView(t.parent)?{name:!0}:null}}class Kv extends ar{refresh(){const t=this.editor,e=t.plugins.get("ImageCaptionUtils"),n=t.plugins.get("ImageUtils");if(!t.plugins.has(Ov))return this.isEnabled=!1,void(this.value=!1);const o=t.model.document.selection,i=o.getSelectedElement();if(!i){const t=e.getCaptionFromModelSelection(o);return this.isEnabled=!!t,void(this.value=!!t)}this.isEnabled=n.isImage(i),this.isEnabled?this.value=!!e.getCaptionFromImageModelElement(i):this.value=!1}execute(t={}){const{focusCaptionOnShow:e}=t;this.editor.model.change((t=>{this.value?this._hideImageCaption(t):this._showImageCaption(t,e)}))}_showImageCaption(t,e){const n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageCaptionEditing"),i=this.editor.plugins.get("ImageUtils");let r=n.getSelectedElement();const s=o._getSavedCaption(r);i.isInlineImage(r)&&(this.editor.execute("imageTypeBlock"),r=n.getSelectedElement());const a=s||t.createElement("caption");t.append(a,r),e&&t.setSelection(a,"in")}_hideImageCaption(t){const e=this.editor,n=e.model.document.selection,o=e.plugins.get("ImageCaptionEditing"),i=e.plugins.get("ImageCaptionUtils");let r,s=n.getSelectedElement();s?r=i.getCaptionFromImageModelElement(s):(r=i.getCaptionFromModelSelection(n),s=r.parent),o._saveCaption(s,r),t.setSelection(s,"on"),t.remove(r)}}class $v extends rr{constructor(t){super(t),this._savedCaptionsMap=new WeakMap}static get requires(){return[sv,Wv]}static get pluginName(){return"ImageCaptionEditing"}init(){const t=this.editor,e=t.model.schema;e.isRegistered("caption")?e.extend("caption",{allowIn:"imageBlock"}):e.register("caption",{allowIn:"imageBlock",allowContentOf:"$block",isLimit:!0}),t.commands.add("toggleImageCaption",new Kv(this.editor)),this._setupConversion(),this._setupImageTypeCommandsIntegration(),this._registerCaptionReconversion()}_setupConversion(){const t=this.editor,e=t.editing.view,n=t.plugins.get("ImageUtils"),o=t.plugins.get("ImageCaptionUtils"),i=t.t;t.conversion.for("upcast").elementToElement({view:t=>o.matchImageCaptionViewElement(t),model:"caption"}),t.conversion.for("dataDowncast").elementToElement({model:"caption",view:(t,{writer:e})=>n.isBlockImage(t.parent)?e.createContainerElement("figcaption"):null}),t.conversion.for("editingDowncast").elementToElement({model:"caption",view:(t,{writer:o})=>{if(!n.isBlockImage(t.parent))return null;const r=o.createEditableElement("figcaption");o.setCustomProperty("imageCaption",!0,r),r.placeholder=i("Enter image caption"),vr({view:e,element:r,keepOnFocus:!0});const s=t.parent.getAttribute("alt");return Zw(r,o,{label:s?i("Caption for image: %0",[s]):i("Caption for the image")})}})}_setupImageTypeCommandsIntegration(){const t=this.editor,e=t.plugins.get("ImageUtils"),n=t.plugins.get("ImageCaptionUtils"),o=t.commands.get("imageTypeInline"),i=t.commands.get("imageTypeBlock"),r=t=>{if(!t.return)return;const{oldElement:o,newElement:i}=t.return;if(!o)return;if(e.isBlockImage(o)){const t=n.getCaptionFromImageModelElement(o);if(t)return void this._saveCaption(i,t)}const r=this._getSavedCaption(o);r&&this._saveCaption(i,r)};o&&this.listenTo(o,"execute",r,{priority:"low"}),i&&this.listenTo(i,"execute",r,{priority:"low"})}_getSavedCaption(t){const e=this._savedCaptionsMap.get(t);return e?Pc.fromJSON(e):null}_saveCaption(t,e){this._savedCaptionsMap.set(t,e.toJSON())}_registerCaptionReconversion(){const t=this.editor,e=t.model,n=t.plugins.get("ImageUtils"),o=t.plugins.get("ImageCaptionUtils");e.document.on("change:data",(()=>{const i=e.document.differ.getChanges();for(const e of i){if("alt"!==e.attributeKey)continue;const i=e.range.start.nodeAfter;if(n.isBlockImage(i)){const e=o.getCaptionFromImageModelElement(i);if(!e)return;t.editing.reconvertItem(e)}}}))}}class Yv extends rr{static get requires(){return[Wv]}static get pluginName(){return"ImageCaptionUI"}init(){const t=this.editor,e=t.editing.view,n=t.plugins.get("ImageCaptionUtils"),o=t.t;t.ui.componentFactory.add("toggleImageCaption",(i=>{const r=t.commands.get("toggleImageCaption"),s=new Ig(i);return s.set({icon:jh.caption,tooltip:!0,isToggleable:!0}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),s.bind("label").to(r,"value",(t=>o(t?"Toggle caption off":"Toggle caption on"))),this.listenTo(s,"execute",(()=>{t.execute("toggleImageCaption",{focusCaptionOnShow:!0});const o=n.getCaptionFromModelSelection(t.model.document.selection);if(o){const n=t.editing.mapper.toViewElement(o);e.scrollToTheSelection(),e.change((t=>{t.addClass("image__caption_highlighted",n)}))}t.editing.view.focus()})),s}))}}var Qv=n(5247),Zv={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Qv.A,Zv);Qv.A.locals;function Jv(t){const e=t.map((t=>t.replace("+","\\+")));return new RegExp(`^image\\/(${e.join("|")})$`)}function Xv(t){return new Promise(((e,n)=>{const o=t.getAttribute("src");fetch(o).then((t=>t.blob())).then((t=>{const n=ty(t,o),i=n.replace("image/",""),r=new File([t],`image.${i}`,{type:n});e(r)})).catch((t=>t&&"TypeError"===t.name?function(t){return function(t){return new Promise(((e,n)=>{const o=Lo.document.createElement("img");o.addEventListener("load",(()=>{const t=Lo.document.createElement("canvas");t.width=o.width,t.height=o.height;t.getContext("2d").drawImage(o,0,0),t.toBlob((t=>t?e(t):n()))})),o.addEventListener("error",(()=>n())),o.src=t}))}(t).then((e=>{const n=ty(e,t),o=n.replace("image/","");return new File([e],`image.${o}`,{type:n})}))}(o).then(e).catch(n):n(t)))}))}function ty(t,e){return t.type?t.type:e.match(/data:(image\/\w+);base64/)?e.match(/data:(image\/\w+);base64/)[1].toLowerCase():"image/jpeg"}class ey extends rr{static get pluginName(){return"ImageUploadUI"}init(){const t=this.editor,e=t.t,n=()=>{const t=this._createButton(Bg);return t.set({label:e("Upload image from computer"),tooltip:!0}),t};if(t.ui.componentFactory.add("uploadImage",n),t.ui.componentFactory.add("imageUpload",n),t.ui.componentFactory.add("menuBar:uploadImage",(()=>{const t=this._createButton(Kk);return t.label=e("Image from computer"),t})),t.plugins.has("ImageInsertUI")){const n=t.plugins.get("ImageInsertUI");n.registerIntegration({name:"upload",observable:()=>t.commands.get("uploadImage"),buttonViewCreator:()=>{const o=t.ui.componentFactory.create("uploadImage");return o.bind("label").to(n,"isImageSelected",(t=>e(t?"Replace image from computer":"Upload image from computer"))),o},formViewCreator:()=>{const o=t.ui.componentFactory.create("uploadImage");return o.withText=!0,o.bind("label").to(n,"isImageSelected",(t=>e(t?"Replace from computer":"Upload from computer"))),o.on("execute",(()=>{n.dropdownView.isOpen=!1})),o}})}}_createButton(t){const e=this.editor,n=e.locale,o=e.commands.get("uploadImage"),i=e.config.get("image.upload.types"),r=Jv(i),s=new t(e.locale),a=n.t;return s.set({acceptedType:i.map((t=>`image/${t}`)).join(","),allowMultipleFiles:!0,label:a("Upload image from computer"),icon:jh.imageUpload}),s.bind("isEnabled").to(o),s.on("done",((t,n)=>{const o=Array.from(n).filter((t=>r.test(t.type)));o.length&&(e.execute("uploadImage",{file:o}),e.editing.view.focus())})),s}}var ny=n(2267),oy={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(ny.A,oy);ny.A.locals;var iy=n(7693),ry={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(iy.A,ry);iy.A.locals;var sy=n(1559),ay={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(sy.A,ay);sy.A.locals;class cy extends rr{constructor(t){super(t),this.uploadStatusChange=(t,e,n)=>{const o=this.editor,i=e.item,r=i.getAttribute("uploadId");if(!n.consumable.consume(e.item,t.name))return;const s=o.plugins.get("ImageUtils"),a=o.plugins.get(u_),c=r?e.attributeNewValue:null,l=this.placeholder,d=o.editing.mapper.toViewElement(i),u=n.writer;if("reading"==c)return ly(d,u),void dy(s,l,d,u);if("uploading"==c){const t=a.loaders.get(r);return ly(d,u),void(t?(uy(d,u),function(t,e,n,o){const i=function(t){const e=t.createUIElement("div",{class:"ck-progress-bar"});return t.setCustomProperty("progressBar",!0,e),e}(e);e.insert(e.createPositionAt(t,"end"),i),n.on("change:uploadedPercent",((t,e,n)=>{o.change((t=>{t.setStyle("width",n+"%",i)}))}))}(d,u,t,o.editing.view),function(t,e,n,o){if(o.data){const i=t.findViewImgElement(e);n.setAttribute("src",o.data,i)}}(s,d,u,t)):dy(s,l,d,u))}"complete"==c&&a.loaders.get(r)&&function(t,e,n){const o=e.createUIElement("div",{class:"ck-image-upload-complete-icon"});e.insert(e.createPositionAt(t,"end"),o),setTimeout((()=>{n.change((t=>t.remove(t.createRangeOn(o))))}),3e3)}(d,u,o.editing.view),function(t,e){gy(t,e,"progressBar")}(d,u),uy(d,u),function(t,e){e.removeClass("ck-appear",t)}(d,u)},this.placeholder="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="}static get pluginName(){return"ImageUploadProgress"}init(){const t=this.editor;t.plugins.has("ImageBlockEditing")&&t.editing.downcastDispatcher.on("attribute:uploadStatus:imageBlock",this.uploadStatusChange),t.plugins.has("ImageInlineEditing")&&t.editing.downcastDispatcher.on("attribute:uploadStatus:imageInline",this.uploadStatusChange)}}function ly(t,e){t.hasClass("ck-appear")||e.addClass("ck-appear",t)}function dy(t,e,n,o){n.hasClass("ck-image-upload-placeholder")||o.addClass("ck-image-upload-placeholder",n);const i=t.findViewImgElement(n);i.getAttribute("src")!==e&&o.setAttribute("src",e,i),hy(n,"placeholder")||o.insert(o.createPositionAfter(i),function(t){const e=t.createUIElement("div",{class:"ck-upload-placeholder-loader"});return t.setCustomProperty("placeholder",!0,e),e}(o))}function uy(t,e){t.hasClass("ck-image-upload-placeholder")&&e.removeClass("ck-image-upload-placeholder",t),gy(t,e,"placeholder")}function hy(t,e){for(const n of t.getChildren())if(n.getCustomProperty(e))return n}function gy(t,e,n){const o=hy(t,n);o&&e.remove(e.createRangeOn(o))}var my=Object.defineProperty,py=Object.defineProperties,fy=Object.getOwnPropertyDescriptors,ky=Object.getOwnPropertySymbols,by=Object.prototype.hasOwnProperty,wy=Object.prototype.propertyIsEnumerable,Ay=(t,e,n)=>e in t?my(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;class _y extends ar{refresh(){const t=this.editor,e=t.plugins.get("ImageUtils"),n=t.model.document.selection.getSelectedElement();this.isEnabled=e.isImageAllowed()||e.isImage(n)}execute(t){const e=yi(t.file),n=this.editor.model.document.selection,o=this.editor.plugins.get("ImageUtils"),i=Object.fromEntries(n.getAttributes());e.forEach(((t,e)=>{const r=n.getSelectedElement();if(e&&r&&o.isImage(r)){const e=this.editor.model.createPositionAfter(r);this._uploadImage(t,i,e)}else this._uploadImage(t,i)}))}_uploadImage(t,e,n){const o=this.editor,i=o.plugins.get(u_).createLoader(t),r=o.plugins.get("ImageUtils");var s,a;i&&r.insertImage((s=((t,e)=>{for(var n in e||(e={}))by.call(e,n)&&Ay(t,n,e[n]);if(ky)for(var n of ky(e))wy.call(e,n)&&Ay(t,n,e[n]);return t})({},e),a={uploadId:i.id},py(s,fy(a))),n)}}class Cy extends rr{constructor(t){super(t),t.config.define("image",{upload:{types:["jpeg","png","gif","bmp","webp","tiff"]}}),this._uploadImageElements=new Map}static get requires(){return[u_,vf,Yb,sv]}static get pluginName(){return"ImageUploadEditing"}init(){const t=this.editor,e=t.model.document,n=t.conversion,o=t.plugins.get(u_),i=t.plugins.get("ImageUtils"),r=t.plugins.get("ClipboardPipeline"),s=Jv(t.config.get("image.upload.types")),a=new _y(t);t.commands.add("uploadImage",a),t.commands.add("imageUpload",a),n.for("upcast").attributeToAttribute({view:{name:"img",key:"uploadId"},model:"uploadId"}),this.listenTo(t.editing.view.document,"clipboardInput",((e,n)=>{if(o=n.dataTransfer,Array.from(o.types).includes("text/html")&&""!==o.getData("text/html"))return;var o;const i=Array.from(n.dataTransfer.files).filter((t=>!!t&&s.test(t.type)));i.length&&(e.stop(),t.model.change((e=>{n.targetRanges&&e.setSelection(n.targetRanges.map((e=>t.editing.mapper.toModelRange(e)))),t.execute("uploadImage",{file:i})})))})),this.listenTo(r,"inputTransformation",((e,n)=>{const r=Array.from(t.editing.view.createRangeIn(n.content)).map((t=>t.item)).filter((t=>function(t,e){return!(!t.isInlineImageView(e)||!e.getAttribute("src")||!e.getAttribute("src").match(/^data:image\/\w+;base64,/g)&&!e.getAttribute("src").match(/^blob:/g))}(i,t)&&!t.getAttribute("uploadProcessed"))).map((t=>({promise:Xv(t),imageElement:t})));if(!r.length)return;const s=new Ch(t.editing.view.document);for(const t of r){s.setAttribute("uploadProcessed",!0,t.imageElement);const e=o.createLoader(t.promise);e&&(s.setAttribute("src","",t.imageElement),s.setAttribute("uploadId",e.id,t.imageElement))}})),t.editing.view.document.on("dragover",((t,e)=>{e.preventDefault()})),e.on("change",(()=>{const n=e.differ.getChanges({includeChangesInGraveyard:!0}).reverse(),i=new Set;for(const e of n)if("insert"==e.type&&"$text"!=e.name){const n=e.position.nodeAfter,r="$graveyard"==e.position.root.rootName;for(const e of vy(t,n)){const t=e.getAttribute("uploadId");if(!t)continue;const n=o.loaders.get(t);n&&(r?i.has(t)||n.abort():(i.add(t),this._uploadImageElements.set(t,e),"idle"==n.status&&this._readAndUpload(n)))}}})),this.on("uploadComplete",((t,{imageElement:e,data:n})=>{const o=n.urls?n.urls:n;this.editor.model.change((t=>{t.setAttribute("src",o.default,e),this._parseAndSetSrcsetAttributeOnImage(o,e,t),i.setImageNaturalSizeAttributes(e)}))}),{priority:"low"})}afterInit(){const t=this.editor.model.schema;this.editor.plugins.has("ImageBlockEditing")&&t.extend("imageBlock",{allowAttributes:["uploadId","uploadStatus"]}),this.editor.plugins.has("ImageInlineEditing")&&t.extend("imageInline",{allowAttributes:["uploadId","uploadStatus"]})}_readAndUpload(t){const e=this.editor,n=e.model,o=e.locale.t,i=e.plugins.get(u_),r=e.plugins.get(vf),s=e.plugins.get("ImageUtils"),a=this._uploadImageElements;return n.enqueueChange({isUndoable:!1},(e=>{e.setAttribute("uploadStatus","reading",a.get(t.id))})),t.read().then((()=>{const o=t.upload(),i=a.get(t.id);if(c.isSafari){const t=e.editing.mapper.toViewElement(i),n=s.findViewImgElement(t);e.editing.view.once("render",(()=>{if(!n.parent)return;const t=e.editing.view.domConverter.mapViewToDom(n.parent);if(!t)return;const o=t.style.display;t.style.display="none",t._ckHack=t.offsetHeight,t.style.display=o}))}return n.enqueueChange({isUndoable:!1},(t=>{t.setAttribute("uploadStatus","uploading",i)})),o})).then((e=>{n.enqueueChange({isUndoable:!1},(n=>{const o=a.get(t.id);n.setAttribute("uploadStatus","complete",o),this.fire("uploadComplete",{data:e,imageElement:o})})),l()})).catch((e=>{if("error"!==t.status&&"aborted"!==t.status)throw e;"error"==t.status&&e&&r.showWarning(e,{title:o("Upload failed"),namespace:"upload"}),n.enqueueChange({isUndoable:!1},(e=>{e.remove(a.get(t.id))})),l()}));function l(){n.enqueueChange({isUndoable:!1},(e=>{const n=a.get(t.id);e.removeAttribute("uploadId",n),e.removeAttribute("uploadStatus",n),a.delete(t.id)})),i.destroyLoader(t)}}_parseAndSetSrcsetAttributeOnImage(t,e,n){let o=0;const i=Object.keys(t).filter((t=>{const e=parseInt(t,10);if(!isNaN(e))return o=Math.max(o,e),!0})).map((e=>`${t[e]} ${e}w`)).join(", ");if(""!=i){const t={srcset:i};e.hasAttribute("width")||e.hasAttribute("height")||(t.width=o),n.setAttributes(t,e)}}}function vy(t,e){const n=t.plugins.get("ImageUtils");return Array.from(t.model.createRangeOn(e)).filter((t=>n.isImage(t.item))).map((t=>t.item))}var yy=n(3469),xy={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(yy.A,xy);yy.A.locals;class Ey extends ar{constructor(t,e){super(t),this._defaultStyles={imageBlock:!1,imageInline:!1},this._styles=new Map(e.map((t=>{if(t.isDefault)for(const e of t.modelElements)this._defaultStyles[e]=t.name;return[t.name,t]})))}refresh(){const t=this.editor.plugins.get("ImageUtils").getClosestSelectedImageElement(this.editor.model.document.selection);this.isEnabled=!!t,this.isEnabled?t.hasAttribute("imageStyle")?this.value=t.getAttribute("imageStyle"):this.value=this._defaultStyles[t.name]:this.value=!1}execute(t={}){const e=this.editor,n=e.model,o=e.plugins.get("ImageUtils");n.change((e=>{const i=t.value,{setImageSizes:r=!0}=t;let s=o.getClosestSelectedImageElement(n.document.selection);i&&this.shouldConvertImageType(i,s)&&(this.editor.execute(o.isBlockImage(s)?"imageTypeInline":"imageTypeBlock",{setImageSizes:r}),s=o.getClosestSelectedImageElement(n.document.selection)),!i||this._styles.get(i).isDefault?e.removeAttribute("imageStyle",s):e.setAttribute("imageStyle",i,s),r&&o.setImageNaturalSizeAttributes(s)}))}shouldConvertImageType(t,e){return!this._styles.get(t).modelElements.includes(e.name)}}var Dy=Object.defineProperty,Iy=Object.getOwnPropertySymbols,My=Object.prototype.hasOwnProperty,Ty=Object.prototype.propertyIsEnumerable,Sy=(t,e,n)=>e in t?Dy(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,By=(t,e)=>{for(var n in e||(e={}))My.call(e,n)&&Sy(t,n,e[n]);if(Iy)for(var n of Iy(e))Ty.call(e,n)&&Sy(t,n,e[n]);return t};const{objectFullWidth:Ny,objectInline:Py,objectLeft:Oy,objectRight:Ly,objectCenter:zy,objectBlockLeft:Ry,objectBlockRight:jy}=jh,Fy={get inline(){return{name:"inline",title:"In line",icon:Py,modelElements:["imageInline"],isDefault:!0}},get alignLeft(){return{name:"alignLeft",title:"Left aligned image",icon:Oy,modelElements:["imageBlock","imageInline"],className:"image-style-align-left"}},get alignBlockLeft(){return{name:"alignBlockLeft",title:"Left aligned image",icon:Ry,modelElements:["imageBlock"],className:"image-style-block-align-left"}},get alignCenter(){return{name:"alignCenter",title:"Centered image",icon:zy,modelElements:["imageBlock"],className:"image-style-align-center"}},get alignRight(){return{name:"alignRight",title:"Right aligned image",icon:Ly,modelElements:["imageBlock","imageInline"],className:"image-style-align-right"}},get alignBlockRight(){return{name:"alignBlockRight",title:"Right aligned image",icon:jy,modelElements:["imageBlock"],className:"image-style-block-align-right"}},get block(){return{name:"block",title:"Centered image",icon:zy,modelElements:["imageBlock"],isDefault:!0}},get side(){return{name:"side",title:"Side image",icon:Ly,modelElements:["imageBlock"],className:"image-style-side"}}},Vy={full:Ny,left:Ry,right:jy,center:zy,inlineLeft:Oy,inlineRight:Ly,inline:Py},Hy=[{name:"imageStyle:wrapText",title:"Wrap text",defaultItem:"imageStyle:alignLeft",items:["imageStyle:alignLeft","imageStyle:alignRight"]},{name:"imageStyle:breakText",title:"Break text",defaultItem:"imageStyle:block",items:["imageStyle:alignBlockLeft","imageStyle:block","imageStyle:alignBlockRight"]}];function Uy(t){C("image-style-configuration-definition-invalid",t)}const qy={normalizeStyles:function(t){return(t.configuredStyles.options||[]).map((t=>function(t){t="string"==typeof t?Fy[t]?By({},Fy[t]):{name:t}:function(t,e){const n=By({},e);for(const o in t)Object.prototype.hasOwnProperty.call(e,o)||(n[o]=t[o]);return n}(Fy[t.name],t);"string"==typeof t.icon&&(t.icon=Vy[t.icon]||t.icon);return t}(t))).filter((e=>function(t,{isBlockPluginLoaded:e,isInlinePluginLoaded:n}){const{modelElements:o,name:i}=t;if(!(o&&o.length&&i))return Uy({style:t}),!1;{const i=[e?"imageBlock":null,n?"imageInline":null];if(!o.some((t=>i.includes(t))))return C("image-style-missing-dependency",{style:t,missingPlugins:o.map((t=>"imageBlock"===t?"ImageBlockEditing":"ImageInlineEditing"))}),!1}return!0}(e,t)))},getDefaultStylesConfiguration:function(t,e){return t&&e?{options:["inline","alignLeft","alignRight","alignCenter","alignBlockLeft","alignBlockRight","block","side"]}:t?{options:["block","side"]}:e?{options:["inline","alignLeft","alignRight"]}:{}},getDefaultDropdownDefinitions:function(t){return t.has("ImageBlockEditing")&&t.has("ImageInlineEditing")?[...Hy]:[]},warnInvalidStyle:Uy,DEFAULT_OPTIONS:Fy,DEFAULT_ICONS:Vy,DEFAULT_DROPDOWN_DEFINITIONS:Hy};function Gy(t,e){for(const n of e)if(n.name===t)return n}class Wy extends rr{static get pluginName(){return"ImageStyleEditing"}static get requires(){return[sv]}init(){const{normalizeStyles:t,getDefaultStylesConfiguration:e}=qy,n=this.editor,o=n.plugins.has("ImageBlockEditing"),i=n.plugins.has("ImageInlineEditing");n.config.define("image.styles",e(o,i)),this.normalizedStyles=t({configuredStyles:n.config.get("image.styles"),isBlockPluginLoaded:o,isInlinePluginLoaded:i}),this._setupConversion(o,i),this._setupPostFixer(),n.commands.add("imageStyle",new Ey(n,this.normalizedStyles))}_setupConversion(t,e){const n=this.editor,o=n.model.schema,i=(r=this.normalizedStyles,(t,e,n)=>{if(!n.consumable.consume(e.item,t.name))return;const o=Gy(e.attributeNewValue,r),i=Gy(e.attributeOldValue,r),s=n.mapper.toViewElement(e.item),a=n.writer;i&&a.removeClass(i.className,s),o&&a.addClass(o.className,s)});var r;const s=function(t){const e={imageInline:t.filter((t=>!t.isDefault&&t.modelElements.includes("imageInline"))),imageBlock:t.filter((t=>!t.isDefault&&t.modelElements.includes("imageBlock")))};return(t,n,o)=>{if(!n.modelRange)return;const i=n.viewItem,r=Qi(n.modelRange.getItems());if(r&&o.schema.checkAttribute(r,"imageStyle"))for(const t of e[r.name])o.consumable.consume(i,{classes:t.className})&&o.writer.setAttribute("imageStyle",t.name,r)}}(this.normalizedStyles);n.editing.downcastDispatcher.on("attribute:imageStyle",i),n.data.downcastDispatcher.on("attribute:imageStyle",i),t&&(o.extend("imageBlock",{allowAttributes:"imageStyle"}),n.data.upcastDispatcher.on("element:figure",s,{priority:"low"})),e&&(o.extend("imageInline",{allowAttributes:"imageStyle"}),n.data.upcastDispatcher.on("element:img",s,{priority:"low"}))}_setupPostFixer(){const t=this.editor,e=t.model.document,n=t.plugins.get(sv),o=new Map(this.normalizedStyles.map((t=>[t.name,t])));e.registerPostFixer((t=>{let i=!1;for(const r of e.differ.getChanges())if("insert"==r.type||"attribute"==r.type&&"imageStyle"==r.attributeKey){let e="insert"==r.type?r.position.nodeAfter:r.range.start.nodeAfter;if(e&&e.is("element","paragraph")&&e.childCount>0&&(e=e.getChild(0)),!n.isImage(e))continue;const s=e.getAttribute("imageStyle");if(!s)continue;const a=o.get(s);a&&a.modelElements.includes(e.name)||(t.removeAttribute("imageStyle",e),i=!0)}return i}))}}var Ky=n(6386),$y={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Ky.A,$y);Ky.A.locals;class Yy extends rr{static get requires(){return[Wy]}static get pluginName(){return"ImageStyleUI"}get localizedDefaultStylesTitles(){const t=this.editor.t;return{"Wrap text":t("Wrap text"),"Break text":t("Break text"),"In line":t("In line"),"Full size image":t("Full size image"),"Side image":t("Side image"),"Left aligned image":t("Left aligned image"),"Centered image":t("Centered image"),"Right aligned image":t("Right aligned image")}}init(){const t=this.editor.plugins,e=this.editor.config.get("image.toolbar")||[],n=Qy(t.get("ImageStyleEditing").normalizedStyles,this.localizedDefaultStylesTitles);for(const t of n)this._createButton(t);const o=Qy([...e.filter(F),...qy.getDefaultDropdownDefinitions(t)],this.localizedDefaultStylesTitles);for(const t of o)this._createDropdown(t,n)}_createDropdown(t,e){const n=this.editor.ui.componentFactory;n.add(t.name,(o=>{let i;const{defaultItem:r,items:s,title:a}=t,c=s.filter((t=>e.find((({name:e})=>Zy(e)===t)))).map((t=>{const e=n.create(t);return t===r&&(i=e),e}));s.length!==c.length&&qy.warnInvalidStyle({dropdown:t});const l=Om(o,Tm),d=l.buttonView,u=d.arrowView;return Lm(l,c,{enableActiveItemFocusOnDropdownOpen:!0}),d.set({label:Jy(a,i.label),class:null,tooltip:!0}),u.unbind("label"),u.set({label:a}),d.bind("icon").toMany(c,"isOn",((...t)=>{const e=t.findIndex(Bi);return e<0?i.icon:c[e].icon})),d.bind("label").toMany(c,"isOn",((...t)=>{const e=t.findIndex(Bi);return Jy(a,e<0?i.label:c[e].label)})),d.bind("isOn").toMany(c,"isOn",((...t)=>t.some(Bi))),d.bind("class").toMany(c,"isOn",((...t)=>t.some(Bi)?"ck-splitbutton_flatten":void 0)),d.on("execute",(()=>{c.some((({isOn:t})=>t))?l.isOpen=!l.isOpen:i.fire("execute")})),l.bind("isEnabled").toMany(c,"isEnabled",((...t)=>t.some(Bi))),this.listenTo(l,"execute",(()=>{this.editor.editing.view.focus()})),l}))}_createButton(t){const e=t.name;this.editor.ui.componentFactory.add(Zy(e),(n=>{const o=this.editor.commands.get("imageStyle"),i=new Ig(n);return i.set({label:t.title,icon:t.icon,tooltip:!0,isToggleable:!0}),i.bind("isEnabled").to(o,"isEnabled"),i.bind("isOn").to(o,"value",(t=>t===e)),i.on("execute",this._executeCommand.bind(this,e)),i}))}_executeCommand(t){this.editor.execute("imageStyle",{value:t}),this.editor.editing.view.focus()}}function Qy(t,e){for(const n of t)e[n.title]&&(n.title=e[n.title]);return t}function Zy(t){return`imageStyle:${t}`}function Jy(t,e){return(t?t+": ":"")+e}class Xy extends rr{static get pluginName(){return"IndentEditing"}init(){const t=this.editor;t.commands.add("indent",new lr(t)),t.commands.add("outdent",new lr(t))}}class tx extends rr{static get pluginName(){return"IndentUI"}init(){const t=this.editor,e=t.locale,n=t.t,o="ltr"==e.uiLanguageDirection?jh.indent:jh.outdent,i="ltr"==e.uiLanguageDirection?jh.outdent:jh.indent;this._defineButton("indent",n("Increase indent"),o),this._defineButton("outdent",n("Decrease indent"),i)}_defineButton(t,e,n){const o=this.editor;o.ui.componentFactory.add(t,(()=>{const o=this._createButton(Ig,t,e,n);return o.set({tooltip:!0}),o})),o.ui.componentFactory.add("menuBar:"+t,(()=>this._createButton(Wk,t,e,n)))}_createButton(t,e,n,o){const i=this.editor,r=i.commands.get(e),s=new t(i.locale);return s.set({label:n,icon:o}),s.bind("isEnabled").to(r,"isEnabled"),this.listenTo(s,"execute",(()=>{i.execute(e),i.editing.view.focus()})),s}}class ex{constructor(){this._definitions=new Set}get length(){return this._definitions.size}add(t){Array.isArray(t)?t.forEach((t=>this._definitions.add(t))):this._definitions.add(t)}getDispatcher(){return t=>{t.on("attribute:linkHref",((t,e,n)=>{if(!n.consumable.test(e.item,"attribute:linkHref"))return;if(!e.item.is("selection")&&!n.schema.isInline(e.item))return;const o=n.writer,i=o.document.selection;for(const t of this._definitions){const r=o.createAttributeElement("a",t.attributes,{priority:5});t.classes&&o.addClass(t.classes,r);for(const e in t.styles)o.setStyle(e,t.styles[e],r);o.setCustomProperty("link",!0,r),t.callback(e.attributeNewValue)?e.item.is("selection")?o.wrap(i.getFirstRange(),r):o.wrap(n.mapper.toViewRange(e.range),r):o.unwrap(n.mapper.toViewRange(e.range),r)}}),{priority:"high"})}}getDispatcherForLinkedImage(){return t=>{t.on("attribute:linkHref:imageBlock",((t,e,{writer:n,mapper:o})=>{const i=o.toViewElement(e.item),r=Array.from(i.getChildren()).find((t=>t.is("element","a")));for(const t of this._definitions){const o=Xi(t.attributes);if(t.callback(e.attributeNewValue)){for(const[t,e]of o)"class"===t?n.addClass(e,r):n.setAttribute(t,e,r);t.classes&&n.addClass(t.classes,r);for(const e in t.styles)n.setStyle(e,t.styles[e],r)}else{for(const[t,e]of o)"class"===t?n.removeClass(e,r):n.removeAttribute(t,r);t.classes&&n.removeClass(t.classes,r);for(const e in t.styles)n.removeStyle(e,r)}}}))}}}const nx=function(t,e,n){var o=t.length;return n=void 0===n?o:n,!e&&n>=o?t:is(t,e,n)};var ox=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");const ix=function(t){return ox.test(t)};const rx=function(t){return t.split("")};var sx="\\ud800-\\udfff",ax="["+sx+"]",cx="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",lx="\\ud83c[\\udffb-\\udfff]",dx="[^"+sx+"]",ux="(?:\\ud83c[\\udde6-\\uddff]){2}",hx="[\\ud800-\\udbff][\\udc00-\\udfff]",gx="(?:"+cx+"|"+lx+")"+"?",mx="[\\ufe0e\\ufe0f]?",px=mx+gx+("(?:\\u200d(?:"+[dx,ux,hx].join("|")+")"+mx+gx+")*"),fx="(?:"+[dx+cx+"?",cx,ux,hx,ax].join("|")+")",kx=RegExp(lx+"(?="+lx+")|"+fx+px,"g");const bx=function(t){return t.match(kx)||[]};const wx=function(t){return ix(t)?bx(t):rx(t)};const Ax=function(t){return function(e){e=Xr(e);var n=ix(e)?wx(e):void 0,o=n?n[0]:e.charAt(0),i=n?nx(n,1).join(""):e.slice(1);return o[t]()+i}}("toUpperCase"),_x=/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g,Cx=/^[\S]+@((?![-_])(?:[-\w\u00a1-\uffff]{0,63}[^-_]\.))+(?:[a-z\u00a1-\uffff]{2,})$/i,vx=/^((\w+:(\/{2,})?)|(\W))/i,yx=["https?","ftps?","mailto"],xx="Ctrl+K";function Ex(t,{writer:e}){const n=e.createAttributeElement("a",{href:t},{priority:5});return e.setCustomProperty("link",!0,n),n}function Dx(t,e=yx){const n=String(t),o=e.join("|");return function(t,e){const n=t.replace(_x,"");return!!n.match(e)}(n,new RegExp(`${"^(?:(?:):|[^a-z]|[a-z+.-]+(?:[^a-z+.:-]|$))".replace("",o)}`,"i"))?n:"#"}function Ix(t,e){return!!t&&e.checkAttribute(t.name,"linkHref")}function Mx(t,e){const n=(o=t,Cx.test(o)?"mailto:":e);var o;const i=!!n&&!Tx(t);return t&&i?n+t:t}function Tx(t){return vx.test(t)}function Sx(t){window.open(t,"_blank","noopener")}class Bx extends ar{constructor(){super(...arguments),this.manualDecorators=new Yi,this.automaticDecorators=new ex}restoreManualDecoratorStates(){for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}refresh(){const t=this.editor.model,e=t.document.selection,n=e.getSelectedElement()||Qi(e.getSelectedBlocks());Ix(n,t.schema)?(this.value=n.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttribute(n,"linkHref")):(this.value=e.getAttribute("linkHref"),this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref"));for(const t of this.manualDecorators)t.value=this._getDecoratorStateFromModel(t.id)}execute(t,e={}){const n=this.editor.model,o=n.document.selection,i=[],r=[];for(const t in e)e[t]?i.push(t):r.push(t);n.change((e=>{if(o.isCollapsed){const s=o.getFirstPosition();if(o.hasAttribute("linkHref")){const a=Nx(o);let c=Dw(s,"linkHref",o.getAttribute("linkHref"),n);o.getAttribute("linkHref")===a&&(c=this._updateLinkContent(n,e,c,t)),e.setAttribute("linkHref",t,c),i.forEach((t=>{e.setAttribute(t,!0,c)})),r.forEach((t=>{e.removeAttribute(t,c)})),e.setSelection(e.createPositionAfter(c.end.nodeBefore))}else if(""!==t){const r=Xi(o.getAttributes());r.set("linkHref",t),i.forEach((t=>{r.set(t,!0)}));const{end:a}=n.insertContent(e.createText(t,r),s);e.setSelection(a)}["linkHref",...i,...r].forEach((t=>{e.removeSelectionAttribute(t)}))}else{const s=n.schema.getValidRanges(o.getRanges(),"linkHref"),a=[];for(const t of o.getSelectedBlocks())n.schema.checkAttribute(t,"linkHref")&&a.push(e.createRangeOn(t));const c=a.slice();for(const t of s)this._isRangeToUpdate(t,a)&&c.push(t);for(const s of c){let a=s;if(1===c.length){const i=Nx(o);o.getAttribute("linkHref")===i&&(a=this._updateLinkContent(n,e,s,t),e.setSelection(e.createSelection(a)))}e.setAttribute("linkHref",t,a),i.forEach((t=>{e.setAttribute(t,!0,a)})),r.forEach((t=>{e.removeAttribute(t,a)}))}}}))}_getDecoratorStateFromModel(t){const e=this.editor.model,n=e.document.selection,o=n.getSelectedElement();return Ix(o,e.schema)?o.getAttribute(t):n.getAttribute(t)}_isRangeToUpdate(t,e){for(const n of e)if(n.containsRange(t))return!1;return!0}_updateLinkContent(t,e,n,o){const i=e.createText(o,{linkHref:o});return t.insertContent(i,n)}}function Nx(t){if(t.isCollapsed){const e=t.getFirstPosition();return e.textNode&&e.textNode.data}{const e=Array.from(t.getFirstRange().getItems());if(e.length>1)return null;const n=e[0];return n.is("$text")||n.is("$textProxy")?n.data:null}}class Px extends ar{refresh(){const t=this.editor.model,e=t.document.selection,n=e.getSelectedElement();Ix(n,t.schema)?this.isEnabled=t.schema.checkAttribute(n,"linkHref"):this.isEnabled=t.schema.checkAttributeInSelection(e,"linkHref")}execute(){const t=this.editor,e=this.editor.model,n=e.document.selection,o=t.commands.get("link");e.change((t=>{const i=n.isCollapsed?[Dw(n.getFirstPosition(),"linkHref",n.getAttribute("linkHref"),e)]:e.schema.getValidRanges(n.getRanges(),"linkHref");for(const e of i)if(t.removeAttribute("linkHref",e),o)for(const n of o.manualDecorators)t.removeAttribute(n.id,e)}))}}class Ox extends(K()){constructor({id:t,label:e,attributes:n,classes:o,styles:i,defaultValue:r}){super(),this.id=t,this.set("value",void 0),this.defaultValue=r,this.label=e,this.attributes=n,this.classes=o,this.styles=i}_createPattern(){return{attributes:this.attributes,classes:this.classes,styles:this.styles}}}var Lx=n(7719),zx={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Lx.A,zx);Lx.A.locals;var Rx=Object.defineProperty,jx=Object.getOwnPropertySymbols,Fx=Object.prototype.hasOwnProperty,Vx=Object.prototype.propertyIsEnumerable,Hx=(t,e,n)=>e in t?Rx(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Ux=(t,e)=>{for(var n in e||(e={}))Fx.call(e,n)&&Hx(t,n,e[n]);if(jx)for(var n of jx(e))Vx.call(e,n)&&Hx(t,n,e[n]);return t};const qx="automatic",Gx=/^(https?:)?\/\//;class Wx extends rr{static get pluginName(){return"LinkEditing"}static get requires(){return[gw,tw,Yb]}constructor(t){super(t),t.config.define("link",{allowCreatingEmptyLinks:!1,addTargetToExternalLinks:!1})}init(){const t=this.editor,e=this.editor.config.get("link.allowedProtocols");t.model.schema.extend("$text",{allowAttributes:"linkHref"}),t.conversion.for("dataDowncast").attributeToElement({model:"linkHref",view:Ex}),t.conversion.for("editingDowncast").attributeToElement({model:"linkHref",view:(t,n)=>Ex(Dx(t,e),n)}),t.conversion.for("upcast").elementToAttribute({view:{name:"a",attributes:{href:!0}},model:{key:"linkHref",value:t=>t.getAttribute("href")}}),t.commands.add("link",new Bx(t)),t.commands.add("unlink",new Px(t));const n=function(t,e){const n={"Open in a new tab":t("Open in a new tab"),Downloadable:t("Downloadable")};return e.forEach((t=>("label"in t&&n[t.label]&&(t.label=n[t.label]),t))),e}(t.t,function(t){const e=[];if(t)for(const[n,o]of Object.entries(t)){const t=Object.assign({},o,{id:`link${Ax(n)}`});e.push(t)}return e}(t.config.get("link.decorators")));this._enableAutomaticDecorators(n.filter((t=>t.mode===qx))),this._enableManualDecorators(n.filter((t=>"manual"===t.mode)));t.plugins.get(gw).registerAttribute("linkHref"),function(t,e,n,o){const i=t.editing.view,r=new Set;i.document.registerPostFixer((i=>{const s=t.model.document.selection;let a=!1;if(s.hasAttribute(e)){const c=Dw(s.getFirstPosition(),e,s.getAttribute(e),t.model),l=t.editing.mapper.toViewRange(c);for(const t of l.getItems())t.is("element",n)&&!t.hasClass(o)&&(i.addClass(o,t),r.add(t),a=!0)}return a})),t.conversion.for("editingDowncast").add((t=>{function e(){i.change((t=>{for(const e of r.values())t.removeClass(o,e),r.delete(e)}))}t.on("insert",e,{priority:"highest"}),t.on("remove",e,{priority:"highest"}),t.on("attribute",e,{priority:"highest"}),t.on("selection",e,{priority:"highest"})}))}(t,"linkHref","a","ck-link_selected"),this._enableLinkOpen(),this._enableSelectionAttributesFixer(),this._enableClipboardIntegration()}_enableAutomaticDecorators(t){const e=this.editor,n=e.commands.get("link").automaticDecorators;e.config.get("link.addTargetToExternalLinks")&&n.add({id:"linkIsExternal",mode:qx,callback:t=>!!t&&Gx.test(t),attributes:{target:"_blank",rel:"noopener noreferrer"}}),n.add(t),n.length&&e.conversion.for("downcast").add(n.getDispatcher())}_enableManualDecorators(t){if(!t.length)return;const e=this.editor,n=e.commands.get("link").manualDecorators;t.forEach((t=>{e.model.schema.extend("$text",{allowAttributes:t.id});const o=new Ox(t);n.add(o),e.conversion.for("downcast").attributeToElement({model:o.id,view:(t,{writer:e,schema:n},{item:i})=>{if((i.is("selection")||n.isInline(i))&&t){const t=e.createAttributeElement("a",o.attributes,{priority:5});o.classes&&e.addClass(o.classes,t);for(const n in o.styles)e.setStyle(n,o.styles[n],t);return e.setCustomProperty("link",!0,t),t}}}),e.conversion.for("upcast").elementToAttribute({view:Ux({name:"a"},o._createPattern()),model:{key:o.id}})}))}_enableLinkOpen(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",((t,e)=>{if(!(c.isMac?e.domEvent.metaKey:e.domEvent.ctrlKey))return;let n=e.domTarget;if("a"!=n.tagName.toLowerCase()&&(n=n.closest("a")),!n)return;const o=n.getAttribute("href");o&&(t.stop(),e.preventDefault(),Sx(o))}),{context:"$capture"}),this.listenTo(e,"keydown",((e,n)=>{const o=t.commands.get("link").value;!!o&&n.keyCode===bi.enter&&n.altKey&&(e.stop(),Sx(o))}))}_enableSelectionAttributesFixer(){const t=this.editor.model,e=t.document.selection;this.listenTo(e,"change:attribute",((n,{attributeKeys:o})=>{o.includes("linkHref")&&!e.hasAttribute("linkHref")&&t.change((e=>{var n;!function(t,e){t.removeSelectionAttribute("linkHref");for(const n of e)t.removeSelectionAttribute(n)}(e,(n=t.schema,n.getDefinition("$text").allowAttributes.filter((t=>t.startsWith("link")))))}))}))}_enableClipboardIntegration(){const t=this.editor,e=t.model,n=this.editor.config.get("link.defaultProtocol");n&&this.listenTo(t.plugins.get("ClipboardPipeline"),"contentInsertion",((t,o)=>{e.change((t=>{const e=t.createRangeIn(o.content);for(const o of e.getItems())if(o.hasAttribute("linkHref")){const e=Mx(o.getAttribute("linkHref"),n);t.setAttribute("linkHref",e,o)}}))}))}}var Kx=n(3817),$x={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Kx.A,$x);Kx.A.locals;class Yx extends dg{constructor(t,e){super(t),this.focusTracker=new Zi,this.keystrokes=new Ji,this._focusables=new Fh;const n=t.t;this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(n("Save"),jh.check,"ck-button-save"),this.saveButtonView.type="submit",this.cancelButtonView=this._createButton(n("Cancel"),jh.cancel,"ck-button-cancel","cancel"),this._manualDecoratorSwitches=this._createManualDecoratorSwitches(e),this.children=this._createFormChildren(e.manualDecorators),this._focusCycler=new nm({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}});const o=["ck","ck-link-form","ck-responsive-form"];e.manualDecorators.length&&o.push("ck-link-form_layout-vertical","ck-vertical-form"),this.setTemplate({tag:"form",attributes:{class:o,tabindex:"-1"},children:this.children})}getDecoratorSwitchesState(){return Array.from(this._manualDecoratorSwitches).reduce(((t,e)=>(t[e.name]=e.isOn,t)),{})}render(){super.render(),i({view:this});[this.urlInputView,...this._manualDecoratorSwitches,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createUrlInput(){const t=this.locale.t,e=new Hg(this.locale,Hm);return e.label=t("Link URL"),e}_createButton(t,e,n,o){const i=new Ig(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}_createManualDecoratorSwitches(t){const e=this.createCollection();for(const n of t.manualDecorators){const o=new Sg(this.locale);o.set({name:n.id,label:n.label,withText:!0}),o.bind("isOn").toMany([n,t],"value",((t,e)=>void 0===e&&void 0===t?!!n.defaultValue:!!t)),o.on("execute",(()=>{n.set("value",!o.isOn)})),e.add(o)}return e}_createFormChildren(t){const e=this.createCollection();if(e.add(this.urlInputView),t.length){const t=new dg;t.setTemplate({tag:"ul",children:this._manualDecoratorSwitches.map((t=>({tag:"li",children:[t],attributes:{class:["ck","ck-list__item"]}}))),attributes:{class:["ck","ck-reset","ck-list"]}}),e.add(t)}return e.add(this.saveButtonView),e.add(this.cancelButtonView),e}}var Qx=n(8762),Zx={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(Qx.A,Zx);Qx.A.locals;class Jx extends dg{constructor(t,e={}){super(t),this.focusTracker=new Zi,this.keystrokes=new Ji,this._focusables=new Fh;const n=t.t;this.previewButtonView=this._createPreviewButton(),this.unlinkButtonView=this._createButton(n("Unlink"),'',"unlink"),this.editButtonView=this._createButton(n("Edit link"),jh.pencil,"edit"),this.set("href",void 0),this._linkConfig=e,this._focusCycler=new nm({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this.setTemplate({tag:"div",attributes:{class:["ck","ck-link-actions","ck-responsive-form"],tabindex:"-1"},children:[this.previewButtonView,this.editButtonView,this.unlinkButtonView]})}render(){super.render();[this.previewButtonView,this.editButtonView,this.unlinkButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}_createButton(t,e,n){const o=new Ig(this.locale);return o.set({label:t,icon:e,tooltip:!0}),o.delegate("execute").to(this,n),o}_createPreviewButton(){const t=new Ig(this.locale),e=this.bindTemplate,n=this.t;return t.set({withText:!0,tooltip:n("Open link in new tab")}),t.extendTemplate({attributes:{class:["ck","ck-link-actions__preview"],href:e.to("href",(t=>t&&Dx(t,this._linkConfig.allowedProtocols))),target:"_blank",rel:"noopener noreferrer"}}),t.bind("label").to(this,"href",(t=>t||n("This link has no URL"))),t.bind("isEnabled").to(this,"href",(t=>!!t)),t.template.tag="a",t.template.eventListeners={},t}}const Xx="link-ui";class tE extends rr{constructor(){super(...arguments),this.actionsView=null,this.formView=null}static get requires(){return[Tf]}static get pluginName(){return"LinkUI"}init(){const t=this.editor,e=this.editor.t;t.editing.view.addObserver(Ah),this._balloon=t.plugins.get(Tf),this._createToolbarLinkButton(),this._enableBalloonActivators(),t.conversion.for("editingDowncast").markerToHighlight({model:Xx,view:{classes:["ck-fake-link-selection"]}}),t.conversion.for("editingDowncast").markerToElement({model:Xx,view:{name:"span",classes:["ck-fake-link-selection","ck-fake-link-selection_collapsed"]}}),t.accessibility.addKeystrokeInfos({keystrokes:[{label:e("Create link"),keystroke:xx},{label:e("Move out of a link"),keystroke:[["arrowleft","arrowleft"],["arrowright","arrowright"]]}]})}destroy(){super.destroy(),this.formView&&this.formView.destroy(),this.actionsView&&this.actionsView.destroy()}_createViews(){this.actionsView=this._createActionsView(),this.formView=this._createFormView(),this._enableUserBalloonInteractions()}_createActionsView(){const t=this.editor,e=new Jx(t.locale,t.config.get("link")),n=t.commands.get("link"),o=t.commands.get("unlink");return e.bind("href").to(n,"value"),e.editButtonView.bind("isEnabled").to(n),e.unlinkButtonView.bind("isEnabled").to(o),this.listenTo(e,"edit",(()=>{this._addFormView()})),this.listenTo(e,"unlink",(()=>{t.execute("unlink"),this._hideUI()})),e.keystrokes.set("Esc",((t,e)=>{this._hideUI(),e()})),e.keystrokes.set(xx,((t,e)=>{this._addFormView(),e()})),e}_createFormView(){const t=this.editor,n=t.commands.get("link"),o=t.config.get("link.defaultProtocol"),i=t.config.get("link.allowCreatingEmptyLinks"),r=new(e(Yx))(t.locale,n);return r.urlInputView.fieldView.bind("value").to(n,"value"),r.urlInputView.bind("isEnabled").to(n,"isEnabled"),r.saveButtonView.bind("isEnabled").to(n,"isEnabled",r.urlInputView,"isEmpty",((t,e)=>t&&(i||!e))),this.listenTo(r,"submit",(()=>{const{value:e}=r.urlInputView.fieldView.element,n=Mx(e,o);t.execute("link",n,r.getDecoratorSwitchesState()),this._closeFormView()})),this.listenTo(r,"cancel",(()=>{this._closeFormView()})),r.keystrokes.set("Esc",((t,e)=>{this._closeFormView(),e()})),r}_createToolbarLinkButton(){const t=this.editor,e=t.commands.get("link");t.ui.componentFactory.add("link",(()=>{const t=this._createButton(Ig);return t.set({tooltip:!0,isToggleable:!0}),t.bind("isOn").to(e,"value",(t=>!!t)),t})),t.ui.componentFactory.add("menuBar:link",(()=>this._createButton(Wk)))}_createButton(t){const e=this.editor,n=e.locale,o=e.commands.get("link"),i=new t(e.locale),r=n.t;return i.set({label:r("Link"),icon:'',keystroke:xx}),i.bind("isEnabled").to(o,"isEnabled"),this.listenTo(i,"execute",(()=>this._showUI(!0))),i}_enableBalloonActivators(){const t=this.editor,e=t.editing.view.document;this.listenTo(e,"click",(()=>{this._getSelectedLinkElement()&&this._showUI()})),t.keystrokes.set(xx,((e,n)=>{n(),t.commands.get("link").isEnabled&&this._showUI(!0)}))}_enableUserBalloonInteractions(){this.editor.keystrokes.set("Tab",((t,e)=>{this._areActionsVisible&&!this.actionsView.focusTracker.isFocused&&(this.actionsView.focus(),e())}),{priority:"high"}),this.editor.keystrokes.set("Esc",((t,e)=>{this._isUIVisible&&(this._hideUI(),e())})),t({emitter:this.formView,activator:()=>this._isUIInPanel,contextElements:()=>[this._balloon.view.element],callback:()=>this._hideUI()})}_addActionsView(){this.actionsView||this._createViews(),this._areActionsInPanel||this._balloon.add({view:this.actionsView,position:this._getBalloonPositionData()})}_addFormView(){if(this.formView||this._createViews(),this._isFormInPanel)return;const t=this.editor.commands.get("link");this.formView.disableCssTransitions(),this._balloon.add({view:this.formView,position:this._getBalloonPositionData()}),this.formView.urlInputView.fieldView.value=t.value||"",this._balloon.visibleView===this.formView&&this.formView.urlInputView.fieldView.select(),this.formView.enableCssTransitions()}_closeFormView(){const t=this.editor.commands.get("link");t.restoreManualDecoratorStates(),void 0!==t.value?this._removeFormView():this._hideUI()}_removeFormView(){this._isFormInPanel&&(this.formView.saveButtonView.focus(),this.formView.urlInputView.fieldView.reset(),this._balloon.remove(this.formView),this.editor.editing.view.focus(),this._hideFakeVisualSelection())}_showUI(t=!1){this.formView||this._createViews(),this._getSelectedLinkElement()?(this._areActionsVisible?this._addFormView():this._addActionsView(),t&&this._balloon.showStack("main")):(this._showFakeVisualSelection(),this._addActionsView(),t&&this._balloon.showStack("main"),this._addFormView()),this._startUpdatingUI()}_hideUI(){if(!this._isUIInPanel)return;const t=this.editor;this.stopListening(t.ui,"update"),this.stopListening(this._balloon,"change:visibleView"),t.editing.view.focus(),this._removeFormView(),this._balloon.remove(this.actionsView),this._hideFakeVisualSelection()}_startUpdatingUI(){const t=this.editor,e=t.editing.view.document;let n=this._getSelectedLinkElement(),o=r();const i=()=>{const t=this._getSelectedLinkElement(),e=r();n&&!t||!n&&e!==o?this._hideUI():this._isUIVisible&&this._balloon.updatePosition(this._getBalloonPositionData()),n=t,o=e};function r(){return e.selection.focus.getAncestors().reverse().find((t=>t.is("element")))}this.listenTo(t.ui,"update",i),this.listenTo(this._balloon,"change:visibleView",i)}get _isFormInPanel(){return!!this.formView&&this._balloon.hasView(this.formView)}get _areActionsInPanel(){return!!this.actionsView&&this._balloon.hasView(this.actionsView)}get _areActionsVisible(){return!!this.actionsView&&this._balloon.visibleView===this.actionsView}get _isUIInPanel(){return this._isFormInPanel||this._areActionsInPanel}get _isUIVisible(){const t=this._balloon.visibleView;return!!this.formView&&t==this.formView||this._areActionsVisible}_getBalloonPositionData(){const t=this.editor.editing.view,e=this.editor.model,n=t.document;let o;if(e.markers.has(Xx)){const e=Array.from(this.editor.editing.mapper.markerNameToElements(Xx)),n=t.createRange(t.createPositionBefore(e[0]),t.createPositionAfter(e[e.length-1]));o=t.domConverter.viewRangeToDom(n)}else o=()=>{const e=this._getSelectedLinkElement();return e?t.domConverter.mapViewToDom(e):t.domConverter.viewRangeToDom(n.selection.getFirstRange())};return{target:o}}_getSelectedLinkElement(){const t=this.editor.editing.view,e=t.document.selection,n=e.getSelectedElement();if(e.isCollapsed||n&&Ww(n))return eE(e.getFirstPosition());{const n=e.getFirstRange().getTrimmed(),o=eE(n.start),i=eE(n.end);return o&&o==i&&t.createRangeIn(o).getTrimmed().isEqual(n)?o:null}}_showFakeVisualSelection(){const t=this.editor.model;t.change((e=>{const n=t.document.selection.getFirstRange();if(t.markers.has(Xx))e.updateMarker(Xx,{range:n});else if(n.start.isAtEnd){const o=n.start.getLastMatchingPosition((({item:e})=>!t.schema.isContent(e)),{boundaries:n});e.addMarker(Xx,{usingOperation:!1,affectsData:!1,range:e.createRange(o,n.end)})}else e.addMarker(Xx,{usingOperation:!1,affectsData:!1,range:n})}))}_hideFakeVisualSelection(){const t=this.editor.model;t.markers.has(Xx)&&t.change((t=>{t.removeMarker(Xx)}))}}function eE(t){return t.getAncestors().find((t=>{return(e=t).is("attributeElement")&&!!e.getCustomProperty("link");var e}))||null}const nE=new RegExp("(^|\\s)(((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(((?!www\\.)|(www\\.))(?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.)+(?:[a-z\\u00a1-\\uffff]{2,63})))(?::\\d{2,5})?(?:[/?#]\\S*)?)|((www.|(\\S+@))((?![-_])(?:[-_a-z0-9\\u00a1-\\uffff]{1,63}\\.))+(?:[a-z\\u00a1-\\uffff]{2,63})))$","i");class oE extends rr{static get requires(){return[lw,Wx]}static get pluginName(){return"AutoLink"}init(){const t=this.editor.model.document.selection;t.on("change:range",(()=>{this.isEnabled=!t.anchor.parent.is("element","codeBlock")})),this._enableTypingHandling()}afterInit(){this._enableEnterHandling(),this._enableShiftEnterHandling(),this._enablePasteLinking()}_expandLinkRange(t,e){return e.textNode&&e.textNode.hasAttribute("linkHref")?Dw(e,"linkHref",e.textNode.getAttribute("linkHref"),t):null}_selectEntireLinks(t,e){const n=this.editor.model,o=n.document.selection,i=o.getFirstPosition(),r=o.getLastPosition();let s=e.getJoined(this._expandLinkRange(n,i)||e);s&&(s=s.getJoined(this._expandLinkRange(n,r)||e)),s&&(s.start.isBefore(i)||s.end.isAfter(r))&&t.setSelection(s)}_enablePasteLinking(){const t=this.editor,e=t.model,n=e.document.selection,o=t.plugins.get("ClipboardPipeline"),i=t.commands.get("link");o.on("inputTransformation",((t,o)=>{if(!this.isEnabled||!i.isEnabled||n.isCollapsed||"paste"!==o.method)return;if(n.rangeCount>1)return;const r=n.getFirstRange(),s=o.dataTransfer.getData("text/plain");if(!s)return;const a=s.match(nE);a&&a[2]===s&&(e.change((t=>{this._selectEntireLinks(t,r),i.execute(s)})),t.stop())}),{priority:"high"})}_enableTypingHandling(){const t=this.editor,e=new hw(t.model,(t=>{if(!function(t){return t.length>4&&" "===t[t.length-1]&&" "!==t[t.length-2]}(t))return;const e=iE(t.substr(0,t.length-1));return e?{url:e}:void 0}));e.on("matched:data",((e,n)=>{const{batch:o,range:i,url:r}=n;if(!o.isTyping)return;const s=i.end.getShiftedBy(-1),a=s.getShiftedBy(-r.length),c=t.model.createRange(a,s);this._applyAutoLink(r,c)})),e.bind("isEnabled").to(this)}_enableEnterHandling(){const t=this.editor,e=t.model,n=t.commands.get("enter");n&&n.on("execute",(()=>{const t=e.document.selection.getFirstPosition();if(!t.parent.previousSibling)return;const n=e.createRangeIn(t.parent.previousSibling);this._checkAndApplyAutoLinkOnRange(n)}))}_enableShiftEnterHandling(){const t=this.editor,e=t.model,n=t.commands.get("shiftEnter");n&&n.on("execute",(()=>{const t=e.document.selection.getFirstPosition(),n=e.createRange(e.createPositionAt(t.parent,0),t.getShiftedBy(-1));this._checkAndApplyAutoLinkOnRange(n)}))}_checkAndApplyAutoLinkOnRange(t){const e=this.editor.model,{text:n,range:o}=uw(t,e),i=iE(n);if(i){const t=e.createRange(o.end.getShiftedBy(-i.length),o.end);this._applyAutoLink(i,t)}}_applyAutoLink(t,e){const n=this.editor.model,o=Mx(t,this.editor.config.get("link.defaultProtocol"));this.isEnabled&&function(t,e){return e.schema.checkAttributeInSelection(e.createSelection(t),"linkHref")}(e,n)&&Tx(o)&&!function(t){const e=t.start.nodeAfter;return!!e&&e.hasAttribute("linkHref")}(e)&&this._persistAutoLink(o,e)}_persistAutoLink(t,e){const n=this.editor.model,o=this.editor.plugins.get("Delete");n.enqueueChange((i=>{i.setAttribute("linkHref",t,e),n.enqueueChange((()=>{o.requestUndoOnBackspace()}))}))}}function iE(t){const e=nE.exec(t);return e?e[2]:null}var rE=n(4808),sE={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(rE.A,sE);rE.A.locals;class aE{constructor(t,e){this._startElement=t,this._referenceIndent=t.getAttribute("listIndent"),this._isForward="forward"==e.direction,this._includeSelf=!!e.includeSelf,this._sameAttributes=yi(e.sameAttributes||[]),this._sameIndent=!!e.sameIndent,this._lowerIndent=!!e.lowerIndent,this._higherIndent=!!e.higherIndent}static first(t,e){return Qi(new this(t,e)[Symbol.iterator]())}*[Symbol.iterator](){const t=[];for(const{node:e}of cE(this._getStartNode(),this._isForward?"forward":"backward")){const n=e.getAttribute("listIndent");if(nthis._referenceIndent){if(!this._higherIndent)continue;if(!this._isForward){t.push(e);continue}}else{if(!this._sameIndent){if(this._higherIndent){t.length&&(yield*t,t.length=0);break}continue}if(this._sameAttributes.some((t=>e.getAttribute(t)!==this._startElement.getAttribute(t))))break}t.length&&(yield*t,t.length=0),yield e}}_getStartNode(){return this._includeSelf?this._startElement:this._isForward?this._startElement.nextSibling:this._startElement.previousSibling}}function*cE(t,e="forward"){const n="forward"==e,o=[];let i=null;for(;AE(t);){let e=null;if(i){const n=t.getAttribute("listIndent"),r=i.getAttribute("listIndent");n>r?o[r]=i:ne in t?dE(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,kE=(t,e)=>{for(var n in e||(e={}))mE.call(e,n)&&fE(t,n,e[n]);if(gE)for(var n of gE(e))pE.call(e,n)&&fE(t,n,e[n]);return t},bE=(t,e)=>uE(t,hE(e));class wE{static next(){return k()}}function AE(t){return!!t&&t.is("element")&&t.hasAttribute("listItemId")}function _E(t,e={}){return[...CE(t,bE(kE({},e),{direction:"backward"})),...CE(t,bE(kE({},e),{direction:"forward"}))]}function CE(t,e={}){const n="forward"==e.direction,o=Array.from(new aE(t,bE(kE({},e),{includeSelf:n,sameIndent:!0,sameAttributes:"listItemId"})));return n?o:o.reverse()}function vE(t,e){const n=new aE(t,kE({sameIndent:!0,sameAttributes:"listType"},e)),o=new aE(t,kE({sameIndent:!0,sameAttributes:"listType",includeSelf:!0,direction:"forward"},e));return[...Array.from(n).reverse(),...o]}function yE(t){return!aE.first(t,{sameIndent:!0,sameAttributes:"listItemId"})}function xE(t){return!aE.first(t,{direction:"forward",sameIndent:!0,sameAttributes:"listItemId"})}function EE(t,e={}){t=yi(t);const n=!1!==e.withNested,o=new Set;for(const e of t)for(const t of _E(e,{higherIndent:n}))o.add(t);return NE(o)}function DE(t){t=yi(t);const e=new Set;for(const n of t)for(const t of vE(n))e.add(t);return NE(e)}function IE(t,e){const n=CE(t,{direction:"forward"}),o=wE.next();for(const t of n)e.setAttribute("listItemId",o,t);return n}function ME(t,e,n){const o={};for(const[t,n]of e.getAttributes())t.startsWith("list")&&(o[t]=n);const i=CE(t,{direction:"forward"});for(const t of i)n.setAttributes(o,t);return i}function TE(t,e,{expand:n,indentBy:o=1}={}){t=yi(t);const i=n?EE(t):t;for(const t of i){const n=t.getAttribute("listIndent")+o;n<0?SE(t,e):e.setAttribute("listIndent",n,t)}return i}function SE(t,e){t=yi(t);for(const n of t)n.is("element","listItem")&&e.rename(n,"paragraph");for(const n of t)for(const t of n.getAttributeKeys())t.startsWith("list")&&e.removeAttribute(t,n);return t}function BE(t){if(!t.length)return!1;const e=t[0].getAttribute("listItemId");return!!e&&!t.some((t=>t.getAttribute("listItemId")!=e))}function NE(t){return Array.from(t).filter((t=>"$graveyard"!==t.root.rootName)).sort(((t,e)=>t.index-e.index))}function PE(t){const e=t.document.selection.getSelectedElement();return e&&t.schema.isObject(e)&&t.schema.isBlock(e)?e:null}function OE(t,e){return e.checkChild(t.parent,"listItem")&&e.checkChild(t,"$text")&&!e.isObject(t)}function LE(t){return"numbered"==t||"customNumbered"==t}function zE(t,e,n){return CE(e,{direction:"forward"}).pop().index>t.index?ME(t,e,n):[]}class RE extends ar{constructor(t,e){super(t),this._direction=e}refresh(){this.isEnabled=this._checkEnabled()}execute(){const t=this.editor.model,e=jE(t.document.selection);t.change((t=>{const n=[];BE(e)&&!yE(e[0])?("forward"==this._direction&&n.push(...TE(e,t)),n.push(...IE(e[0],t))):"forward"==this._direction?n.push(...TE(e,t,{expand:!0})):n.push(...function(t,e){const n=EE(t=yi(t)),o=new Set,i=Math.min(...n.map((t=>t.getAttribute("listIndent")))),r=new Map;for(const t of n)r.set(t,aE.first(t,{lowerIndent:!0}));for(const t of n){if(o.has(t))continue;o.add(t);const n=t.getAttribute("listIndent")-1;if(n<0)SE(t,e);else{if(t.getAttribute("listIndent")==i){const n=zE(t,r.get(t),e);for(const t of n)o.add(t);if(n.length)continue}e.setAttribute("listIndent",n,t)}}return NE(o)}(e,t));for(const e of n){if(!e.hasAttribute("listType"))continue;const n=aE.first(e,{sameIndent:!0});n&&t.setAttribute("listType",n.getAttribute("listType"),e)}this._fireAfterExecute(n)}))}_fireAfterExecute(t){this.fire("afterExecute",NE(new Set(t)))}_checkEnabled(){let t=jE(this.editor.model.document.selection),e=t[0];if(!e)return!1;if("backward"==this._direction)return!0;if(BE(t)&&!yE(t[0]))return!0;t=EE(t),e=t[0];const n=aE.first(e,{sameIndent:!0});return!!n&&n.getAttribute("listType")==e.getAttribute("listType")}}function jE(t){const e=Array.from(t.getSelectedBlocks()),n=e.findIndex((t=>!AE(t)));return-1!=n&&(e.length=n),e}var FE=Object.defineProperty,VE=Object.defineProperties,HE=Object.getOwnPropertyDescriptors,UE=Object.getOwnPropertySymbols,qE=Object.prototype.hasOwnProperty,GE=Object.prototype.propertyIsEnumerable,WE=(t,e,n)=>e in t?FE(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,KE=(t,e)=>{for(var n in e||(e={}))qE.call(e,n)&&WE(t,n,e[n]);if(UE)for(var n of UE(e))GE.call(e,n)&&WE(t,n,e[n]);return t},$E=(t,e)=>VE(t,HE(e));class YE extends ar{constructor(t,e,n={}){super(t),this.type=e,this._listWalkerOptions=n.multiLevel?{higherIndent:!0,lowerIndent:!0,sameAttributes:[]}:void 0}refresh(){this.value=this._getValue(),this.isEnabled=this._checkEnabled()}execute(t={}){const e=this.editor.model,n=e.document,o=PE(e),i=Array.from(n.selection.getSelectedBlocks()).filter((t=>e.schema.checkAttribute(t,"listType")||OE(t,e.schema))),r=void 0!==t.forceValue?!t.forceValue:this.value;e.change((s=>{if(r){const t=i[i.length-1],e=CE(t,{direction:"forward"}),n=[];e.length>1&&n.push(...IE(e[1],s)),n.push(...SE(i,s)),n.push(...function(t,e){const n=[];let o=Number.POSITIVE_INFINITY;for(const{node:i}of cE(t.nextSibling,"forward")){const t=i.getAttribute("listIndent");if(0==t)break;t{const{firstElement:r,lastElement:s}=this._getMergeSubjectElements(n,t),a=r.getAttribute("listIndent")||0,c=s.getAttribute("listIndent"),l=s.getAttribute("listItemId");if(a!=c){const t=(d=s,Array.from(new aE(d,{direction:"forward",higherIndent:!0})));o.push(...TE([s,...t],i,{indentBy:a-c,expand:a{const e=IE(this._getStartBlock(),t);this._fireAfterExecute(e)}))}_fireAfterExecute(t){this.fire("afterExecute",NE(new Set(t)))}_checkEnabled(){const t=this.editor.model.document.selection,e=this._getStartBlock();return t.isCollapsed&&AE(e)&&!yE(e)}_getStartBlock(){const t=this.editor.model.document.selection.getFirstPosition().parent;return"before"==this._direction?t:t.nextSibling}}class JE extends rr{static get pluginName(){return"ListUtils"}expandListBlocksToCompleteList(t){return DE(t)}isFirstBlockOfListItem(t){return yE(t)}isListItemBlock(t){return AE(t)}expandListBlocksToCompleteItems(t,e={}){return EE(t,e)}isNumberedListType(t){return LE(t)}}function XE(t){return t.is("element","ol")||t.is("element","ul")}function tD(t){return t.is("element","li")}function eD(t,e,n,o=iD(n,e)){return t.createAttributeElement(oD(n),null,{priority:2*e/100-100,id:o})}function nD(t,e,n){return t.createAttributeElement("li",null,{priority:(2*e+1)/100-100,id:n})}function oD(t){return"numbered"==t||"customNumbered"==t?"ol":"ul"}function iD(t,e){return`list-${t}-${e}`}function rD(t,e){const n=t.nodeBefore;if(AE(n)){let t=n;for(const{node:n}of cE(t,"backward"))if(t=n,e.has(t))return;e.set(n,t)}else{const n=t.nodeAfter;AE(n)&&e.set(n,n)}}function sD(){return(t,e,n)=>{const{writer:o,schema:i}=n;if(!e.modelRange)return;const r=Array.from(e.modelRange.getItems({shallow:!0})).filter((t=>i.checkAttribute(t,"listItemId")));if(!r.length)return;const s=wE.next(),a=function(t){let e=0,n=t.parent;for(;n;){if(tD(n))e++;else{const t=n.previousSibling;t&&tD(t)&&e++}n=n.parent}return e}(e.viewItem);let c=e.viewItem.parent&&e.viewItem.parent.is("element","ol")?"numbered":"bulleted";const l=r[0].getAttribute("listType");l&&(c=l);const d={listItemId:s,listIndent:a,listType:c};for(const t of r)t.hasAttribute("listItemId")||o.setAttributes(d,t);r.length>1&&r[1].getAttribute("listItemId")!=d.listItemId&&n.keepEmptyElement(r[0])}}function aD(){return(t,e,n)=>{if(!n.consumable.test(e.viewItem,{name:!0}))return;const o=new Ch(e.viewItem.document);for(const t of Array.from(e.viewItem.getChildren()))tD(t)||XE(t)||o.remove(t)}}function cD(t,e,n,{dataPipeline:o}={}){const i=function(t){return(e,n)=>{const o=[];for(const n of t)e.hasAttribute(n)&&o.push(`attribute:${n}`);return!!o.every((t=>!1!==n.test(e,t)))&&(o.forEach((t=>n.consume(e,t))),!0)}}(t);return(r,s,a)=>{const{writer:c,mapper:l,consumable:d}=a,u=s.item;if(!t.includes(s.attributeKey))return;if(!i(u,d))return;const h=function(t,e,n){const o=n.createRangeOn(t),i=e.toViewRange(o).getTrimmed();return i.end.nodeBefore}(u,l,n);dD(h,c,l),function(t,e){let n=t.parent;for(;n.is("attributeElement")&&["ul","ol","li"].includes(n.name);){const o=n.parent;e.unwrap(e.createRangeOn(t),n),n=o}}(h,c);const g=function(t,e,n,o,{dataPipeline:i}){let r=o.createRangeOn(e);if(!yE(t))return r;for(const s of n){if("itemMarker"!=s.scope)continue;const n=s.createElement(o,t,{dataPipeline:i});if(!n)continue;if(o.setCustomProperty("listItemMarker",!0,n),s.canInjectMarkerIntoElement&&s.canInjectMarkerIntoElement(t)?o.insert(o.createPositionAt(e,0),n):(o.insert(r.start,n),r=o.createRange(o.createPositionBefore(n),o.createPositionAfter(e))),!s.createWrapperElement||!s.canWrapElement)continue;const a=s.createWrapperElement(o,t,{dataPipeline:i});o.setCustomProperty("listItemWrapper",!0,a),s.canWrapElement(t)?r=o.wrap(r,a):(r=o.wrap(o.createRangeOn(n),a),r=o.createRange(r.start,o.createPositionAfter(e)))}return r}(u,h,e,c,{dataPipeline:o});!function(t,e,n,o){if(!t.hasAttribute("listIndent"))return;const i=t.getAttribute("listIndent");let r=t;for(let t=i;t>=0;t--){const i=nD(o,t,r.getAttribute("listItemId")),s=eD(o,t,r.getAttribute("listType"));for(const t of n)"list"!=t.scope&&"item"!=t.scope||!r.hasAttribute(t.attributeName)||t.setAttributeOnDowncast(o,r.getAttribute(t.attributeName),"list"==t.scope?s:i);if(e=o.wrap(e,i),e=o.wrap(e,s),0==t)break;if(r=aE.first(r,{lowerIndent:!0}),!r)break}}(u,g,e,c)}}function lD(t,{dataPipeline:e}={}){return(n,{writer:o})=>{if(!uD(n,t))return null;if(!e)return o.createContainerElement("span",{class:"ck-list-bogus-paragraph"});const i=o.createContainerElement("p");return o.setCustomProperty("dataPipeline:transparentRendering",!0,i),i}}function dD(t,e,n){for(;t.parent.is("attributeElement")&&t.parent.getCustomProperty("listItemWrapper");)e.unwrap(e.createRangeOn(t),t.parent);const o=[];i(e.createPositionBefore(t).getWalker({direction:"backward"})),i(e.createRangeIn(t).getWalker());for(const t of o)e.remove(t);function i(t){for(const{item:e}of t){if(e.is("element")&&n.toModelElement(e))break;e.is("element")&&e.getCustomProperty("listItemMarker")&&o.push(e)}}}function uD(t,e,n=_E(t)){if(!AE(t))return!1;for(const n of t.getAttributeKeys())if(!n.startsWith("selection:")&&!e.includes(n))return!1;return n.length<2}var hD=n(1232),gD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(hD.A,gD);hD.A.locals;var mD=n(6903),pD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(mD.A,pD);mD.A.locals;const fD=["listType","listIndent","listItemId"];class kD extends rr{constructor(t){super(t),this._downcastStrategies=[],t.config.define("list.multiBlock",!0)}static get pluginName(){return"ListEditing"}static get requires(){return[Pw,lw,JE,Yb]}init(){const t=this.editor,e=t.model,n=t.config.get("list.multiBlock");if(t.plugins.has("LegacyListEditing"))throw new _("list-feature-conflict",this,{conflictPlugin:"LegacyListEditing"});e.schema.register("$listItem",{allowAttributes:fD}),n?(e.schema.extend("$container",{allowAttributesOf:"$listItem"}),e.schema.extend("$block",{allowAttributesOf:"$listItem"}),e.schema.extend("$blockObject",{allowAttributesOf:"$listItem"})):e.schema.register("listItem",{inheritAllFrom:"$block",allowAttributesOf:"$listItem"});for(const t of fD)e.schema.setAttributeProperties(t,{copyOnReplace:!0});t.commands.add("numberedList",new YE(t,"numbered")),t.commands.add("bulletedList",new YE(t,"bulleted")),t.commands.add("customNumberedList",new YE(t,"customNumbered",{multiLevel:!0})),t.commands.add("customBulletedList",new YE(t,"customBulleted",{multiLevel:!0})),t.commands.add("indentList",new RE(t,"forward")),t.commands.add("outdentList",new RE(t,"backward")),t.commands.add("splitListItemBefore",new ZE(t,"before")),t.commands.add("splitListItemAfter",new ZE(t,"after")),n&&(t.commands.add("mergeListItemBackward",new QE(t,"backward")),t.commands.add("mergeListItemForward",new QE(t,"forward"))),this._setupDeleteIntegration(),this._setupEnterIntegration(),this._setupTabIntegration(),this._setupClipboardIntegration(),this._setupAccessibilityIntegration()}afterInit(){const t=this.editor.commands,e=t.get("indent"),n=t.get("outdent");e&&e.registerChildCommand(t.get("indentList"),{priority:"high"}),n&&n.registerChildCommand(t.get("outdentList"),{priority:"lowest"}),this._setupModelPostFixing(),this._setupConversion()}registerDowncastStrategy(t){this._downcastStrategies.push(t)}getListAttributeNames(){return[...fD,...this._downcastStrategies.map((t=>t.attributeName))]}_setupDeleteIntegration(){const t=this.editor,e=t.commands.get("mergeListItemBackward"),n=t.commands.get("mergeListItemForward");this.listenTo(t.editing.view.document,"delete",((o,i)=>{const r=t.model.document.selection;PE(t.model)||t.model.change((()=>{const s=r.getFirstPosition();if(r.isCollapsed&&"backward"==i.direction){if(!s.isAtStart)return;const n=s.parent;if(!AE(n))return;if(aE.first(n,{sameAttributes:"listType",sameIndent:!0})||0!==n.getAttribute("listIndent")){if(!e||!e.isEnabled)return;e.execute({shouldMergeOnBlocksContentLevel:bD(t.model,"backward")})}else xE(n)||t.execute("splitListItemAfter"),t.execute("outdentList");i.preventDefault(),o.stop()}else{if(r.isCollapsed&&!r.getLastPosition().isAtEnd)return;if(!n||!n.isEnabled)return;n.execute({shouldMergeOnBlocksContentLevel:bD(t.model,"forward")}),i.preventDefault(),o.stop()}}))}),{context:"li"})}_setupEnterIntegration(){const t=this.editor,e=t.model,n=t.commands,o=n.get("enter");this.listenTo(t.editing.view.document,"enter",((n,o)=>{const i=e.document,r=i.selection.getFirstPosition().parent;if(i.selection.isCollapsed&&AE(r)&&r.isEmpty&&!o.isSoft){const e=yE(r),i=xE(r);e&&i?(t.execute("outdentList"),o.preventDefault(),n.stop()):e&&!i?(t.execute("splitListItemAfter"),o.preventDefault(),n.stop()):i&&(t.execute("splitListItemBefore"),o.preventDefault(),n.stop())}}),{context:"li"}),this.listenTo(o,"afterExecute",(()=>{const e=n.get("splitListItemBefore");if(e.refresh(),!e.isEnabled)return;2===_E(t.model.document.selection.getLastPosition().parent).length&&e.execute()}))}_setupTabIntegration(){const t=this.editor;this.listenTo(t.editing.view.document,"tab",((e,n)=>{const o=n.shiftKey?"outdentList":"indentList";this.editor.commands.get(o).isEnabled&&(t.execute(o),n.stopPropagation(),n.preventDefault(),e.stop())}),{context:"li"})}_setupConversion(){const t=this.editor,e=t.model,n=this.getListAttributeNames(),o=t.config.get("list.multiBlock"),i=o?"paragraph":"listItem";t.conversion.for("upcast").elementToElement({view:"li",model:(t,{writer:e})=>e.createElement(i,{listType:""})}).elementToElement({view:"p",model:(t,{writer:e})=>t.parent&&t.parent.is("element","li")?e.createElement(i,{listType:""}):null,converterPriority:"high"}).add((t=>{t.on("element:li",sD()),t.on("element:ul",aD(),{priority:"high"}),t.on("element:ol",aD(),{priority:"high"})})),o||t.conversion.for("downcast").elementToElement({model:"listItem",view:"p"}),t.conversion.for("editingDowncast").elementToElement({model:i,view:lD(n),converterPriority:"high"}).add((t=>{var o;t.on("attribute",cD(n,this._downcastStrategies,e)),t.on("remove",(o=e.schema,(t,e,n)=>{const{writer:i,mapper:r}=n,s=t.name.split(":")[1];if(!o.checkAttribute(s,"listItemId"))return;const a=r.toViewPosition(e.position),c=e.position.getShiftedBy(e.length),l=r.toViewPosition(c,{isPhantom:!0}),d=i.createRange(a,l).getTrimmed().end.nodeBefore;d&&dD(d,i,r)}))})),t.conversion.for("dataDowncast").elementToElement({model:i,view:lD(n,{dataPipeline:!0}),converterPriority:"high"}).add((t=>{t.on("attribute",cD(n,this._downcastStrategies,e,{dataPipeline:!0}))}));const r=(s=this._downcastStrategies,a=t.editing.view,(t,e)=>{if(e.modelPosition.offset>0)return;const n=e.modelPosition.parent;if(!AE(n))return;if(!s.some((t=>"itemMarker"==t.scope&&t.canInjectMarkerIntoElement&&t.canInjectMarkerIntoElement(n))))return;const o=e.mapper.toViewElement(n),i=a.createRangeIn(o),r=i.getWalker();let c=i.start;for(const{item:t}of r){if(t.is("element")&&e.mapper.toModelElement(t)||t.is("$textProxy"))break;t.is("element")&&t.getCustomProperty("listItemMarker")&&(c=a.createPositionAfter(t),r.skip((({previousPosition:t})=>!t.isEqual(c))))}e.viewPosition=c});var s,a;t.editing.mapper.on("modelToViewPosition",r),t.data.mapper.on("modelToViewPosition",r),this.listenTo(e.document,"change:data",function(t,e,n,o){return()=>{const o=t.document.differ.getChanges(),s=[],a=new Map,c=new Set;for(const t of o)if("insert"==t.type&&"$text"!=t.name)rD(t.position,a),t.attributes.has("listItemId")?c.add(t.position.nodeAfter):rD(t.position.getShiftedBy(t.length),a);else if("remove"==t.type&&t.attributes.has("listItemId"))rD(t.position,a);else if("attribute"==t.type){const e=t.range.start.nodeAfter;n.includes(t.attributeKey)?(rD(t.range.start,a),null===t.attributeNewValue?(rD(t.range.start.getShiftedBy(1),a),r(e)&&s.push(e)):c.add(e)):AE(e)&&r(e)&&s.push(e)}for(const t of a.values())s.push(...i(t,c));for(const t of new Set(s))e.reconvertItem(t)};function i(t,e){const o=[],i=new Set,a=[];for(const{node:c,previous:l}of cE(t,"forward")){if(i.has(c))continue;const t=c.getAttribute("listIndent");l&&tn.includes(t))));const d=CE(c,{direction:"forward"});for(const t of d)i.add(t),(r(t,d)||s(t,a,e))&&o.push(t)}return o}function r(t,i){const r=e.mapper.toViewElement(t);if(!r)return!1;if(o.fire("checkElement",{modelElement:t,viewElement:r}))return!0;if(!t.is("element","paragraph")&&!t.is("element","listItem"))return!1;const s=uD(t,n,i);return!(!s||!r.is("element","p"))||!(s||!r.is("element","span"))}function s(t,n,i){if(i.has(t))return!1;const r=e.mapper.toViewElement(t);let s=n.length-1;for(let t=r.parent;!t.is("editableElement");t=t.parent){const e=tD(t),i=XE(t);if(!i&&!e)continue;const r="checkAttributes:"+(e?"item":"list");if(o.fire(r,{viewElement:t,modelAttributes:n[s]}))break;if(i&&(s--,s<0))return!1}return!0}}(e,t.editing,n,this),{priority:"high"}),this.on("checkAttributes:item",((t,{viewElement:e,modelAttributes:n})=>{e.id!=n.listItemId&&(t.return=!0,t.stop())})),this.on("checkAttributes:list",((t,{viewElement:e,modelAttributes:n})=>{e.name==oD(n.listType)&&e.id==iD(n.listType,n.listIndent)||(t.return=!0,t.stop())}))}_setupModelPostFixing(){const t=this.editor.model,e=this.getListAttributeNames();t.document.registerPostFixer((n=>function(t,e,n,o){const i=t.document.differ.getChanges(),r=new Map,s=o.editor.config.get("list.multiBlock");let a=!1;for(const o of i){if("insert"==o.type&&"$text"!=o.name){const i=o.position.nodeAfter;if(!t.schema.checkAttribute(i,"listItemId"))for(const t of Array.from(i.getAttributeKeys()))n.includes(t)&&(e.removeAttribute(t,i),a=!0);rD(o.position,r),o.attributes.has("listItemId")||rD(o.position.getShiftedBy(o.length),r);for(const{item:e,previousPosition:n}of t.createRangeIn(i))AE(e)&&rD(n,r)}else"remove"==o.type?rD(o.position,r):"attribute"==o.type&&n.includes(o.attributeKey)&&(rD(o.range.start,r),null===o.attributeNewValue&&rD(o.range.start.getShiftedBy(1),r));if(!s&&"attribute"==o.type&&fD.includes(o.attributeKey)){const t=o.range.start.nodeAfter;null===o.attributeNewValue&&t&&t.is("element","listItem")?(e.rename(t,"paragraph"),a=!0):null===o.attributeOldValue&&t&&t.is("element")&&"listItem"!=t.name&&(e.rename(t,"listItem"),a=!0)}}const c=new Set;for(const t of r.values())a=o.fire("postFixer",{listNodes:new lE(t),listHead:t,writer:e,seenIds:c})||a;return a}(t,n,e,this))),this.on("postFixer",((t,{listNodes:e,writer:n})=>{t.return=function(t,e){let n=0,o=-1,i=null,r=!1;for(const{node:s}of t){const t=s.getAttribute("listIndent");if(t>n){let a;null===i?(i=t-n,a=n):(i>t&&(i=t),a=t-i),a>o+1&&(a=o+1),e.setAttribute("listIndent",a,s),r=!0,o=a}else i=null,n=t+1,o=t}return r}(e,n)||t.return}),{priority:"high"}),this.on("postFixer",((t,{listNodes:e,writer:n,seenIds:o})=>{t.return=function(t,e,n){const o=new Set;let i=!1;for(const{node:r}of t){if(o.has(r))continue;let t=r.getAttribute("listType"),s=r.getAttribute("listItemId");if(e.has(s)&&(s=wE.next()),e.add(s),r.is("element","listItem"))r.getAttribute("listItemId")!=s&&(n.setAttribute("listItemId",s,r),i=!0);else for(const e of CE(r,{direction:"forward"}))o.add(e),e.getAttribute("listType")!=t&&(s=wE.next(),t=e.getAttribute("listType")),e.getAttribute("listItemId")!=s&&(n.setAttribute("listItemId",s,e),i=!0)}return i}(e,o,n)||t.return}),{priority:"high"})}_setupClipboardIntegration(){const t=this.editor.model,e=this.editor.plugins.get("ClipboardPipeline");this.listenTo(t,"insertContent",function(t){return(e,[n,o])=>{const i=n.is("documentFragment")?Array.from(n.getChildren()):[n];if(!i.length)return;const r=(o?t.createSelection(o):t.document.selection).getFirstPosition();let s;if(AE(r.parent))s=r.parent;else{if(!AE(r.nodeBefore))return;s=r.nodeBefore}t.change((t=>{const e=s.getAttribute("listType"),n=s.getAttribute("listIndent"),o=i[0].getAttribute("listIndent")||0,r=Math.max(n-o,0);for(const n of i){const o=AE(n);s.is("element","listItem")&&n.is("element","paragraph")&&t.rename(n,"listItem"),t.setAttributes({listIndent:(o?n.getAttribute("listIndent"):0)+r,listItemId:o?n.getAttribute("listItemId"):wE.next(),listType:e},n)}}))}}(t),{priority:"high"}),this.listenTo(e,"outputTransformation",((e,n)=>{t.change((t=>{const e=Array.from(n.content.getChildren()),o=e[e.length-1];if(e.length>1&&o.is("element")&&o.isEmpty){e.slice(0,-1).every(AE)&&t.remove(o)}if("copy"==n.method||"cut"==n.method){const e=Array.from(n.content.getChildren());BE(e)&&SE(e,t)}}))}))}_setupAccessibilityIntegration(){const t=this.editor,e=t.t;t.accessibility.addKeystrokeInfoGroup({id:"list",label:e("Keystrokes that can be used in a list"),keystrokes:[{label:e("Increase list item indent"),keystroke:"Tab"},{label:e("Decrease list item indent"),keystroke:"Shift+Tab"}]})}}function bD(t,e){const n=t.document.selection;if(!n.isCollapsed)return!PE(t);if("forward"===e)return!0;const o=n.getFirstPosition().parent,i=o.previousSibling;return!t.schema.isObject(i)&&(!!i.isEmpty||BE([o,i]))}function wD(t,e,n,o){t.ui.componentFactory.add(e,(()=>{const i=AD(Ig,t,e,n,o);return i.set({tooltip:!0,isToggleable:!0}),i})),t.ui.componentFactory.add(`menuBar:${e}`,(()=>AD(Wk,t,e,n,o)))}function AD(t,e,n,o,i){const r=e.commands.get(n),s=new t(e.locale);return s.set({label:o,icon:i}),s.bind("isOn","isEnabled").to(r,"value","isEnabled"),s.on("execute",(()=>{e.execute(n),e.editing.view.focus()})),s}class _D extends rr{static get pluginName(){return"ListUI"}init(){const t=this.editor.t;wD(this.editor,"numberedList",t("Numbered List"),jh.numberedList),wD(this.editor,"bulletedList",t("Bulleted List"),jh.bulletedList)}}class CD extends rr{static get requires(){return[kD,_D]}static get pluginName(){return"List"}}const vD={},yD={},xD={},ED=[{listStyle:"disc",typeAttribute:"disc",listType:"bulleted"},{listStyle:"circle",typeAttribute:"circle",listType:"bulleted"},{listStyle:"square",typeAttribute:"square",listType:"bulleted"},{listStyle:"decimal",typeAttribute:"1",listType:"numbered"},{listStyle:"decimal-leading-zero",typeAttribute:null,listType:"numbered"},{listStyle:"lower-roman",typeAttribute:"i",listType:"numbered"},{listStyle:"upper-roman",typeAttribute:"I",listType:"numbered"},{listStyle:"lower-alpha",typeAttribute:"a",listType:"numbered"},{listStyle:"upper-alpha",typeAttribute:"A",listType:"numbered"},{listStyle:"lower-latin",typeAttribute:"a",listType:"numbered"},{listStyle:"upper-latin",typeAttribute:"A",listType:"numbered"}];for(const{listStyle:t,typeAttribute:e,listType:n}of ED)vD[t]=n,yD[t]=e,e&&(xD[e]=t);var DD=n(9968),ID={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(DD.A,ID);DD.A.locals;var MD=n(7141),TD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(MD.A,TD);MD.A.locals;Object.defineProperty,Object.defineProperties,Object.getOwnPropertyDescriptors,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;Object.defineProperty,Object.getOwnPropertySymbols,Object.prototype.hasOwnProperty,Object.prototype.propertyIsEnumerable;_i("Ctrl+Enter");var SD=n(8991),BD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(SD.A,BD);SD.A.locals;_i("Ctrl+Enter");function ND(t,e){const n=(n,o,i)=>{if(!i.consumable.consume(o.item,n.name))return;const r=o.attributeNewValue,s=i.writer,a=i.mapper.toViewElement(o.item),c=[...a.getChildren()].find((t=>t.getCustomProperty("media-content")));s.remove(c);const l=t.getMediaViewElement(s,r,e);s.insert(s.createPositionAt(a,0),l)};return t=>{t.on("attribute:url:media",n)}}function PD(t,e,n,o){return t.createContainerElement("figure",{class:"media"},[e.getMediaViewElement(t,n,o),t.createSlot()])}function OD(t){const e=t.getSelectedElement();return e&&e.is("element","media")?e:null}function LD(t,e,n,o){t.change((i=>{const r=i.createElement("media",{url:e});t.insertObject(r,n,null,{setSelection:"on",findOptimalPosition:o?"auto":void 0})}))}class zD extends ar{refresh(){const t=this.editor.model,e=t.document.selection,n=OD(e);this.value=n?n.getAttribute("url"):void 0,this.isEnabled=function(t){const e=t.getSelectedElement();return!!e&&"media"===e.name}(e)||function(t,e){const n=Jw(t,e);let o=n.start.parent;o.isEmpty&&!e.schema.isLimit(o)&&(o=o.parent);return e.schema.checkChild(o,"media")}(e,t)}execute(t){const e=this.editor.model,n=e.document.selection,o=OD(n);o?e.change((e=>{e.setAttribute("url",t,o)})):LD(e,t,n,!0)}}class RD{constructor(t,e){const n=e.providers,o=e.extraProviders||[],i=new Set(e.removeProviders),r=n.concat(o).filter((t=>{const e=t.name;return e?!i.has(e):(C("media-embed-no-provider-name",{provider:t}),!1)}));this.locale=t,this.providerDefinitions=r}hasMedia(t){return!!this._getMedia(t)}getMediaViewElement(t,e,n){return this._getMedia(e).getViewElement(t,n)}_getMedia(t){if(!t)return new jD(this.locale);t=t.trim();for(const e of this.providerDefinitions){const n=e.html,o=yi(e.url);for(const e of o){const o=this._getUrlMatches(t,e);if(o)return new jD(this.locale,t,o,n)}}return null}_getUrlMatches(t,e){let n=t.match(e);if(n)return n;let o=t.replace(/^https?:\/\//,"");return n=o.match(e),n||(o=o.replace(/^www\./,""),n=o.match(e),n||null)}}class jD{constructor(t,e,n,o){this.url=this._getValidUrl(e),this._locale=t,this._match=n,this._previewRenderer=o}getViewElement(t,e){const n={};let o;if(e.renderForEditingView||e.renderMediaPreview&&this.url&&this._previewRenderer){this.url&&(n["data-oembed-url"]=this.url),e.renderForEditingView&&(n.class="ck-media__wrapper");const i=this._getPreviewHtml(e);o=t.createRawElement("div",n,((t,e)=>{e.setContentOf(t,i)}))}else this.url&&(n.url=this.url),o=t.createEmptyElement(e.elementName,n);return t.setCustomProperty("media-content",!0,o),o}_getPreviewHtml(t){return this._previewRenderer?this._previewRenderer(this._match):this.url&&t.renderForEditingView?this._getPlaceholderHtml():""}_getPlaceholderHtml(){const t=new yg,e=this._locale.t;t.content='',t.viewBox="0 0 64 42";return new Vh({tag:"div",attributes:{class:"ck ck-reset_all ck-media__placeholder"},children:[{tag:"div",attributes:{class:"ck-media__placeholder__icon"},children:[t]},{tag:"a",attributes:{class:"ck-media__placeholder__url",target:"_blank",rel:"noopener noreferrer",href:this.url,"data-cke-tooltip-text":e("Open media in new tab")},children:[{tag:"span",attributes:{class:"ck-media__placeholder__url__text"},children:[this.url]}]}]}).render().outerHTML}_getValidUrl(t){return t?t.match(/^https?/)?t:"https://"+t:null}}var FD=n(7048),VD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(FD.A,VD);FD.A.locals;class HD extends rr{constructor(t){super(t),t.config.define("mediaEmbed",{elementName:"oembed",providers:[{name:"dailymotion",url:[/^dailymotion\.com\/video\/(\w+)/,/^dai.ly\/(\w+)/],html:t=>`
`},{name:"spotify",url:[/^open\.spotify\.com\/(artist\/\w+)/,/^open\.spotify\.com\/(album\/\w+)/,/^open\.spotify\.com\/(track\/\w+)/],html:t=>`
`},{name:"youtube",url:[/^(?:m\.)?youtube\.com\/watch\?v=([\w-]+)(?:&t=(\d+))?/,/^(?:m\.)?youtube\.com\/v\/([\w-]+)(?:\?t=(\d+))?/,/^youtube\.com\/embed\/([\w-]+)(?:\?start=(\d+))?/,/^youtu\.be\/([\w-]+)(?:\?t=(\d+))?/],html:t=>{const e=t[1],n=t[2];return`
`}},{name:"vimeo",url:[/^vimeo\.com\/(\d+)/,/^vimeo\.com\/[^/]+\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/album\/[^/]+\/video\/(\d+)/,/^vimeo\.com\/channels\/[^/]+\/(\d+)/,/^vimeo\.com\/groups\/[^/]+\/videos\/(\d+)/,/^vimeo\.com\/ondemand\/[^/]+\/(\d+)/,/^player\.vimeo\.com\/video\/(\d+)/],html:t=>`
`},{name:"instagram",url:/^instagram\.com\/p\/(\w+)/},{name:"twitter",url:/^twitter\.com/},{name:"googleMaps",url:[/^google\.com\/maps/,/^goo\.gl\/maps/,/^maps\.google\.com/,/^maps\.app\.goo\.gl/]},{name:"flickr",url:/^flickr\.com/},{name:"facebook",url:/^facebook\.com/}]}),this.registry=new RD(t.locale,t.config.get("mediaEmbed"))}static get pluginName(){return"MediaEmbedEditing"}init(){const t=this.editor,e=t.model.schema,n=t.t,o=t.conversion,i=t.config.get("mediaEmbed.previewsInData"),r=t.config.get("mediaEmbed.elementName"),s=this.registry;t.commands.add("mediaEmbed",new zD(t)),e.register("media",{inheritAllFrom:"$blockObject",allowAttributes:["url"]}),o.for("dataDowncast").elementToStructure({model:"media",view:(t,{writer:e})=>{const n=t.getAttribute("url");return PD(e,s,n,{elementName:r,renderMediaPreview:!!n&&i})}}),o.for("dataDowncast").add(ND(s,{elementName:r,renderMediaPreview:i})),o.for("editingDowncast").elementToStructure({model:"media",view:(t,{writer:e})=>{const o=t.getAttribute("url");return function(t,e,n){return e.setCustomProperty("media",!0,t),Kw(t,e,{label:n})}(PD(e,s,o,{elementName:r,renderForEditingView:!0}),e,n("media widget"))}}),o.for("editingDowncast").add(ND(s,{elementName:r,renderForEditingView:!0})),o.for("upcast").elementToElement({view:t=>["oembed",r].includes(t.name)&&t.getAttribute("url")?{name:!0}:null,model:(t,{writer:e})=>{const n=t.getAttribute("url");return s.hasMedia(n)?e.createElement("media",{url:n}):null}}).elementToElement({view:{name:"div",attributes:{"data-oembed-url":!0}},model:(t,{writer:e})=>{const n=t.getAttribute("data-oembed-url");return s.hasMedia(n)?e.createElement("media",{url:n}):null}}).add((t=>{t.on("element:figure",((t,e,n)=>{if(!n.consumable.consume(e.viewItem,{name:!0,classes:"media"}))return;const{modelRange:o,modelCursor:i}=n.convertChildren(e.viewItem,e.modelCursor);e.modelRange=o,e.modelCursor=i;Qi(o.getItems())||n.consumable.revert(e.viewItem,{name:!0,classes:"media"})}))}))}}const UD=/^(?:http(s)?:\/\/)?[\w-]+\.[\w-.~:/?#[\]@!$&'()*+,;=%]+$/;class qD extends rr{constructor(t){super(t),this._timeoutId=null,this._positionToInsert=null}static get requires(){return[qA,lw,l_]}static get pluginName(){return"AutoMediaEmbed"}init(){const t=this.editor,e=t.model.document,n=t.plugins.get("ClipboardPipeline");this.listenTo(n,"inputTransformation",(()=>{const t=e.selection.getFirstRange(),n=uu.fromPosition(t.start);n.stickiness="toPrevious";const o=uu.fromPosition(t.end);o.stickiness="toNext",e.once("change:data",(()=>{this._embedMediaBetweenPositions(n,o),n.detach(),o.detach()}),{priority:"high"})}));t.commands.get("undo").on("execute",(()=>{this._timeoutId&&(Lo.window.clearTimeout(this._timeoutId),this._positionToInsert.detach(),this._timeoutId=null,this._positionToInsert=null)}),{priority:"high"})}_embedMediaBetweenPositions(t,e){const n=this.editor,o=n.plugins.get(HD).registry,i=new hl(t,e),r=i.getWalker({ignoreElementEnd:!0});let s="";for(const t of r)t.item.is("$textProxy")&&(s+=t.item.data);if(s=s.trim(),!s.match(UD))return void i.detach();if(!o.hasMedia(s))return void i.detach();n.commands.get("mediaEmbed").isEnabled?(this._positionToInsert=uu.fromPosition(t),this._timeoutId=Lo.window.setTimeout((()=>{n.model.change((t=>{this._timeoutId=null,t.remove(i),i.detach();let e=null;"$graveyard"!==this._positionToInsert.root.rootName&&(e=this._positionToInsert),LD(n.model,s,e,!1),this._positionToInsert.detach(),this._positionToInsert=null})),n.plugins.get(lw).requestUndoOnBackspace()}),100)):i.detach()}}var GD=n(5651),WD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(GD.A,WD);GD.A.locals;class KD extends dg{constructor(t,e){super(e);const n=e.t;this.focusTracker=new Zi,this.keystrokes=new Ji,this.set("mediaURLInputValue",""),this.urlInputView=this._createUrlInput(),this.saveButtonView=this._createButton(n("Save"),jh.check,"ck-button-save"),this.saveButtonView.type="submit",this.saveButtonView.bind("isEnabled").to(this,"mediaURLInputValue",(t=>!!t)),this.cancelButtonView=this._createButton(n("Cancel"),jh.cancel,"ck-button-cancel","cancel"),this._focusables=new Fh,this._focusCycler=new nm({focusables:this._focusables,focusTracker:this.focusTracker,keystrokeHandler:this.keystrokes,actions:{focusPrevious:"shift + tab",focusNext:"tab"}}),this._validators=t,this.setTemplate({tag:"form",attributes:{class:["ck","ck-media-form","ck-responsive-form"],tabindex:"-1"},children:[this.urlInputView,this.saveButtonView,this.cancelButtonView]})}render(){super.render(),i({view:this});[this.urlInputView,this.saveButtonView,this.cancelButtonView].forEach((t=>{this._focusables.add(t),this.focusTracker.add(t.element)})),this.keystrokes.listenTo(this.element);const t=t=>t.stopPropagation();this.keystrokes.set("arrowright",t),this.keystrokes.set("arrowleft",t),this.keystrokes.set("arrowup",t),this.keystrokes.set("arrowdown",t)}destroy(){super.destroy(),this.focusTracker.destroy(),this.keystrokes.destroy()}focus(){this._focusCycler.focusFirst()}get url(){return this.urlInputView.fieldView.element.value.trim()}set url(t){this.urlInputView.fieldView.element.value=t.trim()}isValid(){this.resetFormStatus();for(const t of this._validators){const e=t(this);if(e)return this.urlInputView.errorText=e,!1}return!0}resetFormStatus(){this.urlInputView.errorText=null,this.urlInputView.infoText=this._urlInputViewInfoDefault}_createUrlInput(){const t=this.locale.t,e=new Hg(this.locale,Hm),n=e.fieldView;return this._urlInputViewInfoDefault=t("Paste the media URL in the input."),this._urlInputViewInfoTip=t("Tip: Paste the URL into the content to embed faster."),e.label=t("Media URL"),e.infoText=this._urlInputViewInfoDefault,n.on("input",(()=>{e.infoText=n.element.value?this._urlInputViewInfoTip:this._urlInputViewInfoDefault,this.mediaURLInputValue=n.element.value.trim()})),e}_createButton(t,e,n,o){const i=new Ig(this.locale);return i.set({label:t,icon:e,tooltip:!0}),i.extendTemplate({attributes:{class:n}}),o&&i.delegate("execute").to(this,o),i}}class $D extends rr{static get requires(){return[HD]}static get pluginName(){return"MediaEmbedUI"}init(){const t=this.editor,e=t.commands.get("mediaEmbed");t.ui.componentFactory.add("mediaEmbed",(t=>{const n=Om(t);return this._setUpDropdown(n,e),n}))}_setUpDropdown(t,n){const o=this.editor,i=o.t,r=t.buttonView,s=o.plugins.get(HD).registry;t.once("change:isOpen",(()=>{const i=new(e(KD))(function(t,e){return[e=>{if(!e.url.length)return t("The URL must not be empty.")},n=>{if(!e.hasMedia(n.url))return t("This media URL is not supported.")}]}(o.t,s),o.locale);t.panelView.children.add(i),r.on("open",(()=>{i.disableCssTransitions(),i.url=n.value||"",i.urlInputView.fieldView.select(),i.enableCssTransitions()}),{priority:"low"}),t.on("submit",(()=>{i.isValid()&&(o.execute("mediaEmbed",i.url),o.editing.view.focus())})),t.on("change:isOpen",(()=>i.resetFormStatus())),t.on("cancel",(()=>{o.editing.view.focus()})),i.delegate("submit","cancel").to(t),i.urlInputView.fieldView.bind("value").to(n,"value"),i.urlInputView.bind("isEnabled").to(n,"isEnabled")})),t.bind("isEnabled").to(n),r.set({label:i("Insert media"),icon:'',tooltip:!0})}}var YD=n(70),QD={injectType:"singletonStyleTag",attributes:{"data-cke":!0},insert:"head",singleton:!0};br()(YD.A,QD);YD.A.locals;function ZD(t){return void 0!==t&&t.endsWith("px")}function JD(t){return t.toFixed(2).replace(/\.?0+$/,"")+"px"}var XD=Object.defineProperty,tI=Object.defineProperties,eI=Object.getOwnPropertyDescriptors,nI=Object.getOwnPropertySymbols,oI=Object.prototype.hasOwnProperty,iI=Object.prototype.propertyIsEnumerable,rI=(t,e,n)=>e in t?XD(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,sI=(t,e)=>{for(var n in e||(e={}))oI.call(e,n)&&rI(t,n,e[n]);if(nI)for(var n of nI(e))iI.call(e,n)&&rI(t,n,e[n]);return t};function aI(t,e,n){if(!t.childCount)return;const o=new Ch(t.document),i=function(t,e){const n=e.createRangeIn(t),o=[],i=new Set;for(const t of n.getItems()){if(!t.is("element")||!t.name.match(/^(p|h\d+|li|div)$/))continue;let e=pI(t);if(void 0===e||0!=parseFloat(e)||Array.from(t.getClassNames()).find((t=>t.startsWith("MsoList")))||(e=void 0),t.hasStyle("mso-list")||void 0!==e&&i.has(e)){const n=gI(t);o.push({element:t,id:n.id,order:n.order,indent:n.indent,marginLeft:e}),void 0!==e&&i.add(e)}else i.clear()}return o}(t,o);if(!i.length)return;const r={},s=[];for(const t of i)if(void 0!==t.indent){cI(t)||(s.length=0);const i=`${t.id}:${t.indent}`,c=Math.min(t.indent-1,s.length);if(cs.length-1||s[c].listElement.name!=l.type){0==c&&"ol"==l.type&&void 0!==t.id&&r[i]&&(l.startIndex=r[i]);const e=hI(l,o,n);if(ZD(t.marginLeft)&&(0==c||ZD(s[c-1].marginLeft))){let n=t.marginLeft;c>0&&(n=JD(parseFloat(n)-parseFloat(s[c-1].marginLeft))),o.setStyle("padding-left",n,e)}if(0==s.length){const n=t.element.parent,i=n.getChildIndex(t.element)+1;o.insertChild(i,e,n)}else{const t=s[c-1].listItemElements;o.appendChild(e,t[t.length-1])}s[c]=(a=sI({},t),tI(a,eI({listElement:e,listItemElements:[]}))),0==c&&void 0!==t.id&&(r[i]=l.startIndex||1)}}const l="li"==t.element.name?t.element:o.createElement("li");o.appendChild(l,s[c].listElement),s[c].listItemElements.push(l),0==c&&void 0!==t.id&&r[i]++,t.element!=l&&o.appendChild(t.element,l),mI(t.element,o),o.removeStyle("text-indent",t.element),o.removeStyle("margin-left",t.element)}else{const e=s.find((e=>e.marginLeft==t.marginLeft));if(e){const n=e.listItemElements;o.appendChild(t.element,n[n.length-1]),o.removeStyle("margin-left",t.element)}else s.length=0}var a}function cI(t){const e=t.element.previousSibling;return lI(e||t.element.parent)}function lI(t){return t.is("element","ol")||t.is("element","ul")}function dI(t,e){const n=new RegExp(`@list l${t.id}:level${t.indent}\\s*({[^}]*)`,"gi"),o=/mso-level-number-format:([^;]{0,100});/gi,i=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,r=new RegExp(`@list\\s+l${t.id}:level\\d\\s*{[^{]*mso-level-text:"%\\d\\\\.`,"gi"),s=new RegExp(`@list l${t.id}:level\\d\\s*{[^{]*mso-level-number-format:`,"gi"),a=r.exec(e),c=s.exec(e),l=a&&!c,d=n.exec(e);let u="decimal",h="ol",g=null;if(d&&d[1]){const e=o.exec(d[1]);if(e&&e[1]&&(u=e[1].trim(),h="bullet"!==u&&"image"!==u?"ol":"ul"),"bullet"===u){const e=function(t){if("li"==t.name&&"ul"==t.parent.name&&t.parent.hasAttribute("type"))return t.parent.getAttribute("type");const e=function(t){if(t.getChild(0).is("$text"))return null;for(const e of t.getChildren()){if(!e.is("element","span"))continue;const t=e.getChild(0);if(t)return t.is("$text")?t:t.getChild(0)}return null}(t);if(!e)return null;const n=e._data;if("o"===n)return"circle";if("·"===n)return"disc";if("§"===n)return"square";return null}(t.element);e&&(u=e)}else{const t=i.exec(d[1]);t&&t[1]&&(g=parseInt(t[1]))}l&&(h="ol")}return{type:h,startIndex:g,style:uI(u),isLegalStyleList:l}}function uI(t){if(t.startsWith("arabic-leading-zero"))return"decimal-leading-zero";switch(t){case"alpha-upper":return"upper-alpha";case"alpha-lower":return"lower-alpha";case"roman-upper":return"upper-roman";case"roman-lower":return"lower-roman";case"circle":case"disc":case"square":return t;default:return null}}function hI(t,e,n){const o=e.createElement(t.type);return t.style&&e.setStyle("list-style-type",t.style,o),t.startIndex&&t.startIndex>1&&e.setAttribute("start",t.startIndex,o),t.isLegalStyleList&&n&&e.addClass("legal-list",o),o}function gI(t){const e=t.getStyle("mso-list");if(void 0===e)return{};const n=e.match(/(^|\s{1,100})l(\d+)/i),o=e.match(/\s{0,100}lfo(\d+)/i),i=e.match(/\s{0,100}level(\d+)/i);return n&&o&&i?{id:n[2],order:o[1],indent:parseInt(i[1])}:{indent:1}}function mI(t,e){const n=new Or({name:"span",styles:{"mso-list":"Ignore"}}),o=e.createRangeIn(t);for(const t of o)"elementStart"===t.type&&n.match(t.item)&&e.remove(t.item)}function pI(t){const e=t.getStyle("margin-left");return void 0===e||e.endsWith("px")?e:function(t){const e=parseFloat(t);return t.endsWith("pt")?JD(96*e/72):t.endsWith("pc")?JD(12*e*96/72):t.endsWith("in")?JD(96*e):t.endsWith("cm")?JD(96*e/2.54):t.endsWith("mm")?JD(e/10*96/2.54):t}(e)}function fI(t,e){if(!t.childCount)return;const n=new Ch(t.document),o=function(t,e){const n=e.createRangeIn(t),o=new Or({name:/v:(.+)/}),i=[];for(const t of n){if("elementStart"!=t.type)continue;const e=t.item,n=e.previousSibling,r=n&&n.is("element")?n.name:null,s=["Chart"],a=o.match(e),c=e.getAttribute("o:gfxdata"),l="v:shapetype"===r,d=c&&s.some((t=>e.getAttribute("id").includes(t)));a&&c&&!l&&!d&&i.push(t.item.getAttribute("id"))}return i}(t,n);!function(t,e,n){const o=n.createRangeIn(e),i=new Or({name:"img"}),r=[];for(const e of o)if(e.item.is("element")&&i.match(e.item)){const n=e.item,o=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];o.length&&o.every((e=>t.indexOf(e)>-1))?r.push(n):n.getAttribute("src")||r.push(n)}for(const t of r)n.remove(t)}(o,t,n),function(t,e,n){const o=n.createRangeIn(e),i=[];for(const e of o)if("elementStart"==e.type&&e.item.is("element","v:shape")){const n=e.item.getAttribute("id");if(t.includes(n))continue;r(e.item.parent.getChildren(),n)||i.push(e.item)}for(const t of i){const e={src:s(t)};t.hasAttribute("alt")&&(e.alt=t.getAttribute("alt"));const o=n.createElement("img",e);n.insertChild(t.index+1,o,t.parent)}function r(t,e){for(const n of t)if(n.is("element")){if("img"==n.name&&n.getAttribute("v:shapes")==e)return!0;if(r(n.getChildren(),e))return!0}return!1}function s(t){for(const e of t.getChildren())if(e.is("element")&&e.getAttribute("src"))return e.getAttribute("src")}}(o,t,n),function(t,e){const n=e.createRangeIn(t),o=new Or({name:/v:(.+)/}),i=[];for(const t of n)"elementStart"==t.type&&o.match(t.item)&&i.push(t.item);for(const t of i)e.remove(t)}(t,n);const i=function(t,e){const n=e.createRangeIn(t),o=new Or({name:"img"}),i=[];for(const t of n)t.item.is("element")&&o.match(t.item)&&t.item.getAttribute("src").startsWith("file://")&&i.push(t.item);return i}(t,n);i.length&&function(t,e,n){if(t.length===e.length)for(let o=0;oString.fromCharCode(parseInt(t,16)))).join(""))}const bI=//i,wI=/xmlns:o="urn:schemas-microsoft-com/i;class AI{constructor(t,e=!1){this.document=t,this.hasMultiLevelListPlugin=e}isActive(t){return bI.test(t)||wI.test(t)}execute(t){const{body:e,stylesString:n}=t._parsedData;aI(e,n,this.hasMultiLevelListPlugin),fI(e,t.dataTransfer.getData("text/rtf")),function(t){const e=[],n=new Ch(t.document);for(const{item:o}of n.createRangeIn(t))if(o.is("element")){for(const t of o.getClassNames())/\bmso/gi.exec(t)&&n.removeClass(t,o);for(const t of o.getStyleNames())/\bmso/gi.exec(t)&&n.removeStyle(t,o);(o.is("element","w:sdt")||o.is("element","w:sdtpr")&&o.isEmpty||o.is("element","o:p")&&o.isEmpty)&&e.push(o)}for(const t of e){const e=t.parent,o=e.getChildIndex(t);n.insertChild(o,t.getChildren(),e),n.remove(t)}}(e),t.content=e}}function _I(t,e,n,{blockElements:o,inlineObjectElements:i}){let r=n.createPositionAt(t,"forward"==e?"after":"before");return r=r.getLastMatchingPosition((({item:t})=>t.is("element")&&!o.includes(t.name)&&!i.includes(t.name)),{direction:e}),"forward"==e?r.nodeAfter:r.nodeBefore}function CI(t,e){return!!t&&t.is("element")&&e.includes(t.name)}const vI=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class yI{constructor(t){this.document=t}isActive(t){return vI.test(t)}execute(t){const e=new Ch(this.document),{body:n}=t._parsedData;!function(t,e){for(const n of t.getChildren())if(n.is("element","b")&&"normal"===n.getStyle("font-weight")){const o=t.getChildIndex(n);e.remove(n),e.insertChild(o,n.getChildren(),t)}}(n,e),function(t,e){for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","li")){const n=t.getChild(0);n&&n.is("element","p")&&e.unwrapElement(n)}}}(n,e),function(t,e){const n=new Os(e.document.stylesProcessor),o=new Ea(n,{renderingMode:"data"}),i=o.blockElements,r=o.inlineObjectElements,s=[];for(const n of e.createRangeIn(t)){const t=n.item;if(t.is("element","br")){const n=_I(t,"forward",e,{blockElements:i,inlineObjectElements:r}),o=_I(t,"backward",e,{blockElements:i,inlineObjectElements:r}),a=CI(n,i);(CI(o,i)||a)&&s.push(t)}}for(const t of s)t.hasClass("Apple-interchange-newline")?e.remove(t):e.replace(t,e.createElement("p"))}(n,e),t.content=n}}const xI=/(\s+)<\/span>/g,((t,e)=>1===e.length?" ":Array(e.length+1).join("  ").substr(0,e.length)))}function II(t,e){const n=new DOMParser,o=function(t){return DI(DI(t)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/()[\r\n]+(<\/span>)/g,"$1 $2").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(t){const e="",n="",o=t.indexOf(e);if(o<0)return t;const i=t.indexOf(n,o+e.length);return t.substring(0,o+e.length)+(i>=0?t.substring(i):"")}(t=(t=t.replace(/

abc

\n\t\t\t//\n\t\t\tif ( isAttribute && this._wrapAttributeElement( wrapElement, child ) ) {\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// Wrap the child if it is not an attribute element or if it is an attribute element that should be inside\n\t\t\t// `wrapElement` (due to priority).\n\t\t\t//\n\t\t\t//

abc

-->

abc

\n\t\t\t//

abc

-->

abc

\n\t\t\telse if ( isText || !isAttribute || shouldABeOutsideB( wrapElement, child ) ) {\n\t\t\t\t// Clone attribute.\n\t\t\t\tconst newAttribute = wrapElement._clone();\n\n\t\t\t\t// Wrap current node with new attribute.\n\t\t\t\tchild._remove();\n\t\t\t\tnewAttribute._appendChild( child );\n\n\t\t\t\tparent._insertChild( i, newAttribute );\n\t\t\t\tthis._addToClonedElementsGroup( newAttribute );\n\n\t\t\t\twrapPositions.push( new Position( parent, i ) );\n\t\t\t}\n\t\t\t//\n\t\t\t// If other nested attribute is found and it wasn't wrapped (see above), continue wrapping inside it.\n\t\t\t//\n\t\t\t//

abc

-->

abc

\n\t\t\t//\n\t\t\telse /* if ( isAttribute ) */ {\n\t\t\t\tthis._wrapChildren( child, 0, child.childCount, wrapElement );\n\t\t\t}\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each wrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of wrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Unwraps children from provided `unwrapElement`. Only children contained in `parent` element between\n\t * `startOffset` and `endOffset` will be unwrapped.\n\t */\n\tprivate _unwrapChildren( parent: Element, startOffset: number, endOffset: number, unwrapElement: AttributeElement ) {\n\t\tlet i = startOffset;\n\t\tconst unwrapPositions: Array = [];\n\n\t\t// Iterate over each element between provided offsets inside parent.\n\t\t// We don't use tree walker or range iterator because we will be removing and merging potentially multiple nodes,\n\t\t// so it could get messy. It is safer to it manually in this case.\n\t\twhile ( i < endOffset ) {\n\t\t\tconst child = parent.getChild( i )!;\n\n\t\t\t// Skip all text nodes. There should be no container element's here either.\n\t\t\tif ( !child.is( 'attributeElement' ) ) {\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// (In all examples, assume that `unwrapElement` is `` element.)\n\t\t\t//\n\t\t\t// If the child is similar to the given attribute element, unwrap it - it will be completely removed.\n\t\t\t//\n\t\t\t//

abcxyz

-->

abcxyz

\n\t\t\t//\n\t\t\tif ( child.isSimilar( unwrapElement ) ) {\n\t\t\t\tconst unwrapped = child.getChildren();\n\t\t\t\tconst count = child.childCount;\n\n\t\t\t\t// Replace wrapper element with its children\n\t\t\t\tchild._remove();\n\t\t\t\tparent._insertChild( i, unwrapped );\n\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\n\t\t\t\t// Save start and end position of moved items.\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + count )\n\t\t\t\t);\n\n\t\t\t\t// Skip elements that were unwrapped. Assuming there won't be another element to unwrap in child elements.\n\t\t\t\ti += count;\n\t\t\t\tendOffset += count - 1;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If the child is not similar but is an attribute element, try partial unwrapping - remove the same attributes/styles/classes.\n\t\t\t// Partial unwrapping will happen only if the elements have the same name.\n\t\t\t//\n\t\t\t//

abcxyz

-->

abcxyz

\n\t\t\t//

abcxyz

-->

abcxyz

\n\t\t\t//\n\t\t\tif ( this._unwrapAttributeElement( unwrapElement, child ) ) {\n\t\t\t\tunwrapPositions.push(\n\t\t\t\t\tnew Position( parent, i ),\n\t\t\t\t\tnew Position( parent, i + 1 )\n\t\t\t\t);\n\n\t\t\t\ti++;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//\n\t\t\t// If other nested attribute is found, look through it's children for elements to unwrap.\n\t\t\t//\n\t\t\t//

abc

-->

abc

\n\t\t\t//\n\t\t\tthis._unwrapChildren( child, 0, child.childCount, unwrapElement );\n\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge at each unwrap.\n\t\tlet offsetChange = 0;\n\n\t\tfor ( const position of unwrapPositions ) {\n\t\t\tposition.offset -= offsetChange;\n\n\t\t\t// Do not merge with elements outside selected children.\n\t\t\tif ( position.offset == startOffset || position.offset == endOffset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newPosition = this.mergeAttributes( position );\n\n\t\t\t// If nodes were merged - other merge offsets will change.\n\t\t\tif ( !newPosition.isEqual( position ) ) {\n\t\t\t\toffsetChange++;\n\t\t\t\tendOffset--;\n\t\t\t}\n\t\t}\n\n\t\treturn Range._createFromParentsAndOffsets( parent, startOffset, parent, endOffset );\n\t}\n\n\t/**\n\t * Helper function for `view.writer.wrap`. Wraps range with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @returns New range after wrapping, spanning over wrapping attribute element.\n\t */\n\tprivate _wrapRange( range: Range, attribute: AttributeElement ): Range {\n\t\t// Break attributes at range start and end.\n\t\tconst { start: breakStart, end: breakEnd } = this._breakAttributesRange( range, true );\n\t\tconst parentContainer = breakStart.parent as Element;\n\n\t\t// Wrap all children with attribute.\n\t\tconst newRange = this._wrapChildren( parentContainer, breakStart.offset, breakEnd.offset, attribute );\n\n\t\t// Merge attributes at the both ends and return a new range.\n\t\tconst start = this.mergeAttributes( newRange.start );\n\n\t\t// If start position was merged - move end position back.\n\t\tif ( !start.isEqual( newRange.start ) ) {\n\t\t\tnewRange.end.offset--;\n\t\t}\n\t\tconst end = this.mergeAttributes( newRange.end );\n\n\t\treturn new Range( start, end );\n\t}\n\n\t/**\n\t * Helper function for {@link #wrap}. Wraps position with provided attribute element.\n\t * This method will also merge newly added attribute element with its siblings whenever possible.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError} `view-writer-wrap-invalid-attribute` when passed attribute element is not\n\t * an instance of {@link module:engine/view/attributeelement~AttributeElement AttributeElement}.\n\t *\n\t * @returns New position after wrapping.\n\t */\n\tprivate _wrapPosition( position: Position, attribute: AttributeElement ): Position {\n\t\t// Return same position when trying to wrap with attribute similar to position parent.\n\t\tif ( attribute.isSimilar( position.parent as any ) ) {\n\t\t\treturn movePositionToTextNode( position.clone() );\n\t\t}\n\n\t\t// When position is inside text node - break it and place new position between two text nodes.\n\t\tif ( position.parent.is( '$text' ) ) {\n\t\t\tposition = breakTextNode( position );\n\t\t}\n\n\t\t// Create fake element that will represent position, and will not be merged with other attributes.\n\t\tconst fakeElement = this.createAttributeElement( '_wrapPosition-fake-element' );\n\t\t( fakeElement as any )._priority = Number.POSITIVE_INFINITY;\n\t\tfakeElement.isSimilar = () => false;\n\n\t\t// Insert fake element in position location.\n\t\t( position.parent as Element )._insertChild( position.offset, fakeElement );\n\n\t\t// Range around inserted fake attribute element.\n\t\tconst wrapRange = new Range( position, position.getShiftedBy( 1 ) );\n\n\t\t// Wrap fake element with attribute (it will also merge if possible).\n\t\tthis.wrap( wrapRange, attribute );\n\n\t\t// Remove fake element and place new position there.\n\t\tconst newPosition = new Position( fakeElement.parent!, fakeElement.index! );\n\t\tfakeElement._remove();\n\n\t\t// If position is placed between text nodes - merge them and return position inside.\n\t\tconst nodeBefore = newPosition.nodeBefore;\n\t\tconst nodeAfter = newPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof Text && nodeAfter instanceof Text ) {\n\t\t\treturn mergeTextNodes( nodeBefore, nodeAfter );\n\t\t}\n\n\t\t// If position is next to text node - move position inside.\n\t\treturn movePositionToTextNode( newPosition );\n\t}\n\n\t/**\n\t * Wraps one {@link module:engine/view/attributeelement~AttributeElement AttributeElement} into another by\n\t * merging them if possible. When merging is possible - all attributes, styles and classes are moved from wrapper\n\t * element to element being wrapped.\n\t *\n\t * @param wrapper Wrapper AttributeElement.\n\t * @param toWrap AttributeElement to wrap using wrapper element.\n\t * @returns Returns `true` if elements are merged.\n\t */\n\tprivate _wrapAttributeElement( wrapper: AttributeElement, toWrap: AttributeElement ): boolean {\n\t\tif ( !canBeJoined( wrapper, toWrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't merge if name or priority differs.\n\t\tif ( wrapper.name !== toWrap.name || wrapper.priority !== toWrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if attributes can be merged.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are different we cannot wrap.\n\t\t\tif ( toWrap.hasAttribute( key ) && toWrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if styles can be merged.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( toWrap.hasStyle( key ) && toWrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Move all attributes/classes/styles from wrapper to wrapped AttributeElement.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Move only these attributes that are not present - other are similar.\n\t\t\tif ( !toWrap.hasAttribute( key ) ) {\n\t\t\t\tthis.setAttribute( key, wrapper.getAttribute( key )!, toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\tif ( !toWrap.hasStyle( key ) ) {\n\t\t\t\tthis.setStyle( key, wrapper.getStyle( key )!, toWrap );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const key of wrapper.getClassNames() ) {\n\t\t\tif ( !toWrap.hasClass( key ) ) {\n\t\t\t\tthis.addClass( key, toWrap );\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Unwraps {@link module:engine/view/attributeelement~AttributeElement AttributeElement} from another by removing\n\t * corresponding attributes, classes and styles. All attributes, classes and styles from wrapper should be present\n\t * inside element being unwrapped.\n\t *\n\t * @param wrapper Wrapper AttributeElement.\n\t * @param toUnwrap AttributeElement to unwrap using wrapper element.\n\t * @returns Returns `true` if elements are unwrapped.\n\t **/\n\tprivate _unwrapAttributeElement( wrapper: AttributeElement, toUnwrap: AttributeElement ): boolean {\n\t\tif ( !canBeJoined( wrapper, toUnwrap ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Can't unwrap if name or priority differs.\n\t\tif ( wrapper.name !== toUnwrap.name || wrapper.priority !== toUnwrap.priority ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper attributes.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If some attributes are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasAttribute( key ) || toUnwrap.getAttribute( key ) !== wrapper.getAttribute( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper classes.\n\t\tif ( !toUnwrap.hasClass( ...wrapper.getClassNames() ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if AttributeElement has all wrapper styles.\n\t\tfor ( const key of wrapper.getStyleNames() ) {\n\t\t\t// If some styles are missing or different we cannot unwrap.\n\t\t\tif ( !toUnwrap.hasStyle( key ) || toUnwrap.getStyle( key ) !== wrapper.getStyle( key ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Remove all wrapper's attributes from unwrapped element.\n\t\tfor ( const key of wrapper.getAttributeKeys() ) {\n\t\t\t// Classes and styles should be checked separately.\n\t\t\tif ( key === 'class' || key === 'style' ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.removeAttribute( key, toUnwrap );\n\t\t}\n\n\t\t// Remove all wrapper's classes from unwrapped element.\n\t\tthis.removeClass( Array.from( wrapper.getClassNames() ), toUnwrap );\n\n\t\t// Remove all wrapper's styles from unwrapped element.\n\t\tthis.removeStyle( Array.from( wrapper.getStyleNames() ), toUnwrap );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at the boundaries of given range.\n\t *\n\t * @param range Range which `start` and `end` positions will be used to break attributes.\n\t * @param forceSplitText If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns New range with located at break positions.\n\t */\n\tprivate _breakAttributesRange( range: Range, forceSplitText: boolean = false ) {\n\t\tconst rangeStart = range.start;\n\t\tconst rangeEnd = range.end;\n\n\t\tvalidateRangeContainer( range, this.document );\n\n\t\t// Break at the collapsed position. Return new collapsed range.\n\t\tif ( range.isCollapsed ) {\n\t\t\tconst position = this._breakAttributes( range.start, forceSplitText );\n\n\t\t\treturn new Range( position, position );\n\t\t}\n\n\t\tconst breakEnd = this._breakAttributes( rangeEnd, forceSplitText );\n\t\tconst count = ( breakEnd.parent as Element ).childCount;\n\t\tconst breakStart = this._breakAttributes( rangeStart, forceSplitText );\n\n\t\t// Calculate new break end offset.\n\t\tbreakEnd.offset += ( breakEnd.parent as Element ).childCount - count;\n\n\t\treturn new Range( breakStart, breakEnd );\n\t}\n\n\t/**\n\t * Helper function used by other `DowncastWriter` methods. Breaks attribute elements at given position.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-empty-element` when break position\n\t * is placed inside {@link module:engine/view/emptyelement~EmptyElement EmptyElement}.\n\t *\n\t * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-cannot-break-ui-element` when break position\n\t * is placed inside {@link module:engine/view/uielement~UIElement UIElement}.\n\t *\n\t * @param position Position where to break attributes.\n\t * @param forceSplitText If set to `true`, will break text nodes even if they are directly in container element.\n\t * This behavior will result in incorrect view state, but is needed by other view writing methods which then fixes view state.\n\t * @returns New position after breaking the attributes.\n\t */\n\tprivate _breakAttributes( position: Position, forceSplitText: boolean = false ): Position {\n\t\tconst positionOffset = position.offset;\n\t\tconst positionParent = position.parent;\n\n\t\t// If position is placed inside EmptyElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'emptyElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break an `EmptyElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-empty-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-empty-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside UIElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'uiElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break a `UIElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-ui-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-ui-element', this.document );\n\t\t}\n\n\t\t// If position is placed inside RawElement - throw an exception as we cannot break inside.\n\t\tif ( position.parent.is( 'rawElement' ) ) {\n\t\t\t/**\n\t\t\t * Cannot break a `RawElement` instance.\n\t\t\t *\n\t\t\t * This error is thrown if\n\t\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#breakAttributes `DowncastWriter#breakAttributes()`}\n\t\t\t * was executed in an incorrect position.\n\t\t\t *\n\t\t\t * @error view-writer-cannot-break-raw-element\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-cannot-break-raw-element', this.document );\n\t\t}\n\n\t\t// There are no attributes to break and text nodes breaking is not forced.\n\t\tif ( !forceSplitText && positionParent.is( '$text' ) && isContainerOrFragment( positionParent.parent! ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Position's parent is container, so no attributes to break.\n\t\tif ( isContainerOrFragment( positionParent ) ) {\n\t\t\treturn position.clone();\n\t\t}\n\n\t\t// Break text and start again in new position.\n\t\tif ( positionParent.is( '$text' ) ) {\n\t\t\treturn this._breakAttributes( breakTextNode( position ), forceSplitText );\n\t\t}\n\n\t\tconst length = ( positionParent as any ).childCount;\n\n\t\t//

foobar{}

\n\t\t//

foobar[]

\n\t\t//

foobar[]

\n\t\tif ( positionOffset == length ) {\n\t\t\tconst newPosition = new Position( positionParent.parent as any, ( positionParent as any ).index + 1 );\n\n\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t} else {\n\t\t\t//

foo{}bar

\n\t\t\t//

foo[]bar

\n\t\t\t//

foo{}bar

\n\t\t\tif ( positionOffset === 0 ) {\n\t\t\t\tconst newPosition = new Position( positionParent.parent as Element, ( positionParent as any ).index );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t\t//

foob{}ar

\n\t\t\t//

foob[]ar

\n\t\t\t//

foob[]ar

\n\t\t\t//

foob[]ar

\n\t\t\telse {\n\t\t\t\tconst offsetAfter = ( positionParent as any ).index + 1;\n\n\t\t\t\t// Break element.\n\t\t\t\tconst clonedNode = ( positionParent as any )._clone();\n\n\t\t\t\t// Insert cloned node to position's parent node.\n\t\t\t\t( positionParent.parent as any )._insertChild( offsetAfter, clonedNode );\n\t\t\t\tthis._addToClonedElementsGroup( clonedNode );\n\n\t\t\t\t// Get nodes to move.\n\t\t\t\tconst count = ( positionParent as any ).childCount - positionOffset;\n\t\t\t\tconst nodesToMove = ( positionParent as any )._removeChildren( positionOffset, count );\n\n\t\t\t\t// Move nodes to cloned node.\n\t\t\t\tclonedNode._appendChild( nodesToMove );\n\n\t\t\t\t// Create new position to work on.\n\t\t\t\tconst newPosition = new Position( ( positionParent as any ).parent, offsetAfter );\n\n\t\t\t\treturn this._breakAttributes( newPosition, forceSplitText );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Stores the information that an {@link module:engine/view/attributeelement~AttributeElement attribute element} was\n\t * added to the tree. Saves the reference to the group in the given element and updates the group, so other elements\n\t * from the group now keep a reference to the given attribute element.\n\t *\n\t * The clones group can be obtained using {@link module:engine/view/attributeelement~AttributeElement#getElementsWithSameId}.\n\t *\n\t * Does nothing if added element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @param element Attribute element to save.\n\t */\n\tprivate _addToClonedElementsGroup( element: Node ): void {\n\t\t// Add only if the element is in document tree.\n\t\tif ( !element.root.is( 'rootElement' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Traverse the element's children recursively to find other attribute elements that also might got inserted.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._addToClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = ( element as any ).id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\tgroup = new Set();\n\t\t\tthis._cloneGroups.set( id, group );\n\t\t}\n\n\t\tgroup.add( element as AttributeElement );\n\t\t( element as any )._clonesGroup = group;\n\t}\n\n\t/**\n\t * Removes all the information about the given {@link module:engine/view/attributeelement~AttributeElement attribute element}\n\t * from its clones group.\n\t *\n\t * Keep in mind, that the element will still keep a reference to the group (but the group will not keep a reference to it).\n\t * This allows to reference the whole group even if the element was already removed from the tree.\n\t *\n\t * Does nothing if the element has no {@link module:engine/view/attributeelement~AttributeElement#id id}.\n\t *\n\t * @param element Attribute element to remove.\n\t */\n\tprivate _removeFromClonedElementsGroup( element: Node ) {\n\t\t// Traverse the element's children recursively to find other attribute elements that also got removed.\n\t\t// The loop is at the beginning so we can make fast returns later in the code.\n\t\tif ( element.is( 'element' ) ) {\n\t\t\tfor ( const child of element.getChildren() ) {\n\t\t\t\tthis._removeFromClonedElementsGroup( child );\n\t\t\t}\n\t\t}\n\n\t\tconst id = ( element as any ).id;\n\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = this._cloneGroups.get( id );\n\n\t\tif ( !group ) {\n\t\t\treturn;\n\t\t}\n\n\t\tgroup.delete( element as AttributeElement );\n\t\t// Not removing group from element on purpose!\n\t\t// If other parts of code have reference to this element, they will be able to get references to other elements from the group.\n\t}\n}\n\n// Helper function for `view.writer.wrap`. Checks if given element has any children that are not ui elements.\nfunction _hasNonUiChildren( parent: Element ): boolean {\n\treturn Array.from( parent.getChildren() ).some( child => !child.is( 'uiElement' ) );\n}\n\n/**\n * The `attribute` passed to {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`}\n * must be an instance of {@link module:engine/view/attributeelement~AttributeElement `AttributeElement`}.\n *\n * @error view-writer-wrap-invalid-attribute\n */\n\n/**\n * Returns first parent container of specified {@link module:engine/view/position~Position Position}.\n * Position's parent node is checked as first, then next parents are checked.\n * Note that {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment} is treated like a container.\n *\n * @param position Position used as a start point to locate parent container.\n * @returns Parent container element or `undefined` if container is not found.\n */\nfunction getParentContainer( position: Position ): ContainerElement | DocumentFragment | undefined {\n\tlet parent = position.parent;\n\n\twhile ( !isContainerOrFragment( parent ) ) {\n\t\tif ( !parent ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tparent = parent.parent as any;\n\t}\n\n\treturn ( parent as ContainerElement | DocumentFragment );\n}\n\n/**\n * Checks if first {@link module:engine/view/attributeelement~AttributeElement AttributeElement} provided to the function\n * can be wrapped outside second element. It is done by comparing elements'\n * {@link module:engine/view/attributeelement~AttributeElement#priority priorities}, if both have same priority\n * {@link module:engine/view/element~Element#getIdentity identities} are compared.\n */\nfunction shouldABeOutsideB( a: AttributeElement, b: AttributeElement ): boolean {\n\tif ( a.priority < b.priority ) {\n\t\treturn true;\n\t} else if ( a.priority > b.priority ) {\n\t\treturn false;\n\t}\n\n\t// When priorities are equal and names are different - use identities.\n\treturn a.getIdentity() < b.getIdentity();\n}\n\n/**\n * Returns new position that is moved to near text node. Returns same position if there is no text node before of after\n * specified position.\n *\n * ```html\n *

foo[]

->

foo{}

\n *

[]foo

->

{}foo

\n * ```\n *\n * @returns Position located inside text node or same position if there is no text nodes\n * before or after position location.\n */\nfunction movePositionToTextNode( position: Position ): Position {\n\tconst nodeBefore = position.nodeBefore;\n\n\tif ( nodeBefore && nodeBefore.is( '$text' ) ) {\n\t\treturn new Position( nodeBefore, nodeBefore.data.length );\n\t}\n\n\tconst nodeAfter = position.nodeAfter;\n\n\tif ( nodeAfter && nodeAfter.is( '$text' ) ) {\n\t\treturn new Position( nodeAfter, 0 );\n\t}\n\n\treturn position;\n}\n\n/**\n * Breaks text node into two text nodes when possible.\n *\n * ```html\n *

foo{}bar

->

foo[]bar

\n *

{}foobar

->

[]foobar

\n *

foobar{}

->

foobar[]

\n * ```\n *\n * @param position Position that need to be placed inside text node.\n * @returns New position after breaking text node.\n */\nfunction breakTextNode( position: Position ): Position {\n\tif ( position.offset == ( position.parent as Text ).data.length ) {\n\t\treturn new Position( position.parent.parent as any, ( position.parent as Text ).index! + 1 );\n\t}\n\n\tif ( position.offset === 0 ) {\n\t\treturn new Position( position.parent.parent as any, ( position.parent as Text ).index! );\n\t}\n\n\t// Get part of the text that need to be moved.\n\tconst textToMove = ( position.parent as Text ).data.slice( position.offset );\n\n\t// Leave rest of the text in position's parent.\n\t( position.parent as Text )._data = ( position.parent as Text ).data.slice( 0, position.offset );\n\n\t// Insert new text node after position's parent text node.\n\t( position.parent.parent as any )._insertChild(\n\t\t( position.parent as Text ).index! + 1,\n\t\tnew Text( position.root.document, textToMove )\n\t);\n\n\t// Return new position between two newly created text nodes.\n\treturn new Position( position.parent.parent as any, ( position.parent as Text ).index! + 1 );\n}\n\n/**\n * Merges two text nodes into first node. Removes second node and returns merge position.\n *\n * @param t1 First text node to merge. Data from second text node will be moved at the end of this text node.\n * @param t2 Second text node to merge. This node will be removed after merging.\n * @returns Position after merging text nodes.\n */\nfunction mergeTextNodes( t1: Text, t2: Text ): Position {\n\t// Merge text data into first text node and remove second one.\n\tconst nodeBeforeLength = t1.data.length;\n\tt1._data += t2.data;\n\tt2._remove();\n\n\treturn new Position( t1, nodeBeforeLength );\n}\n\nconst validNodesToInsert = [ Text, AttributeElement, ContainerElement, EmptyElement, RawElement, UIElement ];\n\n/**\n * Checks if provided nodes are valid to insert.\n *\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-insert-invalid-node` when nodes to insert\n * contains instances that are not supported ones (see error description for valid ones.\n */\nfunction validateNodesToInsert( nodes: Iterable, errorContext: Document ): void {\n\tfor ( const node of nodes ) {\n\t\tif ( !validNodesToInsert.some( ( validNode => node instanceof validNode ) ) ) { // eslint-disable-line no-use-before-define\n\t\t\t/**\n\t\t\t * One of the nodes to be inserted is of an invalid type.\n\t\t\t *\n\t\t\t * Nodes to be inserted with {@link module:engine/view/downcastwriter~DowncastWriter#insert `DowncastWriter#insert()`} should be\n\t\t\t * of the following types:\n\t\t\t *\n\t\t\t * * {@link module:engine/view/attributeelement~AttributeElement AttributeElement},\n\t\t\t * * {@link module:engine/view/containerelement~ContainerElement ContainerElement},\n\t\t\t * * {@link module:engine/view/emptyelement~EmptyElement EmptyElement},\n\t\t\t * * {@link module:engine/view/uielement~UIElement UIElement},\n\t\t\t * * {@link module:engine/view/rawelement~RawElement RawElement},\n\t\t\t * * {@link module:engine/view/text~Text Text}.\n\t\t\t *\n\t\t\t * @error view-writer-insert-invalid-node-type\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-writer-insert-invalid-node-type', errorContext );\n\t\t}\n\n\t\tif ( !node.is( '$text' ) ) {\n\t\t\tvalidateNodesToInsert( ( node as Element ).getChildren(), errorContext );\n\t\t}\n\t}\n}\n\n/**\n * Checks if node is ContainerElement or DocumentFragment, because in most cases they should be treated the same way.\n *\n * @returns Returns `true` if node is instance of ContainerElement or DocumentFragment.\n */\nfunction isContainerOrFragment( node: Node | DocumentFragment ): boolean {\n\treturn node && ( node.is( 'containerElement' ) || node.is( 'documentFragment' ) );\n}\n\n/**\n * Checks if {@link module:engine/view/range~Range#start range start} and {@link module:engine/view/range~Range#end range end} are placed\n * inside same {@link module:engine/view/containerelement~ContainerElement container element}.\n * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-writer-invalid-range-container` when validation fails.\n */\nfunction validateRangeContainer( range: Range, errorContext: Document ) {\n\tconst startContainer = getParentContainer( range.start );\n\tconst endContainer = getParentContainer( range.end );\n\n\tif ( !startContainer || !endContainer || startContainer !== endContainer ) {\n\t\t/**\n\t\t * The container of the given range is invalid.\n\t\t *\n\t\t * This may happen if {@link module:engine/view/range~Range#start range start} and\n\t\t * {@link module:engine/view/range~Range#end range end} positions are not placed inside the same container element or\n\t\t * a parent container for these positions cannot be found.\n\t\t *\n\t\t * Methods like {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#remove()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#clean()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#wrap()`},\n\t\t * {@link module:engine/view/downcastwriter~DowncastWriter#wrap `DowncastWriter#unwrap()`} need to be called\n\t\t * on a range that has its start and end positions located in the same container element. Both positions can be\n\t\t * nested within other elements (e.g. an attribute element) but the closest container ancestor must be the same.\n\t\t *\n\t\t * @error view-writer-invalid-range-container\n\t\t */\n\t\tthrow new CKEditorError( 'view-writer-invalid-range-container', errorContext );\n\t}\n}\n\n/**\n * Checks if two attribute elements can be joined together. Elements can be joined together if, and only if\n * they do not have ids specified.\n */\nfunction canBeJoined( a: AttributeElement, b: AttributeElement ) {\n\treturn a.id === null && b.id === null;\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\nimport { keyCodes, isText, type KeystrokeInfo } from '@ckeditor/ckeditor5-utils';\nimport type View from './view.js';\nimport type DomEventData from './observer/domeventdata.js';\nimport type { ViewDocumentArrowKeyEvent } from './observer/arrowkeysobserver.js';\n\n/**\n * Set of utilities related to handling block and inline fillers.\n *\n * Browsers do not allow to put caret in elements which does not have height. Because of it, we need to fill all\n * empty elements which should be selectable with elements or characters called \"fillers\". Unfortunately there is no one\n * universal filler, this is why two types are uses:\n *\n * * Block filler is an element which fill block elements, like `

`. CKEditor uses `
` as a block filler during the editing,\n * as browsers do natively. So instead of an empty `

` there will be `


`. The advantage of block filler is that\n * it is transparent for the selection, so when the caret is before the `
` and user presses right arrow he will be\n * moved to the next paragraph, not after the `
`. The disadvantage is that it breaks a block, so it can not be used\n * in the middle of a line of text. The {@link module:engine/view/filler~BR_FILLER `
` filler} can be replaced with any other\n * character in the data output, for instance {@link module:engine/view/filler~NBSP_FILLER non-breaking space} or\n * {@link module:engine/view/filler~MARKED_NBSP_FILLER marked non-breaking space}.\n *\n * * Inline filler is a filler which does not break a line of text, so it can be used inside the text, for instance in the empty\n * `` surrendered by text: `foobar`, if we want to put the caret there. CKEditor uses a sequence of the zero-width\n * spaces as an {@link module:engine/view/filler~INLINE_FILLER inline filler} having the predetermined\n * {@link module:engine/view/filler~INLINE_FILLER_LENGTH length}. A sequence is used, instead of a single character to\n * avoid treating random zero-width spaces as the inline filler. Disadvantage of the inline filler is that it is not\n * transparent for the selection. The arrow key moves the caret between zero-width spaces characters, so the additional\n * code is needed to handle the caret.\n *\n * Both inline and block fillers are handled by the {@link module:engine/view/renderer~Renderer renderer} and are not present in the\n * view.\n *\n * @module engine/view/filler\n */\n\n/**\n * Non-breaking space filler creator. This function creates the ` ` text node.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\n * @see module:engine/view/filler~BR_FILLER\n */\nexport const NBSP_FILLER = ( domDocument: Document ): Text => domDocument.createTextNode( '\\u00A0' );\n\n/**\n * Marked non-breaking space filler creator. This function creates the ` ` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @see module:engine/view/filler~BR_FILLER\n */\nexport const MARKED_NBSP_FILLER = ( domDocument: Document ): HTMLSpanElement => {\n\tconst span = domDocument.createElement( 'span' );\n\tspan.dataset.ckeFiller = 'true';\n\tspan.innerText = '\\u00A0';\n\n\treturn span;\n};\n\n/**\n * `
` filler creator. This function creates the `
` element.\n * It defines how the filler is created.\n *\n * @see module:engine/view/filler~NBSP_FILLER\n * @see module:engine/view/filler~MARKED_NBSP_FILLER\n */\nexport const BR_FILLER = ( domDocument: Document ): HTMLBRElement => {\n\tconst fillerBr = domDocument.createElement( 'br' );\n\tfillerBr.dataset.ckeFiller = 'true';\n\n\treturn fillerBr;\n};\n\n/**\n * Length of the {@link module:engine/view/filler~INLINE_FILLER INLINE_FILLER}.\n */\nexport const INLINE_FILLER_LENGTH = 7;\n\n/**\n * Inline filler which is a sequence of the word joiners.\n */\nexport const INLINE_FILLER = '\\u2060'.repeat( INLINE_FILLER_LENGTH );\n\n/**\n * Checks if the node is a text node which starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n * ```ts\n * startsWithFiller( document.createTextNode( INLINE_FILLER ) ); // true\n * startsWithFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // true\n * startsWithFiller( document.createTextNode( 'foo' ) ); // false\n * startsWithFiller( document.createElement( 'p' ) ); // false\n * ```\n *\n * @param domNode DOM node.\n * @returns True if the text node starts with the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function startsWithFiller( domNode: Node | string ): boolean {\n\tif ( typeof domNode == 'string' ) {\n\t\treturn domNode.substr( 0, INLINE_FILLER_LENGTH ) === INLINE_FILLER;\n\t}\n\n\treturn isText( domNode ) && ( domNode.data.substr( 0, INLINE_FILLER_LENGTH ) === INLINE_FILLER );\n}\n\n/**\n * Checks if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n *\n * ```ts\n * isInlineFiller( document.createTextNode( INLINE_FILLER ) ); // true\n * isInlineFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ); // false\n * ```\n *\n * @param domText DOM text node.\n * @returns True if the text node contains only the {@link module:engine/view/filler~INLINE_FILLER inline filler}.\n */\nexport function isInlineFiller( domText: Text ): boolean {\n\treturn domText.data.length == INLINE_FILLER_LENGTH && startsWithFiller( domText );\n}\n\n/**\n * Get string data from the text node, removing an {@link module:engine/view/filler~INLINE_FILLER inline filler} from it,\n * if text node contains it.\n *\n * ```ts\n * getDataWithoutFiller( document.createTextNode( INLINE_FILLER + 'foo' ) ) == 'foo' // true\n * getDataWithoutFiller( document.createTextNode( 'foo' ) ) == 'foo' // true\n * ```\n *\n * @param domText DOM text node, possible with inline filler.\n * @returns Data without filler.\n */\nexport function getDataWithoutFiller( domText: Text | string ): string {\n\tconst data = typeof domText == 'string' ? domText : domText.data;\n\n\tif ( startsWithFiller( domText ) ) {\n\t\treturn data.slice( INLINE_FILLER_LENGTH );\n\t}\n\n\treturn data;\n}\n\n/**\n * Assign key observer which move cursor from the end of the inline filler to the beginning of it when\n * the left arrow is pressed, so the filler does not break navigation.\n *\n * @param view View controller instance we should inject quirks handling on.\n */\nexport function injectQuirksHandling( view: View ): void {\n\tview.document.on( 'arrowKey', jumpOverInlineFiller, { priority: 'low' } );\n}\n\n/**\n * Move cursor from the end of the inline filler to the beginning of it when, so the filler does not break navigation.\n */\nfunction jumpOverInlineFiller( evt: unknown, data: DomEventData & KeystrokeInfo ) {\n\tif ( data.keyCode == keyCodes.arrowleft ) {\n\t\tconst domSelection = data.domTarget.ownerDocument.defaultView!.getSelection()!;\n\n\t\tif ( domSelection.rangeCount == 1 && domSelection.getRangeAt( 0 ).collapsed ) {\n\t\t\tconst domParent = domSelection.getRangeAt( 0 ).startContainer;\n\t\t\tconst domOffset = domSelection.getRangeAt( 0 ).startOffset;\n\n\t\t\tif ( startsWithFiller( domParent ) && domOffset <= INLINE_FILLER_LENGTH ) {\n\t\t\t\tdomSelection.collapse( domParent, 0 );\n\t\t\t}\n\t\t}\n\t}\n}\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./renderer.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/renderer\n */\n\nimport ViewText from './text.js';\nimport ViewPosition from './position.js';\nimport { INLINE_FILLER, INLINE_FILLER_LENGTH, startsWithFiller, isInlineFiller } from './filler.js';\n\nimport {\n\tCKEditorError,\n\tObservableMixin,\n\tdiff,\n\tenv,\n\tfastDiff,\n\tinsertAt,\n\tisComment,\n\tisNode,\n\tisText,\n\tremove,\n\ttype DiffResult,\n\ttype ObservableChangeEvent\n} from '@ckeditor/ckeditor5-utils';\n\nimport type { ChangeType } from './document.js';\nimport type DocumentSelection from './documentselection.js';\nimport type DomConverter from './domconverter.js';\nimport type ViewElement from './element.js';\nimport type ViewNode from './node.js';\n\nimport '../../theme/renderer.css';\n\ntype DomText = globalThis.Text;\ntype DomNode = globalThis.Node;\ntype DomDocument = globalThis.Document;\ntype DomElement = globalThis.HTMLElement;\ntype DomSelection = globalThis.Selection;\n\n/**\n * Renderer is responsible for updating the DOM structure and the DOM selection based on\n * the {@link module:engine/view/renderer~Renderer#markToSync information about updated view nodes}.\n * In other words, it renders the view to the DOM.\n *\n * Its main responsibility is to make only the necessary, minimal changes to the DOM. However, unlike in many\n * virtual DOM implementations, the primary reason for doing minimal changes is not the performance but ensuring\n * that native editing features such as text composition, autocompletion, spell checking, selection's x-index are\n * affected as little as possible.\n *\n * Renderer uses {@link module:engine/view/domconverter~DomConverter} to transform view nodes and positions\n * to and from the DOM.\n */\nexport default class Renderer extends ObservableMixin() {\n\t/**\n\t * Set of DOM Documents instances.\n\t */\n\tpublic readonly domDocuments: Set = new Set();\n\n\t/**\n\t * Converter instance.\n\t */\n\tpublic readonly domConverter: DomConverter;\n\n\t/**\n\t * Set of nodes which attributes changed and may need to be rendered.\n\t */\n\tpublic readonly markedAttributes: Set = new Set();\n\n\t/**\n\t * Set of elements which child lists changed and may need to be rendered.\n\t */\n\tpublic readonly markedChildren: Set = new Set();\n\n\t/**\n\t * Set of text nodes which text data changed and may need to be rendered.\n\t */\n\tpublic readonly markedTexts: Set = new Set();\n\n\t/**\n\t * View selection. Renderer updates DOM selection based on the view selection.\n\t */\n\tpublic readonly selection: DocumentSelection;\n\n\t/**\n\t * Indicates if the view document is focused and selection can be rendered. Selection will not be rendered if\n\t * this is set to `false`.\n\t *\n\t * @observable\n\t */\n\tdeclare public readonly isFocused: boolean;\n\n\t/**\n\t * Indicates whether the user is making a selection in the document (e.g. holding the mouse button and moving the cursor).\n\t * When they stop selecting, the property goes back to `false`.\n\t *\n\t * Note: In some browsers, the renderer will stop rendering the selection and inline fillers while the user is making\n\t * a selection to avoid glitches in DOM selection\n\t * (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t *\n\t * @observable\n\t */\n\tdeclare public readonly isSelecting: boolean;\n\n\t/**\n\t * True if composition is in progress inside the document.\n\t *\n\t * This property is bound to the {@link module:engine/view/document~Document#isComposing `Document#isComposing`} property.\n\t *\n\t * @observable\n\t */\n\tdeclare public readonly isComposing: boolean;\n\n\t/**\n\t * The text node in which the inline filler was rendered.\n\t */\n\tprivate _inlineFiller: DomText | null = null;\n\n\t/**\n\t * DOM element containing fake selection.\n\t */\n\tprivate _fakeSelectionContainer: DomElement | null = null;\n\n\t/**\n\t * Creates a renderer instance.\n\t *\n\t * @param domConverter Converter instance.\n\t * @param selection View selection.\n\t */\n\tconstructor( domConverter: DomConverter, selection: DocumentSelection ) {\n\t\tsuper();\n\n\t\tthis.domConverter = domConverter;\n\t\tthis.selection = selection;\n\n\t\tthis.set( 'isFocused', false );\n\t\tthis.set( 'isSelecting', false );\n\n\t\t// Rendering the selection and inline filler manipulation should be postponed in (non-Android) Blink until the user finishes\n\t\t// creating the selection in DOM to avoid accidental selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\t// When the user stops selecting, all pending changes should be rendered ASAP, though.\n\t\tif ( env.isBlink && !env.isAndroid ) {\n\t\t\tthis.on( 'change:isSelecting', () => {\n\t\t\t\tif ( !this.isSelecting ) {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis.set( 'isComposing', false );\n\n\t\tthis.on( 'change:isComposing', () => {\n\t\t\tif ( !this.isComposing ) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * Marks a view node to be updated in the DOM by {@link #render `render()`}.\n\t *\n\t * Note that only view nodes whose parents have corresponding DOM elements need to be marked to be synchronized.\n\t *\n\t * @see #markedAttributes\n\t * @see #markedChildren\n\t * @see #markedTexts\n\t *\n\t * @param type Type of the change.\n\t * @param node ViewNode to be marked.\n\t */\n\tpublic markToSync( type: ChangeType, node: ViewNode ): void {\n\t\tif ( type === 'text' ) {\n\t\t\tif ( this.domConverter.mapViewToDom( node.parent! ) ) {\n\t\t\t\tthis.markedTexts.add( node );\n\t\t\t}\n\t\t} else {\n\t\t\t// If the node has no DOM element it is not rendered yet,\n\t\t\t// its children/attributes do not need to be marked to be sync.\n\t\t\tif ( !this.domConverter.mapViewToDom( node as ViewElement ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( type === 'attributes' ) {\n\t\t\t\tthis.markedAttributes.add( node as ViewElement );\n\t\t\t} else if ( type === 'children' ) {\n\t\t\t\tthis.markedChildren.add( node as ViewElement );\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\t\tconst unreachable: never = type;\n\n\t\t\t\t/**\n\t\t\t\t * Unknown type passed to Renderer.markToSync.\n\t\t\t\t *\n\t\t\t\t * @error view-renderer-unknown-type\n\t\t\t\t */\n\t\t\t\tthrow new CKEditorError( 'view-renderer-unknown-type', this );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Renders all buffered changes ({@link #markedAttributes}, {@link #markedChildren} and {@link #markedTexts}) and\n\t * the current view selection (if needed) to the DOM by applying a minimal set of changes to it.\n\t *\n\t * Renderer tries not to break the text composition (e.g. IME) and x-index of the selection,\n\t * so it does as little as it is needed to update the DOM.\n\t *\n\t * Renderer also handles {@link module:engine/view/filler fillers}. Especially, it checks if the inline filler is needed\n\t * at the selection position and adds or removes it. To prevent breaking text composition inline filler will not be\n\t * removed as long as the selection is in the text node which needed it at first.\n\t */\n\tpublic render(): void {\n\t\t// Ignore rendering while in the composition mode. Composition events are not cancellable and browser will modify the DOM tree.\n\t\t// All marked elements, attributes, etc. will wait until next render after the composition ends.\n\t\t// On Android composition events are immediately applied to the model, so we don't need to skip rendering,\n\t\t// and we should not do it because the difference between view and DOM could lead to position mapping problems.\n\t\tif ( this.isComposing && !env.isAndroid ) {\n\t\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Rendering aborted while isComposing',\n\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t\treturn;\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Rendering',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\tlet inlineFillerPosition: ViewPosition | null = null;\n\t\tconst isInlineFillerRenderingPossible = env.isBlink && !env.isAndroid ? !this.isSelecting : true;\n\n\t\t// Refresh mappings.\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildrenMappings( element );\n\t\t}\n\n\t\t// Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\n\t\t// DOM selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\tif ( isInlineFillerRenderingPossible ) {\n\t\t\t// There was inline filler rendered in the DOM but it's not\n\t\t\t// at the selection position any more, so we can remove it\n\t\t\t// (cause even if it's needed, it must be placed in another location).\n\t\t\tif ( this._inlineFiller && !this._isSelectionInInlineFiller() ) {\n\t\t\t\tthis._removeInlineFiller();\n\t\t\t}\n\n\t\t\t// If we've got the filler, let's try to guess its position in the view.\n\t\t\tif ( this._inlineFiller ) {\n\t\t\t\tinlineFillerPosition = this._getInlineFillerPosition();\n\t\t\t}\n\t\t\t// Otherwise, if it's needed, create it at the selection position.\n\t\t\telse if ( this._needsInlineFillerAtSelection() ) {\n\t\t\t\tinlineFillerPosition = this.selection.getFirstPosition()!;\n\n\t\t\t\t// Do not use `markToSync` so it will be added even if the parent is already added.\n\t\t\t\tthis.markedChildren.add( inlineFillerPosition.parent as ViewElement );\n\t\t\t}\n\t\t}\n\t\t// Make sure the inline filler has any parent, so it can be mapped to view position by DomConverter.\n\t\telse if ( this._inlineFiller && this._inlineFiller.parentNode ) {\n\t\t\t// While the user is making selection, preserve the inline filler at its original position.\n\t\t\tinlineFillerPosition = this.domConverter.domPositionToView( this._inlineFiller )!;\n\n\t\t\t// While down-casting the document selection attributes, all existing empty\n\t\t\t// attribute elements (for selection position) are removed from the view and DOM,\n\t\t\t// so make sure that we were able to map filler position.\n\t\t\t// https://github.com/ckeditor/ckeditor5/issues/12026\n\t\t\tif ( inlineFillerPosition && inlineFillerPosition.parent.is( '$text' ) ) {\n\t\t\t\t// The inline filler position is expected to be before the text node.\n\t\t\t\tinlineFillerPosition = ViewPosition._createBefore( inlineFillerPosition.parent );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const element of this.markedAttributes ) {\n\t\t\tthis._updateAttrs( element );\n\t\t}\n\n\t\tfor ( const element of this.markedChildren ) {\n\t\t\tthis._updateChildren( element, { inlineFillerPosition } );\n\t\t}\n\n\t\tfor ( const node of this.markedTexts ) {\n\t\t\tif ( !this.markedChildren.has( node.parent as ViewElement ) && this.domConverter.mapViewToDom( node.parent as ViewElement ) ) {\n\t\t\t\tthis._updateText( node as ViewText, { inlineFillerPosition } );\n\t\t\t}\n\t\t}\n\n\t\t// * Check whether the inline filler is required and where it really is in the DOM.\n\t\t// At this point in most cases it will be in the DOM, but there are exceptions.\n\t\t// For example, if the inline filler was deep in the created DOM structure, it will not be created.\n\t\t// Similarly, if it was removed at the beginning of this function and then neither text nor children were updated,\n\t\t// it will not be present. Fix those and similar scenarios.\n\t\t// * Don't manipulate inline fillers while the selection is being made in (non-Android) Blink to prevent accidental\n\t\t// DOM selection collapsing\n\t\t// (https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723).\n\t\tif ( isInlineFillerRenderingPossible ) {\n\t\t\tif ( inlineFillerPosition ) {\n\t\t\t\tconst fillerDomPosition = this.domConverter.viewPositionToDom( inlineFillerPosition )!;\n\t\t\t\tconst domDocument = fillerDomPosition.parent.ownerDocument!;\n\n\t\t\t\tif ( !startsWithFiller( fillerDomPosition.parent ) ) {\n\t\t\t\t\t// Filler has not been created at filler position. Create it now.\n\t\t\t\t\tthis._inlineFiller = addInlineFiller( domDocument, fillerDomPosition.parent, fillerDomPosition.offset );\n\t\t\t\t} else {\n\t\t\t\t\t// Filler has been found, save it.\n\t\t\t\t\tthis._inlineFiller = fillerDomPosition.parent as DomText;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// There is no filler needed.\n\t\t\t\tthis._inlineFiller = null;\n\t\t\t}\n\t\t}\n\n\t\t// First focus the new editing host, then update the selection.\n\t\t// Otherwise, FF may throw an error (https://github.com/ckeditor/ckeditor5/issues/721).\n\t\tthis._updateFocus();\n\t\tthis._updateSelection();\n\n\t\tthis.domConverter._clearTemporaryCustomProperties();\n\n\t\tthis.markedTexts.clear();\n\t\tthis.markedAttributes.clear();\n\t\tthis.markedChildren.clear();\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t// @if CK_DEBUG_TYPING // }\n\t}\n\n\t/**\n\t * Updates mappings of view element's children.\n\t *\n\t * Children that were replaced in the view structure by similar elements (same tag name) are treated as 'replaced'.\n\t * This means that their mappings can be updated so the new view elements are mapped to the existing DOM elements.\n\t * Thanks to that these elements do not need to be re-rendered completely.\n\t *\n\t * @param viewElement The view element whose children mappings will be updated.\n\t */\n\tprivate _updateChildrenMappings( viewElement: ViewElement ): void {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM and there is no need to process it.\n\t\t\treturn;\n\t\t}\n\n\t\t// Removing nodes from the DOM as we iterate can cause `actualDomChildren`\n\t\t// (which is a live-updating `NodeList`) to get out of sync with the\n\t\t// indices that we compute as we iterate over `actions`.\n\t\t// This would produce incorrect element mappings.\n\t\t//\n\t\t// Converting live list to an array to make the list static.\n\t\tconst actualDomChildren = Array.from(\n\t\t\tdomElement.childNodes\n\t\t);\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, { withChildren: false } )\n\t\t);\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\t\tconst actions = this._findUpdateActions( diff, actualDomChildren, expectedDomChildren, areSimilarElements );\n\n\t\tif ( actions.indexOf( 'update' ) !== -1 ) {\n\t\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\t\tfor ( const action of actions ) {\n\t\t\t\tif ( action === 'update' ) {\n\t\t\t\t\tconst insertIndex = counter.equal + counter.insert;\n\t\t\t\t\tconst deleteIndex = counter.equal + counter.delete;\n\t\t\t\t\tconst viewChild = viewElement.getChild( insertIndex );\n\n\t\t\t\t\t// UIElement and RawElement are special cases. Their children are not stored in a view (#799)\n\t\t\t\t\t// so we cannot use them with replacing flow (since they use view children during rendering\n\t\t\t\t\t// which will always result in rendering empty elements).\n\t\t\t\t\tif ( viewChild && !viewChild.is( 'uiElement' ) && !viewChild.is( 'rawElement' ) ) {\n\t\t\t\t\t\tthis._updateElementMappings( viewChild as ViewElement, actualDomChildren[ deleteIndex ] as DomElement );\n\t\t\t\t\t}\n\n\t\t\t\t\tremove( expectedDomChildren[ insertIndex ] );\n\t\t\t\t\tcounter.equal++;\n\t\t\t\t} else {\n\t\t\t\t\tcounter[ action ]++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates mappings of a given view element.\n\t *\n\t * @param viewElement The view element whose mappings will be updated.\n\t * @param domElement The DOM element representing the given view element.\n\t */\n\tprivate _updateElementMappings( viewElement: ViewElement, domElement: DomElement ): void {\n\t\t// Remap 'DomConverter' bindings.\n\t\tthis.domConverter.unbindDomElement( domElement );\n\t\tthis.domConverter.bindElements( domElement, viewElement );\n\n\t\t// View element may have children which needs to be updated, but are not marked, mark them to update.\n\t\tthis.markedChildren.add( viewElement );\n\n\t\t// Because we replace new view element mapping with the existing one, the corresponding DOM element\n\t\t// will not be rerendered. The new view element may have different attributes than the previous one.\n\t\t// Since its corresponding DOM element will not be rerendered, new attributes will not be added\n\t\t// to the DOM, so we need to mark it here to make sure its attributes gets updated. See #1427 for more\n\t\t// detailed case study.\n\t\t// Also there are cases where replaced element is removed from the view structure and then has\n\t\t// its attributes changed or removed. In such cases the element will not be present in `markedAttributes`\n\t\t// and also may be the same (`element.isSimilar()`) as the reused element not having its attributes updated.\n\t\t// To prevent such situations we always mark reused element to have its attributes rerenderd (#1560).\n\t\tthis.markedAttributes.add( viewElement );\n\t}\n\n\t/**\n\t * Gets the position of the inline filler based on the current selection.\n\t * Here, we assume that we know that the filler is needed and\n\t * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it is needed,\n\t * it is somewhere at the selection position.\n\t *\n\t * Note: The filler position cannot be restored based on the filler's DOM text node, because\n\t * when this method is called (before rendering), the bindings will often be broken. View-to-DOM\n\t * bindings are only dependable after rendering.\n\t */\n\tprivate _getInlineFillerPosition(): ViewPosition {\n\t\tconst firstPos = this.selection.getFirstPosition()!;\n\n\t\tif ( firstPos.parent.is( '$text' ) ) {\n\t\t\treturn ViewPosition._createBefore( firstPos.parent );\n\t\t} else {\n\t\t\treturn firstPos;\n\t\t}\n\t}\n\n\t/**\n\t * Returns `true` if the selection has not left the inline filler's text node.\n\t * If it is `true`, it means that the filler had been added for a reason and the selection did not\n\t * leave the filler's text node. For example, the user can be in the middle of a composition so it should not be touched.\n\t *\n\t * @returns `true` if the inline filler and selection are in the same place.\n\t */\n\tprivate _isSelectionInInlineFiller(): boolean {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Note, we can't check if selection's position equals position of the\n\t\t// this._inlineFiller node, because of #663. We may not be able to calculate\n\t\t// the filler's position in the view at this stage.\n\t\t// Instead, we check it the other way – whether selection is anchored in\n\t\t// that text node or next to it.\n\n\t\t// Possible options are:\n\t\t// \"FILLER{}\"\n\t\t// \"FILLERadded-text{}\"\n\t\tconst selectionPosition = this.selection.getFirstPosition()!;\n\t\tconst position = this.domConverter.viewPositionToDom( selectionPosition );\n\n\t\tif ( position && isText( position.parent ) && startsWithFiller( position.parent ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Removes the inline filler.\n\t */\n\tprivate _removeInlineFiller(): void {\n\t\tconst domFillerNode = this._inlineFiller!;\n\n\t\t// Something weird happened and the stored node doesn't contain the filler's text.\n\t\tif ( !startsWithFiller( domFillerNode ) ) {\n\t\t\t/**\n\t\t\t * The inline filler node was lost. Most likely, something overwrote the filler text node\n\t\t\t * in the DOM.\n\t\t\t *\n\t\t\t * @error view-renderer-filler-was-lost\n\t\t\t */\n\t\t\tthrow new CKEditorError( 'view-renderer-filler-was-lost', this );\n\t\t}\n\n\t\tif ( isInlineFiller( domFillerNode ) ) {\n\t\t\tdomFillerNode.remove();\n\t\t} else {\n\t\t\tdomFillerNode.data = domFillerNode.data.substr( INLINE_FILLER_LENGTH );\n\t\t}\n\n\t\tthis._inlineFiller = null;\n\t}\n\n\t/**\n\t * Checks if the inline {@link module:engine/view/filler filler} should be added.\n\t *\n\t * @returns `true` if the inline filler should be added.\n\t */\n\tprivate _needsInlineFillerAtSelection(): boolean {\n\t\tif ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst selectionPosition = this.selection.getFirstPosition()!;\n\t\tconst selectionParent = selectionPosition.parent;\n\t\tconst selectionOffset = selectionPosition.offset;\n\n\t\t// If there is no DOM root we do not care about fillers.\n\t\tif ( !this.domConverter.mapViewToDom( selectionParent.root ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !( selectionParent.is( 'element' ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Prevent adding inline filler inside elements with contenteditable=false.\n\t\t// https://github.com/ckeditor/ckeditor5-engine/issues/1170\n\t\tif ( !isEditable( selectionParent ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We have block filler, we do not need inline one.\n\t\tif ( selectionOffset === selectionParent.getFillerOffset!() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst nodeBefore = selectionPosition.nodeBefore;\n\t\tconst nodeAfter = selectionPosition.nodeAfter;\n\n\t\tif ( nodeBefore instanceof ViewText || nodeAfter instanceof ViewText ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Do not use inline filler while typing outside inline elements on Android.\n\t\t// The deleteContentBackward would remove part of the inline filler instead of removing last letter in a link.\n\t\tif ( env.isAndroid && ( nodeBefore || nodeAfter ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks if text needs to be updated and possibly updates it.\n\t *\n\t * @param viewText View text to update.\n\t * @param options.inlineFillerPosition The position where the inline filler should be rendered.\n\t */\n\tprivate _updateText( viewText: ViewText, options: { inlineFillerPosition?: ViewPosition | null } ) {\n\t\tconst domText = this.domConverter.findCorrespondingDomText( viewText )!;\n\t\tconst newDomText = this.domConverter.viewToDom( viewText );\n\n\t\tlet expectedText = newDomText.data;\n\t\tconst filler = options.inlineFillerPosition;\n\n\t\tif ( filler && filler.parent == viewText.parent && filler.offset == viewText.index ) {\n\t\t\texpectedText = INLINE_FILLER + expectedText;\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update text',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\tupdateTextNode( domText, expectedText );\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t// @if CK_DEBUG_TYPING // }\n\t}\n\n\t/**\n\t * Checks if attribute list needs to be updated and possibly updates it.\n\t *\n\t * @param viewElement The view element to update.\n\t */\n\tprivate _updateAttrs( viewElement: ViewElement ): void {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that 'viewElement' is outdated as its mapping was updated\n\t\t\t// in 'this._updateChildrenMappings()'. There is no need to process it as new view element which\n\t\t\t// replaced old 'viewElement' mapping was also added to 'this.markedAttributes'\n\t\t\t// in 'this._updateChildrenMappings()' so it will be processed separately.\n\t\t\treturn;\n\t\t}\n\n\t\tconst domAttrKeys = Array.from( ( domElement as DomElement ).attributes ).map( attr => attr.name );\n\t\tconst viewAttrKeys = viewElement.getAttributeKeys();\n\n\t\t// Add or overwrite attributes.\n\t\tfor ( const key of viewAttrKeys ) {\n\t\t\tthis.domConverter.setDomElementAttribute( domElement as DomElement, key, viewElement.getAttribute( key )!, viewElement );\n\t\t}\n\n\t\t// Remove from DOM attributes which do not exists in the view.\n\t\tfor ( const key of domAttrKeys ) {\n\t\t\t// All other attributes not present in the DOM should be removed.\n\t\t\tif ( !viewElement.hasAttribute( key ) ) {\n\t\t\t\tthis.domConverter.removeDomElementAttribute( domElement as DomElement, key );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if elements child list needs to be updated and possibly updates it.\n\t *\n\t * Note that on Android, to reduce the risk of composition breaks, it tries to update data of an existing\n\t * child text nodes instead of replacing them completely.\n\t *\n\t * @param viewElement View element to update.\n\t * @param options.inlineFillerPosition The position where the inline filler should be rendered.\n\t */\n\tprivate _updateChildren( viewElement: ViewElement, options: { inlineFillerPosition: ViewPosition | null } ) {\n\t\tconst domElement = this.domConverter.mapViewToDom( viewElement );\n\n\t\tif ( !domElement ) {\n\t\t\t// If there is no `domElement` it means that it was already removed from DOM.\n\t\t\t// There is no need to process it. It will be processed when re-inserted.\n\t\t\treturn;\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update children',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t// IME on Android inserts a new text node while typing after a link\n\t\t// instead of updating an existing text node that follows the link.\n\t\t// We must normalize those text nodes so the diff won't get confused.\n\t\t// https://github.com/ckeditor/ckeditor5/issues/12574.\n\t\tif ( env.isAndroid ) {\n\t\t\tlet previousDomNode = null;\n\n\t\t\tfor ( const domNode of Array.from( domElement.childNodes ) ) {\n\t\t\t\tif ( previousDomNode && isText( previousDomNode ) && isText( domNode ) ) {\n\t\t\t\t\tdomElement.normalize();\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpreviousDomNode = domNode;\n\t\t\t}\n\t\t}\n\n\t\tconst inlineFillerPosition = options.inlineFillerPosition;\n\t\tconst actualDomChildren = domElement.childNodes;\n\t\tconst expectedDomChildren = Array.from(\n\t\t\tthis.domConverter.viewChildrenToDom( viewElement, { bind: true } )\n\t\t);\n\n\t\t// Inline filler element has to be created as it is present in the DOM, but not in the view. It is required\n\t\t// during diffing so text nodes could be compared correctly and also during rendering to maintain\n\t\t// proper order and indexes while updating the DOM.\n\t\tif ( inlineFillerPosition && inlineFillerPosition.parent === viewElement ) {\n\t\t\taddInlineFiller( ( domElement as DomElement ).ownerDocument, expectedDomChildren, inlineFillerPosition.offset );\n\t\t}\n\n\t\tconst diff = this._diffNodeLists( actualDomChildren, expectedDomChildren );\n\n\t\t// We need to make sure that we update the existing text node and not replace it with another one.\n\t\t// The composition and different \"language\" browser extensions are fragile to text node being completely replaced.\n\t\tconst actions = this._findUpdateActions( diff, actualDomChildren, expectedDomChildren, areTextNodes );\n\n\t\tlet i = 0;\n\t\tconst nodesToUnbind: Set = new Set();\n\n\t\t// Handle deletions first.\n\t\t// This is to prevent a situation where an element that already exists in `actualDomChildren` is inserted at a different\n\t\t// index in `actualDomChildren`. Since `actualDomChildren` is a `NodeList`, this works like move, not like an insert,\n\t\t// and it disrupts the whole algorithm. See https://github.com/ckeditor/ckeditor5/issues/6367.\n\t\t//\n\t\t// It doesn't matter in what order we remove or add nodes, as long as we remove and add correct nodes at correct indexes.\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'delete' ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Remove node',\n\t\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', actualDomChildren[ i ]\n\t\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\t\t\t\tnodesToUnbind.add( actualDomChildren[ i ] as DomElement );\n\t\t\t\tremove( actualDomChildren[ i ] );\n\t\t\t} else if ( action === 'equal' || action === 'update' ) {\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\ti = 0;\n\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Insert node',\n\t\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', expectedDomChildren[ i ]\n\t\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t\t\tinsertAt( domElement as DomElement, i, expectedDomChildren[ i ] );\n\t\t\t\ti++;\n\t\t\t}\n\t\t\t// Update the existing text node data. Note that replace action is generated only for Android for now.\n\t\t\telse if ( action === 'update' ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.group( '%c[Renderer]%c Update text node',\n\t\t\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', ''\n\t\t\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\n\t\t\t\tupdateTextNode( actualDomChildren[ i ] as DomText, ( expectedDomChildren[ i ] as DomText ).data );\n\t\t\t\ti++;\n\n\t\t\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t\t\t// @if CK_DEBUG_TYPING // }\n\t\t\t} else if ( action === 'equal' ) {\n\t\t\t\t// Force updating text nodes inside elements which did not change and do not need to be re-rendered (#1125).\n\t\t\t\t// Do it here (not in the loop above) because only after insertions the `i` index is correct.\n\t\t\t\tthis._markDescendantTextToSync( this.domConverter.domToView( expectedDomChildren[ i ] ) as any );\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\t// Unbind removed nodes. When node does not have a parent it means that it was removed from DOM tree during\n\t\t// comparison with the expected DOM. We don't need to check child nodes, because if child node was reinserted,\n\t\t// it was moved to DOM tree out of the removed node.\n\t\tfor ( const node of nodesToUnbind ) {\n\t\t\tif ( !node.parentNode ) {\n\t\t\t\tthis.domConverter.unbindDomElement( node as DomElement );\n\t\t\t}\n\t\t}\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.groupEnd();\n\t\t// @if CK_DEBUG_TYPING // }\n\t}\n\n\t/**\n\t * Shorthand for diffing two arrays or node lists of DOM nodes.\n\t *\n\t * @param actualDomChildren Actual DOM children\n\t * @param expectedDomChildren Expected DOM children.\n\t * @returns The list of actions based on the {@link module:utils/diff~diff} function.\n\t */\n\tprivate _diffNodeLists( actualDomChildren: Array | NodeList, expectedDomChildren: Array | NodeList ) {\n\t\tactualDomChildren = filterOutFakeSelectionContainer( actualDomChildren, this._fakeSelectionContainer );\n\n\t\treturn diff( actualDomChildren, expectedDomChildren, sameNodes.bind( null, this.domConverter ) );\n\t}\n\n\t/**\n\t * Finds DOM nodes that were replaced with the similar nodes (same tag name) in the view. All nodes are compared\n\t * within one `insert`/`delete` action group, for example:\n\t *\n\t * ```\n\t * Actual DOM:\t\t

FooBarBazBax

\n\t * Expected DOM:\t

Bar123Baz456

\n\t * Input actions:\t[ insert, insert, delete, delete, equal, insert, delete ]\n\t * Output actions:\t[ insert, replace, delete, equal, replace ]\n\t * ```\n\t *\n\t * @param actions Actions array which is a result of the {@link module:utils/diff~diff} function.\n\t * @param actualDom Actual DOM children\n\t * @param expectedDom Expected DOM children.\n\t * @param comparator A comparator function that should return `true` if the given node should be reused\n\t * (either by the update of a text node data or an element children list for similar elements).\n\t * @returns Actions array modified with the `update` actions.\n\t */\n\tprivate _findUpdateActions(\n\t\tactions: Array,\n\t\tactualDom: Array | NodeList,\n\t\texpectedDom: Array,\n\t\tcomparator: ( a: DomNode, b: DomNode ) => boolean\n\t): Array {\n\t\t// If there is no both 'insert' and 'delete' actions, no need to check for replaced elements.\n\t\tif ( actions.indexOf( 'insert' ) === -1 || actions.indexOf( 'delete' ) === -1 ) {\n\t\t\treturn actions;\n\t\t}\n\n\t\tlet newActions: Array = [];\n\t\tlet actualSlice = [];\n\t\tlet expectedSlice = [];\n\n\t\tconst counter = { equal: 0, insert: 0, delete: 0 };\n\n\t\tfor ( const action of actions ) {\n\t\t\tif ( action === 'insert' ) {\n\t\t\t\texpectedSlice.push( expectedDom[ counter.equal + counter.insert ] );\n\t\t\t} else if ( action === 'delete' ) {\n\t\t\t\tactualSlice.push( actualDom[ counter.equal + counter.delete ] );\n\t\t\t} else { // equal\n\t\t\t\tnewActions = newActions.concat(\n\t\t\t\t\tdiff( actualSlice, expectedSlice, comparator )\n\t\t\t\t\t\t.map( action => action === 'equal' ? 'update' : action )\n\t\t\t\t);\n\n\t\t\t\tnewActions.push( 'equal' );\n\n\t\t\t\t// Reset stored elements on 'equal'.\n\t\t\t\tactualSlice = [];\n\t\t\t\texpectedSlice = [];\n\t\t\t}\n\t\t\tcounter[ action ]++;\n\t\t}\n\n\t\treturn newActions.concat(\n\t\t\tdiff( actualSlice, expectedSlice, comparator )\n\t\t\t\t.map( action => action === 'equal' ? 'update' : action )\n\t\t);\n\t}\n\n\t/**\n\t * Marks text nodes to be synchronized.\n\t *\n\t * If a text node is passed, it will be marked. If an element is passed, all descendant text nodes inside it will be marked.\n\t *\n\t * @param viewNode View node to sync.\n\t */\n\tprivate _markDescendantTextToSync( viewNode: ViewNode | undefined ): void {\n\t\tif ( !viewNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( viewNode.is( '$text' ) ) {\n\t\t\tthis.markedTexts.add( viewNode );\n\t\t} else if ( viewNode.is( 'element' ) ) {\n\t\t\tfor ( const child of viewNode.getChildren() ) {\n\t\t\t\tthis._markDescendantTextToSync( child );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the selection needs to be updated and possibly updates it.\n\t */\n\tprivate _updateSelection(): void {\n\t\t// Block updating DOM selection in (non-Android) Blink while the user is selecting to prevent accidental selection collapsing.\n\t\t// Note: Structural changes in DOM must trigger selection rendering, though. Nodes the selection was anchored\n\t\t// to, may disappear in DOM which would break the selection (e.g. in real-time collaboration scenarios).\n\t\t// https://github.com/ckeditor/ckeditor5/issues/10562, https://github.com/ckeditor/ckeditor5/issues/10723\n\t\tif ( env.isBlink && !env.isAndroid && this.isSelecting && !this.markedChildren.size ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there is no selection - remove DOM and fake selections.\n\t\tif ( this.selection.rangeCount === 0 ) {\n\t\t\tthis._removeDomSelection();\n\t\t\tthis._removeFakeSelection();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst domRoot = this.domConverter.mapViewToDom( this.selection.editableElement! );\n\n\t\t// Do nothing if there is no focus, or there is no DOM element corresponding to selection's editable element.\n\t\tif ( !this.isFocused || !domRoot ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Render fake selection - create the fake selection container (if needed) and move DOM selection to it.\n\t\tif ( this.selection.isFake ) {\n\t\t\tthis._updateFakeSelection( domRoot );\n\t\t}\n\t\t// There was a fake selection so remove it and update the DOM selection.\n\t\t// This is especially important on Android because otherwise IME will try to compose over the fake selection container.\n\t\telse if ( this._fakeSelectionContainer && this._fakeSelectionContainer.isConnected ) {\n\t\t\tthis._removeFakeSelection();\n\t\t\tthis._updateDomSelection( domRoot );\n\t\t}\n\t\t// Update the DOM selection in case of a plain selection change (no fake selection is involved).\n\t\t// On non-Android the whole rendering is disabled in composition mode (including DOM selection update),\n\t\t// but updating DOM selection should be also disabled on Android if in the middle of the composition\n\t\t// (to not interrupt it).\n\t\telse if ( !( this.isComposing && env.isAndroid ) ) {\n\t\t\tthis._updateDomSelection( domRoot );\n\t\t}\n\t}\n\n\t/**\n\t * Updates the fake selection.\n\t *\n\t * @param domRoot A valid DOM root where the fake selection container should be added.\n\t */\n\tprivate _updateFakeSelection( domRoot: DomElement ): void {\n\t\tconst domDocument = domRoot.ownerDocument;\n\n\t\tif ( !this._fakeSelectionContainer ) {\n\t\t\tthis._fakeSelectionContainer = createFakeSelectionContainer( domDocument );\n\t\t}\n\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\t// Bind fake selection container with the current selection *position*.\n\t\tthis.domConverter.bindFakeSelection( container, this.selection );\n\n\t\tif ( !this._fakeSelectionNeedsUpdate( domRoot ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !container.parentElement || container.parentElement != domRoot ) {\n\t\t\tdomRoot.appendChild( container );\n\t\t}\n\n\t\tcontainer.textContent = this.selection.fakeSelectionLabel || '\\u00A0';\n\n\t\tconst domSelection = domDocument.getSelection()!;\n\t\tconst domRange = domDocument.createRange();\n\n\t\tdomSelection.removeAllRanges();\n\t\tdomRange.selectNodeContents( container );\n\t\tdomSelection.addRange( domRange );\n\t}\n\n\t/**\n\t * Updates the DOM selection.\n\t *\n\t * @param domRoot A valid DOM root where the DOM selection should be rendered.\n\t */\n\tprivate _updateDomSelection( domRoot: DomElement ) {\n\t\tconst domSelection = domRoot.ownerDocument.defaultView!.getSelection()!;\n\n\t\t// Let's check whether DOM selection needs updating at all.\n\t\tif ( !this._domSelectionNeedsUpdate( domSelection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Multi-range selection is not available in most browsers, and, at least in Chrome, trying to\n\t\t// set such selection, that is not continuous, throws an error. Because of that, we will just use anchor\n\t\t// and focus of view selection.\n\t\t// Since we are not supporting multi-range selection, we also do not need to check if proper editable is\n\t\t// selected. If there is any editable selected, it is okay (editable is taken from selection anchor).\n\t\tconst anchor = this.domConverter.viewPositionToDom( this.selection.anchor! )!;\n\t\tconst focus = this.domConverter.viewPositionToDom( this.selection.focus! )!;\n\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Update DOM selection:',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '', anchor, focus\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\tdomSelection.setBaseAndExtent( anchor.parent, anchor.offset, focus.parent, focus.offset );\n\n\t\t// Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n\t\tif ( env.isGecko ) {\n\t\t\tfixGeckoSelectionAfterBr( focus, domSelection );\n\t\t}\n\t}\n\n\t/**\n\t * Checks whether a given DOM selection needs to be updated.\n\t *\n\t * @param domSelection The DOM selection to check.\n\t */\n\tprivate _domSelectionNeedsUpdate( domSelection: Selection ): boolean {\n\t\tif ( !this.domConverter.isDomSelectionCorrect( domSelection ) ) {\n\t\t\t// Current DOM selection is in incorrect position. We need to update it.\n\t\t\treturn true;\n\t\t}\n\n\t\tconst oldViewSelection = domSelection && this.domConverter.domSelectionToView( domSelection );\n\n\t\tif ( oldViewSelection && this.selection.isEqual( oldViewSelection ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If selection is not collapsed, it does not need to be updated if it is similar.\n\t\tif ( !this.selection.isCollapsed && this.selection.isSimilar( oldViewSelection ) ) {\n\t\t\t// Selection did not changed and is correct, do not update.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Selections are not similar.\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks whether the fake selection needs to be updated.\n\t *\n\t * @param domRoot A valid DOM root where a new fake selection container should be added.\n\t */\n\tprivate _fakeSelectionNeedsUpdate( domRoot: DomElement ): boolean {\n\t\tconst container = this._fakeSelectionContainer;\n\t\tconst domSelection = domRoot.ownerDocument.getSelection()!;\n\n\t\t// Fake selection needs to be updated if there's no fake selection container, or the container currently sits\n\t\t// in a different root.\n\t\tif ( !container || container.parentElement !== domRoot ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Make sure that the selection actually is within the fake selection.\n\t\tif ( domSelection.anchorNode !== container && !container.contains( domSelection.anchorNode ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn container.textContent !== this.selection.fakeSelectionLabel;\n\t}\n\n\t/**\n\t * Removes the DOM selection.\n\t */\n\tprivate _removeDomSelection(): void {\n\t\tfor ( const doc of this.domDocuments ) {\n\t\t\tconst domSelection = doc.getSelection()!;\n\n\t\t\tif ( domSelection.rangeCount ) {\n\t\t\t\tconst activeDomElement = doc.activeElement!;\n\t\t\t\tconst viewElement = this.domConverter.mapDomToView( activeDomElement as DomElement );\n\n\t\t\t\tif ( activeDomElement && viewElement ) {\n\t\t\t\t\tdomSelection.removeAllRanges();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes the fake selection.\n\t */\n\tprivate _removeFakeSelection(): void {\n\t\tconst container = this._fakeSelectionContainer;\n\n\t\tif ( container ) {\n\t\t\tcontainer.remove();\n\t\t}\n\t}\n\n\t/**\n\t * Checks if focus needs to be updated and possibly updates it.\n\t */\n\tprivate _updateFocus(): void {\n\t\tif ( this.isFocused ) {\n\t\t\tconst editable = this.selection.editableElement;\n\n\t\t\tif ( editable ) {\n\t\t\t\tthis.domConverter.focus( editable );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Checks if provided element is editable.\n */\nfunction isEditable( element: ViewElement ): boolean {\n\tif ( element.getAttribute( 'contenteditable' ) == 'false' ) {\n\t\treturn false;\n\t}\n\n\tconst parent = element.findAncestor( element => element.hasAttribute( 'contenteditable' ) );\n\n\treturn !parent || parent.getAttribute( 'contenteditable' ) == 'true';\n}\n\n/**\n * Adds inline filler at a given position.\n *\n * The position can be given as an array of DOM nodes and an offset in that array,\n * or a DOM parent element and an offset in that element.\n *\n * @returns The DOM text node that contains an inline filler.\n */\nfunction addInlineFiller( domDocument: DomDocument, domParentOrArray: DomNode | Array, offset: number ): DomText {\n\tconst childNodes = domParentOrArray instanceof Array ? domParentOrArray : domParentOrArray.childNodes;\n\tconst nodeAfterFiller = childNodes[ offset ];\n\n\tif ( isText( nodeAfterFiller ) ) {\n\t\tnodeAfterFiller.data = INLINE_FILLER + nodeAfterFiller.data;\n\n\t\treturn nodeAfterFiller;\n\t} else {\n\t\tconst fillerNode = domDocument.createTextNode( INLINE_FILLER );\n\n\t\tif ( Array.isArray( domParentOrArray ) ) {\n\t\t\t( childNodes as Array ).splice( offset, 0, fillerNode );\n\t\t} else {\n\t\t\tinsertAt( domParentOrArray as DomElement, offset, fillerNode );\n\t\t}\n\n\t\treturn fillerNode;\n\t}\n}\n\n/**\n * Whether two DOM nodes should be considered as similar.\n * Nodes are considered similar if they have the same tag name.\n */\nfunction areSimilarElements( node1: DomNode, node2: DomNode ): boolean {\n\treturn isNode( node1 ) && isNode( node2 ) &&\n\t\t!isText( node1 ) && !isText( node2 ) &&\n\t\t!isComment( node1 ) && !isComment( node2 ) &&\n\t\t( node1 as DomElement ).tagName.toLowerCase() === ( node2 as DomElement ).tagName.toLowerCase();\n}\n\n/**\n * Whether two DOM nodes are text nodes.\n */\nfunction areTextNodes( node1: DomNode, node2: DomNode ): boolean {\n\treturn isNode( node1 ) && isNode( node2 ) &&\n\t\tisText( node1 ) && isText( node2 );\n}\n\n/**\n * Whether two dom nodes should be considered as the same.\n * Two nodes which are considered the same are:\n *\n * * Text nodes with the same text.\n * * Element nodes represented by the same object.\n * * Two block filler elements.\n *\n * @param blockFillerMode Block filler mode, see {@link module:engine/view/domconverter~DomConverter#blockFillerMode}.\n */\nfunction sameNodes( domConverter: DomConverter, actualDomChild: DomNode, expectedDomChild: DomNode ): boolean {\n\t// Elements.\n\tif ( actualDomChild === expectedDomChild ) {\n\t\treturn true;\n\t}\n\t// Texts.\n\telse if ( isText( actualDomChild ) && isText( expectedDomChild ) ) {\n\t\treturn actualDomChild.data === expectedDomChild.data;\n\t}\n\t// Block fillers.\n\telse if ( domConverter.isBlockFiller( actualDomChild ) &&\n\t\tdomConverter.isBlockFiller( expectedDomChild ) ) {\n\t\treturn true;\n\t}\n\n\t// Not matching types.\n\treturn false;\n}\n\n/**\n * The following is a Firefox–specific hack (https://github.com/ckeditor/ckeditor5-engine/issues/1439).\n * When the native DOM selection is at the end of the block and preceded by
e.g.\n *\n * ```html\n *

foo
[]

\n * ```\n *\n * which happens a lot when using the soft line break, the browser fails to (visually) move the\n * caret to the new line. A quick fix is as simple as force–refreshing the selection with the same range.\n */\nfunction fixGeckoSelectionAfterBr( focus: ReturnType, domSelection: DomSelection ) {\n\tconst parent = focus!.parent;\n\n\t// This fix works only when the focus point is at the very end of an element.\n\t// There is no point in running it in cases unrelated to the browser bug.\n\tif ( parent.nodeType != Node.ELEMENT_NODE || focus!.offset != parent.childNodes.length - 1 ) {\n\t\treturn;\n\t}\n\n\tconst childAtOffset = parent.childNodes[ focus!.offset ];\n\n\t// To stay on the safe side, the fix being as specific as possible, it targets only the\n\t// selection which is at the very end of the element and preceded by
.\n\tif ( childAtOffset && ( childAtOffset as DomElement ).tagName == 'BR' ) {\n\t\tdomSelection.addRange( domSelection.getRangeAt( 0 ) );\n\t}\n}\n\nfunction filterOutFakeSelectionContainer( domChildList: Array | NodeList, fakeSelectionContainer: DomElement | null ) {\n\tconst childList = Array.from( domChildList );\n\n\tif ( childList.length == 0 || !fakeSelectionContainer ) {\n\t\treturn childList;\n\t}\n\n\tconst last = childList[ childList.length - 1 ];\n\n\tif ( last == fakeSelectionContainer ) {\n\t\tchildList.pop();\n\t}\n\n\treturn childList;\n}\n\n/**\n * Creates a fake selection container for a given document.\n */\nfunction createFakeSelectionContainer( domDocument: DomDocument ): DomElement {\n\tconst container = domDocument.createElement( 'div' );\n\n\tcontainer.className = 'ck-fake-selection-container';\n\n\tObject.assign( container.style, {\n\t\tposition: 'fixed',\n\t\ttop: 0,\n\t\tleft: '-9999px',\n\t\t// See https://github.com/ckeditor/ckeditor5/issues/752.\n\t\twidth: '42px'\n\t} );\n\n\t// Fill it with a text node so we can update it later.\n\tcontainer.textContent = '\\u00A0';\n\n\treturn container;\n}\n\n/**\n * Checks if text needs to be updated and possibly updates it by removing and inserting only parts\n * of the data from the existing text node to reduce impact on the IME composition.\n *\n * @param domText DOM text node to update.\n * @param expectedText The expected data of a text node.\n */\nfunction updateTextNode( domText: DomText, expectedText: string ) {\n\tconst actualText = domText.data;\n\n\tif ( actualText == expectedText ) {\n\t\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Text node does not need update:',\n\t\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '',\n\t\t// @if CK_DEBUG_TYPING // \t\t`\"${ domText.data }\" (${ domText.data.length })`\n\t\t// @if CK_DEBUG_TYPING // \t);\n\t\t// @if CK_DEBUG_TYPING // }\n\n\t\treturn;\n\t}\n\n\t// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {\n\t// @if CK_DEBUG_TYPING // \tconsole.info( '%c[Renderer]%c Update text node:',\n\t// @if CK_DEBUG_TYPING // \t\t'color: green;font-weight: bold', '',\n\t// @if CK_DEBUG_TYPING // \t\t`\"${ domText.data }\" (${ domText.data.length }) -> \"${ expectedText }\" (${ expectedText.length })`\n\t// @if CK_DEBUG_TYPING // \t);\n\t// @if CK_DEBUG_TYPING // }\n\n\tconst actions = fastDiff( actualText, expectedText );\n\n\tfor ( const action of actions ) {\n\t\tif ( action.type === 'insert' ) {\n\t\t\tdomText.insertData( action.index, action.values.join( '' ) );\n\t\t} else { // 'delete'\n\t\t\tdomText.deleteData( action.index, action.howMany );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module engine/view/domconverter\n */\n\n/* globals Node, NodeFilter, DOMParser */\n\nimport ViewText from './text.js';\nimport ViewElement from './element.js';\nimport ViewUIElement from './uielement.js';\nimport ViewPosition from './position.js';\nimport ViewRange from './range.js';\nimport ViewSelection from './selection.js';\nimport ViewDocumentFragment from './documentfragment.js';\nimport ViewTreeWalker from './treewalker.js';\nimport { default as Matcher, type MatcherPattern } from './matcher.js';\nimport {\n\tBR_FILLER, INLINE_FILLER_LENGTH, NBSP_FILLER, MARKED_NBSP_FILLER,\n\tgetDataWithoutFiller, isInlineFiller, startsWithFiller\n} from './filler.js';\n\nimport {\n\tglobal,\n\tlogWarning,\n\tindexOf,\n\tgetAncestors,\n\tisText,\n\tisComment,\n\tisValidAttributeName,\n\tfirst,\n\tenv\n} from '@ckeditor/ckeditor5-utils';\n\nimport type ViewNode from './node.js';\nimport type Document from './document.js';\nimport type DocumentSelection from './documentselection.js';\nimport type EditableElement from './editableelement.js';\nimport type ViewTextProxy from './textproxy.js';\nimport type ViewRawElement from './rawelement.js';\n\ntype DomNode = globalThis.Node;\ntype DomElement = globalThis.HTMLElement;\ntype DomDocument = globalThis.Document;\ntype DomDocumentFragment = globalThis.DocumentFragment;\ntype DomComment = globalThis.Comment;\ntype DomRange = globalThis.Range;\ntype DomText = globalThis.Text;\ntype DomSelection = globalThis.Selection;\n\nconst BR_FILLER_REF = BR_FILLER( global.document ); // eslint-disable-line new-cap\nconst NBSP_FILLER_REF = NBSP_FILLER( global.document ); // eslint-disable-line new-cap\nconst MARKED_NBSP_FILLER_REF = MARKED_NBSP_FILLER( global.document ); // eslint-disable-line new-cap\nconst UNSAFE_ATTRIBUTE_NAME_PREFIX = 'data-ck-unsafe-attribute-';\nconst UNSAFE_ELEMENT_REPLACEMENT_ATTRIBUTE = 'data-ck-unsafe-element';\n\n/**\n * `DomConverter` is a set of tools to do transformations between DOM nodes and view nodes. It also handles\n * {@link module:engine/view/domconverter~DomConverter#bindElements bindings} between these nodes.\n *\n * An instance of the DOM converter is available under\n * {@link module:engine/view/view~View#domConverter `editor.editing.view.domConverter`}.\n *\n * The DOM converter does not check which nodes should be rendered (use {@link module:engine/view/renderer~Renderer}), does not keep the\n * state of a tree nor keeps the synchronization between the tree view and the DOM tree (use {@link module:engine/view/document~Document}).\n *\n * The DOM converter keeps DOM elements to view element bindings, so when the converter gets destroyed, the bindings are lost.\n * Two converters will keep separate binding maps, so one tree view can be bound with two DOM trees.\n */\nexport default class DomConverter {\n\tpublic readonly document: Document;\n\n\t/**\n\t * Whether to leave the View-to-DOM conversion result unchanged or improve editing experience by filtering out interactive data.\n\t */\n\tpublic readonly renderingMode: 'data' | 'editing';\n\n\t/**\n\t * The mode of a block filler used by the DOM converter.\n\t */\n\tpublic blockFillerMode: BlockFillerMode;\n\n\t/**\n\t * Elements which are considered pre-formatted elements.\n\t */\n\tpublic readonly preElements: Array;\n\n\t/**\n\t * Elements which are considered block elements (and hence should be filled with a\n\t * {@link #isBlockFiller block filler}).\n\t *\n\t * Whether an element is considered a block element also affects handling of trailing whitespaces.\n\t *\n\t * You can extend this array if you introduce support for block elements which are not yet recognized here.\n\t */\n\tpublic readonly blockElements: Array;\n\n\t/**\n\t * A list of elements that exist inline (in text) but their inner structure cannot be edited because\n\t * of the way they are rendered by the browser. They are mostly HTML form elements but there are other\n\t * elements such as `` or `' +\n\t\t\t\t\t\t\t''\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'spotify',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(artist\\/\\w+)/,\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(album\\/\\w+)/,\n\t\t\t\t\t\t/^open\\.spotify\\.com\\/(track\\/\\w+)/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'youtube',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^(?:m\\.)?youtube\\.com\\/watch\\?v=([\\w-]+)(?:&t=(\\d+))?/,\n\t\t\t\t\t\t/^(?:m\\.)?youtube\\.com\\/v\\/([\\w-]+)(?:\\?t=(\\d+))?/,\n\t\t\t\t\t\t/^youtube\\.com\\/embed\\/([\\w-]+)(?:\\?start=(\\d+))?/,\n\t\t\t\t\t\t/^youtu\\.be\\/([\\w-]+)(?:\\?t=(\\d+))?/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\t\t\t\t\t\tconst time = match[ 2 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'vimeo',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^vimeo\\.com\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/[^/]+\\/[^/]+\\/video\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/album\\/[^/]+\\/video\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/channels\\/[^/]+\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/groups\\/[^/]+\\/videos\\/(\\d+)/,\n\t\t\t\t\t\t/^vimeo\\.com\\/ondemand\\/[^/]+\\/(\\d+)/,\n\t\t\t\t\t\t/^player\\.vimeo\\.com\\/video\\/(\\d+)/\n\t\t\t\t\t],\n\t\t\t\t\thtml: match => {\n\t\t\t\t\t\tconst id = match[ 1 ];\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'
' +\n\t\t\t\t\t\t\t\t`' +\n\t\t\t\t\t\t\t'
'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tname: 'instagram',\n\t\t\t\t\turl: /^instagram\\.com\\/p\\/(\\w+)/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'twitter',\n\t\t\t\t\turl: /^twitter\\.com/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'googleMaps',\n\t\t\t\t\turl: [\n\t\t\t\t\t\t/^google\\.com\\/maps/,\n\t\t\t\t\t\t/^goo\\.gl\\/maps/,\n\t\t\t\t\t\t/^maps\\.google\\.com/,\n\t\t\t\t\t\t/^maps\\.app\\.goo\\.gl/\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'flickr',\n\t\t\t\t\turl: /^flickr\\.com/\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'facebook',\n\t\t\t\t\turl: /^facebook\\.com/\n\t\t\t\t}\n\t\t\t]\n\t\t} as MediaEmbedConfig );\n\n\t\tthis.registry = new MediaRegistry( editor.locale, editor.config.get( 'mediaEmbed' )! );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic init(): void {\n\t\tconst editor = this.editor;\n\t\tconst schema = editor.model.schema;\n\t\tconst t = editor.t;\n\t\tconst conversion = editor.conversion;\n\t\tconst renderMediaPreview = editor.config.get( 'mediaEmbed.previewsInData' );\n\t\tconst elementName = editor.config.get( 'mediaEmbed.elementName' )!;\n\n\t\tconst registry = this.registry;\n\n\t\teditor.commands.add( 'mediaEmbed', new MediaEmbedCommand( editor ) );\n\n\t\t// Configure the schema.\n\t\tschema.register( 'media', {\n\t\t\tinheritAllFrom: '$blockObject',\n\t\t\tallowAttributes: [ 'url' ]\n\t\t} );\n\n\t\t// Model -> Data\n\t\tconversion.for( 'dataDowncast' ).elementToStructure( {\n\t\t\tmodel: 'media',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tconst url = modelElement.getAttribute( 'url' ) as string;\n\n\t\t\t\treturn createMediaFigureElement( writer, registry, url, {\n\t\t\t\t\telementName,\n\t\t\t\t\trenderMediaPreview: !!url && renderMediaPreview\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> Data (url -> data-oembed-url)\n\t\tconversion.for( 'dataDowncast' ).add(\n\t\t\tmodelToViewUrlAttributeConverter( registry, {\n\t\t\t\telementName,\n\t\t\t\trenderMediaPreview\n\t\t\t} ) );\n\n\t\t// Model -> View (element)\n\t\tconversion.for( 'editingDowncast' ).elementToStructure( {\n\t\t\tmodel: 'media',\n\t\t\tview: ( modelElement, { writer } ) => {\n\t\t\t\tconst url = modelElement.getAttribute( 'url' ) as string;\n\t\t\t\tconst figure = createMediaFigureElement( writer, registry, url, {\n\t\t\t\t\telementName,\n\t\t\t\t\trenderForEditingView: true\n\t\t\t\t} );\n\n\t\t\t\treturn toMediaWidget( figure, writer, t( 'media widget' ) );\n\t\t\t}\n\t\t} );\n\n\t\t// Model -> View (url -> data-oembed-url)\n\t\tconversion.for( 'editingDowncast' ).add(\n\t\t\tmodelToViewUrlAttributeConverter( registry, {\n\t\t\t\telementName,\n\t\t\t\trenderForEditingView: true\n\t\t\t} ) );\n\n\t\t// View -> Model (data-oembed-url -> url)\n\t\tconversion.for( 'upcast' )\n\t\t\t// Upcast semantic media.\n\t\t\t.elementToElement( {\n\t\t\t\tview: element => [ 'oembed', elementName ].includes( element.name ) && element.getAttribute( 'url' ) ?\n\t\t\t\t\t{ name: true } :\n\t\t\t\t\tnull,\n\t\t\t\tmodel: ( viewMedia, { writer } ) => {\n\t\t\t\t\tconst url = viewMedia.getAttribute( 'url' ) as string;\n\n\t\t\t\t\tif ( registry.hasMedia( url ) ) {\n\t\t\t\t\t\treturn writer.createElement( 'media', { url } );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// Upcast non-semantic media.\n\t\t\t.elementToElement( {\n\t\t\t\tview: {\n\t\t\t\t\tname: 'div',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-oembed-url': true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodel: ( viewMedia, { writer } ) => {\n\t\t\t\t\tconst url = viewMedia.getAttribute( 'data-oembed-url' ) as string;\n\n\t\t\t\t\tif ( registry.hasMedia( url ) ) {\n\t\t\t\t\t\treturn writer.createElement( 'media', { url } );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} )\n\t\t\t// Consume `
` elements, that were left after upcast.\n\t\t\t.add( dispatcher => {\n\t\t\t\tconst converter: GetCallback = ( evt, data, conversionApi ) => {\n\t\t\t\t\tif ( !conversionApi.consumable.consume( data.viewItem, { name: true, classes: 'media' } ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { modelRange, modelCursor } = conversionApi.convertChildren( data.viewItem, data.modelCursor );\n\n\t\t\t\t\tdata.modelRange = modelRange;\n\t\t\t\t\tdata.modelCursor = modelCursor;\n\n\t\t\t\t\tconst modelElement = first( modelRange!.getItems() );\n\n\t\t\t\t\tif ( !modelElement ) {\n\t\t\t\t\t\t// Revert consumed figure so other features can convert it.\n\t\t\t\t\t\tconversionApi.consumable.revert( data.viewItem, { name: true, classes: 'media' } );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tdispatcher.on( 'element:figure', converter );\n\t\t\t} );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/automediaembed\n */\n\nimport { type Editor, Plugin } from 'ckeditor5/src/core.js';\nimport { LiveRange, LivePosition } from 'ckeditor5/src/engine.js';\nimport { Clipboard, type ClipboardPipeline } from 'ckeditor5/src/clipboard.js';\nimport { Delete } from 'ckeditor5/src/typing.js';\nimport { Undo, type UndoCommand } from 'ckeditor5/src/undo.js';\nimport { global } from 'ckeditor5/src/utils.js';\n\nimport MediaEmbedEditing from './mediaembedediting.js';\nimport { insertMedia } from './utils.js';\nimport type MediaEmbedCommand from './mediaembedcommand.js';\n\nconst URL_REGEXP = /^(?:http(s)?:\\/\\/)?[\\w-]+\\.[\\w-.~:/?#[\\]@!$&'()*+,;=%]+$/;\n\n/**\n * The auto-media embed plugin. It recognizes media links in the pasted content and embeds\n * them shortly after they are injected into the document.\n */\nexport default class AutoMediaEmbed extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic static get requires() {\n\t\treturn [ Clipboard, Delete, Undo ] as const;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic static get pluginName() {\n\t\treturn 'AutoMediaEmbed' as const;\n\t}\n\n\t/**\n\t * The paste–to–embed `setTimeout` ID. Stored as a property to allow\n\t * cleaning of the timeout.\n\t */\n\tprivate _timeoutId: number | null;\n\n\t/**\n\t * The position where the `` element will be inserted after the timeout,\n\t * determined each time the new content is pasted into the document.\n\t */\n\tprivate _positionToInsert: LivePosition | null;\n\n\t/**\n\t * @inheritDoc\n\t */\n\tconstructor( editor: Editor ) {\n\t\tsuper( editor );\n\n\t\tthis._timeoutId = null;\n\t\tthis._positionToInsert = null;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic init(): void {\n\t\tconst editor = this.editor;\n\t\tconst modelDocument = editor.model.document;\n\n\t\t// We need to listen on `Clipboard#inputTransformation` because we need to save positions of selection.\n\t\t// After pasting, the content between those positions will be checked for a URL that could be transformed\n\t\t// into media.\n\t\tconst clipboardPipeline: ClipboardPipeline = editor.plugins.get( 'ClipboardPipeline' );\n\t\tthis.listenTo( clipboardPipeline, 'inputTransformation', () => {\n\t\t\tconst firstRange = modelDocument.selection.getFirstRange()!;\n\n\t\t\tconst leftLivePosition = LivePosition.fromPosition( firstRange.start );\n\t\t\tleftLivePosition.stickiness = 'toPrevious';\n\n\t\t\tconst rightLivePosition = LivePosition.fromPosition( firstRange.end );\n\t\t\trightLivePosition.stickiness = 'toNext';\n\n\t\t\tmodelDocument.once( 'change:data', () => {\n\t\t\t\tthis._embedMediaBetweenPositions( leftLivePosition, rightLivePosition );\n\n\t\t\t\tleftLivePosition.detach();\n\t\t\t\trightLivePosition.detach();\n\t\t\t}, { priority: 'high' } );\n\t\t} );\n\n\t\tconst undoCommand: UndoCommand = editor.commands.get( 'undo' )!;\n\t\tundoCommand.on( 'execute', () => {\n\t\t\tif ( this._timeoutId ) {\n\t\t\t\tglobal.window.clearTimeout( this._timeoutId );\n\t\t\t\tthis._positionToInsert!.detach();\n\n\t\t\t\tthis._timeoutId = null;\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t}\n\t\t}, { priority: 'high' } );\n\t}\n\n\t/**\n\t * Analyzes the part of the document between provided positions in search for a URL representing media.\n\t * When the URL is found, it is automatically converted into media.\n\t *\n\t * @param leftPosition Left position of the selection.\n\t * @param rightPosition Right position of the selection.\n\t */\n\tprivate _embedMediaBetweenPositions( leftPosition: LivePosition, rightPosition: LivePosition ): void {\n\t\tconst editor = this.editor;\n\t\tconst mediaRegistry = editor.plugins.get( MediaEmbedEditing ).registry;\n\t\t// TODO: Use marker instead of LiveRange & LivePositions.\n\t\tconst urlRange = new LiveRange( leftPosition, rightPosition );\n\t\tconst walker = urlRange.getWalker( { ignoreElementEnd: true } );\n\n\t\tlet url = '';\n\n\t\tfor ( const node of walker ) {\n\t\t\tif ( node.item.is( '$textProxy' ) ) {\n\t\t\t\turl += node.item.data;\n\t\t\t}\n\t\t}\n\n\t\turl = url.trim();\n\n\t\t// If the URL does not match to universal URL regexp, let's skip that.\n\t\tif ( !url.match( URL_REGEXP ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// If the URL represents a media, let's use it.\n\t\tif ( !mediaRegistry.hasMedia( url ) ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst mediaEmbedCommand: MediaEmbedCommand = editor.commands.get( 'mediaEmbed' )!;\n\n\t\t// Do not anything if media element cannot be inserted at the current position (#47).\n\t\tif ( !mediaEmbedCommand.isEnabled ) {\n\t\t\turlRange.detach();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Position won't be available in the `setTimeout` function so let's clone it.\n\t\tthis._positionToInsert = LivePosition.fromPosition( leftPosition );\n\n\t\t// This action mustn't be executed if undo was called between pasting and auto-embedding.\n\t\tthis._timeoutId = global.window.setTimeout( () => {\n\t\t\teditor.model.change( writer => {\n\t\t\t\tthis._timeoutId = null;\n\n\t\t\t\twriter.remove( urlRange );\n\t\t\t\turlRange.detach();\n\n\t\t\t\tlet insertionPosition: LivePosition | null = null;\n\n\t\t\t\t// Check if position where the media element should be inserted is still valid.\n\t\t\t\t// Otherwise leave it as undefined to use document.selection - default behavior of model.insertContent().\n\t\t\t\tif ( this._positionToInsert!.root.rootName !== '$graveyard' ) {\n\t\t\t\t\tinsertionPosition = this._positionToInsert;\n\t\t\t\t}\n\n\t\t\t\tinsertMedia( editor.model, url, insertionPosition, false );\n\n\t\t\t\tthis._positionToInsert!.detach();\n\t\t\t\tthis._positionToInsert = null;\n\t\t\t} );\n\n\t\t\teditor.plugins.get( Delete ).requestUndoOnBackspace();\n\t\t}, 100 );\n\t}\n}\n","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaform.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/ui/mediaformview\n */\n\nimport {\n\ttype InputTextView,\n\tButtonView,\n\tFocusCycler,\n\tLabeledFieldView,\n\tView,\n\tViewCollection,\n\tcreateLabeledInputText,\n\tsubmitHandler,\n\ttype FocusableView\n} from 'ckeditor5/src/ui.js';\nimport { FocusTracker, KeystrokeHandler, type Locale } from 'ckeditor5/src/utils.js';\nimport { icons } from 'ckeditor5/src/core.js';\n\n// See: #8833.\n// eslint-disable-next-line ckeditor5-rules/ckeditor-imports\nimport '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';\nimport '../../theme/mediaform.css';\n\n/**\n * The media form view controller class.\n *\n * See {@link module:media-embed/ui/mediaformview~MediaFormView}.\n */\nexport default class MediaFormView extends View {\n\t/**\n\t * Tracks information about the DOM focus in the form.\n\t */\n\tpublic readonly focusTracker: FocusTracker;\n\n\t/**\n\t * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.\n\t */\n\tpublic readonly keystrokes: KeystrokeHandler;\n\n\t/**\n\t * The value of the URL input.\n\t */\n\tdeclare public mediaURLInputValue: string;\n\n\t/**\n\t * The URL input view.\n\t */\n\tpublic urlInputView: LabeledFieldView;\n\n\t/**\n\t * The Save button view.\n\t */\n\tpublic saveButtonView: ButtonView;\n\n\t/**\n\t * The Cancel button view.\n\t */\n\tpublic cancelButtonView: ButtonView;\n\n\t/**\n\t * A collection of views that can be focused in the form.\n\t */\n\tprivate readonly _focusables: ViewCollection;\n\n\t/**\n\t * Helps cycling over {@link #_focusables} in the form.\n\t */\n\tprivate readonly _focusCycler: FocusCycler;\n\n\t/**\n\t * An array of form validators used by {@link #isValid}.\n\t */\n\tprivate readonly _validators: Array<( v: MediaFormView ) => string | undefined>;\n\n\t/**\n\t * The default info text for the {@link #urlInputView}.\n\t */\n\tprivate _urlInputViewInfoDefault?: string;\n\n\t/**\n\t * The info text with an additional tip for the {@link #urlInputView},\n\t * displayed when the input has some value.\n\t */\n\tprivate _urlInputViewInfoTip?: string;\n\n\t/**\n\t * @param validators Form validators used by {@link #isValid}.\n\t * @param locale The localization services instance.\n\t */\n\tconstructor( validators: Array<( v: MediaFormView ) => string | undefined>, locale: Locale ) {\n\t\tsuper( locale );\n\n\t\tconst t = locale.t;\n\n\t\tthis.focusTracker = new FocusTracker();\n\t\tthis.keystrokes = new KeystrokeHandler();\n\t\tthis.set( 'mediaURLInputValue', '' );\n\t\tthis.urlInputView = this._createUrlInput();\n\n\t\tthis.saveButtonView = this._createButton( t( 'Save' ), icons.check, 'ck-button-save' );\n\t\tthis.saveButtonView.type = 'submit';\n\t\tthis.saveButtonView.bind( 'isEnabled' ).to( this, 'mediaURLInputValue', value => !!value );\n\n\t\tthis.cancelButtonView = this._createButton( t( 'Cancel' ), icons.cancel, 'ck-button-cancel', 'cancel' );\n\n\t\tthis._focusables = new ViewCollection();\n\n\t\tthis._focusCycler = new FocusCycler( {\n\t\t\tfocusables: this._focusables,\n\t\t\tfocusTracker: this.focusTracker,\n\t\t\tkeystrokeHandler: this.keystrokes,\n\t\t\tactions: {\n\t\t\t\t// Navigate form fields backwards using the Shift + Tab keystroke.\n\t\t\t\tfocusPrevious: 'shift + tab',\n\n\t\t\t\t// Navigate form fields forwards using the Tab key.\n\t\t\t\tfocusNext: 'tab'\n\t\t\t}\n\t\t} );\n\n\t\tthis._validators = validators;\n\n\t\tthis.setTemplate( {\n\t\t\ttag: 'form',\n\n\t\t\tattributes: {\n\t\t\t\tclass: [\n\t\t\t\t\t'ck',\n\t\t\t\t\t'ck-media-form',\n\t\t\t\t\t'ck-responsive-form'\n\t\t\t\t],\n\n\t\t\t\ttabindex: '-1'\n\t\t\t},\n\n\t\t\tchildren: [\n\t\t\t\tthis.urlInputView,\n\t\t\t\tthis.saveButtonView,\n\t\t\t\tthis.cancelButtonView\n\t\t\t]\n\t\t} );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic override render(): void {\n\t\tsuper.render();\n\n\t\tsubmitHandler( {\n\t\t\tview: this\n\t\t} );\n\n\t\tconst childViews = [\n\t\t\tthis.urlInputView,\n\t\t\tthis.saveButtonView,\n\t\t\tthis.cancelButtonView\n\t\t];\n\n\t\tchildViews.forEach( v => {\n\t\t\t// Register the view as focusable.\n\t\t\tthis._focusables.add( v );\n\n\t\t\t// Register the view in the focus tracker.\n\t\t\tthis.focusTracker.add( v.element! );\n\t\t} );\n\n\t\t// Start listening for the keystrokes coming from #element.\n\t\tthis.keystrokes.listenTo( this.element! );\n\n\t\tconst stopPropagation = ( data: KeyboardEvent ) => data.stopPropagation();\n\n\t\t// Since the form is in the dropdown panel which is a child of the toolbar, the toolbar's\n\t\t// keystroke handler would take over the key management in the URL input. We need to prevent\n\t\t// this ASAP. Otherwise, the basic caret movement using the arrow keys will be impossible.\n\t\tthis.keystrokes.set( 'arrowright', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowleft', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowup', stopPropagation );\n\t\tthis.keystrokes.set( 'arrowdown', stopPropagation );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic override destroy(): void {\n\t\tsuper.destroy();\n\n\t\tthis.focusTracker.destroy();\n\t\tthis.keystrokes.destroy();\n\t}\n\n\t/**\n\t * Focuses the fist {@link #_focusables} in the form.\n\t */\n\tpublic focus(): void {\n\t\tthis._focusCycler.focusFirst();\n\t}\n\n\t/**\n\t * The native DOM `value` of the {@link #urlInputView} element.\n\t *\n\t * **Note**: Do not confuse it with the {@link module:ui/inputtext/inputtextview~InputTextView#value}\n\t * which works one way only and may not represent the actual state of the component in the DOM.\n\t */\n\tpublic get url(): string {\n\t\treturn this.urlInputView.fieldView.element!.value.trim();\n\t}\n\n\tpublic set url( url: string ) {\n\t\tthis.urlInputView.fieldView.element!.value = url.trim();\n\t}\n\n\t/**\n\t * Validates the form and returns `false` when some fields are invalid.\n\t */\n\tpublic isValid(): boolean {\n\t\tthis.resetFormStatus();\n\n\t\tfor ( const validator of this._validators ) {\n\t\t\tconst errorText = validator( this );\n\n\t\t\t// One error per field is enough.\n\t\t\tif ( errorText ) {\n\t\t\t\t// Apply updated error.\n\t\t\t\tthis.urlInputView.errorText = errorText;\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Cleans up the supplementary error and information text of the {@link #urlInputView}\n\t * bringing them back to the state when the form has been displayed for the first time.\n\t *\n\t * See {@link #isValid}.\n\t */\n\tpublic resetFormStatus(): void {\n\t\tthis.urlInputView.errorText = null;\n\t\tthis.urlInputView.infoText = this._urlInputViewInfoDefault!;\n\t}\n\n\t/**\n\t * Creates a labeled input view.\n\t *\n\t * @returns Labeled input view instance.\n\t */\n\tprivate _createUrlInput(): LabeledFieldView {\n\t\tconst t = this.locale!.t;\n\n\t\tconst labeledInput = new LabeledFieldView( this.locale, createLabeledInputText );\n\t\tconst inputField = labeledInput.fieldView;\n\n\t\tthis._urlInputViewInfoDefault = t( 'Paste the media URL in the input.' );\n\t\tthis._urlInputViewInfoTip = t( 'Tip: Paste the URL into the content to embed faster.' );\n\n\t\tlabeledInput.label = t( 'Media URL' );\n\t\tlabeledInput.infoText = this._urlInputViewInfoDefault;\n\n\t\tinputField.on( 'input', () => {\n\t\t\t// Display the tip text only when there is some value. Otherwise fall back to the default info text.\n\t\t\tlabeledInput.infoText = inputField.element!.value ? this._urlInputViewInfoTip! : this._urlInputViewInfoDefault!;\n\t\t\tthis.mediaURLInputValue = inputField.element!.value.trim();\n\t\t} );\n\n\t\treturn labeledInput;\n\t}\n\n\t/**\n\t * Creates a button view.\n\t *\n\t * @param label The button label.\n\t * @param icon The button icon.\n\t * @param className The additional button CSS class name.\n\t * @param eventName An event name that the `ButtonView#execute` event will be delegated to.\n\t * @returns The button view instance.\n\t */\n\tprivate _createButton( label: string, icon: string, className: string, eventName?: string ): ButtonView {\n\t\tconst button = new ButtonView( this.locale );\n\n\t\tbutton.set( {\n\t\t\tlabel,\n\t\t\ticon,\n\t\t\ttooltip: true\n\t\t} );\n\n\t\tbutton.extendTemplate( {\n\t\t\tattributes: {\n\t\t\t\tclass: className\n\t\t\t}\n\t\t} );\n\n\t\tif ( eventName ) {\n\t\t\tbutton.delegate( 'execute' ).to( this, eventName );\n\t\t}\n\n\t\treturn button;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module media-embed/mediaembedui\n */\n\nimport { Plugin } from 'ckeditor5/src/core.js';\nimport { createDropdown, CssTransitionDisablerMixin, type DropdownView } from 'ckeditor5/src/ui.js';\n\nimport MediaFormView from './ui/mediaformview.js';\nimport MediaEmbedEditing from './mediaembedediting.js';\nimport mediaIcon from '../theme/icons/media.svg';\nimport type MediaEmbedCommand from './mediaembedcommand.js';\nimport type { LocaleTranslate } from 'ckeditor5/src/utils.js';\nimport type MediaRegistry from './mediaregistry.js';\n\n/**\n * The media embed UI plugin.\n */\nexport default class MediaEmbedUI extends Plugin {\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic static get requires() {\n\t\treturn [ MediaEmbedEditing ] as const;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic static get pluginName() {\n\t\treturn 'MediaEmbedUI' as const;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic init(): void {\n\t\tconst editor = this.editor;\n\t\tconst command: MediaEmbedCommand = editor.commands.get( 'mediaEmbed' )!;\n\n\t\teditor.ui.componentFactory.add( 'mediaEmbed', locale => {\n\t\t\tconst dropdown = createDropdown( locale );\n\n\t\t\tthis._setUpDropdown( dropdown, command );\n\n\t\t\treturn dropdown;\n\t\t} );\n\t}\n\n\tprivate _setUpDropdown( dropdown: DropdownView, command: MediaEmbedCommand ): void {\n\t\tconst editor = this.editor;\n\t\tconst t = editor.t;\n\t\tconst button = dropdown.buttonView;\n\t\tconst registry = editor.plugins.get( MediaEmbedEditing ).registry;\n\n\t\tdropdown.once( 'change:isOpen', () => {\n\t\t\tconst form = new ( CssTransitionDisablerMixin( MediaFormView ) )( getFormValidators( editor.t, registry ), editor.locale );\n\n\t\t\tdropdown.panelView.children.add( form );\n\n\t\t\t// Note: Use the low priority to make sure the following listener starts working after the\n\t\t\t// default action of the drop-down is executed (i.e. the panel showed up). Otherwise, the\n\t\t\t// invisible form/input cannot be focused/selected.\n\t\t\tbutton.on( 'open', () => {\n\t\t\t\tform.disableCssTransitions();\n\n\t\t\t\t// Make sure that each time the panel shows up, the URL field remains in sync with the value of\n\t\t\t\t// the command. If the user typed in the input, then canceled (`urlInputView#fieldView#value` stays\n\t\t\t\t// unaltered) and re-opened it without changing the value of the media command (e.g. because they\n\t\t\t\t// didn't change the selection), they would see the old value instead of the actual value of the\n\t\t\t\t// command.\n\t\t\t\tform.url = command.value || '';\n\t\t\t\tform.urlInputView.fieldView.select();\n\t\t\t\tform.enableCssTransitions();\n\t\t\t}, { priority: 'low' } );\n\n\t\t\tdropdown.on( 'submit', () => {\n\t\t\t\tif ( form.isValid() ) {\n\t\t\t\t\teditor.execute( 'mediaEmbed', form.url );\n\t\t\t\t\teditor.editing.view.focus();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tdropdown.on( 'change:isOpen', () => form.resetFormStatus() );\n\t\t\tdropdown.on( 'cancel', () => {\n\t\t\t\teditor.editing.view.focus();\n\t\t\t} );\n\n\t\t\tform.delegate( 'submit', 'cancel' ).to( dropdown );\n\t\t\tform.urlInputView.fieldView.bind( 'value' ).to( command, 'value' );\n\n\t\t\t// Form elements should be read-only when corresponding commands are disabled.\n\t\t\tform.urlInputView.bind( 'isEnabled' ).to( command, 'isEnabled' );\n\t\t} );\n\n\t\tdropdown.bind( 'isEnabled' ).to( command );\n\n\t\tbutton.set( {\n\t\t\tlabel: t( 'Insert media' ),\n\t\t\ticon: mediaIcon,\n\t\t\ttooltip: true\n\t\t} );\n\t}\n}\n\nfunction getFormValidators( t: LocaleTranslate, registry: MediaRegistry ): Array<( v: MediaFormView ) => string | undefined> {\n\treturn [\n\t\tform => {\n\t\t\tif ( !form.url.length ) {\n\t\t\t\treturn t( 'The URL must not be empty.' );\n\t\t\t}\n\t\t},\n\t\tform => {\n\t\t\tif ( !registry.hasMedia( form.url ) ) {\n\t\t\t\treturn t( 'This media URL is not supported.' );\n\t\t\t}\n\t\t}\n\t];\n}\n","export default \"\";","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./mediaembed.css\";\n\nvar options = {\"injectType\":\"singletonStyleTag\",\"attributes\":{\"data-cke\":true}};\n\noptions.insert = \"head\";\noptions.singleton = true;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/utils\n */\n\n/**\n * Normalizes CSS length value to 'px'.\n *\n * @internal\n */\nexport function convertCssLengthToPx( value: string ): string {\n\tconst numericValue = parseFloat( value );\n\n\tif ( value.endsWith( 'pt' ) ) {\n\t\t// 1pt = 1in / 72\n\t\treturn toPx( numericValue * 96 / 72 );\n\t}\n\telse if ( value.endsWith( 'pc' ) ) {\n\t\t// 1pc = 12pt = 1in / 6.\n\t\treturn toPx( numericValue * 12 * 96 / 72 );\n\t}\n\telse if ( value.endsWith( 'in' ) ) {\n\t\t// 1in = 2.54cm = 96px\n\t\treturn toPx( numericValue * 96 );\n\t}\n\telse if ( value.endsWith( 'cm' ) ) {\n\t\t// 1cm = 96px / 2.54\n\t\treturn toPx( numericValue * 96 / 2.54 );\n\t}\n\telse if ( value.endsWith( 'mm' ) ) {\n\t\t// 1mm = 1cm / 10\n\t\treturn toPx( numericValue / 10 * 96 / 2.54 );\n\t}\n\n\treturn value;\n}\n\n/**\n * Returns true for value with 'px' unit.\n *\n * @internal\n */\nexport function isPx( value?: string ): value is string {\n\treturn value !== undefined && value.endsWith( 'px' );\n}\n\n/**\n * Returns a rounded 'px' value.\n *\n * @internal\n */\nexport function toPx( value: number ): string {\n\treturn value.toFixed( 2 ).replace( /\\.?0+$/, '' ) + 'px';\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/list\n */\n\nimport {\n\tMatcher,\n\tUpcastWriter,\n\ttype ViewDocumentFragment,\n\ttype ViewElement,\n\ttype ViewNode,\n\ttype ViewText\n} from 'ckeditor5/src/engine.js';\n\nimport {\n\tconvertCssLengthToPx,\n\tisPx,\n\ttoPx\n} from './utils.js';\n\n/**\n * Transforms Word specific list-like elements to the semantic HTML lists.\n *\n * Lists in Word are represented by block elements with special attributes like:\n *\n * ```xml\n *

...

// Paragraph based list.\n *

...

// Heading 1 based list.\n * ```\n *\n * @param documentFragment The view structure to be transformed.\n * @param stylesString Styles from which list-like elements styling will be extracted.\n */\nexport function transformListItemLikeElementsIntoLists(\n\tdocumentFragment: ViewDocumentFragment,\n\tstylesString: string,\n\thasMultiLevelListPlugin: boolean\n): void {\n\tif ( !documentFragment.childCount ) {\n\t\treturn;\n\t}\n\n\tconst writer = new UpcastWriter( documentFragment.document );\n\tconst itemLikeElements = findAllItemLikeElements( documentFragment, writer );\n\n\tif ( !itemLikeElements.length ) {\n\t\treturn;\n\t}\n\n\tconst encounteredLists: Record = {};\n\n\tconst stack: Array;\n\t}> = [];\n\n\tfor ( const itemLikeElement of itemLikeElements ) {\n\t\tif ( itemLikeElement.indent !== undefined ) {\n\t\t\tif ( !isListContinuation( itemLikeElement ) ) {\n\t\t\t\tstack.length = 0;\n\t\t\t}\n\n\t\t\t// Combined list ID for addressing encounter lists counters.\n\t\t\tconst originalListId = `${ itemLikeElement.id }:${ itemLikeElement.indent }`;\n\n\t\t\t// Normalized list item indentation.\n\t\t\tconst indent = Math.min( itemLikeElement.indent - 1, stack.length );\n\n\t\t\t// Trimming of the list stack on list ID change.\n\t\t\tif ( indent < stack.length && stack[ indent ].id !== itemLikeElement.id ) {\n\t\t\t\tstack.length = indent;\n\t\t\t}\n\n\t\t\t// Trimming of the list stack on lower indent list encountered.\n\t\t\tif ( indent < stack.length - 1 ) {\n\t\t\t\tstack.length = indent + 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst listStyle = detectListStyle( itemLikeElement, stylesString );\n\n\t\t\t\t// Create a new OL/UL if required (greater indent or different list type).\n\t\t\t\tif ( indent > stack.length - 1 || stack[ indent ].listElement.name != listStyle.type ) {\n\t\t\t\t\t// Check if there is some start index to set from a previous list.\n\t\t\t\t\tif (\n\t\t\t\t\t\tindent == 0 &&\n\t\t\t\t\t\tlistStyle.type == 'ol' &&\n\t\t\t\t\t\titemLikeElement.id !== undefined &&\n\t\t\t\t\t\tencounteredLists[ originalListId ]\n\t\t\t\t\t) {\n\t\t\t\t\t\tlistStyle.startIndex = encounteredLists[ originalListId ];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst listElement = createNewEmptyList( listStyle, writer, hasMultiLevelListPlugin );\n\n\t\t\t\t\t// Apply list padding only if we have margins for the item and the parent item.\n\t\t\t\t\tif (\n\t\t\t\t\t\tisPx( itemLikeElement.marginLeft ) &&\n\t\t\t\t\t\t( indent == 0 || isPx( stack[ indent - 1 ].marginLeft ) )\n\t\t\t\t\t) {\n\t\t\t\t\t\tlet marginLeft = itemLikeElement.marginLeft;\n\n\t\t\t\t\t\tif ( indent > 0 ) {\n\t\t\t\t\t\t\t// Convert the padding from absolute to relative.\n\t\t\t\t\t\t\tmarginLeft = toPx( parseFloat( marginLeft ) - parseFloat( stack[ indent - 1 ].marginLeft! ) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twriter.setStyle( 'padding-left', marginLeft, listElement );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Insert the new OL/UL.\n\t\t\t\t\tif ( stack.length == 0 ) {\n\t\t\t\t\t\tconst parent = itemLikeElement.element.parent!;\n\t\t\t\t\t\tconst index = parent.getChildIndex( itemLikeElement.element ) + 1;\n\n\t\t\t\t\t\twriter.insertChild( index, listElement, parent );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst parentListItems = stack[ indent - 1 ].listItemElements;\n\n\t\t\t\t\t\twriter.appendChild( listElement, parentListItems[ parentListItems.length - 1 ] );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update the list stack for other items to reference.\n\t\t\t\t\tstack[ indent ] = {\n\t\t\t\t\t\t...itemLikeElement,\n\t\t\t\t\t\tlistElement,\n\t\t\t\t\t\tlistItemElements: []\n\t\t\t\t\t};\n\n\t\t\t\t\t// Prepare list counter for start index.\n\t\t\t\t\tif ( indent == 0 && itemLikeElement.id !== undefined ) {\n\t\t\t\t\t\tencounteredLists[ originalListId ] = listStyle.startIndex || 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Use LI if it is already it or create a new LI element.\n\t\t\t// https://github.com/ckeditor/ckeditor5/issues/15964\n\t\t\tconst listItem = itemLikeElement.element.name == 'li' ? itemLikeElement.element : writer.createElement( 'li' );\n\n\t\t\t// Append the LI to OL/UL.\n\t\t\twriter.appendChild( listItem, stack[ indent ].listElement );\n\t\t\tstack[ indent ].listItemElements.push( listItem );\n\n\t\t\t// Increment list counter.\n\t\t\tif ( indent == 0 && itemLikeElement.id !== undefined ) {\n\t\t\t\tencounteredLists[ originalListId ]++;\n\t\t\t}\n\n\t\t\t// Append list block to LI.\n\t\t\tif ( itemLikeElement.element != listItem ) {\n\t\t\t\twriter.appendChild( itemLikeElement.element, listItem );\n\t\t\t}\n\n\t\t\t// Clean list block.\n\t\t\tremoveBulletElement( itemLikeElement.element, writer );\n\t\t\twriter.removeStyle( 'text-indent', itemLikeElement.element ); // #12361\n\t\t\twriter.removeStyle( 'margin-left', itemLikeElement.element );\n\t\t}\n\t\telse {\n\t\t\t// Other blocks in a list item.\n\t\t\tconst stackItem = stack.find( stackItem => stackItem.marginLeft == itemLikeElement.marginLeft );\n\n\t\t\t// This might be a paragraph that has known margin, but it is not a real list block.\n\t\t\tif ( stackItem ) {\n\t\t\t\tconst listItems = stackItem.listItemElements;\n\n\t\t\t\t// Append block to LI.\n\t\t\t\twriter.appendChild( itemLikeElement.element, listItems[ listItems.length - 1 ] );\n\t\t\t\twriter.removeStyle( 'margin-left', itemLikeElement.element );\n\t\t\t} else {\n\t\t\t\tstack.length = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Removes paragraph wrapping content inside a list item.\n */\nexport function unwrapParagraphInListItem(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): void {\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\n\t\tconst element = value.item;\n\n\t\tif ( element.is( 'element', 'li' ) ) {\n\t\t\t// Google Docs allows for single paragraph inside LI.\n\t\t\tconst firstChild = element.getChild( 0 );\n\n\t\t\tif ( firstChild && firstChild.is( 'element', 'p' ) ) {\n\t\t\t\twriter.unwrapElement( firstChild );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Finds all list-like elements in a given document fragment.\n *\n * @param documentFragment Document fragment in which to look for list-like nodes.\n * @returns Array of found list-like items. Each item is an object containing:\n */\nfunction findAllItemLikeElements(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): Array {\n\tconst range = writer.createRangeIn( documentFragment );\n\tconst itemLikeElements: Array = [];\n\tconst foundMargins = new Set();\n\n\tfor ( const item of range.getItems() ) {\n\t\t// https://github.com/ckeditor/ckeditor5/issues/15964\n\t\tif ( !item.is( 'element' ) || !item.name.match( /^(p|h\\d+|li|div)$/ ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Try to rely on margin-left style to find paragraphs visually aligned with previously encountered list item.\n\t\tlet marginLeft = getMarginLeftNormalized( item );\n\n\t\t// Ignore margin-left 0 style if there is no MsoList... class.\n\t\tif (\n\t\t\tmarginLeft !== undefined &&\n\t\t\tparseFloat( marginLeft ) == 0 &&\n\t\t\t!Array.from( item.getClassNames() ).find( className => className.startsWith( 'MsoList' ) )\n\t\t) {\n\t\t\tmarginLeft = undefined;\n\t\t}\n\n\t\t// List item or a following list item block.\n\t\tif ( item.hasStyle( 'mso-list' ) || marginLeft !== undefined && foundMargins.has( marginLeft ) ) {\n\t\t\tconst itemData = getListItemData( item );\n\n\t\t\titemLikeElements.push( {\n\t\t\t\telement: item,\n\t\t\t\tid: itemData.id,\n\t\t\t\torder: itemData.order,\n\t\t\t\tindent: itemData.indent,\n\t\t\t\tmarginLeft\n\t\t\t} );\n\n\t\t\tif ( marginLeft !== undefined ) {\n\t\t\t\tfoundMargins.add( marginLeft );\n\t\t\t}\n\t\t}\n\t\t// Clear found margins as we found block after a list.\n\t\telse {\n\t\t\tfoundMargins.clear();\n\t\t}\n\t}\n\n\treturn itemLikeElements;\n}\n\n/**\n * Whether the given element is possibly a list continuation. Previous element was wrapped into a list\n * or the current element already is inside a list.\n */\nfunction isListContinuation( currentItem: ListLikeElement ) {\n\tconst previousSibling = currentItem.element.previousSibling;\n\n\tif ( !previousSibling ) {\n\t\t// If it's a li inside ul or ol like in here: https://github.com/ckeditor/ckeditor5/issues/15964.\n\t\treturn isList( currentItem.element.parent as ViewElement );\n\t}\n\n\t// Even with the same id the list does not have to be continuous (#43).\n\treturn isList( previousSibling );\n}\n\nfunction isList( element: ViewNode ) {\n\treturn element.is( 'element', 'ol' ) || element.is( 'element', 'ul' );\n}\n\n/**\n * Extracts list item style from the provided CSS.\n *\n * List item style is extracted from the CSS stylesheet. Each list with its specific style attribute\n * value (`mso-list:l1 level1 lfo1`) has its dedicated properties in a CSS stylesheet defined with a selector like:\n *\n * ```css\n * @list l1:level1 { ... }\n * ```\n *\n * It contains `mso-level-number-format` property which defines list numbering/bullet style. If this property\n * is not defined it means default `decimal` numbering.\n *\n * Here CSS string representation is used as `mso-level-number-format` property is an invalid CSS property\n * and will be removed during CSS parsing.\n *\n * @param listLikeItem List-like item for which list style will be searched for. Usually\n * a result of `findAllItemLikeElements()` function.\n * @param stylesString CSS stylesheet.\n * @returns An object with properties:\n *\n * * type - List type, could be `ul` or `ol`.\n * * startIndex - List start index, valid only for ordered lists.\n * * style - List style, for example: `decimal`, `lower-roman`, etc. It is extracted\n * directly from Word stylesheet and adjusted to represent proper values for the CSS `list-style-type` property.\n * If it cannot be adjusted, the `null` value is returned.\n */\nfunction detectListStyle( listLikeItem: ListLikeElement, stylesString: string ) {\n\tconst listStyleRegexp = new RegExp( `@list l${ listLikeItem.id }:level${ listLikeItem.indent }\\\\s*({[^}]*)`, 'gi' );\n\tconst listStyleTypeRegex = /mso-level-number-format:([^;]{0,100});/gi;\n\tconst listStartIndexRegex = /mso-level-start-at:\\s{0,100}([0-9]{0,10})\\s{0,100};/gi;\n\tconst legalStyleListRegex = new RegExp( `@list\\\\s+l${ listLikeItem.id }:level\\\\d\\\\s*{[^{]*mso-level-text:\"%\\\\d\\\\\\\\.`, 'gi' );\n\tconst multiLevelNumberFormatTypeRegex = new RegExp( `@list l${ listLikeItem.id }:level\\\\d\\\\s*{[^{]*mso-level-number-format:`, 'gi' );\n\n\tconst legalStyleListMatch = legalStyleListRegex.exec( stylesString );\n\tconst multiLevelNumberFormatMatch = multiLevelNumberFormatTypeRegex.exec( stylesString );\n\n\t// Multi level lists in Word have mso-level-number-format attribute except legal lists,\n\t// so we used that. If list has legal list match and doesn't has mso-level-number-format\n\t// then this is legal-list.\n\tconst islegalStyleList = legalStyleListMatch && !multiLevelNumberFormatMatch;\n\n\tconst listStyleMatch = listStyleRegexp.exec( stylesString );\n\n\tlet listStyleType = 'decimal'; // Decimal is default one.\n\tlet type = 'ol'; //
    is default list.\n\tlet startIndex = null;\n\n\tif ( listStyleMatch && listStyleMatch[ 1 ] ) {\n\t\tconst listStyleTypeMatch = listStyleTypeRegex.exec( listStyleMatch[ 1 ] );\n\n\t\tif ( listStyleTypeMatch && listStyleTypeMatch[ 1 ] ) {\n\t\t\tlistStyleType = listStyleTypeMatch[ 1 ].trim();\n\t\t\ttype = listStyleType !== 'bullet' && listStyleType !== 'image' ? 'ol' : 'ul';\n\t\t}\n\n\t\t// Styles for the numbered lists are always defined in the Word CSS stylesheet.\n\t\t// Unordered lists MAY contain a value for the Word CSS definition `mso-level-text` but sometimes\n\t\t// this tag is missing. And because of that, we cannot depend on that. We need to predict the list style value\n\t\t// based on the list style marker element.\n\t\tif ( listStyleType === 'bullet' ) {\n\t\t\tconst bulletedStyle = findBulletedListStyle( listLikeItem.element );\n\n\t\t\tif ( bulletedStyle ) {\n\t\t\t\tlistStyleType = bulletedStyle;\n\t\t\t}\n\t\t} else {\n\t\t\tconst listStartIndexMatch = listStartIndexRegex.exec( listStyleMatch[ 1 ] );\n\n\t\t\tif ( listStartIndexMatch && listStartIndexMatch[ 1 ] ) {\n\t\t\t\tstartIndex = parseInt( listStartIndexMatch[ 1 ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( islegalStyleList ) {\n\t\t\ttype = 'ol';\n\t\t}\n\t}\n\n\treturn {\n\t\ttype,\n\t\tstartIndex,\n\t\tstyle: mapListStyleDefinition( listStyleType ),\n\t\tisLegalStyleList: islegalStyleList\n\t};\n}\n\n/**\n * Tries to extract the `list-style-type` value based on the marker element for bulleted list.\n */\nfunction findBulletedListStyle( element: ViewElement ) {\n\t// https://github.com/ckeditor/ckeditor5/issues/15964\n\tif ( element.name == 'li' && element.parent!.name == 'ul' && element.parent!.hasAttribute( 'type' ) ) {\n\t\treturn element.parent!.getAttribute( 'type' );\n\t}\n\n\tconst listMarkerElement = findListMarkerNode( element );\n\n\tif ( !listMarkerElement ) {\n\t\treturn null;\n\t}\n\n\tconst listMarker = listMarkerElement._data;\n\n\tif ( listMarker === 'o' ) {\n\t\treturn 'circle';\n\t} else if ( listMarker === '·' ) {\n\t\treturn 'disc';\n\t}\n\t// Word returns '§' instead of '■' for the square list style.\n\telse if ( listMarker === '§' ) {\n\t\treturn 'square';\n\t}\n\n\treturn null;\n}\n\n/**\n * Tries to find a text node that represents the marker element (list-style-type).\n */\nfunction findListMarkerNode( element: ViewElement ): ViewText | null {\n\t// If the first child is a text node, it is the data for the element.\n\t// The list-style marker is not present here.\n\tif ( element.getChild( 0 )!.is( '$text' ) ) {\n\t\treturn null;\n\t}\n\n\tfor ( const childNode of element.getChildren() ) {\n\t\t// The list-style marker will be inside the `` element. Let's ignore all non-span elements.\n\t\t// It may happen that the `` element is added as the first child. Most probably, it's an anchor element.\n\t\tif ( !childNode.is( 'element', 'span' ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst textNodeOrElement = childNode.getChild( 0 );\n\n\t\tif ( !textNodeOrElement ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If already found the marker element, use it.\n\t\tif ( textNodeOrElement.is( '$text' ) ) {\n\t\t\treturn textNodeOrElement;\n\t\t}\n\n\t\treturn ( textNodeOrElement as any ).getChild( 0 );\n\t}\n\n\t/* istanbul ignore next -- @preserve */\n\treturn null;\n}\n\n/**\n * Parses the `list-style-type` value extracted directly from the Word CSS stylesheet and returns proper CSS definition.\n */\nfunction mapListStyleDefinition( value: string ) {\n\tif ( value.startsWith( 'arabic-leading-zero' ) ) {\n\t\treturn 'decimal-leading-zero';\n\t}\n\n\tswitch ( value ) {\n\t\tcase 'alpha-upper':\n\t\t\treturn 'upper-alpha';\n\t\tcase 'alpha-lower':\n\t\t\treturn 'lower-alpha';\n\t\tcase 'roman-upper':\n\t\t\treturn 'upper-roman';\n\t\tcase 'roman-lower':\n\t\t\treturn 'lower-roman';\n\t\tcase 'circle':\n\t\tcase 'disc':\n\t\tcase 'square':\n\t\t\treturn value;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Creates a new list OL/UL element.\n */\nfunction createNewEmptyList(\n\tlistStyle: ReturnType,\n\twriter: UpcastWriter,\n\thasMultiLevelListPlugin: boolean\n) {\n\tconst list = writer.createElement( listStyle.type );\n\n\t// We do not support modifying the marker for a particular list item.\n\t// Set the value for the `list-style-type` property directly to the list container.\n\tif ( listStyle.style ) {\n\t\twriter.setStyle( 'list-style-type', listStyle.style, list );\n\t}\n\n\tif ( listStyle.startIndex && listStyle.startIndex > 1 ) {\n\t\twriter.setAttribute( 'start', listStyle.startIndex, list );\n\t}\n\n\tif ( listStyle.isLegalStyleList && hasMultiLevelListPlugin ) {\n\t\twriter.addClass( 'legal-list', list );\n\t}\n\n\treturn list;\n}\n\n/**\n * Extracts list item information from Word specific list-like element style:\n *\n * ```\n * `style=\"mso-list:l1 level1 lfo1\"`\n * ```\n *\n * where:\n *\n * ```\n * * `l1` is a list id (however it does not mean this is a continuous list - see #43),\n * * `level1` is a list item indentation level,\n * * `lfo1` is a list insertion order in a document.\n * ```\n *\n * @param element Element from which style data is extracted.\n */\nfunction getListItemData( element: ViewElement ): ListItemData {\n\tconst listStyle = element.getStyle( 'mso-list' );\n\n\tif ( listStyle === undefined ) {\n\t\treturn {};\n\t}\n\n\tconst idMatch = listStyle.match( /(^|\\s{1,100})l(\\d+)/i );\n\tconst orderMatch = listStyle.match( /\\s{0,100}lfo(\\d+)/i );\n\tconst indentMatch = listStyle.match( /\\s{0,100}level(\\d+)/i );\n\n\tif ( idMatch && orderMatch && indentMatch ) {\n\t\treturn {\n\t\t\tid: idMatch[ 2 ],\n\t\t\torder: orderMatch[ 1 ],\n\t\t\tindent: parseInt( indentMatch[ 1 ] )\n\t\t};\n\t}\n\n\treturn {\n\t\tindent: 1 // Handle empty mso-list style as a marked for default list item.\n\t};\n}\n\n/**\n * Removes span with a numbering/bullet from a given element.\n */\nfunction removeBulletElement( element: ViewElement, writer: UpcastWriter ) {\n\t// Matcher for finding `span` elements holding lists numbering/bullets.\n\tconst bulletMatcher = new Matcher( {\n\t\tname: 'span',\n\t\tstyles: {\n\t\t\t'mso-list': 'Ignore'\n\t\t}\n\t} );\n\n\tconst range = writer.createRangeIn( element );\n\n\tfor ( const value of range ) {\n\t\tif ( value.type === 'elementStart' && bulletMatcher.match( value.item as ViewElement ) ) {\n\t\t\twriter.remove( value.item as ViewElement );\n\t\t}\n\t}\n}\n\n/**\n * Returns element left margin normalized to 'px' if possible.\n */\nfunction getMarginLeftNormalized( element: ViewElement ): string | undefined {\n\tconst value = element.getStyle( 'margin-left' );\n\n\tif ( value === undefined || value.endsWith( 'px' ) ) {\n\t\treturn value;\n\t}\n\n\treturn convertCssLengthToPx( value );\n}\n\ninterface ListItemData {\n\n\t/**\n\t * Parent list id.\n\t */\n\tid?: string;\n\n\t/**\n\t * List item creation order.\n\t */\n\torder?: string;\n\n\t/**\n\t * List item indentation level.\n\t */\n\tindent?: number;\n}\n\ninterface ListLikeElement extends ListItemData {\n\n\t/**\n\t * List-like element.\n\t */\n\telement: ViewElement;\n\n\t/**\n\t * The margin-left normalized to 'px' if possible.\n\t */\n\tmarginLeft?: string;\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/image\n */\n\n/* globals btoa */\n\nimport {\n\tMatcher,\n\tUpcastWriter,\n\ttype ViewDocumentFragment,\n\ttype ViewElement,\n\ttype ViewNode\n} from 'ckeditor5/src/engine.js';\n\n/**\n * Replaces source attribute of all `` elements representing regular\n * images (not the Word shapes) with inlined base64 image representation extracted from RTF or Blob data.\n *\n * @param documentFragment Document fragment on which transform images.\n * @param rtfData The RTF data from which images representation will be used.\n */\nexport function replaceImagesSourceWithBase64( documentFragment: ViewDocumentFragment, rtfData: string ): void {\n\tif ( !documentFragment.childCount ) {\n\t\treturn;\n\t}\n\n\tconst upcastWriter = new UpcastWriter( documentFragment.document );\n\tconst shapesIds = findAllShapesIds( documentFragment, upcastWriter );\n\n\tremoveAllImgElementsRepresentingShapes( shapesIds, documentFragment, upcastWriter );\n\tinsertMissingImgs( shapesIds, documentFragment, upcastWriter );\n\tremoveAllShapeElements( documentFragment, upcastWriter );\n\n\tconst images = findAllImageElementsWithLocalSource( documentFragment, upcastWriter );\n\n\tif ( images.length ) {\n\t\treplaceImagesFileSourceWithInlineRepresentation( images, extractImageDataFromRtf( rtfData ), upcastWriter );\n\t}\n}\n\n/**\n * Converts given HEX string to base64 representation.\n *\n * @internal\n * @param hexString The HEX string to be converted.\n * @returns Base64 representation of a given HEX string.\n */\nexport function _convertHexToBase64( hexString: string ): string {\n\treturn btoa( hexString.match( /\\w{2}/g )!.map( char => {\n\t\treturn String.fromCharCode( parseInt( char, 16 ) );\n\t} ).join( '' ) );\n}\n\n/**\n * Finds all shapes (`...`) ids. Shapes can represent images (canvas)\n * or Word shapes (which does not have RTF or Blob representation).\n *\n * @param documentFragment Document fragment from which to extract shape ids.\n * @returns Array of shape ids.\n */\nfunction findAllShapesIds( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): Array {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapeElementsMatcher = new Matcher( {\n\t\tname: /v:(.+)/\n\t} );\n\n\tconst shapesIds = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type != 'elementStart' ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst el = value.item as ViewElement;\n\t\tconst previousSibling = el.previousSibling;\n\t\tconst prevSiblingName = previousSibling && previousSibling.is( 'element' ) ? previousSibling.name : null;\n\t\t// List of ids which should not be considered as shapes.\n\t\t// https://github.com/ckeditor/ckeditor5/pull/15847#issuecomment-1941543983\n\t\tconst exceptionIds = [ 'Chart' ];\n\n\t\tconst isElementAShape = shapeElementsMatcher.match( el );\n\t\tconst hasElementGfxdataAttribute = el.getAttribute( 'o:gfxdata' );\n\t\tconst isPreviousSiblingAShapeType = prevSiblingName === 'v:shapetype';\n\t\tconst isElementIdInExceptionsArray = hasElementGfxdataAttribute &&\n\t\t\texceptionIds.some( item => el.getAttribute( 'id' )!.includes( item ) );\n\n\t\t// If shape element has 'o:gfxdata' attribute and is not directly before\n\t\t// `` element it means that it represents a Word shape.\n\t\tif (\n\t\t\tisElementAShape &&\n\t\t\thasElementGfxdataAttribute &&\n\t\t\t!isPreviousSiblingAShapeType &&\n\t\t\t!isElementIdInExceptionsArray\n\t\t) {\n\t\t\tshapesIds.push( ( value.item as ViewElement ).getAttribute( 'id' )! );\n\t\t}\n\t}\n\n\treturn shapesIds;\n}\n\n/**\n * Removes all `` elements which represents Word shapes and not regular images.\n *\n * @param shapesIds Shape ids which will be checked against `` elements.\n * @param documentFragment Document fragment from which to remove `` elements.\n */\nfunction removeAllImgElementsRepresentingShapes(\n\tshapesIds: Array,\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): void {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst imageElementsMatcher = new Matcher( {\n\t\tname: 'img'\n\t} );\n\n\tconst imgs = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.item.is( 'element' ) && imageElementsMatcher.match( value.item ) ) {\n\t\t\tconst el = value.item;\n\t\t\tconst shapes = el.getAttribute( 'v:shapes' ) ? el.getAttribute( 'v:shapes' )!.split( ' ' ) : [];\n\n\t\t\tif ( shapes.length && shapes.every( shape => shapesIds.indexOf( shape ) > -1 ) ) {\n\t\t\t\timgs.push( el );\n\t\t\t// Shapes may also have empty source while content is paste in some browsers (Safari).\n\t\t\t} else if ( !el.getAttribute( 'src' ) ) {\n\t\t\t\timgs.push( el );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const img of imgs ) {\n\t\twriter.remove( img );\n\t}\n}\n\n/**\n * Removes all shape elements (`...`) so they do not pollute the output structure.\n *\n * @param documentFragment Document fragment from which to remove shape elements.\n */\nfunction removeAllShapeElements( documentFragment: ViewDocumentFragment, writer: UpcastWriter ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapeElementsMatcher = new Matcher( {\n\t\tname: /v:(.+)/\n\t} );\n\n\tconst shapes = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type == 'elementStart' && shapeElementsMatcher.match( value.item as ViewElement ) ) {\n\t\t\tshapes.push( value.item as ViewElement );\n\t\t}\n\t}\n\n\tfor ( const shape of shapes ) {\n\t\twriter.remove( shape );\n\t}\n}\n\n/**\n * Inserts `img` tags if there is none after a shape.\n */\nfunction insertMissingImgs( shapeIds: Array, documentFragment: ViewDocumentFragment, writer: UpcastWriter ) {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst shapes: Array = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.type == 'elementStart' && value.item.is( 'element', 'v:shape' ) ) {\n\t\t\tconst id = value.item.getAttribute( 'id' )!;\n\n\t\t\tif ( shapeIds.includes( id ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !containsMatchingImg( value.item.parent!.getChildren(), id ) ) {\n\t\t\t\tshapes.push( value.item );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const shape of shapes ) {\n\t\tconst attrs: Record = {\n\t\t\tsrc: findSrc( shape )\n\t\t};\n\n\t\tif ( shape.hasAttribute( 'alt' ) ) {\n\t\t\tattrs.alt = shape.getAttribute( 'alt' );\n\t\t}\n\n\t\tconst img = writer.createElement( 'img', attrs );\n\n\t\twriter.insertChild( shape.index! + 1, img, shape.parent! );\n\t}\n\n\tfunction containsMatchingImg( nodes: Iterable, id: string ): boolean {\n\t\tfor ( const node of nodes ) {\n\t\t\t/* istanbul ignore else -- @preserve */\n\t\t\tif ( node.is( 'element' ) ) {\n\t\t\t\tif ( node.name == 'img' && node.getAttribute( 'v:shapes' ) == id ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif ( containsMatchingImg( node.getChildren(), id ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction findSrc( shape: ViewElement ) {\n\t\tfor ( const child of shape.getChildren() ) {\n\t\t\t/* istanbul ignore else -- @preserve */\n\t\t\tif ( child.is( 'element' ) && child.getAttribute( 'src' ) ) {\n\t\t\t\treturn child.getAttribute( 'src' );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Finds all `` elements in a given document fragment which have source pointing to local `file://` resource.\n *\n * @param documentFragment Document fragment in which to look for `` elements.\n * @returns result All found images grouped by source type.\n */\nfunction findAllImageElementsWithLocalSource(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): Array {\n\tconst range = writer.createRangeIn( documentFragment );\n\n\tconst imageElementsMatcher = new Matcher( {\n\t\tname: 'img'\n\t} );\n\n\tconst imgs = [];\n\n\tfor ( const value of range ) {\n\t\tif ( value.item.is( 'element' ) && imageElementsMatcher.match( value.item ) ) {\n\t\t\tif ( value.item.getAttribute( 'src' )!.startsWith( 'file://' ) ) {\n\t\t\t\timgs.push( value.item );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn imgs;\n}\n\n/**\n * Extracts all images HEX representations from a given RTF data.\n *\n * @param rtfData The RTF data from which to extract images HEX representation.\n * @returns Array of found HEX representations. Each array item is an object containing:\n *\n * * hex Image representation in HEX format.\n * * type Type of image, `image/png` or `image/jpeg`.\n */\nfunction extractImageDataFromRtf( rtfData: string ): Array<{ hex: string; type: string }> {\n\tif ( !rtfData ) {\n\t\treturn [];\n\t}\n\n\tconst regexPictureHeader = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/;\n\tconst regexPicture = new RegExp( '(?:(' + regexPictureHeader.source + '))([\\\\da-fA-F\\\\s]+)\\\\}', 'g' );\n\tconst images = rtfData.match( regexPicture );\n\tconst result = [];\n\n\tif ( images ) {\n\t\tfor ( const image of images ) {\n\t\t\tlet imageType: string | false = false;\n\n\t\t\tif ( image.includes( '\\\\pngblip' ) ) {\n\t\t\t\timageType = 'image/png';\n\t\t\t} else if ( image.includes( '\\\\jpegblip' ) ) {\n\t\t\t\timageType = 'image/jpeg';\n\t\t\t}\n\n\t\t\tif ( imageType ) {\n\t\t\t\tresult.push( {\n\t\t\t\t\thex: image.replace( regexPictureHeader, '' ).replace( /[^\\da-fA-F]/g, '' ),\n\t\t\t\t\ttype: imageType\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Replaces `src` attribute value of all given images with the corresponding base64 image representation.\n *\n * @param imageElements Array of image elements which will have its source replaced.\n * @param imagesHexSources Array of images hex sources (usually the result of `extractImageDataFromRtf()` function).\n * The array should be the same length as `imageElements` parameter.\n */\nfunction replaceImagesFileSourceWithInlineRepresentation(\n\timageElements: Array,\n\timagesHexSources: ReturnType,\n\twriter: UpcastWriter\n) {\n\t// Assume there is an equal amount of image elements and images HEX sources so they can be matched accordingly based on existing order.\n\tif ( imageElements.length === imagesHexSources.length ) {\n\t\tfor ( let i = 0; i < imageElements.length; i++ ) {\n\t\t\tconst newSrc = `data:${ imagesHexSources[ i ].type };base64,${ _convertHexToBase64( imagesHexSources[ i ].hex ) }`;\n\t\t\twriter.setAttribute( 'src', newSrc, imageElements[ i ] );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/mswordnormalizer\n */\n\nimport { transformListItemLikeElementsIntoLists } from '../filters/list.js';\nimport { replaceImagesSourceWithBase64 } from '../filters/image.js';\nimport removeMSAttributes from '../filters/removemsattributes.js';\nimport type { ViewDocument } from 'ckeditor5/src/engine.js';\nimport type { Normalizer, NormalizerData } from '../normalizer.js';\n\nconst msWordMatch1 = //i;\nconst msWordMatch2 = /xmlns:o=\"urn:schemas-microsoft-com/i;\n\n/**\n * Normalizer for the content pasted from Microsoft Word.\n */\nexport default class MSWordNormalizer implements Normalizer {\n\tpublic readonly document: ViewDocument;\n\n\tpublic readonly hasMultiLevelListPlugin: boolean;\n\n\t/**\n\t * Creates a new `MSWordNormalizer` instance.\n\t *\n\t * @param document View document.\n\t */\n\tconstructor( document: ViewDocument, hasMultiLevelListPlugin: boolean = false ) {\n\t\tthis.document = document;\n\t\tthis.hasMultiLevelListPlugin = hasMultiLevelListPlugin;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isActive( htmlString: string ): boolean {\n\t\treturn msWordMatch1.test( htmlString ) || msWordMatch2.test( htmlString );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic execute( data: NormalizerData ): void {\n\t\tconst { body: documentFragment, stylesString } = data._parsedData;\n\n\t\ttransformListItemLikeElementsIntoLists( documentFragment, stylesString, this.hasMultiLevelListPlugin );\n\t\treplaceImagesSourceWithBase64( documentFragment, data.dataTransfer.getData( 'text/rtf' ) );\n\t\tremoveMSAttributes( documentFragment );\n\n\t\tdata.content = documentFragment;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removemsattributes\n */\n\nimport { UpcastWriter, type ViewDocumentFragment, type ViewElement } from 'ckeditor5/src/engine.js';\n\n/**\n * Cleanup MS attributes like styles, attributes and elements.\n *\n * @param documentFragment element `data.content` obtained from clipboard.\n */\nexport default function removeMSAttributes( documentFragment: ViewDocumentFragment ): void {\n\tconst elementsToUnwrap: Array = [];\n\n\tconst writer = new UpcastWriter( documentFragment.document );\n\n\tfor ( const { item } of writer.createRangeIn( documentFragment ) ) {\n\t\tif ( !item.is( 'element' ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor ( const className of item.getClassNames() ) {\n\t\t\tif ( /\\bmso/gi.exec( className ) ) {\n\t\t\t\twriter.removeClass( className, item );\n\t\t\t}\n\t\t}\n\n\t\tfor ( const styleName of item.getStyleNames() ) {\n\t\t\tif ( /\\bmso/gi.exec( styleName ) ) {\n\t\t\t\twriter.removeStyle( styleName, item );\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\titem.is( 'element', 'w:sdt' ) ||\n\t\t\titem.is( 'element', 'w:sdtpr' ) && item.isEmpty ||\n\t\t\titem.is( 'element', 'o:p' ) && item.isEmpty\n\t\t) {\n\t\t\telementsToUnwrap.push( item );\n\t\t}\n\t}\n\n\tfor ( const item of elementsToUnwrap ) {\n\t\tconst itemParent = item.parent!;\n\t\tconst childIndex = itemParent.getChildIndex( item );\n\n\t\twriter.insertChild( childIndex, item.getChildren(), itemParent );\n\t\twriter.remove( item );\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/br\n */\n\nimport {\n\tDomConverter,\n\tViewDocument,\n\ttype UpcastWriter,\n\ttype ViewDocumentFragment,\n\ttype ViewElement,\n\ttype ViewNode\n} from 'ckeditor5/src/engine.js';\n\n/**\n * Transforms `
    ` elements that are siblings to some block element into a paragraphs.\n *\n * @param documentFragment The view structure to be transformed.\n */\nexport default function transformBlockBrsToParagraphs(\n\tdocumentFragment: ViewDocumentFragment,\n\twriter: UpcastWriter\n): void {\n\tconst viewDocument = new ViewDocument( writer.document.stylesProcessor );\n\tconst domConverter = new DomConverter( viewDocument, { renderingMode: 'data' } );\n\n\tconst blockElements = domConverter.blockElements;\n\tconst inlineObjectElements = domConverter.inlineObjectElements;\n\n\tconst elementsToReplace = [];\n\n\tfor ( const value of writer.createRangeIn( documentFragment ) ) {\n\t\tconst element = value.item;\n\n\t\tif ( element.is( 'element', 'br' ) ) {\n\t\t\tconst nextSibling = findSibling( element, 'forward', writer, { blockElements, inlineObjectElements } );\n\t\t\tconst previousSibling = findSibling( element, 'backward', writer, { blockElements, inlineObjectElements } );\n\n\t\t\tconst nextSiblingIsBlock = isBlockViewElement( nextSibling, blockElements );\n\t\t\tconst previousSiblingIsBlock = isBlockViewElement( previousSibling, blockElements );\n\n\t\t\t// If the
    is surrounded by blocks then convert it to a paragraph:\n\t\t\t// *

    foo

    [
    ]

    bar

    ->

    foo

    [

    ]

    bar

    \n\t\t\t// *

    foo

    [
    ] ->

    foo

    [

    ]\n\t\t\t// * [
    ]

    foo

    -> [

    ]

    foo

    \n\t\t\tif ( previousSiblingIsBlock || nextSiblingIsBlock ) {\n\t\t\t\telementsToReplace.push( element );\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( const element of elementsToReplace ) {\n\t\tif ( element.hasClass( 'Apple-interchange-newline' ) ) {\n\t\t\twriter.remove( element );\n\t\t} else {\n\t\t\twriter.replace( element, writer.createElement( 'p' ) );\n\t\t}\n\t}\n}\n\n/**\n * Returns sibling node, threats inline elements as transparent (but should stop on an inline objects).\n */\nfunction findSibling(\n\tviewElement: ViewElement,\n\tdirection: 'forward' | 'backward',\n\twriter: UpcastWriter,\n\t{ blockElements, inlineObjectElements }: { blockElements: Array; inlineObjectElements: Array }\n) {\n\tlet position = writer.createPositionAt( viewElement, direction == 'forward' ? 'after' : 'before' );\n\n\t// Find first position that is just before a first:\n\t// * text node,\n\t// * block element,\n\t// * inline object element.\n\t// It's ignoring any inline (non-object) elements like span, strong, etc.\n\tposition = position.getLastMatchingPosition( ( { item } ) => (\n\t\titem.is( 'element' ) &&\n\t\t!blockElements.includes( item.name ) &&\n\t\t!inlineObjectElements.includes( item.name )\n\t), { direction } );\n\n\treturn direction == 'forward' ? position.nodeAfter : position.nodeBefore;\n}\n\n/**\n * Returns true for view elements that are listed as block view elements.\n */\nfunction isBlockViewElement( node: ViewNode | null, blockElements: Array ) {\n\treturn !!node && node.is( 'element' ) && blockElements.includes( node.name );\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/googledocsnormalizer\n */\n\nimport { UpcastWriter, type ViewDocument } from 'ckeditor5/src/engine.js';\n\nimport removeBoldWrapper from '../filters/removeboldwrapper.js';\nimport transformBlockBrsToParagraphs from '../filters/br.js';\nimport { unwrapParagraphInListItem } from '../filters/list.js';\nimport type { Normalizer, NormalizerData } from '../normalizer.js';\n\nconst googleDocsMatch = /id=(\"|')docs-internal-guid-[-0-9a-f]+(\"|')/i;\n\n/**\n * Normalizer for the content pasted from Google Docs.\n */\nexport default class GoogleDocsNormalizer implements Normalizer {\n\tpublic readonly document: ViewDocument;\n\n\t/**\n\t * Creates a new `GoogleDocsNormalizer` instance.\n\t *\n\t * @param document View document.\n\t */\n\tconstructor( document: ViewDocument ) {\n\t\tthis.document = document;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isActive( htmlString: string ): boolean {\n\t\treturn googleDocsMatch.test( htmlString );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic execute( data: NormalizerData ): void {\n\t\tconst writer = new UpcastWriter( this.document );\n\t\tconst { body: documentFragment } = data._parsedData;\n\n\t\tremoveBoldWrapper( documentFragment, writer );\n\t\tunwrapParagraphInListItem( documentFragment, writer );\n\t\ttransformBlockBrsToParagraphs( documentFragment, writer );\n\n\t\tdata.content = documentFragment;\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removeboldwrapper\n */\n\nimport type { UpcastWriter, ViewDocumentFragment } from 'ckeditor5/src/engine.js';\n\n/**\n * Removes the `` tag wrapper added by Google Docs to a copied content.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n */\nexport default function removeBoldWrapper( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): void {\n\tfor ( const child of documentFragment.getChildren() ) {\n\t\tif ( child.is( 'element', 'b' ) && child.getStyle( 'font-weight' ) === 'normal' ) {\n\t\t\tconst childIndex = documentFragment.getChildIndex( child );\n\n\t\t\twriter.remove( child );\n\t\t\twriter.insertChild( childIndex, child.getChildren(), documentFragment );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/normalizers/googlesheetsnormalizer\n */\n\nimport { UpcastWriter, type ViewDocument } from 'ckeditor5/src/engine.js';\n\nimport removeXmlns from '../filters/removexmlns.js';\nimport removeGoogleSheetsTag from '../filters/removegooglesheetstag.js';\nimport removeInvalidTableWidth from '../filters/removeinvalidtablewidth.js';\nimport removeStyleBlock from '../filters/removestyleblock.js';\nimport type { Normalizer, NormalizerData } from '../normalizer.js';\n\nconst googleSheetsMatch = /` tag wrapper added by Google Sheets to a copied content.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n */\nexport default function removeGoogleSheetsTag( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): void {\n\tfor ( const child of documentFragment.getChildren() ) {\n\t\tif ( child.is( 'element', 'google-sheets-html-origin' ) ) {\n\t\t\tconst childIndex = documentFragment.getChildIndex( child );\n\n\t\t\twriter.remove( child );\n\t\t\twriter.insertChild( childIndex, child.getChildren(), documentFragment );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removexmlns\n */\n\nimport type { UpcastWriter, ViewDocumentFragment } from 'ckeditor5/src/engine.js';\n\n/**\n * Removes the `xmlns` attribute from table pasted from Google Sheets.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n */\nexport default function removeXmlns( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): void {\n\tfor ( const child of documentFragment.getChildren() ) {\n\t\tif ( child.is( 'element', 'table' ) && child.hasAttribute( 'xmlns' ) ) {\n\t\t\twriter.removeAttribute( 'xmlns', child );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removeinvalidtablewidth\n */\n\nimport type { UpcastWriter, ViewDocumentFragment } from 'ckeditor5/src/engine.js';\n\n/**\n * Removes the `width:0px` style from table pasted from Google Sheets.\n *\n * @param documentFragment element `data.content` obtained from clipboard\n */\nexport default function removeInvalidTableWidth( documentFragment: ViewDocumentFragment, writer: UpcastWriter ): void {\n\tfor ( const child of documentFragment.getChildren() ) {\n\t\tif ( child.is( 'element', 'table' ) && child.getStyle( 'width' ) === '0px' ) {\n\t\t\twriter.removeStyle( 'width', child );\n\t\t}\n\t}\n}\n","/**\n * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.\n * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license\n */\n\n/**\n * @module paste-from-office/filters/removestyleblock\n */\n\nimport type { UpcastWriter, ViewDocumentFragment } from 'ckeditor5/src/engine.js';\n\n/**\n * Removes ` + + + + + + + diff --git a/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css b/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css new file mode 100644 index 0000000..f70c116 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembed.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-content .media { + /* Don't allow floated content overlap the media. + https://github.com/ckeditor/ckeditor5-media-embed/issues/53 */ + clear: both; + + /* Make sure there is some space between the content and the media. */ + /* The first value should be equal to --ck-spacing-large variable if used in the editor context + to avoid the content jumping (See https://github.com/ckeditor/ckeditor5/issues/9825). */ + margin: 0.9em 0; + + /* Make sure media is not overriden with Bootstrap default `flex` value. + See: https://github.com/ckeditor/ckeditor5/issues/1373. */ + display: block; + + /* Give the media some minimal width in the content to prevent them + from being "squashed" in tight spaces, e.g. in table cells (#44) */ + min-width: 15em; +} diff --git a/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css b/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css new file mode 100644 index 0000000..add3ba3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaembedediting.css @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck-media__wrapper { + & .ck-media__placeholder { + display: flex; + flex-direction: column; + align-items: center; + + & .ck-media__placeholder__url { + /* Otherwise the URL will overflow when the content is very narrow. */ + max-width: 100%; + + position: relative; + + & .ck-media__placeholder__url__text { + overflow: hidden; + display: block; + } + } + } + + &[data-oembed-url*="twitter.com"], + &[data-oembed-url*="google.com/maps"], + &[data-oembed-url*="goo.gl/maps"], + &[data-oembed-url*="maps.google.com"], + &[data-oembed-url*="maps.app.goo.gl"], + &[data-oembed-url*="facebook.com"], + &[data-oembed-url*="instagram.com"] { + & .ck-media__placeholder__icon * { + display: none; + } + } +} + +/* Disable all mouse interaction as long as the editor is not read–only. + https://github.com/ckeditor/ckeditor5-media-embed/issues/58 */ +.ck-editor__editable:not(.ck-read-only) .ck-media__wrapper > *:not(.ck-media__placeholder) { + pointer-events: none; +} + +/* Disable all mouse interaction when the widget is not selected (e.g. to avoid opening links by accident). + https://github.com/ckeditor/ckeditor5-media-embed/issues/18 */ +.ck-editor__editable:not(.ck-read-only) .ck-widget:not(.ck-widget_selected) .ck-media__placeholder { + pointer-events: none; +} diff --git a/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css b/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css new file mode 100644 index 0000000..5b5ef3f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-media-embed/theme/mediaform.css @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"; + +.ck.ck-media-form { + display: flex; + align-items: flex-start; + flex-direction: row; + flex-wrap: nowrap; + + & .ck-labeled-field-view { + display: inline-block; + } + + & .ck-label { + display: none; + } + + @mixin ck-media-phone { + flex-wrap: wrap; + + & .ck-labeled-field-view { + flex-basis: 100%; + } + + & .ck-button { + flex-basis: 50%; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-paragraph/CHANGELOG.md new file mode 100644 index 0000000..7ac1221 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/CHANGELOG.md @@ -0,0 +1,175 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v18.0.0...v19.0.0) (April 29, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v16.0.0...v17.0.0) (February 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v15.0.0...v16.0.0) (December 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.5...v15.0.0) (October 23, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.4...v11.0.5) (August 26, 2019) + +### Bug fixes + +* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([7229cdb](https://github.com/ckeditor/ckeditor5-paragraph/commit/7229cdb)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([b1b9e23](https://github.com/ckeditor/ckeditor5-paragraph/commit/b1b9e23)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.3...v11.0.4) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.2...v11.0.3) (July 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.1...v11.0.2) (June 6, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v11.0.0...v11.0.1) (April 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.4...v11.0.0) (February 28, 2019) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.3...v10.0.4) (December 5, 2018) + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([a9f440f](https://github.com/ckeditor/ckeditor5-paragraph/commit/a9f440f)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.2...v10.0.3) (October 8, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.1...v10.0.2) (July 18, 2018) + +### Other changes + +* Refreshed the paragraph icon (see [ckeditor/ckeditor5-ui#394](https://github.com/ckeditor/ckeditor5-ui/issues/394)). ([d6e054a](https://github.com/ckeditor/ckeditor5-paragraph/commit/d6e054a)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v10.0.0...v10.0.1) (June 21, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([8f01946](https://github.com/ckeditor/ckeditor5-paragraph/commit/8f01946)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +### Features + +* Introduced `ParagraphButtonUI` plugin. Closes [#33](https://github.com/ckeditor/ckeditor5-paragraph/issues/33). ([12dadba](https://github.com/ckeditor/ckeditor5-paragraph/commit/12dadba)) + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Other changes + +* Aligned feature class naming to the new scheme. ([69e98d3](https://github.com/ckeditor/ckeditor5-paragraph/commit/69e98d3)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-paragraph/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +Internal changes only (updated dependencies, documentation, etc.). + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.9.0...v1.0.0-alpha.1) (October 3, 2017) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.8.0...v0.9.0) (September 3, 2017) + +### Bug fixes + +* `ParagraphCommand` should check whether it can be applied to the selection. Closes [#24](https://github.com/ckeditor/ckeditor5-paragraph/issues/24). ([07b37af](https://github.com/ckeditor/ckeditor5-paragraph/commit/07b37af)) +* Autoparagraphing empty roots will not be triggered if the change-to-fix was in a `transparent` batch. Closes [#26](https://github.com/ckeditor/ckeditor5-paragraph/issues/26). ([a171de3](https://github.com/ckeditor/ckeditor5-paragraph/commit/a171de3)) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([c2a1559](https://github.com/ckeditor/ckeditor5-paragraph/commit/c2a1559)) + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.7.0...v0.8.0) (May 7, 2017) + +### Bug fixes + +* Content autoparagraphing has been improved. "Inline" view elements (converted to attributes or elements) will be now correctly handled and autoparagraphed. Closes [#10](https://github.com/ckeditor/ckeditor5-paragraph/issues/10). Closes [#11](https://github.com/ckeditor/ckeditor5-paragraph/issues/11). ([22d387c](https://github.com/ckeditor/ckeditor5-paragraph/commit/22d387c)) + +### Features + +* Paragraph will be automatically created if loaded empty data or if programmatically emptied the root element. Closes [#19](https://github.com/ckeditor/ckeditor5-paragraph/issues/19). ([c42d33e](https://github.com/ckeditor/ckeditor5-paragraph/commit/c42d33e)) + + +## [0.7.0](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.6.1...v0.7.0) (April 5, 2017) + +### Bug fixes + +* Paragraph command should correctly update its `value` and `isEnabled` properties. Closes [#16](https://github.com/ckeditor/ckeditor5-paragraph/issues/16). ([931e02f](https://github.com/ckeditor/ckeditor5-paragraph/commit/931e02f)) + +### Features + +* Implemented `ParagraphCommand`, previously part of the `HeadingCommand`. Closes [#14](https://github.com/ckeditor/ckeditor5-paragraph/issues/14). ([876877d](https://github.com/ckeditor/ckeditor5-paragraph/commit/876877d)) +* Named existing plugin(s). ([46dc9b8](https://github.com/ckeditor/ckeditor5-paragraph/commit/46dc9b8)) + + +## [0.6.1](https://github.com/ckeditor/ckeditor5-paragraph/compare/v0.6.0...v0.6.1) (March 6, 2017) + +Internal changes only (updated dependencies, documentation, etc.). diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/LICENSE.md b/node_modules/@ckeditor/ckeditor5-paragraph/LICENSE.md new file mode 100644 index 0000000..5ae21e3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 paragraph feature** – https://github.com/ckeditor/ckeditor5-paragraph
    +Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/README.md b/node_modules/@ckeditor/ckeditor5-paragraph/README.md new file mode 100644 index 0000000..eb7e8c3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/README.md @@ -0,0 +1,16 @@ +CKEditor 5 paragraph feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-paragraph.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-paragraph) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements paragraph support for CKEditor 5. + +## Documentation + +See the [`@ckeditor/ckeditor5-paragraph` package](https://ckeditor.com/docs/ckeditor5/latest/api/paragraph.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json new file mode 100644 index 0000000..e4845e6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/ckeditor5-metadata.json @@ -0,0 +1,17 @@ +{ + "plugins": [ + { + "name": "Paragraph", + "className": "Paragraph", + "description": "Enables support for adding paragraphs to your content.", + "path": "src/paragraph.js", + "htmlOutput": [ + { + "elements": "p", + "implements": "$block", + "_comment": "This element inherits all attributes, classes and styles that are allowed on the `<$block>` element by other features." + } + ] + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/package.json b/node_modules/@ckeditor/ckeditor5-paragraph/package.json new file mode 100644 index 0000000..d93d37a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/package.json @@ -0,0 +1,38 @@ +{ + "name": "@ckeditor/ckeditor5-paragraph", + "version": "41.3.1", + "description": "Paragraph feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-paragraph" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.d.ts new file mode 100644 index 0000000..20cd73f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.d.ts @@ -0,0 +1,14 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Paragraph, ParagraphCommand, InsertParagraphCommand } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface CommandsMap { + insertParagraph: InsertParagraphCommand; + paragraph: ParagraphCommand; + } + interface PluginsMap { + [Paragraph.pluginName]: Paragraph; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-paragraph/src/index.d.ts new file mode 100644 index 0000000..732cd05 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/index.d.ts @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph + */ +export { default as Paragraph } from './paragraph.js'; +export { default as ParagraphButtonUI } from './paragraphbuttonui.js'; +export type { default as ParagraphCommand } from './paragraphcommand.js'; +export type { default as InsertParagraphCommand } from './insertparagraphcommand.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/index.js b/node_modules/@ckeditor/ckeditor5-paragraph/src/index.js new file mode 100644 index 0000000..4933443 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/index.js @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph + */ +export { default as Paragraph } from './paragraph.js'; +export { default as ParagraphButtonUI } from './paragraphbuttonui.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.d.ts b/node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.d.ts new file mode 100644 index 0000000..973f792 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.d.ts @@ -0,0 +1,45 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/insertparagraphcommand + */ +import { Command, type Editor } from '@ckeditor/ckeditor5-core'; +import type { Position } from '@ckeditor/ckeditor5-engine'; +/** + * The insert paragraph command. It inserts a new paragraph at a specific + * {@link module:engine/model/position~Position document position}. + * + * ```ts + * // Insert a new paragraph before an element in the document. + * editor.execute( 'insertParagraph', { + * position: editor.model.createPositionBefore( element ) + * } ); + * ``` + * + * If a paragraph is disallowed in the context of the specific position, the command + * will attempt to split position ancestors to find a place where it is possible + * to insert a paragraph. + * + * **Note**: This command moves the selection to the inserted paragraph. + */ +export default class InsertParagraphCommand extends Command { + constructor(editor: Editor); + /** + * Executes the command. + * + * @param options Options for the executed command. + * @param options.position The model position at which the new paragraph will be inserted. + * @param options.attributes Attributes keys and values to set on a inserted paragraph. + * @fires execute + */ + execute(options: { + position: Position; + attributes?: Record; + }): void; + /** + * Returns the best position to insert a new paragraph. + */ + private _findPositionToInsertParagraph; +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js b/node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js new file mode 100644 index 0000000..43d1cc5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/insertparagraphcommand.js @@ -0,0 +1,90 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/insertparagraphcommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +/** + * The insert paragraph command. It inserts a new paragraph at a specific + * {@link module:engine/model/position~Position document position}. + * + * ```ts + * // Insert a new paragraph before an element in the document. + * editor.execute( 'insertParagraph', { + * position: editor.model.createPositionBefore( element ) + * } ); + * ``` + * + * If a paragraph is disallowed in the context of the specific position, the command + * will attempt to split position ancestors to find a place where it is possible + * to insert a paragraph. + * + * **Note**: This command moves the selection to the inserted paragraph. + */ +export default class InsertParagraphCommand extends Command { + constructor(editor) { + super(editor); + // Since this command passes position in execution block instead of selection, it should be checked directly. + this._isEnabledBasedOnSelection = false; + } + /** + * Executes the command. + * + * @param options Options for the executed command. + * @param options.position The model position at which the new paragraph will be inserted. + * @param options.attributes Attributes keys and values to set on a inserted paragraph. + * @fires execute + */ + execute(options) { + const model = this.editor.model; + const attributes = options.attributes; + let position = options.position; + // Don't execute command if position is in non-editable place. + if (!model.canEditAt(position)) { + return; + } + model.change(writer => { + position = this._findPositionToInsertParagraph(position, writer); + if (!position) { + return; + } + const paragraph = writer.createElement('paragraph'); + if (attributes) { + model.schema.setAllowedAttributes(paragraph, attributes, writer); + } + model.insertContent(paragraph, position); + writer.setSelection(paragraph, 'in'); + }); + } + /** + * Returns the best position to insert a new paragraph. + */ + _findPositionToInsertParagraph(position, writer) { + const model = this.editor.model; + if (model.schema.checkChild(position, 'paragraph')) { + return position; + } + const allowedParent = model.schema.findAllowedParent(position, 'paragraph'); + // It could be there's no ancestor limit that would allow paragraph. + // In theory, "paragraph" could be disallowed even in the "$root". + if (!allowedParent) { + return null; + } + const positionParent = position.parent; + const isTextAllowed = model.schema.checkChild(positionParent, '$text'); + // At empty $block or at the end of $block. + // [] ---> [] + // foo[] ---> foo[] + if (positionParent.isEmpty || isTextAllowed && position.isAtEnd) { + return model.createPositionAfter(positionParent); + } + // At the start of $block with text. + // []foo ---> []foo + if (!positionParent.isEmpty && isTextAllowed && position.isAtStart) { + return model.createPositionBefore(positionParent); + } + return writer.split(position, allowedParent).position; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.d.ts b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.d.ts new file mode 100644 index 0000000..dd7a3e6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.d.ts @@ -0,0 +1,61 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +/** + * The paragraph feature for the editor. + * + * It introduces the `` element in the model which renders as a `

    ` element in the DOM and data. + * + * It also brings two editors commands: + * + * * The {@link module:paragraph/paragraphcommand~ParagraphCommand `'paragraph'`} command that converts all + * blocks in the model selection into paragraphs. + * * The {@link module:paragraph/insertparagraphcommand~InsertParagraphCommand `'insertParagraph'`} command + * that inserts a new paragraph at a specified location in the model. + */ +export default class Paragraph extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "Paragraph"; + /** + * @inheritDoc + */ + init(): void; + /** + * A list of element names which should be treated by the autoparagraphing algorithms as + * paragraph-like. This means that e.g. the following content: + * + * ```html + *

    Foo

    + * + * + * + * + * + *
    X + *
      + *
    • Y
    • + *
    • Z
    • + *
    + *
    + * ``` + * + * contains five paragraph-like elements: `

    `, two ``s and two `
  1. `s. + * Hence, if none of the features is going to convert those elements the above content will be automatically handled + * by the paragraph feature and converted to: + * + * ```html + *

    Foo

    + *

    X

    + *

    Y

    + *

    Z

    + * ``` + * + * Note: The `` containing two `
  2. ` elements was ignored as the innermost paragraph-like elements + * have a priority upon conversion. + */ + static paragraphLikeElements: Set; +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.js b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.js new file mode 100644 index 0000000..4706cff --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraph.js @@ -0,0 +1,107 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraph + */ +import ParagraphCommand from './paragraphcommand.js'; +import InsertParagraphCommand from './insertparagraphcommand.js'; +import { Plugin } from '@ckeditor/ckeditor5-core'; +/** + * The paragraph feature for the editor. + * + * It introduces the `` element in the model which renders as a `

    ` element in the DOM and data. + * + * It also brings two editors commands: + * + * * The {@link module:paragraph/paragraphcommand~ParagraphCommand `'paragraph'`} command that converts all + * blocks in the model selection into paragraphs. + * * The {@link module:paragraph/insertparagraphcommand~InsertParagraphCommand `'insertParagraph'`} command + * that inserts a new paragraph at a specified location in the model. + */ +class Paragraph extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'Paragraph'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const model = editor.model; + editor.commands.add('paragraph', new ParagraphCommand(editor)); + editor.commands.add('insertParagraph', new InsertParagraphCommand(editor)); + // Schema. + model.schema.register('paragraph', { inheritAllFrom: '$block' }); + editor.conversion.elementToElement({ model: 'paragraph', view: 'p' }); + // Conversion for paragraph-like elements which has not been converted by any plugin. + editor.conversion.for('upcast').elementToElement({ + model: (viewElement, { writer }) => { + if (!Paragraph.paragraphLikeElements.has(viewElement.name)) { + return null; + } + // Do not auto-paragraph empty elements. + if (viewElement.isEmpty) { + return null; + } + return writer.createElement('paragraph'); + }, + view: /.+/, + converterPriority: 'low' + }); + } +} +/** + * A list of element names which should be treated by the autoparagraphing algorithms as + * paragraph-like. This means that e.g. the following content: + * + * ```html + *

    Foo

    + * + * + * + * + * + *
    X + *
      + *
    • Y
    • + *
    • Z
    • + *
    + *
    + * ``` + * + * contains five paragraph-like elements: `

    `, two ``s and two `
  3. `s. + * Hence, if none of the features is going to convert those elements the above content will be automatically handled + * by the paragraph feature and converted to: + * + * ```html + *

    Foo

    + *

    X

    + *

    Y

    + *

    Z

    + * ``` + * + * Note: The `` containing two `
  4. ` elements was ignored as the innermost paragraph-like elements + * have a priority upon conversion. + */ +Paragraph.paragraphLikeElements = new Set([ + 'blockquote', + 'dd', + 'div', + 'dt', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'li', + 'p', + 'td', + 'th' +]); +export default Paragraph; diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.d.ts b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.d.ts new file mode 100644 index 0000000..8f43805 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.d.ts @@ -0,0 +1,36 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraphbuttonui + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import Paragraph from './paragraph.js'; +/** + * This plugin defines the `'paragraph'` button. It can be used together with + * {@link module:heading/headingbuttonsui~HeadingButtonsUI} to replace the standard heading dropdown. + * + * This plugin is not loaded automatically by the {@link module:paragraph/paragraph~Paragraph} plugin. It must + * be added manually. + * + * ```ts + * ClassicEditor + * .create( { + * plugins: [ ..., Heading, Paragraph, HeadingButtonsUI, ParagraphButtonUI ] + * toolbar: [ 'paragraph', 'heading1', 'heading2', 'heading3' ] + * } ) + * .then( ... ) + * .catch( ... ); + * ``` + */ +export default class ParagraphButtonUI extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof Paragraph]; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js new file mode 100644 index 0000000..409abe1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphbuttonui.js @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraphbuttonui + */ +import { Plugin, icons } from '@ckeditor/ckeditor5-core'; +import { ButtonView } from '@ckeditor/ckeditor5-ui'; +import Paragraph from './paragraph.js'; +const icon = icons.paragraph; +/** + * This plugin defines the `'paragraph'` button. It can be used together with + * {@link module:heading/headingbuttonsui~HeadingButtonsUI} to replace the standard heading dropdown. + * + * This plugin is not loaded automatically by the {@link module:paragraph/paragraph~Paragraph} plugin. It must + * be added manually. + * + * ```ts + * ClassicEditor + * .create( { + * plugins: [ ..., Heading, Paragraph, HeadingButtonsUI, ParagraphButtonUI ] + * toolbar: [ 'paragraph', 'heading1', 'heading2', 'heading3' ] + * } ) + * .then( ... ) + * .catch( ... ); + * ``` + */ +export default class ParagraphButtonUI extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [Paragraph]; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + editor.ui.componentFactory.add('paragraph', locale => { + const view = new ButtonView(locale); + const command = editor.commands.get('paragraph'); + view.label = t('Paragraph'); + view.icon = icon; + view.tooltip = true; + view.isToggleable = true; + view.bind('isEnabled').to(command); + view.bind('isOn').to(command, 'value'); + view.on('execute', () => { + editor.execute('paragraph'); + }); + return view; + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.d.ts b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.d.ts new file mode 100644 index 0000000..2d09028 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.d.ts @@ -0,0 +1,38 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraphcommand + */ +import { Command, type Editor } from '@ckeditor/ckeditor5-core'; +import type { Selection, DocumentSelection } from '@ckeditor/ckeditor5-engine'; +/** + * The paragraph command. + */ +export default class ParagraphCommand extends Command { + constructor(editor: Editor); + /** + * The value of the command. Indicates whether the selection start is placed in a paragraph. + * + * @readonly + * @observable + */ + value: boolean; + /** + * @inheritDoc + */ + refresh(): void; + /** + * Executes the command. All the blocks (see {@link module:engine/model/schema~Schema}) in the selection + * will be turned to paragraphs. + * + * @fires execute + * @param options Options for the executed command. + * @param options.selection The selection that the command should be applied to. By default, + * if not provided, the command is applied to the {@link module:engine/model/document~Document#selection}. + */ + execute(options?: { + selection?: Selection | DocumentSelection; + }): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js new file mode 100644 index 0000000..702bf46 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paragraph/src/paragraphcommand.js @@ -0,0 +1,64 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module paragraph/paragraphcommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +import { first } from '@ckeditor/ckeditor5-utils'; +/** + * The paragraph command. + */ +export default class ParagraphCommand extends Command { + constructor(editor) { + super(editor); + // Since this command may pass selection in execution block, it should be checked directly. + this._isEnabledBasedOnSelection = false; + } + /** + * @inheritDoc + */ + refresh() { + const model = this.editor.model; + const document = model.document; + const block = first(document.selection.getSelectedBlocks()); + this.value = !!block && block.is('element', 'paragraph'); + this.isEnabled = !!block && checkCanBecomeParagraph(block, model.schema); + } + /** + * Executes the command. All the blocks (see {@link module:engine/model/schema~Schema}) in the selection + * will be turned to paragraphs. + * + * @fires execute + * @param options Options for the executed command. + * @param options.selection The selection that the command should be applied to. By default, + * if not provided, the command is applied to the {@link module:engine/model/document~Document#selection}. + */ + execute(options = {}) { + const model = this.editor.model; + const document = model.document; + const selection = options.selection || document.selection; + // Don't execute command if selection is in non-editable place. + if (!model.canEditAt(selection)) { + return; + } + model.change(writer => { + const blocks = selection.getSelectedBlocks(); + for (const block of blocks) { + if (!block.is('element', 'paragraph') && checkCanBecomeParagraph(block, model.schema)) { + writer.rename(block, 'paragraph'); + } + } + }); + } +} +/** + * Checks whether the given block can be replaced by a paragraph. + * + * @param block A block to be tested. + * @param schema The schema of the document. + */ +function checkCanBecomeParagraph(block, schema) { + return schema.checkChild(block.parent, 'paragraph') && !schema.isObject(block); +} diff --git a/node_modules/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md new file mode 100644 index 0000000..a408cbe --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paste-from-office/CHANGELOG.md @@ -0,0 +1,94 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v18.0.0...v19.0.0) (April 29, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v17.0.0...v18.0.0) (March 19, 2020) + +### Features + +* Added support for basic list indentation when pasting from Microsoft Word. Closes [ckeditor/ckeditor5#2518](https://github.com/ckeditor/ckeditor5/issues/2518). ([58ae829](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/58ae829)) + + Thanks to [gjhenrique](https://github.com/gjhenrique) for the contribution! + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v16.0.0...v17.0.0) (February 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Bug fixes + +* Fixed handling `mso-list:normal`. Closes [ckeditor/ckeditor5#5712](https://github.com/ckeditor/ckeditor5/issues/5712). ([2054e69](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/2054e69)) + + Thanks [@bendemboski](https://github.com/bendemboski)! +* Fixed various issues with oddly formatted space run spans. ([2cd7b0f](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/2cd7b0f)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.1.0...v15.0.0) (October 23, 2019) + +### Other changes + +* Remove the `fixListIndentation()` filter in favor of improved list converters fix. See [ckeditor/ckeditor5-list#115](https://github.com/ckeditor/ckeditor5-list/issues/115). ([d594038](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/d594038)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.4...v11.1.0) (August 26, 2019) + +### Features + +* Prevent making entire content pasted from Google Docs bold. Closes [#61](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/61). ([8102de3](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/8102de3)) +* Provide support for pasting lists from Google Docs. Closes [#69](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/69). ([6ad2a62](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/6ad2a62)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([22edb90](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/22edb90)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.3...v11.0.4) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.2...v11.0.3) (July 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.1...v11.0.2) (June 6, 2019) + +### Other changes + +* Loosen a dependency of a clipboard plugin in the paste from Office plugin so that it can be overridden. Closes [#56](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/56). ([561f22b](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/561f22b)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v11.0.0...v11.0.1) (April 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/compare/v10.0.0...v11.0.0) (February 28, 2019) + +### Bug fixes + +* Ensured correct lists ordering for separate list items with the same `mso-list` id. Closes [#43](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/43). ([4ebc363](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/4ebc363)) +* Handle "spacerun spans" with mixed whitespaces. Closes [#49](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/49). Closes [#50](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/50). ([7fb132f](https://github.com/ckeditor/ckeditor5-paste-from-office/commit/7fb132f)) + + Huge thanks to [Matt Kobs](https://github.com/kobsy) for this contribution! + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-paste-from-office/tree/v10.0.0) (December 5, 2018) + +Initial implementation of the Paste from Office feature. diff --git a/node_modules/@ckeditor/ckeditor5-paste-from-office/LICENSE.md b/node_modules/@ckeditor/ckeditor5-paste-from-office/LICENSE.md new file mode 100644 index 0000000..31458db --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paste-from-office/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 paste from Office feature** – https://github.com/ckeditor/ckeditor5-paste-from-office
    +Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-paste-from-office/README.md b/node_modules/@ckeditor/ckeditor5-paste-from-office/README.md new file mode 100644 index 0000000..45601db --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paste-from-office/README.md @@ -0,0 +1,22 @@ +CKEditor 5 paste from Office feature +================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-paste-from-office.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-paste-from-office) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements the [paste from Office](https://docs.ckeditor.com/ckeditor5/latest/features/paste-from-office.html) feature for CKEditor 5. + +Paste from Office allows copying content from Microsoft Word without losing any formatting. + +## Demo + +Check out the demos for the [paste from office](https://ckeditor.com/docs/ckeditor5/latest/features/pasting/paste-from-office.html#demo) and [paste from Google Docs](https://ckeditor.com/docs/ckeditor5/latest/features/pasting/paste-from-google-docs.html#demo) features. + +## Documentation + +See the [`@ckeditor/ckeditor5-paste-from-office` package](https://docs.ckeditor.com/ckeditor5/latest/api/paste-from-office.html) page in [CKEditor 5 documentation](https://docs.ckeditor.com/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js b/node_modules/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js new file mode 100644 index 0000000..e136a18 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-paste-from-office/build/paste-from-office.js @@ -0,0 +1,4 @@ +/*! + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md. + */(()=>{var e={331:(e,t,n)=>{e.exports=n(237)("./src/clipboard.js")},782:(e,t,n)=>{e.exports=n(237)("./src/core.js")},783:(e,t,n)=>{e.exports=n(237)("./src/engine.js")},237:e=>{"use strict";e.exports=CKEditor5.dll}},t={};function n(r){var s=t[r];if(void 0!==s)return s.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,n),i.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{"use strict";n.r(r),n.d(r,{MSWordNormalizer:()=>x,PasteFromOffice:()=>P,parseHtml:()=>M});var e=n(782),t=n(331),s=n(783);function i(e){return void 0!==e&&e.endsWith("px")}function o(e){return e.toFixed(2).replace(/\.?0+$/,"")+"px"}function l(e,t,n){if(!e.childCount)return;const r=new s.UpcastWriter(e.document),l=function(e,t){const n=t.createRangeIn(e),r=[],s=new Set;for(const e of n.getItems()){if(!e.is("element")||!e.name.match(/^(p|h\d+|li|div)$/))continue;let t=g(e);if(void 0===t||0!=parseFloat(t)||Array.from(e.getClassNames()).find((e=>e.startsWith("MsoList")))||(t=void 0),e.hasStyle("mso-list")||void 0!==t&&s.has(t)){const n=f(e);r.push({element:e,id:n.id,order:n.order,indent:n.indent,marginLeft:t}),void 0!==t&&s.add(t)}else s.clear()}return r}(e,r);if(!l.length)return;const a={},u=[];for(const e of l)if(void 0!==e.indent){c(e)||(u.length=0);const s=`${e.id}:${e.indent}`,l=Math.min(e.indent-1,u.length);if(lu.length-1||u[l].listElement.name!=c.type){0==l&&"ol"==c.type&&void 0!==e.id&&a[s]&&(c.startIndex=a[s]);const t=d(c,r,n);if(i(e.marginLeft)&&(0==l||i(u[l-1].marginLeft))){let n=e.marginLeft;l>0&&(n=o(parseFloat(n)-parseFloat(u[l-1].marginLeft))),r.setStyle("padding-left",n,t)}if(0==u.length){const n=e.element.parent,s=n.getChildIndex(e.element)+1;r.insertChild(s,t,n)}else{const e=u[l-1].listItemElements;r.appendChild(t,e[e.length-1])}u[l]={...e,listElement:t,listItemElements:[]},0==l&&void 0!==e.id&&(a[s]=c.startIndex||1)}}const f="li"==e.element.name?e.element:r.createElement("li");r.appendChild(f,u[l].listElement),u[l].listItemElements.push(f),0==l&&void 0!==e.id&&a[s]++,e.element!=f&&r.appendChild(e.element,f),p(e.element,r),r.removeStyle("text-indent",e.element),r.removeStyle("margin-left",e.element)}else{const t=u.find((t=>t.marginLeft==e.marginLeft));if(t){const n=t.listItemElements;r.appendChild(e.element,n[n.length-1]),r.removeStyle("margin-left",e.element)}else u.length=0}}function c(e){const t=e.element.previousSibling;return a(t||e.element.parent)}function a(e){return e.is("element","ol")||e.is("element","ul")}function m(e,t){const n=new RegExp(`@list l${e.id}:level${e.indent}\\s*({[^}]*)`,"gi"),r=/mso-level-number-format:([^;]{0,100});/gi,s=/mso-level-start-at:\s{0,100}([0-9]{0,10})\s{0,100};/gi,i=new RegExp(`@list\\s+l${e.id}:level\\d\\s*{[^{]*mso-level-text:"%\\d\\\\.`,"gi"),o=new RegExp(`@list l${e.id}:level\\d\\s*{[^{]*mso-level-number-format:`,"gi"),l=i.exec(t),c=o.exec(t),a=l&&!c,m=n.exec(t);let d="decimal",f="ol",p=null;if(m&&m[1]){const t=r.exec(m[1]);if(t&&t[1]&&(d=t[1].trim(),f="bullet"!==d&&"image"!==d?"ol":"ul"),"bullet"===d){const t=function(e){if("li"==e.name&&"ul"==e.parent.name&&e.parent.hasAttribute("type"))return e.parent.getAttribute("type");const t=function(e){if(e.getChild(0).is("$text"))return null;for(const t of e.getChildren()){if(!t.is("element","span"))continue;const e=t.getChild(0);if(e)return e.is("$text")?e:e.getChild(0)}return null}(e);if(!t)return null;const n=t._data;if("o"===n)return"circle";if("·"===n)return"disc";if("§"===n)return"square";return null}(e.element);t&&(d=t)}else{const e=s.exec(m[1]);e&&e[1]&&(p=parseInt(e[1]))}a&&(f="ol")}return{type:f,startIndex:p,style:u(d),isLegalStyleList:a}}function u(e){if(e.startsWith("arabic-leading-zero"))return"decimal-leading-zero";switch(e){case"alpha-upper":return"upper-alpha";case"alpha-lower":return"lower-alpha";case"roman-upper":return"upper-roman";case"roman-lower":return"lower-roman";case"circle":case"disc":case"square":return e;default:return null}}function d(e,t,n){const r=t.createElement(e.type);return e.style&&t.setStyle("list-style-type",e.style,r),e.startIndex&&e.startIndex>1&&t.setAttribute("start",e.startIndex,r),e.isLegalStyleList&&n&&t.addClass("legal-list",r),r}function f(e){const t=e.getStyle("mso-list");if(void 0===t)return{};const n=t.match(/(^|\s{1,100})l(\d+)/i),r=t.match(/\s{0,100}lfo(\d+)/i),s=t.match(/\s{0,100}level(\d+)/i);return n&&r&&s?{id:n[2],order:r[1],indent:parseInt(s[1])}:{indent:1}}function p(e,t){const n=new s.Matcher({name:"span",styles:{"mso-list":"Ignore"}}),r=t.createRangeIn(e);for(const e of r)"elementStart"===e.type&&n.match(e.item)&&t.remove(e.item)}function g(e){const t=e.getStyle("margin-left");return void 0===t||t.endsWith("px")?t:function(e){const t=parseFloat(e);return e.endsWith("pt")?o(96*t/72):e.endsWith("pc")?o(12*t*96/72):e.endsWith("in")?o(96*t):e.endsWith("cm")?o(96*t/2.54):e.endsWith("mm")?o(t/10*96/2.54):e}(t)}function h(e,t){if(!e.childCount)return;const n=new s.UpcastWriter(e.document),r=function(e,t){const n=t.createRangeIn(e),r=new s.Matcher({name:/v:(.+)/}),i=[];for(const e of n){if("elementStart"!=e.type)continue;const t=e.item,n=t.previousSibling,s=n&&n.is("element")?n.name:null,o=["Chart"],l=r.match(t),c=t.getAttribute("o:gfxdata"),a="v:shapetype"===s,m=c&&o.some((e=>t.getAttribute("id").includes(e)));l&&c&&!a&&!m&&i.push(e.item.getAttribute("id"))}return i}(e,n);!function(e,t,n){const r=n.createRangeIn(t),i=new s.Matcher({name:"img"}),o=[];for(const t of r)if(t.item.is("element")&&i.match(t.item)){const n=t.item,r=n.getAttribute("v:shapes")?n.getAttribute("v:shapes").split(" "):[];r.length&&r.every((t=>e.indexOf(t)>-1))?o.push(n):n.getAttribute("src")||o.push(n)}for(const e of o)n.remove(e)}(r,e,n),function(e,t,n){const r=n.createRangeIn(t),s=[];for(const t of r)if("elementStart"==t.type&&t.item.is("element","v:shape")){const n=t.item.getAttribute("id");if(e.includes(n))continue;i(t.item.parent.getChildren(),n)||s.push(t.item)}for(const e of s){const t={src:o(e)};e.hasAttribute("alt")&&(t.alt=e.getAttribute("alt"));const r=n.createElement("img",t);n.insertChild(e.index+1,r,e.parent)}function i(e,t){for(const n of e)if(n.is("element")){if("img"==n.name&&n.getAttribute("v:shapes")==t)return!0;if(i(n.getChildren(),t))return!0}return!1}function o(e){for(const t of e.getChildren())if(t.is("element")&&t.getAttribute("src"))return t.getAttribute("src")}}(r,e,n),function(e,t){const n=t.createRangeIn(e),r=new s.Matcher({name:/v:(.+)/}),i=[];for(const e of n)"elementStart"==e.type&&r.match(e.item)&&i.push(e.item);for(const e of i)t.remove(e)}(e,n);const i=function(e,t){const n=t.createRangeIn(e),r=new s.Matcher({name:"img"}),i=[];for(const e of n)e.item.is("element")&&r.match(e.item)&&e.item.getAttribute("src").startsWith("file://")&&i.push(e.item);return i}(e,n);i.length&&function(e,t,n){if(e.length===t.length)for(let r=0;rString.fromCharCode(parseInt(e,16)))).join(""))}const b=//i,v=/xmlns:o="urn:schemas-microsoft-com/i;class x{constructor(e,t=!1){this.document=e,this.hasMultiLevelListPlugin=t}isActive(e){return b.test(e)||v.test(e)}execute(e){const{body:t,stylesString:n}=e._parsedData;l(t,n,this.hasMultiLevelListPlugin),h(t,e.dataTransfer.getData("text/rtf")),function(e){const t=[],n=new s.UpcastWriter(e.document);for(const{item:r}of n.createRangeIn(e))if(r.is("element")){for(const e of r.getClassNames())/\bmso/gi.exec(e)&&n.removeClass(e,r);for(const e of r.getStyleNames())/\bmso/gi.exec(e)&&n.removeStyle(e,r);(r.is("element","w:sdt")||r.is("element","w:sdtpr")&&r.isEmpty||r.is("element","o:p")&&r.isEmpty)&&t.push(r)}for(const e of t){const t=e.parent,r=t.getChildIndex(e);n.insertChild(r,e.getChildren(),t),n.remove(e)}}(t),e.content=t}}function w(e,t,n,{blockElements:r,inlineObjectElements:s}){let i=n.createPositionAt(e,"forward"==t?"after":"before");return i=i.getLastMatchingPosition((({item:e})=>e.is("element")&&!r.includes(e.name)&&!s.includes(e.name)),{direction:t}),"forward"==t?i.nodeAfter:i.nodeBefore}function C(e,t){return!!e&&e.is("element")&&t.includes(e.name)}const S=/id=("|')docs-internal-guid-[-0-9a-f]+("|')/i;class A{constructor(e){this.document=e}isActive(e){return S.test(e)}execute(e){const t=new s.UpcastWriter(this.document),{body:n}=e._parsedData;!function(e,t){for(const n of e.getChildren())if(n.is("element","b")&&"normal"===n.getStyle("font-weight")){const r=e.getChildIndex(n);t.remove(n),t.insertChild(r,n.getChildren(),e)}}(n,t),function(e,t){for(const n of t.createRangeIn(e)){const e=n.item;if(e.is("element","li")){const n=e.getChild(0);n&&n.is("element","p")&&t.unwrapElement(n)}}}(n,t),function(e,t){const n=new s.ViewDocument(t.document.stylesProcessor),r=new s.DomConverter(n,{renderingMode:"data"}),i=r.blockElements,o=r.inlineObjectElements,l=[];for(const n of t.createRangeIn(e)){const e=n.item;if(e.is("element","br")){const n=w(e,"forward",t,{blockElements:i,inlineObjectElements:o}),r=w(e,"backward",t,{blockElements:i,inlineObjectElements:o}),s=C(n,i);(C(r,i)||s)&&l.push(e)}}for(const e of l)e.hasClass("Apple-interchange-newline")?t.remove(e):t.replace(e,t.createElement("p"))}(n,t),e.content=n}}const E=/(\s+)<\/span>/g,((e,t)=>1===t.length?" ":Array(t.length+1).join("  ").substr(0,t.length)))}function M(e,t){const n=new DOMParser,r=function(e){return L(L(e)).replace(/([^\S\r\n]*?)[\r\n]+([^\S\r\n]*<\/span>)/g,"$1$2").replace(/<\/span>/g,"").replace(/()[\r\n]+(<\/span>)/g,"$1 $2").replace(/ <\//g," <\/o:p>/g," ").replace(/( |\u00A0)<\/o:p>/g,"").replace(/>([^\S\r\n]*[\r\n]\s*)<")}(function(e){const t="",n="",r=e.indexOf(t);if(r<0)return e;const s=e.indexOf(n,r+t.length);return e.substring(0,r+t.length)+(s>=0?e.substring(s):"")}(e=(e=e.replace(/

    [

    ]

    -->

    + // starting content --> after `modifySelection` --> after `deleteContent`. + const doNotResetEntireContent = selection.isCollapsed; + // Try to extend the selection in the specified direction. + if (selection.isCollapsed) { + model.modifySelection(selection, { + direction: this.direction, + unit: options.unit, + treatEmojiAsSingleUnit: true + }); + } + // Check if deleting in an empty editor. See #61. + if (this._shouldEntireContentBeReplacedWithParagraph(sequence)) { + this._replaceEntireContentWithParagraph(writer); + return; + } + // Check if deleting in the first empty block. + // See https://github.com/ckeditor/ckeditor5/issues/8137. + if (this._shouldReplaceFirstBlockWithParagraph(selection, sequence)) { + this.editor.execute('paragraph', { selection }); + return; + } + // If selection is still collapsed, then there's nothing to delete. + if (selection.isCollapsed) { + return; + } + let changeCount = 0; + selection.getFirstRange().getMinimalFlatRanges().forEach(range => { + changeCount += count(range.getWalker({ singleCharacters: true, ignoreElementEnd: true, shallow: true })); + }); + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( '%c[DeleteCommand]%c Delete content', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // `[${ selection.getFirstPosition()!.path }]-[${ selection.getLastPosition()!.path }]`, options + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + model.deleteContent(selection, { + doNotResetEntireContent, + direction: this.direction + }); + this._buffer.input(changeCount); + writer.setSelection(selection); + this._buffer.unlock(); + }); + } + /** + * If the user keeps Backspace or Delete key pressed, the content of the current + * editable will be cleared. However, this will not yet lead to resetting the remaining block to a paragraph + * (which happens e.g. when the user does Ctrl + A, Backspace). + * + * But, if the user pressed the key in an empty editable for the first time, + * we want to replace the entire content with a paragraph if: + * + * * the current limit element is empty, + * * the paragraph is allowed in the limit element, + * * the limit doesn't already have a paragraph inside. + * + * See https://github.com/ckeditor/ckeditor5-typing/issues/61. + * + * @param sequence A number describing which subsequent delete event it is without the key being released. + */ + _shouldEntireContentBeReplacedWithParagraph(sequence) { + // Does nothing if user pressed and held the "Backspace" or "Delete" key. + if (sequence > 1) { + return false; + } + const model = this.editor.model; + const doc = model.document; + const selection = doc.selection; + const limitElement = model.schema.getLimitElement(selection); + // If a collapsed selection contains the whole content it means that the content is empty + // (from the user perspective). + const limitElementIsEmpty = selection.isCollapsed && selection.containsEntireContent(limitElement); + if (!limitElementIsEmpty) { + return false; + } + if (!model.schema.checkChild(limitElement, 'paragraph')) { + return false; + } + const limitElementFirstChild = limitElement.getChild(0); + // Does nothing if the limit element already contains only a paragraph. + // We ignore the case when paragraph might have some inline elements (

    []

    ) + // because we don't support such cases yet and it's unclear whether inlineWidget shouldn't be a limit itself. + if (limitElementFirstChild && limitElementFirstChild.is('element', 'paragraph')) { + return false; + } + return true; + } + /** + * The entire content is replaced with the paragraph. Selection is moved inside the paragraph. + * + * @param writer The model writer. + */ + _replaceEntireContentWithParagraph(writer) { + const model = this.editor.model; + const doc = model.document; + const selection = doc.selection; + const limitElement = model.schema.getLimitElement(selection); + const paragraph = writer.createElement('paragraph'); + writer.remove(writer.createRangeIn(limitElement)); + writer.insert(paragraph, limitElement); + writer.setSelection(paragraph, 0); + } + /** + * Checks if the selection is inside an empty element that is the first child of the limit element + * and should be replaced with a paragraph. + * + * @param selection The selection. + * @param sequence A number describing which subsequent delete event it is without the key being released. + */ + _shouldReplaceFirstBlockWithParagraph(selection, sequence) { + const model = this.editor.model; + // Does nothing if user pressed and held the "Backspace" key or it was a "Delete" button. + if (sequence > 1 || this.direction != 'backward') { + return false; + } + if (!selection.isCollapsed) { + return false; + } + const position = selection.getFirstPosition(); + const limitElement = model.schema.getLimitElement(position); + const limitElementFirstChild = limitElement.getChild(0); + // Only elements that are direct children of the limit element can be replaced. + // Unwrapping from a block quote should be handled in a dedicated feature. + if (position.parent != limitElementFirstChild) { + return false; + } + // A block should be replaced only if it was empty. + if (!selection.containsEntireContent(limitElementFirstChild)) { + return false; + } + // Replace with a paragraph only if it's allowed there. + if (!model.schema.checkChild(limitElement, 'paragraph')) { + return false; + } + // Does nothing if the limit element already contains only a paragraph. + if (limitElementFirstChild.name == 'paragraph') { + return false; + } + return true; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.d.ts new file mode 100644 index 0000000..a407ab6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.d.ts @@ -0,0 +1,55 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { DomEventData, Observer, type BubblingEvent, type ViewDocumentSelection, type ViewSelection, type EditingView } from '@ckeditor/ckeditor5-engine'; +/** + * Delete observer introduces the {@link module:engine/view/document~Document#event:delete} event. + */ +export default class DeleteObserver extends Observer { + /** + * @inheritDoc + */ + constructor(view: EditingView); + /** + * @inheritDoc + */ + observe(): void; + /** + * @inheritDoc + */ + stopObserving(): void; +} +/** + * Event fired when the user tries to delete content (e.g. presses Delete or Backspace). + * + * Note: This event is fired by the {@link module:typing/deleteobserver~DeleteObserver delete observer} + * (usually registered by the {@link module:typing/delete~Delete delete feature}). + * + * @eventName module:engine/view/document~Document#delete + * @param data The event data. + */ +export type ViewDocumentDeleteEvent = BubblingEvent<{ + name: 'delete'; + args: [data: DeleteEventData]; +}>; +export interface DeleteEventData extends DomEventData { + /** + * The direction in which the deletion should happen. + */ + direction: 'backward' | 'forward'; + /** + * The "amount" of content that should be deleted. + */ + unit: 'selection' | 'codePoint' | 'character' | 'word'; + /** + * A number describing which subsequent delete event it is without the key being released. + * If it's 2 or more it means that the key was pressed and hold. + */ + sequence: number; + /** + * View selection which content should be removed. If not set, + * current selection should be used. + */ + selectionToRemove?: ViewSelection | ViewDocumentSelection; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.js b/node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.js new file mode 100644 index 0000000..ad9d88e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/deleteobserver.js @@ -0,0 +1,261 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/deleteobserver + */ +import { env, keyCodes, isInsideCombinedSymbol, isInsideEmojiSequence, isInsideSurrogatePair } from '@ckeditor/ckeditor5-utils'; +import { BubblingEventInfo, DomEventData, Observer } from '@ckeditor/ckeditor5-engine'; +const DELETE_CHARACTER = 'character'; +const DELETE_WORD = 'word'; +const DELETE_CODE_POINT = 'codePoint'; +const DELETE_SELECTION = 'selection'; +const DELETE_BACKWARD = 'backward'; +const DELETE_FORWARD = 'forward'; +const DELETE_EVENT_TYPES = { + // --------------------------------------- Backward delete types ----------------------------------------------------- + // This happens in Safari on Mac when some content is selected and Ctrl + K is pressed. + deleteContent: { + unit: DELETE_SELECTION, + // According to the Input Events Level 2 spec, this delete type has no direction + // but to keep things simple, let's default to backward. + direction: DELETE_BACKWARD + }, + // Chrome and Safari on Mac: Backspace or Ctrl + H + deleteContentBackward: { + // This kind of deletions must be done on the code point-level instead of target range provided by the DOM beforeinput event. + // Take for instance "👨‍👩‍👧‍👧", it equals: + // + // * [ "👨", "ZERO WIDTH JOINER", "👩", "ZERO WIDTH JOINER", "👧", "ZERO WIDTH JOINER", "👧" ] + // * or simply "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}" + // + // The range provided by the browser would cause the entire multi-byte grapheme to disappear while the user + // intention when deleting backwards ("👨‍👩‍👧‍👧[]", then backspace) is gradual "decomposition" (first to "👨‍👩‍👧‍[]", + // then to "👨‍👩‍[]", etc.). + // + // * "👨‍👩‍👧‍👧[]" + backward delete (by code point) -> results in "👨‍👩‍👧[]", removed the last "👧" 👍 + // * "👨‍👩‍👧‍👧[]" + backward delete (by character) -> results in "[]", removed the whole grapheme 👎 + // + // Deleting by code-point is simply a better UX. See "deleteContentForward" to learn more. + unit: DELETE_CODE_POINT, + direction: DELETE_BACKWARD + }, + // On Mac: Option + Backspace. + // On iOS: Hold the backspace for a while and the whole words will start to disappear. + deleteWordBackward: { + unit: DELETE_WORD, + direction: DELETE_BACKWARD + }, + // Safari on Mac: Cmd + Backspace + deleteHardLineBackward: { + unit: DELETE_SELECTION, + direction: DELETE_BACKWARD + }, + // Chrome on Mac: Cmd + Backspace. + deleteSoftLineBackward: { + unit: DELETE_SELECTION, + direction: DELETE_BACKWARD + }, + // --------------------------------------- Forward delete types ----------------------------------------------------- + // Chrome on Mac: Fn + Backspace or Ctrl + D + // Safari on Mac: Ctrl + K or Ctrl + D + deleteContentForward: { + // Unlike backward delete, this delete must be performed by character instead of by code point, which + // provides the best UX for working with accented letters. + // Take, for example "b̂" ("\u0062\u0302", or [ "LATIN SMALL LETTER B", "COMBINING CIRCUMFLEX ACCENT" ]): + // + // * "b̂[]" + backward delete (by code point) -> results in "b[]", removed the combining mark 👍 + // * "[]b̂" + forward delete (by code point) -> results in "[]^", a bare combining mark does that not make sense when alone 👎 + // * "[]b̂" + forward delete (by character) -> results in "[]", removed both "b" and the combining mark 👍 + // + // See: "deleteContentBackward" to learn more. + unit: DELETE_CHARACTER, + direction: DELETE_FORWARD + }, + // On Mac: Fn + Option + Backspace. + deleteWordForward: { + unit: DELETE_WORD, + direction: DELETE_FORWARD + }, + // Chrome on Mac: Ctrl + K (you have to disable the Link plugin first, though, because it uses the same keystroke) + // This is weird that it does not work in Safari on Mac despite being listed in the official shortcuts listing + // on Apple's webpage. + deleteHardLineForward: { + unit: DELETE_SELECTION, + direction: DELETE_FORWARD + }, + // At this moment there is no known way to trigger this event type but let's keep it for the symmetry with + // deleteSoftLineBackward. + deleteSoftLineForward: { + unit: DELETE_SELECTION, + direction: DELETE_FORWARD + } +}; +/** + * Delete observer introduces the {@link module:engine/view/document~Document#event:delete} event. + */ +export default class DeleteObserver extends Observer { + /** + * @inheritDoc + */ + constructor(view) { + super(view); + const document = view.document; + // It matters how many subsequent deletions were made, e.g. when the backspace key was pressed and held + // by the user for some time. For instance, if such scenario ocurred and the heading the selection was + // anchored to was the only content of the editor, it will not be converted into a paragraph (the user + // wanted to clean it up, not remove it, it's about UX). Check out the DeleteCommand implementation to learn more. + // + // Fun fact: Safari on Mac won't fire beforeinput for backspace in an empty heading (only content). + let sequence = 0; + document.on('keydown', () => { + sequence++; + }); + document.on('keyup', () => { + sequence = 0; + }); + document.on('beforeinput', (evt, data) => { + if (!this.isEnabled) { + return; + } + const { targetRanges, domEvent, inputType } = data; + const deleteEventSpec = DELETE_EVENT_TYPES[inputType]; + if (!deleteEventSpec) { + return; + } + const deleteData = { + direction: deleteEventSpec.direction, + unit: deleteEventSpec.unit, + sequence + }; + if (deleteData.unit == DELETE_SELECTION) { + deleteData.selectionToRemove = view.createSelection(targetRanges[0]); + } + // The default deletion unit for deleteContentBackward is a single code point + // but if the browser provides a wider target range then we should use it. + if (inputType === 'deleteContentBackward') { + // On Android, deleteContentBackward has sequence 1 by default. + if (env.isAndroid) { + deleteData.sequence = 1; + } + // The beforeInput event wants more than a single character to be removed. + if (shouldUseTargetRanges(targetRanges)) { + deleteData.unit = DELETE_SELECTION; + deleteData.selectionToRemove = view.createSelection(targetRanges); + } + } + const eventInfo = new BubblingEventInfo(document, 'delete', targetRanges[0]); + document.fire(eventInfo, new DomEventData(view, domEvent, deleteData)); + // Stop the beforeinput event if `delete` event was stopped. + // https://github.com/ckeditor/ckeditor5/issues/753 + if (eventInfo.stop.called) { + evt.stop(); + } + }); + // TODO: to be removed when https://bugs.chromium.org/p/chromium/issues/detail?id=1365311 is solved. + if (env.isBlink) { + enableChromeWorkaround(this); + } + } + /** + * @inheritDoc + */ + observe() { } + /** + * @inheritDoc + */ + stopObserving() { } +} +/** + * Enables workaround for the issue https://github.com/ckeditor/ckeditor5/issues/11904. + */ +function enableChromeWorkaround(observer) { + const view = observer.view; + const document = view.document; + let pressedKeyCode = null; + let beforeInputReceived = false; + document.on('keydown', (evt, { keyCode }) => { + pressedKeyCode = keyCode; + beforeInputReceived = false; + }); + document.on('keyup', (evt, { keyCode, domEvent }) => { + const selection = document.selection; + const shouldFireDeleteEvent = observer.isEnabled && + keyCode == pressedKeyCode && + isDeleteKeyCode(keyCode) && + !selection.isCollapsed && + !beforeInputReceived; + pressedKeyCode = null; + if (shouldFireDeleteEvent) { + const targetRange = selection.getFirstRange(); + const eventInfo = new BubblingEventInfo(document, 'delete', targetRange); + const deleteData = { + unit: DELETE_SELECTION, + direction: getDeleteDirection(keyCode), + selectionToRemove: selection + }; + document.fire(eventInfo, new DomEventData(view, domEvent, deleteData)); + } + }); + document.on('beforeinput', (evt, { inputType }) => { + const deleteEventSpec = DELETE_EVENT_TYPES[inputType]; + const isMatchingBeforeInput = isDeleteKeyCode(pressedKeyCode) && + deleteEventSpec && + deleteEventSpec.direction == getDeleteDirection(pressedKeyCode); + if (isMatchingBeforeInput) { + beforeInputReceived = true; + } + }, { priority: 'high' }); + document.on('beforeinput', (evt, { inputType, data }) => { + const shouldIgnoreBeforeInput = pressedKeyCode == keyCodes.delete && + inputType == 'insertText' && + data == '\x7f'; // Delete character :P + if (shouldIgnoreBeforeInput) { + evt.stop(); + } + }, { priority: 'high' }); + function isDeleteKeyCode(keyCode) { + return keyCode == keyCodes.backspace || keyCode == keyCodes.delete; + } + function getDeleteDirection(keyCode) { + return keyCode == keyCodes.backspace ? DELETE_BACKWARD : DELETE_FORWARD; + } +} +/** + * Verifies whether the given target ranges cover more than a single character and should be used instead of a single code-point deletion. + */ +function shouldUseTargetRanges(targetRanges) { + // The collapsed target range could happen for example while deleting inside an inline filler + // (it's mapped to collapsed position before an inline filler). + if (targetRanges.length != 1 || targetRanges[0].isCollapsed) { + return false; + } + const walker = targetRanges[0].getWalker({ + direction: 'backward', + singleCharacters: true, + ignoreElementEnd: true + }); + let count = 0; + for (const { nextPosition } of walker) { + // There is some element in the range so count it as a single character. + if (!nextPosition.parent.is('$text')) { + count++; + } + else { + const data = nextPosition.parent.data; + const offset = nextPosition.offset; + // Count combined symbols and emoji sequences as a single character. + if (isInsideSurrogatePair(data, offset) || + isInsideCombinedSymbol(data, offset) || + isInsideEmojiSequence(data, offset)) { + continue; + } + count++; + } + if (count > 1) { + return true; + } + } + return false; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/index.d.ts new file mode 100644 index 0000000..b2693f0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/index.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing + */ +export { default as Typing } from './typing.js'; +export { default as Input } from './input.js'; +export { default as Delete } from './delete.js'; +export { default as TextWatcher } from './textwatcher.js'; +export { default as TwoStepCaretMovement } from './twostepcaretmovement.js'; +export { default as TextTransformation } from './texttransformation.js'; +export { default as inlineHighlight } from './utils/inlinehighlight.js'; +export { default as findAttributeRange, findAttributeRangeBound } from './utils/findattributerange.js'; +export { default as getLastTextLine, type LastTextLineData } from './utils/getlasttextline.js'; +export { default as InsertTextCommand, type InsertTextCommandExecuteEvent } from './inserttextcommand.js'; +export type { default as DeleteCommand } from './deletecommand.js'; +export type { TypingConfig } from './typingconfig.js'; +export type { ViewDocumentDeleteEvent } from './deleteobserver.js'; +export type { ViewDocumentInsertTextEvent, InsertTextEventData } from './inserttextobserver.js'; +export type { TextWatcherMatchedEvent } from './textwatcher.js'; +export type { TextWatcherMatchedDataEvent } from './textwatcher.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/index.js b/node_modules/@ckeditor/ckeditor5-typing/src/index.js new file mode 100644 index 0000000..aedac40 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/index.js @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing + */ +export { default as Typing } from './typing.js'; +export { default as Input } from './input.js'; +export { default as Delete } from './delete.js'; +export { default as TextWatcher } from './textwatcher.js'; +export { default as TwoStepCaretMovement } from './twostepcaretmovement.js'; +export { default as TextTransformation } from './texttransformation.js'; +export { default as inlineHighlight } from './utils/inlinehighlight.js'; +export { default as findAttributeRange, findAttributeRangeBound } from './utils/findattributerange.js'; +export { default as getLastTextLine } from './utils/getlasttextline.js'; +export { default as InsertTextCommand } from './inserttextcommand.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/input.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/input.d.ts new file mode 100644 index 0000000..ec65cba --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/input.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/input + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +/** + * Handles text input coming from the keyboard or other input methods. + */ +export default class Input extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "Input"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/input.js b/node_modules/@ckeditor/ckeditor5-typing/src/input.js new file mode 100644 index 0000000..20c2aca --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/input.js @@ -0,0 +1,141 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/input + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import { env } from '@ckeditor/ckeditor5-utils'; +import InsertTextCommand from './inserttextcommand.js'; +import InsertTextObserver from './inserttextobserver.js'; +/** + * Handles text input coming from the keyboard or other input methods. + */ +export default class Input extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'Input'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const model = editor.model; + const view = editor.editing.view; + const modelSelection = model.document.selection; + view.addObserver(InsertTextObserver); + // TODO The above default configuration value should be defined using editor.config.define() once it's fixed. + const insertTextCommand = new InsertTextCommand(editor, editor.config.get('typing.undoStep') || 20); + // Register `insertText` command and add `input` command as an alias for backward compatibility. + editor.commands.add('insertText', insertTextCommand); + editor.commands.add('input', insertTextCommand); + this.listenTo(view.document, 'insertText', (evt, data) => { + // Rendering is disabled while composing so prevent events that will be rendered by the engine + // and should not be applied by the browser. + if (!view.document.isComposing) { + data.preventDefault(); + } + const { text, selection: viewSelection, resultRange: viewResultRange } = data; + // If view selection was specified, translate it to model selection. + const modelRanges = Array.from(viewSelection.getRanges()).map(viewRange => { + return editor.editing.mapper.toModelRange(viewRange); + }); + let insertText = text; + // Typing in English on Android is firing composition events for the whole typed word. + // We need to check the target range text to only apply the difference. + if (env.isAndroid) { + const selectedText = Array.from(modelRanges[0].getItems()).reduce((rangeText, node) => { + return rangeText + (node.is('$textProxy') ? node.data : ''); + }, ''); + if (selectedText) { + if (selectedText.length <= insertText.length) { + if (insertText.startsWith(selectedText)) { + insertText = insertText.substring(selectedText.length); + modelRanges[0].start = modelRanges[0].start.getShiftedBy(selectedText.length); + } + } + else { + if (selectedText.startsWith(insertText)) { + // TODO this should be mapped as delete? + modelRanges[0].start = modelRanges[0].start.getShiftedBy(insertText.length); + insertText = ''; + } + } + } + } + const insertTextCommandData = { + text: insertText, + selection: model.createSelection(modelRanges) + }; + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( '%c[Input]%c Execute insertText:', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // insertText, + // @if CK_DEBUG_TYPING // `[${ modelRanges[ 0 ].start.path }]-[${ modelRanges[ 0 ].end.path }]` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + if (viewResultRange) { + insertTextCommandData.resultRange = editor.editing.mapper.toModelRange(viewResultRange); + } + editor.execute('insertText', insertTextCommandData); + view.scrollToTheSelection(); + }); + if (env.isAndroid) { + // On Android with English keyboard, the composition starts just by putting caret + // at the word end or by selecting a table column. This is not a real composition started. + // Trigger delete content on first composition key pressed. + this.listenTo(view.document, 'keydown', (evt, data) => { + if (modelSelection.isCollapsed || data.keyCode != 229 || !view.document.isComposing) { + return; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // const firstPositionPath = modelSelection.getFirstPosition()!.path; + // @if CK_DEBUG_TYPING // const lastPositionPath = modelSelection.getLastPosition()!.path; + // @if CK_DEBUG_TYPING // console.log( '%c[Input]%c KeyDown 229 -> model.deleteContent()', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // `[${ firstPositionPath }]-[${ lastPositionPath }]` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + deleteSelectionContent(model, insertTextCommand); + }); + } + else { + // Note: The priority must precede the CompositionObserver handler to call it before + // the renderer is blocked, because we want to render this change. + this.listenTo(view.document, 'compositionstart', () => { + if (modelSelection.isCollapsed) { + return; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // const firstPositionPath = modelSelection.getFirstPosition()!.path; + // @if CK_DEBUG_TYPING // const lastPositionPath = modelSelection.getLastPosition()!.path; + // @if CK_DEBUG_TYPING // console.log( '%c[Input]%c Composition start -> model.deleteContent()', + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '', + // @if CK_DEBUG_TYPING // `[${ firstPositionPath }]-[${ lastPositionPath }]` + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + deleteSelectionContent(model, insertTextCommand); + }); + } + } +} +function deleteSelectionContent(model, insertTextCommand) { + // By relying on the state of the input command we allow disabling the entire input easily + // by just disabling the input command. We could’ve used here the delete command but that + // would mean requiring the delete feature which would block loading one without the other. + // We could also check the editor.isReadOnly property, but that wouldn't allow to block + // the input without blocking other features. + if (!insertTextCommand.isEnabled) { + return; + } + const buffer = insertTextCommand.buffer; + buffer.lock(); + model.enqueueChange(buffer.batch, () => { + model.deleteContent(model.document.selection); + }); + buffer.unlock(); +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.d.ts new file mode 100644 index 0000000..5e1b07a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.d.ts @@ -0,0 +1,76 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/inserttextcommand + */ +import { Command, type Editor } from '@ckeditor/ckeditor5-core'; +import ChangeBuffer from './utils/changebuffer.js'; +import type { DocumentSelection, Range, Selection } from '@ckeditor/ckeditor5-engine'; +/** + * The insert text command. Used by the {@link module:typing/input~Input input feature} to handle typing. + */ +export default class InsertTextCommand extends Command { + /** + * Typing's change buffer used to group subsequent changes into batches. + */ + private readonly _buffer; + /** + * Creates an instance of the command. + * + * @param undoStepSize The maximum number of atomic changes + * which can be contained in one batch in the command buffer. + */ + constructor(editor: Editor, undoStepSize: number); + /** + * The current change buffer. + */ + get buffer(): ChangeBuffer; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Executes the input command. It replaces the content within the given range with the given text. + * Replacing is a two step process, first the content within the range is removed and then the new text is inserted + * at the beginning of the range (which after the removal is a collapsed range). + * + * @fires execute + * @param options The command options. + */ + execute(options?: InsertTextCommandOptions): void; +} +/** + * Interface with parameters for executing InsertTextCommand. + * + * Both `range` and `selection` parameters are used for defining selection but should not be used together. + * If both are defined, only `selection` will be considered. + */ +export interface InsertTextCommandOptions { + /** + * The text to be inserted. + */ + text?: string; + /** + * The selection in which the text is inserted. + * Inserting a text into a selection deletes the current content within selection ranges. If the selection is not specified, + * the current selection in the model will be used instead. + */ + selection?: Selection | DocumentSelection; + /** + * The range in which the text is inserted. Defaults to the first range in the current selection. + */ + range?: Range; + /** + * The range where the selection should be placed after the insertion. + * If not specified, the selection will be placed right after the inserted text. + */ + resultRange?: Range; +} +export interface InsertTextCommandExecuteEvent { + name: 'execute'; + args: [ + data: [options: InsertTextCommandOptions] + ]; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.js b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.js new file mode 100644 index 0000000..5a4e523 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextcommand.js @@ -0,0 +1,83 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/inserttextcommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +import ChangeBuffer from './utils/changebuffer.js'; +/** + * The insert text command. Used by the {@link module:typing/input~Input input feature} to handle typing. + */ +export default class InsertTextCommand extends Command { + /** + * Creates an instance of the command. + * + * @param undoStepSize The maximum number of atomic changes + * which can be contained in one batch in the command buffer. + */ + constructor(editor, undoStepSize) { + super(editor); + this._buffer = new ChangeBuffer(editor.model, undoStepSize); + // Since this command may execute on different selectable than selection, it should be checked directly in execute block. + this._isEnabledBasedOnSelection = false; + } + /** + * The current change buffer. + */ + get buffer() { + return this._buffer; + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this._buffer.destroy(); + } + /** + * Executes the input command. It replaces the content within the given range with the given text. + * Replacing is a two step process, first the content within the range is removed and then the new text is inserted + * at the beginning of the range (which after the removal is a collapsed range). + * + * @fires execute + * @param options The command options. + */ + execute(options = {}) { + const model = this.editor.model; + const doc = model.document; + const text = options.text || ''; + const textInsertions = text.length; + let selection = doc.selection; + if (options.selection) { + selection = options.selection; + } + else if (options.range) { + selection = model.createSelection(options.range); + } + // Stop executing if selectable is in non-editable place. + if (!model.canEditAt(selection)) { + return; + } + const resultRange = options.resultRange; + model.enqueueChange(this._buffer.batch, writer => { + this._buffer.lock(); + // Store selection attributes before deleting old content to preserve formatting and link. + // This unifies the behavior between DocumentSelection and Selection provided as input option. + const selectionAttributes = Array.from(doc.selection.getAttributes()); + model.deleteContent(selection); + if (text) { + model.insertContent(writer.createText(text, selectionAttributes), selection); + } + if (resultRange) { + writer.setSelection(resultRange); + } + else if (!selection.is('documentSelection')) { + writer.setSelection(selection); + } + this._buffer.unlock(); + this._buffer.input(textInsertions); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.d.ts new file mode 100644 index 0000000..f0682cf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.d.ts @@ -0,0 +1,59 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { DomEventData, Observer, FocusObserver, type EditingView, type ViewDocumentSelection, type ViewRange, type ViewSelection } from '@ckeditor/ckeditor5-engine'; +/** + * Text insertion observer introduces the {@link module:engine/view/document~Document#event:insertText} event. + */ +export default class InsertTextObserver extends Observer { + /** + * Instance of the focus observer. Insert text observer calls + * {@link module:engine/view/observer/focusobserver~FocusObserver#flush} to mark the latest focus change as complete. + */ + readonly focusObserver: FocusObserver; + /** + * @inheritDoc + */ + constructor(view: EditingView); + /** + * @inheritDoc + */ + observe(): void; + /** + * @inheritDoc + */ + stopObserving(): void; +} +/** + * Event fired when the user types text, for instance presses A or ? in the + * editing view document. + * + * **Note**: This event will **not** fire for keystrokes such as Delete or Enter. + * They have dedicated events, see {@link module:engine/view/document~Document#event:delete} and + * {@link module:engine/view/document~Document#event:enter} to learn more. + * + * **Note**: This event is fired by the {@link module:typing/inserttextobserver~InsertTextObserver input feature}. + * + * @eventName module:engine/view/document~Document#insertText + * @param data The event data. + */ +export type ViewDocumentInsertTextEvent = { + name: 'insertText'; + args: [data: InsertTextEventData]; +}; +export interface InsertTextEventData extends DomEventData { + /** + * The text to be inserted. + */ + text: string; + /** + * The selection into which the text should be inserted. + * If not specified, the insertion should occur at the current view selection. + */ + selection: ViewSelection | ViewDocumentSelection; + /** + * The range that view selection should be set to after insertion. + */ + resultRange?: ViewRange; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.js b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.js new file mode 100644 index 0000000..e0f5eff --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/inserttextobserver.js @@ -0,0 +1,108 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/inserttextobserver + */ +import { env, EventInfo } from '@ckeditor/ckeditor5-utils'; +import { DomEventData, Observer, FocusObserver } from '@ckeditor/ckeditor5-engine'; +const TYPING_INPUT_TYPES = [ + // For collapsed range: + // - This one is a regular typing (all browsers, all systems). + // - This one is used by Chrome when typing accented letter – 2nd step when the user selects the accent (Mac). + // For non-collapsed range: + // - This one is used by Chrome when typing accented letter – when the selection box first appears (Mac). + // - This one is used by Safari when accepting spell check suggestions from the context menu (Mac). + 'insertText', + // This one is used by Safari when typing accented letter (Mac). + // This one is used by Safari when accepting spell check suggestions from the autocorrection pop-up (Mac). + 'insertReplacementText' +]; +/** + * Text insertion observer introduces the {@link module:engine/view/document~Document#event:insertText} event. + */ +export default class InsertTextObserver extends Observer { + /** + * @inheritDoc + */ + constructor(view) { + super(view); + this.focusObserver = view.getObserver(FocusObserver); + // On Android composition events should immediately be applied to the model. Rendering is not disabled. + // On non-Android the model is updated only on composition end. + // On Android we can't rely on composition start/end to update model. + if (env.isAndroid) { + TYPING_INPUT_TYPES.push('insertCompositionText'); + } + const viewDocument = view.document; + viewDocument.on('beforeinput', (evt, data) => { + if (!this.isEnabled) { + return; + } + const { data: text, targetRanges, inputType, domEvent } = data; + if (!TYPING_INPUT_TYPES.includes(inputType)) { + return; + } + // Mark the latest focus change as complete (we are typing in editable after the focus + // so the selection is in the focused element). + this.focusObserver.flush(); + const eventInfo = new EventInfo(viewDocument, 'insertText'); + viewDocument.fire(eventInfo, new DomEventData(view, domEvent, { + text, + selection: view.createSelection(targetRanges) + })); + // Stop the beforeinput event if `delete` event was stopped. + // https://github.com/ckeditor/ckeditor5/issues/753 + if (eventInfo.stop.called) { + evt.stop(); + } + }); + // Note: The priority must be lower than the CompositionObserver handler to call it after the renderer is unblocked. + viewDocument.on('compositionend', (evt, { data, domEvent }) => { + // On Android composition events are immediately applied to the model. + // On non-Android the model is updated only on composition end. + // On Android we can't rely on composition start/end to update model. + if (!this.isEnabled || env.isAndroid) { + return; + } + // In case of aborted composition. + if (!data) { + return; + } + // @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) { + // @if CK_DEBUG_TYPING // console.log( `%c[InsertTextObserver]%c Fire insertText event, text: ${ JSON.stringify( data ) }`, + // @if CK_DEBUG_TYPING // 'font-weight: bold; color: green;', '' + // @if CK_DEBUG_TYPING // ); + // @if CK_DEBUG_TYPING // } + // How do we know where to insert the composed text? + // The selection observer is blocked and the view is not updated with the composition changes. + // There were three options: + // - Store the selection on `compositionstart` and use it now. This wouldn't work in RTC + // where the view would change and the stored selection might get incorrect. + // We'd need to fallback to the current view selection anyway. + // - Use the current view selection. This is a bit weird and non-intuitive because + // this isn't necessarily the selection on which the user started composing. + // We cannot even know whether it's still collapsed (there might be some weird + // editor feature that changed it in unpredictable ways for us). But it's by far + // the simplest solution and should be stable (the selection is definitely correct) + // and probably mostly predictable (features usually don't modify the selection + // unless called explicitly by the user). + // - Try to follow it from the `beforeinput` events. This would be really complex as each + // `beforeinput` would come with just the range it's changing and we'd need to calculate that. + // We decided to go with the 2nd option for its simplicity and stability. + viewDocument.fire('insertText', new DomEventData(view, domEvent, { + text: data, + selection: viewDocument.selection + })); + }, { priority: 'lowest' }); + } + /** + * @inheritDoc + */ + observe() { } + /** + * @inheritDoc + */ + stopObserving() { } +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.d.ts new file mode 100644 index 0000000..0f09f7b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.d.ts @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/texttransformation + */ +import { Plugin, type Editor } from '@ckeditor/ckeditor5-core'; +/** + * The text transformation plugin. + */ +export default class TextTransformation extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly ["Delete", "Input"]; + /** + * @inheritDoc + */ + static get pluginName(): "TextTransformation"; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * @inheritDoc + */ + init(): void; + /** + * Create new TextWatcher listening to the editor for typing and selection events. + */ + private _enableTransformationWatchers; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.js b/node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.js new file mode 100644 index 0000000..3eef781 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/texttransformation.js @@ -0,0 +1,228 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/texttransformation + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import TextWatcher from './textwatcher.js'; +import { escapeRegExp } from 'lodash-es'; +// All named transformations. +const TRANSFORMATIONS = { + // Common symbols: + copyright: { from: '(c)', to: '©' }, + registeredTrademark: { from: '(r)', to: '®' }, + trademark: { from: '(tm)', to: '™' }, + // Mathematical: + oneHalf: { from: /(^|[^/a-z0-9])(1\/2)([^/a-z0-9])$/i, to: [null, '½', null] }, + oneThird: { from: /(^|[^/a-z0-9])(1\/3)([^/a-z0-9])$/i, to: [null, '⅓', null] }, + twoThirds: { from: /(^|[^/a-z0-9])(2\/3)([^/a-z0-9])$/i, to: [null, '⅔', null] }, + oneForth: { from: /(^|[^/a-z0-9])(1\/4)([^/a-z0-9])$/i, to: [null, '¼', null] }, + threeQuarters: { from: /(^|[^/a-z0-9])(3\/4)([^/a-z0-9])$/i, to: [null, '¾', null] }, + lessThanOrEqual: { from: '<=', to: '≤' }, + greaterThanOrEqual: { from: '>=', to: '≥' }, + notEqual: { from: '!=', to: '≠' }, + arrowLeft: { from: '<-', to: '←' }, + arrowRight: { from: '->', to: '→' }, + // Typography: + horizontalEllipsis: { from: '...', to: '…' }, + enDash: { from: /(^| )(--)( )$/, to: [null, '–', null] }, + emDash: { from: /(^| )(---)( )$/, to: [null, '—', null] }, + // Quotations: + // English, US + quotesPrimary: { from: buildQuotesRegExp('"'), to: [null, '“', null, '”'] }, + quotesSecondary: { from: buildQuotesRegExp('\''), to: [null, '‘', null, '’'] }, + // English, UK + quotesPrimaryEnGb: { from: buildQuotesRegExp('\''), to: [null, '‘', null, '’'] }, + quotesSecondaryEnGb: { from: buildQuotesRegExp('"'), to: [null, '“', null, '”'] }, + // Polish + quotesPrimaryPl: { from: buildQuotesRegExp('"'), to: [null, '„', null, '”'] }, + quotesSecondaryPl: { from: buildQuotesRegExp('\''), to: [null, '‚', null, '’'] } +}; +// Transformation groups. +const TRANSFORMATION_GROUPS = { + symbols: ['copyright', 'registeredTrademark', 'trademark'], + mathematical: [ + 'oneHalf', 'oneThird', 'twoThirds', 'oneForth', 'threeQuarters', + 'lessThanOrEqual', 'greaterThanOrEqual', 'notEqual', + 'arrowLeft', 'arrowRight' + ], + typography: ['horizontalEllipsis', 'enDash', 'emDash'], + quotes: ['quotesPrimary', 'quotesSecondary'] +}; +// A set of default transformations provided by the feature. +const DEFAULT_TRANSFORMATIONS = [ + 'symbols', + 'mathematical', + 'typography', + 'quotes' +]; +/** + * The text transformation plugin. + */ +export default class TextTransformation extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return ['Delete', 'Input']; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'TextTransformation'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + editor.config.define('typing', { + transformations: { + include: DEFAULT_TRANSFORMATIONS + } + }); + } + /** + * @inheritDoc + */ + init() { + const model = this.editor.model; + const modelSelection = model.document.selection; + modelSelection.on('change:range', () => { + // Disable plugin when selection is inside a code block. + this.isEnabled = !modelSelection.anchor.parent.is('element', 'codeBlock'); + }); + this._enableTransformationWatchers(); + } + /** + * Create new TextWatcher listening to the editor for typing and selection events. + */ + _enableTransformationWatchers() { + const editor = this.editor; + const model = editor.model; + const deletePlugin = editor.plugins.get('Delete'); + const normalizedTransformations = normalizeTransformations(editor.config.get('typing.transformations')); + const testCallback = (text) => { + for (const normalizedTransformation of normalizedTransformations) { + const from = normalizedTransformation.from; + const match = from.test(text); + if (match) { + return { normalizedTransformation }; + } + } + }; + const watcher = new TextWatcher(editor.model, testCallback); + watcher.on('matched:data', (evt, data) => { + if (!data.batch.isTyping) { + return; + } + const { from, to } = data.normalizedTransformation; + const matches = from.exec(data.text); + const replaces = to(matches.slice(1)); + const matchedRange = data.range; + let changeIndex = matches.index; + model.enqueueChange(writer => { + for (let i = 1; i < matches.length; i++) { + const match = matches[i]; + const replaceWith = replaces[i - 1]; + if (replaceWith == null) { + changeIndex += match.length; + continue; + } + const replacePosition = matchedRange.start.getShiftedBy(changeIndex); + const replaceRange = model.createRange(replacePosition, replacePosition.getShiftedBy(match.length)); + const attributes = getTextAttributesAfterPosition(replacePosition); + model.insertContent(writer.createText(replaceWith, attributes), replaceRange); + changeIndex += replaceWith.length; + } + model.enqueueChange(() => { + deletePlugin.requestUndoOnBackspace(); + }); + }); + }); + watcher.bind('isEnabled').to(this); + } +} +/** + * Normalizes the configuration `from` parameter value. + * The normalized value for the `from` parameter is a RegExp instance. If the passed `from` is already a RegExp instance, + * it is returned unchanged. + */ +function normalizeFrom(from) { + if (typeof from == 'string') { + return new RegExp(`(${escapeRegExp(from)})$`); + } + // `from` is already a regular expression. + return from; +} +/** + * Normalizes the configuration `to` parameter value. + * The normalized value for the `to` parameter is a function that takes an array and returns an array. See more in the + * configuration description. If the passed `to` is already a function, it is returned unchanged. + */ +function normalizeTo(to) { + if (typeof to == 'string') { + return () => [to]; + } + else if (to instanceof Array) { + return () => to; + } + // `to` is already a function. + return to; +} +/** + * For given `position` returns attributes for the text that is after that position. + * The text can be in the same text node as the position (`foo[]bar`) or in the next text node (`foo[]<$text bold="true">bar`). + */ +function getTextAttributesAfterPosition(position) { + const textNode = position.textNode ? position.textNode : position.nodeAfter; + return textNode.getAttributes(); +} +/** + * Returns a RegExp pattern string that detects a sentence inside a quote. + * + * @param quoteCharacter The character to create a pattern for. + */ +function buildQuotesRegExp(quoteCharacter) { + return new RegExp(`(^|\\s)(${quoteCharacter})([^${quoteCharacter}]*)(${quoteCharacter})$`); +} +/** + * Reads text transformation config and returns normalized array of transformations objects. + */ +function normalizeTransformations(config) { + const extra = config.extra || []; + const remove = config.remove || []; + const isNotRemoved = (transformation) => !remove.includes(transformation); + const configured = config.include.concat(extra).filter(isNotRemoved); + return expandGroupsAndRemoveDuplicates(configured) + .filter(isNotRemoved) // Filter out 'remove' transformations as they might be set in group. + .map(transformation => (typeof transformation == 'string' && TRANSFORMATIONS[transformation] ? TRANSFORMATIONS[transformation] : transformation)) + // Filter out transformations set as string that has not been found. + .filter((transformation) => typeof transformation === 'object') + .map(transformation => ({ + from: normalizeFrom(transformation.from), + to: normalizeTo(transformation.to) + })); +} +/** + * Reads definitions and expands named groups if needed to transformation names. + * This method also removes duplicated named transformations if any. + */ +function expandGroupsAndRemoveDuplicates(definitions) { + // Set is using to make sure that transformation names are not duplicated. + const definedTransformations = new Set(); + for (const transformationOrGroup of definitions) { + if (typeof transformationOrGroup == 'string' && TRANSFORMATION_GROUPS[transformationOrGroup]) { + for (const transformation of TRANSFORMATION_GROUPS[transformationOrGroup]) { + definedTransformations.add(transformation); + } + } + else { + definedTransformations.add(transformationOrGroup); + } + } + return Array.from(definedTransformations); +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.d.ts new file mode 100644 index 0000000..6ca1e30 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.d.ts @@ -0,0 +1,138 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Batch, Model, Range } from '@ckeditor/ckeditor5-engine'; +declare const TextWatcher_base: { + new (): import("@ckeditor/ckeditor5-utils").Observable; + prototype: import("@ckeditor/ckeditor5-utils").Observable; +}; +/** + * The text watcher feature. + * + * Fires the {@link module:typing/textwatcher~TextWatcher#event:matched:data `matched:data`}, + * {@link module:typing/textwatcher~TextWatcher#event:matched:selection `matched:selection`} and + * {@link module:typing/textwatcher~TextWatcher#event:unmatched `unmatched`} events on typing or selection changes. + */ +export default class TextWatcher extends TextWatcher_base { + /** + * The editor's model. + */ + readonly model: Model; + /** + * The function used to match the text. + * + * The test callback can return 3 values: + * + * * `false` if there is no match, + * * `true` if there is a match, + * * an object if there is a match and we want to pass some additional information to the {@link #event:matched:data} event. + */ + testCallback: (text: string) => unknown; + /** + * Whether there is a match currently. + */ + private _hasMatch; + /** + * Flag indicating whether the `TextWatcher` instance is enabled or disabled. + * A disabled TextWatcher will not evaluate text. + * + * To disable TextWatcher: + * + * ```ts + * const watcher = new TextWatcher( editor.model, testCallback ); + * + * // After this a testCallback will not be called. + * watcher.isEnabled = false; + * ``` + */ + isEnabled: boolean; + /** + * Creates a text watcher instance. + * + * @param testCallback See {@link module:typing/textwatcher~TextWatcher#testCallback}. + */ + constructor(model: Model, testCallback: (text: string) => unknown); + /** + * Flag indicating whether there is a match currently. + */ + get hasMatch(): boolean; + /** + * Starts listening to the editor for typing and selection events. + */ + private _startListening; + /** + * Checks the editor content for matched text. + * + * @fires matched:data + * @fires matched:selection + * @fires unmatched + * + * @param suffix A suffix used for generating the event name. + * @param data Data object for event. + */ + private _evaluateTextBeforeSelection; +} +export type TextWatcherMatchedEvent = Record> = { + name: 'matched' | 'matched:data' | 'matched:selection'; + args: [ + { + text: string; + range: Range; + batch?: Batch; + } & TCallbackResult + ]; +}; +/** + * Fired whenever the text watcher found a match for data changes. + * + * @eventName ~TextWatcher#matched:data + * @param data Event data. + * @param data.testResult The additional data returned from the {@link module:typing/textwatcher~TextWatcher#testCallback}. + */ +export type TextWatcherMatchedDataEvent> = { + name: 'matched:data'; + args: [data: TextWatcherMatchedDataEventData & TCallbackResult]; +}; +export interface TextWatcherMatchedDataEventData { + /** + * The full text before selection to which the regexp was applied. + */ + text: string; + /** + * The range representing the position of the `data.text`. + */ + range: Range; + batch: Batch; +} +/** + * Fired whenever the text watcher found a match for selection changes. + * + * @eventName ~TextWatcher#matched:selection + * @param data Event data. + * @param data.testResult The additional data returned from the {@link module:typing/textwatcher~TextWatcher#testCallback}. + */ +export type TextWatcherMatchedSelectionEvent> = { + name: 'matched:selection'; + args: [data: TextWatcherMatchedSelectionEventData & TCallbackResult]; +}; +export interface TextWatcherMatchedSelectionEventData { + /** + * The full text before selection. + */ + text: string; + /** + * The range representing the position of the `data.text`. + */ + range: Range; +} +/** + * Fired whenever the text does not match anymore. Fired only when the text watcher found a match. + * + * @eventName ~TextWatcher#unmatched + */ +export type TextWatcherUnmatchedEvent = { + name: 'unmatched'; + args: []; +}; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.js b/node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.js new file mode 100644 index 0000000..6dc2993 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/textwatcher.js @@ -0,0 +1,105 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/textwatcher + */ +import { ObservableMixin } from '@ckeditor/ckeditor5-utils'; +import getLastTextLine from './utils/getlasttextline.js'; +/** + * The text watcher feature. + * + * Fires the {@link module:typing/textwatcher~TextWatcher#event:matched:data `matched:data`}, + * {@link module:typing/textwatcher~TextWatcher#event:matched:selection `matched:selection`} and + * {@link module:typing/textwatcher~TextWatcher#event:unmatched `unmatched`} events on typing or selection changes. + */ +export default class TextWatcher extends ObservableMixin() { + /** + * Creates a text watcher instance. + * + * @param testCallback See {@link module:typing/textwatcher~TextWatcher#testCallback}. + */ + constructor(model, testCallback) { + super(); + this.model = model; + this.testCallback = testCallback; + this._hasMatch = false; + this.set('isEnabled', true); + // Toggle text watching on isEnabled state change. + this.on('change:isEnabled', () => { + if (this.isEnabled) { + this._startListening(); + } + else { + this.stopListening(model.document.selection); + this.stopListening(model.document); + } + }); + this._startListening(); + } + /** + * Flag indicating whether there is a match currently. + */ + get hasMatch() { + return this._hasMatch; + } + /** + * Starts listening to the editor for typing and selection events. + */ + _startListening() { + const model = this.model; + const document = model.document; + this.listenTo(document.selection, 'change:range', (evt, { directChange }) => { + // Indirect changes (i.e. when the user types or external changes are applied) are handled in the document's change event. + if (!directChange) { + return; + } + // Act only on collapsed selection. + if (!document.selection.isCollapsed) { + if (this.hasMatch) { + this.fire('unmatched'); + this._hasMatch = false; + } + return; + } + this._evaluateTextBeforeSelection('selection'); + }); + this.listenTo(document, 'change:data', (evt, batch) => { + if (batch.isUndo || !batch.isLocal) { + return; + } + this._evaluateTextBeforeSelection('data', { batch }); + }); + } + /** + * Checks the editor content for matched text. + * + * @fires matched:data + * @fires matched:selection + * @fires unmatched + * + * @param suffix A suffix used for generating the event name. + * @param data Data object for event. + */ + _evaluateTextBeforeSelection(suffix, data = {}) { + const model = this.model; + const document = model.document; + const selection = document.selection; + const rangeBeforeSelection = model.createRange(model.createPositionAt(selection.focus.parent, 0), selection.focus); + const { text, range } = getLastTextLine(rangeBeforeSelection, model); + const testResult = this.testCallback(text); + if (!testResult && this.hasMatch) { + this.fire('unmatched'); + } + this._hasMatch = !!testResult; + if (testResult) { + const eventData = Object.assign(data, { text, range }); + // If the test callback returns an object with additional data, assign the data as well. + if (typeof testResult == 'object') { + Object.assign(eventData, testResult); + } + this.fire(`matched:${suffix}`, eventData); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.d.ts new file mode 100644 index 0000000..9819445 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.d.ts @@ -0,0 +1,232 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/twostepcaretmovement + */ +import { Plugin, type Editor } from '@ckeditor/ckeditor5-core'; +/** + * This plugin enables the two-step caret (phantom) movement behavior for + * {@link module:typing/twostepcaretmovement~TwoStepCaretMovement#registerAttribute registered attributes} + * on arrow right () and left () key press. + * + * Thanks to this (phantom) caret movement the user is able to type before/after as well as at the + * beginning/end of an attribute. + * + * **Note:** This plugin support right–to–left (Arabic, Hebrew, etc.) content by mirroring its behavior + * but for the sake of simplicity examples showcase only left–to–right use–cases. + * + * # Forward movement + * + * ## "Entering" an attribute: + * + * When this plugin is enabled and registered for the `a` attribute and the selection is right before it + * (at the attribute boundary), pressing the right arrow key will not move the selection but update its + * attributes accordingly: + * + * * When enabled: + * + * ```xml + * foo{}<$text a="true">bar + * ``` + * + * + * + * ```xml + * foo<$text a="true">{}bar + * ``` + * + * * When disabled: + * + * ```xml + * foo{}<$text a="true">bar + * ``` + * + * + * + * ```xml + * foo<$text a="true">b{}ar + * ``` + * + * + * ## "Leaving" an attribute: + * + * * When enabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * * When disabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">barb{}az + * ``` + * + * # Backward movement + * + * * When enabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * * When disabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">ba{}rb{}az + * ``` + * + * # Multiple attributes + * + * * When enabled and many attributes starts or ends at the same position: + * + * ```xml + * <$text a="true" b="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true" b="true">bar{}baz + * ``` + * + * * When enabled and one procedes another: + * + * ```xml + * <$text a="true">bar<$text b="true">{}bar + * ``` + * + * + * + * ```xml + * <$text a="true">bar{}<$text b="true">bar + * ``` + * + */ +export default class TwoStepCaretMovement extends Plugin { + /** + * A set of attributes to handle. + */ + private attributes; + /** + * The current UID of the overridden gravity, as returned by + * {@link module:engine/model/writer~Writer#overrideSelectionGravity}. + */ + private _overrideUid; + /** + * A flag indicating that the automatic gravity restoration should not happen upon the next + * gravity restoration. + * {@link module:engine/model/selection~Selection#event:change:range} event. + */ + private _isNextGravityRestorationSkipped; + /** + * @inheritDoc + */ + static get pluginName(): "TwoStepCaretMovement"; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * @inheritDoc + */ + init(): void; + /** + * Registers a given attribute for the two-step caret movement. + * + * @param attribute Name of the attribute to handle. + */ + registerAttribute(attribute: string): void; + /** + * Updates the document selection and the view according to the two–step caret movement state + * when moving **forwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}. + * + * @param data Data of the key press. + * @returns `true` when the handler prevented caret movement. + */ + private _handleForwardMovement; + /** + * Updates the document selection and the view according to the two–step caret movement state + * when moving **backwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}. + * + * @param data Data of the key press. + * @returns `true` when the handler prevented caret movement + */ + private _handleBackwardMovement; + /** + * Starts listening to {@link module:engine/view/document~Document#event:mousedown} and + * {@link module:engine/view/document~Document#event:selectionChange} and puts the selection before/after a 2-step node + * if clicked at the beginning/ending of the 2-step node. + * + * The purpose of this action is to allow typing around the 2-step node directly after a click. + * + * See https://github.com/ckeditor/ckeditor5/issues/1016. + */ + private _enableClickingAfterNode; + /** + * Starts listening to {@link module:engine/model/model~Model#event:insertContent} and corrects the model + * selection attributes if the selection is at the end of a two-step node after inserting the content. + * + * The purpose of this action is to improve the overall UX because the user is no longer "trapped" by the + * two-step attribute of the selection, and they can type a "clean" (`linkHref`–less) text right away. + * + * See https://github.com/ckeditor/ckeditor5/issues/6053. + */ + private _enableInsertContentSelectionAttributesFixer; + /** + * Starts listening to {@link module:engine/model/model~Model#deleteContent} and checks whether + * removing a content right after the tow-step attribute. + * + * If so, the selection should not preserve the two-step attribute. However, if + * the {@link module:typing/twostepcaretmovement~TwoStepCaretMovement} plugin is active and + * the selection has the two-step attribute due to overridden gravity (at the end), the two-step attribute should stay untouched. + * + * The purpose of this action is to allow removing the link text and keep the selection outside the link. + * + * See https://github.com/ckeditor/ckeditor5/issues/7521. + */ + private _handleDeleteContentAfterNode; + /** + * `true` when the gravity is overridden for the plugin. + */ + private get _isGravityOverridden(); + /** + * Overrides the gravity using the {@link module:engine/model/writer~Writer model writer} + * and stores the information about this fact in the {@link #_overrideUid}. + * + * A shorthand for {@link module:engine/model/writer~Writer#overrideSelectionGravity}. + */ + private _overrideGravity; + /** + * Restores the gravity using the {@link module:engine/model/writer~Writer model writer}. + * + * A shorthand for {@link module:engine/model/writer~Writer#restoreSelectionGravity}. + */ + private _restoreGravity; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js b/node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js new file mode 100644 index 0000000..0eabae4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/twostepcaretmovement.js @@ -0,0 +1,622 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/twostepcaretmovement + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import { keyCodes } from '@ckeditor/ckeditor5-utils'; +import { MouseObserver } from '@ckeditor/ckeditor5-engine'; +/** + * This plugin enables the two-step caret (phantom) movement behavior for + * {@link module:typing/twostepcaretmovement~TwoStepCaretMovement#registerAttribute registered attributes} + * on arrow right () and left () key press. + * + * Thanks to this (phantom) caret movement the user is able to type before/after as well as at the + * beginning/end of an attribute. + * + * **Note:** This plugin support right–to–left (Arabic, Hebrew, etc.) content by mirroring its behavior + * but for the sake of simplicity examples showcase only left–to–right use–cases. + * + * # Forward movement + * + * ## "Entering" an attribute: + * + * When this plugin is enabled and registered for the `a` attribute and the selection is right before it + * (at the attribute boundary), pressing the right arrow key will not move the selection but update its + * attributes accordingly: + * + * * When enabled: + * + * ```xml + * foo{}<$text a="true">bar + * ``` + * + * + * + * ```xml + * foo<$text a="true">{}bar + * ``` + * + * * When disabled: + * + * ```xml + * foo{}<$text a="true">bar + * ``` + * + * + * + * ```xml + * foo<$text a="true">b{}ar + * ``` + * + * + * ## "Leaving" an attribute: + * + * * When enabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * * When disabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">barb{}az + * ``` + * + * # Backward movement + * + * * When enabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * * When disabled: + * + * ```xml + * <$text a="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true">ba{}rb{}az + * ``` + * + * # Multiple attributes + * + * * When enabled and many attributes starts or ends at the same position: + * + * ```xml + * <$text a="true" b="true">bar{}baz + * ``` + * + * + * + * ```xml + * <$text a="true" b="true">bar{}baz + * ``` + * + * * When enabled and one procedes another: + * + * ```xml + * <$text a="true">bar<$text b="true">{}bar + * ``` + * + * + * + * ```xml + * <$text a="true">bar{}<$text b="true">bar + * ``` + * + */ +export default class TwoStepCaretMovement extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'TwoStepCaretMovement'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + /** + * A flag indicating that the automatic gravity restoration should not happen upon the next + * gravity restoration. + * {@link module:engine/model/selection~Selection#event:change:range} event. + */ + this._isNextGravityRestorationSkipped = false; + this.attributes = new Set(); + this._overrideUid = null; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const model = editor.model; + const view = editor.editing.view; + const locale = editor.locale; + const modelSelection = model.document.selection; + // Listen to keyboard events and handle the caret movement according to the 2-step caret logic. + this.listenTo(view.document, 'arrowKey', (evt, data) => { + // This implementation works only for collapsed selection. + if (!modelSelection.isCollapsed) { + return; + } + // When user tries to expand the selection or jump over the whole word or to the beginning/end then + // two-steps movement is not necessary. + if (data.shiftKey || data.altKey || data.ctrlKey) { + return; + } + const arrowRightPressed = data.keyCode == keyCodes.arrowright; + const arrowLeftPressed = data.keyCode == keyCodes.arrowleft; + // When neither left or right arrow has been pressed then do noting. + if (!arrowRightPressed && !arrowLeftPressed) { + return; + } + const contentDirection = locale.contentLanguageDirection; + let isMovementHandled = false; + if ((contentDirection === 'ltr' && arrowRightPressed) || (contentDirection === 'rtl' && arrowLeftPressed)) { + isMovementHandled = this._handleForwardMovement(data); + } + else { + isMovementHandled = this._handleBackwardMovement(data); + } + // Stop the keydown event if the two-step caret movement handled it. Avoid collisions + // with other features which may also take over the caret movement (e.g. Widget). + if (isMovementHandled === true) { + evt.stop(); + } + }, { context: '$text', priority: 'highest' }); + // The automatic gravity restoration logic. + this.listenTo(modelSelection, 'change:range', (evt, data) => { + // Skipping the automatic restoration is needed if the selection should change + // but the gravity must remain overridden afterwards. See the #handleBackwardMovement + // to learn more. + if (this._isNextGravityRestorationSkipped) { + this._isNextGravityRestorationSkipped = false; + return; + } + // Skip automatic restore when the gravity is not overridden — simply, there's nothing to restore + // at this moment. + if (!this._isGravityOverridden) { + return; + } + // Skip automatic restore when the change is indirect AND the selection is at the attribute boundary. + // It means that e.g. if the change was external (collaboration) and the user had their + // selection around the link, its gravity should remain intact in this change:range event. + if (!data.directChange && isBetweenDifferentAttributes(modelSelection.getFirstPosition(), this.attributes)) { + return; + } + this._restoreGravity(); + }); + // Handle a click at the beginning/end of a two-step element. + this._enableClickingAfterNode(); + // Change the attributes of the selection in certain situations after the two-step node was inserted into the document. + this._enableInsertContentSelectionAttributesFixer(); + // Handle removing the content after the two-step node. + this._handleDeleteContentAfterNode(); + } + /** + * Registers a given attribute for the two-step caret movement. + * + * @param attribute Name of the attribute to handle. + */ + registerAttribute(attribute) { + this.attributes.add(attribute); + } + /** + * Updates the document selection and the view according to the two–step caret movement state + * when moving **forwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}. + * + * @param data Data of the key press. + * @returns `true` when the handler prevented caret movement. + */ + _handleForwardMovement(data) { + const attributes = this.attributes; + const model = this.editor.model; + const selection = model.document.selection; + const position = selection.getFirstPosition(); + // DON'T ENGAGE 2-SCM if gravity is already overridden. It means that we just entered + // + // foo<$text attribute>{}barbaz + // + // or left the attribute + // + // foo<$text attribute>bar{}baz + // + // and the gravity will be restored automatically. + if (this._isGravityOverridden) { + return false; + } + // DON'T ENGAGE 2-SCM when the selection is at the beginning of the block AND already has the + // attribute: + // * when the selection was initially set there using the mouse, + // * when the editor has just started + // + // <$text attribute>{}barbaz + // + if (position.isAtStart && hasAnyAttribute(selection, attributes)) { + return false; + } + // ENGAGE 2-SCM When at least one of the observed attributes changes its value (incl. starts, ends). + // + // foo<$text attribute>bar{}baz + // foo<$text attribute>bar{}<$text otherAttribute>baz + // foo<$text attribute=1>bar{}<$text attribute=2>baz + // foo{}<$text attribute>barbaz + // + if (isBetweenDifferentAttributes(position, attributes)) { + preventCaretMovement(data); + // CLEAR 2-SCM attributes if we are at the end of one 2-SCM and before + // the next one with a different value of the same attribute. + // + // foo<$text attribute=1>bar{}<$text attribute=2>barbaz + // + if (hasAnyAttribute(selection, attributes) && + isBetweenDifferentAttributes(position, attributes, true)) { + clearSelectionAttributes(model, attributes); + } + else { + this._overrideGravity(); + } + return true; + } + return false; + } + /** + * Updates the document selection and the view according to the two–step caret movement state + * when moving **backwards**. Executed upon `keypress` in the {@link module:engine/view/view~View}. + * + * @param data Data of the key press. + * @returns `true` when the handler prevented caret movement + */ + _handleBackwardMovement(data) { + const attributes = this.attributes; + const model = this.editor.model; + const selection = model.document.selection; + const position = selection.getFirstPosition(); + // When the gravity is already overridden (by this plugin), it means we are on the two-step position. + // Prevent the movement, restore the gravity and update selection attributes. + // + // foo<$text attribute=1>bar<$text attribute=2>{}baz + // foo<$text attribute>bar<$text otherAttribute>{}baz + // foo<$text attribute>{}barbaz + // foo<$text attribute>bar{}baz + // + if (this._isGravityOverridden) { + preventCaretMovement(data); + this._restoreGravity(); + // CLEAR 2-SCM attributes if we are at the end of one 2-SCM and before + // the next one with a different value of the same attribute. + // + // foo<$text attribute=1>bar<$text attribute=2>{}barbaz + // + if (isBetweenDifferentAttributes(position, attributes, true)) { + clearSelectionAttributes(model, attributes); + } + else { + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + } + return true; + } + else { + // REMOVE SELECTION ATTRIBUTE when restoring gravity towards a non-existent content at the + // beginning of the block. + // + // {}<$text attribute>bar + // + if (position.isAtStart) { + if (hasAnyAttribute(selection, attributes)) { + preventCaretMovement(data); + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + return true; + } + return false; + } + // SET 2-SCM attributes if we are between nodes with the same attribute but with different values. + // + // foo<$text attribute=1>bar[]<$text attribute=2>barbaz + // + if (!hasAnyAttribute(selection, attributes) && + isBetweenDifferentAttributes(position, attributes, true)) { + preventCaretMovement(data); + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + return true; + } + // When we are moving from natural gravity, to the position of the 2SCM, we need to override the gravity, + // and make sure it won't be restored. Unless it's at the end of the block and an observed attribute. + // We need to check if the caret is a one position before the attribute boundary: + // + // foo<$text attribute=1>bar<$text attribute=2>b{}az + // foo<$text attribute>bar<$text otherAttribute>b{}az + // foo<$text attribute>b{}arbaz + // foo<$text attribute>barb{}az + // + if (isStepAfterAnyAttributeBoundary(position, attributes)) { + // ENGAGE 2-SCM if the selection has no attribute. This may happen when the user + // left the attribute using a FORWARD 2-SCM. + // + // <$text attribute>bar{} + // + if (position.isAtEnd && + !hasAnyAttribute(selection, attributes) && + isBetweenDifferentAttributes(position, attributes)) { + preventCaretMovement(data); + setSelectionAttributesFromTheNodeBefore(model, attributes, position); + return true; + } + // Skip the automatic gravity restore upon the next selection#change:range event. + // If not skipped, it would automatically restore the gravity, which should remain + // overridden. + this._isNextGravityRestorationSkipped = true; + this._overrideGravity(); + // Don't return "true" here because we didn't call _preventCaretMovement. + // Returning here will destabilize the filler logic, which also listens to + // keydown (and the event would be stopped). + return false; + } + } + return false; + } + /** + * Starts listening to {@link module:engine/view/document~Document#event:mousedown} and + * {@link module:engine/view/document~Document#event:selectionChange} and puts the selection before/after a 2-step node + * if clicked at the beginning/ending of the 2-step node. + * + * The purpose of this action is to allow typing around the 2-step node directly after a click. + * + * See https://github.com/ckeditor/ckeditor5/issues/1016. + */ + _enableClickingAfterNode() { + const editor = this.editor; + const model = editor.model; + const selection = model.document.selection; + const document = editor.editing.view.document; + editor.editing.view.addObserver(MouseObserver); + let clicked = false; + // Detect the click. + this.listenTo(document, 'mousedown', () => { + clicked = true; + }); + // When the selection has changed... + this.listenTo(document, 'selectionChange', () => { + const attributes = this.attributes; + if (!clicked) { + return; + } + // ...and it was caused by the click... + clicked = false; + // ...and no text is selected... + if (!selection.isCollapsed) { + return; + } + // ...and clicked text is the 2-step node... + if (!hasAnyAttribute(selection, attributes)) { + return; + } + const position = selection.getFirstPosition(); + if (!isBetweenDifferentAttributes(position, attributes)) { + return; + } + // The selection at the start of a block would use surrounding attributes + // from text after the selection so just clear 2-SCM attributes. + // + // Also, clear attributes for selection between same attribute with different values. + if (position.isAtStart || + isBetweenDifferentAttributes(position, attributes, true)) { + clearSelectionAttributes(model, attributes); + } + else if (!this._isGravityOverridden) { + this._overrideGravity(); + } + }); + } + /** + * Starts listening to {@link module:engine/model/model~Model#event:insertContent} and corrects the model + * selection attributes if the selection is at the end of a two-step node after inserting the content. + * + * The purpose of this action is to improve the overall UX because the user is no longer "trapped" by the + * two-step attribute of the selection, and they can type a "clean" (`linkHref`–less) text right away. + * + * See https://github.com/ckeditor/ckeditor5/issues/6053. + */ + _enableInsertContentSelectionAttributesFixer() { + const editor = this.editor; + const model = editor.model; + const selection = model.document.selection; + const attributes = this.attributes; + this.listenTo(model, 'insertContent', () => { + const position = selection.getFirstPosition(); + if (hasAnyAttribute(selection, attributes) && + isBetweenDifferentAttributes(position, attributes)) { + clearSelectionAttributes(model, attributes); + } + }, { priority: 'low' }); + } + /** + * Starts listening to {@link module:engine/model/model~Model#deleteContent} and checks whether + * removing a content right after the tow-step attribute. + * + * If so, the selection should not preserve the two-step attribute. However, if + * the {@link module:typing/twostepcaretmovement~TwoStepCaretMovement} plugin is active and + * the selection has the two-step attribute due to overridden gravity (at the end), the two-step attribute should stay untouched. + * + * The purpose of this action is to allow removing the link text and keep the selection outside the link. + * + * See https://github.com/ckeditor/ckeditor5/issues/7521. + */ + _handleDeleteContentAfterNode() { + const editor = this.editor; + const model = editor.model; + const selection = model.document.selection; + const view = editor.editing.view; + let isBackspace = false; + let shouldPreserveAttributes = false; + // Detect pressing `Backspace`. + this.listenTo(view.document, 'delete', (evt, data) => { + isBackspace = data.direction === 'backward'; + }, { priority: 'high' }); + // Before removing the content, check whether the selection is inside a two-step attribute. + // If so, we want to preserve those attributes. + this.listenTo(model, 'deleteContent', () => { + if (!isBackspace) { + return; + } + const position = selection.getFirstPosition(); + shouldPreserveAttributes = hasAnyAttribute(selection, this.attributes) && + !isStepAfterAnyAttributeBoundary(position, this.attributes); + }, { priority: 'high' }); + // After removing the content, check whether the current selection should preserve the `linkHref` attribute. + this.listenTo(model, 'deleteContent', () => { + if (!isBackspace) { + return; + } + isBackspace = false; + // Do not escape two-step attribute if it was inside it before content deletion. + if (shouldPreserveAttributes) { + return; + } + // Use `model.enqueueChange()` in order to execute the callback at the end of the changes process. + editor.model.enqueueChange(() => { + const position = selection.getFirstPosition(); + if (hasAnyAttribute(selection, this.attributes) && + isBetweenDifferentAttributes(position, this.attributes)) { + if (position.isAtStart || isBetweenDifferentAttributes(position, this.attributes, true)) { + clearSelectionAttributes(model, this.attributes); + } + else if (!this._isGravityOverridden) { + this._overrideGravity(); + } + } + }); + }, { priority: 'low' }); + } + /** + * `true` when the gravity is overridden for the plugin. + */ + get _isGravityOverridden() { + return !!this._overrideUid; + } + /** + * Overrides the gravity using the {@link module:engine/model/writer~Writer model writer} + * and stores the information about this fact in the {@link #_overrideUid}. + * + * A shorthand for {@link module:engine/model/writer~Writer#overrideSelectionGravity}. + */ + _overrideGravity() { + this._overrideUid = this.editor.model.change(writer => { + return writer.overrideSelectionGravity(); + }); + } + /** + * Restores the gravity using the {@link module:engine/model/writer~Writer model writer}. + * + * A shorthand for {@link module:engine/model/writer~Writer#restoreSelectionGravity}. + */ + _restoreGravity() { + this.editor.model.change(writer => { + writer.restoreSelectionGravity(this._overrideUid); + this._overrideUid = null; + }); + } +} +/** + * Checks whether the selection has any of given attributes. + */ +function hasAnyAttribute(selection, attributes) { + for (const observedAttribute of attributes) { + if (selection.hasAttribute(observedAttribute)) { + return true; + } + } + return false; +} +/** + * Applies the given attributes to the current selection using using the + * values from the node before the current position. Uses + * the {@link module:engine/model/writer~Writer model writer}. + */ +function setSelectionAttributesFromTheNodeBefore(model, attributes, position) { + const nodeBefore = position.nodeBefore; + model.change(writer => { + if (nodeBefore) { + const attributes = []; + const isInlineObject = model.schema.isObject(nodeBefore) && model.schema.isInline(nodeBefore); + for (const [key, value] of nodeBefore.getAttributes()) { + if (model.schema.checkAttribute('$text', key) && + (!isInlineObject || model.schema.getAttributeProperties(key).copyFromObject !== false)) { + attributes.push([key, value]); + } + } + writer.setSelectionAttribute(attributes); + } + else { + writer.removeSelectionAttribute(attributes); + } + }); +} +/** + * Removes 2-SCM attributes from the selection. + */ +function clearSelectionAttributes(model, attributes) { + model.change(writer => { + writer.removeSelectionAttribute(attributes); + }); +} +/** + * Prevents the caret movement in the view by calling `preventDefault` on the event data. + * + * @alias data.preventDefault + */ +function preventCaretMovement(data) { + data.preventDefault(); +} +/** + * Checks whether the step before `isBetweenDifferentAttributes()`. + */ +function isStepAfterAnyAttributeBoundary(position, attributes) { + const positionBefore = position.getShiftedBy(-1); + return isBetweenDifferentAttributes(positionBefore, attributes); +} +/** + * Checks whether the given position is between different values of given attributes. + */ +function isBetweenDifferentAttributes(position, attributes, isStrict = false) { + const { nodeBefore, nodeAfter } = position; + for (const observedAttribute of attributes) { + const attrBefore = nodeBefore ? nodeBefore.getAttribute(observedAttribute) : undefined; + const attrAfter = nodeAfter ? nodeAfter.getAttribute(observedAttribute) : undefined; + if (isStrict && (attrBefore === undefined || attrAfter === undefined)) { + continue; + } + if (attrAfter !== attrBefore) { + return true; + } + } + return false; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/typing.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/typing.d.ts new file mode 100644 index 0000000..c64196e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/typing.d.ts @@ -0,0 +1,23 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/typing + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import Input from './input.js'; +import Delete from './delete.js'; +/** + * The typing feature. It handles typing. + * + * This is a "glue" plugin which loads the {@link module:typing/input~Input} and {@link module:typing/delete~Delete} + * plugins. + */ +export default class Typing extends Plugin { + static get requires(): readonly [typeof Input, typeof Delete]; + /** + * @inheritDoc + */ + static get pluginName(): "Typing"; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/typing.js b/node_modules/@ckeditor/ckeditor5-typing/src/typing.js new file mode 100644 index 0000000..12188e6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/typing.js @@ -0,0 +1,27 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/typing + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import Input from './input.js'; +import Delete from './delete.js'; +/** + * The typing feature. It handles typing. + * + * This is a "glue" plugin which loads the {@link module:typing/input~Input} and {@link module:typing/delete~Delete} + * plugins. + */ +export default class Typing extends Plugin { + static get requires() { + return [Input, Delete]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Typing'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.d.ts new file mode 100644 index 0000000..fdfd2f7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.d.ts @@ -0,0 +1,204 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/typingconfig + */ +/** + * The configuration of the typing features. Used by the typing features in `@ckeditor/ckeditor5-typing` package. + * + * ```ts + * ClassicEditor + * .create( editorElement, { + * typing: ... // Typing feature options. + * } ) + * .then( ... ) + * .catch( ... ); + * ``` + * + * See {@link module:core/editor/editorconfig~EditorConfig all editor options}. + */ +export interface TypingConfig { + /** + * The granularity of undo/redo for typing and deleting. The value `20` means (more or less) that a new undo step + * is created every 20 characters are inserted or deleted. + * + * @default 20 + */ + undoStep?: number; + /** + * The configuration of the {@link module:typing/texttransformation~TextTransformation} feature. + * + * Read more in {@link module:typing/typingconfig~TextTransformationConfig}. + */ + transformations: TextTransformationConfig; +} +/** + * The configuration of the text transformation feature. + * + * ```ts + * ClassicEditor + * .create( editorElement, { + * typing: { + * transformations: ... // Text transformation feature options. + * } + * } ) + * .then( ... ) + * .catch( ... ); + * ``` + * + * By default, the feature comes pre-configured + * (via {@link module:typing/typingconfig~TextTransformationConfig#include `config.typing.transformations.include`}) with the + * following groups of transformations: + * + * * Typography (group name: `typography`) + * - `ellipsis`: transforms `...` to `…` + * - `enDash`: transforms ` -- ` to ` – ` + * - `emDash`: transforms ` --- ` to ` — ` + * * Quotations (group name: `quotes`) + * - `quotesPrimary`: transforms `"Foo bar"` to `“Foo bar”` + * - `quotesSecondary`: transforms `'Foo bar'` to `‘Foo bar’` + * * Symbols (group name: `symbols`) + * - `trademark`: transforms `(tm)` to `™` + * - `registeredTrademark`: transforms `(r)` to `®` + * - `copyright`: transforms `(c)` to `©` + * * Mathematical (group name: `mathematical`) + * - `oneHalf`: transforms `1/2` to: `½` + * - `oneThird`: transforms `1/3` to: `⅓` + * - `twoThirds`: transforms `2/3` to: `⅔` + * - `oneForth`: transforms `1/4` to: `¼` + * - `threeQuarters`: transforms `3/4` to: `¾` + * - `lessThanOrEqual`: transforms `<=` to: `≤` + * - `greaterThanOrEqual`: transforms `>=` to: `≥` + * - `notEqual`: transforms `!=` to: `≠` + * - `arrowLeft`: transforms `<-` to: `←` + * - `arrowRight`: transforms `->` to: `→` + * * Misc: + * - `quotesPrimaryEnGb`: transforms `'Foo bar'` to `‘Foo bar’` + * - `quotesSecondaryEnGb`: transforms `"Foo bar"` to `“Foo bar”` + * - `quotesPrimaryPl`: transforms `"Foo bar"` to `„Foo bar”` + * - `quotesSecondaryPl`: transforms `'Foo bar'` to `‚Foo bar’` + * + * In order to load additional transformations, use the + * {@link module:typing/typingconfig~TextTransformationConfig#extra `transformations.extra` option}. + * + * In order to narrow down the list of transformations, use the + * {@link module:typing/typingconfig~TextTransformationConfig#remove `transformations.remove` option}. + * + * In order to completely override the supported transformations, use the + * {@link module:typing/typingconfig~TextTransformationConfig#include `transformations.include` option}. + * + * Examples: + * + * ```ts + * const transformationsConfig = { + * include: [ + * // Use only the 'quotes' and 'typography' groups. + * 'quotes', + * 'typography', + * + * // Plus, some custom transformation. + * { from: 'CKE', to: 'CKEditor' } + * ] + * }; + * + * const transformationsConfig = { + * // Remove the 'ellipsis' transformation loaded by the 'typography' group. + * remove: [ 'ellipsis' ] + * } + * ``` + */ +export interface TextTransformationConfig { + /** + * The standard list of text transformations supported by the editor. By default it comes pre-configured with a couple dozen of them + * (see {@link module:typing/typingconfig~TextTransformationConfig} for the full list). You can override this list completely + * by setting this option or use the other two options + * ({@link module:typing/typingconfig~TextTransformationConfig#extra `transformations.extra`}, + * {@link module:typing/typingconfig~TextTransformationConfig#remove `transformations.remove`}) to fine-tune the default list. + */ + include: Array; + /** + * Additional text transformations that are added to the transformations defined in + * {@link module:typing/typingconfig~TextTransformationConfig#include `transformations.include`}. + * + * ```ts + * const transformationsConfig = { + * extra: [ + * { from: 'CKE', to: 'CKEditor' } + * ] + * }; + * ``` + */ + extra?: Array; + /** + * The text transformation names that are removed from transformations defined in + * {@link module:typing/typingconfig~TextTransformationConfig#include `transformations.include`} or + * {@link module:typing/typingconfig~TextTransformationConfig#extra `transformations.extra`}. + * + * ```ts + * const transformationsConfig = { + * remove: [ + * 'ellipsis', // Remove only 'ellipsis' from the 'typography' group. + * 'mathematical' // Remove all transformations from the 'mathematical' group. + * ] + * } + * ``` + */ + remove?: Array; +} +/** + * The text transformation definition object. It describes what should be replaced with what. + * + * The input value (`from`) can be passed either as a string or as a regular expression. + * + * * If a string is passed, it will be simply checked if the end of the input matches it. + * * If a regular expression is passed, its entire length must be covered with capturing groups (e.g. `/(foo)(bar)$/`). + * Also, since it is compared against the end of the input, it has to end with `$` to be correctly matched. + * See examples below. + * + * The output value (`to`) can be passed as a string, as an array or as a function. + * + * * If a string is passed, it will be used as a replacement value as-is. Note that a string output value can be used only if + * the input value is a string, too. + * * If an array is passed, it has to have the same number of elements as there are capturing groups in the input value regular expression. + * Each capture group will be replaced with a corresponding string from the passed array. If a given capturing group should not be replaced, + * use `null` instead of passing a string. + * * If a function is used, it should return an array as described above. The function is passed one parameter – an array with matches + * by the regular expression. See the examples below. + * + * A simple string-to-string replacement: + * + * ```ts + * { from: '(c)', to: '©' } + * ``` + * + * Change quote styles using a regular expression. Note how all the parts are in separate capturing groups and the space at the beginning + * and the text inside quotes are not replaced (`null` passed as the first and the third value in the `to` parameter): + * + * ```ts + * { + * from: /(^|\s)(")([^"]*)(")$/, + * to: [ null, '“', null, '”' ] + * } + * ``` + * + * Automatic uppercase after a dot using a callback: + * + * ```ts + * { + * from: /(\. )([a-z])$/, + * to: matches => [ null, matches[ 1 ].toUpperCase() ] + * } + * ``` + */ +export interface TextTransformationDescription { + /** + * The string or regular expression to transform. + */ + from: string | RegExp; + /** + * The text to transform compatible with `String.replace()`. + */ + to: string | Array | ((matches: Array) => Array); +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.js b/node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/typingconfig.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.d.ts new file mode 100644 index 0000000..1c0586a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.d.ts @@ -0,0 +1,103 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/utils/changebuffer + */ +import type { Model, Batch } from '@ckeditor/ckeditor5-engine'; +/** + * Change buffer allows to group atomic changes (like characters that have been typed) into + * {@link module:engine/model/batch~Batch batches}. + * + * Batches represent single undo steps, hence changes added to one single batch are undone together. + * + * The buffer has a configurable limit of atomic changes that it can accommodate. After the limit was + * exceeded (see {@link ~ChangeBuffer#input}), a new batch is created in {@link ~ChangeBuffer#batch}. + * + * To use the change buffer you need to let it know about the number of changes that were added to the batch: + * + * ```ts + * const buffer = new ChangeBuffer( model, LIMIT ); + * + * // Later on in your feature: + * buffer.batch.insert( pos, insertedCharacters ); + * buffer.input( insertedCharacters.length ); + * ``` + */ +export default class ChangeBuffer { + /** + * The model instance. + */ + readonly model: Model; + /** + * The maximum number of atomic changes which can be contained in one batch. + */ + readonly limit: number; + /** + * Whether the buffer is locked. A locked buffer cannot be reset unless it gets unlocked. + */ + private _isLocked; + /** + * The number of atomic changes in the buffer. Once it exceeds the {@link #limit}, + * the {@link #batch batch} is set to a new one. + */ + private _size; + /** + * The current batch instance. + */ + private _batch; + /** + * The callback to document the change event which later needs to be removed. + */ + private readonly _changeCallback; + /** + * The callback to document selection `change:attribute` and `change:range` events which resets the buffer. + */ + private readonly _selectionChangeCallback; + /** + * Creates a new instance of the change buffer. + * + * @param limit The maximum number of atomic changes which can be contained in one batch. + */ + constructor(model: Model, limit?: number); + /** + * The current batch to which a feature should add its operations. Once the {@link #size} + * is reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset. + */ + get batch(): Batch; + /** + * The number of atomic changes in the buffer. Once it exceeds the {@link #limit}, + * the {@link #batch batch} is set to a new one. + */ + get size(): number; + /** + * The input number of changes into the buffer. Once the {@link #size} is + * reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset. + * + * @param changeCount The number of atomic changes to input. + */ + input(changeCount: number): void; + /** + * Whether the buffer is locked. A locked buffer cannot be reset unless it gets unlocked. + */ + get isLocked(): boolean; + /** + * Locks the buffer. + */ + lock(): void; + /** + * Unlocks the buffer. + */ + unlock(): void; + /** + * Destroys the buffer. + */ + destroy(): void; + /** + * Resets the change buffer. + * + * @param ignoreLock Whether internal lock {@link #isLocked} should be ignored. + */ + private _reset; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js b/node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js new file mode 100644 index 0000000..8e5769c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/changebuffer.js @@ -0,0 +1,123 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Change buffer allows to group atomic changes (like characters that have been typed) into + * {@link module:engine/model/batch~Batch batches}. + * + * Batches represent single undo steps, hence changes added to one single batch are undone together. + * + * The buffer has a configurable limit of atomic changes that it can accommodate. After the limit was + * exceeded (see {@link ~ChangeBuffer#input}), a new batch is created in {@link ~ChangeBuffer#batch}. + * + * To use the change buffer you need to let it know about the number of changes that were added to the batch: + * + * ```ts + * const buffer = new ChangeBuffer( model, LIMIT ); + * + * // Later on in your feature: + * buffer.batch.insert( pos, insertedCharacters ); + * buffer.input( insertedCharacters.length ); + * ``` + */ +export default class ChangeBuffer { + /** + * Creates a new instance of the change buffer. + * + * @param limit The maximum number of atomic changes which can be contained in one batch. + */ + constructor(model, limit = 20) { + /** + * The current batch instance. + */ + this._batch = null; + this.model = model; + this._size = 0; + this.limit = limit; + this._isLocked = false; + // The function to be called in order to notify the buffer about batches which appeared in the document. + // The callback will check whether it is a new batch and in that case the buffer will be flushed. + // + // The reason why the buffer needs to be flushed whenever a new batch appears is that the changes added afterwards + // should be added to a new batch. For instance, when the user types, then inserts an image, and then types again, + // the characters typed after inserting the image should be added to a different batch than the characters typed before. + this._changeCallback = (evt, batch) => { + if (batch.isLocal && batch.isUndoable && batch !== this._batch) { + this._reset(true); + } + }; + this._selectionChangeCallback = () => { + this._reset(); + }; + this.model.document.on('change', this._changeCallback); + this.model.document.selection.on('change:range', this._selectionChangeCallback); + this.model.document.selection.on('change:attribute', this._selectionChangeCallback); + } + /** + * The current batch to which a feature should add its operations. Once the {@link #size} + * is reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset. + */ + get batch() { + if (!this._batch) { + this._batch = this.model.createBatch({ isTyping: true }); + } + return this._batch; + } + /** + * The number of atomic changes in the buffer. Once it exceeds the {@link #limit}, + * the {@link #batch batch} is set to a new one. + */ + get size() { + return this._size; + } + /** + * The input number of changes into the buffer. Once the {@link #size} is + * reached or exceeds the {@link #limit}, the batch is set to a new instance and the size is reset. + * + * @param changeCount The number of atomic changes to input. + */ + input(changeCount) { + this._size += changeCount; + if (this._size >= this.limit) { + this._reset(true); + } + } + /** + * Whether the buffer is locked. A locked buffer cannot be reset unless it gets unlocked. + */ + get isLocked() { + return this._isLocked; + } + /** + * Locks the buffer. + */ + lock() { + this._isLocked = true; + } + /** + * Unlocks the buffer. + */ + unlock() { + this._isLocked = false; + } + /** + * Destroys the buffer. + */ + destroy() { + this.model.document.off('change', this._changeCallback); + this.model.document.selection.off('change:range', this._selectionChangeCallback); + this.model.document.selection.off('change:attribute', this._selectionChangeCallback); + } + /** + * Resets the change buffer. + * + * @param ignoreLock Whether internal lock {@link #isLocked} should be ignored. + */ + _reset(ignoreLock = false) { + if (!this.isLocked || ignoreLock) { + this._batch = null; + this._size = 0; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.d.ts new file mode 100644 index 0000000..4573f7d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.d.ts @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/utils/findattributerange + */ +import type { Position, Model, Range } from '@ckeditor/ckeditor5-engine'; +/** + * Returns a model range that covers all consecutive nodes with the same `attributeName` and its `value` + * that intersect the given `position`. + * + * It can be used e.g. to get the entire range on which the `linkHref` attribute needs to be changed when having a + * selection inside a link. + * + * @param position The start position. + * @param attributeName The attribute name. + * @param value The attribute value. + * @param model The model instance. + * @returns The link range. + */ +export default function findAttributeRange(position: Position, attributeName: string, value: unknown, model: Model): Range; +/** + * Walks forward or backward (depends on the `lookBack` flag), node by node, as long as they have the same attribute value + * and returns a position just before or after (depends on the `lookBack` flag) the last matched node. + * + * @param position The start position. + * @param attributeName The attribute name. + * @param value The attribute value. + * @param lookBack Whether the walk direction is forward (`false`) or backward (`true`). + * @returns The position just before the last matched node. + */ +export declare function findAttributeRangeBound(position: Position, attributeName: string, value: unknown, lookBack: boolean, model: Model): Position; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js b/node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js new file mode 100644 index 0000000..a0a328e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/findattributerange.js @@ -0,0 +1,41 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns a model range that covers all consecutive nodes with the same `attributeName` and its `value` + * that intersect the given `position`. + * + * It can be used e.g. to get the entire range on which the `linkHref` attribute needs to be changed when having a + * selection inside a link. + * + * @param position The start position. + * @param attributeName The attribute name. + * @param value The attribute value. + * @param model The model instance. + * @returns The link range. + */ +export default function findAttributeRange(position, attributeName, value, model) { + return model.createRange(findAttributeRangeBound(position, attributeName, value, true, model), findAttributeRangeBound(position, attributeName, value, false, model)); +} +/** + * Walks forward or backward (depends on the `lookBack` flag), node by node, as long as they have the same attribute value + * and returns a position just before or after (depends on the `lookBack` flag) the last matched node. + * + * @param position The start position. + * @param attributeName The attribute name. + * @param value The attribute value. + * @param lookBack Whether the walk direction is forward (`false`) or backward (`true`). + * @returns The position just before the last matched node. + */ +export function findAttributeRangeBound(position, attributeName, value, lookBack, model) { + // Get node before or after position (depends on `lookBack` flag). + // When position is inside text node then start searching from text node. + let node = position.textNode || (lookBack ? position.nodeBefore : position.nodeAfter); + let lastNode = null; + while (node && node.getAttribute(attributeName) == value) { + lastNode = node; + node = lookBack ? node.previousSibling : node.nextSibling; + } + return lastNode ? model.createPositionAt(lastNode, lookBack ? 'before' : 'after') : position; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.d.ts new file mode 100644 index 0000000..8269a1d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.d.ts @@ -0,0 +1,49 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/utils/getlasttextline + */ +import type { Model, Range } from '@ckeditor/ckeditor5-engine'; +/** + * Returns the last text line from the given range. + * + * "The last text line" is understood as text (from one or more text nodes) which is limited either by a parent block + * or by inline elements (e.g. ``). + * + * ```ts + * const rangeToCheck = model.createRange( + * model.createPositionAt( paragraph, 0 ), + * model.createPositionAt( paragraph, 'end' ) + * ); + * + * const { text, range } = getLastTextLine( rangeToCheck, model ); + * ``` + * + * For model below, the returned `text` will be "Foo bar baz" and `range` will be set on whole `` content: + * + * ```xml + * Foo bar baz + * ``` + * + * However, in below case, `text` will be set to "baz" and `range` will be set only on "baz". + * + * ```xml + * Foobarbaz + * ``` + */ +export default function getLastTextLine(range: Range, model: Model): LastTextLineData; +/** + * The value returned by {@link module:typing/utils/getlasttextline~getLastTextLine}. + */ +export type LastTextLineData = { + /** + * The text from the text nodes in the last text line. + */ + text: string; + /** + * The range set on the text nodes in the last text line. + */ + range: Range; +}; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js b/node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js new file mode 100644 index 0000000..1298414 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/getlasttextline.js @@ -0,0 +1,43 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns the last text line from the given range. + * + * "The last text line" is understood as text (from one or more text nodes) which is limited either by a parent block + * or by inline elements (e.g. ``). + * + * ```ts + * const rangeToCheck = model.createRange( + * model.createPositionAt( paragraph, 0 ), + * model.createPositionAt( paragraph, 'end' ) + * ); + * + * const { text, range } = getLastTextLine( rangeToCheck, model ); + * ``` + * + * For model below, the returned `text` will be "Foo bar baz" and `range` will be set on whole `` content: + * + * ```xml + * Foo bar baz + * ``` + * + * However, in below case, `text` will be set to "baz" and `range` will be set only on "baz". + * + * ```xml + * Foobarbaz + * ``` + */ +export default function getLastTextLine(range, model) { + let start = range.start; + const text = Array.from(range.getWalker({ ignoreElementEnd: false })).reduce((rangeText, { item }) => { + // Trim text to a last occurrence of an inline element and update range start. + if (!(item.is('$text') || item.is('$textProxy'))) { + start = model.createPositionAfter(item); + return ''; + } + return rangeText + item.data; + }, ''); + return { text, range: model.createRange(start, range.end) }; +} diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.d.ts b/node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.d.ts new file mode 100644 index 0000000..74325bb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.d.ts @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Editor } from '@ckeditor/ckeditor5-core'; +/** + * Adds a visual highlight style to an attribute element in which the selection is anchored. + * Together with two-step caret movement, they indicate that the user is typing inside the element. + * + * Highlight is turned on by adding the given class to the attribute element in the view: + * + * * The class is removed before the conversion has started, as callbacks added with the `'highest'` priority + * to {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher} events. + * * The class is added in the view post fixer, after other changes in the model tree were converted to the view. + * + * This way, adding and removing the highlight does not interfere with conversion. + * + * Usage: + * + * ```ts + * import inlineHighlight from '@ckeditor/ckeditor5-typing/src/utils/inlinehighlight'; + * + * // Make `ck-link_selected` class be applied on an `a` element + * // whenever the corresponding `linkHref` attribute element is selected. + * inlineHighlight( editor, 'linkHref', 'a', 'ck-link_selected' ); + * ``` + * + * @param editor The editor instance. + * @param attributeName The attribute name to check. + * @param tagName The tagName of a view item. + * @param className The class name to apply in the view. + */ +export default function inlineHighlight(editor: Editor, attributeName: string, tagName: string, className: string): void; diff --git a/node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js b/node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js new file mode 100644 index 0000000..8ceb87b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-typing/src/utils/inlinehighlight.js @@ -0,0 +1,74 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module typing/utils/inlinehighlight + */ +import findAttributeRange from './findattributerange.js'; +/** + * Adds a visual highlight style to an attribute element in which the selection is anchored. + * Together with two-step caret movement, they indicate that the user is typing inside the element. + * + * Highlight is turned on by adding the given class to the attribute element in the view: + * + * * The class is removed before the conversion has started, as callbacks added with the `'highest'` priority + * to {@link module:engine/conversion/downcastdispatcher~DowncastDispatcher} events. + * * The class is added in the view post fixer, after other changes in the model tree were converted to the view. + * + * This way, adding and removing the highlight does not interfere with conversion. + * + * Usage: + * + * ```ts + * import inlineHighlight from '@ckeditor/ckeditor5-typing/src/utils/inlinehighlight'; + * + * // Make `ck-link_selected` class be applied on an `a` element + * // whenever the corresponding `linkHref` attribute element is selected. + * inlineHighlight( editor, 'linkHref', 'a', 'ck-link_selected' ); + * ``` + * + * @param editor The editor instance. + * @param attributeName The attribute name to check. + * @param tagName The tagName of a view item. + * @param className The class name to apply in the view. + */ +export default function inlineHighlight(editor, attributeName, tagName, className) { + const view = editor.editing.view; + const highlightedElements = new Set(); + // Adding the class. + view.document.registerPostFixer(writer => { + const selection = editor.model.document.selection; + let changed = false; + if (selection.hasAttribute(attributeName)) { + const modelRange = findAttributeRange(selection.getFirstPosition(), attributeName, selection.getAttribute(attributeName), editor.model); + const viewRange = editor.editing.mapper.toViewRange(modelRange); + // There might be multiple view elements in the `viewRange`, for example, when the `a` element is + // broken by a UIElement. + for (const item of viewRange.getItems()) { + if (item.is('element', tagName) && !item.hasClass(className)) { + writer.addClass(className, item); + highlightedElements.add(item); + changed = true; + } + } + } + return changed; + }); + // Removing the class. + editor.conversion.for('editingDowncast').add(dispatcher => { + // Make sure the highlight is removed on every possible event, before conversion is started. + dispatcher.on('insert', removeHighlight, { priority: 'highest' }); + dispatcher.on('remove', removeHighlight, { priority: 'highest' }); + dispatcher.on('attribute', removeHighlight, { priority: 'highest' }); + dispatcher.on('selection', removeHighlight, { priority: 'highest' }); + function removeHighlight() { + view.change(writer => { + for (const item of highlightedElements.values()) { + writer.removeClass(className, item); + highlightedElements.delete(item); + } + }); + } + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-ui/CHANGELOG.md new file mode 100644 index 0000000..dc1d148 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/CHANGELOG.md @@ -0,0 +1,542 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v18.0.0...v19.0.0) (April 29, 2020) + +### MAJOR BREAKING CHANGES + +* `ViewCollection` no longer has the `locale` property. +* The `ViewCollection#constructor()` no longer accepts the `locale` parameter. +* `LabeledView` component was renamed to `LabeledFieldView`. Also, its instance of a labeled component's view is available through `LabeledFieldView#fieldView`. It replaced the `LabeledView#view`. + +### MINOR BREAKING CHANGES + +* The `DropdownView#focusTracker` property has been removed as it served no purpose. + +### Features + +* Allowed defining initial items of `ViewCollection` and `BodyCollection` in the constructor. See [ckeditor/ckeditor5#6319](https://github.com/ckeditor/ckeditor5/issues/6319). ([6cd15de](https://github.com/ckeditor/ckeditor5-ui/commit/6cd15de)) + + The `View#createCollection()` method now also accepts an iterator of views. +* Introduce `FormHeaderView` UI component. Closes [ckeditor/ckeditor5#6109](https://github.com/ckeditor/ckeditor5/issues/6109). ([eb1ce18](https://github.com/ckeditor/ckeditor5-ui/commit/eb1ce18)) +* The `BlockToolbar` should group items when there is no place to show them all. Closes [ckeditor/ckeditor5#6449](https://github.com/ckeditor/ckeditor5/issues/6449). Closes [ckeditor/ckeditor5#6575](https://github.com/ckeditor/ckeditor5/issues/6575). Closes [ckeditor/ckeditor5#6570](https://github.com/ckeditor/ckeditor5/issues/6570). ([fcd9c4e](https://github.com/ckeditor/ckeditor5-ui/commit/fcd9c4e)) + + Improved `ToolbarView#maxWidth` and items grouping when the toolbar is invisible. + +### Bug fixes + +* Call `ResizeObserver.destroy()` when destroying block toolbar. ([59449d2](https://github.com/ckeditor/ckeditor5-ui/commit/59449d2)) + +### Other changes + +* Removed the obsolete `DropdownView#focusTracker`. Closes [ckeditor/ckeditor5#6548](https://github.com/ckeditor/ckeditor5/issues/6548). ([ac750c7](https://github.com/ckeditor/ckeditor5-ui/commit/ac750c7)) +* Rename `LabeledView` component to `LabeledFieldView`. See [ckeditor/ckeditor5#6110](https://github.com/ckeditor/ckeditor5/issues/6110). ([5a7aca7](https://github.com/ckeditor/ckeditor5-ui/commit/5a7aca7)) +* Updated translations. ([2a391d6](https://github.com/ckeditor/ckeditor5-ui/commit/2a391d6)) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v17.0.0...v18.0.0) (March 19, 2020) + +### MAJOR BREAKING CHANGES + +* The `BalloonToolbar` plugin now groups the overflowing items by default. This can be disabled by setting [`config.balloonToolbar.shouldNotGroupWhenFull`](https://ckeditor.com/docs/ckeditor5/latest/api/module_ui_toolbar_toolbarview-ToolbarOptions.html#member-shouldGroupWhenFull) configuration to `true`. + +### Features + +* The `BalloonToolbar` plugin should group items when its width is close to related editable element's width. Closes [ckeditor/ckeditor5#5597](https://github.com/ckeditor/ckeditor5/issues/5597). Closes [ckeditor/ckeditor5#5501](https://github.com/ckeditor/ckeditor5/issues/5501). ([d36fd23](https://github.com/ckeditor/ckeditor5-ui/commit/d36fd23)) + + [`BalloonPanelView.defaultPositions`](https://ckeditor.com/docs/ckeditor5/latest/api/module_ui_panel_balloon_balloonpanelview-BalloonPanelView.html#static-member-defaultPositions) has been extended with additional positions. Refer to the documentation to learn more. + +### Other changes + +* Updated translations. ([ace38eb](https://github.com/ckeditor/ckeditor5-ui/commit/ace38eb)) + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v16.0.0...v17.0.0) (February 19, 2020) + +### Features + +* Created the `LabeledView` class (see https://github.com/ckeditor/ckeditor5-table/pull/227). ([ec39406](https://github.com/ckeditor/ckeditor5-ui/commit/ec39406)) + + Also added `id` properties to the `DropdownView` and `LabelView` for compatibility with the `LabeledView`. +* Implemented the `Toolbar#isCompact` property to turn regular toolbars into compact ones (with less spacing) (see [ckeditor/ckeditor5#6112](https://github.com/ckeditor/ckeditor5/issues/6112)). ([a6b9c09](https://github.com/ckeditor/ckeditor5-ui/commit/a6b9c09)) +* Reintroduced the concept of body collections with a focus on better management of multiple editors and support for context plugins (plugins which leave outside an editor instance). Closes [ckeditor/ckeditor5#5888](https://github.com/ckeditor/ckeditor5/issues/5888). ([23d12e9](https://github.com/ckeditor/ckeditor5-ui/commit/23d12e9)) + +### Bug fixes + +* Make `BlockToolbar` work with an empty configuration. Closes [ckeditor/ckeditor5#5980](https://github.com/ckeditor/ckeditor5/issues/5980). ([1e05098](https://github.com/ckeditor/ckeditor5-ui/commit/1e05098)) + +### Other changes + +* Replaced the `getResizeObserver()` helper with new `ResizeObserver` class in `ToolbarView`. ([be98aa4](https://github.com/ckeditor/ckeditor5-ui/commit/be98aa4)) + + Follow-up on: https://github.com/ckeditor/ckeditor5-utils/pull/320 +* Updated translations. ([b8bd38e](https://github.com/ckeditor/ckeditor5-ui/commit/b8bd38e)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Features + +* Enabled keystroke preview in `ButtonView`. Implemented the `ButtonView#withKeystroke` property. Closes [ckeditor/ckeditor5#5782](https://github.com/ckeditor/ckeditor5/issues/5782). ([dac8ce0](https://github.com/ckeditor/ckeditor5-ui/commit/dac8ce0)) + +### Bug fixes + +* Use relative positioning for dropdowns to prevent ugly blurring in Chrome. Closes [ckeditor/ckeditor5#1053](https://github.com/ckeditor/ckeditor5/issues/1053). ([95404e3](https://github.com/ckeditor/ckeditor5-ui/commit/95404e3)) + +### Other changes + +* Updated translations. ([16ee253](https://github.com/ckeditor/ckeditor5-ui/commit/16ee253)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v14.0.0...v15.0.0) (October 23, 2019) + +### MAJOR BREAKING CHANGES + +* The internal structure of the toolbar component has changed. Toolbar items are no longer direct descendants of the toolbar in the DOM, which may affect some integrations (mainly CSS selectors if adjustments were made to the styles). + +### Features + +* The editor toolbar is now responsive. Closes [ckeditor/ckeditor5#416](https://github.com/ckeditor/ckeditor5/issues/416). ([46911bf](https://github.com/ckeditor/ckeditor5-ui/commit/46911bf)) + +### Other changes + +* Updated translations. ([c233bb7](https://github.com/ckeditor/ckeditor5-ui/commit/c233bb7)) ([f8f07b2](https://github.com/ckeditor/ckeditor5-ui/commit/f8f07b2)) + + +## [14.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v13.0.2...v14.0.0) (August 26, 2019) + +### Features + +* Brought support for right–to–left (RTL) languages to various UI components. See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([d6c7f55](https://github.com/ckeditor/ckeditor5-ui/commit/d6c7f55)) + +### Bug fixes + +* `ColorGrid` should set the `#isOn` property value of new `ColorTiles`. See [ckeditor/ckeditor5-font#51](https://github.com/ckeditor/ckeditor5-font/issues/51). ([e89ad60](https://github.com/ckeditor/ckeditor5-ui/commit/e89ad60)) +* All editor toolbars should come with the `role` and `aria-label` attributes. Closes [ckeditor/ckeditor5#1404](https://github.com/ckeditor/ckeditor5/issues/1404). ([bdede90](https://github.com/ckeditor/ckeditor5-ui/commit/bdede90)) +* Screen reader will now properly prompt errors for text inputs. Closes [ckeditor/ckeditor5#1406](https://github.com/ckeditor/ckeditor5/issues/1406). ([3a164b7](https://github.com/ckeditor/ckeditor5-ui/commit/3a164b7)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([451df7b](https://github.com/ckeditor/ckeditor5-ui/commit/451df7b)) +* Updated translations. ([eca9fe6](https://github.com/ckeditor/ckeditor5-ui/commit/eca9fe6)) + +### BREAKING CHANGES + +* The `ToolbarView` class requires the [editor locale](https://ckeditor.com/docs/ckeditor5/latest/api/module_utils_locale-Locale.html) to be passed into the constructor. + + +## [13.0.2](https://github.com/ckeditor/ckeditor5-ui/compare/v13.0.1...v13.0.2) (July 10, 2019) + +### Other changes + +* Updated translations. ([ad189b6](https://github.com/ckeditor/ckeditor5-ui/commit/ad189b6)) + + +## [13.0.1](https://github.com/ckeditor/ckeditor5-ui/compare/v13.0.0...v13.0.1) (July 4, 2019) + +### Other changes + +* Updated translations. ([1964cc0](https://github.com/ckeditor/ckeditor5-ui/commit/1964cc0)) ([11cfd41](https://github.com/ckeditor/ckeditor5-ui/commit/11cfd41)) + + +## [13.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v12.1.0...v13.0.0) (June 6, 2019) + +### Features + +* Implemented the single view mode for the `ContextualBalloon` plugin. See https://github.com/ckeditor/ckeditor5-mention/issues/74. ([c000c93](https://github.com/ckeditor/ckeditor5-ui/commit/c000c93)) +* Introduced rotatable panels for `ContextualBalloon`. Closes https://github.com/ckeditor/ckeditor5-ui/issues/491. ([581d8f7](https://github.com/ckeditor/ckeditor5-ui/commit/581d8f7)) + +### Other changes + +* Renamed a misspelled `InputTextViewariaDesribedById` property to `InputTextView#ariaDescribedById`. Closes [#483](https://github.com/ckeditor/ckeditor5-ui/issues/483). ([2288bf3](https://github.com/ckeditor/ckeditor5-ui/commit/2288bf3)) +* The `_rwd.css` mixin was moved to this package from `@ckeditor/ckeditor5-theme-lark`. See [ckeditor/ckeditor5#1662](https://github.com/ckeditor/ckeditor5/issues/1662). ([96e3a3c](https://github.com/ckeditor/ckeditor5-ui/commit/96e3a3c)) +* The `ContextualBalloon#add()` method should accept the `withArrow` option. Closes [#487](https://github.com/ckeditor/ckeditor5-ui/issues/487). ([0e7f670](https://github.com/ckeditor/ckeditor5-ui/commit/0e7f670)) +* Updated translations. ([4699d8b](https://github.com/ckeditor/ckeditor5-ui/commit/4699d8b)) ([d4c5714](https://github.com/ckeditor/ckeditor5-ui/commit/d4c5714)) + +### BREAKING CHANGES + +* The (misspelled) `InputTextView#ariaDesribedById` property is no longer available. Use `ariaDescribedById` instead. + + +## [12.1.0](https://github.com/ckeditor/ckeditor5-ui/compare/v12.0.0...v12.1.0) (April 4, 2019) + +### Features + +* Implemented `ColorGridView` and `ColorTileView` components. See [ckeditor/ckeditor5#1457](https://github.com/ckeditor/ckeditor5/issues/1457). ([6be52b4](https://github.com/ckeditor/ckeditor5-ui/commit/6be52b4)) + +### Bug fixes + +* Fixed `View#render` collision when moving focus from a one editable to the other in multi-root editor. Closes https://github.com/ckeditor/ckeditor5/issues/1676. ([17e86f9](https://github.com/ckeditor/ckeditor5-ui/commit/17e86f9)) + +### Other changes + +* Optimized icons. ([5325ea8](https://github.com/ckeditor/ckeditor5-ui/commit/5325ea8)) +* Updated translations. ([dcdca2e](https://github.com/ckeditor/ckeditor5-ui/commit/dcdca2e)) + + +## [12.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v11.2.0...v12.0.0) (February 28, 2019) + +### Bug fixes + +* Prevented from changing the view document during the render phase. Closes https://github.com/ckeditor/ckeditor5/issues/1530. ([7cf835e](https://github.com/ckeditor/ckeditor5-ui/commit/7cf835e)) +* Fixed memory leaks during editor initialization and destruction (see [ckeditor/ckeditor5#1341](https://github.com/ckeditor/ckeditor5/issues/1341)). ([fd18fb9](https://github.com/ckeditor/ckeditor5-ui/commit/fd18fb9)) + +### Other changes + +* The `class` property should control the DOM class attribute in all UI components. Closes [#450](https://github.com/ckeditor/ckeditor5-ui/issues/450). ([b9b68c6](https://github.com/ckeditor/ckeditor5-ui/commit/b9b68c6)) +* Updated translations. ([b9caee9](https://github.com/ckeditor/ckeditor5-ui/commit/b9caee9)) ([a3afaaa](https://github.com/ckeditor/ckeditor5-ui/commit/a3afaaa)) ([909e676](https://github.com/ckeditor/ckeditor5-ui/commit/909e676)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) +* The `BallonPanelView#className` property was renamed to `#class`. +* The `ToolbarView#className` property was renamed to `#class`. +* The `EditableUIView#externalElement` property (which held the element on which the editor was created if it was explicitly passed) was removed. +* The `EditorUIView#editableElement` property was made private. Use `editor.ui.getEditableElement()` method instead. + + +## [11.2.0](https://github.com/ckeditor/ckeditor5-ui/compare/v11.1.0...v11.2.0) (December 5, 2018) + +### Features + +* Added the `.ck-read-only` CSS class to the `EditableUIView` when `#isReadOnly` is `true`. ([4119822](https://github.com/ckeditor/ckeditor5-ui/commit/4119822)) +* Added the optional `DropdownView#class` property to set a custom CSS class on the main element in DOM. Closes [#447](https://github.com/ckeditor/ckeditor5-ui/issues/447). ([9cdcd4a](https://github.com/ckeditor/ckeditor5-ui/commit/9cdcd4a)) + + Thanks to [@lucasreppewelander](https://github.com/lucasreppewelander)! +* Implemented `LabeledInputView#infoText` to display useful hints next to the input (see [ckeditor/ckeditor5-media-embed#35](https://github.com/ckeditor/ckeditor5-media-embed/issues/35)). ([6ac03ea](https://github.com/ckeditor/ckeditor5-ui/commit/6ac03ea)) +* Implemented configurable, smart `DropdownView` panel positioning. Closes [#123](https://github.com/ckeditor/ckeditor5-ui/issues/123). ([8094f19](https://github.com/ckeditor/ckeditor5-ui/commit/8094f19)) + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([ed88305](https://github.com/ckeditor/ckeditor5-ui/commit/ed88305)) +* Updated translations. ([2e409a9](https://github.com/ckeditor/ckeditor5-ui/commit/2e409a9)) ([611bd04](https://github.com/ckeditor/ckeditor5-ui/commit/611bd04)) ([c6689e4](https://github.com/ckeditor/ckeditor5-ui/commit/c6689e4)) ([07c4fdb](https://github.com/ckeditor/ckeditor5-ui/commit/07c4fdb)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-ui/compare/v11.0.0...v11.1.0) (October 8, 2018) + +### Features + +* Allowed displaying an error message next to the `LabeledInputVIew` (see [ckeditor/ckeditor5-media-embed#1](https://github.com/ckeditor/ckeditor5-media-embed/issues/1)). ([81aaea4](https://github.com/ckeditor/ckeditor5-ui/commit/81aaea4)) + +### Bug fixes + +* Made the `Edit block` string translatable. Closes [#445](https://github.com/ckeditor/ckeditor5-ui/issues/445). ([1fa84e9](https://github.com/ckeditor/ckeditor5-ui/commit/1fa84e9)) + +### Other changes + +* Updated translations. ([baff3c9](https://github.com/ckeditor/ckeditor5-ui/commit/baff3c9)) +* Updated translations. ([e58bcbb](https://github.com/ckeditor/ckeditor5-ui/commit/e58bcbb)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v10.1.0...v11.0.0) (July 18, 2018) + +### Features + +* Implemented the `SwitchButtonView`. Closes [#402](https://github.com/ckeditor/ckeditor5-ui/issues/402). Closes [#403](https://github.com/ckeditor/ckeditor5-ui/issues/403). ([105fbea](https://github.com/ckeditor/ckeditor5-ui/commit/105fbea)) + + Also: + + * Simplified the `ListItemView` class, which is now just a container for `ButtonView` (and others), + * Moved `ListItemView#style` and `#class` to the `ButtonView` (as `#class` and `#labelStyle`), + * Enhanced the `addListToDropdown` utility with a better configuration (`ListDropdownItemDefinition`) and the support for buttons, switch buttons, and separators, + * `.ck-button` and `.ck-list` became `flex` containers; the first one to allow complex inner structures (like the toggle) and the later to take control of complex list items (like `.ck-switchbutton`). + +### Bug fixes + +* The `BalloonToolbar` should hide when the editable is blurred. Closes [#418](https://github.com/ckeditor/ckeditor5-ui/issues/418). ([f6a02d4](https://github.com/ckeditor/ckeditor5-ui/commit/f6a02d4)) +* The `BlockToolbar` should add elements to the `FocusTracker` only after `uiReady` is fired to avoid errors. Closes [#424](https://github.com/ckeditor/ckeditor5-ui/issues/424). ([ae9fa09](https://github.com/ckeditor/ckeditor5-ui/commit/ae9fa09)) +* The `BlockToolbar` should hide when the editor is blurred. Closes [#408](https://github.com/ckeditor/ckeditor5-ui/issues/408). ([e3bbccf](https://github.com/ckeditor/ckeditor5-ui/commit/e3bbccf)) + +### Other changes + +* Allowed list item's buttons to have an outer, visible box-shadow. Ensured the balloon panel's arrow does not cover panel's children. Closes [#394](https://github.com/ckeditor/ckeditor5-ui/issues/394). ([8a64ee2](https://github.com/ckeditor/ckeditor5-ui/commit/8a64ee2)) +* Updated translations. ([949585d](https://github.com/ckeditor/ckeditor5-ui/commit/949585d)) + +### BREAKING CHANGES + +* Most of the `ListItemView` functionality is now handled by the `ButtonView`, +* The API of the `addListToDropdown` has changed; see `ListDropdownItemDefinition` to learn more, +* The `.ck-button` and `.ck-list` classes are using `flex` which may have an impact on rendering. + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-ui/compare/v10.0.0...v10.1.0) (June 21, 2018) + +### Features + +* Implemented list component separators (see [ckeditor/ckeditor5-table#24](https://github.com/ckeditor/ckeditor5-table/issues/24)). ([0808a8c](https://github.com/ckeditor/ckeditor5-ui/commit/0808a8c)) +* Introduced the `BlockToolbar` plugin. Closes [#391](https://github.com/ckeditor/ckeditor5-ui/issues/391). ([5868516](https://github.com/ckeditor/ckeditor5-ui/commit/5868516)) + +### Bug fixes + +* The action should be executed upon the first click of a tooltip-enabled UI in iOS. Closes [ckeditor/ckeditor5#920](https://github.com/ckeditor/ckeditor5/issues/920). ([6508ba2](https://github.com/ckeditor/ckeditor5-ui/commit/6508ba2)) +* The balloon toolbar should be attached correctly in case of a multi-range selection. Closes [#385](https://github.com/ckeditor/ckeditor5-ui/issues/385). ([714ef21](https://github.com/ckeditor/ckeditor5-ui/commit/714ef21)) +* The buttons in the editor should provide basic accessibility. Closes [ckeditor/ckeditor5#1013](https://github.com/ckeditor/ckeditor5/issues/1013). ([9e17d13](https://github.com/ckeditor/ckeditor5-ui/commit/9e17d13)) + +### Other changes + +* Disabling a `ListItemView` should be possible using the `isEnabled` property. Closes [#389](https://github.com/ckeditor/ckeditor5-ui/issues/389). ([76a4d47](https://github.com/ckeditor/ckeditor5-ui/commit/76a4d47)) +* Made the `ContextualBalloon` always use the position of the topmost view in the stack (see: [ckeditor/ckeditor5-table#28](https://github.com/ckeditor/ckeditor5-table/issues/28)). Closes [ckeditor/ckeditor5#900](https://github.com/ckeditor/ckeditor5/issues/900). ([a2ef073](https://github.com/ckeditor/ckeditor5-ui/commit/a2ef073)) +* Updated translations. ([084e8c6](https://github.com/ckeditor/ckeditor5-ui/commit/084e8c6)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([f1e5fbf](https://github.com/ckeditor/ckeditor5-ui/commit/f1e5fbf)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +### Other changes + +* Renamed plural method names to singular. See [ckeditor/ckeditor5#742](https://github.com/ckeditor/ckeditor5/issues/742). ([48cd53d](https://github.com/ckeditor/ckeditor5-ui/commit/48cd53d)) + +### BREAKING CHANGES + +* `View#registerChildren()` and `View#deregisterChildren()` have been renamed to `View#registerChild()` and `View#deregisterChild()`. + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Features + +* Implemented the `IconView#fillColor` observable which fills child `.ck-icon__fill` paths with the color (see [ckeditor/ckeditor5-theme-lark#148](https://github.com/ckeditor/ckeditor5-theme-lark/issues/148)). ([728a691](https://github.com/ckeditor/ckeditor5-ui/commit/728a691)) +* Initial implementation of the `ButtonDropdownView`. Closes [#333](https://github.com/ckeditor/ckeditor5-ui/issues/333). ([6e9c6e4](https://github.com/ckeditor/ckeditor5-ui/commit/6e9c6e4)) + + Also: + + * Allowed vertical layout of the `ToolbarView` thanks to the `#isVertical` attribute. + * Implemented `ToolbarView#className` attribute. + * Implemented `DropdownView#isEnabled` attribute along with the CSS class binding. +* Updated UI components to bring the support for the refreshed Lark theme (see [ckeditor/ckeditor5#645](https://github.com/ckeditor/ckeditor5/issues/645)). ([623d536](https://github.com/ckeditor/ckeditor5-ui/commit/623d536)) + +### Bug fixes + +* Button icon styles should not touch the dropdown's arrow. Closes [ckeditor/ckeditor5#831](https://github.com/ckeditor/ckeditor5/issues/831). ([507549f](https://github.com/ckeditor/ckeditor5-ui/commit/507549f)) + +### Other changes + +* Added a CSS class to the SplitButtonView when the arrow is on (see [ckeditor/ckeditor5-theme-lark#134](https://github.com/ckeditor/ckeditor5-theme-lark/issues/134)). ([d490d61](https://github.com/ckeditor/ckeditor5-ui/commit/d490d61)) +* Added the `.ck-content` CSS class to the `EditableUIView` to simplify styling the editor content. Closes [#176](https://github.com/ckeditor/ckeditor5-ui/issues/176). ([f38ae70](https://github.com/ckeditor/ckeditor5-ui/commit/f38ae70)) +* Align feature class naming to a new scheme. ([1c500f6](https://github.com/ckeditor/ckeditor5-ui/commit/1c500f6)) +* Aligned code to changes (`config.lang` to `config.languages`). Part of the Translation Service v2 ([ckeditor/ckeditor5#624](https://github.com/ckeditor/ckeditor5/issues/624)). ([876f681](https://github.com/ckeditor/ckeditor5-ui/commit/876f681)) +* ComponentFactory.names() will return original component names (instead of normalized names). Closes [#376](https://github.com/ckeditor/ckeditor5-ui/issues/376). ([b6b39d7](https://github.com/ckeditor/ckeditor5-ui/commit/b6b39d7)) +* CSS classes should be prefixed with `ck-` instead of `cke-`. Closes [#112](https://github.com/ckeditor/ckeditor5-ui/issues/112). ([7973f83](https://github.com/ckeditor/ckeditor5-ui/commit/7973f83)) +* Introduced `SplitButtonView` and new dropdown creation helpers (`createDropdown()`, `addListToDropdown()` and `addToolbarToDropdown()`) Closes [#344](https://github.com/ckeditor/ckeditor5-ui/issues/344). Closes [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). ([0f26ca8](https://github.com/ckeditor/ckeditor5-ui/commit/0f26ca8)) +* Migrated the package styles from SASS to PostCSS to bring theme support and avoid duplicates in some editor builds. Closes [#144](https://github.com/ckeditor/ckeditor5-ui/issues/144). Closes [ckeditor/ckeditor5#420](https://github.com/ckeditor/ckeditor5/issues/420). ([f152dfc](https://github.com/ckeditor/ckeditor5-ui/commit/f152dfc)) +* Moved ck-button-icon mixin from ckeditor5-theme-lark. ([8757d27](https://github.com/ckeditor/ckeditor5-ui/commit/8757d27)) +* Removed the `.ck-editor-toolbar` and `.ck-editor-toolbar-container` classes (see [ckeditor/ckeditor5-theme-lark#135](https://github.com/ckeditor/ckeditor5-theme-lark/issues/135)). ([352d056](https://github.com/ckeditor/ckeditor5-ui/commit/352d056)) +* Rename `ContextualToolbar` to `BalloonToolbar`. Closes [ckeditor/ckeditor5#550](https://github.com/ckeditor/ckeditor5/issues/550). ([28f59df](https://github.com/ckeditor/ckeditor5-ui/commit/28f59df)) +* The `closeDropdownOnBlur()` helper should use `clickOutsideHandler()`. Decorated the `View#render()` method. Closes [#311](https://github.com/ckeditor/ckeditor5-ui/issues/311). ([269e97b](https://github.com/ckeditor/ckeditor5-ui/commit/269e97b)) +* Updated translations. ([f657be2](https://github.com/ckeditor/ckeditor5-ui/commit/f657be2)) + +### BREAKING CHANGES + +* Renamed `contextual/contextualtoolbar~ContextualToolbar` to `balloon/balloontoolbar~BalloonToolbar`. +* Renamed `contextualToolbar` configuration option to `balloonToolbar`. +* Removed `DropdownModel` interface – you can use dropdown properties directly now. See [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). +* Removed `createButtonDropdown()` and `ButtonDropdownView`. See [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). +* Removed `createListDropdown()` and `ListDropdownView`. See [#356](https://github.com/ckeditor/ckeditor5-ui/issues/356). +* The DOM structure of the dropdown component has changed. Please refer to the documentation to find out more. +* Basic properties of the balloon panel component (the location of the arrow, the default positions) have changed, which may have an impact on existing integrations. +* The styles are no longer developed in SASS which means the `.scss` files became unavailable. Please refer to the [Theme Customization](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/ui/theme-customization.html) guide to learn more about migration to PostCSS. + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-ui/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Bug fixes + +* `Template#getViews()` generator should not traverse native HTML elements. Closes [#337](https://github.com/ckeditor/ckeditor5-ui/issues/337). Closes [ckeditor/ckeditor5#657](https://github.com/ckeditor/ckeditor5/issues/657). ([894bad0](https://github.com/ckeditor/ckeditor5-ui/commit/894bad0)) +* Improved binding of the `value` attribute in `InputTextView`. Closes [#335](https://github.com/ckeditor/ckeditor5-ui/issues/335). ([823120b](https://github.com/ckeditor/ckeditor5-ui/commit/823120b)) + +### Other changes + +* Implemented `View#render()` method which replaces rendering the `#element` upon the first access and incorporates the `#init()` method functionality. Closes [#262](https://github.com/ckeditor/ckeditor5-ui/issues/262). Closes [#302](https://github.com/ckeditor/ckeditor5-ui/issues/302). ([bf90ad5](https://github.com/ckeditor/ckeditor5-ui/commit/bf90ad5)) + + In other words – the `View#render()` method needs to be called to render a view and it sets the `View#element` itself. It can be called only once and it is done automatically if a view is added to some other view (as its child). If you need to add any additional logic to your component's initialization, then override the `render()` method (and remember to call `super.render()`). + + Additionally, from now on `View#setTemplate()` and `View#extendTemplate()` methods are recommended as a shorthand for `view.template = new Template( { ... } )` and `Template.extend( view.template )`. + + Please refer to the updated [documentation](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/intro.html#ui-library) to learn more. +* Removed legacy `width` and `height` attributes from the `BoxedEditorUIView`. Closes [#25](https://github.com/ckeditor/ckeditor5-ui/issues/25). ([ffa419a](https://github.com/ckeditor/ckeditor5-ui/commit/ffa419a)) +* The `ComponentFactory` should be case-insensitive. Closes [#324](https://github.com/ckeditor/ckeditor5-ui/issues/324). ([94417e9](https://github.com/ckeditor/ckeditor5-ui/commit/94417e9)) +* Updated translations. ([186f365](https://github.com/ckeditor/ckeditor5-ui/commit/186f365)) + +### BREAKING CHANGES + +* The `View#init()` method in UI components has been renamed to `render()`. Please refer to the [documentation](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/architecture/intro.html#UI-library) to learn more. +* The `View#element` is no longer a getter which renders an element when first referenced. Use the `View#render()` method instead. +* `Template#children` property became an `Array` (previously `ViewCollection`). +* `View#addChildren()` and `View#removeChildren()` methods became `#registerChildren()` and `#deregisterChildren()`. +* The DOM structure of the `StickyPanelView` has changed along with the class names. Please refer to the component documentation to learn more. + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-ui/compare/v0.10.0...v1.0.0-alpha.1) (October 3, 2017) + +### Bug fixes + +* `ContextualBalloon` should remember position passed to `#updatePosition()`. Closes [#305](https://github.com/ckeditor/ckeditor5-ui/issues/305). Closes [ckeditor/ckeditor5-image#141](https://github.com/ckeditor/ckeditor5-image/issues/141). ([c787c0d](https://github.com/ckeditor/ckeditor5-ui/commit/c787c0d)) +* `ContextualToolbar` should not be positioned to a zero–width DOM rect when invoked for a multi-line forward selection. Closes [#308](https://github.com/ckeditor/ckeditor5-ui/issues/308). ([00b701b](https://github.com/ckeditor/ckeditor5-ui/commit/00b701b)) +* `ContextualToolbar` will accept the object format of `config.contextualToolbar`. Closes [#316](https://github.com/ckeditor/ckeditor5-ui/issues/316). ([d71cad8](https://github.com/ckeditor/ckeditor5-ui/commit/d71cad8)) +* Fixed sticky panel's `z-index` so it is correctly rendered above images (or other relatively positioned elements). Closes [#315](https://github.com/ckeditor/ckeditor5-ui/issues/315). ([00f2add](https://github.com/ckeditor/ckeditor5-ui/commit/00f2add)) +* The content of the `BalloonPanelView` should be selectable. Closes [#294](https://github.com/ckeditor/ckeditor5-ui/issues/294). Closes https://github.com/ckeditor/ckeditor5/issues/498. ([e5315df](https://github.com/ckeditor/ckeditor5-ui/commit/e5315df)) + +### Features + +* Implemented `View#removeChildren()`, the opposite of `View#addChildren()`. Closes [#303](https://github.com/ckeditor/ckeditor5-ui/issues/303). ([0f1ea5a](https://github.com/ckeditor/ckeditor5-ui/commit/0f1ea5a)) +* Replaced `StickyToolbarView` with a generic `StickyPanelView`. Closes [#297](https://github.com/ckeditor/ckeditor5-ui/issues/297). ([b10b43c](https://github.com/ckeditor/ckeditor5-ui/commit/b10b43c)) + +### Other changes + +* `ToolbarView#fillFromConfig()` will warn when the factory does not provide a component. Closes [#291](https://github.com/ckeditor/ckeditor5-ui/issues/291). Closes [ckeditor/ckeditor5#526](https://github.com/ckeditor/ckeditor5/issues/526). ([2e63e70](https://github.com/ckeditor/ckeditor5-ui/commit/2e63e70)) +* The `escPressHandler` function should be replaced by the `KeystrokeHandler`. Closes [#150](https://github.com/ckeditor/ckeditor5-ui/issues/150). ([b322744](https://github.com/ckeditor/ckeditor5-ui/commit/b322744)) + +### BREAKING CHANGES + +* `Toolbar#fillFromConfig()` cannot be now called with an `undefined`. Make sure to use `normalizeToolbarConfig()` to get a reliable object. +* The `escPressHandler` is no longer available. Please +refer to the `KeystrokeHandler` helper to learn more. +* The `StickyToolbarView` and corresponding CSS `.ck-sticky-panel` classes are no longer available. `StickyPanelView` + `ToolbarView` combo should be used instead. + + +## [0.10.0](https://github.com/ckeditor/ckeditor5-ui/compare/v0.9.0...v0.10.0) (September 3, 2017) + +### Bug fixes + +* `ContextualToolbar` should have proper editor toolbar styling. Closes [#230](https://github.com/ckeditor/ckeditor5-ui/issues/230). ([4e2ee36](https://github.com/ckeditor/ckeditor5-ui/commit/4e2ee36)) +* BalloonPanelView should prevent native #selectstart event. Closes [#243](https://github.com/ckeditor/ckeditor5-ui/issues/243). ([cba3fb1](https://github.com/ckeditor/ckeditor5-ui/commit/cba3fb1)) +* Button tooltip should not look blurry on low-DPI screens. Closes [#142](https://github.com/ckeditor/ckeditor5-ui/issues/142). Closes [#133](https://github.com/ckeditor/ckeditor5-ui/issues/133). ([a497aff](https://github.com/ckeditor/ckeditor5-ui/commit/a497aff)) +* Clicking and dragging in a dropdown panel should not break the selection. Closes [#228](https://github.com/ckeditor/ckeditor5-ui/issues/228). ([6066a09](https://github.com/ckeditor/ckeditor5-ui/commit/6066a09)) +* Contextual toolbar should re–position correctly on window scroll. Closes [#227](https://github.com/ckeditor/ckeditor5-ui/issues/227). ([e5ea25f](https://github.com/ckeditor/ckeditor5-ui/commit/e5ea25f)) +* `DropdownView` should open upon arrow down key press. Closes [#249](https://github.com/ckeditor/ckeditor5-ui/issues/249). ([c1e6afc](https://github.com/ckeditor/ckeditor5-ui/commit/c1e6afc)) +* List items should handle Enter and Space key press when focused. Closes [#153](https://github.com/ckeditor/ckeditor5-ui/issues/153). ([403b64a](https://github.com/ckeditor/ckeditor5-ui/commit/403b64a)) +* The `clickOutsideHandler` helper should use `mousedown` instead of `mouseup` event. Closes [#281](https://github.com/ckeditor/ckeditor5-ui/issues/281). ([6b980b6](https://github.com/ckeditor/ckeditor5-ui/commit/6b980b6)) +* The `Template` class should not throw an error when a child view in the definition has an `id` attribute set without a value. Closes [#289](https://github.com/ckeditor/ckeditor5-ui/issues/289). ([d7072ba](https://github.com/ckeditor/ckeditor5-ui/commit/d7072ba)) +* The `TooltipView` should hide when the `TooltipView#text` is empty. The `ButtonView's` ability to get a tooltip should not be restricted after `View` initialization. Closes [#283](https://github.com/ckeditor/ckeditor5-ui/issues/283). ([1588c82](https://github.com/ckeditor/ckeditor5-ui/commit/1588c82)) +* The dropdown menu should not open using the keyboard when disabled. Closes [#238](https://github.com/ckeditor/ckeditor5-ui/issues/238). ([fc524b8](https://github.com/ckeditor/ckeditor5-ui/commit/fc524b8)) + +### Features + +* `StickyToolbarView` now supports a configurable vertical offset from the top of the page. Closes [#277](https://github.com/ckeditor/ckeditor5-ui/issues/277). ([245f0fa](https://github.com/ckeditor/ckeditor5-ui/commit/245f0fa)) + + Also implemented the `normalizeToolbarConfig()` utility. +* Added `TextInputView#isReadOnly` and `LabeledInputView#isReadOnly` states. Closes [#266](https://github.com/ckeditor/ckeditor5-ui/issues/266). Closes [#268](https://github.com/ckeditor/ckeditor5-ui/issues/268). ([111a728](https://github.com/ckeditor/ckeditor5-ui/commit/111a728)) +* Added optional notification title. Closes [#241](https://github.com/ckeditor/ckeditor5-ui/issues/241). ([abbb68f](https://github.com/ckeditor/ckeditor5-ui/commit/abbb68f)) +* Allowed `BalloonPanelView` position limiter defined as a function. Made `ContextualBalloon` position limiter configurable via `#positionLimiter` property. Closes [#260](https://github.com/ckeditor/ckeditor5-ui/issues/260). ([322563e](https://github.com/ckeditor/ckeditor5-ui/commit/322563e)) +* Implemented placeholder in `InputTextView`. Closes [#220](https://github.com/ckeditor/ckeditor5-ui/issues/220). ([5d91d18](https://github.com/ckeditor/ckeditor5-ui/commit/5d91d18)) +* Introduced `CommandFactory#names()`. Closes [#287](https://github.com/ckeditor/ckeditor5-ui/issues/287). ([4038da2](https://github.com/ckeditor/ckeditor5-ui/commit/4038da2)) + +### Other changes + +* Add support for multiple context elements in the `clickOutsideHandler` helper. Closes [#261](https://github.com/ckeditor/ckeditor5-ui/issues/261). ([9da5bf7](https://github.com/ckeditor/ckeditor5-ui/commit/9da5bf7)) +* Added the `beforeShow` event to the `ContextualToolbar` plugin. Closes [#222](https://github.com/ckeditor/ckeditor5-ui/issues/222). ([835d0ac](https://github.com/ckeditor/ckeditor5-ui/commit/835d0ac)) +* Implemented public `show()` and `hide()` methods in the `ContextualToolbar` plugin. Closes [#263](https://github.com/ckeditor/ckeditor5-ui/issues/263). ([eb4caab](https://github.com/ckeditor/ckeditor5-ui/commit/eb4caab)) +* Improvements in the `BalloonPanelView`–based components for the balloon toolbar editor. Closes [#236](https://github.com/ckeditor/ckeditor5-ui/issues/236). Closes [#234](https://github.com/ckeditor/ckeditor5-ui/issues/234). Closes [#224](https://github.com/ckeditor/ckeditor5-ui/issues/224). ([737b55f](https://github.com/ckeditor/ckeditor5-ui/commit/737b55f)) +* Made the UI component initialization and destruction processes synchronous. Closes [#225](https://github.com/ckeditor/ckeditor5-ui/issues/225). ([07e1502](https://github.com/ckeditor/ckeditor5-ui/commit/07e1502)) +* Made the UI destruction a fail–safe, repeatable process. Closes [#248](https://github.com/ckeditor/ckeditor5-ui/issues/248). ([6f5ec0d](https://github.com/ckeditor/ckeditor5-ui/commit/6f5ec0d)) +* The `ContextualToolbar` should not show up when all child items are disabled. The `ContextualToolbar#beforeShow` event has been replaced by `ContextualToolbar#show`. Closes [#269](https://github.com/ckeditor/ckeditor5-ui/issues/269). Closes [#232](https://github.com/ckeditor/ckeditor5-ui/issues/232). ([d83d07d](https://github.com/ckeditor/ckeditor5-ui/commit/d83d07d)) + +### BREAKING CHANGES + +* `StickyToolbarView#limiterOffset` has been renamed to `StickyToolbarView#limiterBottomOffset`. +* `ContextualToolbar#beforeShow` is no longer available. Please refer to `ContextualToolbar#show` instead. +* The `clickOutsideHandler` helper's `contextElement` configuration option is now an `Array` named `contextElements`. +* `View#init()`, `View#destroy()` (also `ViewCollection#init()`, `ViewCollection#destroy()` and `ViewCollection#add()`) no longer return `Promise`. It may require updates in UI components which inherit from `View` and rely on the value returned by these methods. +* Various UI components switched to synchronous `init()` and `destroy()` (no longer returning `Promise`), which means that features using these components may need some updates to work properly. +* The position names in `BalloonPanelView.defaultPositions` and their results have changed. Please refer to the latest API documentation to learn more. + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-ui/compare/v0.8.0...v0.9.0) (May 7, 2017) + +### Bug fixes + +* `BalloonPanelView` should not be focusable. Closes [#206](https://github.com/ckeditor/ckeditor5-ui/issues/206). ([f9e3bb7](https://github.com/ckeditor/ckeditor5-ui/commit/f9e3bb7)) + + T/206a: BalloonPanelView should not be focusable +* ContextualBalloon plugin should use BalloonPanelView#pin instead of #attachTo. Closes [#192](https://github.com/ckeditor/ckeditor5-ui/issues/192). ([28dd457](https://github.com/ckeditor/ckeditor5-ui/commit/28dd457)) +* ContextualBalloon.view#element should be registered in editor's focus tracker. Closes [#193](https://github.com/ckeditor/ckeditor5-ui/issues/193). ([cfbe329](https://github.com/ckeditor/ckeditor5-ui/commit/cfbe329)) +* FocusCycler should ignore invisible views. Closes [#209](https://github.com/ckeditor/ckeditor5-ui/issues/209). ([b8fbaf1](https://github.com/ckeditor/ckeditor5-ui/commit/b8fbaf1)) + + T/209: FocusCycler should not consider invisible views. +* ViewCollection#destroy should wait for all ViewCollection#add promises to resolve to avoid errors. Closes [#203](https://github.com/ckeditor/ckeditor5-ui/issues/203). ([a7e7c94](https://github.com/ckeditor/ckeditor5-ui/commit/a7e7c94)) + +### Features + +* Added keepAttachedTo() method to the BalloonPanelView. Closes [#170](https://github.com/ckeditor/ckeditor5-ui/issues/170). ([101b465](https://github.com/ckeditor/ckeditor5-ui/commit/101b465)) +* Introduced `ContextualToolbar` plugin. Closes [#182](https://github.com/ckeditor/ckeditor5-ui/issues/182). Closes [#187](https://github.com/ckeditor/ckeditor5-ui/issues/187). ([66a30b1](https://github.com/ckeditor/ckeditor5-ui/commit/66a30b1)) + + Introduced several new positions in `BalloonPanelView#defaultPositions`. Added `className` attribute to the `BalloonPanelView` interface. + + BREAKING CHANGE: Default positions of the `BalloonPanelView` have been renamed. + + BREAKING CHANGE: Class names controlling the arrow of the panel have been renamed. +* Introduced ContextualBalloon plugin for managing contextual balloons. Closes [#134](https://github.com/ckeditor/ckeditor5-ui/issues/134). ([3ceb6a6](https://github.com/ckeditor/ckeditor5-ui/commit/3ceb6a6)) +* Introduced notification plugin. Closes [#189](https://github.com/ckeditor/ckeditor5-ui/issues/189). ([f2dd63f](https://github.com/ckeditor/ckeditor5-ui/commit/f2dd63f)) + +### Other changes + +* Improved ContextualBalloon so it supports asynchronous Views. Closes [#200](https://github.com/ckeditor/ckeditor5-ui/issues/200). ([09067aa](https://github.com/ckeditor/ckeditor5-ui/commit/09067aa)) +* Merged `FloatingPanelView` into `BalloonPanelView`. Closes [#191](https://github.com/ckeditor/ckeditor5-ui/issues/191). ([4b90faa](https://github.com/ckeditor/ckeditor5-ui/commit/4b90faa)) + + BREAKING CHANGE: `FloatingPanelView` is no longer available. + BREAKING CHANGE: `BalloonPanelView#keepAttachedTo()` has been replaced by `pin()`. + BREAKING CHANGE: Default position names in `BalloonPanelView.defaultPositions` have changed. Now prefixed with `arrow_`. +* Updated translations. ([3455fe7](https://github.com/ckeditor/ckeditor5-ui/commit/3455fe7)) + +### BREAKING CHANGES + +* Default positions of the `BalloonPanelView` have been renamed. +* Class names controlling the arrow of the panel have been renamed. +* `FloatingPanelView` is no longer available. +* `BalloonPanelView#keepAttachedTo()` has been replaced by `pin()`. +* Default position names in `BalloonPanelView.defaultPositions` have changed. Now prefixed with `arrow_`. + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-ui/compare/v0.7.1...v0.8.0) (April 5, 2017) + +### Features + +* Allowed marking ListItemView active using the #isActive attribute. Closes [#166](https://github.com/ckeditor/ckeditor5-ui/issues/166). ([a19d6c4](https://github.com/ckeditor/ckeditor5-ui/commit/a19d6c4)) +* Enabled styling via "class" attribute in ListItemView. Closes [#162](https://github.com/ckeditor/ckeditor5-ui/issues/162). ([672bf82](https://github.com/ckeditor/ckeditor5-ui/commit/672bf82)) +* Implemented features necessary for creating inline editors UI: `FloatingPanelView` class, `Template.revert()` method, and `enableToolbarKeyboardFocus()` utility. Closes [#152](https://github.com/ckeditor/ckeditor5-ui/issues/152). ([cb606d7](https://github.com/ckeditor/ckeditor5-ui/commit/cb606d7)) + +### Other changes + +* `ComponentFactory` will throw an error when attempting to create a non-existent component. Closes [#174](https://github.com/ckeditor/ckeditor5-ui/issues/174). ([ef0a7f8](https://github.com/ckeditor/ckeditor5-ui/commit/ef0a7f8)) +* Imported "ck-hidden" CSS class from ckeditor5-theme-lark. Closes [#164](https://github.com/ckeditor/ckeditor5-ui/issues/164). ([486bb22](https://github.com/ckeditor/ckeditor5-ui/commit/486bb22)) +* Moved `ViewCollection#bindTo` method to `Collection` class in `ckeditor5-utils`. Closes [#168](https://github.com/ckeditor/ckeditor5-ui/issues/168). ([5b55987](https://github.com/ckeditor/ckeditor5-ui/commit/5b55987)) +* Updated translations. ([3b27e51](https://github.com/ckeditor/ckeditor5-ui/commit/3b27e51)) + +### BREAKING CHANGES + +* `ViewCollection#bindTo.as` is renamed to `Collection#bindTo.using` when mapping function is a parameter. See the `Collection#bindTo` documentation. +* The `ui/balloonpanel/balloonpanelview` module was renamed to `ui/panel/balloon/balloonpanelview`. See [#152](https://github.com/ckeditor/ckeditor5-ui/issues/152). + + +## [0.7.1](https://github.com/ckeditor/ckeditor5-ui/compare/v0.7.0...v0.8.0) (March 6, 2017) + +### Bug fixes + +* Removed title from the editable element. Fixes [#121](https://github.com/ckeditor/ckeditor5/issues/121). ([71fb3eb](https://github.com/ckeditor/ckeditor5-ui/commit/71fb3eb)) + +### Features + +* Added support for toolbar item separators. Closes [#154](https://github.com/ckeditor/ckeditor5/issues/154). ([f3cb75d](https://github.com/ckeditor/ckeditor5-ui/commit/f3cb75d)) + +### Other changes + +* Uploaded translations. ([67ba32b](https://github.com/ckeditor/ckeditor5-ui/commit/67ba32b)) diff --git a/node_modules/@ckeditor/ckeditor5-ui/LICENSE.md b/node_modules/@ckeditor/ckeditor5-ui/LICENSE.md new file mode 100644 index 0000000..64d4fd8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/LICENSE.md @@ -0,0 +1,21 @@ +Software License Agreement +========================== + +**CKEditor 5 UI framework** – https://github.com/ckeditor/ckeditor5-ui
    +Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +The following libraries are included in CKEditor under the [MIT license](https://opensource.org/licenses/MIT): + +* Lodash - Copyright (c) JS Foundation and other contributors https://js.foundation/. Based on Underscore.js, copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors http://underscorejs.org/. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-ui/README.md b/node_modules/@ckeditor/ckeditor5-ui/README.md new file mode 100644 index 0000000..dc38c86 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/README.md @@ -0,0 +1,20 @@ +CKEditor 5 UI framework +=========================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-ui.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-ui) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements a simple UI framework and CKEditor 5's standard UI library. + +## Demo + +Check out the [editor toolbar demo](https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/toolbar.html#demo) and [block toolbar demo](https://ckeditor.com/docs/ckeditor5/latest/features/toolbar/blocktoolbar.html#demo) in CKEditor 5 documentation. + +## Documentation + +See the [`@ckeditor/ckeditor5-ui` package](https://ckeditor.com/docs/ckeditor5/latest/api/ui.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json new file mode 100644 index 0000000..19ce058 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/ckeditor5-metadata.json @@ -0,0 +1,25 @@ +{ + "plugins": [ + { + "name": "Block toolbar", + "className": "BlockToolbar", + "description": "Provides an additional configurable toolbar on the left-hand side of the content area, next to the selected block element. It comes in handy when the main editor toolbar cannot be accessed.", + "docs": "features/toolbar/blocktoolbar.html", + "path": "src/toolbar/block/blocktoolbar.js" + }, + { + "name": "Accessibility help", + "className": "AccessibilityHelp", + "description": "Displays all editor keyboard shortcuts in a dialog window.", + "docs": "features/accessibility.html", + "path": "src/editorui/accessibilityhelp/accessibilityhelp.js", + "uiComponents": [ + { + "type": "Button", + "name": "accessibilityHelp", + "iconPath": "theme/icons/accessibility.svg" + } + ] + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/contexts.json b/node_modules/@ckeditor/ckeditor5-ui/lang/contexts.json new file mode 100644 index 0000000..46b1513 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/contexts.json @@ -0,0 +1,50 @@ +{ + "Rich Text Editor": "Title of the CKEditor5 editor.", + "Editor editing area: %0": "Accessible label of the specific editing area belonging to a container with an ARIA application role.", + "Edit block": "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)", + "Click to edit block": "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)", + "Drag to move": "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)", + "Next": "Label for a button showing the next thing (tab, page, etc.).", + "Previous": "Label for a button showing the previous thing (tab, page, etc.).", + "Editor toolbar": "Label used by assistive technologies describing a generic editor toolbar.", + "Dropdown toolbar": "Label used by assistive technologies describing a toolbar displayed inside a dropdown.", + "Black": "Label of a button that applies a black color in color pickers.", + "Dim grey": "Label of a button that applies a dim grey color in color pickers.", + "Grey": "Label of a button that applies a grey color in color pickers.", + "Light grey": "Label of a button that applies a light grey color in color pickers.", + "White": "Label of a button that applies a white color in color pickers.", + "Red": "Label of a button that applies a red color in color pickers.", + "Orange": "Label of a button that applies a orange color in color pickers.", + "Yellow": "Label of a button that applies a yellow color in color pickers.", + "Light green": "Label of a button that applies a light green color in color pickers.", + "Green": "Label of a button that applies a green color in color pickers.", + "Aquamarine": "Label of a button that applies a aquamarine color in color pickers.", + "Turquoise": "Label of a button that applies a turquoise color in color pickers.", + "Light blue": "Label of a button that applies a light blue color in color pickers.", + "Blue": "Label of a button that applies a blue color in color pickers.", + "Purple": "Label of a button that applies a purple color in color pickers.", + "Editor block content toolbar": "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs).", + "Editor contextual toolbar": "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret).", + "HEX": "Label of an input field for typing colors in the HEX color format.", + "No results found": "The main text of the message shown to the user when given query does not match any results.", + "No searchable items": "The main text of the message shown to the user when no results are available.", + "Editor dialog": "A default label of a dialog window displayed on top the editor.", + "Close": "The label and the tooltip for the close button in the dialog header.", + "Help Contents. To close this dialog press ESC.": "Accessibility help dialog assistive technologies label telling users how to exit the dialog.", + "Below, you can find a list of keyboard shortcuts that can be used in the editor.": "Accessibility help dialog text explaining what can be found in that dialog.", + "(may require Fn)": "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac.", + "Accessibility": "The label for the button that opens the Accessibility help dialog from the application menu bar.", + "Accessibility help": "Accessibility help dialog title.", + "Press %0 for help.": "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog.", + "Move focus in and out of an active dialog window": "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window.", + "MENU_BAR_MENU_FILE": "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.).", + "MENU_BAR_MENU_EDIT": "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.).", + "MENU_BAR_MENU_VIEW": "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source).", + "MENU_BAR_MENU_INSERT": "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.).", + "MENU_BAR_MENU_FORMAT": "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.).", + "MENU_BAR_MENU_TOOLS": "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.).", + "MENU_BAR_MENU_HELP": "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help).", + "MENU_BAR_MENU_TEXT": "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.).", + "MENU_BAR_MENU_FONT": "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.).", + "Editor menu bar": "The accessible label of the editor menu bar used by assistive technologies." +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/af.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/af.po new file mode 100644 index 0000000..615b48f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/af.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Afrikaans (https://app.transifex.com/ckeditor/teams/11143/af/)\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Wysig" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ar.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ar.po new file mode 100644 index 0000000..ecd178d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ar.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "معالج نصوص" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "منطقة تحرير المحرر: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "كتلة التحرير" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "انقر لتحرير الوحدة التجميعية" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "اسحب للنقل" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "التالي" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "السابق" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "شريط أدوات المحرر" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "شريط أدوات القائمة المنسدلة" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "أسود" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "رمادي خافت" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "رمادي" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "رمادي فاتح" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "أبيض" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "أحمر" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "برتقالي" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "أصفر" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "أخضر فاتح" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "أخضر" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "أخضر زبرجد" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "فيروزي" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "أزرق فاتح" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "أزرق" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "أرجواني" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "شريط المحرر لأدوات كتلة المحتوى" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "شريط المحرر للأدوات السياقية" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "لون سداسي عشري" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "لم يتم العثور على نتائج" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "لا توجد عناصر قابلة للبحث متاحة" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "حوار المحرر" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "إغلاق" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "محتويات التعليمات. لإغلاق هذا الحوار، اضغطْ على مفتاح ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "ستجد أدناه قائمة باختصارات لوحة المفاتيح التي يمكن استخدامها في المحرِّر." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(قد يتطلب مفتاح Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "إمكانية الوصول" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "تعليمات إمكانية الوصول" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "اضغط على %0 للحصول على التعليمات." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "انقلْ التركيز داخل وخارج نافذة الحوار النشطة" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "ملف" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "تحرير" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "عرض" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "إدراج" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "صيغة" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "أدوات" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "مساعدة" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "نص" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "خط" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "شريط قائمة المحرِّر" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ast.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ast.po new file mode 100644 index 0000000..443e2ed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ast.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Asturian (https://app.transifex.com/ckeditor/teams/11143/ast/)\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de testu arriquecíu" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/az.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/az.po new file mode 100644 index 0000000..519f90f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/az.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Redaktoru" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redaktə etmək bloku" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Növbəti" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Əvvəlki" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktorun paneli" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Açılan paneli" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Qara" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tünd boz" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Boz" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Açıq boz" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Ağ" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Qırmızı" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narıncı" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sarı" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Açıq yaşıl" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Yaşıl" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Firuzəyi" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Açıq mavi" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Mavi" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Bənövşəyi" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bg.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bg.po new file mode 100644 index 0000000..2c94a2d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bg.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Богат текстов редактор" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Зона за редактиране на редактора: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Редактирай блок" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Кликнете, за да редактирате блок" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Плъзнете за преместване" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Следващ" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Предишен" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Лента за редакция" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Лента с падащо меню" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Черен" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Тъмно сив" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Сив" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Светло сив" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Бял" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Червен" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Оранжев" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жълт" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Светло зелен" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелен" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамарин" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Тюркоазен" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Светло син" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Син" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Лилав" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Лента с инструменти за блокиране на съдържанието на редактора" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстна лента с инструменти на редактора" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "НЕХ" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Няма намерени резултати" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Няма елементи за търсене" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Диалогов прозорец на редактора" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Затвори" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Помощно съдържание. За да затворите този прозорец, натиснете ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Долу можете да намерите списък от клавишни комбинации, които могат да се използват в редактора." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(може да изисква Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Достъпност" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Помощ за достъпност" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Натиснете %0 за помощ." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Приближаване и отдалечаване на фокуса в активен диалогов прозорец" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Файл" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Редактирай" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Преглед" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Вмъкни" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Формат" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Инструменти" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Помощ" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Текст" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Шрифт" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Редактор на лентата с менюта" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bn.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bn.po new file mode 100644 index 0000000..5a0e707 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bn.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "রিচ টেক্সট এডিটর" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "সম্পাদক সম্পাদনার ক্ষেত্র: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "এডিট ব্লক" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "ব্লক এডিট করতে ক্লিক করুন" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "সরানোর জন্য টেনে আনুন" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "পরবর্তী" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "পূর্ববর্তী" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "সম্পাদক টুলবার" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "ড্রপডাউন টুলবার" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "কালো" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "আবছা ধূসর" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "ধূসর" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "হালকা ধূসর" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "সাদা" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "লাল" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "কমলা" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "হলুদ " + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "হালকা সবুজ" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "সবুজ" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "ফেকাশে সবুজবর্ণ" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "ফিরোজা" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "হালকা নীল" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "নীল " + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "বেগুনি" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "সম্পাদক ব্লক কন্টেন্ট টুলবার" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "সম্পাদক প্রাসঙ্গিক টুলবার" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "কোন ফলাফল পাওয়া যায়নি" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "কোনো অনুসন্ধানযোগ্য আইটেম নেই" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "ইডিটর ডায়ালগ" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "বন্ধ করুন" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "সহায়তাকারী কনটেন্টগুলি। এই ডায়ালগটি বন্ধ করতে ESC প্রেস করুন।" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "এডিটরে ব্যবহার করা যেতে পারে এমন কীবোর্ড শর্টকাটগুলির একটি তালিকা আপনি নিচে দেখতে পাবেন।" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(Fn[] এর প্রয়োজন হতে পারে)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "প্রবেশযোগ্যতা" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "প্রবেশযোগ্যতা জন্য সহায়তা" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "সহায়তার জন্য %0 প্রেস করুন।" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "সক্রিয় ডায়ালগ উইন্ডোর ভিতরে এবং বাইরে ফোকাস স্থানান্তর করুন" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "ফাইল" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "এডিট করুন" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "দেখুন" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "ঢোকান" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "ফরম্যাট" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "টুলস" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "সাহায্য" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "পাঠ্য" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "ফন্ট" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "ইডিটর মেনু বার" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bs.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bs.po new file mode 100644 index 0000000..e11b993 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/bs.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bosnian (https://app.transifex.com/ckeditor/teams/11143/bs/)\n" +"Language: bs\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Uredi" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Umetni" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ca.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ca.po new file mode 100644 index 0000000..7d0484f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ca.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de text enriquit" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Àrea d'edició d'editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editar bloc" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Fes clic per editar el bloc" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Arrossega per moure" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Següent" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra d'eines de l'editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra d'eines desplegable" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negre" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris fosc" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris clar" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Blanc" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermell" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Taronja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Groc" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verd clar" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verd" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aiguamarina" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Blau clar" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blau" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lila" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra d'eines de contingut del bloc de l'editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra d'eines contextual de l'editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Sense resultats" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "No hi ha elements de cerca" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Diàleg de l'editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Tanca" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Continguts d'Ajuda. Per a tancar aquesta finestra premeu ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Sota hi trobareu un llistat de dreceres del teclat que podeu emprar amb aquest editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(pot requerir Fn))" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Accessibilitat" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Ajuda d'accessibilitat" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Premeu %0 per obtenir ajuda." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Canvieu l'engrandiment d'una finestra activa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Arxiu" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Edita" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Visualitza" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Introduir" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Eines" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Ajuda" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Barra de menú del editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/cs.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/cs.po new file mode 100644 index 0000000..c51bc12 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/cs.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Textový editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editační oblast editoru: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Upravit blok" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Kliknutím upravíte blok" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Přesuňte potažením" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Další" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Předchozí" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Panel nástrojů editoru" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Rozbalovací panel nástrojů" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Černá" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tmavě šedá" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Šedá" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Světle šedá" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bílá" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Červená" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžová" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žlutá" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Světle zelená" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelená" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarínová" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tyrkysová" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Světle modrá" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Modrá" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Fialová" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Panel nástrojů obsahu bloku editoru" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontextový panel nástrojů editoru" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nenalezeny žádné výsledky" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Žádné položky k vyhledání" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialog editoru" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Zavřít" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Obsah podpory. Pro zavření tohoto dialogu stiskněte ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Seznam klávesových zkratek, které lze v editoru použít, můžete nalézt níže." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(může vyžadovat Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Přístupnost" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Podpora přístupnosti" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Stiskněte %0 pro podporu" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Přesouvejte zaměření dovnitř a ven z aktivního dialogového okna" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Soubor" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Upravit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Zobrazit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Vložit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formát" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Nástroje" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Nápověda" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Písmo" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Panel nabídek editoru" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/da.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/da.po new file mode 100644 index 0000000..c3543bf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/da.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Wysiwyg editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redigeringsområde: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redigér blok" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Klik for at redigere blok" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Træk for at flytte" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Næste" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Forrige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor værktøjslinje" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown værktøjslinje" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Sort" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dunkel grå" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grå" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Lys grå" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Hvid" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rød" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gyl" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Lys grøn" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grøn" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Marineblå" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Lys blå" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blå" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lilla" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Redigeringskasse indholdsværktøjslinje" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstuel værktøjslinje til redigeringsprogram" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "Hex" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Ingen resultater blev fundet" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Ingen søgbare artikler" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Editor-dialog" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Luk" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Hjælpeindhold. Tryk ESC for at lykke denne dialog." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Nedenfor kan du finde en liste over tastaturgenveje, der kan bruges i editoren." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(kan kræve Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Tilgængelighed" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Tilgængelighedshjælp" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Tryk %0 for at få hjælp." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Flyt fokus ind og ud af et aktivt dialogvindue" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fil" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Rediger" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Vis" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Indsæt" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Værktøjer" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Hjælp" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Editor menulinje" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po new file mode 100644 index 0000000..0e8d98a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/de-ch.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich-Text-Edito" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Bearbeiten" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Einfügen" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/de.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/de.po new file mode 100644 index 0000000..a472091 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/de.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Bearbeitungsbereich des Editors: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Absatz bearbeiten" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Zum Bearbeiten des Blocks klicken" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Zum Verschieben ziehen" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Nächste" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "vorherige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor Werkzeugleiste" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown-Liste Werkzeugleiste" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Schwarz" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dunkelgrau" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grau" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Hellgrau" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Weiß" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rot" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gelb" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Hellgrün" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grün" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarinblau" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Türkis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Hellblau" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blau" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violett" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editor Blockinhalt-Toolbar" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editor kontextuelle Toolbar" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Keine Ergebnisse gefunden" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Keine durchsuchbaren Elemente" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Editor-Dialog" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Schließen" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Hilfe zum Inhalt. Drücken Sie die Esc-Taste, um dieses Dialogfenster zu schließen." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Unten finden Sie eine Liste mit Tastenkombinationen, die im Editor benutzt werden können." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(erfordert gegebenenfalls Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Bedienungshilfen" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Hilfe zur Eingabe" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Drücken Sie %0 für Hilfe." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Fokus auf ein aktives Dialogfenster richten oder aufheben" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Datei" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Bearbeiten" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Anzeigen" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Einfügen" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Werkzeuge" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Hilfe" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Schriftart" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Menüleiste des Editors" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/el.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/el.po new file mode 100644 index 0000000..ef8de60 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/el.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Επεξεργαστής εμπλουτισμένου κειμένου" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Περιοχή επεξεργασίας προγράμματος επεξεργασίας: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Επεξεργασία τμήματος" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Κάντε κλικ για να επεξεργαστείτε το μπλοκ" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Σύρετε για μετακίνηση" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Επόμενο" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Προηγούμενο" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Γραμμή εργαλείων επεξεργαστή" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Γραμμή εργαλείων αναδυόμενου μενού" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Μαύρο" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Θολό γκρι" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Γκρι" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Φωτινό γκρι" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Λευκό" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Κόκκινο" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Πορτοκαλί" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Κίτρινο" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Φωτινό πράσινο" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Πράσινο" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Ακουαμαρίνα" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Τιρκουάζ" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Φωτινό μπλε" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Μπλε" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Πορφυρό" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Γραμμή εργαλείων επεξεργασίας περιεχομένου αποκλεισμού" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Γραμμή εργαλείων επεξεργασίας συμφραζομένων" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "Δεκαεξαδική μορφή χρωμάτων" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Δεν βρέθηκαν αποτελέσματα" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Δεν υπάρχει δυνατότητα αναζήτησης στοιχείων" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Παράθυρο διαλόγου επεξεργαστή" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Κλείσιμο" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Περιεχόμενα βοήθειας. Για να κλείσετε αυτό το παράθυρο διαλόγου, πατήστε ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Παρακάτω, μπορείτε να βρείτε μια λίστα με συντομεύσεις πληκτρολογίου που μπορείτε να χρησιμοποιήσετε στο εργαλείο επεξεργασίας." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(μπορεί να απαιτείται το Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Προσβασιμότητα" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Βοήθεια προσβασιμότητας" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Πατήστε %0 για βοήθεια." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Μετακίνηση της εστίασης από ένα ενεργό παράθυρο διαλόγου" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Αρχείο" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Επεξεργασία" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Προβολή" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Εισαγωγή" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Μορφή" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Εργαλεία" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Βοήθεια" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Κείμενο" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Γραμματοσειρά" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Γραμμή μενού επεξεργαστή" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-au.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-au.po new file mode 100644 index 0000000..cc754be --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-au.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editor editing area: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor toolbar" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown toolbar" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editor block content toolbar" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editor contextual toolbar" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Edit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Insert" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po new file mode 100644 index 0000000..1b06624 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en-gb.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en.po new file mode 100644 index 0000000..ee015bf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/en.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editor editing area: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Click to edit block" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Drag to move" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor toolbar" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown toolbar" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editor block content toolbar" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editor contextual toolbar" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "No results found" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "No searchable items" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Editor dialog" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Close" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Help Contents. To close this dialog press ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Below, you can find a list of keyboard shortcuts that can be used in the editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(may require Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Accessibility" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Accessibility help" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Press %0 for help." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Move focus in and out of an active dialog window" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "File" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Edit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "View" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Insert" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Tools" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Help" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Editor menu bar" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/eo.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/eo.po new file mode 100644 index 0000000..a181ac5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/eo.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Esperanto (https://app.transifex.com/ckeditor/teams/11143/eo/)\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Redaktilo de Riĉa Teksto" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/es-co.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/es-co.po new file mode 100644 index 0000000..ac34fd5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/es-co.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Editar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Insertar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/es.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/es.po new file mode 100644 index 0000000..f98c101 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/es.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de Texto Enriquecido" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edición del editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Cuadro de edición" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Haz clic para editar el bloque" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Arrastra para mover" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Siguiente" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra de herramientas de edición" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de herramientas desplegable" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negro" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris oscuro" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Blanco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rojo" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Naranja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarillo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aguamarina" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Morado" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de herramientas de contenido del bloque del editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de herramientas contextual del editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "No se han encontrado resultados" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "No hay elementos que buscar" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Diálogo del editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Cerrar" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Contenidos de ayuda. Presione ESC para cerrar este cuadro de diálogo." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "A continuación, encontrará una lista de atajos de teclado que se pueden utilizar en el editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(puede requerir Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Accesibilidad" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Ayuda de accesibilidad" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Presione %0 para obtener ayuda." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Mueve el foco dentro y fuera de una ventana de diálogo activa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Archivo" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Editar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Ver" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Insertar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formato" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Herramientas" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Ayuda" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Texto" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Fuente" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Barra de menú del editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/et.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/et.po new file mode 100644 index 0000000..042efb9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/et.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tekstiredaktor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redaktori redigeerimisala: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Muuda plokki" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Ploki muutmiseks klõpsa" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Liigutamiseks lohista" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Järgmine" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Eelmine" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktori tööriistariba" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Avatav tööriistariba" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Must" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tumehall" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Hall" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Helehall" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Valge" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Punane" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranž" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Kollane" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Heleroheline" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Roheline" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamariin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Türkiis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Helesinine" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Sinine" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lilla" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Redigeerija ploki sisu tööriistariba" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Redigeerija kontekstuaalne tööriistariba" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Tulemusi ei leitud" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Tulemusi pole" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Muutja dialoog" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Sulge" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Abistav materjal. Selle dialoogi sulgemiseks vajuta ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Altpoolt leiad redaktoris kasutatavad klahvikombinatsioonid." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(võib vajada klahvi Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Juurdepääsetavus" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Juurdepääsu abi" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Abi saamiseks vajuta %0." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Vii kasutusel dialoogiaken fookuses või mitte" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fail" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Muuda" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Kuva" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Sisesta" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Vorming" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Tööriistad" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Abi" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Redaktori menüüriba" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/eu.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/eu.po new file mode 100644 index 0000000..2e67edb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/eu.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://app.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Testu aberastuaren editorea" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fa.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fa.po new file mode 100644 index 0000000..498b4f7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fa.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "ویرایشگر متن غنی" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "ویرایش قطعه" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "بعدی" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "قبلی" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "نوارابزار ویرایشگر" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "نوارابزار کشویی" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "سیاه" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "خاکستری تیره" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "خاکستری" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "خاکستری روشن" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "سفید" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "قرمز" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "نارنجی" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "زرد" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "سبز روشن" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "سبز" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "زمرد کبود" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "فیروزه ای" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "آبی روشن" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "آبی" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "بنفش" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "ویرایش" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fi.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fi.po new file mode 100644 index 0000000..f50e383 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fi.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rikas tekstieditori" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editorin muokkausalue: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Muokkaa lohkoa" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Muokkaa lohkoa klikkaamalla" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Siirrä raahamalla" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seuraava" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Edellinen" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editorin työkalupalkki" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Pudotusvalikon työkalupalkki" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Musta" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Vaaleanharmaa" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Harmaa" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Vaaleanharmaa" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Valkoinen" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Punainen" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranssi" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Keltainen" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Vaaleanvihreä" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Vihreä" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamariini" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkoosi" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Vaaleansininen" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Sininen" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purppura" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Editorin lohkon sisällön työkalupalkki" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Editorin kontekstuaalinen työkalupalkki" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Tuloksia ei löytynyt" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Ei haettavia nimikkeitä" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Editorin dialogi" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Sulje" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Tukisisältö. Voit sulkea tämän dialogin painamalla ESC-näppäintä." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Ohessa on tässä editointityökalussa käytettävien näppäinoikoteiden lista." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(Saattaa vaatia Fn:n)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Käytettävyys" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Esteettömyystuki" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Paina %0 -näppäintä, jos tarvitset apua." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Siirry lähemmäs ja kauemmas käytössä olevasta dialogi-ikkunasta" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Tiedosto" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Muokkaa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Näytä" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Liitä" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Muoto" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Työkalut" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Tuki" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Teksti" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Fontti" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Muokkaustyökalun valikkopalkki" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fr.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fr.po new file mode 100644 index 0000000..81c06fc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/fr.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Éditeur de texte enrichi" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Zone d'édition de l'éditeur : %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Modifier le bloc" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Cliquer pour modifier le bloc" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Faire glisser pour déplacer" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Suivant" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Précedent" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barre d'outils de l'éditeur" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barre d'outils dans un menu déroulant" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Noir" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris pâle" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris clair" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Blanc" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rouge" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Jaune" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Vert clair" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Vert" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Bleu vert" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Bleu clair" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Bleu" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violet" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barre d'outils du contenu du bloc éditeur" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barre d'outils contextuelle de l'éditeur" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Aucun résultat trouvé" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Aucun élément consultable" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Boîte de dialogue de l'éditeur" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Fermer" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Contenu de l'aide. Pour fermer cette boîte de dialogue, appuyez sur ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Ci-dessous, vous trouverez une liste de raccourcis clavier pouvant être utilisés dans l’éditeur." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(peut nécessiter Fn )" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Accessibilité" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Aide à l'accessibilité" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Appuyez sur %0 pour obtenir de l'aide." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Déplacer le focus vers et hors d'une fenêtre de dialogue active" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fichier" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Éditer" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Afficher" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Insérer" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Outils" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Aide" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Texte" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Police de caractère" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Barre de menu de l'éditeur" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/gl.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/gl.po new file mode 100644 index 0000000..200da3e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/gl.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de texto mellorado" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edición do editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editar bloque" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Prema para editar o bloque" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Arrastre para mover" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seguinte" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra de ferramentas do editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de ferramentas despregábel" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negro" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gris fume" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gris" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gris claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Branco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermello" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Laranxa" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarelo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Augamariña" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Púrpura" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de ferramentas de contido do bloque do editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de ferramentas contextual do editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Non se atoparon resultados" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Non hai elementos que se poidan buscar" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Editar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Inserir" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Texto" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/he.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/he.po new file mode 100644 index 0000000..292b0dc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/he.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "עורך טקסט עשיר" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "אזור עריכה של העורך: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "הגדרות בלוק" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "להקיש לעריכת בלוק" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "לגרור כדי להזיז" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "הבא" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "הקודם" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "סרגל הכלים" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "סרגל כלים נפתח" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "שחור" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "אפור עמום" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "אפור" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "אפור בהיר" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "לבן" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "אדום" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "כתום" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "צהוב" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "ירוק בהיר" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "ירוק" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "ירוק-כחלחל" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "טורקיז" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "כחול בהיר" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "כחול" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "סגול" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "סרגל כלים של תוכן בלוק של העורך" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "סרגל כלים הקשרי של העורך" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "לא נמצאו תוצאות" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "אין פריטים ניתנים לחיפוש" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "חלון דו-שיח של העורך" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "סגור" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "תוכן עזרה. כדי לסגור תיבת דו-שיח זו יש להקיש על ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "להלן, תוכלו למצוא רשימה של קיצורי מקשים בהם ניתן להשתמש בעורך." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(עשוי לדרוש Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "נגישות" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "עזרה בנושא נגישות" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "לחצו על %0 לקבלת עזרה." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "הזזת המיקוד פנימה והחוצה מחלון דו-שיח פעיל" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "קובץ" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "ערוך" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "תצוגה" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "הכנס" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "עיצוב" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "כלים" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "עזרה" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "טקסט" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "גופן" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "שורת התפריטים של העורך" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hi.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hi.po new file mode 100644 index 0000000..845d720 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hi.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "संपादक संपादन क्षेत्र: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edit block" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "ब्लॉक एडिट करने के लिए क्लिक करें" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "मूव करने के लिए ड्रैग करें" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Next" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Previous" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor toolbar" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Dropdown toolbar" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Black" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dim grey" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grey" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Light grey" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "White" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Red" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Yellow" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Light green" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Green" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Light blue" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blue" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purple" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "एडीटर ब्लॉक कंटेंट टूलबार" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "एडीटर कॉन्टेक्स्टूअल टूलबार" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "कोई रिजल्ट नहीं" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "कोई खोजने लायक आइटम नहीं" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "एडिटर डायलॉग" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "बंद करें" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "हेल्प कॉन्टेंट्स. इस डायलॉग को बंद करने के लिए ESC दबाएँ." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "नीचे, आप उन कीबोर्ड शॉर्टकट्स की एक लिस्ट देख सकते हैं जिनका इस्तेमाल एडिटर में किया जा सकता है." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(इसके लिए Fn की ज़रूरत हो सकती है)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "पहुँच" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "एक्सेसिबिलिटी हेल्प" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "हेल्प के लिए %0 दबाएँ." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "एक एक्टिव डायलॉग विंडो में फ़ोकस को अंदर और बाहर मूव करें" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "फाइल" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Edit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "दृश्य" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Insert" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "फॉर्मेट" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "टूल्स" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "हेल्प" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "टेक्स्ट" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "फ़ॉन्ट" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "एडिटर मेनू बार" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hr.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hr.po new file mode 100644 index 0000000..8def174 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hr.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text Editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Područje Editora: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Uredi blok" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Sljedeći" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Prethodni" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Traka uređivača" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Traka padajućeg izbornika" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Crna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tamnosiva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Siva" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Svijetlosiva" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bijela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Crvena" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narančasta" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žuta" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Svijetlozelena" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelena" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tirkizna" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Svijetloplava" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Plava" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ljubičasta" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Alatna traka sadržaja uređivača blokova" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstualna alatna traka uređivača" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Promijeni" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Ubaci" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hu.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hu.po new file mode 100644 index 0000000..d3d0351 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/hu.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Bővített szövegszerkesztő" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Szerkesztő szerkesztési területe: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blokk szerkesztése" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Kattintson a blokk szerkesztéséhez" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Húzza a mozgatáshoz" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Következő" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Előző" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Szerkesztő eszköztár" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Lenyíló eszköztár" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Fekete" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Halvány szürke" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Szürke" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Világosszürke" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Fehér" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Piros" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narancs" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sárga" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Világoszöld" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zöld" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Kékeszöld" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Türkiz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Világoskék" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Kék" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lila" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Szerkesztő - tartalomblokk eszköztár" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Szerkesztő - szövegre vonatkozó eszköztár" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX színkód" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nincs találat" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nincsenek kereshető elemek" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Szerkesztői párbeszédpanel" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Bezárás" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Súgó tartalmak. A párbeszéd ablak bezárásához használd az ESC billentyűt." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Alább megtalálod a szerkesztéshez használható gyorsbillentyűk listáját." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(szükség lehet a Fn használatára)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Elérhetőség" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Kisegítő lehetőségek" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Segítségért nyomd le a %0 billentyűt." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Mozdítsd ki és be az aktív párbeszéd ablakot" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fájl" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Szerkesztés" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Megjelenítés" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Beszúrás" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formátum" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Eszközök" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Súgó" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Szöveg" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Betűtípus" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Szerkesztő menüsora" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/id.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/id.po new file mode 100644 index 0000000..a94dfbb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/id.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor Teks Kaya" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Area edit editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Sunting blok" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Klik untuk mengedit blok" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Seret untuk memindahkan" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Berikutnya" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Sebelumnya" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Alat editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Alat dropdown" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Hitam" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Kelabu gelap" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Kelabu" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Kelabu terang" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Putih" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Merah" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Jingga" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Kuning" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Hijau terang" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Hijau" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Biru laut" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkish" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Biru terang" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Biru" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ungu" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Bilah alat konten blok editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Bilah alat kontekstual editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Hasil tidak ditemukan" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Tidak ada item yang dapat dicari" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialog editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Tutup" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Konten Bantuan. Untuk menutup dialog ini, tekan ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Di bawah ini, Anda dapat menemukan daftar pintasan keyboard yang dapat digunakan di editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(mungkin memerlukan Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Aksesibilitas" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Bantuan aksesibilitas" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Tekan %0 untuk mendapatkan bantuan." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Pindahkan fokus ke dalam dan ke luar jendela dialog yang aktif" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "File" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Ubah" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Lihat" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Sisipkan" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Alat" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Bantuan" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Teks" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Fon" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Bilah menu editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/it.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/it.po new file mode 100644 index 0000000..0b2dadb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/it.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor di testo formattato" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Area di modifica dell'editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Modifica blocco" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Clicca per modificare il blocco" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Trascina per spostare" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Avanti" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Indietro" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra degli strumenti dell'editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra degli strumenti del menu a discesa" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Nero" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Grigio tenue" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grigio" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Grigio chiaro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bianco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rosso" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Arancio" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Giallo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde chiaro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarina" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turchese" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azzurro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blu" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Porpora" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra degli strumenti contestuale dell'editor del blocco" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra degli strumenti contestuale dell'editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nessun risultato trovato" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nessun elemento ricercabile" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Finestra di dialogo dell'editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Chiudi" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Sommario della guida. Per chiudere questa finestra di dialogo premi ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Qui sotto puoi trovare un elenco di scorciatoie da tastiera che possono essere utilizzate nell'editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(può richiedere Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Accessibilità" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Guida all'accessibilità" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Premi %0 per aprire la guida." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Seleziona/deseleziona una finestra di dialogo attiva" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "File" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Modifica" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Vista" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Inserisci" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formato" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Strumenti" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Aiuto" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Testo" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Carattere" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Barra dei menu dell'editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ja.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ja.po new file mode 100644 index 0000000..2cd6d54 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ja.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "リッチテキストエディター" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "エディタ編集エリア:%0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "ブロックを編集" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "クリックしてブロックを編集する" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "ドラッグして動かす" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "次へ" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "前へ" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "エディタツールバー" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "ドロップダウンツールバー" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "黒" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "暗い灰色" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "灰色" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "明るい灰色" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "白" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "赤" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "オレンジ" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "黄" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "明るい緑" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "緑" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "薄い青緑" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "水色" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "明るい青" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "青" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "紫" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "エディター ブロック コンテンツ ツールバー" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "エディター コンテクスト ツールバー" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "結果は見つかりませんでした" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "検索可能なアイテムがありません" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "エディタダイアログ" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "閉じる" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "ヘルプコンテンツです。このダイアログを閉じるには、Escキーを押してください。" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "エディターで使用できるキーボードのショートカット一覧を以下に示します。" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(Fnキーが必要な場合があります)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "アクセシビリティ" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "アクセシビリティに関するヘルプ" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "ヘルプを表示するには%0を押します。" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "フォーカスをアクティブなダイアログウィンドウの内外に移動させる" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "ファイル" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "編集" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "表示" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "挿入" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "形式" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "ツール" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "ヘルプ" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "テキスト" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "フォント" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "エディターメニューバー" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/jv.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/jv.po new file mode 100644 index 0000000..b50cb72 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/jv.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Javanese (https://app.transifex.com/ckeditor/teams/11143/jv/)\n" +"Language: jv\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Ebah" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Tambah" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/km.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/km.po new file mode 100644 index 0000000..afd06fc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/km.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://app.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "កម្មវិធី​កែសម្រួល​អត្ថបទ​សម្បូរបែប" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/kn.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/kn.po new file mode 100644 index 0000000..6a9f912 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/kn.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://app.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "‍ಸಮೃದ್ಧ ಪಠ್ಯ ಸಂಪಾದಕ‍‍" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ko.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ko.po new file mode 100644 index 0000000..7c419ac --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ko.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "서식 있는 텍스트 편집기" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "편집기 편집 영역: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "편집 영역" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "클릭하여 블록 편집" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "드래그하여 이동" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "다음" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "이전" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "편집기 툴바" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "드롭다운 툴바" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "검은색" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "진한 회색" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "회색" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "밝은 회색" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "흰색" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "빨간색" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "주황색" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "노랑색" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "연한 초록색" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "초록색" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "연한 청록색" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "청록색" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "연한 파랑색" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "파랑색" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "보라색" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "편집기 영역 내용 툴바" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "편집기 문맥 툴바" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "결과 찾을 수 없음" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "검색 가능한 항목 없음" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "편집기 대화상자" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "닫기" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "도움말 내용입니다. 이 대화 상자를 닫으려면 ESC 키를 누르세요." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "편집기에서 사용할 수 있는 키보드 단축키 목록을 아래에서 확인할 수 있습니다." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(Fn 키가 필요할 수 있음)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "접근성" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "접근성 도움말" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "도움말을 보려면 %0 키를 누르세요." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "활성화된 대화 창 안팎으로 포커스 이동" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "파일" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "수정" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "보기" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "삽입" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "서식" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "도구" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "도움말" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "텍스트" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "글꼴" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "편집기 메뉴 표시줄" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ku.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ku.po new file mode 100644 index 0000000..b328698 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ku.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "سەرنوسەری دەقی بەپیت" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "دەستکاری بلۆک" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "دواتر" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "پێشتر" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "تووڵامرازی دەسکاریکەر" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "تووڵامرازی لیستەیی" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "ڕەش" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "ڕەساسی تاریک" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "ڕەساسی" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "ڕەساسی ڕووناک" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "سپی" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "سور" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "پرتەقاڵی" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "زەرد" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "سەوزی ڕووناک" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "سەوز" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "شینی دەریایی" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "شینی ئاسمانی" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "شینی ڕووناک" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "شین" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "مۆر" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/lt.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/lt.po new file mode 100644 index 0000000..dc77221 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/lt.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Raiškiojo teksto redaktorius" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redaktoriaus redagavimo sritis: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redaguoti bloką" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Spustelėkite norėdami redaguoti bloką" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Vilkite, kad perkeltumėte" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Kitas" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Buvęs" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktoriaus įrankių juosta" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Įrankių juosta pasirenkamajame sąraše" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Juoda" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Pilkšva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Pilka" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Šviesiai pilka" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Balta" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Raudona" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžinė" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Geltona" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Šviesiai žalia" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Žalia" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarine" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkio" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Šviesiai mėlyna" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Mėlyna" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violetinė" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Redaktoriaus bloko turinio įrankių juosta" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Redaktoriaus kontekstinė įrankių juosta" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "Šešioliktainė reikšmė (angl. HEX)" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nieko nerasta" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nėra paieškos elementų" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Redaktoriaus dialogo langas" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Uždaryti" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Pagalbos turinys. Norėdami uždaryti šį dialogo langą, spauskite „ESC“." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Žemiau galite rasti sparčiųjų klavišų, kuriuos galima naudoti redaktoriuje, sąrašą." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(gali reikalauti Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Prieinamumas" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Prieinamumo pagalba" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Spauskite %0, norėdami gauti pagalbą." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Perkelti fokusą į ir iš aktyvaus dialogo lango" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Failas" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Redaguoti" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Žiūrėti" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Įkelti" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formatuoti" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Įrankiai" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Pagalba" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekstas" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Šriftas" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Redaktoriaus meniu juosta" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/lv.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/lv.po new file mode 100644 index 0000000..22a3950 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/lv.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Bagātinātais Teksta Redaktors" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redaktora rediģēšanas zona: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Labot bloku" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Noklikšķiniet, lai rediģētu sadaļu" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Velciet, lai pārvietotu" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Nākamā" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Iepriekšējā" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktora rīkjosla" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Papildus izvēlnes rīkjosla" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Melns" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Blāvi pelēks" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Pelēks" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gaiši pelēks" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Balts" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Sarkans" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžs" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Dzeltens" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Gaiši zaļš" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zaļš" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarīns" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tirkīza" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Gaiši zils" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Zils" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violets" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Rediģēšanas bloka satura rīkjosla" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Redaktora konteksta rīkjosla" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX Krāsu kods" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nekas nav atrasts" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nav meklējamu vienumu" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Redaktora dialoglodziņš" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Aizvērt" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Palīdzības saturs. Lai aizvērtu šo dialoglodziņu, nospiest ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Zemāk skatīt īsinājumtaustiņu sarakstu, ko var izmantot redaktorā." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(var būt nepieciešams Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Pieejamība" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Piekļūstamības palīdzība" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Lai saņemtu palīdzību, nospiest %0." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Pārvietot fokusu aktīvajā dialoglodziņā un no tā" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fails" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Labot" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Skatīt" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Ievietot" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formāts" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Rīki" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Palīdzība" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Teksts" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Fonts" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Redaktora izvēlņu josla" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ms.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ms.po new file mode 100644 index 0000000..31b5ee8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ms.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Penyunting Teks Kaya" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Ruang suntingan editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Sunting blok" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Klik untuk menyunting sekatan" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Seret untuk menggerakkan" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seterusnya" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Sebelumnya" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Bar alat capaian suntingan" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Bar alat capaian tetingkap" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Hitam" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Kelabu malap" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Kelabu" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Kelabu cerah" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Putih" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Merah" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oren" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Kuning" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Hijau cerah" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Hijau" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akuamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Firus" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Biru cerah" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Biru" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ungu" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Bar alat sekat kandungan editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Bar alat kontekstual editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Tiada keputusan ditemui" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Tiada item untuk dicari" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialog editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Tutup" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Kandungan Bantuan. Untuk menutup dialog ini tekan ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Anda boleh menemui senarai pintasan papan kekunci yang boleh digunakan dalam penyunting di bawah." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(mungkin memerlukan Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Kebolehaksesan" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Bantuan kebolehaksesan" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Tekan %0 untuk bantuan." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Alihkan fokus masuk atau keluar daripada tetingkap dialog aktif" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fail" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Edit" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Paparan" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Masukkan" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Alatan" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Bantuan" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Teks" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Fon" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Bar menu penyunting" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/nb.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/nb.po new file mode 100644 index 0000000..2c3f73b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/nb.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rikteksteditor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ne.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ne.po new file mode 100644 index 0000000..01dbb8c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ne.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "धनी पाठ सम्पादक" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "ब्लक सम्पादन गर्न" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "अर्को" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "अघिल्लो" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "कालो" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "धमिलो खैरो" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "खैरो" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "हल्का खैरो" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "सेतो" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "रातो" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "सुन्तला रंग" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "पहेंलो" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "हल्का हरियो" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "हरियो" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "अव्कवामरिन" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "त्रकोइस" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "हल्का निलो" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "निलो" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "बैंगनी रंग" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/nl.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/nl.po new file mode 100644 index 0000000..823f403 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/nl.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tekstbewerker" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Bewerkingsgebied: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blok aanpassen" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Klik om blok te bewerken" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Sleep om te verplaatsen" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Volgende" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Vorige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Editor welkbalk" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Drop-down werkbalk" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Zwart" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gedimd grijs" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grijs" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Lichtgrijs" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Wit" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rood" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranje" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Geel" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Lichtgroen" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Groen" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Aquamarijn" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquoise" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Lichtblauw" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blauw" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Paars" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Inhoud werkbalk voor editorblok" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Contextuele werkbalk van editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Geen zoekresultaten" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Geen zoekbare items" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialoog bewerker" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Sluiten" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Inhoud Hulp. Druk op ESC om dit dialoogvenster te sluiten." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Hieronder vindt u een lijst met sneltoetsen die in de editor gebruikt kunnen worden." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(Fn-toets is mogelijk vereist)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Toegankelijkheid" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Hulp bij toegankelijkheid" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Druk op %0 voor hulp." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Beweeg de focus naar een actief dialoogvenster of er vandaan" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Bestand" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Wijzigen" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Bekijk" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Invoegen" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formaat" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Gereedschap" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Hulp" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Lettertype" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Menubalk editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/no.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/no.po new file mode 100644 index 0000000..10787b4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/no.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tekstredigeringsverktøy for rik tekst" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Redigeringsområde for redigeringsverktøyet: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Rediger blokk" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Klikk for å redigere blokk" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Dra for å flytte" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Neste" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Forrige" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Verktøylinje for redigeringsverktøy" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Verktøylinje for nedtrekksliste" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Svart" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Svak grå" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grå" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Lysegrå" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Hvit" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rød" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oransje" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gul" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Lysegrønn" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grønn" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkis" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Lyseblå" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blå" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lilla" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Verktøylinje for blokkinnhold i redigeringsverktøy" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Verktøylinje for kontekst i redigeringsverktøy" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Ingen resultater" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Ingen søkbare elementer" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialogboks for redigering" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Lukk" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Hjelpeinnhold. Trykk på ESC for å lukke denne dialogen." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Nedenfor finner du en liste over hurtigtaster som kan brukes i redigeringsverktøyet." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(trenger kanskje Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Tilgjengelighet" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Tilgjengelighetshjelp" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Trykk på %0 for hjelp." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Flytt fokus inn og ut av et aktivt dialogvindu" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fil" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Rediger" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Vis" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Sett inn" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Verktøy" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Hjelp" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Skrifttype" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Menylinje for redigering" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pl.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pl.po new file mode 100644 index 0000000..41efd28 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pl.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Edytor tekstu sformatowanego" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Obszar edycji edytora: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Edytuj blok" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Kliknij, aby edytować blok" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Przeciągnij, aby przenieść" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Następny" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Poprzedni" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Pasek narzędzi edytora" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Rozwijany pasek narzędzi" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Czarny" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Ciemnoszary" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Szary" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Jasnoszary" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Biały" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Czerwony" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Pomarańczowy" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Żółty" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Jasnozielony" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zielony" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akwamaryna" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkusowy" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Jasnoniebieski" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Niebieski" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Purpurowy" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Pasek zadań treści blokowej edytora" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstowy pasek zadań edytora" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "SZESNASTKOWY" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nie znaleziono wyników" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Brak elementów do wyszukania" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Okno edytora" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Zamknij" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Zawartość pomocy. Aby zamknąć to okno dialogowe, naciśnij klawisz ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Poniżej znajdziesz listę skrótów klawiszowych, których można używać w edytorze." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(może wymagać użycia klawisza Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Dostępność" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Pomoc dotycząca dostępności" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Naciśnij %0, aby uzyskać pomoc." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Przenosi fokus do i z aktywnego okna dialogowego" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Plik" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Zmiana" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Zobacz" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Wstaw" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Narzędzia" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Pomoc" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Czcionka" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Pasek menu edytora" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po new file mode 100644 index 0000000..1644508 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt-br.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de Formatação" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edição do editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editor de bloco" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Clicar para editar o bloco" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Arrastar para mover" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Próximo" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Ferramentas do Editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de Ferramentas da Lista Suspensa" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Preto" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Cinza escuro" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Cinza" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Cinza claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Branco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermelho" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Laranja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarelo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Água-marinha" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Púrpura" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de ferramentas de bloco do Editor" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de ferramentas contextual do Editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "Hexadecimal" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nenhum resultado encontrado" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Sem itens pesquisáveis" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Diálogo do editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Fechar" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Conteúdo de Ajuda. Para fechar este diálogo pressione ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Abaixo, você pode encontrar uma lista de atalhos de teclado que podem ser usados no editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(pode requerer Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Acessibilidade" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Ajuda de acessibilidade" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Pressione %0 para ajuda." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Mover o foco para dentro e fora de uma janela de diálogo ativa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Arquivo" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Editar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Visualizar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Inserir" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formato" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Ferramentas" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Ajuda" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Texto" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Fonte" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Barra de menu do editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt.po new file mode 100644 index 0000000..c88c49e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/pt.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de texto avançado" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Área de edição do editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editar bloco" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Clique para editar o bloco" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Arraste para mover" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Seguinte" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Anterior" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Barra de ferramentas do editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Barra de ferramentas do menu pendente" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Preto" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Cinzento-escuro" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Cinzento" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Cinzento-claro" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Branco" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Vermelho" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Laranja" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Amarelo" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde-claro" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Verde-azulado" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turquesa" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Azul-claro" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Azul" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Roxo" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Barra de ferramentas de edição do conteúdo de blocos" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Barra de ferramentas contextual de edição" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nenhum resultado encontrado" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nenhum item pesquisável" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Diálogo do editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Fechar" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Conteúdos de ajuda. Para fechar esta caixa de diálogo, prima ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Abaixo, encontra-se uma lista de atalhos de teclado que podem ser utilizados no editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(pode exigir Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Acessibilidade" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Ajuda de acessibilidade" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Para obter ajuda, pressione %0." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Mover o foco para dentro e para fora de uma janela de diálogo ativa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Ficheiro" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Editar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Visualizar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Inserir" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formatação" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Ferramentas" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Ajuda" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Texto" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Tipo de letra" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Barra de menu do editor" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ro.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ro.po new file mode 100644 index 0000000..5ba9f81 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ro.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor de text" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Zonă editare editor: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Editează bloc" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Faceți clic pentru a edita întreg blocul" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Glisați pentru a muta" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Înainte" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Înapoi" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Bară editor" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Bară listă opțiuni" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Negru" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Gri slab" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gri" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Gri deschis" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Alb" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Roșu" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Portocaliu" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Galben" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Verde deschis" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Verde" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Acvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turcoaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Albastru deschis" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Albastru" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Violet" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Bară de instrumente editor pentru blocuri de conținut" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Bară contextuală de instrumente editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nu au fost găsite rezultate" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nu există elemente ce pot fi căutate" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialog editor" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Închideți" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Conținutul de asistență. Apăsați ESC pentru a închide acest dialog." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Mai jos puteți găsi o listă de comenzi rapide de tastatură care pot fi utilizate în editor." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(poate fi necesar să apăsați Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Accesibilitate" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Ajutor pentru accesibilitate" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Apăsați %0] pentru ajutor." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Comutează focalizarea într-o fereastră de dialog activă și în afara acesteia" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fișier" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Editează" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Vizualizare" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Inserează" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formatare" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Instrumente" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Ajutor" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Bara de meniuri a editorului" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ru.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ru.po new file mode 100644 index 0000000..285f33a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ru.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Редактор" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Область редактирования редактора: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Редактировать блок" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Нажмите, чтобы редактировать блок" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Перетащить" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Следующий" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Предыдущий" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Панель инструментов редактора" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Выпадающая панель инструментов" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Чёрный" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Тёмно-серый" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Серый" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Светло-серый" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Белый" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Красный" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Оранжевый" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жёлтый" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Салатовый" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелёный" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамариновый" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Бирюзовый" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Голубой" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Синий" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Фиолетовый" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Панель инструментов редактора" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстуальная панель инструментов редактора" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Результаты не найдены" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Нет элементов для поиска" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Диалоговое окно редактора" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Закрыть" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Содержание справки. Чтобы закрыть это диалоговое окно, нажмите ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Ниже вы можете найти список сочетаний клавиш, которые можно использовать в редакторе." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(может требовать Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Доступность" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Помощь по специальным возможностям" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Нажмите %0 для получения помощи." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Переместить фокус в активное диалоговое окно и обратно." + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Файл" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Редактировать" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Посмотреть" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Вставить" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Формат" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Инструменты" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Помощь" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Текст" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Шрифт" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Панель меню редактора" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sk.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sk.po new file mode 100644 index 0000000..3b51468 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sk.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Editor s formátovaním" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Oblasť úprav editora: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Upraviť odsek" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Úprava bloku kliknutím" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Potiahnuť a presunúť" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Ďalšie" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Predchádzajúce" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Panel nástrojov editora" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Panel nástrojov roletového menu" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Čierna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Tmavosivá" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Sivá" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Bledosivá" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Biela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Červená" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžová" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žltá" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Bledozelená" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelená" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarínová" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tyrkysová" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Bledomodrá" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Modrá" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Fialová" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Panel s nástrojmi obsahu bloku editora" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontextový panel nástrojov editora" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Neboli nájdené žiadne výsledky" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Žiadne vyhľadávateľné položky" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dialóg editora" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Zatvoriť" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Obsah pomocníka. Toto dialógové okno zavriete klávesom Esc." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Nižšie nájdete zoznam klávesových skratiek, ktoré môžete používať v editore." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(môže si vyžadovať stlačenie klávesu Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Dostupnosť" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Pomoc so zjednodušením ovládania" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Ak potrebujete pomoc, stlačte %0." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Presunúť zameranie z/do aktívneho dialógového okna" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Súbor" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Upraviť" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Zobraziť" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Vložiť" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Formát" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Nástroje" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Pomoc" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Lišta ponuky editora" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sl.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sl.po new file mode 100644 index 0000000..b274271 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sl.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovenian (https://app.transifex.com/ckeditor/teams/11143/sl/)\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Črna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Temno siva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Siva" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Svetlo siva" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Rdeča" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Oranžna" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Rumena" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Svetlo zelena" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelena" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkizna" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Svetlo modra" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Modra" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Vijolična" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sq.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sq.po new file mode 100644 index 0000000..e883a6e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sq.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Redaktues i Tekstit të Pasur" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redakto bllokun" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "E radhës" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Paraprake" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Kokështrirja e redaktuesit" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Zgjero kokështrirjen" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "E zezë" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Ngjyrë hiri" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "E bardhë" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "E kuqe" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Ngjyrë portokalli" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "E verdhë" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "E gjelbër" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "E kaltër" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po new file mode 100644 index 0000000..d327dcd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr-latn.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Prošireni uređivač teksta" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Oblast za uređivanje urednika: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blok uređivač" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Kliknite da biste uredili blok" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Prevucite da biste premestili" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Sledeći" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Prethodni" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Uređivač traka sa alatkama" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Padajuća traka sa alatkama" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Crna" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Bledo siva" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Siva" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Svetlo siva" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Bela" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Crvena" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Narandžasta" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Žuta" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Svetlo zelena" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Zelena" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Zelenkastoplava" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Tirkizna" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Svetloplava" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Plava" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Ljubičasta" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Traka sa alatkama za blokiranje sadržaja uređivača" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Kontekstualna traka sa alatkama Editor" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nije pronađen nijedan rezultat" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nema stavki koje se mogu pretražiti" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Uredi" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Ubaci" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Tekst" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr.po new file mode 100644 index 0000000..ee2a61f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sr.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Проширен уређивач текста" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Област за уређивање уредника: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Блок уређивач" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Kliknite da biste uredili blok" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Prevucite da biste premestili" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Следећи" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Претходни" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Уређивач трака са алаткама" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Падајућа трака са алаткама" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Црна" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Бледо сива" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Сива" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Светло сива" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Бела" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Црвена" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Нараџаста" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жута" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Светлозелена" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелена" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Зеленкастоплава" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Тиркизна" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Светлоплава" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Плава" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Љубичаста" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Трака са алаткама за блокирање садржаја уређивача" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстуална трака са алаткама Едитор" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Nije pronađen nijedan rezultat" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Nema stavki koje se mogu pretražiti" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Dijalog za uređivanje" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Zatvori" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Sadržaji za pomoć. Kako biste zatvorili ovaj dijalog pritisnite taster ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Ispod možete pronaći listu prečica na tastaturi koje se mogu koristiti u uređivaču." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(možda će biti neophodan Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Pristupačnost" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Pomoć oko pristupačnosti" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Pritisni %0 za pomoć." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Pomeri fokus u i van aktivnog prozora dijaloga" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Datoteka" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Уреди" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Prikaži" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Убаци" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Alati" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Pomoć" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Текст" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Font" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Traka menija uređivača" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sv.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sv.po new file mode 100644 index 0000000..5d52dfc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/sv.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Rich Text-editor" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Ordbehandlares redigeringsområde: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Redigera block" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Klicka för att redigera blocket" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Dra för att flytta" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Nästa" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Föregående" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redigeringsverktygsfält" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Rullgardinsverktygsfält" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Svart" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Dunkelgrå" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Grå" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Ljusgrå" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Vit" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Röd" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Orange" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Gul" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Ljusgrön" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Grön" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akvamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkos" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Ljusblå" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Blå" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Lila" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Verktygsfält vid block av innehåll" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Ordbehandlarens kontextuella verktygsfält" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Inga resultat hittades" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Inga sökbara objekt" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Ordbehandlardialog" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Stäng" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Hjälpinnehåll. Tryck på ESC för att stänga dialogrutan." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Nedan hittar du en lista med kortkommandon som kan användas i redigeraren." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(kan kräva Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Tillgänglighet" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Hjälp med tillgänglighet" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Tryck på %0 för hjälp." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Flytta fokus till och från en aktiv dialogruta" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Fil" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Ändra" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Visa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Infoga" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Format" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Verktyg" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Hjälp" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Text" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Teckensnitt" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Menyfält för redigeraren" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/th.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/th.po new file mode 100644 index 0000000..3233900 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/th.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "โปรแกรมแก้ไข Rich Text" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "พื้นที่แก้ไขของตัวแก้ไข: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "แก้ไขบล็อก" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "คลิกเพื่อแก้ไขบล็อก" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "ลากเพื่อย้าย" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "ถัดไป" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "ก่อนหน้า" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "แถบเครื่องมือแก้ไข" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "แถบเครื่องมือแบบเลื่อนลง" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "สีดำ" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "สีเทาเข้ม" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "สีเทา" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "สีเทาอ่อน" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "สีขาว" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "สีแดง" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "สีส้ม" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "สีเหลือง" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "สีเขียวอ่อน" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "สีเขียว" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "พลอยสีฟ้า" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "สีเขียวขุ่น" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "สีฟ้า" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "สีน้ำเงิน" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "สีม่วง" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "แถบเครื่องมือแก้ไขบล็อกเนื้อหา" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "แถบเครื่องมือแก้ไขข้อความ" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "ไม่พบผลลัพธ์" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "ไม่มีรายการที่สามารถค้นหาได้" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "การสนทนาของบรรณาธิการ" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "ปิด" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "เนื้อหาความช่วยเหลือ หากต้องการปิดกล่องโต้ตอบนี้ ให้กดปุ่ม ESC" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "ด้านล่างนี้ คุณจะพบกับรายการแป้นพิมพ์ลัดที่สามารถใช้ในตัวแก้ไขได้" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(อาจจำเป็นต้องมี Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "การเข้าถึง" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "ความช่วยเหลือการเข้าถึง" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "กด %0 เพื่อความช่วยเหลือ" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "ย้ายโฟกัสเข้าและออกจากกล่องโต้ตอบที่ใช้งานอยู่" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "ไฟล์" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "แก้ไข" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "ดู" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "แทรก" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "รูปแบบ" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "เครื่องมือ" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "ช่วยเหลือ" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "ข้อความ" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "แบบอักษร" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "แถบเมนูตัวแก้ไข" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tk.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tk.po new file mode 100644 index 0000000..953878f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tk.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Baý Tekst Redaktory" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Bloky redaktirläň" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Indiki" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Öňki" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Redaktor gurallar paneli" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Açylýan gurallar paneli" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Gara" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Goýy çal" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Çal" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Açyk çal" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Ak" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Gyzyl" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Mämişi" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sary" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Açyk ýaşyl" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Ýaşyl" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akuamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkuaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Açyk gök" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Gök" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Gyrmyzy" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Redaktirläň" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tr.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tr.po new file mode 100644 index 0000000..b2e1db0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tr.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Zengin İçerik Editörü" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Editör düzenleme alanı: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Bloğu Düzenle" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Bloğu düzenlemek için tıkla" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Taşımak için sürükle" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Sonraki" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Önceki" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Düzenleme araç çubuğu" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Açılır araç çubuğu" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Siyah" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Koyu Gri" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Gri" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Açık Gri" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Beyaz" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Kırmızı" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Turuncu" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sarı" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Açık Yeşil" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Yeşil" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Su Yeşili" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkuaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Açık Mavi" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Mavi" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Mor" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Düzenleyici engelleme içerik araç çubuğu" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Düzenleyici içeriksel araç çubuğu" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "ONALTILIK" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Sonuç bulunamadı" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Aranabilir öge yok" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Düzenleyici iletişim kutusu" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Kapat" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Yardım İçerikleri. Bu iletişim kutusunu kapatmak için ESC tuşuna basın." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Aşağıda editörde kullanılabilecek klavye kısayollarının bir listesini bulabilirsiniz." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(Fn gerekebilir)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Erişilebilirlik" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Erişilebilirlik yardımı" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Yardım için %0 tuşuna basın." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Odağı etkin iletişim penceresinin içine ve dışına taşı" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Dosya" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Düzenle" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Görüntüle" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Ekle" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Biçim" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Araçlar" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Yardım" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Metin" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Yazı Tipi" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Düzenleyici menü çubuğu" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tt.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tt.po new file mode 100644 index 0000000..8bb6dee --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/tt.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Tatar (https://app.transifex.com/ckeditor/teams/11143/tt/)\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Кара" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Соры" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Ачык соры" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Ак" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Кызыл" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Кызгылт" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Сары" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Ачык яшел" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Яшел" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамарин" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Фервоз" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Ачык зәңгәр" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Зәңгәр" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Шәмәхә" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Редакцияләү" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ug.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ug.po new file mode 100644 index 0000000..ca618ab --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ug.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "تېكىست تەھرىرلىگۈچ" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "تەھرىرلىگۈچ تەھرىرلەش رايونى: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "بۆلەك تەھرىر" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "چېكىلسە بۆلەك تەھرىرلىنىدۇ" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "يۆتكەشتە سۆرىلىدۇ" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "كېيىنكى" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "ئالدىنقى" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "تەھرىرلىگۈچ قورال بالداق" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "سىرىلما قورال بالداق" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "قارا" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "سۇس كۈلرەڭ" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "كۈلرەڭ" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "ئوچۇق كۈلرەڭ" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "ئاق" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "قىزىل" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "قىزغۇچ سېرىق" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "سېرىق" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "ئوچۇق يېشىل" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "يېشىل" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "دېڭىز كۆكى" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "ئوچۇق كۆك" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "كۆك" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "بىنەپشە" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "تەھرىرلىگۈچ بۆلىكى مەزمۇن قورال بالداق" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "تەھرىرلىگۈچ مەزمۇن قورال بالداق" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "ھېچقانداق نەتىجە تېپىلمىدى" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "ئىزدىگۈدەك تۈر يوق" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "تەھرىرلەش" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "قىستۇر" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/uk.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/uk.po new file mode 100644 index 0000000..4ba2217 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/uk.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Розширений текстовий редактор" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Область редагування редактора: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Редагувати блок" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Клацніть, щоб редагувати блок" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Потягніть, щоб перемістити" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Наступний" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Попередній" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Панель інструментів редактора" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Випадаюча панель інструментів" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Чорний" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Темно-сірий" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Сірий" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Світло-сірий" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Білий" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Червоний" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Помаранчевий" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Жовтий" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Світло-зелений" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Зелений" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Аквамариновий" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Бірюзовий" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Світло-синій" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Синій" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Фіолетовий" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Панель інструментів вмісту блоку редактора" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Контекстна панель інструментів редактора" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "Шістнадцятковий" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Нічого не знайдено" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Немає шуканих об'єктів" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Діалогове вікно редактора" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Закрити" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Зміст довідки. Щоб закрити це діалогове вікно, натисніть ESC." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Нижче ви можете знайти список комбінацій клавіш, які можна використовувати в редакторі." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(може вимагати Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Доступність" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Довідка щодо доступності" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Натисніть %0 для довідки." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Переміщення фокуса в активному діалоговому вікні та з нього" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Файл" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Редагувати" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Представлення" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Вставити" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Формат" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Інструменти" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Допомога" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Текст" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Шрифт" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Рядок меню редагування" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ur.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ur.po new file mode 100644 index 0000000..5a512dd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/ur.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "خانۂ ترمیم" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "رقبہ خانۂ ترمیم: 0%" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "خانہ کی تدوین" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "اگلا" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "پچھلا" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "ایڈیٹر آلہ جات" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "آلہ جات برائے فہرست " + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "سیاہ" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "پھیکا سرمئی" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "سرمئی" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "ہلکا سرمئی" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "سفید" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "سرخ" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "نارنجی" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "پیلا" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "ہلکا سبز" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "سبز" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "نیلگوں بلور" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "فیروزی" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "ہلکا نیلا" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "نیلا" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "ارغوانی" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "ترمیم" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/uz.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/uz.po new file mode 100644 index 0000000..cc45cd2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/uz.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Tahrirlovchi" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Blokni tahrirlash" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Keyingi" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Oldingi" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Tahrirlovchi asboblar paneli" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Ochiladigan asboblar paneli" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Qora" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "To'q kulrang" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Kulrang" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Och kulrang" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Oq" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Qizil" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "To'q sariq" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Sariq" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Och yashil" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Yashil" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Akuamarin" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Turkuaz" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Moviy" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Ko'k" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Siyohrang" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Kiritish" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/vi.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/vi.po new file mode 100644 index 0000000..1bf6b97 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/vi.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "Trình soạn thảo văn bản" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "Vùng chỉnh sửa của trình chỉnh sửa: %0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "Chỉnh sửa đoạn" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "Nhấp để sửa khối" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "Kéo để di chuyển" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "Tiếp theo" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "Quay lại" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "Thanh công cụ biên tập" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "Thanh công cụ danh mục" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "Đen" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "Xám mờ" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "Xám" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "Xám nhạt" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "Trắng" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "Đỏ" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "Cam" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "Vàng" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "Xanh lá nhạt" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "Xanh lá" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "Xanh ngọc biển" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "Xanh ngọc bích" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "Xanh dương" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "Xanh biển" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "Tím" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "Thanh công cụ chỉnh sửa khối nội dung" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "Thanh công cụ chỉnh sửa theo ngữ cảnh" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "HEX" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "Không tìm thấy kết quả" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "Không có mục nào tìm kiếm được" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "Hộp thoại trình biên tập" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "Đóng" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "Nội dung Trợ giúp. Nhấn phím ESC để đóng hộp thoại này." + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "Dưới đây, bạn có thể tìm thấy danh sách các phím tắt mà bạn có thể dùng trong trình biên tập này." + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(có thể cần nhấn phím Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "Trợ năng" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "Trợ giúp về khả năng truy cập" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "Nhấn %0 để được trợ giúp." + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "Di chuyển tiêu điểm vào và ra khỏi cửa sổ hộp thoại đang kích hoạt" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "Tệp" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "Chỉnh sửa" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "Xem" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "Chèn" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "Định dạng" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "Công cụ" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "Trợ giúp" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "Văn bản" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "Phông chữ" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "Thanh menu Trình soạn thảo" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po new file mode 100644 index 0000000..c13c783 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh-cn.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "富文本编辑器" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "编辑器编辑区域:%0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "编辑框" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "单击以编辑块" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "拖拽以移动" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "下一步" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "上一步" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "编辑器工具栏" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "下拉工具栏" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "黑色" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "暗灰色" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "灰色" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "浅灰色" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "白色" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "红色" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "橙色" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "黄色" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "浅绿色" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "绿色" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "海蓝色" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "青色" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "浅蓝色" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "蓝色" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "紫色" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "编辑器块内容工具栏" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "编辑器上下文工具栏" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "十六进制" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "未找到结果" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "没有可搜索的项目" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "编辑器对话框" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "关闭" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "帮助内容。要关闭此对话框,请按 ESC 键。" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "您可以在下方找到可在编辑器中使用的键盘快捷键列表。" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(可能需要用到 Fn键)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "可访问性" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "无障碍辅助功能帮助" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "按 %0 获取帮助。" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "将焦点移入或移出活跃的对话框窗口" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "文件" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "编辑" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "查看" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "插入" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "格式" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "工具" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "帮助" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "文本" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "字体" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "编辑器菜单栏" diff --git a/node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh.po b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh.po new file mode 100644 index 0000000..05ff882 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/lang/translations/zh.po @@ -0,0 +1,210 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Title of the CKEditor5 editor." +msgid "Rich Text Editor" +msgstr "富文本編輯器" + +msgctxt "Accessible label of the specific editing area belonging to a container with an ARIA application role." +msgid "Editor editing area: %0" +msgstr "編輯器編輯區:%0" + +msgctxt "Label of the block toolbar icon (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Edit block" +msgstr "編輯區塊" + +msgctxt "First part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Click to edit block" +msgstr "點擊來編輯區塊" + +msgctxt "Second part of the label of the block toolbar icon when functionality of drag and drop is available (a block toolbar is displayed next to each paragraph, heading, list item, etc. and contains e.g. block formatting options)" +msgid "Drag to move" +msgstr "拖曳來移動" + +msgctxt "Label for a button showing the next thing (tab, page, etc.)." +msgid "Next" +msgstr "下一" + +msgctxt "Label for a button showing the previous thing (tab, page, etc.)." +msgid "Previous" +msgstr "上一" + +msgctxt "Label used by assistive technologies describing a generic editor toolbar." +msgid "Editor toolbar" +msgstr "編輯器工具" + +msgctxt "Label used by assistive technologies describing a toolbar displayed inside a dropdown." +msgid "Dropdown toolbar" +msgstr "下拉選單" + +msgctxt "Label of a button that applies a black color in color pickers." +msgid "Black" +msgstr "黑色" + +msgctxt "Label of a button that applies a dim grey color in color pickers." +msgid "Dim grey" +msgstr "淡灰色" + +msgctxt "Label of a button that applies a grey color in color pickers." +msgid "Grey" +msgstr "灰色" + +msgctxt "Label of a button that applies a light grey color in color pickers." +msgid "Light grey" +msgstr "亮灰色" + +msgctxt "Label of a button that applies a white color in color pickers." +msgid "White" +msgstr "白色" + +msgctxt "Label of a button that applies a red color in color pickers." +msgid "Red" +msgstr "紅色" + +msgctxt "Label of a button that applies a orange color in color pickers." +msgid "Orange" +msgstr "橘色" + +msgctxt "Label of a button that applies a yellow color in color pickers." +msgid "Yellow" +msgstr "黃色" + +msgctxt "Label of a button that applies a light green color in color pickers." +msgid "Light green" +msgstr "亮綠色" + +msgctxt "Label of a button that applies a green color in color pickers." +msgid "Green" +msgstr "綠色" + +msgctxt "Label of a button that applies a aquamarine color in color pickers." +msgid "Aquamarine" +msgstr "淺綠色" + +msgctxt "Label of a button that applies a turquoise color in color pickers." +msgid "Turquoise" +msgstr "藍綠色" + +msgctxt "Label of a button that applies a light blue color in color pickers." +msgid "Light blue" +msgstr "亮藍色" + +msgctxt "Label of a button that applies a blue color in color pickers." +msgid "Blue" +msgstr "藍色" + +msgctxt "Label of a button that applies a purple color in color pickers." +msgid "Purple" +msgstr "紫色" + +msgctxt "Accessible label of a toolbar that shows up next to the blocks of content (e.g. headings, paragraphs)." +msgid "Editor block content toolbar" +msgstr "編輯器區塊內容工具列" + +msgctxt "Accessible label of a balloon toolbar that shows up right next to the user selection (the caret)." +msgid "Editor contextual toolbar" +msgstr "編輯器關聯式工具列" + +msgctxt "Label of an input field for typing colors in the HEX color format." +msgid "HEX" +msgstr "十六進位" + +msgctxt "The main text of the message shown to the user when given query does not match any results." +msgid "No results found" +msgstr "找不到結果" + +msgctxt "The main text of the message shown to the user when no results are available." +msgid "No searchable items" +msgstr "沒有可搜尋的項目" + +msgctxt "A default label of a dialog window displayed on top the editor." +msgid "Editor dialog" +msgstr "編輯工具對話框" + +msgctxt "The label and the tooltip for the close button in the dialog header." +msgid "Close" +msgstr "關閉" + +msgctxt "Accessibility help dialog assistive technologies label telling users how to exit the dialog." +msgid "Help Contents. To close this dialog press ESC." +msgstr "協助內容。想關閉此對話框,請按 ESC 鍵。" + +msgctxt "Accessibility help dialog text explaining what can be found in that dialog." +msgid "Below, you can find a list of keyboard shortcuts that can be used in the editor." +msgstr "下方是可在編輯器中使用的鍵盤快捷鍵列表。" + +msgctxt "Accessibility help dialog text displayed next to keystrokes that may require the Fn key on Mac." +msgid "(may require Fn)" +msgstr "(可能需要 Fn)" + +msgctxt "The label for the button that opens the Accessibility help dialog from the application menu bar." +msgid "Accessibility" +msgstr "協助工具" + +msgctxt "Accessibility help dialog title." +msgid "Accessibility help" +msgstr "無障礙協助" + +msgctxt "Assistive technologies label added to each editor editing area informing users about the possibility of opening the accessibility help dialog." +msgid "Press %0 for help." +msgstr "按下 %0 來取得協助。" + +msgctxt "Keystroke description for assistive technologies: keystroke for moving focus out of an active dialog window." +msgid "Move focus in and out of an active dialog window" +msgstr "將焦點移入或移出啟用中的對話視窗" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the whole document (e.g. export to PDF, import from Word, etc.)." +msgid "MENU_BAR_MENU_FILE" +msgstr "檔案" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to general editing (e.g. undo, redo, select all, etc.)." +msgid "MENU_BAR_MENU_EDIT" +msgstr "編輯" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to the view of the editor (e.g. show source)." +msgid "MENU_BAR_MENU_VIEW" +msgstr "檢視" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features that insert content (e.g. insert table, insert image, etc.)." +msgid "MENU_BAR_MENU_INSERT" +msgstr "插入" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features related to content formatting (e.g. bold, font color, heading, etc.)." +msgid "MENU_BAR_MENU_FORMAT" +msgstr "格式" + +msgctxt "The label of the top-level application menu bar menu containing various editor tools (e.g. AI assistant, track changes, etc.)." +msgid "MENU_BAR_MENU_TOOLS" +msgstr "工具" + +msgctxt "The label of the top-level application menu bar menu containing buttons and features helping users to learn about the editor (e.g. accessibility help)." +msgid "MENU_BAR_MENU_HELP" +msgstr "說明" + +msgctxt "The label of the application menu bar menu containing buttons and features that apply formatting to a text (e.g. bold, italic, etc.)." +msgid "MENU_BAR_MENU_TEXT" +msgstr "文字" + +msgctxt "The label of the application menu bar menu containing buttons and features that control the font of the edited content (e.g. font size, font color, etc.)." +msgid "MENU_BAR_MENU_FONT" +msgstr "字型" + +msgctxt "The accessible label of the editor menu bar used by assistive technologies." +msgid "Editor menu bar" +msgstr "編輯器選單列" diff --git a/node_modules/@ckeditor/ckeditor5-ui/package.json b/node_modules/@ckeditor/ckeditor5-ui/package.json new file mode 100644 index 0000000..1cf3c76 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/package.json @@ -0,0 +1,40 @@ +{ + "name": "@ckeditor/ckeditor5-ui", + "version": "41.3.1", + "description": "The UI framework and standard UI library of CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-lib", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1", + "color-convert": "2.0.1", + "color-parse": "1.4.2", + "lodash-es": "4.17.21", + "vanilla-colorful": "0.7.2" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-ui" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.d.ts new file mode 100644 index 0000000..b2ed16d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.d.ts @@ -0,0 +1,98 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/arialiveannouncer + */ +import type { Editor } from '@ckeditor/ckeditor5-core'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +import type ViewCollection from './viewcollection.js'; +import View from './view.js'; +import '../theme/components/arialiveannouncer/arialiveannouncer.css'; +/** + * The politeness level of an `aria-live` announcement. + * + * Available keys are: + * * `AriaLiveAnnouncerPoliteness.POLITE`, + * * `AriaLiveAnnouncerPoliteness.ASSERTIVE` + * + * [Learn more](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions#Politeness_levels). + */ +export declare const AriaLiveAnnouncerPoliteness: { + readonly POLITE: "polite"; + readonly ASSERTIVE: "assertive"; +}; +/** + * An accessibility helper that manages all ARIA live regions associated with an editor instance. ARIA live regions announce changes + * to the state of the editor features. + * + * These announcements are consumed and propagated by screen readers and give users a better understanding of the current + * state of the editor. + * + * To announce a state change to an editor feature named `'Some feature'`, use the {@link #announce} method: + * ```ts + * editor.ui.ariaLiveAnnouncer.announce( 'Some feature', 'Text of an announcement.' ); + * ``` + */ +export default class AriaLiveAnnouncer { + /** + * The editor instance. + */ + readonly editor: Editor; + /** + * The view that aggregates all `aria-live` regions. + */ + view?: AriaLiveAnnouncerView; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * Sets an announcement text to an aria region associated with a specific editor feature. The text is then + * announced by a screen reader to the user. + * + * If the aria region of a given name does not exist, it will be created and can be re-used later. The name of the region + * groups announcements originating from a specific editor feature and does not get announced by a screen reader. + * + * Using multiple regions allows for many announcements to be emitted in a short period of time. Changes to ARIA-live announcements + * are captured by a screen reader and read out in the order they were emitted. + * + * The default announcement politeness level is `'polite'`. + * + * ```ts + * // Most screen readers will queue announcements from multiple aria-live regions and read them out in the order they were emitted. + * editor.ui.ariaLiveAnnouncer.announce( 'image', 'Image uploaded.' ); + * editor.ui.ariaLiveAnnouncer.announce( 'network', 'Connection lost. Reconnecting.' ); + * ``` + */ + announce(regionName: string, announcementText: string, politeness?: typeof AriaLiveAnnouncerPoliteness[keyof typeof AriaLiveAnnouncerPoliteness]): void; +} +/** + * The view that aggregates all `aria-live` regions. + */ +export declare class AriaLiveAnnouncerView extends View { + /** + * A collection of all views that represent individual `aria-live` regions. + */ + readonly regionViews: ViewCollection; + constructor(locale: Locale); +} +/** + * The view that represents a single `aria-live` region (e.g. for a specific editor feature) and its text. + */ +export declare class AriaLiveAnnouncerRegionView extends View { + /** + * Current text of the region. + */ + text: string; + /** + * Current politeness level of the region. + */ + politeness: typeof AriaLiveAnnouncerPoliteness[keyof typeof AriaLiveAnnouncerPoliteness]; + /** + * A unique name of the region, usually associated with a specific editor feature or system. + */ + regionName: string; + constructor(locale: Locale); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.js b/node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.js new file mode 100644 index 0000000..661c090 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/arialiveannouncer.js @@ -0,0 +1,116 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import View from './view.js'; +import '../theme/components/arialiveannouncer/arialiveannouncer.css'; +/** + * The politeness level of an `aria-live` announcement. + * + * Available keys are: + * * `AriaLiveAnnouncerPoliteness.POLITE`, + * * `AriaLiveAnnouncerPoliteness.ASSERTIVE` + * + * [Learn more](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions#Politeness_levels). + */ +export const AriaLiveAnnouncerPoliteness = { + POLITE: 'polite', + ASSERTIVE: 'assertive' +}; +/** + * An accessibility helper that manages all ARIA live regions associated with an editor instance. ARIA live regions announce changes + * to the state of the editor features. + * + * These announcements are consumed and propagated by screen readers and give users a better understanding of the current + * state of the editor. + * + * To announce a state change to an editor feature named `'Some feature'`, use the {@link #announce} method: + * ```ts + * editor.ui.ariaLiveAnnouncer.announce( 'Some feature', 'Text of an announcement.' ); + * ``` + */ +export default class AriaLiveAnnouncer { + /** + * @inheritDoc + */ + constructor(editor) { + this.editor = editor; + } + /** + * Sets an announcement text to an aria region associated with a specific editor feature. The text is then + * announced by a screen reader to the user. + * + * If the aria region of a given name does not exist, it will be created and can be re-used later. The name of the region + * groups announcements originating from a specific editor feature and does not get announced by a screen reader. + * + * Using multiple regions allows for many announcements to be emitted in a short period of time. Changes to ARIA-live announcements + * are captured by a screen reader and read out in the order they were emitted. + * + * The default announcement politeness level is `'polite'`. + * + * ```ts + * // Most screen readers will queue announcements from multiple aria-live regions and read them out in the order they were emitted. + * editor.ui.ariaLiveAnnouncer.announce( 'image', 'Image uploaded.' ); + * editor.ui.ariaLiveAnnouncer.announce( 'network', 'Connection lost. Reconnecting.' ); + * ``` + */ + announce(regionName, announcementText, politeness = AriaLiveAnnouncerPoliteness.POLITE) { + const editor = this.editor; + if (!this.view) { + this.view = new AriaLiveAnnouncerView(editor.locale); + editor.ui.view.body.add(this.view); + } + let regionView = this.view.regionViews.find(view => view.regionName === regionName); + if (!regionView) { + regionView = new AriaLiveAnnouncerRegionView(this.view.locale); + this.view.regionViews.add(regionView); + } + regionView.set({ + regionName, + text: announcementText, + politeness + }); + } +} +/** + * The view that aggregates all `aria-live` regions. + */ +export class AriaLiveAnnouncerView extends View { + constructor(locale) { + super(locale); + this.regionViews = this.createCollection(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-aria-live-announcer' + ] + }, + children: this.regionViews + }); + } +} +/** + * The view that represents a single `aria-live` region (e.g. for a specific editor feature) and its text. + */ +export class AriaLiveAnnouncerRegionView extends View { + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + this.set('regionName', ''); + this.set('text', ''); + this.set('politeness', AriaLiveAnnouncerPoliteness.POLITE); + this.setTemplate({ + tag: 'div', + attributes: { + role: 'region', + 'data-region': bind.to('regionName'), + 'aria-live': bind.to('politeness') + }, + children: [ + { text: bind.to('text') } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/augmentation.d.ts new file mode 100644 index 0000000..bc5adee --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/augmentation.d.ts @@ -0,0 +1,88 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { BalloonToolbar, BlockToolbar, ContextualBalloon, Notification, Dialog, AccessibilityHelp } from './index.js'; +import type { ToolbarConfig } from '@ckeditor/ckeditor5-core'; +declare module '@ckeditor/ckeditor5-core' { + interface EditorConfig { + /** + * Contextual toolbar configuration. Used by the {@link module:ui/toolbar/balloon/balloontoolbar~BalloonToolbar} + * feature. + * + * ## Configuring toolbar items + * + * ```ts + * const config = { + * balloonToolbar: [ 'bold', 'italic', 'undo', 'redo' ] + * }; + * ``` + * + * You can also use `'|'` to create a separator between groups of items: + * + * ```ts + * const config = { + * balloonToolbar: [ 'bold', 'italic', '|', 'undo', 'redo' ] + * }; + * ``` + * + * Read also about configuring the main editor toolbar in {@link module:core/editor/editorconfig~EditorConfig#toolbar}. + * + * ## Configuring items grouping + * + * You can prevent automatic items grouping by setting the `shouldNotGroupWhenFull` option: + * + * ```ts + * const config = { + * balloonToolbar: { + * items: [ 'bold', 'italic', 'undo', 'redo' ], + * shouldNotGroupWhenFull: true + * }, + * }; + * ``` + */ + balloonToolbar?: ToolbarConfig; + /** + * The block toolbar configuration. Used by the {@link module:ui/toolbar/block/blocktoolbar~BlockToolbar} + * feature. + * + * ```ts + * const config = { + * blockToolbar: [ 'paragraph', 'heading1', 'heading2', 'bulletedList', 'numberedList' ] + * }; + * ``` + * + * You can also use `'|'` to create a separator between groups of items: + * + * ```ts + * const config = { + * blockToolbar: [ 'paragraph', 'heading1', 'heading2', '|', 'bulletedList', 'numberedList' ] + * }; + * ``` + * + * ## Configuring items grouping + * + * You can prevent automatic items grouping by setting the `shouldNotGroupWhenFull` option: + * + * ```ts + * const config = { + * blockToolbar: { + * items: [ 'paragraph', 'heading1', 'heading2', '|', 'bulletedList', 'numberedList' ], + * shouldNotGroupWhenFull: true + * }, + * }; + * ``` + * + * Read more about configuring the main editor toolbar in {@link module:core/editor/editorconfig~EditorConfig#toolbar}. + */ + blockToolbar?: ToolbarConfig; + } + interface PluginsMap { + [BalloonToolbar.pluginName]: BalloonToolbar; + [BlockToolbar.pluginName]: BlockToolbar; + [ContextualBalloon.pluginName]: ContextualBalloon; + [Dialog.pluginName]: Dialog; + [Notification.pluginName]: Notification; + [AccessibilityHelp.pluginName]: AccessibilityHelp; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-ui/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.d.ts new file mode 100644 index 0000000..41abc52 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.d.ts @@ -0,0 +1,81 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/autocomplete/autocompleteview +*/ +import { type PositioningFunction, type Locale } from '@ckeditor/ckeditor5-utils'; +import SearchTextView, { type SearchTextViewConfig } from '../search/text/searchtextview.js'; +import type SearchResultsView from '../search/searchresultsview.js'; +import type InputBase from '../input/inputbase.js'; +import '../../theme/components/autocomplete/autocomplete.css'; +/** + * The autocomplete component's view class. It extends the {@link module:ui/search/text/searchtextview~SearchTextView} class + * with a floating {@link #resultsView} that shows up when the user starts typing and hides when they blur + * the component. + */ +export default class AutocompleteView> extends SearchTextView { + /** + * The configuration of the autocomplete view. + */ + protected _config: AutocompleteViewConfig; + resultsView: AutocompleteResultsView; + /** + * @inheritDoc + */ + constructor(locale: Locale, config: AutocompleteViewConfig); + /** + * Updates the position of the results view on demand. + */ + private _updateResultsViewWidthAndPosition; + /** + * Updates the visibility of the results view on demand. + */ + private _updateResultsVisibility; + /** + * Positions for the autocomplete results view. Two positions are defined by default: + * * `s` - below the search field, + * * `n` - above the search field. + */ + static defaultResultsPositions: Array; + /** + * A function used to calculate the optimal position for the dropdown panel. + */ + private static _getOptimalPosition; +} +/** + * An interface describing additional properties of the floating search results view used by the autocomplete plugin. + */ +export interface AutocompleteResultsView extends SearchResultsView { + /** + * Controls the visibility of the results view. + * + * @observable + */ + isVisible: boolean; + /** + * Controls the position (CSS class suffix) of the results view. + * + * @internal + */ + _position?: string; + /** + * The observable property determining the CSS width of the results view. + * + * @internal + */ + _width: number; +} +export interface AutocompleteViewConfig> extends SearchTextViewConfig { + /** + * When set `true`, the query view will be reset when the autocomplete view loses focus. + */ + resetOnBlur?: boolean; + /** + * Minimum number of characters that need to be typed before the search is performed. + * + * @default 0 + */ + queryMinChars?: number; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.js b/node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.js new file mode 100644 index 0000000..d6067e4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/autocomplete/autocompleteview.js @@ -0,0 +1,154 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/autocomplete/autocompleteview +*/ +import { getOptimalPosition, global, toUnit, Rect } from '@ckeditor/ckeditor5-utils'; +import SearchTextView from '../search/text/searchtextview.js'; +import '../../theme/components/autocomplete/autocomplete.css'; +/** + * The autocomplete component's view class. It extends the {@link module:ui/search/text/searchtextview~SearchTextView} class + * with a floating {@link #resultsView} that shows up when the user starts typing and hides when they blur + * the component. + */ +class AutocompleteView extends SearchTextView { + /** + * @inheritDoc + */ + constructor(locale, config) { + super(locale, config); + this._config = config; + const toPx = toUnit('px'); + this.extendTemplate({ + attributes: { + class: ['ck-autocomplete'] + } + }); + const bindResultsView = this.resultsView.bindTemplate; + this.resultsView.set('isVisible', false); + this.resultsView.set('_position', 's'); + this.resultsView.set('_width', 0); + this.resultsView.extendTemplate({ + attributes: { + class: [ + bindResultsView.if('isVisible', 'ck-hidden', value => !value), + bindResultsView.to('_position', value => `ck-search__results_${value}`) + ], + style: { + width: bindResultsView.to('_width', toPx) + } + } + }); + // Update the visibility of the results view when the user focuses or blurs the component. + // This is also integration for the `resetOnBlur` configuration. + this.focusTracker.on('change:isFocused', (evt, name, isFocused) => { + this._updateResultsVisibility(); + if (isFocused) { + // Reset the scroll position of the results view whenever the autocomplete reopens. + this.resultsView.element.scrollTop = 0; + } + else if (config.resetOnBlur) { + this.queryView.reset(); + } + }); + // Update the visibility of the results view when the user types in the query field. + // This is an integration for `queryMinChars` configuration. + // This is an integration for search results changing length and the #resultsView requiring to be repositioned. + this.on('search', () => { + this._updateResultsVisibility(); + this._updateResultsViewWidthAndPosition(); + }); + // Hide the results view when the user presses the ESC key. + this.keystrokes.set('esc', (evt, cancel) => { + // Let the DOM event pass through if the focus is in the query view. + if (!this.resultsView.isVisible) { + return; + } + // Focus the query view first and only then close the results view. Otherwise, if the focus + // was in the results view, it will get lost. + this.queryView.focus(); + this.resultsView.isVisible = false; + cancel(); + }); + // Update the position of the results view when the user scrolls the page. + // TODO: This needs to be debounced down the road. + this.listenTo(global.document, 'scroll', () => { + this._updateResultsViewWidthAndPosition(); + }); + // Hide the results when the component becomes disabled. + this.on('change:isEnabled', () => { + this._updateResultsVisibility(); + }); + // Update the value of the query field when the user selects a result. + this.filteredView.on('execute', (evt, { value }) => { + // Focus the query view first to avoid losing the focus. + this.focus(); + // Resetting the view will ensure that the #queryView will update its empty state correctly. + // This prevents bugs related to dynamic labels or auto-grow when re-setting the same value + // to #queryView.fieldView.value (which does not trigger empty state change) to an + // #queryView.fieldView.element that has been changed by the user. + this.reset(); + // Update the value of the query field. + this.queryView.fieldView.value = this.queryView.fieldView.element.value = value; + // Finally, hide the results view. The focus has been moved earlier so this is safe. + this.resultsView.isVisible = false; + }); + // Update the position and width of the results view when it becomes visible. + this.resultsView.on('change:isVisible', () => { + this._updateResultsViewWidthAndPosition(); + }); + } + /** + * Updates the position of the results view on demand. + */ + _updateResultsViewWidthAndPosition() { + if (!this.resultsView.isVisible) { + return; + } + this.resultsView._width = new Rect(this.queryView.fieldView.element).width; + const optimalResultsPosition = AutocompleteView._getOptimalPosition({ + element: this.resultsView.element, + target: this.queryView.element, + fitInViewport: true, + positions: AutocompleteView.defaultResultsPositions + }); + // _getOptimalPosition will return null if there is no optimal position found (e.g. target is off the viewport). + this.resultsView._position = optimalResultsPosition ? optimalResultsPosition.name : 's'; + } + /** + * Updates the visibility of the results view on demand. + */ + _updateResultsVisibility() { + const queryMinChars = typeof this._config.queryMinChars === 'undefined' ? 0 : this._config.queryMinChars; + const queryLength = this.queryView.fieldView.element.value.length; + this.resultsView.isVisible = this.focusTracker.isFocused && this.isEnabled && queryLength >= queryMinChars; + } +} +/** + * Positions for the autocomplete results view. Two positions are defined by default: + * * `s` - below the search field, + * * `n` - above the search field. + */ +AutocompleteView.defaultResultsPositions = [ + (fieldRect => { + return { + top: fieldRect.bottom, + left: fieldRect.left, + name: 's' + }; + }), + ((fieldRect, resultsRect) => { + return { + top: fieldRect.top - resultsRect.height, + left: fieldRect.left, + name: 'n' + }; + }) +]; +/** + * A function used to calculate the optimal position for the dropdown panel. + */ +AutocompleteView._getOptimalPosition = getOptimalPosition; +export default AutocompleteView; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.d.ts new file mode 100644 index 0000000..f8d6187 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.d.ts @@ -0,0 +1,27 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/addkeyboardhandlingforgrid + */ +import type { FocusTracker, KeystrokeHandler } from '@ckeditor/ckeditor5-utils'; +import type ViewCollection from '../viewcollection.js'; +/** + * A helper that adds a keyboard navigation support (arrow up/down/left/right) for grids. + * + * @param options Configuration options. + * @param options.keystrokeHandler Keystroke handler to register navigation with arrow keys. + * @param options.focusTracker A focus tracker for grid elements. + * @param options.gridItems A collection of grid items. + * @param options.numberOfColumns Number of columns in the grid. Can be specified as a function that returns + * the number (e.g. for responsive grids). + * @param options.uiLanguageDirection String of ui language direction. + */ +export default function addKeyboardHandlingForGrid({ keystrokeHandler, focusTracker, gridItems, numberOfColumns, uiLanguageDirection }: { + keystrokeHandler: KeystrokeHandler; + focusTracker: FocusTracker; + gridItems: ViewCollection; + numberOfColumns: number | (() => number); + uiLanguageDirection?: string; +}): void; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js new file mode 100644 index 0000000..0576f7b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/addkeyboardhandlingforgrid.js @@ -0,0 +1,107 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A helper that adds a keyboard navigation support (arrow up/down/left/right) for grids. + * + * @param options Configuration options. + * @param options.keystrokeHandler Keystroke handler to register navigation with arrow keys. + * @param options.focusTracker A focus tracker for grid elements. + * @param options.gridItems A collection of grid items. + * @param options.numberOfColumns Number of columns in the grid. Can be specified as a function that returns + * the number (e.g. for responsive grids). + * @param options.uiLanguageDirection String of ui language direction. + */ +export default function addKeyboardHandlingForGrid({ keystrokeHandler, focusTracker, gridItems, numberOfColumns, uiLanguageDirection }) { + const getNumberOfColumns = typeof numberOfColumns === 'number' ? () => numberOfColumns : numberOfColumns; + keystrokeHandler.set('arrowright', getGridItemFocuser((focusedElementIndex, gridItems) => { + return uiLanguageDirection === 'rtl' ? + getLeftElementIndex(focusedElementIndex, gridItems.length) : + getRightElementIndex(focusedElementIndex, gridItems.length); + })); + keystrokeHandler.set('arrowleft', getGridItemFocuser((focusedElementIndex, gridItems) => { + return uiLanguageDirection === 'rtl' ? + getRightElementIndex(focusedElementIndex, gridItems.length) : + getLeftElementIndex(focusedElementIndex, gridItems.length); + })); + keystrokeHandler.set('arrowup', getGridItemFocuser((focusedElementIndex, gridItems) => { + let nextIndex = focusedElementIndex - getNumberOfColumns(); + if (nextIndex < 0) { + nextIndex = focusedElementIndex + getNumberOfColumns() * Math.floor(gridItems.length / getNumberOfColumns()); + if (nextIndex > gridItems.length - 1) { + nextIndex -= getNumberOfColumns(); + } + } + return nextIndex; + })); + keystrokeHandler.set('arrowdown', getGridItemFocuser((focusedElementIndex, gridItems) => { + let nextIndex = focusedElementIndex + getNumberOfColumns(); + if (nextIndex > gridItems.length - 1) { + nextIndex = focusedElementIndex % getNumberOfColumns(); + } + return nextIndex; + })); + function getGridItemFocuser(getIndexToFocus) { + return (evt) => { + const focusedElement = gridItems.find(item => item.element === focusTracker.focusedElement); + const focusedElementIndex = gridItems.getIndex(focusedElement); + const nextIndexToFocus = getIndexToFocus(focusedElementIndex, gridItems); + gridItems.get(nextIndexToFocus).focus(); + evt.stopPropagation(); + evt.preventDefault(); + }; + } + /** + * Function returning the next index. + * + * ``` + * before: [ ][x][ ] after: [ ][ ][x] + * index = 1 index = 2 + * ``` + * + * If current index is last, function returns first index. + * + * ``` + * before: [ ][ ][x] after: [x][ ][ ] + * index = 2 index = 0 + * ``` + * + * @param elementIndex Number of current index. + * @param collectionLength A count of collection items. + */ + function getRightElementIndex(elementIndex, collectionLength) { + if (elementIndex === collectionLength - 1) { + return 0; + } + else { + return elementIndex + 1; + } + } + /** + * Function returning the previous index. + * + * ``` + * before: [ ][x][ ] after: [x][ ][ ] + * index = 1 index = 0 + * ``` + * + * If current index is first, function returns last index. + * + * ``` + * before: [x][ ][ ] after: [ ][ ][x] + * index = 0 index = 2 + * ``` + * + * @param elementIndex Number of current index. + * @param collectionLength A count of collection items. + */ + function getLeftElementIndex(elementIndex, collectionLength) { + if (elementIndex === 0) { + return collectionLength - 1; + } + else { + return elementIndex - 1; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.d.ts new file mode 100644 index 0000000..7fe1091 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.d.ts @@ -0,0 +1,28 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/clickoutsidehandler + */ +import type { DomEmitter } from '@ckeditor/ckeditor5-utils'; +/** + * Handles clicking **outside** of a specified set of elements, then fires an action. + * + * **Note**: Actually, the action is executed upon `mousedown`, not `click`. It prevents + * certain issues when the user keeps holding the mouse button and the UI cannot react + * properly. + * + * @param options Configuration options. + * @param options.emitter The emitter to which this behavior should be added. + * @param options.activator Function returning a `Boolean`, to determine whether the handler is active. + * @param options.contextElements Array of HTML elements or a callback returning an array of HTML elements + * that determine the scope of the handler. Clicking any of them or their descendants will **not** fire the callback. + * @param options.callback An action executed by the handler. + */ +export default function clickOutsideHandler({ emitter, activator, callback, contextElements }: { + emitter: DomEmitter; + activator: () => boolean; + contextElements: Array | (() => Array); + callback: () => void; +}): void; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js new file mode 100644 index 0000000..5bc1078 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/clickoutsidehandler.js @@ -0,0 +1,36 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* global document */ +/** + * Handles clicking **outside** of a specified set of elements, then fires an action. + * + * **Note**: Actually, the action is executed upon `mousedown`, not `click`. It prevents + * certain issues when the user keeps holding the mouse button and the UI cannot react + * properly. + * + * @param options Configuration options. + * @param options.emitter The emitter to which this behavior should be added. + * @param options.activator Function returning a `Boolean`, to determine whether the handler is active. + * @param options.contextElements Array of HTML elements or a callback returning an array of HTML elements + * that determine the scope of the handler. Clicking any of them or their descendants will **not** fire the callback. + * @param options.callback An action executed by the handler. + */ +export default function clickOutsideHandler({ emitter, activator, callback, contextElements }) { + emitter.listenTo(document, 'mousedown', (evt, domEvt) => { + if (!activator()) { + return; + } + // Check if `composedPath` is `undefined` in case the browser does not support native shadow DOM. + // Can be removed when all supported browsers support native shadow DOM. + const path = typeof domEvt.composedPath == 'function' ? domEvt.composedPath() : []; + const contextElementsList = typeof contextElements == 'function' ? contextElements() : contextElements; + for (const contextElement of contextElementsList) { + if (contextElement.contains(domEvt.target) || path.includes(contextElement)) { + return; + } + } + callback(); + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.d.ts new file mode 100644 index 0000000..394af49 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.d.ts @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/csstransitiondisablermixin + */ +import type { Constructor, Mixed } from '@ckeditor/ckeditor5-utils'; +import type View from '../view.js'; +/** + * A mixin that brings the possibility to temporarily disable CSS transitions using + * {@link module:ui/view~View} methods. It is helpful when, for instance, the transitions should not happen + * when the view is first displayed but they should work normal in other cases. + * + * The methods to control the CSS transitions are: + * * `disableCssTransitions()` – Adds the `.ck-transitions-disabled` class to the + * {@link module:ui/view~View#element view element}. + * * `enableCssTransitions()` – Removes the `.ck-transitions-disabled` class from the + * {@link module:ui/view~View#element view element}. + * + * The usage comes down to: + * + * ```ts + * const MyViewWithCssTransitionDisabler = CssTransitionDisablerMixin( MyView ); + * const view = new MyViewWithCssTransitionDisabler(); + * + * // ... + * + * view.disableCssTransitions(); + * view.show(); + * view.enableCssTransitions(); + * ``` + * + * @param view View instance that should get this functionality. + */ +export default function CssTransitionDisablerMixin>(view: Base): Mixed; +export type ViewWithCssTransitionDisabler = View & { + disableCssTransitions(): void; + enableCssTransitions(): void; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.js new file mode 100644 index 0000000..f959cbc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/csstransitiondisablermixin.js @@ -0,0 +1,55 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A mixin that brings the possibility to temporarily disable CSS transitions using + * {@link module:ui/view~View} methods. It is helpful when, for instance, the transitions should not happen + * when the view is first displayed but they should work normal in other cases. + * + * The methods to control the CSS transitions are: + * * `disableCssTransitions()` – Adds the `.ck-transitions-disabled` class to the + * {@link module:ui/view~View#element view element}. + * * `enableCssTransitions()` – Removes the `.ck-transitions-disabled` class from the + * {@link module:ui/view~View#element view element}. + * + * The usage comes down to: + * + * ```ts + * const MyViewWithCssTransitionDisabler = CssTransitionDisablerMixin( MyView ); + * const view = new MyViewWithCssTransitionDisabler(); + * + * // ... + * + * view.disableCssTransitions(); + * view.show(); + * view.enableCssTransitions(); + * ``` + * + * @param view View instance that should get this functionality. + */ +export default function CssTransitionDisablerMixin(view) { + class Mixin extends view { + disableCssTransitions() { + this._isCssTransitionsDisabled = true; + } + enableCssTransitions() { + this._isCssTransitionsDisabled = false; + } + constructor(...args) { + super(...args); + this.set('_isCssTransitionsDisabled', false); + this.initializeCssTransitionDisablerMixin(); + } + initializeCssTransitionDisablerMixin() { + this.extendTemplate({ + attributes: { + class: [ + this.bindTemplate.if('_isCssTransitionsDisabled', 'ck-transitions-disabled') + ] + } + }); + } + } + return Mixin; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.d.ts new file mode 100644 index 0000000..89e6c06 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.d.ts @@ -0,0 +1,46 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/draggableviewmixin + */ +import type View from '../view.js'; +import { type Constructor, type Mixed } from '@ckeditor/ckeditor5-utils'; +/** + * A mixin that brings the possibility to observe dragging of the view element. + * The view has to implement the {@link ~DraggableView} interface to use it: + * + * ```js + * export default class MyDraggableView extends DraggableViewMixin( View ) implements DraggableView { + * // ... + * } + * ``` + * + * Creating a class extending it attaches a set of mouse and touch listeners allowing to observe dragging of the view element: + * * `mousedown` and `touchstart` on the view element - starting the dragging. + * * `mousemove` and `touchmove` on the document - updating the view coordinates. + * * `mouseup` and `touchend` on the document - stopping the dragging. + * + * The mixin itself does not provide a visual feedback (that is, the dragged element does not change its position) - + * it is up to the developer to implement it. + */ +export default function DraggableViewMixin>(view: Base): Mixed; +/** + * An interface that should be implemented by views that want to be draggable. + */ +export interface DraggableView extends View { + get dragHandleElement(): HTMLElement | null; +} +/** + * An event data object for the {@link ~DraggableView} `drag` event. Fired when the view is dragged. + */ +export type DraggableViewDragEvent = { + name: 'drag'; + args: [ + { + deltaX: number; + deltaY: number; + } + ]; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.js new file mode 100644 index 0000000..cba5d7c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/draggableviewmixin.js @@ -0,0 +1,144 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { global } from '@ckeditor/ckeditor5-utils'; +/** + * A mixin that brings the possibility to observe dragging of the view element. + * The view has to implement the {@link ~DraggableView} interface to use it: + * + * ```js + * export default class MyDraggableView extends DraggableViewMixin( View ) implements DraggableView { + * // ... + * } + * ``` + * + * Creating a class extending it attaches a set of mouse and touch listeners allowing to observe dragging of the view element: + * * `mousedown` and `touchstart` on the view element - starting the dragging. + * * `mousemove` and `touchmove` on the document - updating the view coordinates. + * * `mouseup` and `touchend` on the document - stopping the dragging. + * + * The mixin itself does not provide a visual feedback (that is, the dragged element does not change its position) - + * it is up to the developer to implement it. + */ +export default function DraggableViewMixin(view) { + class DraggableMixin extends view { + /** + * @inheritdoc + */ + constructor(...args) { + super(...args); + /** + * A bound version of {@link #_onDrag}. + */ + this._onDragBound = this._onDrag.bind(this); + /** + * A bound version of {@link #_onDragEnd}. + */ + this._onDragEndBound = this._onDragEnd.bind(this); + /** + * The last coordinates of the view. It is updated on every mouse move. + */ + this._lastDraggingCoordinates = { x: 0, y: 0 }; + this.on('render', () => { + this._attachListeners(); + }); + this.set('isDragging', false); + } + /** + * Attaches the listeners for the drag start. + */ + _attachListeners() { + this.listenTo(this.element, 'mousedown', this._onDragStart.bind(this)); + this.listenTo(this.element, 'touchstart', this._onDragStart.bind(this)); + } + /** + * Attaches the listeners for the dragging and drag end. + */ + _attachDragListeners() { + this.listenTo(global.document, 'mouseup', this._onDragEndBound); + this.listenTo(global.document, 'touchend', this._onDragEndBound); + this.listenTo(global.document, 'mousemove', this._onDragBound); + this.listenTo(global.document, 'touchmove', this._onDragBound); + } + /** + * Detaches the listeners after the drag end. + */ + _detachDragListeners() { + this.stopListening(global.document, 'mouseup', this._onDragEndBound); + this.stopListening(global.document, 'touchend', this._onDragEndBound); + this.stopListening(global.document, 'mousemove', this._onDragBound); + this.stopListening(global.document, 'touchmove', this._onDragBound); + } + /** + * Starts the dragging listeners and sets the initial view coordinates. + */ + _onDragStart(evt, domEvt) { + if (!this._isHandleElementPressed(domEvt)) { + return; + } + this._attachDragListeners(); + let x = 0; + let y = 0; + // If dragging is performed with a mouse, there is only one set of coordinates available. + // But when using a touch device, there may be many of them, so use the coordinates from the first touch. + if (domEvt instanceof MouseEvent) { + x = domEvt.clientX; + y = domEvt.clientY; + } + else { + x = domEvt.touches[0].clientX; + y = domEvt.touches[0].clientY; + } + this._lastDraggingCoordinates = { x, y }; + this.isDragging = true; + } + /** + * Updates the view coordinates and fires the `drag` event. + */ + _onDrag(evt, domEvt) { + // If dragging was stopped by some external intervention, stop listening. + if (!this.isDragging) { + this._detachDragListeners(); + return; + } + let newX = 0; + let newY = 0; + // If dragging is performed with a mouse, there is only one set of coordinates available. + // But when using a touch device, there may be many of them, so use the coordinates from the first touch. + if (domEvt instanceof MouseEvent) { + newX = domEvt.clientX; + newY = domEvt.clientY; + } + else { + newX = domEvt.touches[0].clientX; + newY = domEvt.touches[0].clientY; + } + // Prevents selection of text while dragging on Safari. + domEvt.preventDefault(); + this.fire('drag', { + deltaX: Math.round(newX - this._lastDraggingCoordinates.x), + deltaY: Math.round(newY - this._lastDraggingCoordinates.y) + }); + this._lastDraggingCoordinates = { x: newX, y: newY }; + } + /** + * Stops the dragging and detaches the listeners. + */ + _onDragEnd() { + this._detachDragListeners(); + this.isDragging = false; + } + /** + * Checks if the drag handle element was pressed. + */ + _isHandleElementPressed(domEvt) { + if (!this.dragHandleElement) { + return false; + } + return this.dragHandleElement === domEvt.target || + (domEvt.target instanceof HTMLElement && this.dragHandleElement.contains(domEvt.target)); + } + } + return DraggableMixin; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.d.ts new file mode 100644 index 0000000..a99c283 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.d.ts @@ -0,0 +1,59 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/injectcsstransitiondisabler + */ +import type View from '../view.js'; +/** + * A decorator that brings the possibility to temporarily disable CSS transitions using + * {@link module:ui/view~View} methods. It is helpful when, for instance, the transitions should not happen + * when the view is first displayed but they should work normal in other cases. + * + * The methods to control the CSS transitions are: + * * `disableCssTransitions()` – Adds the `.ck-transitions-disabled` class to the + * {@link module:ui/view~View#element view element}. + * * `enableCssTransitions()` – Removes the `.ck-transitions-disabled` class from the + * {@link module:ui/view~View#element view element}. + * + * **Note**: This helper extends the {@link module:ui/view~View#template template} and must be used **after** + * {@link module:ui/view~View#setTemplate} is called: + * + * ```ts + * import injectCssTransitionDisabler from '@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler'; + * + * class MyView extends View { + * constructor() { + * super(); + * + * // ... + * + * this.setTemplate( { ... } ); + * + * // ... + * + * injectCssTransitionDisabler( this ); + * + * // ... + * } + * } + * ``` + * + * The usage comes down to: + * + * ```ts + * const view = new MyView(); + * + * // ... + * + * view.disableCssTransitions(); + * view.show(); + * view.enableCssTransitions(); + * ``` + * + * @deprecated + * @see module:ui/bindings/csstransitiondisablermixin~CssTransitionDisablerMixin + * @param view View instance that should get this functionality. + */ +export default function injectCssTransitionDisabler(view: View): void; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js new file mode 100644 index 0000000..5b3e37f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler.js @@ -0,0 +1,71 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A decorator that brings the possibility to temporarily disable CSS transitions using + * {@link module:ui/view~View} methods. It is helpful when, for instance, the transitions should not happen + * when the view is first displayed but they should work normal in other cases. + * + * The methods to control the CSS transitions are: + * * `disableCssTransitions()` – Adds the `.ck-transitions-disabled` class to the + * {@link module:ui/view~View#element view element}. + * * `enableCssTransitions()` – Removes the `.ck-transitions-disabled` class from the + * {@link module:ui/view~View#element view element}. + * + * **Note**: This helper extends the {@link module:ui/view~View#template template} and must be used **after** + * {@link module:ui/view~View#setTemplate} is called: + * + * ```ts + * import injectCssTransitionDisabler from '@ckeditor/ckeditor5-ui/src/bindings/injectcsstransitiondisabler'; + * + * class MyView extends View { + * constructor() { + * super(); + * + * // ... + * + * this.setTemplate( { ... } ); + * + * // ... + * + * injectCssTransitionDisabler( this ); + * + * // ... + * } + * } + * ``` + * + * The usage comes down to: + * + * ```ts + * const view = new MyView(); + * + * // ... + * + * view.disableCssTransitions(); + * view.show(); + * view.enableCssTransitions(); + * ``` + * + * @deprecated + * @see module:ui/bindings/csstransitiondisablermixin~CssTransitionDisablerMixin + * @param view View instance that should get this functionality. + */ +export default function injectCssTransitionDisabler(view) { + const decorated = view; + decorated.set('_isCssTransitionsDisabled', false); + decorated.disableCssTransitions = () => { + decorated._isCssTransitionsDisabled = true; + }; + decorated.enableCssTransitions = () => { + decorated._isCssTransitionsDisabled = false; + }; + decorated.extendTemplate({ + attributes: { + class: [ + decorated.bindTemplate.if('_isCssTransitionsDisabled', 'ck-transitions-disabled') + ] + } + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.d.ts new file mode 100644 index 0000000..8fa3944 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.d.ts @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/preventdefault + */ +import type { ListenerBinding } from '../template.js'; +import type View from '../view.js'; +/** + * A helper which executes a native `Event.preventDefault()` if the target of an event equals the + * {@link module:ui/view~View#element element of the view}. It shortens the definition of a + * {@link module:ui/view~View#template template}. + * + * ```ts + * // In a class extending View. + * import preventDefault from '@ckeditor/ckeditor5-ui/src/bindings/preventdefault'; + * + * // ... + * + * this.setTemplate( { + * tag: 'div', + * + * on: { + * // Prevent the default mousedown action on this view. + * mousedown: preventDefault( this ) + * } + * } ); + * ``` + * + * @param view View instance that defines the template. + */ +export default function preventDefault(view: View): ListenerBinding; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js new file mode 100644 index 0000000..efb4908 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/preventdefault.js @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A helper which executes a native `Event.preventDefault()` if the target of an event equals the + * {@link module:ui/view~View#element element of the view}. It shortens the definition of a + * {@link module:ui/view~View#template template}. + * + * ```ts + * // In a class extending View. + * import preventDefault from '@ckeditor/ckeditor5-ui/src/bindings/preventdefault'; + * + * // ... + * + * this.setTemplate( { + * tag: 'div', + * + * on: { + * // Prevent the default mousedown action on this view. + * mousedown: preventDefault( this ) + * } + * } ); + * ``` + * + * @param view View instance that defines the template. + */ +export default function preventDefault(view) { + return view.bindTemplate.to(evt => { + if (evt.target === view.element) { + evt.preventDefault(); + } + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.d.ts new file mode 100644 index 0000000..5676ebb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.d.ts @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/bindings/submithandler + */ +import type View from '../view.js'; +/** + * A handler useful for {@link module:ui/view~View views} working as HTML forms. It intercepts a native DOM + * `submit` event, prevents the default web browser behavior (navigation and page reload) and + * fires the `submit` event on a view instead. Such a custom event can be then used by any + * {@link module:utils/dom/emittermixin~DomEmitter emitter}, e.g. to serialize the form data. + * + * ```ts + * import submitHandler from '@ckeditor/ckeditor5-ui/src/bindings/submithandler'; + * + * // ... + * + * class AnyFormView extends View { + * constructor() { + * super(); + * + * // ... + * + * submitHandler( { + * view: this + * } ); + * } + * } + * + * // ... + * + * const view = new AnyFormView(); + * + * // A sample listener attached by an emitter working with the view. + * this.listenTo( view, 'submit', () => { + * saveTheFormData(); + * hideTheForm(); + * } ); + * ``` + * + * @param options Configuration options. + * @param options.view The view which DOM `submit` events should be handled. + */ +export default function submitHandler({ view }: { + view: View; +}): void; +/** + * Fired by {@link module:ui/bindings/submithandler~submitHandler} helper. + * + * @eventName module:ui/view~View#submit + */ +export type SubmitHandlerEvent = { + name: 'submit'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js new file mode 100644 index 0000000..91f8ff3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/bindings/submithandler.js @@ -0,0 +1,47 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A handler useful for {@link module:ui/view~View views} working as HTML forms. It intercepts a native DOM + * `submit` event, prevents the default web browser behavior (navigation and page reload) and + * fires the `submit` event on a view instead. Such a custom event can be then used by any + * {@link module:utils/dom/emittermixin~DomEmitter emitter}, e.g. to serialize the form data. + * + * ```ts + * import submitHandler from '@ckeditor/ckeditor5-ui/src/bindings/submithandler'; + * + * // ... + * + * class AnyFormView extends View { + * constructor() { + * super(); + * + * // ... + * + * submitHandler( { + * view: this + * } ); + * } + * } + * + * // ... + * + * const view = new AnyFormView(); + * + * // A sample listener attached by an emitter working with the view. + * this.listenTo( view, 'submit', () => { + * saveTheFormData(); + * hideTheForm(); + * } ); + * ``` + * + * @param options Configuration options. + * @param options.view The view which DOM `submit` events should be handled. + */ +export default function submitHandler({ view }) { + view.listenTo(view.element, 'submit', (evt, domEvt) => { + domEvt.preventDefault(); + view.fire('submit'); + }, { useCapture: true }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/button.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/button/button.d.ts new file mode 100644 index 0000000..837a838 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/button.d.ts @@ -0,0 +1,181 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/button + */ +/** + * The button interface. Implemented by, among others, {@link module:ui/button/buttonview~ButtonView}, + * {@link module:ui/dropdown/button/splitbuttonview~SplitButtonView} and + * {@link module:ui/dropdown/button/dropdownbuttonview~DropdownButtonView}. + */ +export default interface Button { + /** + * The label of the button view visible to the user when {@link #withText} is `true`. + * It can also be used to create a {@link #tooltip}. + * + * @observable + */ + label: string | undefined; + /** + * (Optional) The keystroke associated with the button, i.e. CTRL+B, + * in the string format compatible with {@link module:utils/keyboard}. + * + * **Note**: Use {@link module:ui/button/button~Button#withKeystroke} if you want to display + * the keystroke information next to the {@link module:ui/button/button~Button#label label}. + * + * @observable + */ + keystroke: string | undefined; + /** + * (Optional) Tooltip of the button, i.e. displayed when hovering the button with the mouse cursor. + * + * * If defined as a `Boolean` (e.g. `true`), then combination of `label` and `keystroke` will be set as a tooltip. + * * If defined as a `String`, tooltip will equal the exact text of that `String`. + * * If defined as a `Function`, `label` and `keystroke` will be passed to that function, which is to return + * a string with the tooltip text. + * + * ```ts + * const view = new ButtonView( locale ); + * view.tooltip = ( label, keystroke ) => `A tooltip for ${ label } and ${ keystroke }.` + * ``` + * + * @observable + * @default false + */ + tooltip: boolean | string | ((label: string, keystroke: string | undefined) => string); + /** + * (Optional) The position of the tooltip. See {@link module:ui/tooltipmanager~TooltipManager} + * to learn more about the tooltip system. + * + * **Note:** It makes sense only when the {@link #tooltip `tooltip` attribute} is defined. + * + * @observable + * @default 's' + */ + tooltipPosition: 's' | 'n' | 'e' | 'w' | 'sw' | 'se'; + /** + * The HTML type of the button. + * + * @observable + * @default 'button' + */ + type: 'button' | 'submit' | 'reset' | 'menu'; + /** + * Controls whether the button view is "on". It makes sense when a feature it represents + * is currently active, e.g. a bold button is "on" when the selection is in the bold text. + * + * To disable the button, use {@link #isEnabled} instead. + * + * @observable + * @default true + */ + isOn: boolean; + /** + * Controls whether the button view is enabled, i.e. it can be clicked and execute an action. + * + * To change the "on" state of the button, use {@link #isOn} instead. + * + * @observable + * @default true + */ + isEnabled: boolean; + /** + * Controls whether the button view is visible. Visible by default, buttons are hidden + * using a CSS class. + * + * @observable + * @default true + */ + isVisible: boolean; + /** + * Controls whether the button view is a toggle button (two–state) for assistive technologies. + * + * @observable + * @default false + */ + isToggleable: boolean; + /** + * (Optional) Controls whether the label of the button is hidden (e.g. an icon–only button). + * + * @observable + * @default false + */ + withText: boolean; + /** + * (Optional) Controls whether the keystroke of the button is displayed next to its + * {@link module:ui/button/button~Button#label label}. + * + * **Note**: This property requires a {@link module:ui/button/button~Button#keystroke keystroke} + * to be defined in the first place. + * + * @observable + * @default false + */ + withKeystroke: boolean; + /** + * (Optional) An XML {@link module:ui/icon/iconview~IconView#content content} of the icon. + * When defined, an `iconView` should be added to the button. + * + * The user must provide the entire XML string, not just the path. See the + * {@glink framework/architecture/ui-library#setting-label-icon-and-tooltip UI library} guide for details. + * + * @observable + */ + icon: string | undefined; + /** + * (Optional) Controls the `tabindex` HTML attribute of the button. By default, the button is focusable + * but does not included in the Tab order. + * + * @observable + * @default -1 + */ + tabindex: number; + /** + * (Optional) The additional CSS class set on the button. + * + * @observable + */ + class: string | undefined; + /** + * (Optional) The ARIA property reflected by the `aria-checked` DOM attribute used by assistive technologies. + * + * @observable + */ + ariaChecked?: boolean | undefined; + /** + * (Optional) The ARIA property reflected by the `aria-label` DOM attribute used by assistive technologies. + * + * @observable + */ + ariaLabel?: string | undefined; + /** + * (Optional) The ARIA property reflected by the `aria-ariaLabelledBy` DOM attribute used by assistive technologies. + * + * @observable + */ + ariaLabelledBy?: string | undefined; + /** + * (Optional) The property reflected by the `role` DOM attribute to be used by assistive technologies. + * + * @observable + */ + role?: string | undefined; + /** + * (Optional) The value of the `style` attribute of the label. + * + * @observable + */ + labelStyle: string | undefined; +} +/** + * Fired when the button view is clicked. It won't be fired when the button {@link module:ui/button/button~Button#isEnabled} + * is `false`. + * + * @eventName ~Button#execute + */ +export type ButtonExecuteEvent = { + name: 'execute'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/button.js b/node_modules/@ckeditor/ckeditor5-ui/src/button/button.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/button.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.d.ts new file mode 100644 index 0000000..cb61100 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.d.ts @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/buttonlabel +*/ +import type View from '../view.js'; +/** + * The button label interface. Implemented by the {@link module:ui/button/buttonlabelview~ButtonLabelView} + * and any label view that can be used with the {@link module:ui/button/buttonview~ButtonView}. + */ +export default interface ButtonLabel extends View { + /** + * The `id` attribute of the button label. It is used for accessibility purposes + * to describe the button. + * + * @observable + */ + id: string | undefined; + /** + * The `style` attribute of the button label. It allows customizing the presentation + * of the label. + * + * @observable + */ + style: string | undefined; + /** + * The human-readable text of the label. + * + * @observable + */ + text: string | undefined; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.js b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabel.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.d.ts new file mode 100644 index 0000000..3b16f54 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.d.ts @@ -0,0 +1,31 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/buttonlabelview + */ +import View from '../view.js'; +import type ButtonLabel from './buttonlabel.js'; +/** + * A default implementation of the button view's label. It comes with a dynamic text support + * via {@link module:ui/button/buttonlabelview~ButtonLabelView#text} property. + */ +export default class ButtonLabelView extends View implements ButtonLabel { + /** + * @inheritDoc + */ + id: string | undefined; + /** + * @inheritDoc + */ + style: string | undefined; + /** + * @inheritDoc + */ + text: string | undefined; + /** + * @inheritDoc + */ + constructor(); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.js b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.js new file mode 100644 index 0000000..32f376b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonlabelview.js @@ -0,0 +1,42 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/buttonlabelview + */ +import View from '../view.js'; +/** + * A default implementation of the button view's label. It comes with a dynamic text support + * via {@link module:ui/button/buttonlabelview~ButtonLabelView#text} property. + */ +export default class ButtonLabelView extends View { + /** + * @inheritDoc + */ + constructor() { + super(); + this.set({ + style: undefined, + text: undefined, + id: undefined + }); + const bind = this.bindTemplate; + this.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__label' + ], + style: bind.to('style'), + id: bind.to('id') + }, + children: [ + { + text: bind.to('text') + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.d.ts new file mode 100644 index 0000000..799268a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.d.ts @@ -0,0 +1,185 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/buttonview + */ +import View from '../view.js'; +import IconView from '../icon/iconview.js'; +import type ViewCollection from '../viewcollection.js'; +import type { default as Button } from './button.js'; +import type ButtonLabel from './buttonlabel.js'; +import { type Locale } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/button/button.css'; +/** + * The button view class. + * + * ```ts + * const view = new ButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true, + * withText: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + */ +export default class ButtonView extends View implements Button { + /** + * Collection of the child views inside of the button {@link #element}. + */ + readonly children: ViewCollection; + /** + * Label of the button view. Its text is configurable using the {@link #label label attribute}. + * + * If not configured otherwise in the `constructor()`, by default the label is an instance + * of {@link module:ui/button/buttonlabelview~ButtonLabelView}. + */ + readonly labelView: ButtonLabel; + /** + * The icon view of the button. Will be added to {@link #children} when the + * {@link #icon icon attribute} is defined. + */ + readonly iconView: IconView; + /** + * A view displaying the keystroke of the button next to the {@link #labelView label}. + * Added to {@link #children} when the {@link #withKeystroke `withKeystroke` attribute} + * is defined. + */ + readonly keystrokeView: View; + /** + * @inheritDoc + */ + class: string | undefined; + /** + * @inheritDoc + */ + labelStyle: string | undefined; + /** + * @inheritDoc + */ + icon: string | undefined; + /** + * @inheritDoc + */ + isEnabled: boolean; + /** + * @inheritDoc + */ + isOn: boolean; + /** + * @inheritDoc + */ + isVisible: boolean; + /** + * @inheritDoc + */ + isToggleable: boolean; + /** + * @inheritDoc + */ + keystroke: string | undefined; + /** + * @inheritDoc + */ + label: string | undefined; + /** + * @inheritDoc + */ + tabindex: number; + /** + * @inheritDoc + */ + tooltip: Button['tooltip']; + /** + * @inheritDoc + */ + tooltipPosition: Button['tooltipPosition']; + /** + * @inheritDoc + */ + type: Button['type']; + /** + * @inheritDoc + */ + withText: boolean; + /** + * @inheritDoc + */ + withKeystroke: boolean; + /** + * @inheritDoc + */ + role: string | undefined; + /** + * @inheritDoc + */ + ariaChecked: boolean | undefined; + /** + * @inheritDoc + */ + ariaLabel?: string | undefined; + /** + * @inheritDoc + */ + ariaLabelledBy: string | undefined; + /** + * Tooltip of the button bound to the template. + * + * @see #tooltip + * @see module:ui/button/buttonview~ButtonView#_getTooltipString + * @internal + * @observable + */ + _tooltipString: string; + /** + * Delayed focus function for focus handling in Safari. + */ + private _focusDelayed; + /** + * Creates an instance of the button view class. + * + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + * @param labelView The instance of the button's label. If not provided, an instance of + * {@link module:ui/button/buttonlabelview~ButtonLabelView} is used. + */ + constructor(locale?: Locale, labelView?: ButtonLabel); + /** + * @inheritDoc + */ + render(): void; + /** + * Focuses the {@link #element} of the button. + */ + focus(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Binds the label view instance it with button attributes. + */ + private _setupLabelView; + /** + * Creates a view that displays a keystroke next to a {@link #labelView label } + * and binds it with button attributes. + */ + private _createKeystrokeView; + /** + * Gets the text for the tooltip from the combination of + * {@link #tooltip}, {@link #label} and {@link #keystroke} attributes. + * + * @see #tooltip + * @see #_tooltipString + * @param tooltip Button tooltip. + * @param label Button label. + * @param keystroke Button keystroke. + */ + private _getTooltipString; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.js b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.js new file mode 100644 index 0000000..3b29a67 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/buttonview.js @@ -0,0 +1,218 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/buttonview + */ +import View from '../view.js'; +import IconView from '../icon/iconview.js'; +import ButtonLabelView from './buttonlabelview.js'; +import { env, getEnvKeystrokeText, uid, delay } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/button/button.css'; +/** + * The button view class. + * + * ```ts + * const view = new ButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true, + * withText: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + */ +export default class ButtonView extends View { + /** + * Creates an instance of the button view class. + * + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + * @param labelView The instance of the button's label. If not provided, an instance of + * {@link module:ui/button/buttonlabelview~ButtonLabelView} is used. + */ + constructor(locale, labelView = new ButtonLabelView()) { + super(locale); + /** + * Delayed focus function for focus handling in Safari. + */ + this._focusDelayed = null; + const bind = this.bindTemplate; + const ariaLabelUid = uid(); + // Implement the Button interface. + this.set('ariaLabel', undefined); + this.set('ariaLabelledBy', `ck-editor__aria-label_${ariaLabelUid}`); + this.set('class', undefined); + this.set('labelStyle', undefined); + this.set('icon', undefined); + this.set('isEnabled', true); + this.set('isOn', false); + this.set('isVisible', true); + this.set('isToggleable', false); + this.set('keystroke', undefined); + this.set('label', undefined); + this.set('role', undefined); + this.set('tabindex', -1); + this.set('tooltip', false); + this.set('tooltipPosition', 's'); + this.set('type', 'button'); + this.set('withText', false); + this.set('withKeystroke', false); + this.children = this.createCollection(); + this.labelView = this._setupLabelView(labelView); + this.iconView = new IconView(); + this.iconView.extendTemplate({ + attributes: { + class: 'ck-button__icon' + } + }); + this.keystrokeView = this._createKeystrokeView(); + this.bind('_tooltipString').to(this, 'tooltip', this, 'label', this, 'keystroke', this._getTooltipString.bind(this)); + const template = { + tag: 'button', + attributes: { + class: [ + 'ck', + 'ck-button', + bind.to('class'), + bind.if('isEnabled', 'ck-disabled', value => !value), + bind.if('isVisible', 'ck-hidden', value => !value), + bind.to('isOn', value => value ? 'ck-on' : 'ck-off'), + bind.if('withText', 'ck-button_with-text'), + bind.if('withKeystroke', 'ck-button_with-keystroke') + ], + role: bind.to('role'), + type: bind.to('type', value => value ? value : 'button'), + tabindex: bind.to('tabindex'), + 'aria-checked': bind.to('ariaChecked'), + 'aria-label': bind.to('ariaLabel'), + 'aria-labelledby': bind.to('ariaLabelledBy'), + 'aria-disabled': bind.if('isEnabled', true, value => !value), + 'aria-pressed': bind.to('isOn', value => this.isToggleable ? String(!!value) : false), + 'data-cke-tooltip-text': bind.to('_tooltipString'), + 'data-cke-tooltip-position': bind.to('tooltipPosition') + }, + children: this.children, + on: { + click: bind.to(evt => { + // We can't make the button disabled using the disabled attribute, because it won't be focusable. + // Though, shouldn't this condition be moved to the button controller? + if (this.isEnabled) { + this.fire('execute'); + } + else { + // Prevent the default when button is disabled, to block e.g. + // automatic form submitting. See ckeditor/ckeditor5-link#74. + evt.preventDefault(); + } + }) + } + }; + // On Safari we have to force the focus on a button on click as it's the only browser + // that doesn't do that automatically. See #12115. + if (env.isSafari) { + if (!this._focusDelayed) { + this._focusDelayed = delay(() => this.focus(), 0); + } + template.on.mousedown = bind.to(() => { + this._focusDelayed(); + }); + template.on.mouseup = bind.to(() => { + this._focusDelayed.cancel(); + }); + } + this.setTemplate(template); + } + /** + * @inheritDoc + */ + render() { + super.render(); + if (this.icon) { + this.iconView.bind('content').to(this, 'icon'); + this.children.add(this.iconView); + } + this.children.add(this.labelView); + if (this.withKeystroke && this.keystroke) { + this.children.add(this.keystrokeView); + } + } + /** + * Focuses the {@link #element} of the button. + */ + focus() { + this.element.focus(); + } + /** + * @inheritDoc + */ + destroy() { + if (this._focusDelayed) { + this._focusDelayed.cancel(); + } + super.destroy(); + } + /** + * Binds the label view instance it with button attributes. + */ + _setupLabelView(labelView) { + labelView.bind('text', 'style', 'id').to(this, 'label', 'labelStyle', 'ariaLabelledBy'); + return labelView; + } + /** + * Creates a view that displays a keystroke next to a {@link #labelView label } + * and binds it with button attributes. + */ + _createKeystrokeView() { + const keystrokeView = new View(); + keystrokeView.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__keystroke' + ] + }, + children: [ + { + text: this.bindTemplate.to('keystroke', text => getEnvKeystrokeText(text)) + } + ] + }); + return keystrokeView; + } + /** + * Gets the text for the tooltip from the combination of + * {@link #tooltip}, {@link #label} and {@link #keystroke} attributes. + * + * @see #tooltip + * @see #_tooltipString + * @param tooltip Button tooltip. + * @param label Button label. + * @param keystroke Button keystroke. + */ + _getTooltipString(tooltip, label, keystroke) { + if (tooltip) { + if (typeof tooltip == 'string') { + return tooltip; + } + else { + if (keystroke) { + keystroke = getEnvKeystrokeText(keystroke); + } + if (tooltip instanceof Function) { + return tooltip(label, keystroke); + } + else { + return `${label}${keystroke ? ` (${keystroke})` : ''}`; + } + } + } + return ''; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.d.ts new file mode 100644 index 0000000..d5a972c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.d.ts @@ -0,0 +1,80 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import ButtonView from './buttonview.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The file dialog button view. + * + * This component provides a button that opens the native file selection dialog. + * It can be used to implement the UI of a file upload feature. + * + * ```ts + * const view = new FileDialogButtonView( locale ); + * + * view.set( { + * acceptedType: 'image/*', + * allowMultipleFiles: true + * label: t( 'Insert image' ), + * icon: imageIcon, + * tooltip: true + * } ); + * + * view.on( 'done', ( evt, files ) => { + * for ( const file of Array.from( files ) ) { + * console.log( 'Selected file', file ); + * } + * } ); + * ``` + */ +export default class FileDialogButtonView extends ButtonView { + /** + * The button view of the component. + * + * @deprecated + */ + buttonView: ButtonView; + /** + * A hidden `` view used to execute file dialog. + */ + private _fileInputView; + /** + * Accepted file types. Can be provided in form of file extensions, media type or one of: + * * `audio/*`, + * * `video/*`, + * * `image/*`. + * + * @observable + */ + acceptedType: string; + /** + * Indicates if multiple files can be selected. Defaults to `true`. + * + * @observable + */ + allowMultipleFiles: boolean; + /** + * @inheritDoc + */ + constructor(locale?: Locale); + /** + * @inheritDoc + */ + render(): void; +} +/** + * Fired when file dialog is closed with file selected. + * + * ```ts + * view.on( 'done', ( evt, files ) => { + * for ( const file of files ) { + * console.log( 'Selected file', file ); + * } + * } + * ``` + */ +export type FileInputViewDoneEvent = { + name: 'done'; + args: [files: FileList]; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.js b/node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.js new file mode 100644 index 0000000..fdab08d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/filedialogbuttonview.js @@ -0,0 +1,103 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/filedialogbuttonview + */ +import View from '../view.js'; +import ButtonView from './buttonview.js'; +/** + * The file dialog button view. + * + * This component provides a button that opens the native file selection dialog. + * It can be used to implement the UI of a file upload feature. + * + * ```ts + * const view = new FileDialogButtonView( locale ); + * + * view.set( { + * acceptedType: 'image/*', + * allowMultipleFiles: true + * label: t( 'Insert image' ), + * icon: imageIcon, + * tooltip: true + * } ); + * + * view.on( 'done', ( evt, files ) => { + * for ( const file of Array.from( files ) ) { + * console.log( 'Selected file', file ); + * } + * } ); + * ``` + */ +export default class FileDialogButtonView extends ButtonView { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + // For backward compatibility. + this.buttonView = this; + this._fileInputView = new FileInputView(locale); + this._fileInputView.bind('acceptedType').to(this); + this._fileInputView.bind('allowMultipleFiles').to(this); + this._fileInputView.delegate('done').to(this); + this.on('execute', () => { + this._fileInputView.open(); + }); + this.extendTemplate({ + attributes: { + class: 'ck-file-dialog-button' + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this._fileInputView); + } +} +/** + * The hidden file input view class. + */ +class FileInputView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.set('acceptedType', undefined); + this.set('allowMultipleFiles', false); + const bind = this.bindTemplate; + this.setTemplate({ + tag: 'input', + attributes: { + class: [ + 'ck-hidden' + ], + type: 'file', + tabindex: '-1', + accept: bind.to('acceptedType'), + multiple: bind.to('allowMultipleFiles') + }, + on: { + // Removing from code coverage since we cannot programmatically set input element files. + change: bind.to(/* istanbul ignore next -- @preserve */ () => { + if (this.element && this.element.files && this.element.files.length) { + this.fire('done', this.element.files); + } + this.element.value = ''; + }) + } + }); + } + /** + * Opens file dialog. + */ + open() { + this.element.click(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.d.ts new file mode 100644 index 0000000..14402a5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.d.ts @@ -0,0 +1,45 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/switchbuttonview + */ +import View from '../view.js'; +import ButtonView from './buttonview.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/button/switchbutton.css'; +/** + * The switch button view class. + * + * ```ts + * const view = new SwitchButtonView(); + * + * view.set( { + * withText: true, + * label: 'Switch me!' + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + */ +export default class SwitchButtonView extends ButtonView { + /** + * The toggle switch of the button. + */ + readonly toggleSwitchView: View; + /** + * @inheritDoc + */ + constructor(locale?: Locale); + /** + * @inheritDoc + */ + render(): void; + /** + * Creates a toggle child view. + */ + private _createToggleView; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js b/node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js new file mode 100644 index 0000000..9f4809f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/button/switchbuttonview.js @@ -0,0 +1,75 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/button/switchbuttonview + */ +import View from '../view.js'; +import ButtonView from './buttonview.js'; +import '../../theme/components/button/switchbutton.css'; +/** + * The switch button view class. + * + * ```ts + * const view = new SwitchButtonView(); + * + * view.set( { + * withText: true, + * label: 'Switch me!' + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + */ +export default class SwitchButtonView extends ButtonView { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.isToggleable = true; + this.toggleSwitchView = this._createToggleView(); + this.extendTemplate({ + attributes: { + class: 'ck-switchbutton' + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this.toggleSwitchView); + } + /** + * Creates a toggle child view. + */ + _createToggleView() { + const toggleSwitchView = new View(); + toggleSwitchView.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__toggle' + ] + }, + children: [ + { + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-button__toggle__inner' + ] + } + } + ] + }); + return toggleSwitchView; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.d.ts new file mode 100644 index 0000000..cca93bc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.d.ts @@ -0,0 +1,70 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/collapsible/collapsibleview + */ +import type { Locale } from '@ckeditor/ckeditor5-utils'; +import View from '../view.js'; +import ButtonView from '../button/buttonview.js'; +import type ViewCollection from '../viewcollection.js'; +import type { FocusableView } from '../focuscycler.js'; +import '../../theme/components/collapsible/collapsible.css'; +/** + * A collapsible UI component. Consists of a labeled button and a container which can be collapsed + * by clicking the button. The collapsible container can be a host to other UI views. + * + * @internal + */ +export default class CollapsibleView extends View { + /** + * `true` when the container with {@link #children} is collapsed. `false` otherwise. + * + * @observable + */ + isCollapsed: boolean; + /** + * The text label of the {@link #buttonView}. + * + * @observable + * @default 'Show more' + */ + label: string; + /** + * The ID of the label inside the {@link #buttonView} that describes the collapsible + * container for assistive technologies. Set after the button was {@link #render rendered}. + * + * @internal + * @readonly + * @observable + */ + _collapsibleAriaLabelUid: string | undefined; + /** + * The main button that, when clicked, collapses or expands the container with {@link #children}. + */ + readonly buttonView: ButtonView; + /** + * A collection of the child views that can be collapsed by clicking the {@link #buttonView}. + */ + readonly children: ViewCollection; + /** + * Creates an instance of the collapsible view. + * + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + * @param childViews An optional array of initial child views to be inserted into the collapsible. + */ + constructor(locale: Locale, childViews?: Array); + /** + * @inheritDoc + */ + render(): void; + /** + * Focuses the first focusable. + */ + focus(): void; + /** + * Creates the main {@link #buttonView} of the collapsible. + */ + private _createButtonView; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.js b/node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.js new file mode 100644 index 0000000..e83d0f0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/collapsible/collapsibleview.js @@ -0,0 +1,95 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import View from '../view.js'; +import ButtonView from '../button/buttonview.js'; +import dropdownArrowIcon from '../../theme/icons/dropdown-arrow.svg'; +import '../../theme/components/collapsible/collapsible.css'; +/** + * A collapsible UI component. Consists of a labeled button and a container which can be collapsed + * by clicking the button. The collapsible container can be a host to other UI views. + * + * @internal + */ +export default class CollapsibleView extends View { + /** + * Creates an instance of the collapsible view. + * + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + * @param childViews An optional array of initial child views to be inserted into the collapsible. + */ + constructor(locale, childViews) { + super(locale); + const bind = this.bindTemplate; + this.set('isCollapsed', false); + this.set('label', ''); + this.buttonView = this._createButtonView(); + this.children = this.createCollection(); + this.set('_collapsibleAriaLabelUid', undefined); + if (childViews) { + this.children.addMany(childViews); + } + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-collapsible', + bind.if('isCollapsed', 'ck-collapsible_collapsed') + ] + }, + children: [ + this.buttonView, + { + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-collapsible__children' + ], + role: 'region', + hidden: bind.if('isCollapsed', 'hidden'), + 'aria-labelledby': bind.to('_collapsibleAriaLabelUid') + }, + children: this.children + } + ] + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this._collapsibleAriaLabelUid = this.buttonView.labelView.element.id; + } + /** + * Focuses the first focusable. + */ + focus() { + this.buttonView.focus(); + } + /** + * Creates the main {@link #buttonView} of the collapsible. + */ + _createButtonView() { + const buttonView = new ButtonView(this.locale); + const bind = buttonView.bindTemplate; + buttonView.set({ + withText: true, + icon: dropdownArrowIcon + }); + buttonView.extendTemplate({ + attributes: { + 'aria-expanded': bind.to('isOn', value => String(value)) + } + }); + buttonView.bind('label').to(this); + buttonView.bind('isOn').to(this, 'isCollapsed', isCollapsed => !isCollapsed); + buttonView.on('execute', () => { + this.isCollapsed = !this.isCollapsed; + }); + return buttonView; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.d.ts new file mode 100644 index 0000000..9b04266 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.d.ts @@ -0,0 +1,132 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/colorgridview + */ +import View from '../view.js'; +import ColorTileView from './colortileview.js'; +import type DropdownPanelFocusable from '../dropdown/dropdownpanelfocusable.js'; +import type ViewCollection from '../viewcollection.js'; +import { FocusTracker, KeystrokeHandler, type Locale } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/colorgrid/colorgrid.css'; +/** + * A grid of {@link module:ui/colorgrid/colortileview~ColorTileView color tiles}. + */ +export default class ColorGridView extends View implements DropdownPanelFocusable { + /** + * A number of columns for the tiles grid. + */ + readonly columns: number; + /** + * Collection of the child tile views. + */ + readonly items: ViewCollection; + /** + * Tracks information about DOM focus in the grid. + */ + readonly focusTracker: FocusTracker; + /** + * Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. + */ + readonly keystrokes: KeystrokeHandler; + /** + * The color of the currently selected color tile in {@link #items}. + * + * @observable + */ + selectedColor: string | undefined | null; + /** + * Creates an instance of a color grid containing {@link module:ui/colorgrid/colortileview~ColorTileView tiles}. + * + * @fires execute + * @param locale The localization services instance. + * @param options Component configuration + * @param options.colorDefinitions Array with definitions + * required to create the {@link module:ui/colorgrid/colortileview~ColorTileView tiles}. + * @param options.columns A number of columns to display the tiles. + */ + constructor(locale?: Locale, options?: { + colorDefinitions?: Array; + columns?: number; + }); + /** + * Focuses the first focusable in {@link #items}. + */ + focus(): void; + /** + * Focuses the last focusable in {@link #items}. + */ + focusLast(): void; + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; +} +/** + * A color definition used to create a {@link module:ui/colorgrid/colortileview~ColorTileView}. + * + * ```json + * { + * color: 'hsl(0, 0%, 75%)', + * label: 'Light Grey', + * options: { + * hasBorder: true + * } + * } + * ``` + */ +export interface ColorDefinition { + /** + * String representing a color. + * It is used as value of background-color style in {@link module:ui/colorgrid/colortileview~ColorTileView}. + */ + color: string; + /** + * String used as label for {@link module:ui/colorgrid/colortileview~ColorTileView}. + */ + label: string; + /** + * Additional options passed to create a {@link module:ui/colorgrid/colortileview~ColorTileView}. + */ + options: { + /** + * A flag that indicates if special a CSS class should be added + * to {@link module:ui/colorgrid/colortileview~ColorTileView}, which renders a border around it. + */ + hasBorder: boolean; + }; +} +/** + * Fired when the `ColorTileView` for the picked item is executed. + * + * @eventName ~ColorGridView#execute + * @param data Additional information about the event. +*/ +export type ColorGridViewExecuteEvent = { + name: 'execute'; + args: [data: ColorGridViewExecuteEventData]; +}; +/** + * The data of {@link ~ColorGridViewExecuteEvent execute event}. + */ +export interface ColorGridViewExecuteEventData { + /** + * The value of the selected color ({@link module:ui/colorgrid/colorgridview~ColorDefinition#color `color.color`}). + */ + value: string; + /** + * The `hasBorder` property of the selected color + * ({@link module:ui/colorgrid/colorgridview~ColorDefinition#options `color.options.hasBorder`}). + */ + hasBorder: boolean; + /** + * The label of the selected color ({@link module:ui/colorgrid/colorgridview~ColorDefinition#label `color.label`}) + */ + label: string; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js new file mode 100644 index 0000000..202b9be --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colorgridview.js @@ -0,0 +1,124 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/colorgridview + */ +import View from '../view.js'; +import ColorTileView from './colortileview.js'; +import addKeyboardHandlingForGrid from '../bindings/addkeyboardhandlingforgrid.js'; +import { FocusTracker, KeystrokeHandler } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/colorgrid/colorgrid.css'; +/** + * A grid of {@link module:ui/colorgrid/colortileview~ColorTileView color tiles}. + */ +export default class ColorGridView extends View { + /** + * Creates an instance of a color grid containing {@link module:ui/colorgrid/colortileview~ColorTileView tiles}. + * + * @fires execute + * @param locale The localization services instance. + * @param options Component configuration + * @param options.colorDefinitions Array with definitions + * required to create the {@link module:ui/colorgrid/colortileview~ColorTileView tiles}. + * @param options.columns A number of columns to display the tiles. + */ + constructor(locale, options) { + super(locale); + const colorDefinitions = options && options.colorDefinitions ? options.colorDefinitions : []; + this.columns = options && options.columns ? options.columns : 5; + const viewStyleAttribute = { + gridTemplateColumns: `repeat( ${this.columns}, 1fr)` + }; + this.set('selectedColor', undefined); + this.items = this.createCollection(); + this.focusTracker = new FocusTracker(); + this.keystrokes = new KeystrokeHandler(); + this.items.on('add', (evt, colorTile) => { + colorTile.isOn = colorTile.color === this.selectedColor; + }); + colorDefinitions.forEach(color => { + const colorTile = new ColorTileView(); + colorTile.set({ + color: color.color, + label: color.label, + tooltip: true, + hasBorder: color.options.hasBorder + }); + colorTile.on('execute', () => { + this.fire('execute', { + value: color.color, + hasBorder: color.options.hasBorder, + label: color.label + }); + }); + this.items.add(colorTile); + }); + this.setTemplate({ + tag: 'div', + children: this.items, + attributes: { + class: [ + 'ck', + 'ck-color-grid' + ], + style: viewStyleAttribute + } + }); + this.on('change:selectedColor', (evt, name, selectedColor) => { + for (const item of this.items) { + item.isOn = item.color === selectedColor; + } + }); + } + /** + * Focuses the first focusable in {@link #items}. + */ + focus() { + if (this.items.length) { + this.items.first.focus(); + } + } + /** + * Focuses the last focusable in {@link #items}. + */ + focusLast() { + if (this.items.length) { + this.items.last.focus(); + } + } + /** + * @inheritDoc + */ + render() { + super.render(); + // Items added before rendering should be known to the #focusTracker. + for (const item of this.items) { + this.focusTracker.add(item.element); + } + this.items.on('add', (evt, item) => { + this.focusTracker.add(item.element); + }); + this.items.on('remove', (evt, item) => { + this.focusTracker.remove(item.element); + }); + // Start listening for the keystrokes coming from #element. + this.keystrokes.listenTo(this.element); + addKeyboardHandlingForGrid({ + keystrokeHandler: this.keystrokes, + focusTracker: this.focusTracker, + gridItems: this.items, + numberOfColumns: this.columns, + uiLanguageDirection: this.locale && this.locale.uiLanguageDirection + }); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this.focusTracker.destroy(); + this.keystrokes.destroy(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.d.ts new file mode 100644 index 0000000..a765583 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.d.ts @@ -0,0 +1,28 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/colortileview + */ +import ButtonView from '../button/buttonview.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * This class represents a single color tile in the {@link module:ui/colorgrid/colorgridview~ColorGridView}. + */ +export default class ColorTileView extends ButtonView { + /** + * String representing a color shown as tile's background. + */ + color: string | undefined; + /** + * A flag that toggles a special CSS class responsible for displaying + * a border around the button. + */ + hasBorder: boolean; + constructor(locale?: Locale); + /** + * @inheritDoc + */ + render(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js new file mode 100644 index 0000000..e4aa0cd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/colortileview.js @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/colortileview + */ +import ButtonView from '../button/buttonview.js'; +import checkIcon from '../../theme/icons/color-tile-check.svg'; +/** + * This class represents a single color tile in the {@link module:ui/colorgrid/colorgridview~ColorGridView}. + */ +export default class ColorTileView extends ButtonView { + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + this.set('color', undefined); + this.set('hasBorder', false); + this.icon = checkIcon; + this.extendTemplate({ + attributes: { + style: { + backgroundColor: bind.to('color') + }, + class: [ + 'ck', + 'ck-color-grid__tile', + bind.if('hasBorder', 'ck-color-selector__color-tile_bordered') + ] + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.iconView.fillColor = 'hsl(0, 0%, 100%)'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.d.ts new file mode 100644 index 0000000..87d15da --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.d.ts @@ -0,0 +1,47 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorgrid/utils + */ +import type { Locale } from '@ckeditor/ckeditor5-utils'; +export type ColorOption = string | { + color: string; + label?: string; + hasBorder?: boolean; +}; +export interface NormalizedColorOption { + model: string; + label: string; + hasBorder: boolean; + view: { + name: string; + styles: { + color: string; + }; + }; +} +/** + * Returns color configuration options as defined in `editor.config.(fontColor|fontBackgroundColor).colors` or + * `editor.config.table.(tableProperties|tableCellProperties).(background|border).colors + * but processed to account for editor localization in the correct language. + * + * Note: The reason behind this method is that there is no way to use {@link module:utils/locale~Locale#t} + * when the user configuration is defined because the editor does not exist yet. + * + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + */ +export declare function getLocalizedColorOptions(locale: Locale, options: Array): Array; +/** + * Creates a unified color definition object from color configuration options. + * The object contains the information necessary to both render the UI and initialize the conversion. + */ +export declare function normalizeColorOptions(options: Array): Array; +/** + * Creates a normalized color definition from the user-defined configuration. + * The "normalization" means it will create full + * {@link module:ui/colorgrid/colorgridview~ColorDefinition `ColorDefinition-like`} + * object for string values, and add a `view` property, for each definition. + */ +export declare function normalizeSingleColorDefinition(color: ColorOption): NormalizedColorOption; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js new file mode 100644 index 0000000..e1c8bc3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorgrid/utils.js @@ -0,0 +1,84 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns color configuration options as defined in `editor.config.(fontColor|fontBackgroundColor).colors` or + * `editor.config.table.(tableProperties|tableCellProperties).(background|border).colors + * but processed to account for editor localization in the correct language. + * + * Note: The reason behind this method is that there is no way to use {@link module:utils/locale~Locale#t} + * when the user configuration is defined because the editor does not exist yet. + * + * @param locale The {@link module:core/editor/editor~Editor#locale} instance. + */ +export function getLocalizedColorOptions(locale, options) { + const t = locale.t; + const localizedColorNames = { + Black: t('Black'), + 'Dim grey': t('Dim grey'), + Grey: t('Grey'), + 'Light grey': t('Light grey'), + White: t('White'), + Red: t('Red'), + Orange: t('Orange'), + Yellow: t('Yellow'), + 'Light green': t('Light green'), + Green: t('Green'), + Aquamarine: t('Aquamarine'), + Turquoise: t('Turquoise'), + 'Light blue': t('Light blue'), + Blue: t('Blue'), + Purple: t('Purple') + }; + return options.map(colorOption => { + const label = localizedColorNames[colorOption.label]; + if (label && label != colorOption.label) { + colorOption.label = label; + } + return colorOption; + }); +} +/** + * Creates a unified color definition object from color configuration options. + * The object contains the information necessary to both render the UI and initialize the conversion. + */ +export function normalizeColorOptions(options) { + return options + .map(normalizeSingleColorDefinition) + .filter(option => !!option); +} +/** + * Creates a normalized color definition from the user-defined configuration. + * The "normalization" means it will create full + * {@link module:ui/colorgrid/colorgridview~ColorDefinition `ColorDefinition-like`} + * object for string values, and add a `view` property, for each definition. + */ +export function normalizeSingleColorDefinition(color) { + if (typeof color === 'string') { + return { + model: color, + label: color, + hasBorder: false, + view: { + name: 'span', + styles: { + color + } + } + }; + } + else { + return { + model: color.color, + label: color.label || color.color, + hasBorder: color.hasBorder === undefined ? false : color.hasBorder, + view: { + name: 'span', + styles: { + color: `${color.color}` + } + } + }; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.d.ts new file mode 100644 index 0000000..008522a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.d.ts @@ -0,0 +1,142 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorpicker/colorpickerview + */ +import { type ColorPickerViewConfig } from './utils.js'; +import { type Locale } from '@ckeditor/ckeditor5-utils'; +import View from '../view.js'; +import type ViewCollection from '../viewcollection.js'; +import { HexBase } from 'vanilla-colorful/lib/entrypoints/hex'; +import '../../theme/components/colorpicker/colorpicker.css'; +declare global { + interface HTMLElementTagNameMap { + 'hex-color-picker': HexBase; + } +} +/** + * A class which represents a color picker with an input field for defining custom colors. + */ +export default class ColorPickerView extends View { + /** + * Element with saturation and hue sliders. + */ + picker: HexBase; + /** + * Container for a `#` sign prefix and an input for displaying and defining custom colors + * in HEX format. + */ + hexInputRow: ColorPickerInputRowView; + /** + * Current color selected in the color picker. It can be set by the component itself + * (through the palette or input) or from the outside (e.g. to reflect the current selection color). + */ + color: string; + /** + * List of slider views of the color picker. + */ + slidersView: ViewCollection; + /** + * An internal representation of a color. + * + * Since the picker uses a hex format, that's how we store it. + * + * Since this is unified color format it won't fire a change event if color is changed + * from `#f00` to `#ff0000` (same value, different format). + * + * @observable + * @private + */ + _hexColor: string; + /** + * Debounced function updating the `color` property in the component + * and firing the `ColorPickerColorSelectedEvent`. Executed whenever color in component + * is changed by the user interaction (through the palette or input). + * + * @private + */ + private _debounceColorPickerEvent; + /** + * A reference to the configuration of the color picker specified in the constructor. + * + * @private + */ + private _config; + /** + * Creates a view of color picker. + * + * @param locale + * @param config + */ + constructor(locale: Locale | undefined, config?: ColorPickerViewConfig); + /** + * Renders color picker in the view. + */ + render(): void; + /** + * Focuses the first pointer in color picker. + * + */ + focus(): void; + /** + * Creates collection of sliders in color picker. + * + * @private + */ + private _createSlidersView; + /** + * Creates input row for defining custom colors in color picker. + * + * @private + */ + private _createInputRow; + /** + * Creates the input where user can type or paste the color in hex format. + * + * @private + */ + private _createColorInput; +} +declare class SliderView extends View { + /** + * @param element HTML element of slider in color picker. + */ + constructor(element: HTMLElement); + /** + * Focuses element. + */ + focus(): void; +} +declare class ColorPickerInputRowView extends View { + /** + * A collection of row items (buttons, dropdowns, etc.). + */ + readonly children: ViewCollection; + /** + * Creates an instance of the form row class. + * + * @param locale The locale instance. + */ + constructor(locale: Locale, children?: Array); +} +/** + * An event fired whenever the color was selected through the color picker palette + * or the color picker input. + * + * This even fires only when the user changes the color. It does not fire when the color + * is changed programmatically, e.g. via + * {@link module:ui/colorpicker/colorpickerview~ColorPickerView#color}. + * + * @eventName ~ColorPickerView#colorSelected + */ +export type ColorPickerColorSelectedEvent = { + name: 'colorSelected'; + args: [ + { + color: string; + } + ]; +}; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.js new file mode 100644 index 0000000..e65cef1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/colorpickerview.js @@ -0,0 +1,272 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorpicker/colorpickerview + */ +import { convertColor, convertToHex, registerCustomElement } from './utils.js'; +import { global, env } from '@ckeditor/ckeditor5-utils'; +import { debounce } from 'lodash-es'; +import View from '../view.js'; +import LabeledFieldView from '../labeledfield/labeledfieldview.js'; +import { createLabeledInputText } from '../labeledfield/utils.js'; +// Custom export due to https://github.com/ckeditor/ckeditor5/issues/15698. +import { HexBase } from 'vanilla-colorful/lib/entrypoints/hex'; +import '../../theme/components/colorpicker/colorpicker.css'; +const waitingTime = 150; +/** + * A class which represents a color picker with an input field for defining custom colors. + */ +export default class ColorPickerView extends View { + /** + * Creates a view of color picker. + * + * @param locale + * @param config + */ + constructor(locale, config = {}) { + super(locale); + this.set({ + color: '', + _hexColor: '' + }); + this.hexInputRow = this._createInputRow(); + const children = this.createCollection(); + if (!config.hideInput) { + children.add(this.hexInputRow); + } + this.setTemplate({ + tag: 'div', + attributes: { + class: ['ck', 'ck-color-picker'], + tabindex: -1 + }, + children + }); + this._config = config; + this._debounceColorPickerEvent = debounce((color) => { + // At first, set the color internally in the component. It's converted to the configured output format. + this.set('color', color); + // Then let the outside world know that the user changed the color. + this.fire('colorSelected', { color: this.color }); + }, waitingTime, { + leading: true + }); + // The `color` property holds the color in the configured output format. + // Ensure it before actually setting the value. + this.on('set:color', (evt, propertyName, newValue) => { + evt.return = convertColor(newValue, this._config.format || 'hsl'); + }); + // The `_hexColor` property is bound to the `color` one, but requires conversion. + this.on('change:color', () => { + this._hexColor = convertColorToCommonHexFormat(this.color); + }); + this.on('change:_hexColor', () => { + // Update the selected color in the color picker palette when it's not focused. + // It means the user typed the color in the input. + if (document.activeElement !== this.picker) { + this.picker.setAttribute('color', this._hexColor); + } + // There has to be two way binding between properties. + // Extra precaution has to be taken to trigger change back only when the color really changes. + if (convertColorToCommonHexFormat(this.color) != convertColorToCommonHexFormat(this._hexColor)) { + this.color = this._hexColor; + } + }); + } + /** + * Renders color picker in the view. + */ + render() { + super.render(); + // Extracted to the helper to make it testable. + registerCustomElement('hex-color-picker', HexBase); + this.picker = global.document.createElement('hex-color-picker'); + this.picker.setAttribute('class', 'hex-color-picker'); + this.picker.setAttribute('tabindex', '-1'); + this._createSlidersView(); + if (this.element) { + if (this.hexInputRow.element) { + this.element.insertBefore(this.picker, this.hexInputRow.element); + } + else { + this.element.appendChild(this.picker); + } + // Create custom stylesheet with a look of focused pointer in color picker and append it into the color picker shadowDom + const styleSheetForFocusedColorPicker = document.createElement('style'); + styleSheetForFocusedColorPicker.textContent = '[role="slider"]:focus [part$="pointer"] {' + + 'border: 1px solid #fff;' + + 'outline: 1px solid var(--ck-color-focus-border);' + + 'box-shadow: 0 0 0 2px #fff;' + + '}'; + this.picker.shadowRoot.appendChild(styleSheetForFocusedColorPicker); + } + this.picker.addEventListener('color-changed', event => { + const color = event.detail.value; + this._debounceColorPickerEvent(color); + }); + } + /** + * Focuses the first pointer in color picker. + * + */ + focus() { + // In some browsers we need to move the focus to the input first. + // Otherwise, the color picker doesn't behave as expected. + // In FF, after selecting the color via slider, it instantly moves back to the previous color. + // In all iOS browsers and desktop Safari, once the saturation slider is moved for the first time, + // editor collapses the selection and doesn't apply the color change. + // See: https://github.com/cksource/ckeditor5-internal/issues/3245, https://github.com/ckeditor/ckeditor5/issues/14119, + // https://github.com/cksource/ckeditor5-internal/issues/3268. + /* istanbul ignore next -- @preserve */ + if (!this._config.hideInput && (env.isGecko || env.isiOS || env.isSafari)) { + const input = this.hexInputRow.children.get(1); + input.focus(); + } + const firstSlider = this.slidersView.first; + firstSlider.focus(); + } + /** + * Creates collection of sliders in color picker. + * + * @private + */ + _createSlidersView() { + const colorPickersChildren = [...this.picker.shadowRoot.children]; + const sliders = colorPickersChildren.filter(item => item.getAttribute('role') === 'slider'); + const slidersView = sliders.map(slider => { + const view = new SliderView(slider); + return view; + }); + this.slidersView = this.createCollection(); + slidersView.forEach(item => { + this.slidersView.add(item); + }); + } + /** + * Creates input row for defining custom colors in color picker. + * + * @private + */ + _createInputRow() { + const hashView = new HashView(); + const colorInput = this._createColorInput(); + return new ColorPickerInputRowView(this.locale, [hashView, colorInput]); + } + /** + * Creates the input where user can type or paste the color in hex format. + * + * @private + */ + _createColorInput() { + const labeledInput = new LabeledFieldView(this.locale, createLabeledInputText); + const { t } = this.locale; + labeledInput.set({ + label: t('HEX'), + class: 'color-picker-hex-input' + }); + labeledInput.fieldView.bind('value').to(this, '_hexColor', pickerColor => { + if (labeledInput.isFocused) { + // Text field shouldn't be updated with color change if the text field is focused. + // Imagine user typing hex code and getting the value of field changed. + return labeledInput.fieldView.value; + } + else { + return pickerColor.startsWith('#') ? pickerColor.substring(1) : pickerColor; + } + }); + // Only accept valid hex colors as input. + labeledInput.fieldView.on('input', () => { + const inputValue = labeledInput.fieldView.element.value; + if (inputValue) { + // Trim the whitespace. + const trimmedValue = inputValue.trim(); + // Drop the `#` from the beginning if present. + const hashlessInput = trimmedValue.startsWith('#') ? trimmedValue.substring(1) : trimmedValue; + // Check if it's a hex color (3,4,6 or 8 chars long and with proper characters). + const isValidHexColor = [3, 4, 6, 8].includes(hashlessInput.length) && + /(([0-9a-fA-F]{2}){3,4}|([0-9a-fA-F]){3,4})/.test(hashlessInput); + if (isValidHexColor) { + // If so, set the color. + // Otherwise, do nothing. + this._debounceColorPickerEvent('#' + hashlessInput); + } + } + }); + return labeledInput; + } +} +// Converts any color format to a unified hex format. +// +// @param inputColor +// @returns An unified hex string. +function convertColorToCommonHexFormat(inputColor) { + let ret = convertToHex(inputColor); + if (!ret) { + ret = '#000'; + } + if (ret.length === 4) { + // Unfold shortcut format. + ret = '#' + [ret[1], ret[1], ret[2], ret[2], ret[3], ret[3]].join(''); + } + return ret.toLowerCase(); +} +// View abstraction over pointer in color picker. +class SliderView extends View { + /** + * @param element HTML element of slider in color picker. + */ + constructor(element) { + super(); + this.element = element; + } + /** + * Focuses element. + */ + focus() { + this.element.focus(); + } +} +// View abstraction over the `#` character before color input. +class HashView extends View { + constructor(locale) { + super(locale); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-color-picker__hash-view' + ] + }, + children: '#' + }); + } +} +// The class representing a row containing hex color input field. +// **Note**: For now this class is private. When more use cases appear (beyond `ckeditor5-table` and `ckeditor5-image`), +// it will become a component in `ckeditor5-ui`. +// +// @private +class ColorPickerInputRowView extends View { + /** + * Creates an instance of the form row class. + * + * @param locale The locale instance. + */ + constructor(locale, children) { + super(locale); + this.children = this.createCollection(children); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-color-picker__row' + ] + }, + children: this.children + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.d.ts new file mode 100644 index 0000000..2946ea0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.d.ts @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Color formats handled by color converter. + */ +export type ColorPickerOutputFormat = 'hex' | 'rgb' | 'hsl' | 'hwb' | 'lab' | 'lch'; +/** + * Configuration of the color picker feature. + * + * It can be forced to apply colors in the editor in a particular format. + * + * @default `{ + * format: 'hsl' + * }` + */ +export type ColorPickerConfig = { + format?: ColorPickerOutputFormat; +}; +/** + * Configuration of the color picker view. + * + * It can be used to enforce a particular color format or hide the color input. + */ +export type ColorPickerViewConfig = ColorPickerConfig & { + hideInput?: boolean; +}; +/** + * Parses and converts the color string to requested format. Handles variety of color spaces + * like `hsl`, `hex` or `rgb`. + * + * @param color + * @returns A color string. + */ +export declare function convertColor(color: string, outputFormat: ColorPickerOutputFormat): string; +/** + * Converts a color string to hex format. + * + * @param color + * @returns A color string. + */ +export declare function convertToHex(color: string): string; +/** + * Registers the custom element in the + * [CustomElementsRegistry](https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry). + */ +export declare function registerCustomElement(elementName: string, constructor: CustomElementConstructor): void; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.js new file mode 100644 index 0000000..a77439d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorpicker/utils.js @@ -0,0 +1,108 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorpicker/utils + */ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// There are no available types for 'color-parse' module. +// @ts-ignore +import { default as parse } from 'color-parse'; +import * as convert from 'color-convert'; +/** + * Parses and converts the color string to requested format. Handles variety of color spaces + * like `hsl`, `hex` or `rgb`. + * + * @param color + * @returns A color string. + */ +export function convertColor(color, outputFormat) { + if (!color) { + return ''; + } + const colorObject = parseColorString(color); + if (!colorObject) { + return ''; + } + if (colorObject.space === outputFormat) { + return color; + } + if (!canConvertParsedColor(colorObject)) { + return ''; + } + const fromColorSpace = convert[colorObject.space]; + const toColorSpace = fromColorSpace[outputFormat]; + if (!toColorSpace) { + return ''; + } + const convertedColorChannels = toColorSpace(colorObject.space === 'hex' ? colorObject.hexValue : colorObject.values); + return formatColorOutput(convertedColorChannels, outputFormat); +} +/** + * Converts a color string to hex format. + * + * @param color + * @returns A color string. + */ +export function convertToHex(color) { + if (!color) { + return ''; + } + const colorObject = parseColorString(color); + if (!colorObject) { + return '#000'; + } + if (colorObject.space === 'hex') { + return colorObject.hexValue; + } + return convertColor(color, 'hex'); +} +/** + * Registers the custom element in the + * [CustomElementsRegistry](https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry). + */ +export function registerCustomElement(elementName, constructor) { + if (customElements.get(elementName) === undefined) { + customElements.define(elementName, constructor); + } +} +/** + * Formats the passed color channels according to the requested format. + * + * @param values + * @param format + * @returns A color string. + */ +function formatColorOutput(values, format) { + switch (format) { + case 'hex': return `#${values}`; + case 'rgb': return `rgb( ${values[0]}, ${values[1]}, ${values[2]} )`; + case 'hsl': return `hsl( ${values[0]}, ${values[1]}%, ${values[2]}% )`; + case 'hwb': return `hwb( ${values[0]}, ${values[1]}, ${values[2]} )`; + case 'lab': return `lab( ${values[0]}% ${values[1]} ${values[2]} )`; + case 'lch': return `lch( ${values[0]}% ${values[1]} ${values[2]} )`; + default: return ''; + } +} +function parseColorString(colorString) { + // Parser library treats `hex` format as belonging to `rgb` space | which messes up further conversion. + // Let's parse such strings on our own. + if (colorString.startsWith('#')) { + const parsedHex = parse(colorString); + return { + space: 'hex', + values: parsedHex.values, + hexValue: colorString, + alpha: parsedHex.alpha + }; + } + const parsed = parse(colorString); + if (!parsed.space) { + return null; + } + return parsed; +} +function canConvertParsedColor(parsedColor) { + return Object.keys(convert).includes(parsedColor.space); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.d.ts new file mode 100644 index 0000000..ef9f717 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.d.ts @@ -0,0 +1,195 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/colorgridsfragmentview + */ +import View from '../view.js'; +import ButtonView from '../button/buttonview.js'; +import ColorGridView, { type ColorDefinition } from '../colorgrid/colorgridview.js'; +import DocumentColorCollection from './documentcolorcollection.js'; +import type { Model } from '@ckeditor/ckeditor5-engine'; +import type { FocusTracker, Locale } from '@ckeditor/ckeditor5-utils'; +import type ViewCollection from '../viewcollection.js'; +import type { FocusableView } from '../focuscycler.js'; +/** + * One of the fragments of {@link module:ui/colorselector/colorselectorview~ColorSelectorView}. + * + * It provides a UI that allows users to select colors from the a predefined set and from existing document colors. + * + * It consists of the following sub–components: + * + * * A "Remove color" button, + * * A static {@link module:ui/colorgrid/colorgridview~ColorGridView} of colors defined in the configuration, + * * A dynamic {@link module:ui/colorgrid/colorgridview~ColorGridView} of colors used in the document. + * * If color picker is configured, the "Color Picker" button is visible too. + */ +export default class ColorGridsFragmentView extends View { + /** + * A collection of the children of the table. + */ + readonly items: ViewCollection; + /** + * An array with objects representing colors to be displayed in the grid. + */ + colorDefinitions: Array; + /** + * Tracks information about the DOM focus in the list. + */ + readonly focusTracker: FocusTracker; + /** + * The number of columns in the color grid. + */ + columns: number; + /** + * Preserves the reference to {@link module:ui/colorselector/documentcolorcollection~DocumentColorCollection} used to collect + * definitions that store the document colors. + * + * @readonly + */ + documentColors: DocumentColorCollection; + /** + * The maximum number of colors in the document colors section. + * If it equals 0, the document colors section is not added. + * + * @readonly + */ + documentColorsCount?: number; + /** + * Keeps the value of the command associated with the table for the current selection. + */ + selectedColor: string; + /** + * Preserves the reference to {@link module:ui/colorgrid/colorgridview~ColorGridView} used to create + * the default (static) color set. + * + * The property is loaded once the the parent dropdown is opened the first time. + * + * @readonly + */ + staticColorsGrid: ColorGridView | undefined; + /** + * Preserves the reference to {@link module:ui/colorgrid/colorgridview~ColorGridView} used to create + * the document colors. It remains undefined if the document colors feature is disabled. + * + * The property is loaded once the the parent dropdown is opened the first time. + * + * @readonly + */ + documentColorsGrid: ColorGridView | undefined; + /** + * The "Color picker" button view. + */ + colorPickerButtonView?: ButtonView; + /** + * The "Remove color" button view. + */ + removeColorButtonView: ButtonView; + /** + * The property which is responsible for is component visible or not. + */ + isVisible: boolean; + /** + * A collection of views that can be focused in the view. + * + * @readonly + */ + protected _focusables: ViewCollection; + /** + * Document color section's label. + * + * @readonly + */ + private _documentColorsLabel?; + /** + * The label of the button responsible for removing color attributes. + */ + private _removeButtonLabel; + /** + * The label of the button responsible for switching to the color picker component. + */ + private _colorPickerLabel; + /** + * Creates an instance of the view. + * + * @param locale The localization services instance. + * @param colors An array with definitions of colors to be displayed in the table. + * @param columns The number of columns in the color grid. + * @param removeButtonLabel The label of the button responsible for removing the color. + * @param colorPickerLabel The label of the button responsible for color picker appearing. + * @param documentColorsLabel The label for the section with the document colors. + * @param documentColorsCount The number of colors in the document colors section inside the color dropdown. + * @param focusTracker Tracks information about the DOM focus in the list. + * @param focusables A collection of views that can be focused in the view. + */ + constructor(locale: Locale, { colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, focusTracker, focusables }: { + colors: Array; + columns: number; + removeButtonLabel: string; + colorPickerLabel: string; + documentColorsLabel?: string; + documentColorsCount?: number; + focusTracker: FocusTracker; + focusables: ViewCollection; + }); + /** + * Scans through the editor model and searches for text node attributes with the given attribute name. + * Found entries are set as document colors. + * + * All the previously stored document colors will be lost in the process. + * + * @param model The model used as a source to obtain the document colors. + * @param attributeName Determines the name of the related model's attribute for a given dropdown. + */ + updateDocumentColors(model: Model, attributeName: string): void; + /** + * Refreshes the state of the selected color in one or both {@link module:ui/colorgrid/colorgridview~ColorGridView}s + * available in the {@link module:ui/colorselector/colorselectorview~ColorSelectorView}. It guarantees that the selection will + * occur only in one of them. + */ + updateSelectedColors(): void; + /** + * @inheritDoc + */ + render(): void; + /** + * Focuses the component. + */ + focus(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Handles displaying the color picker button (if it was previously created) and making it focusable. + */ + addColorPickerButton(): void; + /** + * Adds color selector elements to focus tracker. + */ + private _addColorSelectorElementsToFocusTracker; + /** + * Creates the button responsible for displaying the color picker component. + */ + private _createColorPickerButton; + /** + * Adds the remove color button as a child of the current view. + */ + private _createRemoveColorButton; + /** + * Creates a static color grid based on the editor configuration. + */ + private _createStaticColorsGrid; + /** + * Creates the document colors section view and binds it to {@link #documentColors}. + */ + private _createDocumentColorsGrid; + /** + * Adds a given color to the document colors list. If possible, the method will attempt to use + * data from the {@link #colorDefinitions} (label, color options). + * + * @param color A string that stores the value of the recently applied color. + */ + private _addColorToDocumentColors; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.js new file mode 100644 index 0000000..a046187 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorgridsfragmentview.js @@ -0,0 +1,288 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/colorgridsfragmentview + */ +import View from '../view.js'; +import ButtonView from '../button/buttonview.js'; +import ColorGridView from '../colorgrid/colorgridview.js'; +import ColorTileView from '../colorgrid/colortileview.js'; +import LabelView from '../label/labelview.js'; +import Template from '../template.js'; +import DocumentColorCollection from './documentcolorcollection.js'; +import { icons } from '@ckeditor/ckeditor5-core'; +const { eraser: removeButtonIcon, colorPalette: colorPaletteIcon } = icons; +/** + * One of the fragments of {@link module:ui/colorselector/colorselectorview~ColorSelectorView}. + * + * It provides a UI that allows users to select colors from the a predefined set and from existing document colors. + * + * It consists of the following sub–components: + * + * * A "Remove color" button, + * * A static {@link module:ui/colorgrid/colorgridview~ColorGridView} of colors defined in the configuration, + * * A dynamic {@link module:ui/colorgrid/colorgridview~ColorGridView} of colors used in the document. + * * If color picker is configured, the "Color Picker" button is visible too. + */ +export default class ColorGridsFragmentView extends View { + /** + * Creates an instance of the view. + * + * @param locale The localization services instance. + * @param colors An array with definitions of colors to be displayed in the table. + * @param columns The number of columns in the color grid. + * @param removeButtonLabel The label of the button responsible for removing the color. + * @param colorPickerLabel The label of the button responsible for color picker appearing. + * @param documentColorsLabel The label for the section with the document colors. + * @param documentColorsCount The number of colors in the document colors section inside the color dropdown. + * @param focusTracker Tracks information about the DOM focus in the list. + * @param focusables A collection of views that can be focused in the view. + */ + constructor(locale, { colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, focusTracker, focusables }) { + super(locale); + const bind = this.bindTemplate; + this.set('isVisible', true); + this.focusTracker = focusTracker; + this.items = this.createCollection(); + this.colorDefinitions = colors; + this.columns = columns; + this.documentColors = new DocumentColorCollection(); + this.documentColorsCount = documentColorsCount; + this._focusables = focusables; + this._removeButtonLabel = removeButtonLabel; + this._colorPickerLabel = colorPickerLabel; + this._documentColorsLabel = documentColorsLabel; + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck-color-grids-fragment', + bind.if('isVisible', 'ck-hidden', value => !value) + ] + }, + children: this.items + }); + this.removeColorButtonView = this._createRemoveColorButton(); + this.items.add(this.removeColorButtonView); + } + /** + * Scans through the editor model and searches for text node attributes with the given attribute name. + * Found entries are set as document colors. + * + * All the previously stored document colors will be lost in the process. + * + * @param model The model used as a source to obtain the document colors. + * @param attributeName Determines the name of the related model's attribute for a given dropdown. + */ + updateDocumentColors(model, attributeName) { + const document = model.document; + const maxCount = this.documentColorsCount; + this.documentColors.clear(); + for (const root of document.getRoots()) { + const range = model.createRangeIn(root); + for (const node of range.getItems()) { + if (node.is('$textProxy') && node.hasAttribute(attributeName)) { + this._addColorToDocumentColors(node.getAttribute(attributeName)); + if (this.documentColors.length >= maxCount) { + return; + } + } + } + } + } + /** + * Refreshes the state of the selected color in one or both {@link module:ui/colorgrid/colorgridview~ColorGridView}s + * available in the {@link module:ui/colorselector/colorselectorview~ColorSelectorView}. It guarantees that the selection will + * occur only in one of them. + */ + updateSelectedColors() { + const documentColorsGrid = this.documentColorsGrid; + const staticColorsGrid = this.staticColorsGrid; + const selectedColor = this.selectedColor; + staticColorsGrid.selectedColor = selectedColor; + if (documentColorsGrid) { + documentColorsGrid.selectedColor = selectedColor; + } + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.staticColorsGrid = this._createStaticColorsGrid(); + this.items.add(this.staticColorsGrid); + if (this.documentColorsCount) { + // Create a label for document colors. + const bind = Template.bind(this.documentColors, this.documentColors); + const label = new LabelView(this.locale); + label.text = this._documentColorsLabel; + label.extendTemplate({ + attributes: { + class: [ + 'ck', + 'ck-color-grid__label', + bind.if('isEmpty', 'ck-hidden') + ] + } + }); + this.items.add(label); + this.documentColorsGrid = this._createDocumentColorsGrid(); + this.items.add(this.documentColorsGrid); + } + this._createColorPickerButton(); + this._addColorSelectorElementsToFocusTracker(); + } + /** + * Focuses the component. + */ + focus() { + this.removeColorButtonView.focus(); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + } + /** + * Handles displaying the color picker button (if it was previously created) and making it focusable. + */ + addColorPickerButton() { + if (this.colorPickerButtonView) { + this.items.add(this.colorPickerButtonView); + this.focusTracker.add(this.colorPickerButtonView.element); + this._focusables.add(this.colorPickerButtonView); + } + } + /** + * Adds color selector elements to focus tracker. + */ + _addColorSelectorElementsToFocusTracker() { + this.focusTracker.add(this.removeColorButtonView.element); + this._focusables.add(this.removeColorButtonView); + if (this.staticColorsGrid) { + this.focusTracker.add(this.staticColorsGrid.element); + this._focusables.add(this.staticColorsGrid); + } + if (this.documentColorsGrid) { + this.focusTracker.add(this.documentColorsGrid.element); + this._focusables.add(this.documentColorsGrid); + } + } + /** + * Creates the button responsible for displaying the color picker component. + */ + _createColorPickerButton() { + this.colorPickerButtonView = new ButtonView(); + this.colorPickerButtonView.set({ + label: this._colorPickerLabel, + withText: true, + icon: colorPaletteIcon, + class: 'ck-color-selector__color-picker' + }); + this.colorPickerButtonView.on('execute', () => { + this.fire('colorPicker:show'); + }); + } + /** + * Adds the remove color button as a child of the current view. + */ + _createRemoveColorButton() { + const buttonView = new ButtonView(); + buttonView.set({ + withText: true, + icon: removeButtonIcon, + label: this._removeButtonLabel + }); + buttonView.class = 'ck-color-selector__remove-color'; + buttonView.on('execute', () => { + this.fire('execute', { + value: null, + source: 'removeColorButton' + }); + }); + buttonView.render(); + return buttonView; + } + /** + * Creates a static color grid based on the editor configuration. + */ + _createStaticColorsGrid() { + const colorGrid = new ColorGridView(this.locale, { + colorDefinitions: this.colorDefinitions, + columns: this.columns + }); + colorGrid.on('execute', (evt, data) => { + this.fire('execute', { + value: data.value, + source: 'staticColorsGrid' + }); + }); + return colorGrid; + } + /** + * Creates the document colors section view and binds it to {@link #documentColors}. + */ + _createDocumentColorsGrid() { + const bind = Template.bind(this.documentColors, this.documentColors); + const documentColorsGrid = new ColorGridView(this.locale, { + columns: this.columns + }); + documentColorsGrid.extendTemplate({ + attributes: { + class: bind.if('isEmpty', 'ck-hidden') + } + }); + documentColorsGrid.items.bindTo(this.documentColors).using(colorObj => { + const colorTile = new ColorTileView(); + colorTile.set({ + color: colorObj.color, + hasBorder: colorObj.options && colorObj.options.hasBorder + }); + if (colorObj.label) { + colorTile.set({ + label: colorObj.label, + tooltip: true + }); + } + colorTile.on('execute', () => { + this.fire('execute', { + value: colorObj.color, + source: 'documentColorsGrid' + }); + }); + return colorTile; + }); + // Selected color should be cleared when document colors became empty. + this.documentColors.on('change:isEmpty', (evt, name, val) => { + if (val) { + documentColorsGrid.selectedColor = null; + } + }); + return documentColorsGrid; + } + /** + * Adds a given color to the document colors list. If possible, the method will attempt to use + * data from the {@link #colorDefinitions} (label, color options). + * + * @param color A string that stores the value of the recently applied color. + */ + _addColorToDocumentColors(color) { + const predefinedColor = this.colorDefinitions + .find(definition => definition.color === color); + if (!predefinedColor) { + this.documentColors.add({ + color, + label: color, + options: { + hasBorder: false + } + }); + } + else { + this.documentColors.add(Object.assign({}, predefinedColor)); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.d.ts new file mode 100644 index 0000000..cef8bed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.d.ts @@ -0,0 +1,129 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/colorpickerfragmentview + */ +import View from '../view.js'; +import ButtonView from '../button/buttonview.js'; +import type ViewCollection from '../viewcollection.js'; +import type { FocusableView } from '../focuscycler.js'; +import { default as ColorPickerView } from '../colorpicker/colorpickerview.js'; +import type { FocusTracker, KeystrokeHandler, Locale } from '@ckeditor/ckeditor5-utils'; +import type { ColorPickerViewConfig } from '../colorpicker/utils.js'; +/** + * One of the fragments of {@link module:ui/colorselector/colorselectorview~ColorSelectorView}. + * + * It allows users to select a color from a color picker. + * + * It consists of the following sub–components: + * + * * A color picker saturation and hue sliders, + * * A text input accepting colors in HEX format, + * * "Save" and "Cancel" action buttons. + */ +export default class ColorPickerFragmentView extends View { + /** + * A collection of component's children. + */ + readonly items: ViewCollection; + /** + * A view with saturation and hue sliders and color input. + */ + colorPickerView?: ColorPickerView; + /** + * The "Save" button view. + */ + saveButtonView: ButtonView; + /** + * The "Cancel" button view. + */ + cancelButtonView: ButtonView; + /** + * The action bar where are "Save" button and "Cancel" button. + */ + actionBarView: View; + /** + * Tracks information about the DOM focus in the list. + */ + readonly focusTracker: FocusTracker; + /** + * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. + */ + readonly keystrokes: KeystrokeHandler; + /** + * Indicates whether the component is visible or not. + */ + isVisible: boolean; + /** + * Keeps the value of the command associated with the component for the current selection. + */ + selectedColor?: string; + /** + * A collection of views that can be focused in the view. + * + * @readonly + */ + protected _focusables: ViewCollection; + /** + * A reference to the configuration of {@link #colorPickerView}. `false` when the view was + * configured without a color picker. + * + * @readonly + */ + private _colorPickerViewConfig; + /** + * Creates an instance of the view. + * + * @param locale The localization services instance. + * @param focusTracker Tracks information about the DOM focus in the list. + * @param focusables A collection of views that can be focused in the view.. + * @param keystrokes An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. + * @param colorPickerViewConfig The configuration of color picker feature. If set to `false`, the color picker + * will not be rendered. + */ + constructor(locale: Locale, { focusTracker, focusables, keystrokes, colorPickerViewConfig }: { + focusTracker: FocusTracker; + focusables: ViewCollection; + keystrokes: KeystrokeHandler; + colorPickerViewConfig: ColorPickerViewConfig | false; + }); + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Focuses the color picker. + */ + focus(): void; + /** + * When color picker is focused and "enter" is pressed it executes command. + */ + private _executeOnEnterPress; + /** + * Removes default behavior of arrow keys in dropdown. + */ + private _stopPropagationOnArrowsKeys; + /** + * Adds color picker elements to focus tracker. + */ + private _addColorPickersElementsToFocusTracker; + /** + * Creates bar containing "Save" and "Cancel" buttons. + */ + private _createActionBarView; + /** + * Creates "Save" and "Cancel" buttons. + */ + private _createActionButtons; + /** + * Fires the `execute` event if color in color picker has been changed + * by the user. + */ + private _executeUponColorChange; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.js new file mode 100644 index 0000000..df35502 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorpickerfragmentview.js @@ -0,0 +1,204 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/colorpickerfragmentview + */ +import View from '../view.js'; +import ButtonView from '../button/buttonview.js'; +import { default as ColorPickerView } from '../colorpicker/colorpickerview.js'; +import { icons } from '@ckeditor/ckeditor5-core'; +/** + * One of the fragments of {@link module:ui/colorselector/colorselectorview~ColorSelectorView}. + * + * It allows users to select a color from a color picker. + * + * It consists of the following sub–components: + * + * * A color picker saturation and hue sliders, + * * A text input accepting colors in HEX format, + * * "Save" and "Cancel" action buttons. + */ +export default class ColorPickerFragmentView extends View { + /** + * Creates an instance of the view. + * + * @param locale The localization services instance. + * @param focusTracker Tracks information about the DOM focus in the list. + * @param focusables A collection of views that can be focused in the view.. + * @param keystrokes An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. + * @param colorPickerViewConfig The configuration of color picker feature. If set to `false`, the color picker + * will not be rendered. + */ + constructor(locale, { focusTracker, focusables, keystrokes, colorPickerViewConfig }) { + super(locale); + this.items = this.createCollection(); + this.focusTracker = focusTracker; + this.keystrokes = keystrokes; + this.set('isVisible', false); + this.set('selectedColor', undefined); + this._focusables = focusables; + this._colorPickerViewConfig = colorPickerViewConfig; + const bind = this.bindTemplate; + const { saveButtonView, cancelButtonView } = this._createActionButtons(); + this.saveButtonView = saveButtonView; + this.cancelButtonView = cancelButtonView; + this.actionBarView = this._createActionBarView({ saveButtonView, cancelButtonView }); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck-color-picker-fragment', + bind.if('isVisible', 'ck-hidden', value => !value) + ] + }, + children: this.items + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + const colorPickerView = new ColorPickerView(this.locale, { + ...this._colorPickerViewConfig + }); + this.colorPickerView = colorPickerView; + this.colorPickerView.render(); + if (this.selectedColor) { + colorPickerView.color = this.selectedColor; + } + this.listenTo(this, 'change:selectedColor', (evt, name, value) => { + colorPickerView.color = value; + }); + this.items.add(this.colorPickerView); + this.items.add(this.actionBarView); + this._addColorPickersElementsToFocusTracker(); + this._stopPropagationOnArrowsKeys(); + this._executeOnEnterPress(); + this._executeUponColorChange(); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + } + /** + * Focuses the color picker. + */ + focus() { + this.colorPickerView.focus(); + } + /** + * When color picker is focused and "enter" is pressed it executes command. + */ + _executeOnEnterPress() { + this.keystrokes.set('enter', evt => { + if (this.isVisible && this.focusTracker.focusedElement !== this.cancelButtonView.element) { + this.fire('execute', { + value: this.selectedColor + }); + evt.stopPropagation(); + evt.preventDefault(); + } + }); + } + /** + * Removes default behavior of arrow keys in dropdown. + */ + _stopPropagationOnArrowsKeys() { + const stopPropagation = (data) => data.stopPropagation(); + this.keystrokes.set('arrowright', stopPropagation); + this.keystrokes.set('arrowleft', stopPropagation); + this.keystrokes.set('arrowup', stopPropagation); + this.keystrokes.set('arrowdown', stopPropagation); + } + /** + * Adds color picker elements to focus tracker. + */ + _addColorPickersElementsToFocusTracker() { + for (const slider of this.colorPickerView.slidersView) { + this.focusTracker.add(slider.element); + this._focusables.add(slider); + } + const input = this.colorPickerView.hexInputRow.children.get(1); + if (input.element) { + this.focusTracker.add(input.element); + this._focusables.add(input); + } + this.focusTracker.add(this.saveButtonView.element); + this._focusables.add(this.saveButtonView); + this.focusTracker.add(this.cancelButtonView.element); + this._focusables.add(this.cancelButtonView); + } + /** + * Creates bar containing "Save" and "Cancel" buttons. + */ + _createActionBarView({ saveButtonView, cancelButtonView }) { + const actionBarRow = new View(); + const children = this.createCollection(); + children.add(saveButtonView); + children.add(cancelButtonView); + actionBarRow.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-color-selector_action-bar' + ] + }, + children + }); + return actionBarRow; + } + /** + * Creates "Save" and "Cancel" buttons. + */ + _createActionButtons() { + const locale = this.locale; + const t = locale.t; + const saveButtonView = new ButtonView(locale); + const cancelButtonView = new ButtonView(locale); + saveButtonView.set({ + icon: icons.check, + class: 'ck-button-save', + type: 'button', + withText: false, + label: t('Accept') + }); + cancelButtonView.set({ + icon: icons.cancel, + class: 'ck-button-cancel', + type: 'button', + withText: false, + label: t('Cancel') + }); + saveButtonView.on('execute', () => { + this.fire('execute', { + source: 'colorPickerSaveButton', + value: this.selectedColor + }); + }); + cancelButtonView.on('execute', () => { + this.fire('colorPicker:cancel'); + }); + return { + saveButtonView, cancelButtonView + }; + } + /** + * Fires the `execute` event if color in color picker has been changed + * by the user. + */ + _executeUponColorChange() { + this.colorPickerView.on('colorSelected', (evt, data) => { + this.fire('execute', { + value: data.color, + source: 'colorPicker' + }); + this.set('selectedColor', data.color); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.d.ts new file mode 100644 index 0000000..9a61540 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.d.ts @@ -0,0 +1,242 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/colorselectorview + */ +import FocusCycler, { type FocusableView } from '../focuscycler.js'; +import View from '../view.js'; +import ViewCollection from '../viewcollection.js'; +import { FocusTracker, KeystrokeHandler, type Locale } from '@ckeditor/ckeditor5-utils'; +import type { ColorPickerViewConfig } from '../colorpicker/utils.js'; +import type { ColorDefinition } from '../colorgrid/colorgridview.js'; +import type { Model } from '@ckeditor/ckeditor5-engine'; +import ColorGridsFragmentView from './colorgridsfragmentview.js'; +import ColorPickerFragmentView from './colorpickerfragmentview.js'; +import '../../theme/components/colorselector/colorselector.css'; +/** + * The configurable color selector view class. It allows users to select colors from a predefined set of colors as well as from + * a color picker. + * + * This meta-view is is made of two components (fragments): + * + * * {@link module:ui/colorselector/colorselectorview~ColorSelectorView#colorGridsFragmentView}, + * * {@link module:ui/colorselector/colorselectorview~ColorSelectorView#colorPickerFragmentView}. + * + * ```ts + * const colorDefinitions = [ + * { color: '#000', label: 'Black', options: { hasBorder: false } }, + * { color: 'rgb(255, 255, 255)', label: 'White', options: { hasBorder: true } }, + * { color: 'red', label: 'Red', options: { hasBorder: false } } + * ]; + * + * const selectorView = new ColorSelectorView( locale, { + * colors: colorDefinitions, + * columns: 5, + * removeButtonLabel: 'Remove color', + * documentColorsLabel: 'Document colors', + * documentColorsCount: 4, + * colorPickerViewConfig: { + * format: 'hsl' + * } + * } ); + * + * selectorView.appendUI(); + * selectorView.selectedColor = 'red'; + * selectorView.updateSelectedColors(); + * + * selectorView.on( 'execute', ( evt, data ) => { + * console.log( 'Color changed', data.value, data.source ); + * } ); + * + * selectorView.on( 'colorPicker:show', ( evt ) => { + * console.log( 'Color picker showed up', evt ); + * } ); + * + * selectorView.on( 'colorPicker:cancel', ( evt ) => { + * console.log( 'Color picker cancel', evt ); + * } ); + * + * selectorView.render(); + * + * document.body.appendChild( selectorView.element ); + * ``` + */ +export default class ColorSelectorView extends View { + /** + * Tracks information about the DOM focus in the list. + */ + readonly focusTracker: FocusTracker; + /** + * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. + */ + readonly keystrokes: KeystrokeHandler; + /** + * A collection of components. + */ + readonly items: ViewCollection; + /** + * A fragment that allows users to select colors from the a predefined set and from existing document colors. + */ + readonly colorGridsFragmentView: ColorGridsFragmentView; + /** + * A fragment that allows users to select a color from a color picker. + */ + readonly colorPickerFragmentView: ColorPickerFragmentView; + /** + * Keeps the value of the command associated with the component for the current selection. + */ + selectedColor?: string; + /** + * Reflects the visibility state of the color grids fragment. + * + * @internal + */ + _isColorGridsFragmentVisible: boolean; + /** + * Reflects the visibility state of the color picker fragment. + * + * @internal + */ + _isColorPickerFragmentVisible: boolean; + /** + * Helps cycling over focusable {@link #items} in the list. + * + * @readonly + */ + protected _focusCycler: FocusCycler; + /** + * A collection of views that can be focused in the view. + * + * @readonly + */ + protected _focusables: ViewCollection; + /** + * The configuration of color picker sub-component. + */ + private _colorPickerViewConfig; + /** + * Creates a view to be inserted as a child of {@link module:ui/dropdown/dropdownview~DropdownView}. + * + * @param locale The localization services instance. + * @param colors An array with definitions of colors to be displayed in the table. + * @param columns The number of columns in the color grid. + * @param removeButtonLabel The label of the button responsible for removing the color. + * @param colorPickerLabel The label of the button responsible for color picker appearing. + * @param documentColorsLabel The label for the section with the document colors. + * @param documentColorsCount The number of colors in the document colors section inside the color dropdown. + * @param colorPickerViewConfig The configuration of color picker feature. If set to `false`, the color picker will be hidden. + */ + constructor(locale: Locale, { colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, colorPickerViewConfig }: { + colors: Array; + columns: number; + removeButtonLabel: string; + documentColorsLabel?: string; + documentColorsCount?: number; + colorPickerLabel: string; + colorPickerViewConfig: ColorPickerViewConfig | false; + }); + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Renders the internals of the component on demand: + * * {@link #colorPickerFragmentView}, + * * {@link #colorGridsFragmentView}. + * + * It allows for deferring component initialization to improve the performance. + * + * See {@link #showColorPickerFragment}, {@link #showColorGridsFragment}. + */ + appendUI(): void; + /** + * Shows the {@link #colorPickerFragmentView} and hides the {@link #colorGridsFragmentView}. + * + * **Note**: It requires {@link #appendUI} to be called first. + * + * See {@link #showColorGridsFragment}, {@link ~ColorSelectorView#event:colorPicker:show}. + */ + showColorPickerFragment(): void; + /** + * Shows the {@link #colorGridsFragmentView} and hides the {@link #colorPickerFragmentView}. + * + * See {@link #showColorPickerFragment}. + * + * **Note**: It requires {@link #appendUI} to be called first. + */ + showColorGridsFragment(): void; + /** + * Focuses the first focusable element in {@link #items}. + */ + focus(): void; + /** + * Focuses the last focusable element in {@link #items}. + */ + focusLast(): void; + /** + * Scans through the editor model and searches for text node attributes with the given `attributeName`. + * Found entries are set as document colors in {@link #colorGridsFragmentView}. + * + * All the previously stored document colors will be lost in the process. + * + * @param model The model used as a source to obtain the document colors. + * @param attributeName Determines the name of the related model's attribute for a given dropdown. + */ + updateDocumentColors(model: Model, attributeName: string): void; + /** + * Refreshes the state of the selected color in one or both grids located in {@link #colorGridsFragmentView}. + * + * It guarantees that the selection will occur only in one of them. + */ + updateSelectedColors(): void; + /** + * Appends the view containing static and document color grid views. + */ + private _appendColorGridsFragment; + /** + * Appends the view with the color picker. + */ + private _appendColorPickerFragment; +} +/** + * Fired whenever the color was changed. There are multiple sources of this event and you can distinguish them + * using the `source` property passed along this event. + * + * @eventName ~ColorSelectorView#execute + */ +export type ColorSelectorExecuteEvent = { + name: 'execute'; + args: [ + { + value: string; + source: 'staticColorsGrid' | 'documentColorsGrid' | 'removeColorButton' | 'colorPicker' | 'colorPickerSaveButton'; + } + ]; +}; +/** + * Fired when the user pressed the "Cancel" button in the + * {@link module:ui/colorselector/colorselectorview~ColorSelectorView#colorPickerFragmentView}. + * + * @eventName ~ColorSelectorView#colorPicker:cancel + */ +export type ColorSelectorColorPickerCancelEvent = { + name: 'colorPicker:cancel'; + args: []; +}; +/** + * Fired whenever {@link module:ui/colorselector/colorselectorview~ColorSelectorView#colorPickerFragmentView} is shown. + * + * See {@link ~ColorSelectorView#showColorPickerFragment}. + * + * @eventName ~ColorSelectorView#colorPicker:show + */ +export type ColorSelectorColorPickerShowEvent = { + name: 'colorPicker:show'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.js new file mode 100644 index 0000000..06414e8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/colorselectorview.js @@ -0,0 +1,256 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/colorselectorview + */ +import FocusCycler from '../focuscycler.js'; +import View from '../view.js'; +import ViewCollection from '../viewcollection.js'; +import { FocusTracker, KeystrokeHandler } from '@ckeditor/ckeditor5-utils'; +import ColorGridsFragmentView from './colorgridsfragmentview.js'; +import ColorPickerFragmentView from './colorpickerfragmentview.js'; +import '../../theme/components/colorselector/colorselector.css'; +/** + * The configurable color selector view class. It allows users to select colors from a predefined set of colors as well as from + * a color picker. + * + * This meta-view is is made of two components (fragments): + * + * * {@link module:ui/colorselector/colorselectorview~ColorSelectorView#colorGridsFragmentView}, + * * {@link module:ui/colorselector/colorselectorview~ColorSelectorView#colorPickerFragmentView}. + * + * ```ts + * const colorDefinitions = [ + * { color: '#000', label: 'Black', options: { hasBorder: false } }, + * { color: 'rgb(255, 255, 255)', label: 'White', options: { hasBorder: true } }, + * { color: 'red', label: 'Red', options: { hasBorder: false } } + * ]; + * + * const selectorView = new ColorSelectorView( locale, { + * colors: colorDefinitions, + * columns: 5, + * removeButtonLabel: 'Remove color', + * documentColorsLabel: 'Document colors', + * documentColorsCount: 4, + * colorPickerViewConfig: { + * format: 'hsl' + * } + * } ); + * + * selectorView.appendUI(); + * selectorView.selectedColor = 'red'; + * selectorView.updateSelectedColors(); + * + * selectorView.on( 'execute', ( evt, data ) => { + * console.log( 'Color changed', data.value, data.source ); + * } ); + * + * selectorView.on( 'colorPicker:show', ( evt ) => { + * console.log( 'Color picker showed up', evt ); + * } ); + * + * selectorView.on( 'colorPicker:cancel', ( evt ) => { + * console.log( 'Color picker cancel', evt ); + * } ); + * + * selectorView.render(); + * + * document.body.appendChild( selectorView.element ); + * ``` + */ +export default class ColorSelectorView extends View { + /** + * Creates a view to be inserted as a child of {@link module:ui/dropdown/dropdownview~DropdownView}. + * + * @param locale The localization services instance. + * @param colors An array with definitions of colors to be displayed in the table. + * @param columns The number of columns in the color grid. + * @param removeButtonLabel The label of the button responsible for removing the color. + * @param colorPickerLabel The label of the button responsible for color picker appearing. + * @param documentColorsLabel The label for the section with the document colors. + * @param documentColorsCount The number of colors in the document colors section inside the color dropdown. + * @param colorPickerViewConfig The configuration of color picker feature. If set to `false`, the color picker will be hidden. + */ + constructor(locale, { colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, colorPickerViewConfig }) { + super(locale); + this.items = this.createCollection(); + this.focusTracker = new FocusTracker(); + this.keystrokes = new KeystrokeHandler(); + this._focusables = new ViewCollection(); + this._colorPickerViewConfig = colorPickerViewConfig; + this._focusCycler = new FocusCycler({ + focusables: this._focusables, + focusTracker: this.focusTracker, + keystrokeHandler: this.keystrokes, + actions: { + // Navigate list items backwards using the Shift + Tab keystroke. + focusPrevious: 'shift + tab', + // Navigate list items forwards using the Tab key. + focusNext: 'tab' + } + }); + this.colorGridsFragmentView = new ColorGridsFragmentView(locale, { + colors, columns, removeButtonLabel, documentColorsLabel, documentColorsCount, colorPickerLabel, + focusTracker: this.focusTracker, + focusables: this._focusables + }); + this.colorPickerFragmentView = new ColorPickerFragmentView(locale, { + focusables: this._focusables, + focusTracker: this.focusTracker, + keystrokes: this.keystrokes, + colorPickerViewConfig + }); + this.set('_isColorGridsFragmentVisible', true); + this.set('_isColorPickerFragmentVisible', false); + this.set('selectedColor', undefined); + this.colorGridsFragmentView.bind('isVisible').to(this, '_isColorGridsFragmentVisible'); + this.colorPickerFragmentView.bind('isVisible').to(this, '_isColorPickerFragmentVisible'); + /** + * This is kind of bindings. Unfortunately we could not use this.bind() method because the same property + * can not be bound twice. So this is work around how to bind 'selectedColor' property between components. + */ + this.on('change:selectedColor', (evt, evtName, data) => { + this.colorGridsFragmentView.set('selectedColor', data); + this.colorPickerFragmentView.set('selectedColor', data); + }); + this.colorGridsFragmentView.on('change:selectedColor', (evt, evtName, data) => { + this.set('selectedColor', data); + }); + this.colorPickerFragmentView.on('change:selectedColor', (evt, evtName, data) => { + this.set('selectedColor', data); + }); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-color-selector' + ] + }, + children: this.items + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + // Start listening for the keystrokes coming from #element. + this.keystrokes.listenTo(this.element); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this.focusTracker.destroy(); + this.keystrokes.destroy(); + } + /** + * Renders the internals of the component on demand: + * * {@link #colorPickerFragmentView}, + * * {@link #colorGridsFragmentView}. + * + * It allows for deferring component initialization to improve the performance. + * + * See {@link #showColorPickerFragment}, {@link #showColorGridsFragment}. + */ + appendUI() { + this._appendColorGridsFragment(); + if (this._colorPickerViewConfig) { + this._appendColorPickerFragment(); + } + } + /** + * Shows the {@link #colorPickerFragmentView} and hides the {@link #colorGridsFragmentView}. + * + * **Note**: It requires {@link #appendUI} to be called first. + * + * See {@link #showColorGridsFragment}, {@link ~ColorSelectorView#event:colorPicker:show}. + */ + showColorPickerFragment() { + if (!this.colorPickerFragmentView.colorPickerView || this._isColorPickerFragmentVisible) { + return; + } + this._isColorPickerFragmentVisible = true; + this.colorPickerFragmentView.focus(); + this._isColorGridsFragmentVisible = false; + } + /** + * Shows the {@link #colorGridsFragmentView} and hides the {@link #colorPickerFragmentView}. + * + * See {@link #showColorPickerFragment}. + * + * **Note**: It requires {@link #appendUI} to be called first. + */ + showColorGridsFragment() { + if (this._isColorGridsFragmentVisible) { + return; + } + this._isColorGridsFragmentVisible = true; + this.colorGridsFragmentView.focus(); + this._isColorPickerFragmentVisible = false; + } + /** + * Focuses the first focusable element in {@link #items}. + */ + focus() { + this._focusCycler.focusFirst(); + } + /** + * Focuses the last focusable element in {@link #items}. + */ + focusLast() { + this._focusCycler.focusLast(); + } + /** + * Scans through the editor model and searches for text node attributes with the given `attributeName`. + * Found entries are set as document colors in {@link #colorGridsFragmentView}. + * + * All the previously stored document colors will be lost in the process. + * + * @param model The model used as a source to obtain the document colors. + * @param attributeName Determines the name of the related model's attribute for a given dropdown. + */ + updateDocumentColors(model, attributeName) { + this.colorGridsFragmentView.updateDocumentColors(model, attributeName); + } + /** + * Refreshes the state of the selected color in one or both grids located in {@link #colorGridsFragmentView}. + * + * It guarantees that the selection will occur only in one of them. + */ + updateSelectedColors() { + this.colorGridsFragmentView.updateSelectedColors(); + } + /** + * Appends the view containing static and document color grid views. + */ + _appendColorGridsFragment() { + if (this.items.length) { + return; + } + this.items.add(this.colorGridsFragmentView); + this.colorGridsFragmentView.delegate('execute').to(this); + this.colorGridsFragmentView.delegate('colorPicker:show').to(this); + } + /** + * Appends the view with the color picker. + */ + _appendColorPickerFragment() { + if (this.items.length === 2) { + return; + } + this.items.add(this.colorPickerFragmentView); + if (this.colorGridsFragmentView.colorPickerButtonView) { + this.colorGridsFragmentView.colorPickerButtonView.on('execute', () => { + this.showColorPickerFragment(); + }); + } + this.colorGridsFragmentView.addColorPickerButton(); + this.colorPickerFragmentView.delegate('execute').to(this); + this.colorPickerFragmentView.delegate('colorPicker:cancel').to(this); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.d.ts new file mode 100644 index 0000000..9147fb3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.d.ts @@ -0,0 +1,70 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/colorselector/documentcolorcollection + */ +import type { ColorDefinition } from '../colorgrid/colorgridview.js'; +import { Collection, type CollectionAddEvent, type CollectionRemoveEvent, type CollectionChangeEvent } from '@ckeditor/ckeditor5-utils'; +declare const DocumentColorCollection_base: import("@ckeditor/ckeditor5-utils").Mixed<{ + new (options?: { + readonly idProperty?: string | undefined; + } | undefined): Collection; + new (initialItems: Iterable, options?: { + readonly idProperty?: string | undefined; + } | undefined): Collection; +}, import("@ckeditor/ckeditor5-utils").Observable>; +/** + * A collection to store document colors. It enforces colors to be unique. + */ +export default class DocumentColorCollection extends DocumentColorCollection_base { + /** + * Indicates whether the document color collection is empty. + * + * @observable + */ + readonly isEmpty: boolean; + constructor(options?: any); + /** + * Adds a color to the document color collection. + * + * This method ensures that no color duplicates are inserted (compared using + * the color value of the {@link module:ui/colorgrid/colorgridview~ColorDefinition}). + * + * If the item does not have an ID, it will be automatically generated and set on the item. + * + * @param index The position of the item in the collection. The item is pushed to the collection when `index` is not specified. + * @fires add + * @fires change + */ + add(item: ColorDefinition, index?: number): this; + /** + * Checks if an object with given colors is present in the document color collection. + */ + hasColor(color: string): boolean; +} +/** + * Fired when the collection was changed due to adding or removing items. + * + * @eventName ~DocumentColorCollection#change + * @param data Changed items. + */ +export type DocumentColorCollectionChangeEvent = CollectionChangeEvent; +/** + * Fired when an item is added to the collection. + * + * @eventName ~DocumentColorCollection#add + * @param item The added item. + * @param index An index where the addition occurred. + */ +export type DocumentColorCollectionAddEvent = CollectionAddEvent; +/** + * Fired when an item is removed from the collection. + * + * @eventName ~DocumentColorCollection#remove + * @param item The removed item. + * @param index Index from which item was removed. + */ +export type DocumentColorCollectionRemoveEvent = CollectionRemoveEvent; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.js b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.js new file mode 100644 index 0000000..21011b6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/colorselector/documentcolorcollection.js @@ -0,0 +1,42 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { Collection, ObservableMixin } from '@ckeditor/ckeditor5-utils'; +/** + * A collection to store document colors. It enforces colors to be unique. + */ +export default class DocumentColorCollection extends ObservableMixin((Collection)) { + constructor(options) { + super(options); + this.set('isEmpty', true); + this.on('change', () => { + this.set('isEmpty', this.length === 0); + }); + } + /** + * Adds a color to the document color collection. + * + * This method ensures that no color duplicates are inserted (compared using + * the color value of the {@link module:ui/colorgrid/colorgridview~ColorDefinition}). + * + * If the item does not have an ID, it will be automatically generated and set on the item. + * + * @param index The position of the item in the collection. The item is pushed to the collection when `index` is not specified. + * @fires add + * @fires change + */ + add(item, index) { + if (this.find(element => element.color === item.color)) { + // No duplicates are allowed. + return this; + } + return super.add(item, index); + } + /** + * Checks if an object with given colors is present in the document color collection. + */ + hasColor(color) { + return !!this.find(item => item.color === color); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.d.ts new file mode 100644 index 0000000..336576b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.d.ts @@ -0,0 +1,81 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/componentfactory + */ +import { type Locale } from '@ckeditor/ckeditor5-utils'; +import type { Editor } from '@ckeditor/ckeditor5-core'; +import type View from './view.js'; +/** + * A helper class implementing the UI component ({@link module:ui/view~View view}) factory. + * + * It allows functions producing specific UI components to be registered under their unique names + * in the factory. A registered component can be then instantiated by providing its name. + * Note that the names are case insensitive. + * + * ```ts + * // The editor provides localization tools for the factory. + * const factory = new ComponentFactory( editor ); + * + * factory.add( 'foo', locale => new FooView( locale ) ); + * factory.add( 'bar', locale => new BarView( locale ) ); + * + * // An instance of FooView. + * const fooInstance = factory.create( 'foo' ); + * + * // Names are case insensitive so this is also allowed: + * const barInstance = factory.create( 'Bar' ); + * ``` + * + * The {@link module:core/editor/editor~Editor#locale editor locale} is passed to the factory + * function when {@link module:ui/componentfactory~ComponentFactory#create} is called. + */ +export default class ComponentFactory { + /** + * The editor instance that the factory belongs to. + */ + readonly editor: Editor; + /** + * Registered component factories. + */ + private readonly _components; + /** + * Creates an instance of the factory. + * + * @param editor The editor instance. + */ + constructor(editor: Editor); + /** + * Returns an iterator of registered component names. Names are returned in lower case. + */ + names(): IterableIterator; + /** + * Registers a component factory function that will be used by the + * {@link #create create} method and called with the + * {@link module:core/editor/editor~Editor#locale editor locale} as an argument, + * allowing localization of the {@link module:ui/view~View view}. + * + * @param name The name of the component. + * @param callback The callback that returns the component. + */ + add(name: string, callback: (locale: Locale) => View): void; + /** + * Creates an instance of a component registered in the factory under a specific name. + * + * When called, the {@link module:core/editor/editor~Editor#locale editor locale} is passed to + * the previously {@link #add added} factory function, allowing localization of the + * {@link module:ui/view~View view}. + * + * @param name The name of the component. + * @returns The instantiated component view. + */ + create(name: string): View; + /** + * Checks if a component of a given name is registered in the factory. + * + * @param name The name of the component. + */ + has(name: string): boolean; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.js b/node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.js new file mode 100644 index 0000000..674e90e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/componentfactory.js @@ -0,0 +1,104 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/componentfactory + */ +import { CKEditorError } from '@ckeditor/ckeditor5-utils'; +/** + * A helper class implementing the UI component ({@link module:ui/view~View view}) factory. + * + * It allows functions producing specific UI components to be registered under their unique names + * in the factory. A registered component can be then instantiated by providing its name. + * Note that the names are case insensitive. + * + * ```ts + * // The editor provides localization tools for the factory. + * const factory = new ComponentFactory( editor ); + * + * factory.add( 'foo', locale => new FooView( locale ) ); + * factory.add( 'bar', locale => new BarView( locale ) ); + * + * // An instance of FooView. + * const fooInstance = factory.create( 'foo' ); + * + * // Names are case insensitive so this is also allowed: + * const barInstance = factory.create( 'Bar' ); + * ``` + * + * The {@link module:core/editor/editor~Editor#locale editor locale} is passed to the factory + * function when {@link module:ui/componentfactory~ComponentFactory#create} is called. + */ +export default class ComponentFactory { + /** + * Creates an instance of the factory. + * + * @param editor The editor instance. + */ + constructor(editor) { + /** + * Registered component factories. + */ + this._components = new Map(); + this.editor = editor; + } + /** + * Returns an iterator of registered component names. Names are returned in lower case. + */ + *names() { + for (const value of this._components.values()) { + yield value.originalName; + } + } + /** + * Registers a component factory function that will be used by the + * {@link #create create} method and called with the + * {@link module:core/editor/editor~Editor#locale editor locale} as an argument, + * allowing localization of the {@link module:ui/view~View view}. + * + * @param name The name of the component. + * @param callback The callback that returns the component. + */ + add(name, callback) { + this._components.set(getNormalized(name), { callback, originalName: name }); + } + /** + * Creates an instance of a component registered in the factory under a specific name. + * + * When called, the {@link module:core/editor/editor~Editor#locale editor locale} is passed to + * the previously {@link #add added} factory function, allowing localization of the + * {@link module:ui/view~View view}. + * + * @param name The name of the component. + * @returns The instantiated component view. + */ + create(name) { + if (!this.has(name)) { + /** + * The required component is not registered in the component factory. Please make sure + * the provided name is correct and the component has been correctly + * {@link module:ui/componentfactory~ComponentFactory#add added} to the factory. + * + * @error componentfactory-item-missing + * @param name The name of the missing component. + */ + throw new CKEditorError('componentfactory-item-missing', this, { name }); + } + return this._components.get(getNormalized(name)).callback(this.editor.locale); + } + /** + * Checks if a component of a given name is registered in the factory. + * + * @param name The name of the component. + */ + has(name) { + return this._components.has(getNormalized(name)); + } +} +/** + * Ensures that the component name used as the key in the internal map is in lower case. + */ +function getNormalized(name) { + return String(name).toLowerCase(); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.d.ts new file mode 100644 index 0000000..5ca29a5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.d.ts @@ -0,0 +1,273 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialog + */ +import type View from '../view.js'; +import { type Editor, Plugin } from '@ckeditor/ckeditor5-core'; +import DialogView, { DialogViewPosition } from './dialogview.js'; +import type { DialogActionButtonDefinition } from './dialogactionsview.js'; +/** + * The dialog controller class. It is used to show and hide the {@link module:ui/dialog/dialogview~DialogView}. + */ +export default class Dialog extends Plugin { + /** + * The name of the currently visible dialog view instance. + * + * @observable + */ + id: string | null; + /** + * The currently visible dialog view instance. + */ + view?: DialogView; + /** + * The `Dialog` plugin instance which most recently showed the dialog. + * + * Only one dialog can be visible at once, even if there are many editor instances on the page. + * If an editor wants to show a dialog, it should first hide the dialog that is already opened. + * But only the `Dialog` instance that showed the dialog is able able to properly hide it. + * This is why we need to store it in a globally available space (static property). + * This way every `Dialog` plugin in every editor is able to correctly close any open dialog window. + */ + private static _visibleDialogPlugin; + /** + * A flag indicating whether the dialog is currently visible. + * + * @observable + */ + isOpen: boolean; + /** + * A configurable callback called when the dialog is hidden. + */ + private _onHide; + /** + * @inheritDoc + */ + static get pluginName(): "Dialog"; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * Initiates listeners for the `show` and `hide` events emitted by this plugin. + * + * We could not simply decorate the {@link #show} and {@link #hide} methods to fire events, + * because they would be fired in the wrong order – first would be `show` and then `hide` + * (because showing the dialog actually starts with hiding the previously visible one). + * Hence, we added private methods {@link #_show} and {@link #_hide} which are called on events + * in the desired sequence. + */ + private _initShowHideListeners; + /** + * Initiates keystroke handler for toggling the focus between the editor and the dialog view. + */ + private _initFocusToggler; + /** + * Provides an integration between the root attaching and detaching and positioning of the view. + */ + private _initMultiRootIntegration; + /** + * Displays a dialog window. + * + * This method requires a {@link ~DialogDefinition} that defines the dialog's content, title, icon, action buttons, etc. + * + * For example, the following definition will create a dialog with: + * * A header consisting of an icon, a title, and a "Close" button (it is added by default). + * * A content consisting of a view with a single paragraph. + * * A footer consisting of two buttons: "Yes" and "No". + * + * ```js + * // Create the view that will be used as the dialog's content. + * const textView = new View( locale ); + * + * textView.setTemplate( { + * tag: 'div', + * attributes: { + * style: { + * padding: 'var(--ck-spacing-large)', + * whiteSpace: 'initial', + * width: '100%', + * maxWidth: '500px' + * }, + * tabindex: -1 + * }, + * children: [ + * 'Lorem ipsum dolor sit amet...' + * ] + * } ); + * + * // Show the dialog. + * editor.plugins.get( 'Dialog' ).show( { + * id: 'myDialog', + * icon: 'myIcon', // This should be an SVG string. + * title: 'My dialog', + * content: textView, + * actionButtons: [ + * { + * label: t( 'Yes' ), + * class: 'ck-button-action', + * withText: true, + * onExecute: () => dialog.hide() + * }, + * { + * label: t( 'No' ), + * withText: true, + * onExecute: () => dialog.hide() + * } + * ] + * } ); + * ``` + * + * By specifying the {@link ~DialogDefinition#onShow} and {@link ~DialogDefinition#onHide} callbacks + * it is also possible to add callbacks that will be called when the dialog is shown or hidden. + * + * For example, the callbacks in the following definition: + * * Disable the default behavior of the Esc key. + * * Fire a custom event when the dialog gets hidden. + * + * ```js + * editor.plugins.get( 'Dialog' ).show( { + * // ... + * onShow: dialog => { + * dialog.view.on( 'close', ( evt, data ) => { + * // Only prevent the event from the "Esc" key - do not affect the other ways of closing the dialog. + * if ( data.source === 'escKeyPress' ) { + * evt.stop(); + * } + * } ); + * }, + * onHide: dialog => { + * dialog.fire( 'dialogDestroyed' ); + * } + * } ); + * ``` + * + * Internally, calling this method: + * 1. Hides the currently visible dialog (if any) calling the {@link #hide} method + * (fires the {@link ~DialogHideEvent hide event}). + * 2. Fires the {@link ~DialogShowEvent show event} which allows for adding callbacks that customize the + * behavior of the dialog. + * 3. Shows the dialog. + */ + show(dialogDefinition: DialogDefinition): void; + /** + * Handles creating the {@link module:ui/dialog/dialogview~DialogView} instance and making it visible. + */ + private _show; + /** + * Hides the dialog. This method is decorated to enable interacting on the {@link ~DialogHideEvent hide event}. + * + * See {@link #show}. + */ + hide(): void; + /** + * Destroys the {@link module:ui/dialog/dialogview~DialogView} and cleans up the stored dialog state. + */ + private _hide; +} +/** + * The definition that describes a dialog window and its content. Passed to the {@link module:ui/dialog/dialog~Dialog#show} method. + */ +export interface DialogDefinition { + /** + * A unique identifier of the dialog. It allows for distinguishing between different dialogs and their visibility. + * For instance, when open, the ID of the currently visible dialog is stored in {@link module:ui/dialog/dialog~Dialog#id}. + * + * The `id` is also passed along the {@link module:ui/dialog/dialog~DialogShowEvent} and {@link module:ui/dialog/dialog~DialogHideEvent} + * events. + */ + id: string; + /** + * The SVG string of an icon displayed in dialogs's header. Used only when {@link #title} is also set + * and the header is displayed. + * + * See more in {@link module:ui/icon/iconview~IconView#content}. + */ + icon?: string; + /** + * A title displayed in the dialogs's header. It also works as an accessible name of the dialog used by assistive technologies. + * + * When not set, the header is not displayed. Affects {@link #icon} and {@link #hasCloseButton}. + */ + title?: string; + /** + * A flag indicating whether the dialog should have a close button in the header. + * `true` by default. Works when {@link #title} is also set and the header is displayed. + * + * **Note**: If you hide the close button, make sure that the dialog can be closed in another way. + */ + hasCloseButton?: boolean; + /** + * The content of the dialog. It can be a single {@link module:ui/view~View} or an array of views. + */ + content?: View | Array; + /** + * The action buttons displayed in the dialog's footer. + */ + actionButtons?: Array; + /** + * An additional CSS class set on the outermost (`.ck.ck-dialog`) container element allowing for visual customization. + */ + className?: string; + /** + * When set to `true`, the dialog will become a modal, that is, it will block the UI until it is closed. + */ + isModal?: boolean; + /** + * Available dialog positions. By default `DialogViewPosition.EDITOR_CENTER` is used for {@link #isModal non-modals} + * and `DialogViewPosition.SCREEN_CENTER` for modals. + * + * {@link module:ui/dialog/dialogview#DialogViewPosition Learn more} about available positions. + */ + position?: typeof DialogViewPosition[keyof typeof DialogViewPosition]; + /** + * A callback called when the dialog shows up with a `low` priority. It allows for setting up the dialog's {@link #content}. + */ + onShow?: (dialog: Dialog) => void; + /** + * A callback called when the dialog hides with a `low` priority. + * It allows for cleaning up (for example, resetting) the dialog's {@link #content}. + */ + onHide?: (dialog: Dialog) => void; +} +/** + * An event fired after {@link module:ui/dialog/dialog~Dialog#show} is called. You can use it to customize the behavior + * of any dialog. + * + * ```js + * import { DialogViewPosition } from 'ckeditor5/src/ui.js'; + * + * // ... + * + * // Changes the position of the "Find and Replace" dialog. + * editor.plugins.get( 'Dialog' ).on( 'show:findAndReplace', ( evt, data ) => { + * Object.assign( data, { position: DialogViewPosition.EDITOR_BOTTOM_CENTER } ); + * }, { priority: 'high' } ); + * ``` + * + * @eventName ~Dialog#show + */ +export type DialogShowEvent = { + name: 'show' | `show:${string}`; + args: [dialogDefinition: DialogDefinition]; +}; +/** + * An event fired after {@link module:ui/dialog/dialog~Dialog#hide} is called. You can use it to customize the behavior + * of any dialog. + * + * ```js + * // Logs after the "Find and Replace" dialog gets hidden + * editor.plugins.get( 'Dialog' ).on( 'hide:findAndReplace', () => { + * console.log( 'The "Find and Replace" dialog was hidden.' ); + * } ); + * ``` + * + * @eventName ~Dialog#hide + */ +export type DialogHideEvent = { + name: 'hide' | `hide:${string}`; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.js b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.js new file mode 100644 index 0000000..13fdf3e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialog.js @@ -0,0 +1,271 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import DialogView, { DialogViewPosition } from './dialogview.js'; +/** + * The dialog controller class. It is used to show and hide the {@link module:ui/dialog/dialogview~DialogView}. + */ +export default class Dialog extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'Dialog'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + const t = editor.t; + this._initShowHideListeners(); + this._initFocusToggler(); + this._initMultiRootIntegration(); + this.set('id', null); + // Add the information about the keystroke to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + categoryId: 'navigation', + keystrokes: [{ + label: t('Move focus in and out of an active dialog window'), + keystroke: 'Ctrl+F6', + mayRequireFn: true + }] + }); + } + /** + * Initiates listeners for the `show` and `hide` events emitted by this plugin. + * + * We could not simply decorate the {@link #show} and {@link #hide} methods to fire events, + * because they would be fired in the wrong order – first would be `show` and then `hide` + * (because showing the dialog actually starts with hiding the previously visible one). + * Hence, we added private methods {@link #_show} and {@link #_hide} which are called on events + * in the desired sequence. + */ + _initShowHideListeners() { + this.on('show', (evt, args) => { + this._show(args); + }); + // 'low' priority allows to add custom callback between `_show()` and `onShow()`. + this.on('show', (evt, args) => { + if (args.onShow) { + args.onShow(this); + } + }, { priority: 'low' }); + this.on('hide', () => { + if (Dialog._visibleDialogPlugin) { + Dialog._visibleDialogPlugin._hide(); + } + }); + // 'low' priority allows to add custom callback between `_hide()` and `onHide()`. + this.on('hide', () => { + if (this._onHide) { + this._onHide(this); + this._onHide = undefined; + } + }, { priority: 'low' }); + } + /** + * Initiates keystroke handler for toggling the focus between the editor and the dialog view. + */ + _initFocusToggler() { + const editor = this.editor; + editor.keystrokes.set('Ctrl+F6', (data, cancel) => { + if (!this.isOpen || this.view.isModal) { + return; + } + if (this.view.focusTracker.isFocused) { + editor.editing.view.focus(); + } + else { + this.view.focus(); + } + cancel(); + }); + } + /** + * Provides an integration between the root attaching and detaching and positioning of the view. + */ + _initMultiRootIntegration() { + const model = this.editor.model; + model.document.on('change:data', () => { + if (!this.view) { + return; + } + const changedRoots = model.document.differ.getChangedRoots(); + for (const changes of changedRoots) { + if (changes.state) { + this.view.updatePosition(); + } + } + }); + } + /** + * Displays a dialog window. + * + * This method requires a {@link ~DialogDefinition} that defines the dialog's content, title, icon, action buttons, etc. + * + * For example, the following definition will create a dialog with: + * * A header consisting of an icon, a title, and a "Close" button (it is added by default). + * * A content consisting of a view with a single paragraph. + * * A footer consisting of two buttons: "Yes" and "No". + * + * ```js + * // Create the view that will be used as the dialog's content. + * const textView = new View( locale ); + * + * textView.setTemplate( { + * tag: 'div', + * attributes: { + * style: { + * padding: 'var(--ck-spacing-large)', + * whiteSpace: 'initial', + * width: '100%', + * maxWidth: '500px' + * }, + * tabindex: -1 + * }, + * children: [ + * 'Lorem ipsum dolor sit amet...' + * ] + * } ); + * + * // Show the dialog. + * editor.plugins.get( 'Dialog' ).show( { + * id: 'myDialog', + * icon: 'myIcon', // This should be an SVG string. + * title: 'My dialog', + * content: textView, + * actionButtons: [ + * { + * label: t( 'Yes' ), + * class: 'ck-button-action', + * withText: true, + * onExecute: () => dialog.hide() + * }, + * { + * label: t( 'No' ), + * withText: true, + * onExecute: () => dialog.hide() + * } + * ] + * } ); + * ``` + * + * By specifying the {@link ~DialogDefinition#onShow} and {@link ~DialogDefinition#onHide} callbacks + * it is also possible to add callbacks that will be called when the dialog is shown or hidden. + * + * For example, the callbacks in the following definition: + * * Disable the default behavior of the Esc key. + * * Fire a custom event when the dialog gets hidden. + * + * ```js + * editor.plugins.get( 'Dialog' ).show( { + * // ... + * onShow: dialog => { + * dialog.view.on( 'close', ( evt, data ) => { + * // Only prevent the event from the "Esc" key - do not affect the other ways of closing the dialog. + * if ( data.source === 'escKeyPress' ) { + * evt.stop(); + * } + * } ); + * }, + * onHide: dialog => { + * dialog.fire( 'dialogDestroyed' ); + * } + * } ); + * ``` + * + * Internally, calling this method: + * 1. Hides the currently visible dialog (if any) calling the {@link #hide} method + * (fires the {@link ~DialogHideEvent hide event}). + * 2. Fires the {@link ~DialogShowEvent show event} which allows for adding callbacks that customize the + * behavior of the dialog. + * 3. Shows the dialog. + */ + show(dialogDefinition) { + this.hide(); + this.fire(`show:${dialogDefinition.id}`, dialogDefinition); + } + /** + * Handles creating the {@link module:ui/dialog/dialogview~DialogView} instance and making it visible. + */ + _show({ id, icon, title, hasCloseButton = true, content, actionButtons, className, isModal, position, onHide }) { + const editor = this.editor; + this.view = new DialogView(editor.locale, { + getCurrentDomRoot: () => { + return editor.editing.view.getDomRoot(editor.model.document.selection.anchor.root.rootName); + }, + getViewportOffset: () => { + return editor.ui.viewportOffset; + } + }); + const view = this.view; + view.on('close', () => { + this.hide(); + }); + editor.ui.view.body.add(view); + editor.ui.focusTracker.add(view.element); + editor.keystrokes.listenTo(view.element); + // Unless the user specified a position, modals should always be centered on the screen. + // Otherwise, let's keep dialogs centered in the editing root by default. + if (!position) { + position = isModal ? DialogViewPosition.SCREEN_CENTER : DialogViewPosition.EDITOR_CENTER; + } + view.set({ + position, + _isVisible: true, + className, + isModal + }); + view.setupParts({ + icon, + title, + hasCloseButton, + content, + actionButtons + }); + this.id = id; + if (onHide) { + this._onHide = onHide; + } + this.isOpen = true; + Dialog._visibleDialogPlugin = this; + } + /** + * Hides the dialog. This method is decorated to enable interacting on the {@link ~DialogHideEvent hide event}. + * + * See {@link #show}. + */ + hide() { + if (Dialog._visibleDialogPlugin) { + Dialog._visibleDialogPlugin.fire(`hide:${Dialog._visibleDialogPlugin.id}`); + } + } + /** + * Destroys the {@link module:ui/dialog/dialogview~DialogView} and cleans up the stored dialog state. + */ + _hide() { + if (!this.view) { + return; + } + const editor = this.editor; + const view = this.view; + // Reset the content view to prevent its children from being destroyed in the standard + // View#destroy() (and collections) chain. If the content children were left in there, + // they would have to be re-created by the feature using the dialog every time the dialog + // shows up. + if (view.contentView) { + view.contentView.reset(); + } + editor.ui.view.body.remove(view); + editor.ui.focusTracker.remove(view.element); + editor.keystrokes.stopListening(view.element); + view.destroy(); + editor.editing.view.focus(); + this.id = null; + this.isOpen = false; + Dialog._visibleDialogPlugin = null; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.d.ts new file mode 100644 index 0000000..3ce91bb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.d.ts @@ -0,0 +1,69 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialogactionsview + */ +import { KeystrokeHandler, type Locale } from '@ckeditor/ckeditor5-utils'; +import type { default as Button } from '../button/button.js'; +import ButtonView from '../button/buttonview.js'; +import View from '../view.js'; +import ViewCollection from '../viewcollection.js'; +import FocusCycler, { type FocusableView } from '../focuscycler.js'; +import '../../theme/components/dialog/dialogactions.css'; +/** + * A dialog actions view class. It contains button views which are used to execute dialog actions. + */ +export default class DialogActionsView extends View { + /** + * A collection of button views. + */ + readonly children: ViewCollection; + /** + * A keystroke handler instance. + */ + readonly keystrokes: KeystrokeHandler; + /** + * A focus cycler instance. + */ + readonly focusCycler: FocusCycler; + /** + * A focus tracker instance. + */ + private readonly _focusTracker; + /** + * A collection of focusable views. + */ + private readonly _focusables; + /** + * @inheritDoc + */ + constructor(locale?: Locale); + /** + * @inheritDoc + */ + render(): void; + /** + * Creates the button views based on the given definitions. + * Then adds them to the {@link #children} collection and to the focus cycler. + */ + setButtons(definitions: Array): void; + /** + * @inheritDoc + */ + focus(direction?: 1 | -1): void; + /** + * Adds all elements from the {@link #children} collection to the {@link #_focusables} collection + * and to the {@link #_focusTracker} instance. + */ + private _updateFocusCyclableItems; +} +/** + * A dialog action button definition. It is a slightly modified version + * of the {@link module:ui/button/button~Button} definition. + */ +export type DialogActionButtonDefinition = Pick & Partial> & { + onExecute: Function; + onCreate?: (button: ButtonView) => void; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.js b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.js new file mode 100644 index 0000000..bed7f98 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogactionsview.js @@ -0,0 +1,98 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialogactionsview + */ +import { FocusTracker, KeystrokeHandler } from '@ckeditor/ckeditor5-utils'; +import ButtonView from '../button/buttonview.js'; +import View from '../view.js'; +import ViewCollection from '../viewcollection.js'; +import FocusCycler from '../focuscycler.js'; +import '../../theme/components/dialog/dialogactions.css'; +/** + * A dialog actions view class. It contains button views which are used to execute dialog actions. + */ +export default class DialogActionsView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.children = this.createCollection(); + this.keystrokes = new KeystrokeHandler(); + this._focusTracker = new FocusTracker(); + this._focusables = new ViewCollection(); + this.focusCycler = new FocusCycler({ + focusables: this._focusables, + focusTracker: this._focusTracker, + keystrokeHandler: this.keystrokes, + actions: { + // Navigate form fields backwards using the Shift + Tab keystroke. + focusPrevious: 'shift + tab', + // Navigate form fields forwards using the Tab key. + focusNext: 'tab' + } + }); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-dialog__actions' + ] + }, + children: this.children + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.keystrokes.listenTo(this.element); + } + /** + * Creates the button views based on the given definitions. + * Then adds them to the {@link #children} collection and to the focus cycler. + */ + setButtons(definitions) { + for (const definition of definitions) { + const button = new ButtonView(this.locale); + let property; + button.on('execute', () => definition.onExecute()); + if (definition.onCreate) { + definition.onCreate(button); + } + for (property in definition) { + if (property != 'onExecute' && property != 'onCreate') { + button.set(property, definition[property]); + } + } + this.children.add(button); + } + this._updateFocusCyclableItems(); + } + /** + * @inheritDoc + */ + focus(direction) { + if (direction === -1) { + this.focusCycler.focusLast(); + } + else { + this.focusCycler.focusFirst(); + } + } + /** + * Adds all elements from the {@link #children} collection to the {@link #_focusables} collection + * and to the {@link #_focusTracker} instance. + */ + _updateFocusCyclableItems() { + Array.from(this.children).forEach(v => { + this._focusables.add(v); + this._focusTracker.add(v.element); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.d.ts new file mode 100644 index 0000000..8bcd311 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.d.ts @@ -0,0 +1,27 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialogcontentview + */ +import View from '../view.js'; +import type ViewCollection from '../viewcollection.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * A dialog content view class. + */ +export default class DialogContentView extends View { + /** + * A collection of content items. + */ + readonly children: ViewCollection; + /** + * @inheritDoc + */ + constructor(locale: Locale | undefined); + /** + * Removes all the child views. + */ + reset(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.js b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.js new file mode 100644 index 0000000..a508179 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogcontentview.js @@ -0,0 +1,35 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialogcontentview + */ +import View from '../view.js'; +/** + * A dialog content view class. + */ +export default class DialogContentView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.children = this.createCollection(); + this.setTemplate({ + tag: 'div', + attributes: { + class: ['ck', 'ck-dialog__content'] + }, + children: this.children + }); + } + /** + * Removes all the child views. + */ + reset() { + while (this.children.length) { + this.children.remove(0); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.d.ts new file mode 100644 index 0000000..ae413aa --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.d.ts @@ -0,0 +1,256 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialogview + */ +import { KeystrokeHandler, FocusTracker, type Locale, type DecoratedMethodEvent } from '@ckeditor/ckeditor5-utils'; +import ViewCollection from '../viewcollection.js'; +import View from '../view.js'; +import FormHeaderView from '../formheader/formheaderview.js'; +import ButtonView from '../button/buttonview.js'; +import { type DraggableView } from '../bindings/draggableviewmixin.js'; +import DialogActionsView, { type DialogActionButtonDefinition } from './dialogactionsview.js'; +import DialogContentView from './dialogcontentview.js'; +import type EditorUI from '../editorui/editorui.js'; +import '../../theme/components/dialog/dialog.css'; +/** + * Available dialog view positions: + * + * * `DialogViewPosition.SCREEN_CENTER` – A fixed position in the center of the screen. + * * `DialogViewPosition.EDITOR_CENTER` – A dynamic position in the center of the editor editable area. + * * `DialogViewPosition.EDITOR_TOP_SIDE` – A dynamic position at the top-right (for the left-to-right languages) + * or top-left (for right-to-left languages) corner of the editor editable area. + * * `DialogViewPosition.EDITOR_TOP_CENTER` – A dynamic position at the top-center of the editor editable area. + * * `DialogViewPosition.EDITOR_BOTTOM_CENTER` – A dynamic position at the bottom-center of the editor editable area. + * * `DialogViewPosition.EDITOR_ABOVE_CENTER` – A dynamic position centered above the editor editable area. + * * `DialogViewPosition.EDITOR_BELOW_CENTER` – A dynamic position centered below the editor editable area. + * + * The position of a dialog is specified by a {@link module:ui/dialog/dialog~DialogDefinition#position `position` property} of a + * definition passed to the {@link module:ui/dialog/dialog~Dialog#show} method. + */ +export declare const DialogViewPosition: { + readonly SCREEN_CENTER: "screen-center"; + readonly EDITOR_CENTER: "editor-center"; + readonly EDITOR_TOP_SIDE: "editor-top-side"; + readonly EDITOR_TOP_CENTER: "editor-top-center"; + readonly EDITOR_BOTTOM_CENTER: "editor-bottom-center"; + readonly EDITOR_ABOVE_CENTER: "editor-above-center"; + readonly EDITOR_BELOW_CENTER: "editor-below-center"; +}; +declare const DialogView_base: import("@ckeditor/ckeditor5-utils").Mixed; +/** + * A dialog view class. + */ +export default class DialogView extends DialogView_base implements DraggableView { + /** + * A collection of the child views inside of the dialog. + * A dialog can have 3 optional parts: header, content, and actions. + */ + readonly parts: ViewCollection; + /** + * A header view of the dialog. It is also a drag handle of the dialog. + */ + headerView?: FormHeaderView; + /** + * A close button view. It is automatically added to the header view if present. + */ + closeButtonView?: ButtonView; + /** + * A view with the action buttons available to the user. + */ + actionsView?: DialogActionsView; + /** + * A default dialog element offset from the reference element (e.g. editor editable area). + */ + static defaultOffset: number; + /** + * A view with the dialog content. + */ + contentView?: DialogContentView; + /** + * A keystroke handler instance. + */ + readonly keystrokes: KeystrokeHandler; + /** + * A focus tracker instance. + */ + readonly focusTracker: FocusTracker; + /** + * A flag indicating if the dialog was moved manually. If so, its position + * will not be updated automatically upon window resize or document scroll. + */ + wasMoved: boolean; + /** + * A flag indicating if this dialog view is a modal. + * + * @observable + */ + isModal: boolean; + /** + * A label for the view dialog element to be used by the assistive technologies. + * + * @observable + */ + ariaLabel: string; + /** + * A custom class name to be added to the dialog element. + * + * @observable + */ + className: string | undefined; + /** + * The position of the dialog view. + * + * @observable + */ + position: typeof DialogViewPosition[keyof typeof DialogViewPosition]; + /** + * A flag indicating that the dialog should be shown. Once set to `true`, the dialog will be shown + * after its position is calculated. Until then, the dialog is transparent and not visible. + * + * See {@link #_isTransparent} property. + * + * @observable + * @internal + */ + _isVisible: boolean; + /** + * A flag indicating if a dialog is transparent. It is used to prevent the dialog from being visible + * before its position is calculated. + * + * @observable + * @internal + */ + _isTransparent: boolean; + /** + * The calculated dialog `top` CSS property used for positioning. + * + * @observable + * @internal + */ + _top: number; + /** + * The calculated dialog `left` CSS property used for positioning. + * + * @observable + * @internal + */ + _left: number; + /** + * A callback returning the DOM root that requested the dialog. + */ + private _getCurrentDomRoot; + /** + * A callback returning the configured editor viewport offset. + */ + private _getViewportOffset; + /** + * The list of the focusable elements inside the dialog view. + */ + private readonly _focusables; + /** + * The focus cycler instance. + */ + private readonly _focusCycler; + /** + * @inheritDoc + */ + constructor(locale: Locale, { getCurrentDomRoot, getViewportOffset }: { + getCurrentDomRoot: () => HTMLElement; + getViewportOffset: () => EditorUI['viewportOffset']; + }); + /** + * @inheritDoc + */ + render(): void; + /** + * Returns the element that should be used as a drag handle. + */ + get dragHandleElement(): HTMLElement | null; + /** + * Creates the dialog parts. Which of them are created depends on the arguments passed to the method. + * There are no rules regarding the dialog construction, that is, no part is mandatory. + * Each part can only be created once. + * + * @internal + */ + setupParts({ icon, title, hasCloseButton, content, actionButtons }: { + icon?: string; + title?: string; + hasCloseButton?: boolean; + content?: View | Array; + actionButtons?: Array; + }): void; + /** + * Focuses the first focusable element inside the dialog. + */ + focus(): void; + /** + * Normalizes the passed coordinates to make sure the dialog view + * is displayed within the visible viewport and moves it there. + * + * @internal + */ + moveTo(left: number, top: number): void; + /** + * Moves the dialog to the specified coordinates. + */ + private _moveTo; + /** + * Moves the dialog by the specified offset. + * + * @internal + */ + moveBy(left: number, top: number): void; + /** + * Moves the dialog view to the off-screen position. + * Used when there is no space to display the dialog. + */ + private _moveOffScreen; + /** + * Recalculates the dialog according to the set position and viewport, + * and moves it to the new position. + */ + updatePosition(): void; + /** + * Calculates the visible DOM root part. + */ + private _getVisibleDomRootRect; + /** + * Calculates the dialog element rect. + */ + private _getDialogRect; + /** + * Calculates the viewport rect. + */ + private _getViewportRect; + /** + * Collects all focusable elements inside the dialog parts + * and adds them to the focus tracker and focus cycler. + */ + private _updateFocusCyclableItems; + /** + * Creates the close button view that is displayed in the header view corner. + */ + private _createCloseButton; +} +/** + * An event fired when the dialog is closed. + * + * @eventName ~DialogView#close + */ +export type DialogViewCloseEvent = { + name: 'close'; + args: [{ + source: 'closeButton' | 'escKeyPress'; + }]; +}; +/** + * An event fired when the dialog is moved. + * + * @eventName ~DialogView#moveTo + */ +export type DialogViewMoveToEvent = DecoratedMethodEvent; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.js b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.js new file mode 100644 index 0000000..37b1e7e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dialog/dialogview.js @@ -0,0 +1,466 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dialog/dialogview + */ +import { KeystrokeHandler, FocusTracker, Rect, global, toUnit } from '@ckeditor/ckeditor5-utils'; +import { icons } from '@ckeditor/ckeditor5-core'; +import ViewCollection from '../viewcollection.js'; +import View from '../view.js'; +import FormHeaderView from '../formheader/formheaderview.js'; +import ButtonView from '../button/buttonview.js'; +import FocusCycler, { isViewWithFocusCycler, isFocusable } from '../focuscycler.js'; +import DraggableViewMixin from '../bindings/draggableviewmixin.js'; +import DialogActionsView from './dialogactionsview.js'; +import DialogContentView from './dialogcontentview.js'; +import '../../theme/components/dialog/dialog.css'; +// @if CK_DEBUG_DIALOG // const RectDrawer = require( '@ckeditor/ckeditor5-utils/tests/_utils/rectdrawer' ).default; +/** + * Available dialog view positions: + * + * * `DialogViewPosition.SCREEN_CENTER` – A fixed position in the center of the screen. + * * `DialogViewPosition.EDITOR_CENTER` – A dynamic position in the center of the editor editable area. + * * `DialogViewPosition.EDITOR_TOP_SIDE` – A dynamic position at the top-right (for the left-to-right languages) + * or top-left (for right-to-left languages) corner of the editor editable area. + * * `DialogViewPosition.EDITOR_TOP_CENTER` – A dynamic position at the top-center of the editor editable area. + * * `DialogViewPosition.EDITOR_BOTTOM_CENTER` – A dynamic position at the bottom-center of the editor editable area. + * * `DialogViewPosition.EDITOR_ABOVE_CENTER` – A dynamic position centered above the editor editable area. + * * `DialogViewPosition.EDITOR_BELOW_CENTER` – A dynamic position centered below the editor editable area. + * + * The position of a dialog is specified by a {@link module:ui/dialog/dialog~DialogDefinition#position `position` property} of a + * definition passed to the {@link module:ui/dialog/dialog~Dialog#show} method. + */ +export const DialogViewPosition = { + SCREEN_CENTER: 'screen-center', + EDITOR_CENTER: 'editor-center', + EDITOR_TOP_SIDE: 'editor-top-side', + EDITOR_TOP_CENTER: 'editor-top-center', + EDITOR_BOTTOM_CENTER: 'editor-bottom-center', + EDITOR_ABOVE_CENTER: 'editor-above-center', + EDITOR_BELOW_CENTER: 'editor-below-center' +}; +const toPx = toUnit('px'); +/** + * A dialog view class. + */ +class DialogView extends DraggableViewMixin(View) { + /** + * @inheritDoc + */ + constructor(locale, { getCurrentDomRoot, getViewportOffset }) { + super(locale); + /** + * A flag indicating if the dialog was moved manually. If so, its position + * will not be updated automatically upon window resize or document scroll. + */ + this.wasMoved = false; + const bind = this.bindTemplate; + const t = locale.t; + this.set('className', ''); + this.set('ariaLabel', t('Editor dialog')); + this.set('isModal', false); + this.set('position', DialogViewPosition.SCREEN_CENTER); + this.set('_isVisible', false); + this.set('_isTransparent', false); + this.set('_top', 0); + this.set('_left', 0); + this._getCurrentDomRoot = getCurrentDomRoot; + this._getViewportOffset = getViewportOffset; + this.decorate('moveTo'); + this.parts = this.createCollection(); + this.keystrokes = new KeystrokeHandler(); + this.focusTracker = new FocusTracker(); + this._focusables = new ViewCollection(); + this._focusCycler = new FocusCycler({ + focusables: this._focusables, + focusTracker: this.focusTracker, + keystrokeHandler: this.keystrokes, + actions: { + // Navigate form fields backwards using the Shift + Tab keystroke. + focusPrevious: 'shift + tab', + // Navigate form fields forwards using the Tab key. + focusNext: 'tab' + } + }); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-dialog-overlay', + bind.if('isModal', 'ck-dialog-overlay__transparent', isModal => !isModal), + bind.if('_isVisible', 'ck-hidden', value => !value) + ], + // Prevent from editor losing focus when clicking on the modal overlay. + tabindex: '-1' + }, + children: [ + { + tag: 'div', + attributes: { + tabindex: '-1', + class: [ + 'ck', + 'ck-dialog', + bind.to('className') + ], + role: 'dialog', + 'aria-label': bind.to('ariaLabel'), + style: { + top: bind.to('_top', top => toPx(top)), + left: bind.to('_left', left => toPx(left)), + visibility: bind.if('_isTransparent', 'hidden') + } + }, + children: this.parts + } + ] + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.keystrokes.set('Esc', (data, cancel) => { + this.fire('close', { source: 'escKeyPress' }); + cancel(); + }); + // Support for dragging the modal. + this.on('drag', (evt, { deltaX, deltaY }) => { + this.wasMoved = true; + this.moveBy(deltaX, deltaY); + }); + // Update dialog position upon window resize, if the position was not changed manually. + this.listenTo(global.window, 'resize', () => { + if (this._isVisible && !this.wasMoved) { + this.updatePosition(); + } + }); + // Update dialog position upon document scroll, if the position was not changed manually. + this.listenTo(global.document, 'scroll', () => { + if (this._isVisible && !this.wasMoved) { + this.updatePosition(); + } + }); + this.on('change:_isVisible', (evt, name, isVisible) => { + if (isVisible) { + // Let the content render first, then apply the position. Otherwise, the calculated DOM Rects + // will not reflect the final look of the dialog. Note that we're not using #_moveOffScreen() here because + // it causes a violent movement of the viewport on iOS (because the dialog still keeps the DOM focus). + this._isTransparent = true; + // FYI: RAF is too short. We need to wait a bit longer. + setTimeout(() => { + this.updatePosition(); + this._isTransparent = false; + // The view must get the focus after it gets visible. But this is only possible + // after the dialog is no longer transparent. + this.focus(); + }, 10); + } + }); + this.keystrokes.listenTo(this.element); + } + /** + * Returns the element that should be used as a drag handle. + */ + get dragHandleElement() { + if (this.headerView) { + return this.headerView.element; + } + else { + return null; + } + } + /** + * Creates the dialog parts. Which of them are created depends on the arguments passed to the method. + * There are no rules regarding the dialog construction, that is, no part is mandatory. + * Each part can only be created once. + * + * @internal + */ + setupParts({ icon, title, hasCloseButton = true, content, actionButtons }) { + if (title) { + this.headerView = new FormHeaderView(this.locale, { icon }); + if (hasCloseButton) { + this.closeButtonView = this._createCloseButton(); + this.headerView.children.add(this.closeButtonView); + } + this.headerView.label = title; + this.ariaLabel = title; + this.parts.add(this.headerView, 0); + } + if (content) { + // Normalize the content specified in the arguments. + if (content instanceof View) { + content = [content]; + } + this.contentView = new DialogContentView(this.locale); + this.contentView.children.addMany(content); + this.parts.add(this.contentView); + } + if (actionButtons) { + this.actionsView = new DialogActionsView(this.locale); + this.actionsView.setButtons(actionButtons); + this.parts.add(this.actionsView); + } + this._updateFocusCyclableItems(); + } + /** + * Focuses the first focusable element inside the dialog. + */ + focus() { + this._focusCycler.focusFirst(); + } + /** + * Normalizes the passed coordinates to make sure the dialog view + * is displayed within the visible viewport and moves it there. + * + * @internal + */ + moveTo(left, top) { + const viewportRect = this._getViewportRect(); + const dialogRect = this._getDialogRect(); + // Don't let the dialog go beyond the right edge of the viewport. + if (left + dialogRect.width > viewportRect.right) { + left = viewportRect.right - dialogRect.width; + } + // Don't let the dialog go beyond the left edge of the viewport. + if (left < viewportRect.left) { + left = viewportRect.left; + } + // Don't let the dialog go beyond the top edge of the viewport. + if (top < viewportRect.top) { + top = viewportRect.top; + } + // Note: We don't do the same for the bottom edge to allow users to resize the window vertically + // and let the dialog to stay put instead of covering the editing root. + this._moveTo(left, top); + } + /** + * Moves the dialog to the specified coordinates. + */ + _moveTo(left, top) { + this._left = left; + this._top = top; + } + /** + * Moves the dialog by the specified offset. + * + * @internal + */ + moveBy(left, top) { + this.moveTo(this._left + left, this._top + top); + } + /** + * Moves the dialog view to the off-screen position. + * Used when there is no space to display the dialog. + */ + _moveOffScreen() { + this._moveTo(-9999, -9999); + } + /** + * Recalculates the dialog according to the set position and viewport, + * and moves it to the new position. + */ + updatePosition() { + if (!this.element || !this.element.parentNode) { + return; + } + const viewportRect = this._getViewportRect(); + // Actual position may be different from the configured one if there's no DOM root. + let configuredPosition = this.position; + let domRootRect; + if (!this._getCurrentDomRoot()) { + configuredPosition = DialogViewPosition.SCREEN_CENTER; + } + else { + domRootRect = this._getVisibleDomRootRect(viewportRect); + } + const defaultOffset = DialogView.defaultOffset; + const dialogRect = this._getDialogRect(); + // @if CK_DEBUG_DIALOG // RectDrawer.clear(); + // @if CK_DEBUG_DIALOG // RectDrawer.draw( viewportRect, { outlineColor: 'blue' }, 'Viewport' ); + switch (configuredPosition) { + case DialogViewPosition.EDITOR_TOP_SIDE: { + // @if CK_DEBUG_DIALOG // if ( domRootRect ) { + // @if CK_DEBUG_DIALOG // RectDrawer.draw( domRootRect, { outlineColor: 'red', zIndex: 9999999 }, 'DOM ROOT' ); + // @if CK_DEBUG_DIALOG // } + if (domRootRect) { + const leftCoordinate = this.locale.contentLanguageDirection === 'ltr' ? + domRootRect.right - dialogRect.width - defaultOffset : + domRootRect.left + defaultOffset; + this.moveTo(leftCoordinate, domRootRect.top + defaultOffset); + } + else { + this._moveOffScreen(); + } + break; + } + case DialogViewPosition.EDITOR_CENTER: { + if (domRootRect) { + this.moveTo(Math.round(domRootRect.left + domRootRect.width / 2 - dialogRect.width / 2), Math.round(domRootRect.top + domRootRect.height / 2 - dialogRect.height / 2)); + } + else { + this._moveOffScreen(); + } + break; + } + case DialogViewPosition.SCREEN_CENTER: { + this.moveTo(Math.round((viewportRect.width - dialogRect.width) / 2), Math.round((viewportRect.height - dialogRect.height) / 2)); + break; + } + case DialogViewPosition.EDITOR_TOP_CENTER: { + // @if CK_DEBUG_DIALOG // if ( domRootRect ) { + // @if CK_DEBUG_DIALOG // RectDrawer.draw( domRootRect, { outlineColor: 'red', zIndex: 9999999 }, 'DOM ROOT' ); + // @if CK_DEBUG_DIALOG // } + if (domRootRect) { + this.moveTo(Math.round(domRootRect.left + domRootRect.width / 2 - dialogRect.width / 2), domRootRect.top + defaultOffset); + } + else { + this._moveOffScreen(); + } + break; + } + case DialogViewPosition.EDITOR_BOTTOM_CENTER: { + // @if CK_DEBUG_DIALOG // if ( domRootRect ) { + // @if CK_DEBUG_DIALOG // RectDrawer.draw( domRootRect, { outlineColor: 'red', zIndex: 9999999 }, 'DOM ROOT' ); + // @if CK_DEBUG_DIALOG // } + if (domRootRect) { + this.moveTo(Math.round(domRootRect.left + domRootRect.width / 2 - dialogRect.width / 2), domRootRect.bottom - dialogRect.height - defaultOffset); + } + else { + this._moveOffScreen(); + } + break; + } + case DialogViewPosition.EDITOR_ABOVE_CENTER: { + // @if CK_DEBUG_DIALOG // if ( domRootRect ) { + // @if CK_DEBUG_DIALOG // RectDrawer.draw( domRootRect, { outlineColor: 'red', zIndex: 9999999 }, 'DOM ROOT' ); + // @if CK_DEBUG_DIALOG // } + if (domRootRect) { + this.moveTo(Math.round(domRootRect.left + domRootRect.width / 2 - dialogRect.width / 2), domRootRect.top - dialogRect.height - defaultOffset); + } + else { + this._moveOffScreen(); + } + break; + } + case DialogViewPosition.EDITOR_BELOW_CENTER: { + // @if CK_DEBUG_DIALOG // if ( domRootRect ) { + // @if CK_DEBUG_DIALOG // RectDrawer.draw( domRootRect, { outlineColor: 'red', zIndex: 9999999 }, 'DOM ROOT' ); + // @if CK_DEBUG_DIALOG // } + if (domRootRect) { + this.moveTo(Math.round(domRootRect.left + domRootRect.width / 2 - dialogRect.width / 2), domRootRect.bottom + defaultOffset); + } + else { + this._moveOffScreen(); + } + break; + } + } + } + /** + * Calculates the visible DOM root part. + */ + _getVisibleDomRootRect(viewportRect) { + let visibleDomRootRect = new Rect(this._getCurrentDomRoot()).getVisible(); + if (!visibleDomRootRect) { + return null; + } + else { + visibleDomRootRect = viewportRect.getIntersection(visibleDomRootRect); + if (!visibleDomRootRect) { + return null; + } + } + return visibleDomRootRect; + } + /** + * Calculates the dialog element rect. + */ + _getDialogRect() { + return new Rect(this.element.firstElementChild); + } + /** + * Calculates the viewport rect. + */ + _getViewportRect() { + return getConstrainedViewportRect(this._getViewportOffset()); + } + /** + * Collects all focusable elements inside the dialog parts + * and adds them to the focus tracker and focus cycler. + */ + _updateFocusCyclableItems() { + const focusables = []; + if (this.contentView) { + for (const child of this.contentView.children) { + if (isFocusable(child)) { + focusables.push(child); + } + } + } + if (this.actionsView) { + focusables.push(this.actionsView); + } + if (this.closeButtonView) { + focusables.push(this.closeButtonView); + } + focusables.forEach(focusable => { + this._focusables.add(focusable); + this.focusTracker.add(focusable.element); + if (isViewWithFocusCycler(focusable)) { + this.listenTo(focusable.focusCycler, 'forwardCycle', evt => { + this._focusCycler.focusNext(); + // Stop the event propagation only if there are more focusables. + if (this._focusCycler.next !== this._focusCycler.focusables.get(this._focusCycler.current)) { + evt.stop(); + } + }); + this.listenTo(focusable.focusCycler, 'backwardCycle', evt => { + this._focusCycler.focusPrevious(); + // Stop the event propagation only if there are more focusables. + if (this._focusCycler.previous !== this._focusCycler.focusables.get(this._focusCycler.current)) { + evt.stop(); + } + }); + } + }); + } + /** + * Creates the close button view that is displayed in the header view corner. + */ + _createCloseButton() { + const buttonView = new ButtonView(this.locale); + const t = this.locale.t; + buttonView.set({ + label: t('Close'), + tooltip: true, + icon: icons.cancel + }); + buttonView.on('execute', () => this.fire('close', { source: 'closeButton' })); + return buttonView; + } +} +/** + * A default dialog element offset from the reference element (e.g. editor editable area). + */ +DialogView.defaultOffset = 15; +export default DialogView; +// Returns a viewport `Rect` shrunk by the viewport offset config from all sides. +// TODO: This is a duplicate from position.ts module. It should either be exported there or land somewhere in utils. +function getConstrainedViewportRect(viewportOffset) { + viewportOffset = Object.assign({ top: 0, bottom: 0, left: 0, right: 0 }, viewportOffset); + const viewportRect = new Rect(global.window); + viewportRect.top += viewportOffset.top; + viewportRect.height -= viewportOffset.top; + viewportRect.bottom -= viewportOffset.bottom; + viewportRect.height -= viewportOffset.bottom; + viewportRect.left += viewportOffset.left; + viewportRect.right -= viewportOffset.right; + viewportRect.width -= viewportOffset.left + viewportOffset.right; + return viewportRect; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.d.ts new file mode 100644 index 0000000..36a45cb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.d.ts @@ -0,0 +1,25 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/dropdownbutton + */ +import type Button from '../../button/button.js'; +import type ViewCollection from '../../viewcollection.js'; +/** + * The dropdown button interface. + */ +export default interface DropdownButton extends Button { + children: ViewCollection; +} +/** + * Fired when the dropdown should be opened. + * It will not be fired when the button {@link module:ui/dropdown/button/dropdownbutton~DropdownButton#isEnabled is disabled}. + * + * @eventName ~DropdownButton#open + */ +export type DropdownButtonOpenEvent = { + name: 'open'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbutton.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.d.ts new file mode 100644 index 0000000..b418fab --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.d.ts @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/dropdownbuttonview + */ +import ButtonView from '../../button/buttonview.js'; +import type DropdownButton from './dropdownbutton.js'; +import IconView from '../../icon/iconview.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The default dropdown button view class. + * + * ```ts + * const view = new DropdownButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + * + * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}. + */ +export default class DropdownButtonView extends ButtonView implements DropdownButton { + /** + * An icon that displays arrow to indicate a dropdown button. + */ + readonly arrowView: IconView; + /** + * @inheritDoc + */ + constructor(locale?: Locale); + /** + * @inheritDoc + */ + render(): void; + /** + * Creates a {@link module:ui/icon/iconview~IconView} instance as {@link #arrowView}. + */ + private _createArrowView; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js new file mode 100644 index 0000000..717ea76 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/dropdownbuttonview.js @@ -0,0 +1,66 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/dropdownbuttonview + */ +import ButtonView from '../../button/buttonview.js'; +import IconView from '../../icon/iconview.js'; +import dropdownArrowIcon from '../../../theme/icons/dropdown-arrow.svg'; +/** + * The default dropdown button view class. + * + * ```ts + * const view = new DropdownButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + * + * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}. + */ +export default class DropdownButtonView extends ButtonView { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.arrowView = this._createArrowView(); + this.extendTemplate({ + attributes: { + 'aria-haspopup': true, + 'aria-expanded': this.bindTemplate.to('isOn', value => String(value)) + } + }); + // The DropdownButton interface expects the open event upon which will open the dropdown. + this.delegate('execute').to(this, 'open'); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this.arrowView); + } + /** + * Creates a {@link module:ui/icon/iconview~IconView} instance as {@link #arrowView}. + */ + _createArrowView() { + const arrowView = new IconView(); + arrowView.content = dropdownArrowIcon; + arrowView.extendTemplate({ + attributes: { + class: 'ck-dropdown__arrow' + } + }); + return arrowView; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.d.ts new file mode 100644 index 0000000..43824ff --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.d.ts @@ -0,0 +1,162 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/splitbuttonview + */ +import View from '../../view.js'; +import ButtonView from '../../button/buttonview.js'; +import type ViewCollection from '../../viewcollection.js'; +import type Button from '../../button/button.js'; +import type DropdownButton from './dropdownbutton.js'; +import type { FocusableView } from '../../focuscycler.js'; +import { KeystrokeHandler, FocusTracker, type Locale } from '@ckeditor/ckeditor5-utils'; +import '../../../theme/components/dropdown/splitbutton.css'; +/** + * The split button view class. + * + * ```ts + * const view = new SplitButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + * + * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}. + */ +export default class SplitButtonView extends View implements DropdownButton { + /** + * Collection of the child views inside of the split button {@link #element}. + */ + readonly children: ViewCollection; + /** + * A main button of split button. + */ + readonly actionView: ButtonView; + /** + * A secondary button of split button that opens dropdown. + */ + readonly arrowView: ButtonView; + /** + * Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. It manages + * keystrokes of the split button: + * + * * moves focus to arrow view when action view is focused, + * * moves focus to action view when arrow view is focused. + */ + readonly keystrokes: KeystrokeHandler; + /** + * Tracks information about DOM focus in the dropdown. + */ + readonly focusTracker: FocusTracker; + /** + * @inheritDoc + */ + label: string | undefined; + /** + * @inheritDoc + */ + keystroke: string | undefined; + /** + * @inheritDoc + */ + tooltip: Button['tooltip']; + /** + * @inheritDoc + */ + tooltipPosition: Button['tooltipPosition']; + /** + * @inheritDoc + */ + type: Button['type']; + /** + * @inheritDoc + */ + isOn: boolean; + /** + * @inheritDoc + */ + isEnabled: boolean; + /** + * @inheritDoc + */ + isVisible: boolean; + /** + * @inheritDoc + */ + isToggleable: boolean; + /** + * @inheritDoc + */ + withText: boolean; + /** + * @inheritDoc + */ + withKeystroke: boolean; + /** + * @inheritDoc + */ + icon: string | undefined; + /** + * @inheritDoc + */ + tabindex: number; + /** + * @inheritDoc + */ + class: string | undefined; + /** + * @inheritDoc + */ + labelStyle: string | undefined; + /** + * @inheritDoc + */ + role: string | undefined; + /** + * @inheritDoc + */ + ariaChecked: boolean | undefined; + /** + * @inheritDoc + */ + ariaLabel?: string | undefined; + /** + * @inheritDoc + */ + ariaLabelledBy: string | undefined; + /** + * @inheritDoc + */ + constructor(locale?: Locale, actionButton?: ButtonView & FocusableView); + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Focuses the {@link module:ui/button/buttonview~ButtonView#element} of the action part of split button. + */ + focus(): void; + /** + * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #actionView} and binds it with main split button + * attributes. + */ + private _createActionView; + /** + * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #arrowView} and binds it with main split button + * attributes. + */ + private _createArrowView; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js new file mode 100644 index 0000000..2bd7e4f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/button/splitbuttonview.js @@ -0,0 +1,154 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/button/splitbuttonview + */ +import View from '../../view.js'; +import ButtonView from '../../button/buttonview.js'; +import { KeystrokeHandler, FocusTracker } from '@ckeditor/ckeditor5-utils'; +import dropdownArrowIcon from '../../../theme/icons/dropdown-arrow.svg'; +import '../../../theme/components/dropdown/splitbutton.css'; +/** + * The split button view class. + * + * ```ts + * const view = new SplitButtonView(); + * + * view.set( { + * label: 'A button', + * keystroke: 'Ctrl+B', + * tooltip: true + * } ); + * + * view.render(); + * + * document.body.append( view.element ); + * ``` + * + * Also see the {@link module:ui/dropdown/utils~createDropdown `createDropdown()` util}. + */ +export default class SplitButtonView extends View { + /** + * @inheritDoc + */ + constructor(locale, actionButton) { + super(locale); + const bind = this.bindTemplate; + // Implement the Button interface. + this.set('class', undefined); + this.set('labelStyle', undefined); + this.set('icon', undefined); + this.set('isEnabled', true); + this.set('isOn', false); + this.set('isToggleable', false); + this.set('isVisible', true); + this.set('keystroke', undefined); + this.set('withKeystroke', false); + this.set('label', undefined); + this.set('tabindex', -1); + this.set('tooltip', false); + this.set('tooltipPosition', 's'); + this.set('type', 'button'); + this.set('withText', false); + this.children = this.createCollection(); + this.actionView = this._createActionView(actionButton); + this.arrowView = this._createArrowView(); + this.keystrokes = new KeystrokeHandler(); + this.focusTracker = new FocusTracker(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-splitbutton', + bind.to('class'), + bind.if('isVisible', 'ck-hidden', value => !value), + this.arrowView.bindTemplate.if('isOn', 'ck-splitbutton_open') + ] + }, + children: this.children + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.children.add(this.actionView); + this.children.add(this.arrowView); + this.focusTracker.add(this.actionView.element); + this.focusTracker.add(this.arrowView.element); + this.keystrokes.listenTo(this.element); + // Overrides toolbar focus cycling behavior. + this.keystrokes.set('arrowright', (evt, cancel) => { + if (this.focusTracker.focusedElement === this.actionView.element) { + this.arrowView.focus(); + cancel(); + } + }); + // Overrides toolbar focus cycling behavior. + this.keystrokes.set('arrowleft', (evt, cancel) => { + if (this.focusTracker.focusedElement === this.arrowView.element) { + this.actionView.focus(); + cancel(); + } + }); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this.focusTracker.destroy(); + this.keystrokes.destroy(); + } + /** + * Focuses the {@link module:ui/button/buttonview~ButtonView#element} of the action part of split button. + */ + focus() { + this.actionView.focus(); + } + /** + * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #actionView} and binds it with main split button + * attributes. + */ + _createActionView(actionButton) { + const actionView = actionButton || new ButtonView(); + if (!actionButton) { + actionView.bind('icon', 'isEnabled', 'isOn', 'isToggleable', 'keystroke', 'label', 'tabindex', 'tooltip', 'tooltipPosition', 'type', 'withText').to(this); + } + actionView.extendTemplate({ + attributes: { + class: 'ck-splitbutton__action' + } + }); + actionView.delegate('execute').to(this); + return actionView; + } + /** + * Creates a {@link module:ui/button/buttonview~ButtonView} instance as {@link #arrowView} and binds it with main split button + * attributes. + */ + _createArrowView() { + const arrowView = new ButtonView(); + const bind = arrowView.bindTemplate; + arrowView.icon = dropdownArrowIcon; + arrowView.extendTemplate({ + attributes: { + class: [ + 'ck-splitbutton__arrow' + ], + 'data-cke-tooltip-disabled': bind.to('isOn'), + 'aria-haspopup': true, + 'aria-expanded': bind.to('isOn', value => String(value)) + } + }); + arrowView.bind('isEnabled').to(this); + arrowView.bind('label').to(this); + arrowView.bind('tooltip').to(this); + arrowView.delegate('execute').to(this, 'open'); + return arrowView; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.d.ts new file mode 100644 index 0000000..5d72c43 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.d.ts @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/dropdownpanelfocusable + */ +/** + * The dropdown panel interface for focusable contents. It provides two methods for managing focus of the contents + * of dropdown's panel. + */ +export default interface DropdownPanelFocusable { + /** + * Focuses the view element or first item in view collection on opening dropdown's panel. + */ + focus(): void; + /** + * Focuses the view element or last item in view collection on opening dropdown's panel. + */ + focusLast(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelfocusable.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.d.ts new file mode 100644 index 0000000..7d11eed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.d.ts @@ -0,0 +1,62 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/dropdownpanelview + */ +import View from '../view.js'; +import type ViewCollection from '../viewcollection.js'; +import type DropdownPanelFocusable from './dropdownpanelfocusable.js'; +import { type Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The dropdown panel view class. + * + * See {@link module:ui/dropdown/dropdownview~DropdownView} to learn about the common usage. + */ +export default class DropdownPanelView extends View implements DropdownPanelFocusable { + /** + * Collection of the child views in this panel. + * + * A common child type is the {@link module:ui/list/listview~ListView} and {@link module:ui/toolbar/toolbarview~ToolbarView}. + * See {@link module:ui/dropdown/utils~addListToDropdown} and + * {@link module:ui/dropdown/utils~addToolbarToDropdown} to learn more about child views of dropdowns. + */ + readonly children: ViewCollection; + /** + * Controls whether the panel is visible. + * + * @observable + */ + isVisible: boolean; + /** + * The position of the panel, relative to the parent. + * + * This property is reflected in the CSS class set to {@link #element} that controls + * the position of the panel. + * + * @observable + * @default 'se' + */ + position: PanelPosition; + /** + * @inheritDoc + */ + constructor(locale?: Locale); + /** + * Focuses the first view in the {@link #children} collection. + * + * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}. + */ + focus(): void; + /** + * Focuses the view element or last item in view collection on opening dropdown's panel. + * + * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}. + */ + focusLast(): void; +} +/** + * The position of the panel, relative to the parent. + */ +export type PanelPosition = 's' | 'se' | 'sw' | 'sme' | 'smw' | 'n' | 'ne' | 'nw' | 'nme' | 'nmw'; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js new file mode 100644 index 0000000..c4e2703 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownpanelview.js @@ -0,0 +1,97 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/dropdownpanelview + */ +import View from '../view.js'; +import { logWarning } from '@ckeditor/ckeditor5-utils'; +/** + * The dropdown panel view class. + * + * See {@link module:ui/dropdown/dropdownview~DropdownView} to learn about the common usage. + */ +export default class DropdownPanelView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + this.set('isVisible', false); + this.set('position', 'se'); + this.children = this.createCollection(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-reset', + 'ck-dropdown__panel', + bind.to('position', value => `ck-dropdown__panel_${value}`), + bind.if('isVisible', 'ck-dropdown__panel-visible') + ], + tabindex: '-1' + }, + children: this.children, + on: { + // Drag and drop in the panel should not break the selection in the editor. + // https://github.com/ckeditor/ckeditor5-ui/issues/228 + selectstart: bind.to(evt => { + if (evt.target.tagName.toLocaleLowerCase() === 'input') { + return; + } + evt.preventDefault(); + }) + } + }); + } + /** + * Focuses the first view in the {@link #children} collection. + * + * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}. + */ + focus() { + if (this.children.length) { + const firstChild = this.children.first; + if (typeof firstChild.focus === 'function') { + firstChild.focus(); + } + else { + /** + * The child view of a dropdown could not be focused because it is missing the `focus()` method. + * + * This warning appears when a dropdown {@link module:ui/dropdown/dropdownview~DropdownView#isOpen gets open} and it + * attempts to focus the {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView#children first child} of its panel + * but the child does not implement the + * {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable focusable interface}. + * + * Focusing the content of a dropdown on open greatly improves the accessibility. Please make sure the view instance + * provides the `focus()` method for the best user experience. + * + * @error ui-dropdown-panel-focus-child-missing-focus + * @param childView + * @param dropdownPanel + */ + logWarning('ui-dropdown-panel-focus-child-missing-focus', { childView: this.children.first, dropdownPanel: this }); + } + } + } + /** + * Focuses the view element or last item in view collection on opening dropdown's panel. + * + * See also {@link module:ui/dropdown/dropdownpanelfocusable~DropdownPanelFocusable}. + */ + focusLast() { + if (this.children.length) { + const lastChild = this.children.last; + if (typeof lastChild.focusLast === 'function') { + lastChild.focusLast(); + } + else { + lastChild.focus(); + } + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.d.ts new file mode 100644 index 0000000..4bdd1c7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/dropdown/dropdownview.d.ts @@ -0,0 +1,315 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/dropdown/dropdownview + */ +import View from '../view.js'; +import type { default as DropdownButton } from './button/dropdownbutton.js'; +import type { default as DropdownPanelView, PanelPosition } from './dropdownpanelview.js'; +import type { FocusableView } from '../focuscycler.js'; +import type ListView from '../list/listview.js'; +import type ToolbarView from '../toolbar/toolbarview.js'; +import { KeystrokeHandler, FocusTracker, type Locale, type PositioningFunction } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/dropdown/dropdown.css'; +/** + * The dropdown view class. It manages the dropdown button and dropdown panel. + * + * In most cases, the easiest way to create a dropdown is by using the {@link module:ui/dropdown/utils~createDropdown} + * util: + * + * ```ts + * const dropdown = createDropdown( locale ); + * + * // Configure dropdown's button properties: + * dropdown.buttonView.set( { + * label: 'A dropdown', + * withText: true + * } ); + * + * dropdown.render(); + * + * dropdown.panelView.element.textContent = 'Content of the panel'; + * + * // Will render a dropdown with a panel containing a "Content of the panel" text. + * document.body.appendChild( dropdown.element ); + * ``` + * + * If you want to add a richer content to the dropdown panel, you can use the {@link module:ui/dropdown/utils~addListToDropdown} + * and {@link module:ui/dropdown/utils~addToolbarToDropdown} helpers. See more examples in + * {@link module:ui/dropdown/utils~createDropdown} documentation. + * + * If you want to create a completely custom dropdown, then you can compose it manually: + * + * ```ts + * const button = new DropdownButtonView( locale ); + * const panel = new DropdownPanelView( locale ); + * const dropdown = new DropdownView( locale, button, panel ); + * + * button.set( { + * label: 'A dropdown', + * withText: true + * } ); + * + * dropdown.render(); + * + * panel.element.textContent = 'Content of the panel'; + * + * // Will render a dropdown with a panel containing a "Content of the panel" text. + * document.body.appendChild( dropdown.element ); + * ``` + * + * However, dropdown created this way will contain little behavior. You will need to implement handlers for actions + * such as {@link module:ui/bindings/clickoutsidehandler~clickOutsideHandler clicking outside an open dropdown} + * (which should close it) and support for arrow keys inside the panel. Therefore, unless you really know what + * you do and you really need to do it, it is recommended to use the {@link module:ui/dropdown/utils~createDropdown} helper. + */ +export default class DropdownView extends View { + /** + * Button of the dropdown view. Clicking the button opens the {@link #panelView}. + */ + readonly buttonView: DropdownButton & FocusableView; + /** + * Panel of the dropdown. It opens when the {@link #buttonView} is + * {@link module:ui/button/button~Button#event:execute executed} (i.e. clicked). + * + * Child views can be added to the panel's `children` collection: + * + * ```ts + * dropdown.panelView.children.add( childView ); + * ``` + * + * See {@link module:ui/dropdown/dropdownpanelview~DropdownPanelView#children} and + * {@link module:ui/viewcollection~ViewCollection#add}. + */ + readonly panelView: DropdownPanelView; + /** + * Tracks information about the DOM focus in the dropdown. + */ + readonly focusTracker: FocusTracker; + /** + * Instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}. It manages + * keystrokes of the dropdown: + * + * * opens the dropdown, + * * and Esc closes the dropdown. + */ + readonly keystrokes: KeystrokeHandler; + /** + * A child {@link module:ui/list/listview~ListView list view} of the dropdown located + * in its {@link module:ui/dropdown/dropdownview~DropdownView#panelView panel}. + * + * **Note**: Only supported when dropdown has list view added using {@link module:ui/dropdown/utils~addListToDropdown}. + */ + listView?: ListView; + /** + * A child toolbar of the dropdown located in the + * {@link module:ui/dropdown/dropdownview~DropdownView#panelView panel}. + * + * **Note**: Only supported when dropdown has list view added using {@link module:ui/dropdown/utils~addToolbarToDropdown}. + */ + toolbarView?: ToolbarView; + /** + * Controls whether the dropdown view is open, i.e. shows or hides the {@link #panelView panel}. + * + * **Note**: When the dropdown gets open, it will attempt to call `focus()` on the first child of its {@link #panelView}. + * See {@link module:ui/dropdown/utils~addToolbarToDropdown}, {@link module:ui/dropdown/utils~addListToDropdown}, and + * {@link module:ui/dropdown/utils~focusChildOnDropdownOpen} to learn more about focus management in dropdowns. + * + * @observable + */ + isOpen: boolean; + /** + * Controls whether the dropdown is enabled, i.e. it can be clicked and execute an action. + * + * See {@link module:ui/button/buttonview~ButtonView#isEnabled}. + * + * @observable + */ + isEnabled: boolean; + /** + * (Optional) The additional CSS class set on the dropdown {@link #element}. + * + * @observable + */ + class: string | undefined; + /** + * (Optional) The `id` attribute of the dropdown (i.e. to pair with a `
    ) and their optional headers (

    ). + ...Array.from(categoryDefinition.groups.values()) + .map(groupDefinition => this._createGroup(groupDefinition)) + .flat() + ]; + // Category description (

    ). + if (categoryDefinition.description) { + elements.splice(1, 0, createElement(document, 'p', {}, categoryDefinition.description)); + } + return createElement(document, 'section', {}, elements); + }); + } + /** + * Creates `[

    Optional label

    ]
    ...
    ` elements for each group of keystrokes in a category. + */ + _createGroup(groupDefinition) { + const definitionAndDescriptionElements = groupDefinition.keystrokes + .sort((a, b) => a.label.localeCompare(b.label)) + .map(keystrokeDefinition => this._createGroupRow(keystrokeDefinition)) + .flat(); + const elements = [ + createElement(document, 'dl', {}, definitionAndDescriptionElements) + ]; + if (groupDefinition.label) { + elements.unshift(createElement(document, 'h4', {}, groupDefinition.label)); + } + return elements; + } + /** + * Creates `
    Keystroke label
    Keystroke definition
    ` elements for each keystroke in a group. + */ + _createGroupRow(keystrokeDefinition) { + const t = this.locale.t; + const dt = createElement(document, 'dt'); + const dd = createElement(document, 'dd'); + const normalizedKeystrokeDefinition = normalizeKeystrokeDefinition(keystrokeDefinition.keystroke); + const keystrokeAlternativeHTMLs = []; + for (const keystrokeAlternative of normalizedKeystrokeDefinition) { + keystrokeAlternativeHTMLs.push(keystrokeAlternative.map(keystrokeToEnvKbd).join('')); + } + dt.innerHTML = keystrokeDefinition.label; + dd.innerHTML = keystrokeAlternativeHTMLs.join(', ') + + (keystrokeDefinition.mayRequireFn && env.isMac ? ` ${t('(may require Fn)')}` : ''); + return [dt, dd]; + } +} +function keystrokeToEnvKbd(keystroke) { + return getEnvKeystrokeText(keystroke) + .split('+') + .map(part => `${part}`) + .join('+'); +} +function normalizeKeystrokeDefinition(definition) { + if (typeof definition === 'string') { + return [[definition]]; + } + if (typeof definition[0] === 'string') { + return [definition]; + } + return definition; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.d.ts new file mode 100644 index 0000000..4146ddf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.d.ts @@ -0,0 +1,55 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import ViewCollection from '../viewcollection.js'; +import type View from '../view.js'; +import { type Locale } from '@ckeditor/ckeditor5-utils'; +/** + * This is a special {@link module:ui/viewcollection~ViewCollection} dedicated to elements that are detached + * from the DOM structure of the editor, like panels, icons, etc. + * + * The body collection is available in the {@link module:ui/editorui/editoruiview~EditorUIView#body `editor.ui.view.body`} property. + * Any plugin can add a {@link module:ui/view~View view} to this collection. + * These views will render in a container placed directly in the `` element. + * The editor will detach and destroy this collection when the editor will be {@link module:core/editor/editor~Editor#destroy destroyed}. + * + * If you need to control the life cycle of the body collection on your own, you can create your own instance of this class. + * + * A body collection will render itself automatically in the DOM body element as soon as you call {@link ~BodyCollection#attachToDom}. + * If you create multiple body collections, this class will create a special wrapper element in the DOM to limit the number of + * elements created directly in the body and remove it when the last body collection will be + * {@link ~BodyCollection#detachFromDom detached}. + */ +export default class BodyCollection extends ViewCollection { + /** + * The {@link module:core/editor/editor~Editor#locale editor's locale} instance. + * See the view {@link module:ui/view~View#locale locale} property. + */ + readonly locale: Locale; + /** + * The element holding elements of the body region. + */ + private _bodyCollectionContainer?; + /** + * Creates a new instance of the {@link module:ui/editorui/bodycollection~BodyCollection}. + * + * @param locale The {@link module:core/editor/editor~Editor editor's locale} instance. + * @param initialItems The initial items of the collection. + */ + constructor(locale: Locale, initialItems?: Iterable); + /** + * The element holding elements of the body region. + */ + get bodyCollectionContainer(): HTMLElement | undefined; + /** + * Attaches the body collection to the DOM body element. You need to execute this method to render the content of + * the body collection. + */ + attachToDom(): void; + /** + * Detaches the collection from the DOM structure. Use this method when you do not need to use the body collection + * anymore to clean-up the DOM structure. + */ + detachFromDom(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.js b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.js new file mode 100644 index 0000000..d279a85 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/bodycollection.js @@ -0,0 +1,84 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/bodycollection + */ +/* globals document */ +import Template from '../template.js'; +import ViewCollection from '../viewcollection.js'; +import { createElement } from '@ckeditor/ckeditor5-utils'; +/** + * This is a special {@link module:ui/viewcollection~ViewCollection} dedicated to elements that are detached + * from the DOM structure of the editor, like panels, icons, etc. + * + * The body collection is available in the {@link module:ui/editorui/editoruiview~EditorUIView#body `editor.ui.view.body`} property. + * Any plugin can add a {@link module:ui/view~View view} to this collection. + * These views will render in a container placed directly in the `` element. + * The editor will detach and destroy this collection when the editor will be {@link module:core/editor/editor~Editor#destroy destroyed}. + * + * If you need to control the life cycle of the body collection on your own, you can create your own instance of this class. + * + * A body collection will render itself automatically in the DOM body element as soon as you call {@link ~BodyCollection#attachToDom}. + * If you create multiple body collections, this class will create a special wrapper element in the DOM to limit the number of + * elements created directly in the body and remove it when the last body collection will be + * {@link ~BodyCollection#detachFromDom detached}. + */ +export default class BodyCollection extends ViewCollection { + /** + * Creates a new instance of the {@link module:ui/editorui/bodycollection~BodyCollection}. + * + * @param locale The {@link module:core/editor/editor~Editor editor's locale} instance. + * @param initialItems The initial items of the collection. + */ + constructor(locale, initialItems = []) { + super(initialItems); + this.locale = locale; + } + /** + * The element holding elements of the body region. + */ + get bodyCollectionContainer() { + return this._bodyCollectionContainer; + } + /** + * Attaches the body collection to the DOM body element. You need to execute this method to render the content of + * the body collection. + */ + attachToDom() { + this._bodyCollectionContainer = new Template({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-reset_all', + 'ck-body', + 'ck-rounded-corners' + ], + dir: this.locale.uiLanguageDirection + }, + children: this + }).render(); + let wrapper = document.querySelector('.ck-body-wrapper'); + if (!wrapper) { + wrapper = createElement(document, 'div', { class: 'ck-body-wrapper' }); + document.body.appendChild(wrapper); + } + wrapper.appendChild(this._bodyCollectionContainer); + } + /** + * Detaches the collection from the DOM structure. Use this method when you do not need to use the body collection + * anymore to clean-up the DOM structure. + */ + detachFromDom() { + super.destroy(); + if (this._bodyCollectionContainer) { + this._bodyCollectionContainer.remove(); + } + const wrapper = document.querySelector('.ck-body-wrapper'); + if (wrapper && wrapper.childElementCount == 0) { + wrapper.remove(); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.d.ts new file mode 100644 index 0000000..52739e8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.d.ts @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/boxed/boxededitoruiview + */ +import EditorUIView from '../editoruiview.js'; +import type ViewCollection from '../../viewcollection.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The boxed editor UI view class. This class represents an editor interface + * consisting of a toolbar and an editable area, enclosed within a box. + */ +export default abstract class BoxedEditorUIView extends EditorUIView { + /** + * Collection of the child views located in the top (`.ck-editor__top`) + * area of the UI. + */ + readonly top: ViewCollection; + /** + * Collection of the child views located in the main (`.ck-editor__main`) + * area of the UI. + */ + readonly main: ViewCollection; + /** + * Voice label of the UI. + */ + private readonly _voiceLabelView; + /** + * Creates an instance of the boxed editor UI view class. + * + * @param locale The locale instance.. + */ + constructor(locale: Locale); + /** + * Creates a voice label view instance. + */ + private _createVoiceLabel; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.js b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.js new file mode 100644 index 0000000..9321fe0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/boxed/boxededitoruiview.js @@ -0,0 +1,81 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/boxed/boxededitoruiview + */ +import EditorUIView from '../editoruiview.js'; +import LabelView from '../../label/labelview.js'; +/** + * The boxed editor UI view class. This class represents an editor interface + * consisting of a toolbar and an editable area, enclosed within a box. + */ +export default class BoxedEditorUIView extends EditorUIView { + /** + * Creates an instance of the boxed editor UI view class. + * + * @param locale The locale instance.. + */ + constructor(locale) { + super(locale); + this.top = this.createCollection(); + this.main = this.createCollection(); + this._voiceLabelView = this._createVoiceLabel(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-reset', + 'ck-editor', + 'ck-rounded-corners' + ], + role: 'application', + dir: locale.uiLanguageDirection, + lang: locale.uiLanguage, + 'aria-labelledby': this._voiceLabelView.id + }, + children: [ + this._voiceLabelView, + { + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-editor__top', + 'ck-reset_all' + ], + role: 'presentation' + }, + children: this.top + }, + { + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-editor__main' + ], + role: 'presentation' + }, + children: this.main + } + ] + }); + } + /** + * Creates a voice label view instance. + */ + _createVoiceLabel() { + const t = this.t; + const voiceLabel = new LabelView(); + voiceLabel.text = t('Rich Text Editor'); + voiceLabel.extendTemplate({ + attributes: { + class: 'ck-voice-label' + } + }); + return voiceLabel; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.d.ts new file mode 100644 index 0000000..d01b875 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.d.ts @@ -0,0 +1,288 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/editorui + */ +import ComponentFactory from '../componentfactory.js'; +import TooltipManager from '../tooltipmanager.js'; +import PoweredBy from './poweredby.js'; +import AriaLiveAnnouncer from '../arialiveannouncer.js'; +import type EditorUIView from './editoruiview.js'; +import type ToolbarView from '../toolbar/toolbarview.js'; +import { FocusTracker } from '@ckeditor/ckeditor5-utils'; +import type { Editor } from '@ckeditor/ckeditor5-core'; +declare const EditorUI_base: { + new (): import("@ckeditor/ckeditor5-utils").Observable; + prototype: import("@ckeditor/ckeditor5-utils").Observable; +}; +/** + * A class providing the minimal interface that is required to successfully bootstrap any editor UI. + */ +export default abstract class EditorUI extends EditorUI_base { + /** + * The editor that the UI belongs to. + */ + readonly editor: Editor; + /** + * An instance of the {@link module:ui/componentfactory~ComponentFactory}, a registry used by plugins + * to register factories of specific UI components. + */ + readonly componentFactory: ComponentFactory; + /** + * Stores the information about the editor UI focus and propagates it so various plugins and components + * are unified as a focus group. + */ + readonly focusTracker: FocusTracker; + /** + * Manages the tooltips displayed on mouseover and focus across the UI. + */ + readonly tooltipManager: TooltipManager; + /** + * A helper that enables the "powered by" feature in the editor and renders a link to the project's webpage. + */ + readonly poweredBy: PoweredBy; + /** + * A helper that manages the content of an `aria-live` regions used by editor features to announce status changes + * to screen readers. + */ + readonly ariaLiveAnnouncer: AriaLiveAnnouncer; + /** + * Indicates the UI is ready. Set `true` after {@link #event:ready} event is fired. + * + * @readonly + * @default false + */ + isReady: boolean; + abstract get view(): EditorUIView; + /** + * Stores viewport offsets from every direction. + * + * Viewport offset can be used to constrain balloons or other UI elements into an element smaller than the viewport. + * This can be useful if there are any other absolutely positioned elements that may interfere with editor UI. + * + * Example `editor.ui.viewportOffset` returns: + * + * ```js + * { + * top: 50, + * right: 50, + * bottom: 50, + * left: 50 + * } + * ``` + * + * This property can be overriden after editor already being initialized: + * + * ```js + * editor.ui.viewportOffset = { + * top: 100, + * right: 0, + * bottom: 0, + * left: 0 + * }; + * ``` + * + * @observable + */ + viewportOffset: { + left?: number; + right?: number; + top?: number; + bottom?: number; + }; + /** + * Stores all editable elements used by the editor instance. + */ + private _editableElementsMap; + /** + * All available & focusable toolbars. + */ + private _focusableToolbarDefinitions; + /** + * Creates an instance of the editor UI class. + * + * @param editor The editor instance. + */ + constructor(editor: Editor); + /** + * The main (outermost) DOM element of the editor UI. + * + * For example, in {@link module:editor-classic/classiceditor~ClassicEditor} it is a `
    ` which + * wraps the editable element and the toolbar. In {@link module:editor-inline/inlineeditor~InlineEditor} + * it is the editable element itself (as there is no other wrapper). However, in + * {@link module:editor-decoupled/decouplededitor~DecoupledEditor} it is set to `null` because this editor does not + * come with a single "main" HTML element (its editable element and toolbar are separate). + * + * This property can be understood as a shorthand for retrieving the element that a specific editor integration + * considers to be its main DOM element. + */ + get element(): HTMLElement | null; + /** + * Fires the {@link module:ui/editorui/editorui~EditorUI#event:update `update`} event. + * + * This method should be called when the editor UI (e.g. positions of its balloons) needs to be updated due to + * some environmental change which CKEditor 5 is not aware of (e.g. resize of a container in which it is used). + */ + update(): void; + /** + * Destroys the UI. + */ + destroy(): void; + /** + * Stores the native DOM editable element used by the editor under a unique name. + * + * Also, registers the element in the editor to maintain the accessibility of the UI. When the user is editing text in a focusable + * editable area, they can use the Alt + F10 keystroke to navigate over editor toolbars. See {@link #addToolbar}. + * + * @param rootName The unique name of the editable element. + * @param domElement The native DOM editable element. + */ + setEditableElement(rootName: string, domElement: HTMLElement): void; + /** + * Removes the editable from the editor UI. Removes all handlers added by {@link #setEditableElement}. + * + * @param rootName The name of the editable element to remove. + */ + removeEditableElement(rootName: string): void; + /** + * Returns the editable editor element with the given name or null if editable does not exist. + * + * @param rootName The editable name. + */ + getEditableElement(rootName?: string): HTMLElement | undefined; + /** + * Returns array of names of all editor editable elements. + */ + getEditableElementsNames(): IterableIterator; + /** + * Adds a toolbar to the editor UI. Used primarily to maintain the accessibility of the UI. + * + * Focusable toolbars can be accessed (focused) by users by pressing the Alt + F10 keystroke. + * Successive keystroke presses navigate over available toolbars. + * + * @param toolbarView A instance of the toolbar to be registered. + */ + addToolbar(toolbarView: ToolbarView, options?: FocusableToolbarOptions): void; + /** + * Stores all editable elements used by the editor instance. + * + * @deprecated + */ + protected get _editableElements(): unknown; + /** + * Returns viewport offsets object: + * + * ```js + * { + * top: Number, + * right: Number, + * bottom: Number, + * left: Number + * } + * ``` + * + * Only top property is currently supported. + */ + private _readViewportOffsetFromConfig; + /** + * Starts listening for Alt + F10 and Esc keystrokes in the context of focusable + * {@link #setEditableElement editable elements} and {@link #addToolbar toolbars} + * to allow users navigate across the UI. + */ + private _initFocusTracking; + /** + * Returns definitions of toolbars that could potentially be focused, sorted by their importance for the user. + * + * Focusable toolbars candidates are either: + * * already visible, + * * have `beforeFocus()` set in their {@link module:ui/editorui/editorui~FocusableToolbarDefinition definition} that suggests that + * they might show up when called. Keep in mind that determining whether a toolbar will show up (and become focusable) is impossible + * at this stage because it depends on its implementation, that in turn depends on the editing context (selection). + * + * **Note**: Contextual toolbars take precedence over regular toolbars. + */ + private _getFocusableCandidateToolbarDefinitions; + /** + * Returns a definition of the toolbar that is currently visible and focused (one of its children has focus). + * + * `null` is returned when no toolbar is currently focused. + */ + private _getCurrentFocusedToolbarDefinition; + /** + * Focuses a focusable toolbar candidate using its definition. + * + * @param candidateToolbarDefinition A definition of the toolbar to focus. + * @returns `true` when the toolbar candidate was focused. `false` otherwise. + */ + private _focusFocusableCandidateToolbar; + /** + * Provides an integration between {@link #viewportOffset} and {@link module:utils/dom/scroll~scrollViewportToShowTarget}. + * It allows the UI-agnostic engine method to consider user-configured viewport offsets specific for the integration. + * + * @param evt The `scrollToTheSelection` event info. + * @param data The payload carried by the `scrollToTheSelection` event. + */ + private _handleScrollToTheSelection; +} +/** + * Fired when the editor UI is ready. + * + * Fired before {@link module:engine/controller/datacontroller~DataController#event:ready}. + * + * @eventName ~EditorUI#ready + */ +export type EditorUIReadyEvent = { + name: 'ready'; + args: []; +}; +/** + * Fired whenever the UI (all related components) should be refreshed. + * + * **Note:**: The event is fired after each {@link module:engine/view/document~Document#event:layoutChanged}. + * It can also be fired manually via the {@link module:ui/editorui/editorui~EditorUI#update} method. + * + * @eventName ~EditorUI#update + */ +export type EditorUIUpdateEvent = { + name: 'update'; + args: []; +}; +/** + * A definition of a focusable toolbar. Used by {@link module:ui/editorui/editorui~EditorUI#addToolbar}. + */ +export interface FocusableToolbarDefinition { + /** + * An instance of a focusable toolbar view. + */ + toolbarView: ToolbarView; + /** + * Options of a focusable toolbar view: + * + * * `isContextual`: Marks the higher priority toolbar. For example when there are 2 visible toolbars, + * it allows to distinguish which toolbar should be focused first after the `alt+f10` keystroke + * * `beforeFocus`: A callback executed before the `ToolbarView` gains focus upon the `Alt+F10` keystroke. + * * `afterBlur`: A callback executed after `ToolbarView` loses focus upon `Esc` keystroke but before + * the focus goes back to the `origin`. + */ + options: FocusableToolbarOptions; +} +export interface FocusableToolbarOptions { + /** + * Set `true` if the toolbar is attached to the content of the editor. Such toolbar takes + * a precedence over other toolbars when a user pressed Alt + F10. + */ + isContextual?: boolean; + /** + * Specify a callback executed before the toolbar instance DOM element gains focus + * upon the Alt + F10 keystroke. + */ + beforeFocus?: () => void; + /** + * Specify a callback executed after the toolbar instance DOM element loses focus upon + * Esc keystroke but before the focus goes back to the {@link ~EditorUI#setEditableElement editable element}. + */ + afterBlur?: () => void; +} +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.js b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.js new file mode 100644 index 0000000..3b95607 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editorui.js @@ -0,0 +1,412 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/editorui + */ +/* globals console */ +import ComponentFactory from '../componentfactory.js'; +import TooltipManager from '../tooltipmanager.js'; +import PoweredBy from './poweredby.js'; +import AriaLiveAnnouncer from '../arialiveannouncer.js'; +import { ObservableMixin, isVisible, FocusTracker } from '@ckeditor/ckeditor5-utils'; +/** + * A class providing the minimal interface that is required to successfully bootstrap any editor UI. + */ +export default class EditorUI extends ObservableMixin() { + /** + * Creates an instance of the editor UI class. + * + * @param editor The editor instance. + */ + constructor(editor) { + super(); + /** + * Indicates the UI is ready. Set `true` after {@link #event:ready} event is fired. + * + * @readonly + * @default false + */ + this.isReady = false; + /** + * Stores all editable elements used by the editor instance. + */ + this._editableElementsMap = new Map(); + /** + * All available & focusable toolbars. + */ + this._focusableToolbarDefinitions = []; + const editingView = editor.editing.view; + this.editor = editor; + this.componentFactory = new ComponentFactory(editor); + this.focusTracker = new FocusTracker(); + this.tooltipManager = new TooltipManager(editor); + this.poweredBy = new PoweredBy(editor); + this.ariaLiveAnnouncer = new AriaLiveAnnouncer(editor); + this.set('viewportOffset', this._readViewportOffsetFromConfig()); + this.once('ready', () => { + this.isReady = true; + }); + // Informs UI components that should be refreshed after layout change. + this.listenTo(editingView.document, 'layoutChanged', this.update.bind(this)); + this.listenTo(editingView, 'scrollToTheSelection', this._handleScrollToTheSelection.bind(this)); + this._initFocusTracking(); + } + /** + * The main (outermost) DOM element of the editor UI. + * + * For example, in {@link module:editor-classic/classiceditor~ClassicEditor} it is a `
    ` which + * wraps the editable element and the toolbar. In {@link module:editor-inline/inlineeditor~InlineEditor} + * it is the editable element itself (as there is no other wrapper). However, in + * {@link module:editor-decoupled/decouplededitor~DecoupledEditor} it is set to `null` because this editor does not + * come with a single "main" HTML element (its editable element and toolbar are separate). + * + * This property can be understood as a shorthand for retrieving the element that a specific editor integration + * considers to be its main DOM element. + */ + get element() { + return null; + } + /** + * Fires the {@link module:ui/editorui/editorui~EditorUI#event:update `update`} event. + * + * This method should be called when the editor UI (e.g. positions of its balloons) needs to be updated due to + * some environmental change which CKEditor 5 is not aware of (e.g. resize of a container in which it is used). + */ + update() { + this.fire('update'); + } + /** + * Destroys the UI. + */ + destroy() { + this.stopListening(); + this.focusTracker.destroy(); + this.tooltipManager.destroy(this.editor); + this.poweredBy.destroy(); + // Clean–up the references to the CKEditor instance stored in the native editable DOM elements. + for (const domElement of this._editableElementsMap.values()) { + domElement.ckeditorInstance = null; + this.editor.keystrokes.stopListening(domElement); + } + this._editableElementsMap = new Map(); + this._focusableToolbarDefinitions = []; + } + /** + * Stores the native DOM editable element used by the editor under a unique name. + * + * Also, registers the element in the editor to maintain the accessibility of the UI. When the user is editing text in a focusable + * editable area, they can use the Alt + F10 keystroke to navigate over editor toolbars. See {@link #addToolbar}. + * + * @param rootName The unique name of the editable element. + * @param domElement The native DOM editable element. + */ + setEditableElement(rootName, domElement) { + this._editableElementsMap.set(rootName, domElement); + // Put a reference to the CKEditor instance in the editable native DOM element. + // It helps 3rd–party software (browser extensions, other libraries) access and recognize + // CKEditor 5 instances (editing roots) and use their API (there is no global editor + // instance registry). + if (!domElement.ckeditorInstance) { + domElement.ckeditorInstance = this.editor; + } + // Register the element, so it becomes available for Alt+F10 and Esc navigation. + this.focusTracker.add(domElement); + const setUpKeystrokeHandler = () => { + // The editing view of the editor is already listening to keystrokes from DOM roots (see: KeyObserver). + // Do not duplicate listeners. + if (this.editor.editing.view.getDomRoot(rootName)) { + return; + } + this.editor.keystrokes.listenTo(domElement); + }; + // For editable elements set by features after EditorUI is ready (e.g. source editing). + if (this.isReady) { + setUpKeystrokeHandler(); + } + // For editable elements set while the editor is being created (e.g. DOM roots). + else { + this.once('ready', setUpKeystrokeHandler); + } + } + /** + * Removes the editable from the editor UI. Removes all handlers added by {@link #setEditableElement}. + * + * @param rootName The name of the editable element to remove. + */ + removeEditableElement(rootName) { + const domElement = this._editableElementsMap.get(rootName); + if (!domElement) { + return; + } + this._editableElementsMap.delete(rootName); + this.editor.keystrokes.stopListening(domElement); + this.focusTracker.remove(domElement); + domElement.ckeditorInstance = null; + } + /** + * Returns the editable editor element with the given name or null if editable does not exist. + * + * @param rootName The editable name. + */ + getEditableElement(rootName = 'main') { + return this._editableElementsMap.get(rootName); + } + /** + * Returns array of names of all editor editable elements. + */ + getEditableElementsNames() { + return this._editableElementsMap.keys(); + } + /** + * Adds a toolbar to the editor UI. Used primarily to maintain the accessibility of the UI. + * + * Focusable toolbars can be accessed (focused) by users by pressing the Alt + F10 keystroke. + * Successive keystroke presses navigate over available toolbars. + * + * @param toolbarView A instance of the toolbar to be registered. + */ + addToolbar(toolbarView, options = {}) { + if (toolbarView.isRendered) { + this.focusTracker.add(toolbarView.element); + this.editor.keystrokes.listenTo(toolbarView.element); + } + else { + toolbarView.once('render', () => { + this.focusTracker.add(toolbarView.element); + this.editor.keystrokes.listenTo(toolbarView.element); + }); + } + this._focusableToolbarDefinitions.push({ toolbarView, options }); + } + /** + * Stores all editable elements used by the editor instance. + * + * @deprecated + */ + get _editableElements() { + /** + * The {@link module:ui/editorui/editorui~EditorUI#_editableElements `EditorUI#_editableElements`} property has been + * deprecated and will be removed in the near future. Please use + * {@link module:ui/editorui/editorui~EditorUI#setEditableElement `setEditableElement()`} and + * {@link module:ui/editorui/editorui~EditorUI#getEditableElement `getEditableElement()`} methods instead. + * + * @error editor-ui-deprecated-editable-elements + * @param editorUI Editor UI instance the deprecated property belongs to. + */ + console.warn('editor-ui-deprecated-editable-elements: ' + + 'The EditorUI#_editableElements property has been deprecated and will be removed in the near future.', { editorUI: this }); + return this._editableElementsMap; + } + /** + * Returns viewport offsets object: + * + * ```js + * { + * top: Number, + * right: Number, + * bottom: Number, + * left: Number + * } + * ``` + * + * Only top property is currently supported. + */ + _readViewportOffsetFromConfig() { + const editor = this.editor; + const viewportOffsetConfig = editor.config.get('ui.viewportOffset'); + if (viewportOffsetConfig) { + return viewportOffsetConfig; + } + // Not present in EditorConfig type, because it's legacy. Hence the `as` expression. + const legacyOffsetConfig = editor.config.get('toolbar.viewportTopOffset'); + // Fall back to deprecated toolbar config. + if (legacyOffsetConfig) { + /** + * The {@link module:core/editor/editorconfig~EditorConfig#toolbar `EditorConfig#toolbar.viewportTopOffset`} + * property has been deprecated and will be removed in the near future. Please use + * {@link module:core/editor/editorconfig~EditorConfig#ui `EditorConfig#ui.viewportOffset`} instead. + * + * @error editor-ui-deprecated-viewport-offset-config + */ + console.warn('editor-ui-deprecated-viewport-offset-config: ' + + 'The `toolbar.vieportTopOffset` configuration option is deprecated. ' + + 'It will be removed from future CKEditor versions. Use `ui.viewportOffset.top` instead.'); + return { top: legacyOffsetConfig }; + } + // More keys to come in the future. + return { top: 0 }; + } + /** + * Starts listening for Alt + F10 and Esc keystrokes in the context of focusable + * {@link #setEditableElement editable elements} and {@link #addToolbar toolbars} + * to allow users navigate across the UI. + */ + _initFocusTracking() { + const editor = this.editor; + const editingView = editor.editing.view; + let lastFocusedForeignElement; + let candidateDefinitions; + // Focus the next focusable toolbar on Alt + F10. + editor.keystrokes.set('Alt+F10', (data, cancel) => { + const focusedElement = this.focusTracker.focusedElement; + // Focus moved out of a DOM element that + // * is not a toolbar, + // * does not belong to the editing view (e.g. source editing). + if (Array.from(this._editableElementsMap.values()).includes(focusedElement) && + !Array.from(editingView.domRoots.values()).includes(focusedElement)) { + lastFocusedForeignElement = focusedElement; + } + const currentFocusedToolbarDefinition = this._getCurrentFocusedToolbarDefinition(); + // * When focusing a toolbar for the first time, set the array of definitions for successive presses of Alt+F10. + // This ensures, the navigation works always the same and no pair of toolbars takes over + // (e.g. image and table toolbars when a selected image is inside a cell). + // * It could be that the focus went to the toolbar by clicking a toolbar item (e.g. a dropdown). In this case, + // there were no candidates so they must be obtained (#12339). + if (!currentFocusedToolbarDefinition || !candidateDefinitions) { + candidateDefinitions = this._getFocusableCandidateToolbarDefinitions(); + } + // In a single Alt+F10 press, check all candidates but if none were focused, don't go any further. + // This prevents an infinite loop. + for (let i = 0; i < candidateDefinitions.length; i++) { + const candidateDefinition = candidateDefinitions.shift(); + // Put the first definition to the back of the array. This allows circular navigation over all toolbars + // on successive presses of Alt+F10. + candidateDefinitions.push(candidateDefinition); + // Don't focus the same toolbar again. If you did, this would move focus from the nth focused toolbar item back to the + // first item as per ToolbarView#focus() if the user navigated inside the toolbar. + if (candidateDefinition !== currentFocusedToolbarDefinition && + this._focusFocusableCandidateToolbar(candidateDefinition)) { + // Clean up after a current visible toolbar when switching to the next one. + if (currentFocusedToolbarDefinition && currentFocusedToolbarDefinition.options.afterBlur) { + currentFocusedToolbarDefinition.options.afterBlur(); + } + break; + } + } + cancel(); + }); + // Blur the focused toolbar on Esc and bring the focus back to its origin. + editor.keystrokes.set('Esc', (data, cancel) => { + const focusedToolbarDef = this._getCurrentFocusedToolbarDefinition(); + if (!focusedToolbarDef) { + return; + } + // Bring focus back to where it came from before focusing the toolbar: + // 1. If it came from outside the engine view (e.g. source editing), move it there. + if (lastFocusedForeignElement) { + lastFocusedForeignElement.focus(); + lastFocusedForeignElement = null; + } + // 2. There are two possibilities left: + // 2.1. It could be that the focus went from an editable element in the view (root or nested). + // 2.2. It could be the focus went straight to the toolbar before even focusing the editing area. + // In either case, just focus the view editing. The focus will land where it belongs. + else { + editor.editing.view.focus(); + } + // Clean up after the toolbar if there is anything to do there. + if (focusedToolbarDef.options.afterBlur) { + focusedToolbarDef.options.afterBlur(); + } + cancel(); + }); + } + /** + * Returns definitions of toolbars that could potentially be focused, sorted by their importance for the user. + * + * Focusable toolbars candidates are either: + * * already visible, + * * have `beforeFocus()` set in their {@link module:ui/editorui/editorui~FocusableToolbarDefinition definition} that suggests that + * they might show up when called. Keep in mind that determining whether a toolbar will show up (and become focusable) is impossible + * at this stage because it depends on its implementation, that in turn depends on the editing context (selection). + * + * **Note**: Contextual toolbars take precedence over regular toolbars. + */ + _getFocusableCandidateToolbarDefinitions() { + const definitions = []; + for (const toolbarDef of this._focusableToolbarDefinitions) { + const { toolbarView, options } = toolbarDef; + if (isVisible(toolbarView.element) || options.beforeFocus) { + definitions.push(toolbarDef); + } + } + // Contextual and already visible toolbars have higher priority. If both are true, the toolbar will always focus first. + // For instance, a selected widget toolbar vs inline editor toolbar: both are visible but the widget toolbar is contextual. + definitions.sort((defA, defB) => getToolbarDefinitionWeight(defA) - getToolbarDefinitionWeight(defB)); + return definitions; + } + /** + * Returns a definition of the toolbar that is currently visible and focused (one of its children has focus). + * + * `null` is returned when no toolbar is currently focused. + */ + _getCurrentFocusedToolbarDefinition() { + for (const definition of this._focusableToolbarDefinitions) { + if (definition.toolbarView.element && definition.toolbarView.element.contains(this.focusTracker.focusedElement)) { + return definition; + } + } + return null; + } + /** + * Focuses a focusable toolbar candidate using its definition. + * + * @param candidateToolbarDefinition A definition of the toolbar to focus. + * @returns `true` when the toolbar candidate was focused. `false` otherwise. + */ + _focusFocusableCandidateToolbar(candidateToolbarDefinition) { + const { toolbarView, options: { beforeFocus } } = candidateToolbarDefinition; + if (beforeFocus) { + beforeFocus(); + } + // If it didn't show up after beforeFocus(), it's not focusable at all. + if (!isVisible(toolbarView.element)) { + return false; + } + toolbarView.focus(); + return true; + } + /** + * Provides an integration between {@link #viewportOffset} and {@link module:utils/dom/scroll~scrollViewportToShowTarget}. + * It allows the UI-agnostic engine method to consider user-configured viewport offsets specific for the integration. + * + * @param evt The `scrollToTheSelection` event info. + * @param data The payload carried by the `scrollToTheSelection` event. + */ + _handleScrollToTheSelection(evt, data) { + const configuredViewportOffset = { + top: 0, + bottom: 0, + left: 0, + right: 0, + ...this.viewportOffset + }; + data.viewportOffset.top += configuredViewportOffset.top; + data.viewportOffset.bottom += configuredViewportOffset.bottom; + data.viewportOffset.left += configuredViewportOffset.left; + data.viewportOffset.right += configuredViewportOffset.right; + } +} +/** + * Returns a number (weight) for a toolbar definition. Visible toolbars have a higher priority and so do + * contextual toolbars (displayed in the context of a content, for instance, an image toolbar). + * + * A standard invisible toolbar is the heaviest. A visible contextual toolbar is the lightest. + * + * @param toolbarDef A toolbar definition to be weighted. + */ +function getToolbarDefinitionWeight(toolbarDef) { + const { toolbarView, options } = toolbarDef; + let weight = 10; + // Prioritize already visible toolbars. They should get focused first. + if (isVisible(toolbarView.element)) { + weight--; + } + // Prioritize contextual toolbars. They are displayed at the selection. + if (options.isContextual) { + weight--; + } + return weight; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.d.ts new file mode 100644 index 0000000..23da850 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.d.ts @@ -0,0 +1,39 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/editoruiview + */ +import View from '../view.js'; +import BodyCollection from './bodycollection.js'; +import type EditableUIView from '../editableui/editableuiview.js'; +import type { Locale, LocaleTranslate } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/editorui/editorui.css'; +/** + * The editor UI view class. Base class for the editor main views. + */ +export default abstract class EditorUIView extends View { + /** + * Collection of the child views, detached from the DOM + * structure of the editor, like panels, icons etc. + */ + readonly body: BodyCollection; + locale: Locale; + t: LocaleTranslate; + abstract get editable(): EditableUIView; + /** + * Creates an instance of the editor UI view class. + * + * @param locale The locale instance. + */ + constructor(locale: Locale); + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.js b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.js new file mode 100644 index 0000000..f30ca9b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/editoruiview.js @@ -0,0 +1,38 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/editoruiview + */ +import View from '../view.js'; +import BodyCollection from './bodycollection.js'; +import '../../theme/components/editorui/editorui.css'; +/** + * The editor UI view class. Base class for the editor main views. + */ +export default class EditorUIView extends View { + /** + * Creates an instance of the editor UI view class. + * + * @param locale The locale instance. + */ + constructor(locale) { + super(locale); + this.body = new BodyCollection(locale); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.body.attachToDom(); + } + /** + * @inheritDoc + */ + destroy() { + this.body.detachFromDom(); + return super.destroy(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.d.ts new file mode 100644 index 0000000..d9f5bac --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.d.ts @@ -0,0 +1,71 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/editorui/poweredby + */ +import type { Editor } from '@ckeditor/ckeditor5-core'; +declare const PoweredBy_base: { + new (): import("@ckeditor/ckeditor5-utils").DomEmitter; + prototype: import("@ckeditor/ckeditor5-utils").DomEmitter; +}; +/** + * A helper that enables the "powered by" feature in the editor and renders a link to the project's + * webpage next to the bottom of the editable element (editor root, source editing area, etc.) when the editor is focused. + * + * @private + */ +export default class PoweredBy extends PoweredBy_base { + /** + * Editor instance the helper was created for. + */ + private readonly editor; + /** + * A reference to the balloon panel hosting and positioning the "powered by" link and logo. + */ + private _balloonView; + /** + * A throttled version of the {@link #_showBalloon} method meant for frequent use to avoid performance loss. + */ + private _showBalloonThrottled; + /** + * A reference to the last editable element (root, source editing area, etc.) focused by the user. + * Since the focus can move to other focusable elements in the UI, this reference allows positioning the balloon over the + * right element whether the user is typing or using the UI. + */ + private _lastFocusedEditableElement; + /** + * Creates a "powered by" helper for a given editor. The feature is initialized on Editor#ready + * event. + * + * @param editor + */ + constructor(editor: Editor); + /** + * Destroys the "powered by" helper along with its view. + */ + destroy(): void; + /** + * Enables "powered by" label once the editor (ui) is ready. + */ + private _handleEditorReady; + /** + * Creates an instance of the {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView balloon panel} + * with the "powered by" view inside ready for positioning. + */ + private _createBalloonView; + /** + * Attempts to display the balloon with the "powered by" view. + */ + private _showBalloon; + /** + * Hides the "powered by" balloon if already visible. + */ + private _hideBalloon; + /** + * Updates the {@link #_lastFocusedEditableElement} based on the state of the global focus tracker. + */ + private _updateLastFocusedEditableElement; +} +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.js b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.js new file mode 100644 index 0000000..cca4e8a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/editorui/poweredby.js @@ -0,0 +1,276 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import { DomEmitterMixin, Rect, verifyLicense } from '@ckeditor/ckeditor5-utils'; +import BalloonPanelView from '../panel/balloon/balloonpanelview.js'; +import IconView from '../icon/iconview.js'; +import View from '../view.js'; +import { throttle } from 'lodash-es'; +import poweredByIcon from '../../theme/icons/project-logo.svg'; +const ICON_WIDTH = 53; +const ICON_HEIGHT = 10; +// ⚠ Note, whenever changing the threshold, make sure to update the docs/support/managing-ckeditor-logo.md docs +// as this information is also mentioned there ⚠. +const NARROW_ROOT_HEIGHT_THRESHOLD = 50; +const NARROW_ROOT_WIDTH_THRESHOLD = 350; +const DEFAULT_LABEL = 'Powered by'; +/** + * A helper that enables the "powered by" feature in the editor and renders a link to the project's + * webpage next to the bottom of the editable element (editor root, source editing area, etc.) when the editor is focused. + * + * @private + */ +export default class PoweredBy extends DomEmitterMixin() { + /** + * Creates a "powered by" helper for a given editor. The feature is initialized on Editor#ready + * event. + * + * @param editor + */ + constructor(editor) { + super(); + this.editor = editor; + this._balloonView = null; + this._lastFocusedEditableElement = null; + this._showBalloonThrottled = throttle(this._showBalloon.bind(this), 50, { leading: true }); + editor.on('ready', this._handleEditorReady.bind(this)); + } + /** + * Destroys the "powered by" helper along with its view. + */ + destroy() { + const balloon = this._balloonView; + if (balloon) { + // Balloon gets destroyed by the body collection. + // The powered by view gets destroyed by the balloon. + balloon.unpin(); + this._balloonView = null; + } + this._showBalloonThrottled.cancel(); + this.stopListening(); + } + /** + * Enables "powered by" label once the editor (ui) is ready. + */ + _handleEditorReady() { + const editor = this.editor; + const forceVisible = !!editor.config.get('ui.poweredBy.forceVisible'); + /* istanbul ignore next -- @preserve */ + if (!forceVisible && verifyLicense(editor.config.get('licenseKey')) === 'VALID') { + return; + } + // No view means no body collection to append the powered by balloon to. + if (!editor.ui.view) { + return; + } + editor.ui.focusTracker.on('change:isFocused', (evt, data, isFocused) => { + this._updateLastFocusedEditableElement(); + if (isFocused) { + this._showBalloon(); + } + else { + this._hideBalloon(); + } + }); + editor.ui.focusTracker.on('change:focusedElement', (evt, data, focusedElement) => { + this._updateLastFocusedEditableElement(); + if (focusedElement) { + this._showBalloon(); + } + }); + editor.ui.on('update', () => { + this._showBalloonThrottled(); + }); + } + /** + * Creates an instance of the {@link module:ui/panel/balloon/balloonpanelview~BalloonPanelView balloon panel} + * with the "powered by" view inside ready for positioning. + */ + _createBalloonView() { + const editor = this.editor; + const balloon = this._balloonView = new BalloonPanelView(); + const poweredByConfig = getNormalizedConfig(editor); + const view = new PoweredByView(editor.locale, poweredByConfig.label); + balloon.content.add(view); + balloon.set({ + class: 'ck-powered-by-balloon' + }); + editor.ui.view.body.add(balloon); + editor.ui.focusTracker.add(balloon.element); + this._balloonView = balloon; + } + /** + * Attempts to display the balloon with the "powered by" view. + */ + _showBalloon() { + if (!this._lastFocusedEditableElement) { + return; + } + const attachOptions = getBalloonAttachOptions(this.editor, this._lastFocusedEditableElement); + if (attachOptions) { + if (!this._balloonView) { + this._createBalloonView(); + } + this._balloonView.pin(attachOptions); + } + } + /** + * Hides the "powered by" balloon if already visible. + */ + _hideBalloon() { + if (this._balloonView) { + this._balloonView.unpin(); + } + } + /** + * Updates the {@link #_lastFocusedEditableElement} based on the state of the global focus tracker. + */ + _updateLastFocusedEditableElement() { + const editor = this.editor; + const isFocused = editor.ui.focusTracker.isFocused; + const focusedElement = editor.ui.focusTracker.focusedElement; + if (!isFocused || !focusedElement) { + this._lastFocusedEditableElement = null; + return; + } + const editableEditorElements = Array.from(editor.ui.getEditableElementsNames()).map(name => { + return editor.ui.getEditableElement(name); + }); + if (editableEditorElements.includes(focusedElement)) { + this._lastFocusedEditableElement = focusedElement; + } + else { + // If it's none of the editable element, then the focus is somewhere in the UI. Let's display powered by + // over the first element then. + this._lastFocusedEditableElement = editableEditorElements[0]; + } + } +} +/** + * A view displaying a "powered by" label and project logo wrapped in a link. + */ +class PoweredByView extends View { + /** + * Created an instance of the "powered by" view. + * + * @param locale The localization services instance. + * @param label The label text. + */ + constructor(locale, label) { + super(locale); + const iconView = new IconView(); + const bind = this.bindTemplate; + iconView.set({ + content: poweredByIcon, + isColorInherited: false + }); + iconView.extendTemplate({ + attributes: { + style: { + width: ICON_WIDTH + 'px', + height: ICON_HEIGHT + 'px' + } + } + }); + this.setTemplate({ + tag: 'div', + attributes: { + class: ['ck', 'ck-powered-by'], + 'aria-hidden': true + }, + children: [ + { + tag: 'a', + attributes: { + href: 'https://ckeditor.com/?utm_source=ckeditor&' + + 'utm_medium=referral&utm_campaign=701Dn000000hVgmIAE_powered_by_ckeditor_logo', + target: '_blank', + tabindex: '-1' + }, + children: [ + ...label ? [ + { + tag: 'span', + attributes: { + class: ['ck', 'ck-powered-by__label'] + }, + children: [label] + } + ] : [], + iconView + ], + on: { + dragstart: bind.to(evt => evt.preventDefault()) + } + } + ] + }); + } +} +function getBalloonAttachOptions(editor, focusedEditableElement) { + const poweredByConfig = getNormalizedConfig(editor); + const positioningFunction = poweredByConfig.side === 'right' ? + getLowerRightCornerPosition(focusedEditableElement, poweredByConfig) : + getLowerLeftCornerPosition(focusedEditableElement, poweredByConfig); + return { + target: focusedEditableElement, + positions: [positioningFunction] + }; +} +function getLowerRightCornerPosition(focusedEditableElement, config) { + return getLowerCornerPosition(focusedEditableElement, config, (rootRect, balloonRect) => { + return rootRect.left + rootRect.width - balloonRect.width - config.horizontalOffset; + }); +} +function getLowerLeftCornerPosition(focusedEditableElement, config) { + return getLowerCornerPosition(focusedEditableElement, config, rootRect => rootRect.left + config.horizontalOffset); +} +function getLowerCornerPosition(focusedEditableElement, config, getBalloonLeft) { + return (visibleEditableElementRect, balloonRect) => { + const editableElementRect = new Rect(focusedEditableElement); + if (editableElementRect.width < NARROW_ROOT_WIDTH_THRESHOLD || editableElementRect.height < NARROW_ROOT_HEIGHT_THRESHOLD) { + return null; + } + let balloonTop; + if (config.position === 'inside') { + balloonTop = editableElementRect.bottom - balloonRect.height; + } + else { + balloonTop = editableElementRect.bottom - balloonRect.height / 2; + } + balloonTop -= config.verticalOffset; + const balloonLeft = getBalloonLeft(editableElementRect, balloonRect); + // Clone the editable element rect and place it where the balloon would be placed. + // This will allow getVisible() to work from editable element's perspective (rect source). + // and yield a result as if the balloon was on the same (scrollable) layer as the editable element. + const newBalloonPositionRect = visibleEditableElementRect + .clone() + .moveTo(balloonLeft, balloonTop) + .getIntersection(balloonRect.clone().moveTo(balloonLeft, balloonTop)); + const newBalloonPositionVisibleRect = newBalloonPositionRect.getVisible(); + if (!newBalloonPositionVisibleRect || newBalloonPositionVisibleRect.getArea() < balloonRect.getArea()) { + return null; + } + return { + top: balloonTop, + left: balloonLeft, + name: `position_${config.position}-side_${config.side}`, + config: { + withArrow: false + } + }; + }; +} +function getNormalizedConfig(editor) { + const userConfig = editor.config.get('ui.poweredBy'); + const position = userConfig && userConfig.position || 'border'; + return { + position, + label: DEFAULT_LABEL, + verticalOffset: position === 'inside' ? 5 : 0, + horizontalOffset: 5, + side: editor.locale.contentLanguageDirection === 'ltr' ? 'right' : 'left', + ...userConfig + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.d.ts new file mode 100644 index 0000000..e0d8b54 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.d.ts @@ -0,0 +1,245 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/focuscycler + */ +import { type ArrayOrItem, type FocusTracker, type KeystrokeHandler } from '@ckeditor/ckeditor5-utils'; +import type View from './view.js'; +import type ViewCollection from './viewcollection.js'; +declare const FocusCycler_base: { + new (): import("@ckeditor/ckeditor5-utils").Emitter; + prototype: import("@ckeditor/ckeditor5-utils").Emitter; +}; +/** + * A utility class that helps cycling over {@link module:ui/focuscycler~FocusableView focusable views} in a + * {@link module:ui/viewcollection~ViewCollection} when the focus is tracked by the + * {@link module:utils/focustracker~FocusTracker} instance. It helps implementing keyboard + * navigation in HTML forms, toolbars, lists and the like. + * + * To work properly it requires: + * * a collection of focusable (HTML `tabindex` attribute) views that implement the `focus()` method, + * * an associated focus tracker to determine which view is focused. + * + * A simple cycler setup can look like this: + * + * ```ts + * const focusables = new ViewCollection(); + * const focusTracker = new FocusTracker(); + * + * // Add focusable views to the focus tracker. + * focusTracker.add( ... ); + * ``` + * + * Then, the cycler can be used manually: + * + * ```ts + * const cycler = new FocusCycler( { focusables, focusTracker } ); + * + * // Will focus the first focusable view in #focusables. + * cycler.focusFirst(); + * + * // Will log the next focusable item in #focusables. + * console.log( cycler.next ); + * ``` + * + * Alternatively, it can work side by side with the {@link module:utils/keystrokehandler~KeystrokeHandler}: + * + * ```ts + * const keystrokeHandler = new KeystrokeHandler(); + * + * // Activate the keystroke handler. + * keystrokeHandler.listenTo( sourceOfEvents ); + * + * const cycler = new FocusCycler( { + * focusables, focusTracker, keystrokeHandler, + * actions: { + * // When arrowup of arrowleft is detected by the #keystrokeHandler, + * // focusPrevious() will be called on the cycler. + * focusPrevious: [ 'arrowup', 'arrowleft' ], + * } + * } ); + * ``` + * + * Check out the {@glink framework/deep-dive/ui/focus-tracking "Deep dive into focus tracking"} guide to learn more. + */ +export default class FocusCycler extends FocusCycler_base { + /** + * A {@link module:ui/focuscycler~FocusableView focusable views} collection that the cycler operates on. + */ + readonly focusables: ViewCollection; + /** + * A focus tracker instance that the cycler uses to determine the current focus + * state in {@link #focusables}. + */ + readonly focusTracker: FocusTracker; + /** + * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler} + * which can respond to certain keystrokes and cycle the focus. + */ + readonly keystrokeHandler?: KeystrokeHandler; + /** + * Actions that the cycler can take when a keystroke is pressed. Requires + * `options.keystrokeHandler` to be passed and working. When an action is + * performed, `preventDefault` and `stopPropagation` will be called on the event + * the keystroke fired in the DOM. + * + * ```ts + * actions: { + * // Will call #focusPrevious() when arrowleft or arrowup is pressed. + * focusPrevious: [ 'arrowleft', 'arrowup' ], + * + * // Will call #focusNext() when arrowdown is pressed. + * focusNext: 'arrowdown' + * } + * ``` + */ + readonly actions?: FocusCyclerActions; + /** + * Creates an instance of the focus cycler utility. + * + * @param options Configuration options. + */ + constructor(options: { + focusables: ViewCollection; + focusTracker: FocusTracker; + keystrokeHandler?: KeystrokeHandler; + actions?: FocusCyclerActions; + }); + /** + * Returns the first focusable view in {@link #focusables}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get first(): FocusableView | null; + /** + * Returns the last focusable view in {@link #focusables}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get last(): FocusableView | null; + /** + * Returns the next focusable view in {@link #focusables} based on {@link #current}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get next(): FocusableView | null; + /** + * Returns the previous focusable view in {@link #focusables} based on {@link #current}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get previous(): FocusableView | null; + /** + * An index of the view in the {@link #focusables} which is focused according + * to {@link #focusTracker}. Returns `null` when there is no such view. + */ + get current(): number | null; + /** + * Focuses the {@link #first} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusFirst(): void; + /** + * Focuses the {@link #last} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusLast(): void; + /** + * Focuses the {@link #next} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusNext(): void; + /** + * Focuses the {@link #previous} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusPrevious(): void; + /** + * Focuses the given view if it exists. + * + * @param view The view to be focused + * @param direction The direction of the focus if the view has focusable children. + * @returns + */ + private _focus; + /** + * Returns the next or previous focusable view in {@link #focusables} with respect + * to {@link #current}. + * + * @param step Either `1` for checking forward from {@link #current} or `-1` for checking backwards. + */ + private _getDomFocusableItem; +} +/** + * A {@link module:ui/view~View} that can be focused (e.g. has `focus()` method). + */ +export type FocusableView = View & { + /** + * Focuses the view. + * + * @param direction This optional parameter helps improve the UX by providing additional information about the direction the focus moved + * (e.g. in a complex view or a form). It is useful for views that host multiple focusable children (e.g. lists, toolbars): + * * `1` indicates that the focus moved forward and, in most cases, the first child of the focused view should get focused, + * * `-1` indicates that the focus moved backwards, and the last focusable child should get focused + * + * See {@link module:ui/focuscycler~FocusCycler#event:forwardCycle} and {@link module:ui/focuscycler~FocusCycler#event:backwardCycle} + * to learn more. + */ + focus(direction?: 1 | -1): void; +}; +/** + * A {@link module:ui/view~View} that hosts one or more of focusable children being managed by a {@link module:ui/focuscycler~FocusCycler} + * instance exposed under `focusCycler` property. + */ +export type ViewWithFocusCycler = FocusableView & { + focusCycler: FocusCycler; +}; +export interface FocusCyclerActions { + focusFirst?: ArrayOrItem; + focusLast?: ArrayOrItem; + focusNext?: ArrayOrItem; + focusPrevious?: ArrayOrItem; +} +/** + * Fired when the focus cycler is about to move the focus from the last focusable item + * to the first one. + * + * @eventName ~FocusCycler#forwardCycle + */ +export type FocusCyclerForwardCycleEvent = { + name: 'forwardCycle'; + args: []; +}; +/** + * Fired when the focus cycler is about to move the focus from the first focusable item + * to the last one. + * + * @eventName ~FocusCycler#backwardCycle + */ +export type FocusCyclerBackwardCycleEvent = { + name: 'backwardCycle'; + args: []; +}; +/** + * Checks whether a view is {@link ~FocusableView}. + * + * @param view A view to be checked. + */ +export declare function isFocusable(view: View): view is FocusableView; +/** + * Checks whether a view is an instance of {@link ~ViewWithFocusCycler}. + * + * @param view A view to be checked. + */ +export declare function isViewWithFocusCycler(view: View): view is ViewWithFocusCycler; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.js b/node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.js new file mode 100644 index 0000000..b4a6424 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/focuscycler.js @@ -0,0 +1,274 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/focuscycler + */ +import { isVisible, EmitterMixin } from '@ckeditor/ckeditor5-utils'; +/** + * A utility class that helps cycling over {@link module:ui/focuscycler~FocusableView focusable views} in a + * {@link module:ui/viewcollection~ViewCollection} when the focus is tracked by the + * {@link module:utils/focustracker~FocusTracker} instance. It helps implementing keyboard + * navigation in HTML forms, toolbars, lists and the like. + * + * To work properly it requires: + * * a collection of focusable (HTML `tabindex` attribute) views that implement the `focus()` method, + * * an associated focus tracker to determine which view is focused. + * + * A simple cycler setup can look like this: + * + * ```ts + * const focusables = new ViewCollection(); + * const focusTracker = new FocusTracker(); + * + * // Add focusable views to the focus tracker. + * focusTracker.add( ... ); + * ``` + * + * Then, the cycler can be used manually: + * + * ```ts + * const cycler = new FocusCycler( { focusables, focusTracker } ); + * + * // Will focus the first focusable view in #focusables. + * cycler.focusFirst(); + * + * // Will log the next focusable item in #focusables. + * console.log( cycler.next ); + * ``` + * + * Alternatively, it can work side by side with the {@link module:utils/keystrokehandler~KeystrokeHandler}: + * + * ```ts + * const keystrokeHandler = new KeystrokeHandler(); + * + * // Activate the keystroke handler. + * keystrokeHandler.listenTo( sourceOfEvents ); + * + * const cycler = new FocusCycler( { + * focusables, focusTracker, keystrokeHandler, + * actions: { + * // When arrowup of arrowleft is detected by the #keystrokeHandler, + * // focusPrevious() will be called on the cycler. + * focusPrevious: [ 'arrowup', 'arrowleft' ], + * } + * } ); + * ``` + * + * Check out the {@glink framework/deep-dive/ui/focus-tracking "Deep dive into focus tracking"} guide to learn more. + */ +export default class FocusCycler extends EmitterMixin() { + /** + * Creates an instance of the focus cycler utility. + * + * @param options Configuration options. + */ + constructor(options) { + super(); + this.focusables = options.focusables; + this.focusTracker = options.focusTracker; + this.keystrokeHandler = options.keystrokeHandler; + this.actions = options.actions; + if (options.actions && options.keystrokeHandler) { + for (const methodName in options.actions) { + let actions = options.actions[methodName]; + if (typeof actions == 'string') { + actions = [actions]; + } + for (const keystroke of actions) { + options.keystrokeHandler.set(keystroke, (data, cancel) => { + this[methodName](); + cancel(); + }); + } + } + } + this.on('forwardCycle', () => this.focusFirst(), { priority: 'low' }); + this.on('backwardCycle', () => this.focusLast(), { priority: 'low' }); + } + /** + * Returns the first focusable view in {@link #focusables}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get first() { + return (this.focusables.find(isDomFocusable) || null); + } + /** + * Returns the last focusable view in {@link #focusables}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get last() { + return (this.focusables.filter(isDomFocusable).slice(-1)[0] || null); + } + /** + * Returns the next focusable view in {@link #focusables} based on {@link #current}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get next() { + return this._getDomFocusableItem(1); + } + /** + * Returns the previous focusable view in {@link #focusables} based on {@link #current}. + * Returns `null` if there is none. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + get previous() { + return this._getDomFocusableItem(-1); + } + /** + * An index of the view in the {@link #focusables} which is focused according + * to {@link #focusTracker}. Returns `null` when there is no such view. + */ + get current() { + let index = null; + // There's no focused view in the focusables. + if (this.focusTracker.focusedElement === null) { + return null; + } + this.focusables.find((view, viewIndex) => { + const focused = view.element === this.focusTracker.focusedElement; + if (focused) { + index = viewIndex; + } + return focused; + }); + return index; + } + /** + * Focuses the {@link #first} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusFirst() { + this._focus(this.first, 1); + } + /** + * Focuses the {@link #last} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusLast() { + this._focus(this.last, -1); + } + /** + * Focuses the {@link #next} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusNext() { + const next = this.next; + // If there's only one focusable item, we need to let the outside world know + // that the next cycle is about to happen. This may be useful + // e.g. if you want to move the focus to the parent focus cycler. + // Note that the focus is not actually moved in this case. + if (next && this.focusables.getIndex(next) === this.current) { + this.fire('forwardCycle'); + return; + } + if (next === this.first) { + this.fire('forwardCycle'); + } + else { + this._focus(next, 1); + } + } + /** + * Focuses the {@link #previous} item in {@link #focusables}. + * + * **Note**: Hidden views (e.g. with `display: none`) are ignored. + */ + focusPrevious() { + const previous = this.previous; + if (previous && this.focusables.getIndex(previous) === this.current) { + this.fire('backwardCycle'); + return; + } + if (previous === this.last) { + this.fire('backwardCycle'); + } + else { + this._focus(previous, -1); + } + } + /** + * Focuses the given view if it exists. + * + * @param view The view to be focused + * @param direction The direction of the focus if the view has focusable children. + * @returns + */ + _focus(view, direction) { + // Don't fire focus events if the view is already focused. + // Such attempt may occur when cycling with only one focusable item: + // even though `focusNext()` method returns without changing focus, + // the `forwardCycle` event is fired, triggering the `focusFirst()` method. + if (view && this.focusTracker.focusedElement !== view.element) { + view.focus(direction); + } + } + /** + * Returns the next or previous focusable view in {@link #focusables} with respect + * to {@link #current}. + * + * @param step Either `1` for checking forward from {@link #current} or `-1` for checking backwards. + */ + _getDomFocusableItem(step) { + // Cache for speed. + const collectionLength = this.focusables.length; + if (!collectionLength) { + return null; + } + const current = this.current; + // Start from the beginning if no view is focused. + // https://github.com/ckeditor/ckeditor5-ui/issues/206 + if (current === null) { + return this[step === 1 ? 'first' : 'last']; + } + // Note: If current is the only focusable view, it will also be returned for the given step. + let focusableItem = this.focusables.get(current); + // Cycle in both directions. + let index = (current + collectionLength + step) % collectionLength; + do { + const focusableItemCandidate = this.focusables.get(index); + if (isDomFocusable(focusableItemCandidate)) { + focusableItem = focusableItemCandidate; + break; + } + // Cycle in both directions. + index = (index + collectionLength + step) % collectionLength; + } while (index !== current); + return focusableItem; + } +} +/** + * Checks whether a view can be focused (has `focus()` method and is visible). + * + * @param view A view to be checked. + */ +function isDomFocusable(view) { + return isFocusable(view) && isVisible(view.element); +} +/** + * Checks whether a view is {@link ~FocusableView}. + * + * @param view A view to be checked. + */ +export function isFocusable(view) { + return !!('focus' in view && typeof view.focus == 'function'); +} +/** + * Checks whether a view is an instance of {@link ~ViewWithFocusCycler}. + * + * @param view A view to be checked. + */ +export function isViewWithFocusCycler(view) { + return isFocusable(view) && 'focusCycler' in view && view.focusCycler instanceof FocusCycler; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.d.ts new file mode 100644 index 0000000..448b744 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.d.ts @@ -0,0 +1,59 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/formheader/formheaderview + */ +import View from '../view.js'; +import type ViewCollection from '../viewcollection.js'; +import IconView from '../icon/iconview.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +import '../../theme/components/formheader/formheader.css'; +/** + * The class component representing a form header view. It should be used in more advanced forms to + * describe the main purpose of the form. + * + * By default the component contains a bolded label view that has to be set. The label is usually a short (at most 3-word) string. + * The component can also be extended by any other elements, like: icons, dropdowns, etc. + * + * It is used i.a. + * by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView} + * and {@link module:special-characters/ui/specialcharactersnavigationview~SpecialCharactersNavigationView}. + * + * The latter is an example, where the component has been extended by {@link module:ui/dropdown/dropdownview~DropdownView} view. + */ +export default class FormHeaderView extends View { + /** + * A collection of header items. + */ + readonly children: ViewCollection; + /** + * The label of the header. + * + * @observable + */ + label: string; + /** + * An additional CSS class added to the {@link #element}. + * + * @observable + */ + class: string | null; + /** + * The icon view instance. Defined only if icon was passed in the constructor's options. + */ + readonly iconView?: IconView; + /** + * Creates an instance of the form header class. + * + * @param locale The locale instance. + * @param options.label A label. + * @param options.class An additional class. + */ + constructor(locale: Locale | undefined, options?: { + label?: string | null; + class?: string | null; + icon?: string | null; + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.js b/node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.js new file mode 100644 index 0000000..ce15b84 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/formheader/formheaderview.js @@ -0,0 +1,70 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/formheader/formheaderview + */ +import View from '../view.js'; +import IconView from '../icon/iconview.js'; +import '../../theme/components/formheader/formheader.css'; +/** + * The class component representing a form header view. It should be used in more advanced forms to + * describe the main purpose of the form. + * + * By default the component contains a bolded label view that has to be set. The label is usually a short (at most 3-word) string. + * The component can also be extended by any other elements, like: icons, dropdowns, etc. + * + * It is used i.a. + * by {@link module:table/tablecellproperties/ui/tablecellpropertiesview~TableCellPropertiesView} + * and {@link module:special-characters/ui/specialcharactersnavigationview~SpecialCharactersNavigationView}. + * + * The latter is an example, where the component has been extended by {@link module:ui/dropdown/dropdownview~DropdownView} view. + */ +export default class FormHeaderView extends View { + /** + * Creates an instance of the form header class. + * + * @param locale The locale instance. + * @param options.label A label. + * @param options.class An additional class. + */ + constructor(locale, options = {}) { + super(locale); + const bind = this.bindTemplate; + this.set('label', options.label || ''); + this.set('class', options.class || null); + this.children = this.createCollection(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-form__header', + bind.to('class') + ] + }, + children: this.children + }); + if (options.icon) { + this.iconView = new IconView(); + this.iconView.content = options.icon; + this.children.add(this.iconView); + } + const label = new View(locale); + label.setTemplate({ + tag: 'h2', + attributes: { + class: [ + 'ck', + 'ck-form__header__label' + ], + role: 'presentation' + }, + children: [ + { text: bind.to('label') } + ] + }); + this.children.add(label); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.d.ts new file mode 100644 index 0000000..38b3912 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.d.ts @@ -0,0 +1,38 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/highlightedtext/highlightedtextview + */ +import View from '../view.js'; +import '../../theme/components/highlightedtext/highlightedtext.css'; +/** + * A class representing a view that displays a text which subset can be highlighted using the + * {@link #highlightText} method. + */ +export default class HighlightedTextView extends View { + /** + * The text that can be highlighted using the {@link #highlightText} method. + * + * **Note:** When this property changes, the previous highlighting is removed. + * + * @observable + */ + text: string | undefined; + /** + * @inheritDoc + */ + constructor(); + /** + * Highlights view's {@link #text} according to the specified `RegExp`. If the passed RegExp is `null`, the + * highlighting is removed + * + * @param regExp + */ + highlightText(regExp: RegExp | null): void; + /** + * Updates element's `innerHTML` with the passed content. + */ + private _updateInnerHTML; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.js b/node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.js new file mode 100644 index 0000000..c7785f8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/highlightedtext/highlightedtextview.js @@ -0,0 +1,102 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/highlightedtext/highlightedtextview + */ +import View from '../view.js'; +import { escape } from 'lodash-es'; +import '../../theme/components/highlightedtext/highlightedtext.css'; +/** + * A class representing a view that displays a text which subset can be highlighted using the + * {@link #highlightText} method. + */ +export default class HighlightedTextView extends View { + /** + * @inheritDoc + */ + constructor() { + super(); + this.set('text', undefined); + this.setTemplate({ + tag: 'span', + attributes: { + class: ['ck', 'ck-highlighted-text'] + } + }); + this.on('render', () => { + // Classic setTemplate binding for #text will not work because highlightText() replaces the + // pre-rendered DOM text node new a new one (and elements). + this.on('change:text', () => { + this._updateInnerHTML(this.text); + }); + this._updateInnerHTML(this.text); + }); + } + /** + * Highlights view's {@link #text} according to the specified `RegExp`. If the passed RegExp is `null`, the + * highlighting is removed + * + * @param regExp + */ + highlightText(regExp) { + this._updateInnerHTML(markText(this.text || '', regExp)); + } + /** + * Updates element's `innerHTML` with the passed content. + */ + _updateInnerHTML(newInnerHTML) { + this.element.innerHTML = newInnerHTML || ''; + } +} +/** + * Replaces `regExp` occurrences with `` tags in a text. + * + * @param text A text to get marked. + * @param regExp An optional `RegExp`. If not passed, this is a pass-through function. + * @returns A text with `RegExp` occurrences marked by ``. + */ +function markText(text, regExp) { + if (!regExp) { + return escape(text); + } + const textParts = []; + let lastMatchEnd = 0; + let matchInfo = regExp.exec(text); + // Iterate over all matches and create an array of text parts. The idea is to mark which parts are query matches + // so that later on they can be highlighted. + while (matchInfo !== null) { + const curMatchStart = matchInfo.index; + // Detect if there was something between last match and this one. + if (curMatchStart !== lastMatchEnd) { + textParts.push({ + text: text.substring(lastMatchEnd, curMatchStart), + isMatch: false + }); + } + textParts.push({ + text: matchInfo[0], + isMatch: true + }); + lastMatchEnd = regExp.lastIndex; + matchInfo = regExp.exec(text); + } + // Your match might not be the last part of a string. Be sure to add any plain text following the last match. + if (lastMatchEnd !== text.length) { + textParts.push({ + text: text.substring(lastMatchEnd), + isMatch: false + }); + } + const outputHtml = textParts + // The entire text should be escaped. + .map(part => { + part.text = escape(part.text); + return part; + }) + // Only matched text should be wrapped with HTML mark element. + .map(part => part.isMatch ? `${part.text}` : part.text) + .join(''); + return outputHtml; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.d.ts new file mode 100644 index 0000000..73ba13d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.d.ts @@ -0,0 +1,88 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/icon/iconview + */ +import View from '../view.js'; +import '../../theme/components/icon/icon.css'; +/** + * The icon view class. + */ +export default class IconView extends View { + /** + * The SVG source of the icon. + * + * The user must provide the entire XML string, not just the path. See the + * {@glink framework/architecture/ui-library#setting-label-icon-and-tooltip UI library} guide for details. + * + * @observable + */ + content: string | undefined; + /** + * This attribute specifies the boundaries to which the + * icon content should stretch. + * + * @observable + * @default '0 0 20 20' + */ + viewBox: string; + /** + * The fill color of the child `path.ck-icon__fill`. + * + * @observable + * @default '' + */ + fillColor: string; + /** + * When set true (default), all parts of the icon inherit the fill color from the CSS `color` property of the + * icon's DOM parent. + * + * This effectively makes the icon monochromatic and allows it to change its fill color dynamically, for instance, + * when a {@link module:ui/button/buttonview~ButtonView} displays an icon and it switches between different states + * (pushed, hovered, etc.) the icon will follow along. + * + * **Note**: For the monochromatic icon to render properly, it must be made up of shapes that can be filled + * with color instead of, for instance, paths with strokes. Be sure to use the *outline stroke* tool + * (the name could be different in your vector graphics editor) before exporting your icon. Also, remove any + * excess `fill="..."` attributes that could break the color inheritance. + * + * **Note**: If you want to preserve the original look of your icon and disable dynamic color inheritance, + * set this flag to `false`. + * + * @observable + * @default true + */ + isColorInherited: boolean; + /** + * Controls whether the icon is visible. + * + * @observable + * @default true + */ + isVisible: boolean; + /** + * A list of presentational attributes that can be set on the `` element and should be preserved + * when the icon {@link module:ui/icon/iconview~IconView#content content} is loaded. + * + * See the [specification](https://www.w3.org/TR/SVG/styling.html#TermPresentationAttribute) to learn more. + */ + private static presentationalAttributeNames; + /** + * @inheritDoc + */ + constructor(); + /** + * @inheritDoc + */ + render(): void; + /** + * Updates the {@link #element} with the value of {@link #content}. + */ + private _updateXMLContent; + /** + * Fills all child `path.ck-icon__fill` with the `#fillColor`. + */ + private _colorFillPaths; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.js b/node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.js new file mode 100644 index 0000000..dd6d2ed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/icon/iconview.js @@ -0,0 +1,115 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* global DOMParser */ +/** + * @module ui/icon/iconview + */ +import View from '../view.js'; +import '../../theme/components/icon/icon.css'; +/** + * The icon view class. + */ +class IconView extends View { + /** + * @inheritDoc + */ + constructor() { + super(); + const bind = this.bindTemplate; + this.set('content', ''); + this.set('viewBox', '0 0 20 20'); + this.set('fillColor', ''); + this.set('isColorInherited', true); + this.set('isVisible', true); + this.setTemplate({ + tag: 'svg', + ns: 'http://www.w3.org/2000/svg', + attributes: { + class: [ + 'ck', + 'ck-icon', + bind.if('isVisible', 'ck-hidden', value => !value), + // Exclude icon internals from the CSS reset to allow rich (non-monochromatic) icons + // (https://github.com/ckeditor/ckeditor5/issues/12599). + 'ck-reset_all-excluded', + // The class to remove the dynamic color inheritance is toggleable + // (https://github.com/ckeditor/ckeditor5/issues/12599). + bind.if('isColorInherited', 'ck-icon_inherit-color') + ], + viewBox: bind.to('viewBox') + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this._updateXMLContent(); + this._colorFillPaths(); + // This is a hack for lack of innerHTML binding. + // See: https://github.com/ckeditor/ckeditor5-ui/issues/99. + this.on('change:content', () => { + this._updateXMLContent(); + this._colorFillPaths(); + }); + this.on('change:fillColor', () => { + this._colorFillPaths(); + }); + } + /** + * Updates the {@link #element} with the value of {@link #content}. + */ + _updateXMLContent() { + if (this.content) { + const parsed = new DOMParser().parseFromString(this.content.trim(), 'image/svg+xml'); + const svg = parsed.querySelector('svg'); + const viewBox = svg.getAttribute('viewBox'); + if (viewBox) { + this.viewBox = viewBox; + } + // Preserve presentational attributes of the element from the source. + // They can affect rendering of the entire icon (https://github.com/ckeditor/ckeditor5/issues/12597). + for (const { name, value } of Array.from(svg.attributes)) { + if (IconView.presentationalAttributeNames.includes(name)) { + this.element.setAttribute(name, value); + } + } + while (this.element.firstChild) { + this.element.removeChild(this.element.firstChild); + } + while (svg.childNodes.length > 0) { + this.element.appendChild(svg.childNodes[0]); + } + } + } + /** + * Fills all child `path.ck-icon__fill` with the `#fillColor`. + */ + _colorFillPaths() { + if (this.fillColor) { + this.element.querySelectorAll('.ck-icon__fill').forEach(path => { + path.style.fill = this.fillColor; + }); + } + } +} +/** + * A list of presentational attributes that can be set on the `` element and should be preserved + * when the icon {@link module:ui/icon/iconview~IconView#content content} is loaded. + * + * See the [specification](https://www.w3.org/TR/SVG/styling.html#TermPresentationAttribute) to learn more. + */ +IconView.presentationalAttributeNames = [ + 'alignment-baseline', 'baseline-shift', 'clip-path', 'clip-rule', 'color', 'color-interpolation', + 'color-interpolation-filters', 'color-rendering', 'cursor', 'direction', 'display', 'dominant-baseline', 'fill', 'fill-opacity', + 'fill-rule', 'filter', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', + 'font-variant', 'font-weight', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', + 'mask', 'opacity', 'overflow', 'paint-order', 'pointer-events', 'shape-rendering', 'stop-color', 'stop-opacity', 'stroke', + 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', + 'text-anchor', 'text-decoration', 'text-overflow', 'text-rendering', 'transform', 'unicode-bidi', 'vector-effect', + 'visibility', 'white-space', 'word-spacing', 'writing-mode' +]; +export default IconView; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.d.ts new file mode 100644 index 0000000..11ee6e4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.d.ts @@ -0,0 +1,50 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/iframe/iframeview + */ +import View from '../view.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The iframe view class. + * + * ```ts + * const iframe = new IframeView(); + * + * iframe.render(); + * document.body.appendChild( iframe.element ); + * + * iframe.on( 'loaded', () => { + * console.log( 'The iframe has loaded', iframe.element.contentWindow ); + * } ); + * + * iframe.element.src = 'https://ckeditor.com'; + * ``` + */ +export default class IframeView extends View { + /** + * Creates a new instance of the iframe view. + * + * @param locale The locale instance. + */ + constructor(locale?: Locale); + /** + * Renders the iframe's {@link #element} and returns a `Promise` for asynchronous + * child `contentDocument` loading process. + * + * @returns A promise which resolves once the iframe `contentDocument` has + * been {@link #event:loaded}. + */ + render(): Promise; +} +/** + * Fired when the DOM iframe's `contentDocument` finished loading. + * + * @eventName ~IframeView#loaded + */ +export type IframeViewLoadedEvent = { + name: 'loaded'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.js b/node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.js new file mode 100644 index 0000000..b1ceb7f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/iframe/iframeview.js @@ -0,0 +1,63 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/iframe/iframeview + */ +import View from '../view.js'; +/** + * The iframe view class. + * + * ```ts + * const iframe = new IframeView(); + * + * iframe.render(); + * document.body.appendChild( iframe.element ); + * + * iframe.on( 'loaded', () => { + * console.log( 'The iframe has loaded', iframe.element.contentWindow ); + * } ); + * + * iframe.element.src = 'https://ckeditor.com'; + * ``` + */ +export default class IframeView extends View { + /** + * Creates a new instance of the iframe view. + * + * @param locale The locale instance. + */ + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + this.setTemplate({ + tag: 'iframe', + attributes: { + class: [ + 'ck', + 'ck-reset_all' + ], + // It seems that we need to allow scripts in order to be able to listen to events. + // TODO: Research that. Perhaps the src must be set? + sandbox: 'allow-same-origin allow-scripts' + }, + on: { + load: bind.to('loaded') + } + }); + } + /** + * Renders the iframe's {@link #element} and returns a `Promise` for asynchronous + * child `contentDocument` loading process. + * + * @returns A promise which resolves once the iframe `contentDocument` has + * been {@link #event:loaded}. + */ + render() { + return new Promise(resolve => { + this.on('loaded', resolve); + return super.render(); + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/index.d.ts new file mode 100644 index 0000000..6e2989f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/index.d.ts @@ -0,0 +1,83 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui + */ +export { default as clickOutsideHandler } from './bindings/clickoutsidehandler.js'; +export { default as injectCssTransitionDisabler } from './bindings/injectcsstransitiondisabler.js'; +export { default as CssTransitionDisablerMixin, type ViewWithCssTransitionDisabler } from './bindings/csstransitiondisablermixin.js'; +export { default as submitHandler } from './bindings/submithandler.js'; +export { default as addKeyboardHandlingForGrid } from './bindings/addkeyboardhandlingforgrid.js'; +export { default as AccessibilityHelp } from './editorui/accessibilityhelp/accessibilityhelp.js'; +export { default as BodyCollection } from './editorui/bodycollection.js'; +export { default as Button, type ButtonExecuteEvent } from './button/button.js'; +export type { default as ButtonLabel } from './button/buttonlabel.js'; +export { default as ButtonView } from './button/buttonview.js'; +export { default as ButtonLabelView } from './button/buttonlabelview.js'; +export { default as SwitchButtonView } from './button/switchbuttonview.js'; +export { default as FileDialogButtonView } from './button/filedialogbuttonview.js'; +export { default as CollapsibleView } from './collapsible/collapsibleview.js'; +export * from './colorgrid/utils.js'; +export { default as ColorGridView, type ColorDefinition } from './colorgrid/colorgridview.js'; +export { default as ColorTileView } from './colorgrid/colortileview.js'; +export { default as ColorPickerView } from './colorpicker/colorpickerview.js'; +export type { ColorPickerConfig, ColorPickerViewConfig, ColorPickerOutputFormat } from './colorpicker/utils.js'; +export { default as ColorSelectorView, type ColorSelectorExecuteEvent, type ColorSelectorColorPickerCancelEvent, type ColorSelectorColorPickerShowEvent } from './colorselector/colorselectorview.js'; +export { default as ComponentFactory } from './componentfactory.js'; +export { default as Dialog } from './dialog/dialog.js'; +export { default as DialogView, DialogViewPosition, type DialogViewMoveToEvent } from './dialog/dialogview.js'; +export { default as DropdownView } from './dropdown/dropdownview.js'; +export { default as DropdownPanelView } from './dropdown/dropdownpanelview.js'; +export { default as DropdownButtonView } from './dropdown/button/dropdownbuttonview.js'; +export { default as SplitButtonView } from './dropdown/button/splitbuttonview.js'; +export * from './dropdown/utils.js'; +export { default as EditorUI, type EditorUIReadyEvent, type EditorUIUpdateEvent } from './editorui/editorui.js'; +export { default as EditorUIView } from './editorui/editoruiview.js'; +export { default as BoxedEditorUIView } from './editorui/boxed/boxededitoruiview.js'; +export { default as InlineEditableUIView } from './editableui/inline/inlineeditableuiview.js'; +export { default as FormHeaderView } from './formheader/formheaderview.js'; +export { default as FocusCycler, type FocusableView, type ViewWithFocusCycler, type FocusCyclerForwardCycleEvent, type FocusCyclerBackwardCycleEvent, isViewWithFocusCycler, isFocusable } from './focuscycler.js'; +export { default as IconView } from './icon/iconview.js'; +export { default as InputView } from './input/inputview.js'; +export { default as InputTextView } from './inputtext/inputtextview.js'; +export { default as InputNumberView } from './inputnumber/inputnumberview.js'; +export { default as TextareaView, type TextareaViewUpdateEvent } from './textarea/textareaview.js'; +export { default as IframeView } from './iframe/iframeview.js'; +export { default as LabelView } from './label/labelview.js'; +export { type LabeledFieldViewCreator, default as LabeledFieldView } from './labeledfield/labeledfieldview.js'; +export * from './labeledfield/utils.js'; +export { default as ListItemGroupView } from './list/listitemgroupview.js'; +export { default as ListItemView } from './list/listitemview.js'; +export { default as ListSeparatorView } from './list/listseparatorview.js'; +export { default as ListView } from './list/listview.js'; +export { default as Notification } from './notification/notification.js'; +export { default as ViewModel } from './model.js'; +export { default as BalloonPanelView } from './panel/balloon/balloonpanelview.js'; +export { default as ContextualBalloon } from './panel/balloon/contextualballoon.js'; +export { default as StickyPanelView } from './panel/sticky/stickypanelview.js'; +export { default as AutocompleteView, type AutocompleteViewConfig, type AutocompleteResultsView } from './autocomplete/autocompleteview.js'; +export { default as SearchTextView, type SearchTextViewSearchEvent, type SearchTextViewConfig } from './search/text/searchtextview.js'; +export { default as SearchInfoView } from './search/searchinfoview.js'; +export { default as FilteredView, type FilteredViewExecuteEvent } from './search/filteredview.js'; +export { default as HighlightedTextView } from './highlightedtext/highlightedtextview.js'; +export { default as TooltipManager } from './tooltipmanager.js'; +export { default as Template, type TemplateDefinition } from './template.js'; +export { default as SpinnerView } from './spinner/spinnerview.js'; +export { default as ToolbarView } from './toolbar/toolbarview.js'; +export { default as ToolbarLineBreakView } from './toolbar/toolbarlinebreakview.js'; +export { default as ToolbarSeparatorView } from './toolbar/toolbarseparatorview.js'; +export { default as normalizeToolbarConfig } from './toolbar/normalizetoolbarconfig.js'; +export { default as BalloonToolbar, type BalloonToolbarShowEvent } from './toolbar/balloon/balloontoolbar.js'; +export { default as BlockToolbar } from './toolbar/block/blocktoolbar.js'; +export { default as View, type UIViewRenderEvent } from './view.js'; +export { default as ViewCollection } from './viewcollection.js'; +export { default as MenuBarView, type MenuBarConfig } from './menubar/menubarview.js'; +export { default as MenuBarMenuView } from './menubar/menubarmenuview.js'; +export { default as MenuBarMenuListView } from './menubar/menubarmenulistview.js'; +export { default as MenuBarMenuListItemView } from './menubar/menubarmenulistitemview.js'; +export { default as MenuBarMenuListItemButtonView } from './menubar/menubarmenulistitembuttonview.js'; +export { default as MenuBarMenuListItemFileDialogButtonView } from './menubar/menubarmenulistitemfiledialogbuttonview.js'; +export { normalizeMenuBarConfig, DefaultMenuBarItems } from './menubar/utils.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/index.js b/node_modules/@ckeditor/ckeditor5-ui/src/index.js new file mode 100644 index 0000000..601624d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/index.js @@ -0,0 +1,79 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui + */ +export { default as clickOutsideHandler } from './bindings/clickoutsidehandler.js'; +export { default as injectCssTransitionDisabler } from './bindings/injectcsstransitiondisabler.js'; +export { default as CssTransitionDisablerMixin } from './bindings/csstransitiondisablermixin.js'; +export { default as submitHandler } from './bindings/submithandler.js'; +export { default as addKeyboardHandlingForGrid } from './bindings/addkeyboardhandlingforgrid.js'; +export { default as AccessibilityHelp } from './editorui/accessibilityhelp/accessibilityhelp.js'; +export { default as BodyCollection } from './editorui/bodycollection.js'; +export { default as ButtonView } from './button/buttonview.js'; +export { default as ButtonLabelView } from './button/buttonlabelview.js'; +export { default as SwitchButtonView } from './button/switchbuttonview.js'; +export { default as FileDialogButtonView } from './button/filedialogbuttonview.js'; +export { default as CollapsibleView } from './collapsible/collapsibleview.js'; +export * from './colorgrid/utils.js'; +export { default as ColorGridView } from './colorgrid/colorgridview.js'; +export { default as ColorTileView } from './colorgrid/colortileview.js'; +export { default as ColorPickerView } from './colorpicker/colorpickerview.js'; +export { default as ColorSelectorView } from './colorselector/colorselectorview.js'; +export { default as ComponentFactory } from './componentfactory.js'; +export { default as Dialog } from './dialog/dialog.js'; +export { default as DialogView, DialogViewPosition } from './dialog/dialogview.js'; +export { default as DropdownView } from './dropdown/dropdownview.js'; +export { default as DropdownPanelView } from './dropdown/dropdownpanelview.js'; +export { default as DropdownButtonView } from './dropdown/button/dropdownbuttonview.js'; +export { default as SplitButtonView } from './dropdown/button/splitbuttonview.js'; +export * from './dropdown/utils.js'; +export { default as EditorUI } from './editorui/editorui.js'; +export { default as EditorUIView } from './editorui/editoruiview.js'; +export { default as BoxedEditorUIView } from './editorui/boxed/boxededitoruiview.js'; +export { default as InlineEditableUIView } from './editableui/inline/inlineeditableuiview.js'; +export { default as FormHeaderView } from './formheader/formheaderview.js'; +export { default as FocusCycler, isViewWithFocusCycler, isFocusable } from './focuscycler.js'; +export { default as IconView } from './icon/iconview.js'; +export { default as InputView } from './input/inputview.js'; +export { default as InputTextView } from './inputtext/inputtextview.js'; +export { default as InputNumberView } from './inputnumber/inputnumberview.js'; +export { default as TextareaView } from './textarea/textareaview.js'; +export { default as IframeView } from './iframe/iframeview.js'; +export { default as LabelView } from './label/labelview.js'; +export { default as LabeledFieldView } from './labeledfield/labeledfieldview.js'; +export * from './labeledfield/utils.js'; +export { default as ListItemGroupView } from './list/listitemgroupview.js'; +export { default as ListItemView } from './list/listitemview.js'; +export { default as ListSeparatorView } from './list/listseparatorview.js'; +export { default as ListView } from './list/listview.js'; +export { default as Notification } from './notification/notification.js'; +export { default as ViewModel } from './model.js'; +export { default as BalloonPanelView } from './panel/balloon/balloonpanelview.js'; +export { default as ContextualBalloon } from './panel/balloon/contextualballoon.js'; +export { default as StickyPanelView } from './panel/sticky/stickypanelview.js'; +export { default as AutocompleteView } from './autocomplete/autocompleteview.js'; +export { default as SearchTextView } from './search/text/searchtextview.js'; +export { default as SearchInfoView } from './search/searchinfoview.js'; +export { default as HighlightedTextView } from './highlightedtext/highlightedtextview.js'; +export { default as TooltipManager } from './tooltipmanager.js'; +export { default as Template } from './template.js'; +export { default as SpinnerView } from './spinner/spinnerview.js'; +export { default as ToolbarView } from './toolbar/toolbarview.js'; +export { default as ToolbarLineBreakView } from './toolbar/toolbarlinebreakview.js'; +export { default as ToolbarSeparatorView } from './toolbar/toolbarseparatorview.js'; +export { default as normalizeToolbarConfig } from './toolbar/normalizetoolbarconfig.js'; +export { default as BalloonToolbar } from './toolbar/balloon/balloontoolbar.js'; +export { default as BlockToolbar } from './toolbar/block/blocktoolbar.js'; +export { default as View } from './view.js'; +export { default as ViewCollection } from './viewcollection.js'; +export { default as MenuBarView } from './menubar/menubarview.js'; +export { default as MenuBarMenuView } from './menubar/menubarmenuview.js'; +export { default as MenuBarMenuListView } from './menubar/menubarmenulistview.js'; +export { default as MenuBarMenuListItemView } from './menubar/menubarmenulistitemview.js'; +export { default as MenuBarMenuListItemButtonView } from './menubar/menubarmenulistitembuttonview.js'; +export { default as MenuBarMenuListItemFileDialogButtonView } from './menubar/menubarmenulistitemfiledialogbuttonview.js'; +export { normalizeMenuBarConfig, DefaultMenuBarItems } from './menubar/utils.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/input/inputbase.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/input/inputbase.d.ts new file mode 100644 index 0000000..1bfaca1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/input/inputbase.d.ts @@ -0,0 +1,119 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/input/inputbase + */ +import View from '../view.js'; +import { FocusTracker, type Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The base input view class. + */ +export default abstract class InputBase extends View { + /** + * Stores information about the editor UI focus and propagates it so various plugins and components + * are unified as a focus group. + */ + readonly focusTracker: FocusTracker; + /** + * The value of the input. + * + * @observable + */ + value: string | undefined; + /** + * The `id` attribute of the input (i.e. to pair with a `

    A paragraph.

    + * ``` + * + * Additionally, the `observable` will always fire `clicked` upon clicking `

    ` in the DOM. + * + * See {@link module:ui/template~TemplateDefinition} to know more about templates and complex + * template definitions. + */ +export default class Template extends Template_base { + ns?: string; + /** + * The tag (`tagName`) of this template, e.g. `div`. It also indicates that the template + * renders to an HTML element. + */ + tag?: string; + /** + * The text of the template. It also indicates that the template renders to a DOM text node. + */ + text?: Array; + /** + * The attributes of the template, e.g. `{ id: [ 'ck-id' ] }`, corresponding with + * the attributes of an HTML element. + * + * **Note**: This property only makes sense when {@link #tag} is defined. + */ + attributes?: Record; + /** + * The children of the template. They can be either: + * * independent instances of {@link ~Template} (sub–templates), + * * native DOM Nodes. + * + * **Note**: This property only makes sense when {@link #tag} is defined. + */ + children?: Array; + /** + * The DOM event listeners of the template. + */ + eventListeners?: Record>; + /** + * Indicates whether this particular Template instance has been + * {@link #render rendered}. + */ + private _isRendered; + /** + * The data used by the {@link #revert} method to restore a node to its original state. + * + * See: {@link #apply}. + */ + private _revertData; + /** + * Creates an instance of the {@link ~Template} class. + * + * @param def The definition of the template. + */ + constructor(def: TemplateDefinition); + /** + * Renders a DOM Node (an HTML element or text) out of the template. + * + * ```ts + * const domNode = new Template( { ... } ).render(); + * ``` + * + * See: {@link #apply}. + */ + render(): HTMLElement | Text; + /** + * Applies the template to an existing DOM Node, either HTML element or text. + * + * **Note:** No new DOM nodes will be created. Applying extends: + * + * {@link module:ui/template~TemplateDefinition attributes}, + * {@link module:ui/template~TemplateDefinition event listeners}, and + * `textContent` of {@link module:ui/template~TemplateDefinition children} only. + * + * **Note:** Existing `class` and `style` attributes are extended when a template + * is applied to an HTML element, while other attributes and `textContent` are overridden. + * + * **Note:** The process of applying a template can be easily reverted using the + * {@link module:ui/template~Template#revert} method. + * + * ```ts + * const element = document.createElement( 'div' ); + * const observable = new Model( { divClass: 'my-div' } ); + * const emitter = Object.create( EmitterMixin ); + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * attributes: { + * id: 'first-div', + * class: bind.to( 'divClass' ) + * }, + * on: { + * click: bind( 'elementClicked' ) // Will be fired by the observable. + * }, + * children: [ + * 'Div text.' + * ] + * } ).apply( element ); + * + * console.log( element.outerHTML ); // -> '

    ' + * ``` + * + * @see module:ui/template~Template#render + * @see module:ui/template~Template#revert + * @param node Root node for the template to apply. + */ + apply(node: HTMLElement | Text): HTMLElement | Text; + /** + * Reverts a template {@link module:ui/template~Template#apply applied} to a DOM node. + * + * @param node The root node for the template to revert. In most of the cases, it is the + * same node used by {@link module:ui/template~Template#apply}. + */ + revert(node: HTMLElement | Text): void; + /** + * Returns an iterator which traverses the template in search of {@link module:ui/view~View} + * instances and returns them one by one. + * + * ```ts + * const viewFoo = new View(); + * const viewBar = new View(); + * const viewBaz = new View(); + * const template = new Template( { + * tag: 'div', + * children: [ + * viewFoo, + * { + * tag: 'div', + * children: [ + * viewBar + * ] + * }, + * viewBaz + * ] + * } ); + * + * // Logs: viewFoo, viewBar, viewBaz + * for ( const view of template.getViews() ) { + * console.log( view ); + * } + * ``` + */ + getViews(): IterableIterator; + /** + * An entry point to the interface which binds DOM nodes to + * {@link module:utils/observablemixin~Observable observables}. + * There are two types of bindings: + * + * * HTML element attributes or text `textContent` synchronized with attributes of an + * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to} + * and {@link module:ui/template~BindChain#if}. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * attributes: { + * // Binds the element "class" attribute to observable#classAttribute. + * class: bind.to( 'classAttribute' ) + * } + * } ).render(); + * ``` + * + * * DOM events fired on HTML element propagated through + * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to}. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * on: { + * // Will be fired by the observable. + * click: bind( 'elementClicked' ) + * } + * } ).render(); + * ``` + * + * Also see {@link module:ui/view~View#bindTemplate}. + * + * @param observable An observable which provides boundable attributes. + * @param emitter An emitter that listens to observable attribute + * changes or DOM Events (depending on the kind of the binding). Usually, a {@link module:ui/view~View} instance. + */ + static bind(observable: TObservable, emitter: Emitter): BindChain; + /** + * Extends an existing {@link module:ui/template~Template} instance with some additional content + * from another {@link module:ui/template~TemplateDefinition}. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * const template = new Template( { + * tag: 'p', + * attributes: { + * class: 'a', + * data-x: bind.to( 'foo' ) + * }, + * children: [ + * { + * tag: 'span', + * attributes: { + * class: 'b' + * }, + * children: [ + * 'Span' + * ] + * } + * ] + * } ); + * + * // Instance-level extension. + * Template.extend( template, { + * attributes: { + * class: 'b', + * data-x: bind.to( 'bar' ) + * }, + * children: [ + * { + * attributes: { + * class: 'c' + * } + * } + * ] + * } ); + * + * // Child extension. + * Template.extend( template.children[ 0 ], { + * attributes: { + * class: 'd' + * } + * } ); + * ``` + * + * the `outerHTML` of `template.render()` is: + * + * ```html + *

    + * Span + *

    + * ``` + * + * @param template An existing template instance to be extended. + * @param def Additional definition to be applied to a template. + */ + static extend(template: Template, def: Partial): void; + /** + * Renders a DOM Node (either an HTML element or text) out of the template. + * + * @param data Rendering data. + */ + private _renderNode; + /** + * Renders an HTML element out of the template. + * + * @param data Rendering data. + */ + private _renderElement; + /** + * Renders a text node out of {@link module:ui/template~Template#text}. + * + * @param data Rendering data. + */ + private _renderText; + /** + * Renders HTML element attributes out of {@link module:ui/template~Template#attributes}. + * + * @param data Rendering data. + */ + private _renderAttributes; + /** + * Renders the `style` attribute of an HTML element based on + * {@link module:ui/template~Template#attributes}. + * + * A style attribute is an object with static values: + * + * ```ts + * attributes: { + * style: { + * color: 'red' + * } + * } + * ``` + * + * or values bound to {@link module:ui/model~Model} properties: + * + * ```ts + * attributes: { + * style: { + * color: bind.to( ... ) + * } + * } + * ``` + * + * Note: The `style` attribute is rendered without setting the namespace. It does not seem to be + * needed. + * + * @param styles Styles located in `attributes.style` of {@link module:ui/template~TemplateDefinition}. + * @param data Rendering data. + */ + private _renderStyleAttribute; + /** + * Recursively renders HTML element's children from {@link module:ui/template~Template#children}. + * + * @param data Rendering data. + */ + private _renderElementChildren; + /** + * Activates `on` event listeners from the {@link module:ui/template~TemplateDefinition} + * on an HTML element. + * + * @param data Rendering data. + */ + private _setUpListeners; + /** + * For a given {@link module:ui/template~TemplateValueSchema} containing {@link module:ui/template~TemplateBinding} + * activates the binding and sets its initial value. + * + * Note: {@link module:ui/template~TemplateValueSchema} can be for HTML element attributes or + * text node `textContent`. + * + * @param options Binding options. + * @param options.updater A function which updates the DOM (like attribute or text). + * @param options.data Rendering data. + */ + private _bindToObservable; + /** + * Reverts {@link module:ui/template~RenderData#revertData template data} from a node to + * return it to the original state. + * + * @param node A node to be reverted. + * @param revertData An object that stores information about what changes have been made by + * {@link #apply} to the node. See {@link module:ui/template~RenderData#revertData} for more information. + */ + private _revertTemplateFromNode; +} +type AttributeValues = Array | [ + NamespacedValue> +]; +/** + * Describes a binding created by the {@link module:ui/template~Template.bind} interface. + * + * @internal + */ +export declare abstract class TemplateBinding { + /** + * The name of the {@link module:ui/template~TemplateBinding#observable observed attribute}. + */ + readonly attribute: string; + /** + * An observable instance of the binding. It either: + * + * * provides the attribute with the value, + * * or passes the event when a corresponding DOM event is fired. + */ + readonly observable: Observable; + /** + * An {@link module:utils/emittermixin~Emitter} used by the binding to: + * + * * listen to the attribute change in the {@link module:ui/template~TemplateBinding#observable}, + * * or listen to the event in the DOM. + */ + readonly emitter: Emitter; + /** + * A custom function to process the value of the {@link module:ui/template~TemplateBinding#attribute}. + */ + readonly callback?: (value: any, node: Node) => TemplateSimpleValue; + /** + * Creates an instance of the {@link module:ui/template~TemplateBinding} class. + * + * @param def The definition of the binding. + */ + constructor(def: { + attribute: string; + observable: Observable; + emitter: Emitter; + callback?: (value: any, node: Node) => TemplateSimpleValue; + }); + /** + * Returns the value of the binding. It is the value of the {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable}. The value may be processed by the + * {@link module:ui/template~TemplateBinding#callback}, if such has been passed to the binding. + * + * @param node A native DOM node, passed to the custom {@link module:ui/template~TemplateBinding#callback}. + * @returns The value of {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable}. + */ + getValue(node: Node): TemplateSimpleValue; + /** + * Activates the listener which waits for changes of the {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable}, then updates the DOM with the aggregated + * value of {@link module:ui/template~TemplateValueSchema}. + * + * @param schema A full schema to generate an attribute or text in the DOM. + * @param updater A DOM updater function used to update the native DOM attribute or text. + * @param data Rendering data. + * @returns A function to sever the listener binding. + */ + activateAttributeListener(schema: Array, updater: Updater, data: RenderData): () => void; +} +/** + * Describes either: + * + * * a binding to an {@link module:utils/observablemixin~Observable}, + * * or a native DOM event binding. + * + * It is created by the {@link module:ui/template~BindChain#to} method. + * + * @internal + */ +export declare class TemplateToBinding extends TemplateBinding { + readonly eventNameOrFunction: string | ((domEvent: Event) => void); + constructor(def: ConstructorParameters[0] & { + eventNameOrFunction: string | ((domEvent: Event) => void); + }); + /** + * Activates the listener for the native DOM event, which when fired, is propagated by + * the {@link module:ui/template~TemplateBinding#emitter}. + * + * @param domEvtName The name of the native DOM event. + * @param domSelector The selector in the DOM to filter delegated events. + * @param data Rendering data. + * @returns A function to sever the listener binding. + */ + activateDomEventListener(domEvtName: string, domSelector: string, data: { + node: any; + }): () => void; +} +/** + * Describes a binding to {@link module:utils/observablemixin~Observable} created by the {@link module:ui/template~BindChain#if} + * method. + * + * @internal + */ +export declare class TemplateIfBinding extends TemplateBinding { + /** + * The value of the DOM attribute or text to be set if the {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable} is `true`. + */ + readonly valueIfTrue?: string; + constructor(def: ConstructorParameters[0] & { + valueIfTrue?: string; + }); + /** + * @inheritDoc + */ + getValue(node: Node): TemplateSimpleValue; +} +interface Updater { + set(value: any): void; + remove(): void; +} +/** + * A definition of the {@link module:ui/template~Template}. It describes what kind of + * node a template will render (HTML element or text), attributes of an element, DOM event + * listeners and children. + * + * Also see: + * * {@link module:ui/template~TemplateValueSchema} to learn about HTML element attributes, + * * {@link module:ui/template~TemplateListenerSchema} to learn about DOM event listeners. + * + * A sample definition on an HTML element can look like this: + * + * ```ts + * new Template( { + * tag: 'p', + * children: [ + * { + * tag: 'span', + * attributes: { ... }, + * children: [ ... ], + * }, + * { + * text: 'static–text' + * }, + * 'also-static–text', + * ], + * attributes: { + * class: {@link module:ui/template~TemplateValueSchema}, + * id: {@link module:ui/template~TemplateValueSchema}, + * style: {@link module:ui/template~TemplateValueSchema} + * + * // ... + * }, + * on: { + * 'click': {@link module:ui/template~TemplateListenerSchema} + * + * // Document.querySelector format is also accepted. + * 'keyup@a.some-class': {@link module:ui/template~TemplateListenerSchema} + * + * // ... + * } + * } ); + * ``` + * + * A {@link module:ui/view~View}, another {@link module:ui/template~Template} or a native DOM node + * can also become a child of a template. When a view is passed, its {@link module:ui/view~View#element} is used: + * + * ```ts + * const view = new SomeView(); + * const childTemplate = new Template( { ... } ); + * const childNode = document.createElement( 'b' ); + * + * new Template( { + * tag: 'p', + * + * children: [ + * // view#element will be added as a child of this

    . + * view, + * + * // The output of childTemplate.render() will be added here. + * childTemplate, + * + * // Native DOM nodes are included directly in the rendered output. + * childNode + * ] + * } ); + * ``` + * + * An entire {@link module:ui/viewcollection~ViewCollection} can be used as a child in the definition: + * + * ```ts + * const collection = new ViewCollection(); + * collection.add( someView ); + * + * new Template( { + * tag: 'p', + * + * children: collection + * } ); + * ``` + */ +export type TemplateDefinition = string | Template | TemplateElementDefinition | TemplateTextDefinition; +export type TemplateElementDefinition = { + /** + * See the template {@link module:ui/template~Template#tag} property. + */ + tag: string; + /** + * See the template {@link module:ui/template~Template#attributes} property. + */ + attributes?: Record; + /** + * See the template {@link module:ui/template~Template#children} property. + */ + children?: Iterable; + /** + * See the template {@link module:ui/template~Template#eventListeners} property. + */ + on?: Record; +}; +export type TemplateTextDefinition = { + /** + * See the template {@link module:ui/template~Template#text} property. + */ + text: ArrayOrItem; +}; +export type FalsyValue = false | null | undefined | ''; +export type NamespacedValue = { + ns: string; + value: T; +}; +export type TemplateSimpleValue = string | boolean | number | null | undefined; +export type TemplateSimpleValueSchema = TemplateSimpleValue | AttributeBinding; +/** + * Describes a value of an HTML element attribute or `textContent`. It allows combining multiple + * data sources like static values and {@link module:utils/observablemixin~Observable} attributes. + * + * Also see: + * * {@link module:ui/template~TemplateDefinition} to learn where to use it, + * * {@link module:ui/template~Template.bind} to learn how to configure + * {@link module:utils/observablemixin~Observable} attribute bindings, + * * {@link module:ui/template~Template#render} to learn how to render a template, + * * {@link module:ui/template~BindChain#to `to()`} and {@link module:ui/template~BindChain#if `if()`} + * methods to learn more about bindings. + * + * Attribute values can be described in many different ways: + * + * ```ts + * // Bind helper will create bindings to attributes of the observable. + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'p', + * attributes: { + * // A plain string schema. + * 'class': 'static-text', + * + * // An object schema, binds to the "foo" attribute of the + * // observable and follows its value. + * 'class': bind.to( 'foo' ), + * + * // An array schema, combines the above. + * 'class': [ + * 'static-text', + * bind.to( 'bar', () => { ... } ), + * + * // Bindings can also be conditional. + * bind.if( 'baz', 'class-when-baz-is-true' ) + * ], + * + * // An array schema, with a custom namespace, e.g. useful for creating SVGs. + * 'class': { + * ns: 'http://ns.url', + * value: [ + * bind.if( 'baz', 'value-when-true' ), + * 'static-text' + * ] + * }, + * + * // An object schema, specific for styles. + * style: { + * color: 'red', + * backgroundColor: bind.to( 'qux', () => { ... } ) + * } + * } + * } ); + * ``` + * + * Text nodes can also have complex values: + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * // Will render a "foo" text node. + * new Template( { + * text: 'foo' + * } ); + * + * // Will render a "static text: {observable.foo}" text node. + * // The text of the node will be updated as the "foo" attribute changes. + * new Template( { + * text: [ + * 'static text: ', + * bind.to( 'foo', () => { ... } ) + * ] + * } ); + * ``` + */ +export type TemplateValueSchema = ArrayOrItem> | Record; +/** + * Describes an event listener attached to an HTML element. Such listener can propagate DOM events + * through an {@link module:utils/observablemixin~Observable} instance, execute custom callbacks + * or both, if necessary. + * + * Also see: + * * {@link module:ui/template~TemplateDefinition} to learn more about template definitions, + * * {@link module:ui/template~BindChain#to `to()`} method to learn more about bindings. + * + * Check out different ways of attaching event listeners below: + * + * ```ts + * // Bind helper will propagate events through the observable. + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'p', + * on: { + * // An object schema. The observable will fire the "clicked" event upon DOM "click". + * click: bind.to( 'clicked' ) + * + * // An object schema. It will work for "click" event on "a.foo" children only. + * 'click@a.foo': bind.to( 'clicked' ) + * + * // An array schema, makes the observable propagate multiple events. + * click: [ + * bind.to( 'clicked' ), + * bind.to( 'executed' ) + * ], + * + * // An array schema with a custom callback. + * 'click@a.foo': { + * bind.to( 'clicked' ), + * bind.to( evt => { + * console.log( `${ evt.target } has been clicked!` ); + * } } + * } + * } + * } ); + * ``` + */ +export type TemplateListenerSchema = ArrayOrItem; +declare const AttributeBindingSymbol: unique symbol; +declare const ListenerBindingSymbol: unique symbol; +export interface AttributeBinding { + _opaqueAttributeBinding: typeof AttributeBindingSymbol; +} +export interface ListenerBinding { + _opaqueListenerBinding: typeof ListenerBindingSymbol; +} +/** + * The return value of {@link ~Template.bind `Template.bind()`}. It provides `to()` and `if()` + * methods to create the {@link module:utils/observablemixin~Observable observable} attribute and event bindings. + */ +export interface BindChain { + /** + * Binds an {@link module:utils/observablemixin~Observable observable} to either: + * + * * an HTML element attribute or a text node `textContent`, so it remains in sync with the observable + * attribute as it changes, + * * or an HTML element DOM event, so the DOM events are propagated through an observable. + * + * Some common use cases of `to()` bindings are presented below: + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'p', + * attributes: { + * // class="..." attribute gets bound to `observable#a` + * class: bind.to( 'a' ) + * }, + * children: [ + * //

    ...

    gets bound to observable#b; always `toUpperCase()`. + * { + * text: bind.to( 'b', ( value, node ) => value.toUpperCase() ) + * } + * ], + * on: { + * click: [ + * // An observable will fire "clicked" upon "click" in the DOM. + * bind.to( 'clicked' ), + * + * // A custom callback will be executed upon "click" in the DOM. + * bind.to( () => { + * ... + * } ) + * ] + * } + * } ).render(); + * ``` + * + * Learn more about using `to()` in the {@link module:ui/template~TemplateValueSchema} and + * {@link module:ui/template~TemplateListenerSchema}. + * + * @label ATTRIBUTE + * @param attribute An attribute name of {@link module:utils/observablemixin~Observable}. + */ + to(attribute: TAttribute): AttributeBinding & ListenerBinding; + /** + * Binds an {@link module:utils/observablemixin~Observable observable} to either: + * + * * an HTML element attribute or a text node `textContent`, so it remains in sync with the observable + * attribute as it changes, + * * or an HTML element DOM event, so the DOM events are propagated through an observable. + * + * Some common use cases of `to()` bindings are presented below: + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'p', + * attributes: { + * // class="..." attribute gets bound to `observable#a` + * class: bind.to( 'a' ) + * }, + * children: [ + * //

    ...

    gets bound to observable#b; always `toUpperCase()`. + * { + * text: bind.to( 'b', ( value, node ) => value.toUpperCase() ) + * } + * ], + * on: { + * click: [ + * // An observable will fire "clicked" upon "click" in the DOM. + * bind.to( 'clicked' ), + * + * // A custom callback will be executed upon "click" in the DOM. + * bind.to( () => { + * ... + * } ) + * ] + * } + * } ).render(); + * ``` + * + * Learn more about using `to()` in the {@link module:ui/template~TemplateValueSchema} and + * {@link module:ui/template~TemplateListenerSchema}. + * + * @label ATTRIBUTE_CALLBACK + * @param attribute An attribute name of {@link module:utils/observablemixin~Observable}. + * @param callback Allows for processing of the value. Accepts `Node` and `value` as arguments. + */ + to(attribute: TAttribute, callback: (value: TObservable[TAttribute], node: Node) => (TemplateSimpleValue)): AttributeBinding; + /** + * Binds an {@link module:utils/observablemixin~Observable observable} to either: + * + * * an HTML element attribute or a text node `textContent`, so it remains in sync with the observable + * attribute as it changes, + * * or an HTML element DOM event, so the DOM events are propagated through an observable. + * + * Some common use cases of `to()` bindings are presented below: + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'p', + * attributes: { + * // class="..." attribute gets bound to `observable#a` + * class: bind.to( 'a' ) + * }, + * children: [ + * //

    ...

    gets bound to observable#b; always `toUpperCase()`. + * { + * text: bind.to( 'b', ( value, node ) => value.toUpperCase() ) + * } + * ], + * on: { + * click: [ + * // An observable will fire "clicked" upon "click" in the DOM. + * bind.to( 'clicked' ), + * + * // A custom callback will be executed upon "click" in the DOM. + * bind.to( () => { + * ... + * } ) + * ] + * } + * } ).render(); + * ``` + * + * Learn more about using `to()` in the {@link module:ui/template~TemplateValueSchema} and + * {@link module:ui/template~TemplateListenerSchema}. + * + * @label EVENT + * @param eventNameOrCallback A DOM event name or an event callback. + */ + to(eventNameOrCallback: string | ((domEvent: Event) => void)): ListenerBinding; + /** + * Binds an {@link module:utils/observablemixin~Observable observable} to an HTML element attribute or a text + * node `textContent` so it remains in sync with the observable attribute as it changes. + * + * Unlike {@link module:ui/template~BindChain#to}, it controls the presence of the attribute or `textContent` + * depending on the "falseness" of an {@link module:utils/observablemixin~Observable} attribute. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'input', + * attributes: { + * // when `observable#a` is not undefined/null/false/'' + * // when `observable#a` is undefined/null/false + * checked: bind.if( 'a' ) + * }, + * children: [ + * { + * // "b-is-not-set" when `observable#b` is undefined/null/false/'' + * // when `observable#b` is not "falsy" + * text: bind.if( 'b', 'b-is-not-set', ( value, node ) => !value ) + * } + * ] + * } ).render(); + * ``` + * + * Learn more about using `if()` in the {@link module:ui/template~TemplateValueSchema}. + * + * @param attribute An attribute name of {@link module:utils/observablemixin~Observable} used in the binding. + * @param valueIfTrue Value set when the {@link module:utils/observablemixin~Observable} attribute is not + * undefined/null/false/'' (empty string). + * @param callback Allows for processing of the value. Accepts `Node` and `value` as arguments. + */ + if(attribute: TAttribute, valueIfTrue?: unknown, callback?: (value: TObservable[TAttribute], node: Node) => (boolean | FalsyValue)): AttributeBinding; +} +/** + * The {@link module:ui/template~Template#_renderNode} configuration. + */ +export interface RenderData { + /** + * A node which is being rendered. + */ + node: HTMLElement | Text; + /** + * Tells {@link module:ui/template~Template#_renderNode} to render + * children into `DocumentFragment` first and then append the fragment + * to the parent element. It is a speed optimization. + */ + intoFragment: boolean; + /** + * Indicates whether the {@link #node} has been provided by {@link module:ui/template~Template#apply}. + */ + isApplying: boolean; + /** + * An object storing the data that helps {@link module:ui/template~Template#revert} + * bringing back an element to its initial state, i.e. before + * {@link module:ui/template~Template#apply} was called. + */ + revertData?: RevertData; +} +interface RevertData { + text?: string | null; + children: Array; + bindings: Array void>>; + attributes: Record; +} +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/template.js b/node_modules/@ckeditor/ckeditor5-ui/src/template.js new file mode 100644 index 0000000..2235b2c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/template.js @@ -0,0 +1,1294 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/template + */ +/* global document */ +import View from './view.js'; +import ViewCollection from './viewcollection.js'; +import { CKEditorError, EmitterMixin, isNode, toArray } from '@ckeditor/ckeditor5-utils'; +import { isObject, cloneDeepWith } from 'lodash-es'; +const xhtmlNs = 'http://www.w3.org/1999/xhtml'; +/** + * A basic Template class. It renders a DOM HTML element or text from a + * {@link module:ui/template~TemplateDefinition definition} and supports element attributes, children, + * bindings to {@link module:utils/observablemixin~Observable observables} and DOM event propagation. + * + * A simple template can look like this: + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * tag: 'p', + * attributes: { + * class: 'foo', + * style: { + * backgroundColor: 'yellow' + * } + * }, + * on: { + * click: bind.to( 'clicked' ) + * }, + * children: [ + * 'A paragraph.' + * ] + * } ).render(); + * ``` + * + * and it will render the following HTML element: + * + * ```html + *

    A paragraph.

    + * ``` + * + * Additionally, the `observable` will always fire `clicked` upon clicking `

    ` in the DOM. + * + * See {@link module:ui/template~TemplateDefinition} to know more about templates and complex + * template definitions. + */ +export default class Template extends EmitterMixin() { + /** + * Creates an instance of the {@link ~Template} class. + * + * @param def The definition of the template. + */ + constructor(def) { + super(); + Object.assign(this, normalize(clone(def))); + this._isRendered = false; + this._revertData = null; + } + /** + * Renders a DOM Node (an HTML element or text) out of the template. + * + * ```ts + * const domNode = new Template( { ... } ).render(); + * ``` + * + * See: {@link #apply}. + */ + render() { + const node = this._renderNode({ + intoFragment: true + }); + this._isRendered = true; + return node; + } + /** + * Applies the template to an existing DOM Node, either HTML element or text. + * + * **Note:** No new DOM nodes will be created. Applying extends: + * + * {@link module:ui/template~TemplateDefinition attributes}, + * {@link module:ui/template~TemplateDefinition event listeners}, and + * `textContent` of {@link module:ui/template~TemplateDefinition children} only. + * + * **Note:** Existing `class` and `style` attributes are extended when a template + * is applied to an HTML element, while other attributes and `textContent` are overridden. + * + * **Note:** The process of applying a template can be easily reverted using the + * {@link module:ui/template~Template#revert} method. + * + * ```ts + * const element = document.createElement( 'div' ); + * const observable = new Model( { divClass: 'my-div' } ); + * const emitter = Object.create( EmitterMixin ); + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * attributes: { + * id: 'first-div', + * class: bind.to( 'divClass' ) + * }, + * on: { + * click: bind( 'elementClicked' ) // Will be fired by the observable. + * }, + * children: [ + * 'Div text.' + * ] + * } ).apply( element ); + * + * console.log( element.outerHTML ); // -> '

    ' + * ``` + * + * @see module:ui/template~Template#render + * @see module:ui/template~Template#revert + * @param node Root node for the template to apply. + */ + apply(node) { + this._revertData = getEmptyRevertData(); + this._renderNode({ + node, + intoFragment: false, + isApplying: true, + revertData: this._revertData + }); + return node; + } + /** + * Reverts a template {@link module:ui/template~Template#apply applied} to a DOM node. + * + * @param node The root node for the template to revert. In most of the cases, it is the + * same node used by {@link module:ui/template~Template#apply}. + */ + revert(node) { + if (!this._revertData) { + /** + * Attempting to revert a template which has not been applied yet. + * + * @error ui-template-revert-not-applied + */ + throw new CKEditorError('ui-template-revert-not-applied', [this, node]); + } + this._revertTemplateFromNode(node, this._revertData); + } + /** + * Returns an iterator which traverses the template in search of {@link module:ui/view~View} + * instances and returns them one by one. + * + * ```ts + * const viewFoo = new View(); + * const viewBar = new View(); + * const viewBaz = new View(); + * const template = new Template( { + * tag: 'div', + * children: [ + * viewFoo, + * { + * tag: 'div', + * children: [ + * viewBar + * ] + * }, + * viewBaz + * ] + * } ); + * + * // Logs: viewFoo, viewBar, viewBaz + * for ( const view of template.getViews() ) { + * console.log( view ); + * } + * ``` + */ + *getViews() { + function* search(def) { + if (def.children) { + for (const child of def.children) { + if (isView(child)) { + yield child; + } + else if (isTemplate(child)) { + yield* search(child); + } + } + } + } + yield* search(this); + } + /** + * An entry point to the interface which binds DOM nodes to + * {@link module:utils/observablemixin~Observable observables}. + * There are two types of bindings: + * + * * HTML element attributes or text `textContent` synchronized with attributes of an + * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to} + * and {@link module:ui/template~BindChain#if}. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * attributes: { + * // Binds the element "class" attribute to observable#classAttribute. + * class: bind.to( 'classAttribute' ) + * } + * } ).render(); + * ``` + * + * * DOM events fired on HTML element propagated through + * {@link module:utils/observablemixin~Observable}. Learn more about {@link module:ui/template~BindChain#to}. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * new Template( { + * on: { + * // Will be fired by the observable. + * click: bind( 'elementClicked' ) + * } + * } ).render(); + * ``` + * + * Also see {@link module:ui/view~View#bindTemplate}. + * + * @param observable An observable which provides boundable attributes. + * @param emitter An emitter that listens to observable attribute + * changes or DOM Events (depending on the kind of the binding). Usually, a {@link module:ui/view~View} instance. + */ + static bind(observable, emitter) { + return { + to(eventNameOrFunctionOrAttribute, callback) { + return new TemplateToBinding({ + eventNameOrFunction: eventNameOrFunctionOrAttribute, + attribute: eventNameOrFunctionOrAttribute, + observable, emitter, callback + }); + }, + if(attribute, valueIfTrue, callback) { + return new TemplateIfBinding({ + observable, emitter, attribute, valueIfTrue, callback + }); + } + }; + } + /** + * Extends an existing {@link module:ui/template~Template} instance with some additional content + * from another {@link module:ui/template~TemplateDefinition}. + * + * ```ts + * const bind = Template.bind( observable, emitter ); + * + * const template = new Template( { + * tag: 'p', + * attributes: { + * class: 'a', + * data-x: bind.to( 'foo' ) + * }, + * children: [ + * { + * tag: 'span', + * attributes: { + * class: 'b' + * }, + * children: [ + * 'Span' + * ] + * } + * ] + * } ); + * + * // Instance-level extension. + * Template.extend( template, { + * attributes: { + * class: 'b', + * data-x: bind.to( 'bar' ) + * }, + * children: [ + * { + * attributes: { + * class: 'c' + * } + * } + * ] + * } ); + * + * // Child extension. + * Template.extend( template.children[ 0 ], { + * attributes: { + * class: 'd' + * } + * } ); + * ``` + * + * the `outerHTML` of `template.render()` is: + * + * ```html + *

    + * Span + *

    + * ``` + * + * @param template An existing template instance to be extended. + * @param def Additional definition to be applied to a template. + */ + static extend(template, def) { + if (template._isRendered) { + /** + * Extending a template after rendering may not work as expected. To make sure + * the {@link module:ui/template~Template.extend extending} works for an element, + * make sure it happens before {@link module:ui/template~Template#render} is called. + * + * @error template-extend-render + */ + throw new CKEditorError('template-extend-render', [this, template]); + } + extendTemplate(template, normalize(clone(def))); + } + /** + * Renders a DOM Node (either an HTML element or text) out of the template. + * + * @param data Rendering data. + */ + _renderNode(data) { + let isInvalid; + if (data.node) { + // When applying, a definition cannot have "tag" and "text" at the same time. + isInvalid = this.tag && this.text; + } + else { + // When rendering, a definition must have either "tag" or "text": XOR( this.tag, this.text ). + isInvalid = this.tag ? this.text : !this.text; + } + if (isInvalid) { + /** + * Node definition cannot have the "tag" and "text" properties at the same time. + * Node definition must have either "tag" or "text" when rendering a new Node. + * + * @error ui-template-wrong-syntax + */ + throw new CKEditorError('ui-template-wrong-syntax', this); + } + if (this.text) { + return this._renderText(data); + } + else { + return this._renderElement(data); + } + } + /** + * Renders an HTML element out of the template. + * + * @param data Rendering data. + */ + _renderElement(data) { + let node = data.node; + if (!node) { + node = data.node = document.createElementNS(this.ns || xhtmlNs, this.tag); + } + this._renderAttributes(data); + this._renderElementChildren(data); + this._setUpListeners(data); + return node; + } + /** + * Renders a text node out of {@link module:ui/template~Template#text}. + * + * @param data Rendering data. + */ + _renderText(data) { + let node = data.node; + // Save the original textContent to revert it in #revert(). + if (node) { + data.revertData.text = node.textContent; + } + else { + node = data.node = document.createTextNode(''); + } + // Check if this Text Node is bound to Observable. Cases: + // + // text: [ Template.bind( ... ).to( ... ) ] + // + // text: [ + // 'foo', + // Template.bind( ... ).to( ... ), + // ... + // ] + // + if (hasTemplateBinding(this.text)) { + this._bindToObservable({ + schema: this.text, + updater: getTextUpdater(node), + data + }); + } + // Simply set text. Cases: + // + // text: [ 'all', 'are', 'static' ] + // + // text: [ 'foo' ] + // + else { + node.textContent = this.text.join(''); + } + return node; + } + /** + * Renders HTML element attributes out of {@link module:ui/template~Template#attributes}. + * + * @param data Rendering data. + */ + _renderAttributes(data) { + if (!this.attributes) { + return; + } + const node = data.node; + const revertData = data.revertData; + for (const attrName in this.attributes) { + // Current attribute value in DOM. + const domAttrValue = node.getAttribute(attrName); + // The value to be set. + const attrValue = this.attributes[attrName]; + // Save revert data. + if (revertData) { + revertData.attributes[attrName] = domAttrValue; + } + // Detect custom namespace: + // + // class: { + // ns: 'abc', + // value: Template.bind( ... ).to( ... ) + // } + // + const attrNs = isNamespaced(attrValue) ? attrValue[0].ns : null; + // Activate binding if one is found. Cases: + // + // class: [ + // Template.bind( ... ).to( ... ) + // ] + // + // class: [ + // 'bar', + // Template.bind( ... ).to( ... ), + // 'baz' + // ] + // + // class: { + // ns: 'abc', + // value: Template.bind( ... ).to( ... ) + // } + // + if (hasTemplateBinding(attrValue)) { + // Normalize attributes with additional data like namespace: + // + // class: { + // ns: 'abc', + // value: [ ... ] + // } + // + const valueToBind = isNamespaced(attrValue) ? attrValue[0].value : attrValue; + // Extend the original value of attributes like "style" and "class", + // don't override them. + if (revertData && shouldExtend(attrName)) { + valueToBind.unshift(domAttrValue); + } + this._bindToObservable({ + schema: valueToBind, + updater: getAttributeUpdater(node, attrName, attrNs), + data + }); + } + // Style attribute could be an Object so it needs to be parsed in a specific way. + // + // style: { + // width: '100px', + // height: Template.bind( ... ).to( ... ) + // } + // + else if (attrName == 'style' && typeof attrValue[0] !== 'string') { + this._renderStyleAttribute(attrValue[0], data); + } + // Otherwise simply set the static attribute: + // + // class: [ 'foo' ] + // + // class: [ 'all', 'are', 'static' ] + // + // class: [ + // { + // ns: 'abc', + // value: [ 'foo' ] + // } + // ] + // + else { + // Extend the original value of attributes like "style" and "class", + // don't override them. + if (revertData && domAttrValue && shouldExtend(attrName)) { + attrValue.unshift(domAttrValue); + } + const value = attrValue + // Retrieve "values" from: + // + // class: [ + // { + // ns: 'abc', + // value: [ ... ] + // } + // ] + // + .map((val) => val ? (val.value || val) : val) + // Flatten the array. + .reduce((prev, next) => prev.concat(next), []) + // Convert into string. + .reduce(arrayValueReducer, ''); + if (!isFalsy(value)) { + node.setAttributeNS(attrNs, attrName, value); + } + } + } + } + /** + * Renders the `style` attribute of an HTML element based on + * {@link module:ui/template~Template#attributes}. + * + * A style attribute is an object with static values: + * + * ```ts + * attributes: { + * style: { + * color: 'red' + * } + * } + * ``` + * + * or values bound to {@link module:ui/model~Model} properties: + * + * ```ts + * attributes: { + * style: { + * color: bind.to( ... ) + * } + * } + * ``` + * + * Note: The `style` attribute is rendered without setting the namespace. It does not seem to be + * needed. + * + * @param styles Styles located in `attributes.style` of {@link module:ui/template~TemplateDefinition}. + * @param data Rendering data. + */ + _renderStyleAttribute(styles, data) { + const node = data.node; + for (const styleName in styles) { + const styleValue = styles[styleName]; + // Cases: + // + // style: { + // color: bind.to( 'attribute' ) + // } + // + if (hasTemplateBinding(styleValue)) { + this._bindToObservable({ + schema: [styleValue], + updater: getStyleUpdater(node, styleName), + data + }); + } + // Cases: + // + // style: { + // color: 'red' + // } + // + else { + node.style[styleName] = styleValue; + } + } + } + /** + * Recursively renders HTML element's children from {@link module:ui/template~Template#children}. + * + * @param data Rendering data. + */ + _renderElementChildren(data) { + const node = data.node; + const container = data.intoFragment ? document.createDocumentFragment() : node; + const isApplying = data.isApplying; + let childIndex = 0; + for (const child of this.children) { + if (isViewCollection(child)) { + if (!isApplying) { + child.setParent(node); + // Note: ViewCollection renders its children. + for (const view of child) { + container.appendChild(view.element); + } + } + } + else if (isView(child)) { + if (!isApplying) { + if (!child.isRendered) { + child.render(); + } + container.appendChild(child.element); + } + } + else if (isNode(child)) { + container.appendChild(child); + } + else { + if (isApplying) { + const revertData = data.revertData; + const childRevertData = getEmptyRevertData(); + revertData.children.push(childRevertData); + child._renderNode({ + intoFragment: false, + node: container.childNodes[childIndex++], + isApplying: true, + revertData: childRevertData + }); + } + else { + container.appendChild(child.render()); + } + } + } + if (data.intoFragment) { + node.appendChild(container); + } + } + /** + * Activates `on` event listeners from the {@link module:ui/template~TemplateDefinition} + * on an HTML element. + * + * @param data Rendering data. + */ + _setUpListeners(data) { + if (!this.eventListeners) { + return; + } + for (const key in this.eventListeners) { + const revertBindings = this.eventListeners[key].map(schemaItem => { + const [domEvtName, domSelector] = key.split('@'); + return schemaItem.activateDomEventListener(domEvtName, domSelector, data); + }); + if (data.revertData) { + data.revertData.bindings.push(revertBindings); + } + } + } + /** + * For a given {@link module:ui/template~TemplateValueSchema} containing {@link module:ui/template~TemplateBinding} + * activates the binding and sets its initial value. + * + * Note: {@link module:ui/template~TemplateValueSchema} can be for HTML element attributes or + * text node `textContent`. + * + * @param options Binding options. + * @param options.updater A function which updates the DOM (like attribute or text). + * @param options.data Rendering data. + */ + _bindToObservable({ schema, updater, data }) { + const revertData = data.revertData; + // Set initial values. + syncValueSchemaValue(schema, updater, data); + const revertBindings = schema + // Filter "falsy" (false, undefined, null, '') value schema components out. + .filter(item => !isFalsy(item)) + // Filter inactive bindings from schema, like static strings ('foo'), numbers (42), etc. + .filter((item) => item.observable) + // Once only the actual binding are left, let the emitter listen to observable change:attribute event. + // TODO: Reduce the number of listeners attached as many bindings may listen + // to the same observable attribute. + .map(templateBinding => templateBinding.activateAttributeListener(schema, updater, data)); + if (revertData) { + revertData.bindings.push(revertBindings); + } + } + /** + * Reverts {@link module:ui/template~RenderData#revertData template data} from a node to + * return it to the original state. + * + * @param node A node to be reverted. + * @param revertData An object that stores information about what changes have been made by + * {@link #apply} to the node. See {@link module:ui/template~RenderData#revertData} for more information. + */ + _revertTemplateFromNode(node, revertData) { + for (const binding of revertData.bindings) { + // Each binding may consist of several observable+observable#attribute. + // like the following has 2: + // + // class: [ + // 'x', + // bind.to( 'foo' ), + // 'y', + // bind.to( 'bar' ) + // ] + // + for (const revertBinding of binding) { + revertBinding(); + } + } + if (revertData.text) { + node.textContent = revertData.text; + return; + } + const element = node; + for (const attrName in revertData.attributes) { + const attrValue = revertData.attributes[attrName]; + // When the attribute has **not** been set before #apply(). + if (attrValue === null) { + element.removeAttribute(attrName); + } + else { + element.setAttribute(attrName, attrValue); + } + } + for (let i = 0; i < revertData.children.length; ++i) { + this._revertTemplateFromNode(element.childNodes[i], revertData.children[i]); + } + } +} +/** + * Describes a binding created by the {@link module:ui/template~Template.bind} interface. + * + * @internal + */ +export class TemplateBinding { + /** + * Creates an instance of the {@link module:ui/template~TemplateBinding} class. + * + * @param def The definition of the binding. + */ + constructor(def) { + this.attribute = def.attribute; + this.observable = def.observable; + this.emitter = def.emitter; + this.callback = def.callback; + } + /** + * Returns the value of the binding. It is the value of the {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable}. The value may be processed by the + * {@link module:ui/template~TemplateBinding#callback}, if such has been passed to the binding. + * + * @param node A native DOM node, passed to the custom {@link module:ui/template~TemplateBinding#callback}. + * @returns The value of {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable}. + */ + getValue(node) { + const value = this.observable[this.attribute]; + return this.callback ? this.callback(value, node) : value; + } + /** + * Activates the listener which waits for changes of the {@link module:ui/template~TemplateBinding#attribute} in + * {@link module:ui/template~TemplateBinding#observable}, then updates the DOM with the aggregated + * value of {@link module:ui/template~TemplateValueSchema}. + * + * @param schema A full schema to generate an attribute or text in the DOM. + * @param updater A DOM updater function used to update the native DOM attribute or text. + * @param data Rendering data. + * @returns A function to sever the listener binding. + */ + activateAttributeListener(schema, updater, data) { + const callback = () => syncValueSchemaValue(schema, updater, data); + this.emitter.listenTo(this.observable, `change:${this.attribute}`, callback); + // Allows revert of the listener. + return () => { + this.emitter.stopListening(this.observable, `change:${this.attribute}`, callback); + }; + } +} +/** + * Describes either: + * + * * a binding to an {@link module:utils/observablemixin~Observable}, + * * or a native DOM event binding. + * + * It is created by the {@link module:ui/template~BindChain#to} method. + * + * @internal + */ +export class TemplateToBinding extends TemplateBinding { + constructor(def) { + super(def); + this.eventNameOrFunction = def.eventNameOrFunction; + } + /** + * Activates the listener for the native DOM event, which when fired, is propagated by + * the {@link module:ui/template~TemplateBinding#emitter}. + * + * @param domEvtName The name of the native DOM event. + * @param domSelector The selector in the DOM to filter delegated events. + * @param data Rendering data. + * @returns A function to sever the listener binding. + */ + activateDomEventListener(domEvtName, domSelector, data) { + const callback = (evt, domEvt) => { + if (!domSelector || domEvt.target.matches(domSelector)) { + if (typeof this.eventNameOrFunction == 'function') { + this.eventNameOrFunction(domEvt); + } + else { + this.observable.fire(this.eventNameOrFunction, domEvt); + } + } + }; + this.emitter.listenTo(data.node, domEvtName, callback); + // Allows revert of the listener. + return () => { + this.emitter.stopListening(data.node, domEvtName, callback); + }; + } +} +/** + * Describes a binding to {@link module:utils/observablemixin~Observable} created by the {@link module:ui/template~BindChain#if} + * method. + * + * @internal + */ +export class TemplateIfBinding extends TemplateBinding { + constructor(def) { + super(def); + this.valueIfTrue = def.valueIfTrue; + } + /** + * @inheritDoc + */ + getValue(node) { + const value = super.getValue(node); + return isFalsy(value) ? false : (this.valueIfTrue || true); + } +} +/** + * Checks whether given {@link module:ui/template~TemplateValueSchema} contains a + * {@link module:ui/template~TemplateBinding}. + */ +function hasTemplateBinding(schema) { + if (!schema) { + return false; + } + // Normalize attributes with additional data like namespace: + // + // class: { + // ns: 'abc', + // value: [ ... ] + // } + // + if (schema.value) { + schema = schema.value; + } + if (Array.isArray(schema)) { + return schema.some(hasTemplateBinding); + } + else if (schema instanceof TemplateBinding) { + return true; + } + return false; +} +/** + * Assembles the value using {@link module:ui/template~TemplateValueSchema} and stores it in a form of + * an Array. Each entry of the Array corresponds to one of {@link module:ui/template~TemplateValueSchema} + * items. + * + * @param node DOM Node updated when {@link module:utils/observablemixin~Observable} changes. + */ +function getValueSchemaValue(schema, node) { + return schema.map(schemaItem => { + // Process {@link module:ui/template~TemplateBinding} bindings. + if (schemaItem instanceof TemplateBinding) { + return schemaItem.getValue(node); + } + // All static values like strings, numbers, and "falsy" values (false, null, undefined, '', etc.) just pass. + return schemaItem; + }); +} +/** + * A function executed each time the bound Observable attribute changes, which updates the DOM with a value + * constructed from {@link module:ui/template~TemplateValueSchema}. + * + * @param updater A function which updates the DOM (like attribute or text). + * @param node DOM Node updated when {@link module:utils/observablemixin~Observable} changes. + */ +function syncValueSchemaValue(schema, updater, { node }) { + const values = getValueSchemaValue(schema, node); + let value; + // Check if schema is a single Template.bind.if, like: + // + // class: Template.bind.if( 'foo' ) + // + if (schema.length == 1 && schema[0] instanceof TemplateIfBinding) { + value = values[0]; + } + else { + value = values.reduce(arrayValueReducer, ''); + } + if (isFalsy(value)) { + updater.remove(); + } + else { + updater.set(value); + } +} +/** + * Returns an object consisting of `set` and `remove` functions, which + * can be used in the context of DOM Node to set or reset `textContent`. + * @see module:ui/view~View#_bindToObservable + * + * @param node DOM Node to be modified. + */ +function getTextUpdater(node) { + return { + set(value) { + node.textContent = value; + }, + remove() { + node.textContent = ''; + } + }; +} +/** + * Returns an object consisting of `set` and `remove` functions, which + * can be used in the context of DOM Node to set or reset an attribute. + * @see module:ui/view~View#_bindToObservable + * + * @param el DOM Node to be modified. + * @param attrName Name of the attribute to be modified. + * @param ns Namespace to use. + */ +function getAttributeUpdater(el, attrName, ns) { + return { + set(value) { + el.setAttributeNS(ns, attrName, value); + }, + remove() { + el.removeAttributeNS(ns, attrName); + } + }; +} +/** + * Returns an object consisting of `set` and `remove` functions, which + * can be used in the context of CSSStyleDeclaration to set or remove a style. + * @see module:ui/view~View#_bindToObservable + * + * @param el DOM Node to be modified. + * @param styleName Name of the style to be modified. + */ +function getStyleUpdater(el, styleName) { + return { + set(value) { + el.style[styleName] = value; + }, + remove() { + el.style[styleName] = null; + } + }; +} +/** + * Clones definition of the template. + */ +function clone(def) { + const clone = cloneDeepWith(def, value => { + // Don't clone the `Template.bind`* bindings because of the references to Observable + // and DomEmitterMixin instances inside, which would also be traversed and cloned by greedy + // cloneDeepWith algorithm. There's no point in cloning Observable/DomEmitterMixins + // along with the definition. + // + // Don't clone Template instances if provided as a child. They're simply #render()ed + // and nothing should interfere. + // + // Also don't clone View instances if provided as a child of the Template. The template + // instance will be extracted from the View during the normalization and there's no need + // to clone it. + if (value && (value instanceof TemplateBinding || isTemplate(value) || isView(value) || isViewCollection(value))) { + return value; + } + }); + return clone; +} +/** + * Normalizes given {@link module:ui/template~TemplateDefinition}. + * + * See: + * * {@link normalizeAttributes} + * * {@link normalizeListeners} + * * {@link normalizePlainTextDefinition} + * * {@link normalizeTextDefinition} + * + * @param def A template definition. + * @returns Normalized definition. + */ +function normalize(def) { + if (typeof def == 'string') { + def = normalizePlainTextDefinition(def); + } + else if (def.text) { + normalizeTextDefinition(def); + } + if (def.on) { + def.eventListeners = normalizeListeners(def.on); + // Template mixes EmitterMixin, so delete #on to avoid collision. + delete def.on; + } + if (!def.text) { + if (def.attributes) { + normalizeAttributes(def.attributes); + } + const children = []; + if (def.children) { + if (isViewCollection(def.children)) { + children.push(def.children); + } + else { + for (const child of def.children) { + if (isTemplate(child) || isView(child) || isNode(child)) { + children.push(child); + } + else { + children.push(new Template(child)); + } + } + } + } + def.children = children; + } + return def; +} +/** + * Normalizes "attributes" section of {@link module:ui/template~TemplateDefinition}. + * + * ``` + * attributes: { + * a: 'bar', + * b: {@link module:ui/template~TemplateBinding}, + * c: { + * value: 'bar' + * } + * } + * ``` + * + * becomes + * + * ``` + * attributes: { + * a: [ 'bar' ], + * b: [ {@link module:ui/template~TemplateBinding} ], + * c: { + * value: [ 'bar' ] + * } + * } + * ``` + */ +function normalizeAttributes(attributes) { + for (const a in attributes) { + if (attributes[a].value) { + attributes[a].value = toArray(attributes[a].value); + } + arrayify(attributes, a); + } +} +/** + * Normalizes "on" section of {@link module:ui/template~TemplateDefinition}. + * + * ``` + * on: { + * a: 'bar', + * b: {@link module:ui/template~TemplateBinding}, + * c: [ {@link module:ui/template~TemplateBinding}, () => { ... } ] + * } + * ``` + * + * becomes + * + * ``` + * on: { + * a: [ 'bar' ], + * b: [ {@link module:ui/template~TemplateBinding} ], + * c: [ {@link module:ui/template~TemplateBinding}, () => { ... } ] + * } + * ``` + * + * @returns Object containing normalized listeners. + */ +function normalizeListeners(listeners) { + for (const l in listeners) { + arrayify(listeners, l); + } + return listeners; +} +/** + * Normalizes "string" {@link module:ui/template~TemplateDefinition}. + * + * ``` + * "foo" + * ``` + * + * becomes + * + * ``` + * { text: [ 'foo' ] }, + * ``` + * + * @returns Normalized template definition. + */ +function normalizePlainTextDefinition(def) { + return { + text: [def] + }; +} +/** + * Normalizes text {@link module:ui/template~TemplateDefinition}. + * + * ``` + * children: [ + * { text: 'def' }, + * { text: {@link module:ui/template~TemplateBinding} } + * ] + * ``` + * + * becomes + * + * ``` + * children: [ + * { text: [ 'def' ] }, + * { text: [ {@link module:ui/template~TemplateBinding} ] } + * ] + * ``` + */ +function normalizeTextDefinition(def) { + def.text = toArray(def.text); +} +/** + * Wraps an entry in Object in an Array, if not already one. + * + * ``` + * { + * x: 'y', + * a: [ 'b' ] + * } + * ``` + * + * becomes + * + * ``` + * { + * x: [ 'y' ], + * a: [ 'b' ] + * } + * ``` + */ +function arrayify(obj, key) { + obj[key] = toArray(obj[key]); +} +/** + * A helper which concatenates the value avoiding unwanted + * leading white spaces. + */ +function arrayValueReducer(prev, cur) { + if (isFalsy(cur)) { + return prev; + } + else if (isFalsy(prev)) { + return cur; + } + else { + return `${prev} ${cur}`; + } +} +/** + * Extends one object defined in the following format: + * + * ``` + * { + * key1: [Array1], + * key2: [Array2], + * ... + * keyN: [ArrayN] + * } + * ``` + * + * with another object of the same data format. + * + * @param obj Base object. + * @param ext Object extending base. + */ +function extendObjectValueArray(obj, ext) { + for (const a in ext) { + if (obj[a]) { + obj[a].push(...ext[a]); + } + else { + obj[a] = ext[a]; + } + } +} +/** + * A helper for {@link module:ui/template~Template#extend}. Recursively extends {@link module:ui/template~Template} instance + * with content from {@link module:ui/template~TemplateDefinition}. See {@link module:ui/template~Template#extend} to learn more. + * + * @param def A template instance to be extended. + * @param def A definition which is to extend the template instance. + * @param Error context. + */ +function extendTemplate(template, def) { + if (def.attributes) { + if (!template.attributes) { + template.attributes = {}; + } + extendObjectValueArray(template.attributes, def.attributes); + } + if (def.eventListeners) { + if (!template.eventListeners) { + template.eventListeners = {}; + } + extendObjectValueArray(template.eventListeners, def.eventListeners); + } + if (def.text) { + template.text.push(...def.text); + } + if (def.children && def.children.length) { + if (template.children.length != def.children.length) { + /** + * The number of children in extended definition does not match. + * + * @error ui-template-extend-children-mismatch + */ + throw new CKEditorError('ui-template-extend-children-mismatch', template); + } + let childIndex = 0; + for (const childDef of def.children) { + extendTemplate(template.children[childIndex++], childDef); + } + } +} +/** + * Checks if value is "falsy". + * Note: 0 (Number) is not "falsy" in this context. + * + * @param value Value to be checked. + */ +function isFalsy(value) { + return !value && value !== 0; +} +/** + * Checks if the item is an instance of {@link module:ui/view~View} + * + * @param value Value to be checked. + */ +function isView(item) { + return item instanceof View; +} +/** + * Checks if the item is an instance of {@link module:ui/template~Template} + * + * @param value Value to be checked. + */ +function isTemplate(item) { + return item instanceof Template; +} +/** + * Checks if the item is an instance of {@link module:ui/viewcollection~ViewCollection} + * + * @param value Value to be checked. + */ +function isViewCollection(item) { + return item instanceof ViewCollection; +} +/** + * Checks if value array contains the one with namespace. + */ +function isNamespaced(attrValue) { + return isObject(attrValue[0]) && attrValue[0].ns; +} +/** + * Creates an empty skeleton for {@link module:ui/template~Template#revert} + * data. + */ +function getEmptyRevertData() { + return { + children: [], + bindings: [], + attributes: {} + }; +} +/** + * Checks whether an attribute should be extended when + * {@link module:ui/template~Template#apply} is called. + * + * @param attrName Attribute name to check. + */ +function shouldExtend(attrName) { + return attrName == 'class' || attrName == 'style'; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.d.ts new file mode 100644 index 0000000..e0e09b0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.d.ts @@ -0,0 +1,104 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/textarea/textareaview + */ +import { type Locale } from '@ckeditor/ckeditor5-utils'; +import InputBase from '../input/inputbase.js'; +import '../../theme/components/input/input.css'; +import '../../theme/components/textarea/textarea.css'; +/** + * The textarea view class. + * + * ```ts + * const textareaView = new TextareaView(); + * + * textareaView.minRows = 2; + * textareaView.maxRows = 10; + * + * textareaView.render(); + * + * document.body.append( textareaView.element ); + * ``` + */ +export default class TextareaView extends InputBase { + /** + * Specifies the visible height of a text area, in lines. + * + * @observable + * @default 2 + */ + minRows: number; + /** + * Specifies the maximum number of rows. + * + * @observable + * @default 5 + */ + maxRows: number; + /** + * Specifies the value of HTML attribute that indicates whether the user can resize the element. + * + * @observable + * @default 'none' + */ + resize: 'both' | 'horizontal' | 'vertical' | 'none'; + /** + * An internal property that stores the current height of the textarea. Used for the DOM binding. + * + * @observable + * @default null + * @internal + */ + _height: number | null; + /** + * An instance of the resize observer used to detect when the view is visible or not and update + * its height if any changes that affect it were made while it was invisible. + * + * **Note:** Created in {@link #render}. + */ + private _resizeObserver; + /** + * A flag that indicates whether the {@link #_updateAutoGrowHeight} method should be called when the view becomes + * visible again. See {@link #_resizeObserver}. + */ + private _isUpdateAutoGrowHeightPending; + /** + * @inheritDoc + */ + constructor(locale?: Locale); + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * @inheritDoc + */ + reset(): void; + /** + * Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size. + * + * **Note**: This method overrides manual resize done by the user using a handle. It's a known bug. + */ + private _updateAutoGrowHeight; + /** + * Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect. + */ + private _validateMinMaxRows; +} +/** + * Fired every time the layout of the {@link module:ui/textarea/textareaview~TextareaView} possibly changed as a result + * of the user input or the value change via {@link module:ui/textarea/textareaview~TextareaView#value}. + * + * @eventName ~TextareaView#update + */ +export type TextareaViewUpdateEvent = { + name: 'update'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.js b/node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.js new file mode 100644 index 0000000..79757fd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/textarea/textareaview.js @@ -0,0 +1,182 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/textarea/textareaview + */ +import { Rect, toUnit, getBorderWidths, global, CKEditorError, isVisible, ResizeObserver } from '@ckeditor/ckeditor5-utils'; +import InputBase from '../input/inputbase.js'; +import '../../theme/components/input/input.css'; +import '../../theme/components/textarea/textarea.css'; +/** + * The textarea view class. + * + * ```ts + * const textareaView = new TextareaView(); + * + * textareaView.minRows = 2; + * textareaView.maxRows = 10; + * + * textareaView.render(); + * + * document.body.append( textareaView.element ); + * ``` + */ +export default class TextareaView extends InputBase { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + /** + * A flag that indicates whether the {@link #_updateAutoGrowHeight} method should be called when the view becomes + * visible again. See {@link #_resizeObserver}. + */ + this._isUpdateAutoGrowHeightPending = false; + const toPx = toUnit('px'); + this.set('minRows', 2); + this.set('maxRows', 5); + this.set('_height', null); + this.set('resize', 'none'); + this._resizeObserver = null; + this.on('change:minRows', this._validateMinMaxRows.bind(this)); + this.on('change:maxRows', this._validateMinMaxRows.bind(this)); + const bind = this.bindTemplate; + this.template.tag = 'textarea'; + this.extendTemplate({ + attributes: { + class: ['ck-textarea'], + style: { + height: bind.to('_height', height => height ? toPx(height) : null), + resize: bind.to('resize') + }, + rows: bind.to('minRows') + } + }); + } + /** + * @inheritDoc + */ + render() { + super.render(); + let wasVisible = false; + this.on('input', () => { + this._updateAutoGrowHeight(true); + this.fire('update'); + }); + this.on('change:value', () => { + // The content needs to be updated by the browser after the value is changed. It takes a few ms. + global.window.requestAnimationFrame(() => { + if (!isVisible(this.element)) { + this._isUpdateAutoGrowHeightPending = true; + return; + } + this._updateAutoGrowHeight(); + this.fire('update'); + }); + }); + // It may occur that the Textarea size needs to be updated (e.g. because it's content was changed) + // when it is not visible or detached from DOM. + // In such case, we need to detect the moment when it becomes visible again and update its height then. + // We're using ResizeObserver for that as it is the most reliable way to detect when the element becomes visible. + // IntersectionObserver didn't work well with the absolute positioned containers. + this._resizeObserver = new ResizeObserver(this.element, evt => { + const isVisible = !!evt.contentRect.width && !!evt.contentRect.height; + if (!wasVisible && isVisible && this._isUpdateAutoGrowHeightPending) { + // We're wrapping the auto-grow logic in RAF because otherwise there is an error thrown + // by the browser about recursive calls to the ResizeObserver. It used to happen in unit + // tests only, though. Since there is no risk of infinite loop here, it can stay here. + global.window.requestAnimationFrame(() => { + this._updateAutoGrowHeight(); + this.fire('update'); + }); + } + wasVisible = isVisible; + }); + } + /** + * @inheritDoc + */ + destroy() { + if (this._resizeObserver) { + this._resizeObserver.destroy(); + } + } + /** + * @inheritDoc + */ + reset() { + super.reset(); + this._updateAutoGrowHeight(); + this.fire('update'); + } + /** + * Updates the {@link #_height} of the view depending on {@link #minRows}, {@link #maxRows}, and the current content size. + * + * **Note**: This method overrides manual resize done by the user using a handle. It's a known bug. + */ + _updateAutoGrowHeight(shouldScroll) { + const viewElement = this.element; + if (!viewElement.offsetParent) { + this._isUpdateAutoGrowHeightPending = true; + return; + } + this._isUpdateAutoGrowHeightPending = false; + const singleLineContentClone = getTextareaElementClone(viewElement, '1'); + const fullTextValueClone = getTextareaElementClone(viewElement, viewElement.value); + const singleLineContentStyles = singleLineContentClone.ownerDocument.defaultView.getComputedStyle(singleLineContentClone); + const verticalPaddings = parseFloat(singleLineContentStyles.paddingTop) + parseFloat(singleLineContentStyles.paddingBottom); + const borders = getBorderWidths(singleLineContentClone); + const lineHeight = parseFloat(singleLineContentStyles.lineHeight); + const verticalBorder = borders.top + borders.bottom; + const singleLineAreaDefaultHeight = new Rect(singleLineContentClone).height; + const numberOfLines = Math.round((fullTextValueClone.scrollHeight - verticalPaddings) / lineHeight); + const maxHeight = this.maxRows * lineHeight + verticalPaddings + verticalBorder; + // There's a --ck-ui-component-min-height CSS custom property that enforces min height of the component. + // This min-height is relevant only when there's one line of text. Other than that, we can rely on line-height. + const minHeight = numberOfLines === 1 ? singleLineAreaDefaultHeight : this.minRows * lineHeight + verticalPaddings + verticalBorder; + // The size of textarea is controlled by height style instead of rows attribute because event though it is + // a more complex solution, it is immune to the layout textarea has been rendered in (gird, flex). + this._height = Math.min(Math.max(Math.max(numberOfLines, this.minRows) * lineHeight + verticalPaddings + verticalBorder, minHeight), maxHeight); + if (shouldScroll) { + viewElement.scrollTop = viewElement.scrollHeight; + } + singleLineContentClone.remove(); + fullTextValueClone.remove(); + } + /** + * Validates the {@link #minRows} and {@link #maxRows} properties and warns in the console if the configuration is incorrect. + */ + _validateMinMaxRows() { + if (this.minRows > this.maxRows) { + /** + * The minimum number of rows is greater than the maximum number of rows. + * + * @error ui-textarea-view-min-rows-greater-than-max-rows + * @param textareaView The misconfigured textarea view instance. + * @param minRows The value of `minRows` property. + * @param maxRows The value of `maxRows` property. + */ + throw new CKEditorError('ui-textarea-view-min-rows-greater-than-max-rows', { + textareaView: this, + minRows: this.minRows, + maxRows: this.maxRows + }); + } + } +} +function getTextareaElementClone(element, value) { + const clone = element.cloneNode(); + clone.style.position = 'absolute'; + clone.style.top = '-99999px'; + clone.style.left = '-99999px'; + clone.style.height = 'auto'; + clone.style.overflow = 'hidden'; + clone.style.width = element.ownerDocument.defaultView.getComputedStyle(element).width; + clone.tabIndex = -1; + clone.rows = 1; + clone.value = value; + element.parentNode.insertBefore(clone, element); + return clone; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.d.ts new file mode 100644 index 0000000..f60446d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.d.ts @@ -0,0 +1,117 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/balloon/balloontoolbar + */ +import ContextualBalloon from '../../panel/balloon/contextualballoon.js'; +import ToolbarView from '../toolbarview.js'; +import { Plugin, type Editor } from '@ckeditor/ckeditor5-core'; +import { FocusTracker } from '@ckeditor/ckeditor5-utils'; +/** + * The contextual toolbar. + * + * It uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon plugin}. + */ +export default class BalloonToolbar extends Plugin { + /** + * The toolbar view displayed in the balloon. + */ + readonly toolbarView: ToolbarView; + /** + * Tracks the focus of the {@link module:ui/editorui/editorui~EditorUI#getEditableElement editable element} + * and the {@link #toolbarView}. When both are blurred then the toolbar should hide. + */ + readonly focusTracker: FocusTracker; + /** + * A cached and normalized `config.balloonToolbar` object. + */ + private _balloonConfig; + /** + * An instance of the resize observer that allows to respond to changes in editable's geometry + * so the toolbar can stay within its boundaries (and group toolbar items that do not fit). + * + * **Note**: Used only when `shouldNotGroupWhenFull` was **not** set in the + * {@link module:core/editor/editorconfig~EditorConfig#balloonToolbar configuration}. + * + * **Note:** Created in {@link #init}. + */ + private _resizeObserver; + /** + * The contextual balloon plugin instance. + */ + private readonly _balloon; + /** + * Fires `_selectionChangeDebounced` event using `lodash#debounce`. + * + * This event is an internal plugin event which is fired 200 ms after model selection last change. + * This is to makes easy test debounced action without need to use `setTimeout`. + * + * This function is stored as a plugin property to make possible to cancel + * trailing debounced invocation on destroy. + */ + private readonly _fireSelectionChangeDebounced; + /** + * @inheritDoc + */ + static get pluginName(): "BalloonToolbar"; + /** + * @inheritDoc + */ + static get requires(): readonly [typeof ContextualBalloon]; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * @inheritDoc + */ + init(): void; + /** + * Creates the toolbar view instance. + */ + private _createToolbarView; + /** + * Shows the toolbar and attaches it to the selection. + * + * Fires {@link #event:show} event which can be stopped to prevent the toolbar from showing up. + * + * @param showForCollapsedSelection When set `true`, the toolbar will show despite collapsed selection in the + * editing view. + */ + show(showForCollapsedSelection?: boolean): void; + /** + * Hides the toolbar. + */ + hide(): void; + /** + * Returns positioning options for the {@link #_balloon}. They control the way balloon is attached + * to the selection. + */ + private _getBalloonPositionData; + /** + * Updates the position of the {@link #_balloon} to make up for changes: + * + * * in the geometry of the selection it is attached to (e.g. the selection moved in the viewport or expanded or shrunk), + * * or the geometry of the balloon toolbar itself (e.g. the toolbar has grouped or ungrouped some items and it is shorter or longer). + */ + private _updatePosition; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Returns toolbar positions for the given direction of the selection. + */ + private _getBalloonPositions; +} +/** + * This event is fired just before the toolbar shows up. Stopping this event will prevent this. + * + * @eventName ~BalloonToolbar#show + */ +export type BalloonToolbarShowEvent = { + name: 'show'; + args: []; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.js new file mode 100644 index 0000000..268890e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/balloon/balloontoolbar.js @@ -0,0 +1,297 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/balloon/balloontoolbar + */ +import ContextualBalloon from '../../panel/balloon/contextualballoon.js'; +import ToolbarView from '../toolbarview.js'; +import BalloonPanelView, { generatePositions } from '../../panel/balloon/balloonpanelview.js'; +import normalizeToolbarConfig from '../normalizetoolbarconfig.js'; +import { Plugin } from '@ckeditor/ckeditor5-core'; +import { FocusTracker, Rect, ResizeObserver, env, global, toUnit } from '@ckeditor/ckeditor5-utils'; +import { debounce } from 'lodash-es'; +const toPx = toUnit('px'); +/** + * The contextual toolbar. + * + * It uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon contextual balloon plugin}. + */ +export default class BalloonToolbar extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BalloonToolbar'; + } + /** + * @inheritDoc + */ + static get requires() { + return [ContextualBalloon]; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + /** + * An instance of the resize observer that allows to respond to changes in editable's geometry + * so the toolbar can stay within its boundaries (and group toolbar items that do not fit). + * + * **Note**: Used only when `shouldNotGroupWhenFull` was **not** set in the + * {@link module:core/editor/editorconfig~EditorConfig#balloonToolbar configuration}. + * + * **Note:** Created in {@link #init}. + */ + this._resizeObserver = null; + this._balloonConfig = normalizeToolbarConfig(editor.config.get('balloonToolbar')); + this.toolbarView = this._createToolbarView(); + this.focusTracker = new FocusTracker(); + // Wait for the EditorUI#init. EditableElement is not available before. + editor.ui.once('ready', () => { + this.focusTracker.add(editor.ui.getEditableElement()); + this.focusTracker.add(this.toolbarView.element); + }); + // Register the toolbar so it becomes available for Alt+F10 and Esc navigation. + editor.ui.addToolbar(this.toolbarView, { + beforeFocus: () => this.show(true), + afterBlur: () => this.hide(), + isContextual: true + }); + this._balloon = editor.plugins.get(ContextualBalloon); + this._fireSelectionChangeDebounced = debounce(() => this.fire('_selectionChangeDebounced'), 200); + // The appearance of the BalloonToolbar method is event–driven. + // It is possible to stop the #show event and this prevent the toolbar from showing up. + this.decorate('show'); + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const selection = editor.model.document.selection; + // Show/hide the toolbar on editable focus/blur. + this.listenTo(this.focusTracker, 'change:isFocused', (evt, name, isFocused) => { + const isToolbarVisible = this._balloon.visibleView === this.toolbarView; + if (!isFocused && isToolbarVisible) { + this.hide(); + } + else if (isFocused) { + this.show(); + } + }); + // Hide the toolbar when the selection is changed by a direct change or has changed to collapsed. + this.listenTo(selection, 'change:range', (evt, data) => { + if (data.directChange || selection.isCollapsed) { + this.hide(); + } + // Fire internal `_selectionChangeDebounced` event to use it for showing + // the toolbar after the selection stops changing. + this._fireSelectionChangeDebounced(); + }); + // Show the toolbar when the selection stops changing. + this.listenTo(this, '_selectionChangeDebounced', () => { + if (this.editor.editing.view.document.isFocused) { + this.show(); + } + }); + if (!this._balloonConfig.shouldNotGroupWhenFull) { + this.listenTo(editor, 'ready', () => { + const editableElement = editor.ui.view.editable.element; + // Set #toolbarView's max-width on the initialization and update it on the editable resize. + this._resizeObserver = new ResizeObserver(editableElement, entry => { + // The max-width equals 90% of the editable's width for the best user experience. + // The value keeps the balloon very close to the boundaries of the editable and limits the cases + // when the balloon juts out from the editable element it belongs to. + this.toolbarView.maxWidth = toPx(entry.contentRect.width * .9); + }); + }); + } + // Listen to the toolbar view and whenever it changes its geometry due to some items being + // grouped or ungrouped, update the position of the balloon because a shorter/longer toolbar + // means the balloon could be pointing at the wrong place. Once updated, the balloon will point + // at the right selection in the content again. + // https://github.com/ckeditor/ckeditor5/issues/6444 + this.listenTo(this.toolbarView, 'groupedItemsUpdate', () => { + this._updatePosition(); + }); + // Creates toolbar components based on given configuration. + // This needs to be done when all plugins are ready. + editor.ui.once('ready', () => { + this.toolbarView.fillFromConfig(this._balloonConfig, this.editor.ui.componentFactory); + }); + } + /** + * Creates the toolbar view instance. + */ + _createToolbarView() { + const t = this.editor.locale.t; + const shouldGroupWhenFull = !this._balloonConfig.shouldNotGroupWhenFull; + const toolbarView = new ToolbarView(this.editor.locale, { + shouldGroupWhenFull, + isFloating: true + }); + toolbarView.ariaLabel = t('Editor contextual toolbar'); + toolbarView.render(); + return toolbarView; + } + /** + * Shows the toolbar and attaches it to the selection. + * + * Fires {@link #event:show} event which can be stopped to prevent the toolbar from showing up. + * + * @param showForCollapsedSelection When set `true`, the toolbar will show despite collapsed selection in the + * editing view. + */ + show(showForCollapsedSelection = false) { + const editor = this.editor; + const selection = editor.model.document.selection; + const schema = editor.model.schema; + // Do not add the toolbar to the balloon stack twice. + if (this._balloon.hasView(this.toolbarView)) { + return; + } + // Do not show the toolbar when the selection is collapsed. + if (selection.isCollapsed && !showForCollapsedSelection) { + return; + } + // Do not show the toolbar when there is more than one range in the selection and they fully contain selectable elements. + // See https://github.com/ckeditor/ckeditor5/issues/6443. + if (selectionContainsOnlyMultipleSelectables(selection, schema)) { + return; + } + // Don not show the toolbar when all components inside are disabled + // see https://github.com/ckeditor/ckeditor5-ui/issues/269. + if (Array.from(this.toolbarView.items).every((item) => item.isEnabled !== undefined && !item.isEnabled)) { + return; + } + // Update the toolbar position when the editor ui should be refreshed. + this.listenTo(this.editor.ui, 'update', () => { + this._updatePosition(); + }); + // Add the toolbar to the common editor contextual balloon. + this._balloon.add({ + view: this.toolbarView, + position: this._getBalloonPositionData(), + balloonClassName: 'ck-toolbar-container' + }); + } + /** + * Hides the toolbar. + */ + hide() { + if (this._balloon.hasView(this.toolbarView)) { + this.stopListening(this.editor.ui, 'update'); + this._balloon.remove(this.toolbarView); + } + } + /** + * Returns positioning options for the {@link #_balloon}. They control the way balloon is attached + * to the selection. + */ + _getBalloonPositionData() { + const editor = this.editor; + const view = editor.editing.view; + const viewDocument = view.document; + const viewSelection = viewDocument.selection; + // Get direction of the selection. + const isBackward = viewDocument.selection.isBackward; + return { + // Because the target for BalloonPanelView is a Rect (not DOMRange), it's geometry will stay fixed + // as the window scrolls. To let the BalloonPanelView follow such Rect, is must be continuously + // computed and hence, the target is defined as a function instead of a static value. + // https://github.com/ckeditor/ckeditor5-ui/issues/195 + target: () => { + const range = isBackward ? viewSelection.getFirstRange() : viewSelection.getLastRange(); + const rangeRects = Rect.getDomRangeRects(view.domConverter.viewRangeToDom(range)); + // Select the proper range rect depending on the direction of the selection. + if (isBackward) { + return rangeRects[0]; + } + else { + // Ditch the zero-width "orphan" rect in the next line for the forward selection if there's + // another one preceding it. It is not rendered as a selection by the web browser anyway. + // https://github.com/ckeditor/ckeditor5-ui/issues/308 + if (rangeRects.length > 1 && rangeRects[rangeRects.length - 1].width === 0) { + rangeRects.pop(); + } + return rangeRects[rangeRects.length - 1]; + } + }, + positions: this._getBalloonPositions(isBackward) + }; + } + /** + * Updates the position of the {@link #_balloon} to make up for changes: + * + * * in the geometry of the selection it is attached to (e.g. the selection moved in the viewport or expanded or shrunk), + * * or the geometry of the balloon toolbar itself (e.g. the toolbar has grouped or ungrouped some items and it is shorter or longer). + */ + _updatePosition() { + this._balloon.updatePosition(this._getBalloonPositionData()); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + this.stopListening(); + this._fireSelectionChangeDebounced.cancel(); + this.toolbarView.destroy(); + this.focusTracker.destroy(); + if (this._resizeObserver) { + this._resizeObserver.destroy(); + } + } + /** + * Returns toolbar positions for the given direction of the selection. + */ + _getBalloonPositions(isBackward) { + const isSafariIniOS = env.isSafari && env.isiOS; + // https://github.com/ckeditor/ckeditor5/issues/7707 + const positions = isSafariIniOS ? generatePositions({ + // 20px when zoomed out. Less then 20px when zoomed in; the "radius" of the native selection handle gets + // smaller as the user zooms in. No less than the default v-offset, though. + heightOffset: Math.max(BalloonPanelView.arrowHeightOffset, Math.round(20 / global.window.visualViewport.scale)) + }) : BalloonPanelView.defaultPositions; + return isBackward ? [ + positions.northWestArrowSouth, + positions.northWestArrowSouthWest, + positions.northWestArrowSouthEast, + positions.northWestArrowSouthMiddleEast, + positions.northWestArrowSouthMiddleWest, + positions.southWestArrowNorth, + positions.southWestArrowNorthWest, + positions.southWestArrowNorthEast, + positions.southWestArrowNorthMiddleWest, + positions.southWestArrowNorthMiddleEast + ] : [ + positions.southEastArrowNorth, + positions.southEastArrowNorthEast, + positions.southEastArrowNorthWest, + positions.southEastArrowNorthMiddleEast, + positions.southEastArrowNorthMiddleWest, + positions.northEastArrowSouth, + positions.northEastArrowSouthEast, + positions.northEastArrowSouthWest, + positions.northEastArrowSouthMiddleEast, + positions.northEastArrowSouthMiddleWest + ]; + } +} +/** + * Returns "true" when the selection has multiple ranges and each range contains a selectable element + * and nothing else. + */ +function selectionContainsOnlyMultipleSelectables(selection, schema) { + // It doesn't contain multiple objects if there is only one range. + if (selection.rangeCount === 1) { + return false; + } + return [...selection.getRanges()].every(range => { + const element = range.getContainedElement(); + return element && schema.isSelectable(element); + }); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.d.ts new file mode 100644 index 0000000..1c224aa --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.d.ts @@ -0,0 +1,35 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/block/blockbuttonview + */ +import ButtonView from '../../button/buttonview.js'; +import { type Locale } from '@ckeditor/ckeditor5-utils'; +import '../../../theme/components/toolbar/blocktoolbar.css'; +/** + * The block button view class. + * + * This view represents a button attached next to block element where the selection is anchored. + * + * See {@link module:ui/toolbar/block/blocktoolbar~BlockToolbar}. + */ +export default class BlockButtonView extends ButtonView { + /** + * Top offset. + * + * @observable + */ + top: number; + /** + * Left offset. + * + * @observable + */ + left: number; + /** + * @inheritDoc + */ + constructor(locale?: Locale); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.js new file mode 100644 index 0000000..1fe962f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blockbuttonview.js @@ -0,0 +1,41 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/block/blockbuttonview + */ +import ButtonView from '../../button/buttonview.js'; +import { toUnit } from '@ckeditor/ckeditor5-utils'; +import '../../../theme/components/toolbar/blocktoolbar.css'; +const toPx = toUnit('px'); +/** + * The block button view class. + * + * This view represents a button attached next to block element where the selection is anchored. + * + * See {@link module:ui/toolbar/block/blocktoolbar~BlockToolbar}. + */ +export default class BlockButtonView extends ButtonView { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + const bind = this.bindTemplate; + // Hide button on init. + this.isVisible = false; + this.isToggleable = true; + this.set('top', 0); + this.set('left', 0); + this.extendTemplate({ + attributes: { + class: 'ck-block-toolbar-button', + style: { + top: bind.to('top', val => toPx(val)), + left: bind.to('left', val => toPx(val)) + } + } + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.d.ts new file mode 100644 index 0000000..8da37ba --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.d.ts @@ -0,0 +1,153 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/block/blocktoolbar + */ +import { Plugin, type Editor } from '@ckeditor/ckeditor5-core'; +import BlockButtonView from './blockbuttonview.js'; +import BalloonPanelView from '../../panel/balloon/balloonpanelview.js'; +import ToolbarView from '../toolbarview.js'; +/** + * The block toolbar plugin. + * + * This plugin provides a button positioned next to the block of content where the selection is anchored. + * Upon clicking the button, a dropdown providing access to editor features shows up, as configured in + * {@link module:core/editor/editorconfig~EditorConfig#blockToolbar}. + * + * By default, the button is displayed next to all elements marked in {@link module:engine/model/schema~Schema} + * as `$block` for which the toolbar provides at least one option. + * + * By default, the button is attached so its right boundary is touching the + * {@link module:engine/view/editableelement~EditableElement}: + * + * ``` + * __ | + * | || This is a block of content that the + * ¯¯ | button is attached to. This is a + * | block of content that the button is + * | attached to. + * ``` + * + * The position of the button can be adjusted using the CSS `transform` property: + * + * ```css + * .ck-block-toolbar-button { + * transform: translateX( -10px ); + * } + * ``` + * + * ``` + * __ | + * | | | This is a block of content that the + * ¯¯ | button is attached to. This is a + * | block of content that the button is + * | attached to. + * ``` + * + * **Note**: If you plan to run the editor in a right–to–left (RTL) language, keep in mind the button + * will be attached to the **right** boundary of the editable area. In that case, make sure the + * CSS position adjustment works properly by adding the following styles: + * + * ```css + * .ck[dir="rtl"] .ck-block-toolbar-button { + * transform: translateX( 10px ); + * } + * ``` + */ +export default class BlockToolbar extends Plugin { + /** + * The toolbar view. + */ + readonly toolbarView: ToolbarView; + /** + * The balloon panel view, containing the {@link #toolbarView}. + */ + readonly panelView: BalloonPanelView; + /** + * The button view that opens the {@link #toolbarView}. + */ + readonly buttonView: BlockButtonView; + /** + * An instance of the resize observer that allows to respond to changes in editable's geometry + * so the toolbar can stay within its boundaries (and group toolbar items that do not fit). + * + * **Note**: Used only when `shouldNotGroupWhenFull` was **not** set in the + * {@link module:core/editor/editorconfig~EditorConfig#blockToolbar configuration}. + */ + private _resizeObserver; + /** + * A cached and normalized `config.blockToolbar` object. + */ + private _blockToolbarConfig; + /** + * @inheritDoc + */ + static get pluginName(): "BlockToolbar"; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * @inheritDoc + */ + init(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Creates the {@link #toolbarView}. + */ + private _createToolbarView; + /** + * Creates the {@link #panelView}. + */ + private _createPanelView; + /** + * Creates the {@link #buttonView}. + */ + private _createButtonView; + /** + * Shows or hides the button. + * When all the conditions for displaying the button are matched, it shows the button. Hides otherwise. + */ + private _updateButton; + /** + * Hides the button. + */ + private _hideButton; + /** + * Shows the {@link #toolbarView} attached to the {@link #buttonView}. + * If the toolbar is already visible, then it simply repositions it. + */ + private _showPanel; + /** + * Returns currently selected editable, based on the model selection. + */ + private _getSelectedEditableElement; + /** + * Hides the {@link #toolbarView}. + * + * @param focusEditable When `true`, the editable will be focused after hiding the panel. + */ + private _hidePanel; + /** + * Attaches the {@link #buttonView} to the target block of content. + * + * @param targetElement Target element. + */ + private _attachButtonToElement; + /** + * Creates a resize observer that observes selected editable and resizes the toolbar panel accordingly. + */ + private _setupToolbarResize; + /** + * Gets the {@link #toolbarView} max-width, based on given `editableElement` width plus the distance between the farthest + * edge of the {@link #buttonView} and the editable. + * + * @returns A maximum width that toolbar can have, in pixels. + */ + private _getToolbarMaxWidth; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.js new file mode 100644 index 0000000..89d84e3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/block/blocktoolbar.js @@ -0,0 +1,390 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/block/blocktoolbar + */ +/* global window */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import { Rect, ResizeObserver, toUnit } from '@ckeditor/ckeditor5-utils'; +import BlockButtonView from './blockbuttonview.js'; +import BalloonPanelView from '../../panel/balloon/balloonpanelview.js'; +import ToolbarView, { NESTED_TOOLBAR_ICONS } from '../toolbarview.js'; +import clickOutsideHandler from '../../bindings/clickoutsidehandler.js'; +import normalizeToolbarConfig from '../normalizetoolbarconfig.js'; +const toPx = toUnit('px'); +/** + * The block toolbar plugin. + * + * This plugin provides a button positioned next to the block of content where the selection is anchored. + * Upon clicking the button, a dropdown providing access to editor features shows up, as configured in + * {@link module:core/editor/editorconfig~EditorConfig#blockToolbar}. + * + * By default, the button is displayed next to all elements marked in {@link module:engine/model/schema~Schema} + * as `$block` for which the toolbar provides at least one option. + * + * By default, the button is attached so its right boundary is touching the + * {@link module:engine/view/editableelement~EditableElement}: + * + * ``` + * __ | + * | || This is a block of content that the + * ¯¯ | button is attached to. This is a + * | block of content that the button is + * | attached to. + * ``` + * + * The position of the button can be adjusted using the CSS `transform` property: + * + * ```css + * .ck-block-toolbar-button { + * transform: translateX( -10px ); + * } + * ``` + * + * ``` + * __ | + * | | | This is a block of content that the + * ¯¯ | button is attached to. This is a + * | block of content that the button is + * | attached to. + * ``` + * + * **Note**: If you plan to run the editor in a right–to–left (RTL) language, keep in mind the button + * will be attached to the **right** boundary of the editable area. In that case, make sure the + * CSS position adjustment works properly by adding the following styles: + * + * ```css + * .ck[dir="rtl"] .ck-block-toolbar-button { + * transform: translateX( 10px ); + * } + * ``` + */ +export default class BlockToolbar extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'BlockToolbar'; + } + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + /** + * An instance of the resize observer that allows to respond to changes in editable's geometry + * so the toolbar can stay within its boundaries (and group toolbar items that do not fit). + * + * **Note**: Used only when `shouldNotGroupWhenFull` was **not** set in the + * {@link module:core/editor/editorconfig~EditorConfig#blockToolbar configuration}. + */ + this._resizeObserver = null; + this._blockToolbarConfig = normalizeToolbarConfig(this.editor.config.get('blockToolbar')); + this.toolbarView = this._createToolbarView(); + this.panelView = this._createPanelView(); + this.buttonView = this._createButtonView(); + // Close the #panelView upon clicking outside of the plugin UI. + clickOutsideHandler({ + emitter: this.panelView, + contextElements: [this.panelView.element, this.buttonView.element], + activator: () => this.panelView.isVisible, + callback: () => this._hidePanel() + }); + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + const editBlockText = t('Click to edit block'); + const dragToMoveText = t('Drag to move'); + const editBlockLabel = t('Edit block'); + const isDragDropBlockToolbarPluginLoaded = editor.plugins.has('DragDropBlockToolbar'); + const label = isDragDropBlockToolbarPluginLoaded ? `${editBlockText}\n${dragToMoveText}` : editBlockLabel; + this.buttonView.label = label; + if (isDragDropBlockToolbarPluginLoaded) { + this.buttonView.element.dataset.ckeTooltipClass = 'ck-tooltip_multi-line'; + } + // Hides panel on a direct selection change. + this.listenTo(editor.model.document.selection, 'change:range', (evt, data) => { + if (data.directChange) { + this._hidePanel(); + } + }); + this.listenTo(editor.ui, 'update', () => this._updateButton()); + // `low` priority is used because of https://github.com/ckeditor/ckeditor5-core/issues/133. + this.listenTo(editor, 'change:isReadOnly', () => this._updateButton(), { priority: 'low' }); + this.listenTo(editor.ui.focusTracker, 'change:isFocused', () => this._updateButton()); + // Reposition button on resize. + this.listenTo(this.buttonView, 'change:isVisible', (evt, name, isVisible) => { + if (isVisible) { + // Keep correct position of button and panel on window#resize. + this.buttonView.listenTo(window, 'resize', () => this._updateButton()); + } + else { + // Stop repositioning button when is hidden. + this.buttonView.stopListening(window, 'resize'); + // Hide the panel when the button disappears. + this._hidePanel(); + } + }); + // Register the toolbar so it becomes available for Alt+F10 and Esc navigation. + editor.ui.addToolbar(this.toolbarView, { + beforeFocus: () => this._showPanel(), + afterBlur: () => this._hidePanel() + }); + // Fills the toolbar with its items based on the configuration. + // This needs to be done after all plugins are ready. + editor.ui.once('ready', () => { + this.toolbarView.fillFromConfig(this._blockToolbarConfig, this.editor.ui.componentFactory); + // Hide panel before executing each button in the panel. + for (const item of this.toolbarView.items) { + item.on('execute', () => this._hidePanel(true), { priority: 'high' }); + } + }); + } + /** + * @inheritDoc + */ + destroy() { + super.destroy(); + // Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341). + this.panelView.destroy(); + this.buttonView.destroy(); + this.toolbarView.destroy(); + if (this._resizeObserver) { + this._resizeObserver.destroy(); + } + } + /** + * Creates the {@link #toolbarView}. + */ + _createToolbarView() { + const t = this.editor.locale.t; + const shouldGroupWhenFull = !this._blockToolbarConfig.shouldNotGroupWhenFull; + const toolbarView = new ToolbarView(this.editor.locale, { + shouldGroupWhenFull, + isFloating: true + }); + toolbarView.ariaLabel = t('Editor block content toolbar'); + return toolbarView; + } + /** + * Creates the {@link #panelView}. + */ + _createPanelView() { + const editor = this.editor; + const panelView = new BalloonPanelView(editor.locale); + panelView.content.add(this.toolbarView); + panelView.class = 'ck-toolbar-container'; + editor.ui.view.body.add(panelView); + editor.ui.focusTracker.add(panelView.element); + // Close #panelView on `Esc` press. + this.toolbarView.keystrokes.set('Esc', (evt, cancel) => { + this._hidePanel(true); + cancel(); + }); + return panelView; + } + /** + * Creates the {@link #buttonView}. + */ + _createButtonView() { + const editor = this.editor; + const t = editor.t; + const buttonView = new BlockButtonView(editor.locale); + const iconFromConfig = this._blockToolbarConfig.icon; + const icon = NESTED_TOOLBAR_ICONS[iconFromConfig] || iconFromConfig || NESTED_TOOLBAR_ICONS.dragIndicator; + buttonView.set({ + label: t('Edit block'), + icon, + withText: false + }); + // Bind the panelView observable properties to the buttonView. + buttonView.bind('isOn').to(this.panelView, 'isVisible'); + buttonView.bind('tooltip').to(this.panelView, 'isVisible', isVisible => !isVisible); + // Toggle the panelView upon buttonView#execute. + this.listenTo(buttonView, 'execute', () => { + if (!this.panelView.isVisible) { + this._showPanel(); + } + else { + this._hidePanel(true); + } + }); + editor.ui.view.body.add(buttonView); + editor.ui.focusTracker.add(buttonView.element); + return buttonView; + } + /** + * Shows or hides the button. + * When all the conditions for displaying the button are matched, it shows the button. Hides otherwise. + */ + _updateButton() { + const editor = this.editor; + const model = editor.model; + const view = editor.editing.view; + // Hides the button when the editor is not focused. + if (!editor.ui.focusTracker.isFocused) { + this._hideButton(); + return; + } + // Hides the button when the selection is in non-editable place. + if (!editor.model.canEditAt(editor.model.document.selection)) { + this._hideButton(); + return; + } + // Get the first selected block, button will be attached to this element. + const modelTarget = Array.from(model.document.selection.getSelectedBlocks())[0]; + // Hides the button when there is no enabled item in toolbar for the current block element. + if (!modelTarget || Array.from(this.toolbarView.items).every((item) => !item.isEnabled)) { + this._hideButton(); + return; + } + // Get DOM target element. + const domTarget = view.domConverter.mapViewToDom(editor.editing.mapper.toViewElement(modelTarget)); + // Show block button. + this.buttonView.isVisible = true; + // Make sure that the block toolbar panel is resized properly. + this._setupToolbarResize(); + // Attach block button to target DOM element. + this._attachButtonToElement(domTarget); + // When panel is opened then refresh it position to be properly aligned with block button. + if (this.panelView.isVisible) { + this._showPanel(); + } + } + /** + * Hides the button. + */ + _hideButton() { + this.buttonView.isVisible = false; + } + /** + * Shows the {@link #toolbarView} attached to the {@link #buttonView}. + * If the toolbar is already visible, then it simply repositions it. + */ + _showPanel() { + // Usually, the only way to show the toolbar is by pressing the block button. It makes it impossible for + // the toolbar to show up when the button is invisible (feature does not make sense for the selection then). + // The toolbar navigation using Alt+F10 does not access the button but shows the panel directly using this method. + // So we need to check whether this is possible first. + if (!this.buttonView.isVisible) { + return; + } + const wasVisible = this.panelView.isVisible; + // So here's the thing: If there was no initial panelView#show() or these two were in different order, the toolbar + // positioning will break in RTL editors. Weird, right? What you show know is that the toolbar + // grouping works thanks to: + // + // * the ResizeObserver, which kicks in as soon as the toolbar shows up in DOM (becomes visible again). + // * the observable ToolbarView#maxWidth, which triggers re-grouping when changed. + // + // Here are the possible scenarios: + // + // 1. (WRONG ❌) If the #maxWidth is set when the toolbar is invisible, it won't affect item grouping (no DOMRects, no grouping). + // Then, when panelView.pin() is called, the position of the toolbar will be calculated for the old + // items grouping state, and when finally ResizeObserver kicks in (hey, the toolbar is visible now, right?) + // it will group/ungroup some items and the length of the toolbar will change. But since in RTL the toolbar + // is attached on the right side and the positioning uses CSS "left", it will result in the toolbar shifting + // to the left and being displayed in the wrong place. + // 2. (WRONG ❌) If the panelView.pin() is called first and #maxWidth set next, then basically the story repeats. The balloon + // calculates the position for the old toolbar grouping state, then the toolbar re-groups items and because + // it is positioned using CSS "left" it will move. + // 3. (RIGHT ✅) We show the panel first (the toolbar does re-grouping but it does not matter), then the #maxWidth + // is set allowing the toolbar to re-group again and finally panelView.pin() does the positioning when the + // items grouping state is stable and final. + // + // https://github.com/ckeditor/ckeditor5/issues/6449, https://github.com/ckeditor/ckeditor5/issues/6575 + this.panelView.show(); + const editableElement = this._getSelectedEditableElement(); + this.toolbarView.maxWidth = this._getToolbarMaxWidth(editableElement); + this.panelView.pin({ + target: this.buttonView.element, + limiter: editableElement + }); + if (!wasVisible) { + this.toolbarView.items.get(0).focus(); + } + } + /** + * Returns currently selected editable, based on the model selection. + */ + _getSelectedEditableElement() { + const selectedModelRootName = this.editor.model.document.selection.getFirstRange().root.rootName; + return this.editor.ui.getEditableElement(selectedModelRootName); + } + /** + * Hides the {@link #toolbarView}. + * + * @param focusEditable When `true`, the editable will be focused after hiding the panel. + */ + _hidePanel(focusEditable) { + this.panelView.isVisible = false; + if (focusEditable) { + this.editor.editing.view.focus(); + } + } + /** + * Attaches the {@link #buttonView} to the target block of content. + * + * @param targetElement Target element. + */ + _attachButtonToElement(targetElement) { + const contentStyles = window.getComputedStyle(targetElement); + const editableRect = new Rect(this._getSelectedEditableElement()); + const contentPaddingTop = parseInt(contentStyles.paddingTop, 10); + // When line height is not an integer then treat it as "normal". + // MDN says that 'normal' == ~1.2 on desktop browsers. + const contentLineHeight = parseInt(contentStyles.lineHeight, 10) || parseInt(contentStyles.fontSize, 10) * 1.2; + const buttonRect = new Rect(this.buttonView.element); + const contentRect = new Rect(targetElement); + let positionLeft; + if (this.editor.locale.uiLanguageDirection === 'ltr') { + positionLeft = editableRect.left - buttonRect.width; + } + else { + positionLeft = editableRect.right; + } + const positionTop = contentRect.top + contentPaddingTop + (contentLineHeight - buttonRect.height) / 2; + buttonRect.moveTo(positionLeft, positionTop); + const absoluteButtonRect = buttonRect.toAbsoluteRect(); + this.buttonView.top = absoluteButtonRect.top; + this.buttonView.left = absoluteButtonRect.left; + } + /** + * Creates a resize observer that observes selected editable and resizes the toolbar panel accordingly. + */ + _setupToolbarResize() { + const editableElement = this._getSelectedEditableElement(); + // Do this only if the automatic grouping is turned on. + if (!this._blockToolbarConfig.shouldNotGroupWhenFull) { + // If resize observer is attached to a different editable than currently selected editable, re-attach it. + if (this._resizeObserver && this._resizeObserver.element !== editableElement) { + this._resizeObserver.destroy(); + this._resizeObserver = null; + } + if (!this._resizeObserver) { + this._resizeObserver = new ResizeObserver(editableElement, () => { + this.toolbarView.maxWidth = this._getToolbarMaxWidth(editableElement); + }); + } + } + } + /** + * Gets the {@link #toolbarView} max-width, based on given `editableElement` width plus the distance between the farthest + * edge of the {@link #buttonView} and the editable. + * + * @returns A maximum width that toolbar can have, in pixels. + */ + _getToolbarMaxWidth(editableElement) { + const editableRect = new Rect(editableElement); + const buttonRect = new Rect(this.buttonView.element); + const isRTL = this.editor.locale.uiLanguageDirection === 'rtl'; + const offset = isRTL ? (buttonRect.left - editableRect.right) + buttonRect.width : editableRect.left - buttonRect.left; + return toPx(editableRect.width + offset); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.d.ts new file mode 100644 index 0000000..c75f4dd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.d.ts @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { ToolbarConfig, ToolbarConfigItem } from '@ckeditor/ckeditor5-core'; +/** + * @module ui/toolbar/normalizetoolbarconfig + */ +/** + * Normalizes the toolbar configuration (`config.toolbar`), which: + * + * * may be defined as an `Array`: + * + * ``` + * toolbar: [ 'heading', 'bold', 'italic', 'link', ... ] + * ``` + * + * * or an `Object`: + * + * ``` + * toolbar: { + * items: [ 'heading', 'bold', 'italic', 'link', ... ], + * removeItems: [ 'bold' ], + * ... + * } + * ``` + * + * * or may not be defined at all (`undefined`) + * + * and returns it in the object form. + * + * @param config The value of `config.toolbar`. + * @returns A normalized toolbar config object. + */ +export default function normalizeToolbarConfig(config: ToolbarConfig | undefined): { + items: Array; + removeItems: Array; + shouldNotGroupWhenFull?: boolean; + icon?: string; +}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js new file mode 100644 index 0000000..e3a6589 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/normalizetoolbarconfig.js @@ -0,0 +1,52 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/normalizetoolbarconfig + */ +/** + * Normalizes the toolbar configuration (`config.toolbar`), which: + * + * * may be defined as an `Array`: + * + * ``` + * toolbar: [ 'heading', 'bold', 'italic', 'link', ... ] + * ``` + * + * * or an `Object`: + * + * ``` + * toolbar: { + * items: [ 'heading', 'bold', 'italic', 'link', ... ], + * removeItems: [ 'bold' ], + * ... + * } + * ``` + * + * * or may not be defined at all (`undefined`) + * + * and returns it in the object form. + * + * @param config The value of `config.toolbar`. + * @returns A normalized toolbar config object. + */ +export default function normalizeToolbarConfig(config) { + if (Array.isArray(config)) { + return { + items: config, + removeItems: [] + }; + } + const predefinedConfigOptions = { + items: [], + removeItems: [] + }; + if (!config) { + return predefinedConfigOptions; + } + return { + ...predefinedConfigOptions, + ...config + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.d.ts new file mode 100644 index 0000000..5feadb1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.d.ts @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/toolbarlinebreakview + */ +import View from '../view.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The toolbar line break view class. + */ +export default class ToolbarLineBreakView extends View { + /** + * @inheritDoc + */ + constructor(locale?: Locale); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.js new file mode 100644 index 0000000..cc0a2b6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarlinebreakview.js @@ -0,0 +1,28 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/toolbarlinebreakview + */ +import View from '../view.js'; +/** + * The toolbar line break view class. + */ +export default class ToolbarLineBreakView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-toolbar__line-break' + ] + } + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.d.ts new file mode 100644 index 0000000..253854d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.d.ts @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/toolbarseparatorview + */ +import View from '../view.js'; +import type { Locale } from '@ckeditor/ckeditor5-utils'; +/** + * The toolbar separator view class. + */ +export default class ToolbarSeparatorView extends View { + /** + * @inheritDoc + */ + constructor(locale?: Locale); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.js new file mode 100644 index 0000000..e139cbc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarseparatorview.js @@ -0,0 +1,28 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/toolbarseparatorview + */ +import View from '../view.js'; +/** + * The toolbar separator view class. + */ +export default class ToolbarSeparatorView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-toolbar__separator' + ] + } + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.d.ts new file mode 100644 index 0000000..cad4c06 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.d.ts @@ -0,0 +1,267 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/toolbarview + */ +import View from '../view.js'; +import { type FocusableView } from '../focuscycler.js'; +import type ComponentFactory from '../componentfactory.js'; +import type ViewCollection from '../viewcollection.js'; +import type DropdownPanelFocusable from '../dropdown/dropdownpanelfocusable.js'; +import { FocusTracker, KeystrokeHandler, type Locale } from '@ckeditor/ckeditor5-utils'; +import { type ToolbarConfig } from '@ckeditor/ckeditor5-core'; +import '../../theme/components/toolbar/toolbar.css'; +export declare const NESTED_TOOLBAR_ICONS: Record; +/** + * The toolbar view class. + */ +export default class ToolbarView extends View implements DropdownPanelFocusable { + /** + * A reference to the options object passed to the constructor. + */ + readonly options: ToolbarOptions; + /** + * A collection of toolbar items (buttons, dropdowns, etc.). + */ + readonly items: ViewCollection; + /** + * Tracks information about the DOM focus in the toolbar. + */ + readonly focusTracker: FocusTracker; + /** + * An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler} + * to handle keyboard navigation in the toolbar. + */ + readonly keystrokes: KeystrokeHandler; + /** + * A (child) view containing {@link #items toolbar items}. + */ + readonly itemsView: ItemsView; + /** + * A top–level collection aggregating building blocks of the toolbar. + * + * ┌───────────────── ToolbarView ─────────────────┐ + * | ┌──────────────── #children ────────────────┐ | + * | | ┌──────────── #itemsView ───────────┐ | | + * | | | [ item1 ] [ item2 ] ... [ itemN ] | | | + * | | └──────────────────────────────────-┘ | | + * | └───────────────────────────────────────────┘ | + * └───────────────────────────────────────────────┘ + * + * By default, it contains the {@link #itemsView} but it can be extended with additional + * UI elements when necessary. + */ + readonly children: ViewCollection; + /** + * A collection of {@link #items} that take part in the focus cycling + * (i.e. navigation using the keyboard). Usually, it contains a subset of {@link #items} with + * some optional UI elements that also belong to the toolbar and should be focusable + * by the user. + */ + readonly focusables: ViewCollection; + locale: Locale; + /** + * Label used by assistive technologies to describe this toolbar element. + * + * @observable + * @default 'Editor toolbar' + */ + ariaLabel: string; + /** + * The maximum width of the toolbar element. + * + * **Note**: When set to a specific value (e.g. `'200px'`), the value will affect the behavior of the + * {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull} + * option by changing the number of {@link #items} that will be displayed in the toolbar at a time. + * + * @observable + * @default 'auto' + */ + maxWidth: string; + /** + * An additional CSS class added to the {@link #element}. + * + * @observable + * @member {String} #class + */ + class: string | undefined; + /** + * When set true, makes the toolbar look compact with {@link #element}. + * + * @observable + * @default false + */ + isCompact: boolean; + /** + * Controls the orientation of toolbar items. Only available when + * {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull dynamic items grouping} + * is **disabled**. + * + * @observable + */ + isVertical: boolean; + /** + * Helps cycling over {@link #focusables focusable items} in the toolbar. + */ + private readonly _focusCycler; + /** + * An instance of the active toolbar behavior that shapes its look and functionality. + * + * See {@link module:ui/toolbar/toolbarview~ToolbarBehavior} to learn more. + */ + private readonly _behavior; + /** + * Creates an instance of the {@link module:ui/toolbar/toolbarview~ToolbarView} class. + * + * Also see {@link #render}. + * + * @param locale The localization services instance. + * @param options Configuration options of the toolbar. + */ + constructor(locale: Locale, options?: ToolbarOptions); + /** + * @inheritDoc + */ + render(): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * Focuses the first focusable in {@link #focusables}. + */ + focus(): void; + /** + * Focuses the last focusable in {@link #focusables}. + */ + focusLast(): void; + /** + * A utility that expands the plain toolbar configuration into + * {@link module:ui/toolbar/toolbarview~ToolbarView#items} using a given component factory. + * + * @param itemsOrConfig The toolbar items or the entire toolbar configuration object. + * @param factory A factory producing toolbar items. + * @param removeItems An array of items names to be removed from the configuration. When present, applies + * to this toolbar and all nested ones as well. + */ + fillFromConfig(itemsOrConfig: ToolbarConfig | undefined, factory: ComponentFactory, removeItems?: Array): void; + /** + * A utility that expands the plain toolbar configuration into a list of view items using a given component factory. + * + * @param itemsOrConfig The toolbar items or the entire toolbar configuration object. + * @param factory A factory producing toolbar items. + * @param removeItems An array of items names to be removed from the configuration. When present, applies + * to this toolbar and all nested ones as well. + */ + private _buildItemsFromConfig; + /** + * Cleans up the {@link module:ui/toolbar/toolbarview~ToolbarView#items} of the toolbar by removing unwanted items and + * duplicated (obsolete) separators or line breaks. + * + * @param items The toolbar items configuration. + * @param factory A factory producing toolbar items. + * @param removeItems An array of items names to be removed from the configuration. + * @returns Items after the clean-up. + */ + private _cleanItemsConfiguration; + /** + * Remove leading, trailing, and duplicated separators (`-` and `|`). + * + * @returns Toolbar items after the separator and line break clean-up. + */ + private _cleanSeparatorsAndLineBreaks; + /** + * Creates a user-defined dropdown containing a toolbar with items. + * + * @param definition A definition of the nested toolbar dropdown. + * @param definition.label A label of the dropdown. + * @param definition.icon An icon of the drop-down. One of 'bold', 'plus', 'text', 'importExport', 'alignLeft', + * 'paragraph' or an SVG string. When `false` is passed, no icon will be used. + * @param definition.withText When set `true`, the label of the dropdown will be visible. See + * {@link module:ui/button/buttonview~ButtonView#withText} to learn more. + * @param definition.tooltip A tooltip of the dropdown button. See + * {@link module:ui/button/buttonview~ButtonView#tooltip} to learn more. Defaults to `true`. + * @param componentFactory Component factory used to create items + * of the nested toolbar. + */ + private _createNestedToolbarDropdown; +} +/** + * Fired when some toolbar {@link ~ToolbarView#items} were grouped or ungrouped as a result of some change + * in the toolbar geometry. + * + * **Note**: This event is always fired **once** regardless of the number of items that were be + * grouped or ungrouped at a time. + * + * **Note**: This event is fired only if the items grouping functionality was enabled in + * the first place (see {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull}). + * + * @eventName ~ToolbarView#groupedItemsUpdate + */ +export type ToolbarViewGroupedItemsUpdateEvent = { + name: 'groupedItemsUpdate'; + args: []; +}; +/** + * An inner block of the {@link module:ui/toolbar/toolbarview~ToolbarView} hosting its + * {@link module:ui/toolbar/toolbarview~ToolbarView#items}. + */ +declare class ItemsView extends View { + /** + * A collection of items (buttons, dropdowns, etc.). + */ + readonly children: ViewCollection; + /** + * @inheritDoc + */ + constructor(locale?: Locale); +} +/** + * Options passed to the {@link module:ui/toolbar/toolbarview~ToolbarView#constructor} of the toolbar. + */ +export interface ToolbarOptions { + /** + * When set to `true`, the toolbar will automatically group {@link module:ui/toolbar/toolbarview~ToolbarView#items} that + * would normally wrap to the next line when there is not enough space to display them in a single row, for + * instance, if the parent container of the toolbar is narrow. For toolbars in absolutely positioned containers + * without width restrictions also the {@link module:ui/toolbar/toolbarview~ToolbarOptions#isFloating} option is required to be `true`. + * + * See also: {@link module:ui/toolbar/toolbarview~ToolbarView#maxWidth}. + */ + shouldGroupWhenFull?: boolean; + /** + * This option should be enabled for toolbars in absolutely positioned containers without width restrictions + * to enable automatic {@link module:ui/toolbar/toolbarview~ToolbarView#items} grouping. + * When this option is set to `true`, the items will stop wrapping to the next line + * and together with {@link module:ui/toolbar/toolbarview~ToolbarOptions#shouldGroupWhenFull}, + * this will allow grouping them when there is not enough space in a single row. + */ + isFloating?: boolean; +} +/** + * A class interface defining the behavior of the {@link module:ui/toolbar/toolbarview~ToolbarView}. + * + * Toolbar behaviors extend its look and functionality and have an impact on the + * {@link module:ui/toolbar/toolbarview~ToolbarView#element} template or + * {@link module:ui/toolbar/toolbarview~ToolbarView#render rendering}. They can be enabled + * conditionally, e.g. depending on the configuration of the toolbar. + */ +export interface ToolbarBehavior { + /** + * A method called after the toolbar has been {@link module:ui/toolbar/toolbarview~ToolbarView#render rendered}. + * It can be used to, for example, customize the behavior of the toolbar when its + * {@link module:ui/toolbar/toolbarview~ToolbarView#element} is available. + * + * @param view An instance of the toolbar being rendered. + */ + render(view: ToolbarView): void; + /** + * A method called after the toolbar has been {@link module:ui/toolbar/toolbarview~ToolbarView#destroy destroyed}. + * It allows cleaning up after the toolbar behavior, for instance, this is the right place to detach + * event listeners, free up references, etc. + */ + destroy(): void; +} +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.js b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.js new file mode 100644 index 0000000..23fc80b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/toolbar/toolbarview.js @@ -0,0 +1,722 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/toolbar/toolbarview + */ +import View from '../view.js'; +import FocusCycler, { isFocusable } from '../focuscycler.js'; +import ToolbarSeparatorView from './toolbarseparatorview.js'; +import ToolbarLineBreakView from './toolbarlinebreakview.js'; +import preventDefault from '../bindings/preventdefault.js'; +import { createDropdown, addToolbarToDropdown } from '../dropdown/utils.js'; +import normalizeToolbarConfig from './normalizetoolbarconfig.js'; +import { FocusTracker, KeystrokeHandler, Rect, ResizeObserver, global, isVisible, logWarning } from '@ckeditor/ckeditor5-utils'; +import { icons } from '@ckeditor/ckeditor5-core'; +import { isObject } from 'lodash-es'; +import '../../theme/components/toolbar/toolbar.css'; +const { threeVerticalDots } = icons; +export const NESTED_TOOLBAR_ICONS = { + alignLeft: icons.alignLeft, + bold: icons.bold, + importExport: icons.importExport, + paragraph: icons.paragraph, + plus: icons.plus, + text: icons.text, + threeVerticalDots: icons.threeVerticalDots, + pilcrow: icons.pilcrow, + dragIndicator: icons.dragIndicator +}; +/** + * The toolbar view class. + */ +export default class ToolbarView extends View { + /** + * Creates an instance of the {@link module:ui/toolbar/toolbarview~ToolbarView} class. + * + * Also see {@link #render}. + * + * @param locale The localization services instance. + * @param options Configuration options of the toolbar. + */ + constructor(locale, options) { + super(locale); + const bind = this.bindTemplate; + const t = this.t; + this.options = options || {}; + this.set('ariaLabel', t('Editor toolbar')); + this.set('maxWidth', 'auto'); + this.items = this.createCollection(); + this.focusTracker = new FocusTracker(); + this.keystrokes = new KeystrokeHandler(); + this.set('class', undefined); + this.set('isCompact', false); + this.itemsView = new ItemsView(locale); + this.children = this.createCollection(); + this.children.add(this.itemsView); + this.focusables = this.createCollection(); + const isRtl = locale.uiLanguageDirection === 'rtl'; + this._focusCycler = new FocusCycler({ + focusables: this.focusables, + focusTracker: this.focusTracker, + keystrokeHandler: this.keystrokes, + actions: { + // Navigate toolbar items backwards using the arrow[left,up] keys. + focusPrevious: [isRtl ? 'arrowright' : 'arrowleft', 'arrowup'], + // Navigate toolbar items forwards using the arrow[right,down] keys. + focusNext: [isRtl ? 'arrowleft' : 'arrowright', 'arrowdown'] + } + }); + const classes = [ + 'ck', + 'ck-toolbar', + bind.to('class'), + bind.if('isCompact', 'ck-toolbar_compact') + ]; + if (this.options.shouldGroupWhenFull && this.options.isFloating) { + classes.push('ck-toolbar_floating'); + } + this.setTemplate({ + tag: 'div', + attributes: { + class: classes, + role: 'toolbar', + 'aria-label': bind.to('ariaLabel'), + style: { + maxWidth: bind.to('maxWidth') + }, + tabindex: -1 + }, + children: this.children, + on: { + // https://github.com/ckeditor/ckeditor5-ui/issues/206 + mousedown: preventDefault(this) + } + }); + this._behavior = this.options.shouldGroupWhenFull ? new DynamicGrouping(this) : new StaticLayout(this); + } + /** + * @inheritDoc + */ + render() { + super.render(); + this.focusTracker.add(this.element); + // Children added before rendering should be known to the #focusTracker. + for (const item of this.items) { + this.focusTracker.add(item.element); + } + this.items.on('add', (evt, item) => { + this.focusTracker.add(item.element); + }); + this.items.on('remove', (evt, item) => { + this.focusTracker.remove(item.element); + }); + // Start listening for the keystrokes coming from #element. + this.keystrokes.listenTo(this.element); + this._behavior.render(this); + } + /** + * @inheritDoc + */ + destroy() { + this._behavior.destroy(); + this.focusTracker.destroy(); + this.keystrokes.destroy(); + return super.destroy(); + } + /** + * Focuses the first focusable in {@link #focusables}. + */ + focus() { + this._focusCycler.focusFirst(); + } + /** + * Focuses the last focusable in {@link #focusables}. + */ + focusLast() { + this._focusCycler.focusLast(); + } + /** + * A utility that expands the plain toolbar configuration into + * {@link module:ui/toolbar/toolbarview~ToolbarView#items} using a given component factory. + * + * @param itemsOrConfig The toolbar items or the entire toolbar configuration object. + * @param factory A factory producing toolbar items. + * @param removeItems An array of items names to be removed from the configuration. When present, applies + * to this toolbar and all nested ones as well. + */ + fillFromConfig(itemsOrConfig, factory, removeItems) { + this.items.addMany(this._buildItemsFromConfig(itemsOrConfig, factory, removeItems)); + } + /** + * A utility that expands the plain toolbar configuration into a list of view items using a given component factory. + * + * @param itemsOrConfig The toolbar items or the entire toolbar configuration object. + * @param factory A factory producing toolbar items. + * @param removeItems An array of items names to be removed from the configuration. When present, applies + * to this toolbar and all nested ones as well. + */ + _buildItemsFromConfig(itemsOrConfig, factory, removeItems) { + const config = normalizeToolbarConfig(itemsOrConfig); + const normalizedRemoveItems = removeItems || config.removeItems; + const itemsToAdd = this._cleanItemsConfiguration(config.items, factory, normalizedRemoveItems) + .map(item => { + if (isObject(item)) { + return this._createNestedToolbarDropdown(item, factory, normalizedRemoveItems); + } + else if (item === '|') { + return new ToolbarSeparatorView(); + } + else if (item === '-') { + return new ToolbarLineBreakView(); + } + return factory.create(item); + }) + .filter((item) => !!item); + return itemsToAdd; + } + /** + * Cleans up the {@link module:ui/toolbar/toolbarview~ToolbarView#items} of the toolbar by removing unwanted items and + * duplicated (obsolete) separators or line breaks. + * + * @param items The toolbar items configuration. + * @param factory A factory producing toolbar items. + * @param removeItems An array of items names to be removed from the configuration. + * @returns Items after the clean-up. + */ + _cleanItemsConfiguration(items, factory, removeItems) { + const filteredItems = items + .filter((item, idx, items) => { + if (item === '|') { + return true; + } + // Items listed in `config.removeItems` should not be added to the toolbar. + if (removeItems.indexOf(item) !== -1) { + return false; + } + if (item === '-') { + // The toolbar line breaks must not be rendered when toolbar grouping is enabled. + // (https://github.com/ckeditor/ckeditor5/issues/8582) + if (this.options.shouldGroupWhenFull) { + /** + * The toolbar multiline breaks (`-` items) only work when the automatic button grouping + * is disabled in the toolbar configuration. + * To do this, set the `shouldNotGroupWhenFull` option to `true` in the editor configuration: + * + * ```ts + * const config = { + * toolbar: { + * items: [ ... ], + * shouldNotGroupWhenFull: true + * } + * } + * ``` + * + * Learn more about {@link module:core/editor/editorconfig~EditorConfig#toolbar toolbar configuration}. + * + * @error toolbarview-line-break-ignored-when-grouping-items + */ + logWarning('toolbarview-line-break-ignored-when-grouping-items', items); + return false; + } + return true; + } + // For the items that cannot be instantiated we are sending warning message. We also filter them out. + if (!isObject(item) && !factory.has(item)) { + /** + * There was a problem processing the configuration of the toolbar. The item with the given + * name does not exist so it was omitted when rendering the toolbar. + * + * This warning usually shows up when the {@link module:core/plugin~Plugin} which is supposed + * to provide a toolbar item has not been loaded or there is a typo in the + * {@link module:core/editor/editorconfig~EditorConfig#toolbar toolbar configuration}. + * + * Make sure the plugin responsible for this toolbar item is loaded and the toolbar configuration + * is correct, e.g. {@link module:basic-styles/bold~Bold} is loaded for the `'bold'` toolbar item. + * + * You can use the following snippet to retrieve all available toolbar items: + * + * ```ts + * Array.from( editor.ui.componentFactory.names() ); + * ``` + * + * @error toolbarview-item-unavailable + * @param item The name of the component or nested toolbar definition. + */ + logWarning('toolbarview-item-unavailable', { item }); + return false; + } + return true; + }); + return this._cleanSeparatorsAndLineBreaks(filteredItems); + } + /** + * Remove leading, trailing, and duplicated separators (`-` and `|`). + * + * @returns Toolbar items after the separator and line break clean-up. + */ + _cleanSeparatorsAndLineBreaks(items) { + const nonSeparatorPredicate = (item) => (item !== '-' && item !== '|'); + const count = items.length; + // Find an index of the first item that is not a separator. + const firstCommandItemIndex = items.findIndex(nonSeparatorPredicate); + // Items include separators only. There is no point in displaying them. + if (firstCommandItemIndex === -1) { + return []; + } + // Search from the end of the list, then convert found index back to the original direction. + const lastCommandItemIndex = count - items + .slice() + .reverse() + .findIndex(nonSeparatorPredicate); + return items + // Return items without the leading and trailing separators. + .slice(firstCommandItemIndex, lastCommandItemIndex) + // Remove duplicated separators. + .filter((name, idx, items) => { + // Filter only separators. + if (nonSeparatorPredicate(name)) { + return true; + } + const isDuplicated = idx > 0 && items[idx - 1] === name; + return !isDuplicated; + }); + } + /** + * Creates a user-defined dropdown containing a toolbar with items. + * + * @param definition A definition of the nested toolbar dropdown. + * @param definition.label A label of the dropdown. + * @param definition.icon An icon of the drop-down. One of 'bold', 'plus', 'text', 'importExport', 'alignLeft', + * 'paragraph' or an SVG string. When `false` is passed, no icon will be used. + * @param definition.withText When set `true`, the label of the dropdown will be visible. See + * {@link module:ui/button/buttonview~ButtonView#withText} to learn more. + * @param definition.tooltip A tooltip of the dropdown button. See + * {@link module:ui/button/buttonview~ButtonView#tooltip} to learn more. Defaults to `true`. + * @param componentFactory Component factory used to create items + * of the nested toolbar. + */ + _createNestedToolbarDropdown(definition, componentFactory, removeItems) { + let { label, icon, items, tooltip = true, withText = false } = definition; + items = this._cleanItemsConfiguration(items, componentFactory, removeItems); + // There is no point in rendering a dropdown without items. + if (!items.length) { + return null; + } + const locale = this.locale; + const dropdownView = createDropdown(locale); + if (!label) { + /** + * A dropdown definition in the toolbar configuration is missing a text label. + * + * Without a label, the dropdown becomes inaccessible to users relying on assistive technologies. + * Make sure the `label` property is set in your drop-down configuration: + * + * ```json + * { + * label: 'A human-readable label', + * icon: '...', + * items: [ ... ] + * }, + * ``` + * + * Learn more about {@link module:core/editor/editorconfig~EditorConfig#toolbar toolbar configuration}. + * + * @error toolbarview-nested-toolbar-dropdown-missing-label + */ + logWarning('toolbarview-nested-toolbar-dropdown-missing-label', definition); + } + dropdownView.class = 'ck-toolbar__nested-toolbar-dropdown'; + dropdownView.buttonView.set({ + label, + tooltip, + withText: !!withText + }); + // Allow disabling icon by passing false. + if (icon !== false) { + // A pre-defined icon picked by name, SVG string, a fallback (default) icon. + dropdownView.buttonView.icon = NESTED_TOOLBAR_ICONS[icon] || icon || threeVerticalDots; + } + // If the icon is disabled, display the label automatically. + else { + dropdownView.buttonView.withText = true; + } + addToolbarToDropdown(dropdownView, () => (dropdownView.toolbarView._buildItemsFromConfig(items, componentFactory, removeItems))); + return dropdownView; + } +} +/** + * An inner block of the {@link module:ui/toolbar/toolbarview~ToolbarView} hosting its + * {@link module:ui/toolbar/toolbarview~ToolbarView#items}. + */ +class ItemsView extends View { + /** + * @inheritDoc + */ + constructor(locale) { + super(locale); + this.children = this.createCollection(); + this.setTemplate({ + tag: 'div', + attributes: { + class: [ + 'ck', + 'ck-toolbar__items' + ] + }, + children: this.children + }); + } +} +/** + * A toolbar behavior that makes it static and unresponsive to the changes of the environment. + * At the same time, it also makes it possible to display a toolbar with a vertical layout + * using the {@link module:ui/toolbar/toolbarview~ToolbarView#isVertical} property. + */ +class StaticLayout { + /** + * Creates an instance of the {@link module:ui/toolbar/toolbarview~StaticLayout} toolbar + * behavior. + * + * @param view An instance of the toolbar that this behavior is added to. + */ + constructor(view) { + const bind = view.bindTemplate; + // Static toolbar can be vertical when needed. + view.set('isVertical', false); + // 1:1 pass–through binding, all ToolbarView#items are visible. + view.itemsView.children.bindTo(view.items).using(item => item); + // 1:1 pass–through binding, all ToolbarView#items are focusable. + view.focusables.bindTo(view.items).using(item => isFocusable(item) ? item : null); + view.extendTemplate({ + attributes: { + class: [ + // When vertical, the toolbar has an additional CSS class. + bind.if('isVertical', 'ck-toolbar_vertical') + ] + } + }); + } + /** + * @inheritDoc + */ + render() { } + /** + * @inheritDoc + */ + destroy() { } +} +/** + * A toolbar behavior that makes the items respond to changes in the geometry. + * + * In a nutshell, it groups {@link module:ui/toolbar/toolbarview~ToolbarView#items} + * that do not fit visually into a single row of the toolbar (due to limited space). + * Items that do not fit are aggregated in a dropdown displayed at the end of the toolbar. + * + * ``` + * ┌──────────────────────────────────────── ToolbarView ──────────────────────────────────────────┐ + * | ┌─────────────────────────────────────── #children ─────────────────────────────────────────┐ | + * | | ┌─────── #itemsView ────────┐ ┌──────────────────────┐ ┌── #groupedItemsDropdown ───┐ | | + * | | | #ungroupedItems | | ToolbarSeparatorView | | #groupedItems | | | + * | | └──────────────────────────-┘ └──────────────────────┘ └────────────────────────────┘ | | + * | | \---------- only when toolbar items overflow -------/ | | + * | └───────────────────────────────────────────────────────────────────────────────────────────┘ | + * └───────────────────────────────────────────────────────────────────────────────────────────────┘ + * ``` + */ +class DynamicGrouping { + /** + * Creates an instance of the {@link module:ui/toolbar/toolbarview~DynamicGrouping} toolbar + * behavior. + * + * @param view An instance of the toolbar that this behavior is added to. + */ + constructor(view) { + /** + * An instance of the resize observer that helps dynamically determine the geometry of the toolbar + * and manage items that do not fit into a single row. + * + * **Note:** Created in {@link #_enableGroupingOnResize}. + * + * @readonly + */ + this.resizeObserver = null; + /** + * A cached value of the horizontal padding style used by {@link #_updateGrouping} + * to manage the {@link module:ui/toolbar/toolbarview~ToolbarView#items} that do not fit into + * a single toolbar line. This value can be reused between updates because it is unlikely that + * the padding will change and re–using `Window.getComputedStyle()` is expensive. + * + * @readonly + */ + this.cachedPadding = null; + /** + * A flag indicating that an items grouping update has been queued (e.g. due to the toolbar being visible) + * and should be executed immediately the next time the toolbar shows up. + * + * @readonly + */ + this.shouldUpdateGroupingOnNextResize = false; + this.view = view; + this.viewChildren = view.children; + this.viewFocusables = view.focusables; + this.viewItemsView = view.itemsView; + this.viewFocusTracker = view.focusTracker; + this.viewLocale = view.locale; + this.ungroupedItems = view.createCollection(); + this.groupedItems = view.createCollection(); + this.groupedItemsDropdown = this._createGroupedItemsDropdown(); + // Only those items that were not grouped are visible to the user. + view.itemsView.children.bindTo(this.ungroupedItems).using(item => item); + // Make sure all #items visible in the main space of the toolbar are "focuscyclable". + this.ungroupedItems.on('change', this._updateFocusCyclableItems.bind(this)); + // Make sure the #groupedItemsDropdown is also included in cycling when it appears. + view.children.on('change', this._updateFocusCyclableItems.bind(this)); + // ToolbarView#items is dynamic. When an item is added or removed, it should be automatically + // represented in either grouped or ungrouped items at the right index. + // In other words #items == concat( #ungroupedItems, #groupedItems ) + // (in length and order). + view.items.on('change', (evt, changeData) => { + const index = changeData.index; + const added = Array.from(changeData.added); + // Removing. + for (const removedItem of changeData.removed) { + if (index >= this.ungroupedItems.length) { + this.groupedItems.remove(removedItem); + } + else { + this.ungroupedItems.remove(removedItem); + } + } + // Adding. + for (let currentIndex = index; currentIndex < index + added.length; currentIndex++) { + const addedItem = added[currentIndex - index]; + if (currentIndex > this.ungroupedItems.length) { + this.groupedItems.add(addedItem, currentIndex - this.ungroupedItems.length); + } + else { + this.ungroupedItems.add(addedItem, currentIndex); + } + } + // When new ungrouped items join in and land in #ungroupedItems, there's a chance it causes + // the toolbar to overflow. + // Consequently if removed from grouped or ungrouped items, there is a chance + // some new space is available and we could do some ungrouping. + this._updateGrouping(); + }); + view.extendTemplate({ + attributes: { + class: [ + // To group items dynamically, the toolbar needs a dedicated CSS class. + 'ck-toolbar_grouping' + ] + } + }); + } + /** + * Enables dynamic items grouping based on the dimensions of the toolbar. + * + * @param view An instance of the toolbar that this behavior is added to. + */ + render(view) { + this.viewElement = view.element; + this._enableGroupingOnResize(); + this._enableGroupingOnMaxWidthChange(view); + } + /** + * Cleans up the internals used by this behavior. + */ + destroy() { + // The dropdown may not be in ToolbarView#children at the moment of toolbar destruction + // so let's make sure it's actually destroyed along with the toolbar. + this.groupedItemsDropdown.destroy(); + this.resizeObserver.destroy(); + } + /** + * When called, it will check if any of the {@link #ungroupedItems} do not fit into a single row of the toolbar, + * and it will move them to the {@link #groupedItems} when it happens. + * + * At the same time, it will also check if there is enough space in the toolbar for the first of the + * {@link #groupedItems} to be returned back to {@link #ungroupedItems} and still fit into a single row + * without the toolbar wrapping. + */ + _updateGrouping() { + // Do no grouping–related geometry analysis when the toolbar is detached from visible DOM, + // for instance before #render(), or after render but without a parent or a parent detached + // from DOM. DOMRects won't work anyway and there will be tons of warning in the console and + // nothing else. This happens, for instance, when the toolbar is detached from DOM and + // some logic adds or removes its #items. + if (!this.viewElement.ownerDocument.body.contains(this.viewElement)) { + return; + } + // Do not update grouping when the element is invisible. Such toolbar has DOMRect filled with zeros + // and that would cause all items to be grouped. Instead, queue the grouping so it runs next time + // the toolbar is visible (the next ResizeObserver callback execution). This is handy because + // the grouping could be caused by increasing the #maxWidth when the toolbar was invisible and the next + // time it shows up, some items could actually be ungrouped (https://github.com/ckeditor/ckeditor5/issues/6575). + if (!isVisible(this.viewElement)) { + this.shouldUpdateGroupingOnNextResize = true; + return; + } + // Remember how many items were initially grouped so at the it is possible to figure out if the number + // of grouped items has changed. If the number has changed, geometry of the toolbar has also changed. + const initialGroupedItemsCount = this.groupedItems.length; + let wereItemsGrouped; + // Group #items as long as some wrap to the next row. This will happen, for instance, + // when the toolbar is getting narrow and there is not enough space to display all items in + // a single row. + while (this._areItemsOverflowing) { + this._groupLastItem(); + wereItemsGrouped = true; + } + // If none were grouped now but there were some items already grouped before, + // then, what the hell, maybe let's see if some of them can be ungrouped. This happens when, + // for instance, the toolbar is stretching and there's more space in it than before. + if (!wereItemsGrouped && this.groupedItems.length) { + // Ungroup items as long as none are overflowing or there are none to ungroup left. + while (this.groupedItems.length && !this._areItemsOverflowing) { + this._ungroupFirstItem(); + } + // If the ungrouping ended up with some item wrapping to the next row, + // put it back to the group toolbar ("undo the last ungroup"). We don't know whether + // an item will wrap or not until we ungroup it (that's a DOM/CSS thing) so this + // clean–up is vital for the algorithm. + if (this._areItemsOverflowing) { + this._groupLastItem(); + } + } + if (this.groupedItems.length !== initialGroupedItemsCount) { + this.view.fire('groupedItemsUpdate'); + } + } + /** + * Returns `true` when {@link module:ui/toolbar/toolbarview~ToolbarView#element} children visually overflow, + * for instance if the toolbar is narrower than its members. Returns `false` otherwise. + */ + get _areItemsOverflowing() { + // An empty toolbar cannot overflow. + if (!this.ungroupedItems.length) { + return false; + } + const element = this.viewElement; + const uiLanguageDirection = this.viewLocale.uiLanguageDirection; + const lastChildRect = new Rect(element.lastChild); + const toolbarRect = new Rect(element); + if (!this.cachedPadding) { + const computedStyle = global.window.getComputedStyle(element); + const paddingProperty = uiLanguageDirection === 'ltr' ? 'paddingRight' : 'paddingLeft'; + // parseInt() is essential because of quirky floating point numbers logic and DOM. + // If the padding turned out too big because of that, the grouped items dropdown would + // always look (from the Rect perspective) like it overflows (while it's not). + this.cachedPadding = Number.parseInt(computedStyle[paddingProperty]); + } + if (uiLanguageDirection === 'ltr') { + return lastChildRect.right > toolbarRect.right - this.cachedPadding; + } + else { + return lastChildRect.left < toolbarRect.left + this.cachedPadding; + } + } + /** + * Enables the functionality that prevents {@link #ungroupedItems} from overflowing (wrapping to the next row) + * upon resize when there is little space available. Instead, the toolbar items are moved to the + * {@link #groupedItems} collection and displayed in a dropdown at the end of the row (which has its own nested toolbar). + * + * When called, the toolbar will automatically analyze the location of its {@link #ungroupedItems} and "group" + * them in the dropdown if necessary. It will also observe the browser window for size changes in + * the future and respond to them by grouping more items or reverting already grouped back, depending + * on the visual space available. + */ + _enableGroupingOnResize() { + let previousWidth; + // TODO: Consider debounce. + this.resizeObserver = new ResizeObserver(this.viewElement, entry => { + if (!previousWidth || previousWidth !== entry.contentRect.width || this.shouldUpdateGroupingOnNextResize) { + this.shouldUpdateGroupingOnNextResize = false; + this._updateGrouping(); + previousWidth = entry.contentRect.width; + } + }); + this._updateGrouping(); + } + /** + * Enables the grouping functionality, just like {@link #_enableGroupingOnResize} but the difference is that + * it listens to the changes of {@link module:ui/toolbar/toolbarview~ToolbarView#maxWidth} instead. + */ + _enableGroupingOnMaxWidthChange(view) { + view.on('change:maxWidth', () => { + this._updateGrouping(); + }); + } + /** + * When called, it will remove the last item from {@link #ungroupedItems} and move it back + * to the {@link #groupedItems} collection. + * + * The opposite of {@link #_ungroupFirstItem}. + */ + _groupLastItem() { + if (!this.groupedItems.length) { + this.viewChildren.add(new ToolbarSeparatorView()); + this.viewChildren.add(this.groupedItemsDropdown); + this.viewFocusTracker.add(this.groupedItemsDropdown.element); + } + this.groupedItems.add(this.ungroupedItems.remove(this.ungroupedItems.last), 0); + } + /** + * Moves the very first item belonging to {@link #groupedItems} back + * to the {@link #ungroupedItems} collection. + * + * The opposite of {@link #_groupLastItem}. + */ + _ungroupFirstItem() { + this.ungroupedItems.add(this.groupedItems.remove(this.groupedItems.first)); + if (!this.groupedItems.length) { + this.viewChildren.remove(this.groupedItemsDropdown); + this.viewChildren.remove(this.viewChildren.last); + this.viewFocusTracker.remove(this.groupedItemsDropdown.element); + } + } + /** + * Creates the {@link #groupedItemsDropdown} that hosts the members of the {@link #groupedItems} + * collection when there is not enough space in the toolbar to display all items in a single row. + */ + _createGroupedItemsDropdown() { + const locale = this.viewLocale; + const t = locale.t; + const dropdown = createDropdown(locale); + dropdown.class = 'ck-toolbar__grouped-dropdown'; + // Make sure the dropdown never sticks out to the left/right. It should be under the main toolbar. + // (https://github.com/ckeditor/ckeditor5/issues/5608) + dropdown.panelPosition = locale.uiLanguageDirection === 'ltr' ? 'sw' : 'se'; + addToolbarToDropdown(dropdown, this.groupedItems); + dropdown.buttonView.set({ + label: t('Show more items'), + tooltip: true, + tooltipPosition: locale.uiLanguageDirection === 'rtl' ? 'se' : 'sw', + icon: threeVerticalDots + }); + return dropdown; + } + /** + * Updates the {@link module:ui/toolbar/toolbarview~ToolbarView#focusables focus–cyclable items} + * collection so it represents the up–to–date state of the UI from the perspective of the user. + * + * For instance, the {@link #groupedItemsDropdown} can show up and hide but when it is visible, + * it must be subject to focus cycling in the toolbar. + * + * See the {@link module:ui/toolbar/toolbarview~ToolbarView#focusables collection} documentation + * to learn more about the purpose of this method. + */ + _updateFocusCyclableItems() { + this.viewFocusables.clear(); + this.ungroupedItems.map(item => { + if (isFocusable(item)) { + this.viewFocusables.add(item); + } + }); + if (this.groupedItems.length) { + this.viewFocusables.add(this.groupedItemsDropdown); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.d.ts new file mode 100644 index 0000000..b3e717a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.d.ts @@ -0,0 +1,195 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/tooltipmanager + */ +import View from './view.js'; +import BalloonPanelView from './panel/balloon/balloonpanelview.js'; +import { type PositioningFunction } from '@ckeditor/ckeditor5-utils'; +import type { Editor } from '@ckeditor/ckeditor5-core'; +import '../theme/components/tooltip/tooltip.css'; +declare const TooltipManager_base: { + new (): import("@ckeditor/ckeditor5-utils").DomEmitter; + prototype: import("@ckeditor/ckeditor5-utils").DomEmitter; +}; +/** + * A tooltip manager class for the UI of the editor. + * + * **Note**: Most likely you do not have to use the `TooltipManager` API listed below in order to display tooltips. Popular + * {@glink framework/architecture/ui-library UI components} support tooltips out-of-the-box via observable properties + * (see {@link module:ui/button/buttonview~ButtonView#tooltip} and {@link module:ui/button/buttonview~ButtonView#tooltipPosition}). + * + * # Displaying tooltips + * + * To display a tooltip, set `data-cke-tooltip-text` attribute on any DOM element: + * + * ```ts + * domElement.dataset.ckeTooltipText = 'My tooltip'; + * ``` + * + * The tooltip will show up whenever the user moves the mouse over the element or the element gets focus in DOM. + * + * # Positioning tooltips + * + * To change the position of the tooltip, use the `data-cke-tooltip-position` attribute (`s`, `se`, `sw`, `n`, `e`, or `w`): + * + * ```ts + * domElement.dataset.ckeTooltipText = 'Tooltip to the north'; + * domElement.dataset.ckeTooltipPosition = 'n'; + * ``` + * + * # Disabling tooltips + * + * In order to disable the tooltip temporarily, use the `data-cke-tooltip-disabled` attribute: + * + * ```ts + * domElement.dataset.ckeTooltipText = 'Disabled. For now.'; + * domElement.dataset.ckeTooltipDisabled = 'true'; + * ``` + * + * # Styling tooltips + * + * By default, the tooltip has `.ck-tooltip` class and its text inner `.ck-tooltip__text`. + * + * If your tooltip requires custom styling, using `data-cke-tooltip-class` attribute will add additional class to the balloon + * displaying the tooltip: + * + * ```ts + * domElement.dataset.ckeTooltipText = 'Tooltip with a red text'; + * domElement.dataset.ckeTooltipClass = 'my-class'; + * ``` + * + * ```css + * .ck.ck-tooltip.my-class { color: red } + * ``` + * + * **Note**: This class is a singleton. All editor instances re-use the same instance loaded by + * {@link module:ui/editorui/editorui~EditorUI} of the first editor. + */ +export default class TooltipManager extends TooltipManager_base { + /** + * The view rendering text of the tooltip. + */ + readonly tooltipTextView: View & { + text: string; + }; + /** + * The instance of the balloon panel that renders and positions the tooltip. + */ + readonly balloonPanelView: BalloonPanelView; + /** + * A set of default {@link module:utils/dom/position~PositioningFunction positioning functions} used by the `TooltipManager` + * to pin tooltips in different positions. + */ + static defaultBalloonPositions: Record; + /** + * Stores the reference to the DOM element the tooltip is attached to. `null` when there's no tooltip + * in the UI. + */ + private _currentElementWithTooltip; + /** + * Stores the current tooltip position. `null` when there's no tooltip in the UI. + */ + private _currentTooltipPosition; + /** + * An instance of the resize observer that keeps track on target element visibility, + * when it hides the tooltip should also disappear. + * + * {@link module:core/editor/editorconfig~EditorConfig#balloonToolbar configuration}. + */ + private _resizeObserver; + /** + * An instance of the mutation observer that keeps track on target element attributes changes. + */ + private _mutationObserver; + /** + * A debounced version of {@link #_pinTooltip}. Tooltips show with a delay to avoid flashing and + * to improve the UX. + */ + private _pinTooltipDebounced; + /** + * A debounced version of {@link #_unpinTooltip}. Tooltips hide with a delay to allow hovering of their titles. + */ + private _unpinTooltipDebounced; + private readonly _watchdogExcluded; + /** + * A set of editors the single tooltip manager instance must listen to. + * This is mostly to handle `EditorUI#update` listeners from individual editors. + */ + private static _editors; + /** + * A reference to the `TooltipManager` instance. The class is a singleton and as such, + * successive attempts at creating instances should return this instance. + */ + private static _instance; + /** + * Creates an instance of the tooltip manager. + */ + constructor(editor: Editor); + /** + * Destroys the tooltip manager. + * + * **Note**: The manager singleton cannot be destroyed until all editors that use it are destroyed. + * + * @param editor The editor the manager was created for. + */ + destroy(editor: Editor): void; + /** + * Returns {@link #balloonPanelView} {@link module:utils/dom/position~PositioningFunction positioning functions} for a given position + * name. + * + * @param position Name of the position (`s`, `se`, `sw`, `n`, `e`, or `w`). + * @returns Positioning functions to be used by the {@link #balloonPanelView}. + */ + static getPositioningFunctions(position: TooltipPosition): Array; + /** + * Handles hiding tooltips on `keydown` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + private _onKeyDown; + /** + * Handles displaying tooltips on `mouseenter` and `focus` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + private _onEnterOrFocus; + /** + * Handles hiding tooltips on `mouseleave` and `blur` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + private _onLeaveOrBlur; + /** + * Handles hiding tooltips on `scroll` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + private _onScroll; + /** + * Pins the tooltip to a specific DOM element. + * + * @param options.text Text of the tooltip to display. + * @param options.position The position of the tooltip. + * @param options.cssClass Additional CSS class of the balloon with the tooltip. + */ + private _pinTooltip; + /** + * Unpins the tooltip and cancels all queued pinning. + */ + private _unpinTooltip; + /** + * Updates the position of the tooltip so it stays in sync with the element it is pinned to. + * + * Hides the tooltip when the element is no longer visible in DOM or the tooltip text was removed. + */ + private _updateTooltipPosition; +} +export type TooltipPosition = 's' | 'n' | 'e' | 'w' | 'sw' | 'se'; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.js b/node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.js new file mode 100644 index 0000000..230635e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/tooltipmanager.js @@ -0,0 +1,413 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/tooltipmanager + */ +import View from './view.js'; +import BalloonPanelView, { generatePositions } from './panel/balloon/balloonpanelview.js'; +import { DomEmitterMixin, ResizeObserver, first, global, isVisible } from '@ckeditor/ckeditor5-utils'; +import { isElement, debounce } from 'lodash-es'; +import '../theme/components/tooltip/tooltip.css'; +const BALLOON_CLASS = 'ck-tooltip'; +/** + * A tooltip manager class for the UI of the editor. + * + * **Note**: Most likely you do not have to use the `TooltipManager` API listed below in order to display tooltips. Popular + * {@glink framework/architecture/ui-library UI components} support tooltips out-of-the-box via observable properties + * (see {@link module:ui/button/buttonview~ButtonView#tooltip} and {@link module:ui/button/buttonview~ButtonView#tooltipPosition}). + * + * # Displaying tooltips + * + * To display a tooltip, set `data-cke-tooltip-text` attribute on any DOM element: + * + * ```ts + * domElement.dataset.ckeTooltipText = 'My tooltip'; + * ``` + * + * The tooltip will show up whenever the user moves the mouse over the element or the element gets focus in DOM. + * + * # Positioning tooltips + * + * To change the position of the tooltip, use the `data-cke-tooltip-position` attribute (`s`, `se`, `sw`, `n`, `e`, or `w`): + * + * ```ts + * domElement.dataset.ckeTooltipText = 'Tooltip to the north'; + * domElement.dataset.ckeTooltipPosition = 'n'; + * ``` + * + * # Disabling tooltips + * + * In order to disable the tooltip temporarily, use the `data-cke-tooltip-disabled` attribute: + * + * ```ts + * domElement.dataset.ckeTooltipText = 'Disabled. For now.'; + * domElement.dataset.ckeTooltipDisabled = 'true'; + * ``` + * + * # Styling tooltips + * + * By default, the tooltip has `.ck-tooltip` class and its text inner `.ck-tooltip__text`. + * + * If your tooltip requires custom styling, using `data-cke-tooltip-class` attribute will add additional class to the balloon + * displaying the tooltip: + * + * ```ts + * domElement.dataset.ckeTooltipText = 'Tooltip with a red text'; + * domElement.dataset.ckeTooltipClass = 'my-class'; + * ``` + * + * ```css + * .ck.ck-tooltip.my-class { color: red } + * ``` + * + * **Note**: This class is a singleton. All editor instances re-use the same instance loaded by + * {@link module:ui/editorui/editorui~EditorUI} of the first editor. + */ +class TooltipManager extends DomEmitterMixin() { + /** + * Creates an instance of the tooltip manager. + */ + constructor(editor) { + super(); + /** + * Stores the reference to the DOM element the tooltip is attached to. `null` when there's no tooltip + * in the UI. + */ + this._currentElementWithTooltip = null; + /** + * Stores the current tooltip position. `null` when there's no tooltip in the UI. + */ + this._currentTooltipPosition = null; + /** + * An instance of the resize observer that keeps track on target element visibility, + * when it hides the tooltip should also disappear. + * + * {@link module:core/editor/editorconfig~EditorConfig#balloonToolbar configuration}. + */ + this._resizeObserver = null; + /** + * An instance of the mutation observer that keeps track on target element attributes changes. + */ + this._mutationObserver = null; + TooltipManager._editors.add(editor); + // TooltipManager must be a singleton. Multiple instances would mean multiple tooltips attached + // to the same DOM element with data-cke-tooltip-* attributes. + if (TooltipManager._instance) { + return TooltipManager._instance; + } + TooltipManager._instance = this; + this.tooltipTextView = new View(editor.locale); + this.tooltipTextView.set('text', ''); + this.tooltipTextView.setTemplate({ + tag: 'span', + attributes: { + class: [ + 'ck', + 'ck-tooltip__text' + ] + }, + children: [ + { + text: this.tooltipTextView.bindTemplate.to('text') + } + ] + }); + this.balloonPanelView = new BalloonPanelView(editor.locale); + this.balloonPanelView.class = BALLOON_CLASS; + this.balloonPanelView.content.add(this.tooltipTextView); + this._mutationObserver = createMutationObserver(() => { + this._updateTooltipPosition(); + }); + this._pinTooltipDebounced = debounce(this._pinTooltip, 600); + this._unpinTooltipDebounced = debounce(this._unpinTooltip, 400); + this.listenTo(global.document, 'keydown', this._onKeyDown.bind(this), { useCapture: true }); + this.listenTo(global.document, 'mouseenter', this._onEnterOrFocus.bind(this), { useCapture: true }); + this.listenTo(global.document, 'mouseleave', this._onLeaveOrBlur.bind(this), { useCapture: true }); + this.listenTo(global.document, 'focus', this._onEnterOrFocus.bind(this), { useCapture: true }); + this.listenTo(global.document, 'blur', this._onLeaveOrBlur.bind(this), { useCapture: true }); + this.listenTo(global.document, 'scroll', this._onScroll.bind(this), { useCapture: true }); + // Because this class is a singleton, its only instance is shared across all editors and connects them through the reference. + // This causes issues with the ContextWatchdog. When an error is thrown in one editor, the watchdog traverses the references + // and (because of shared tooltip manager) figures that the error affects all editors and restarts them all. + // This flag, excludes tooltip manager instance from the traversal and brings ContextWatchdog back to normal. + // More in https://github.com/ckeditor/ckeditor5/issues/12292. + this._watchdogExcluded = true; + } + /** + * Destroys the tooltip manager. + * + * **Note**: The manager singleton cannot be destroyed until all editors that use it are destroyed. + * + * @param editor The editor the manager was created for. + */ + destroy(editor) { + const editorBodyViewCollection = editor.ui.view && editor.ui.view.body; + TooltipManager._editors.delete(editor); + this.stopListening(editor.ui); + // Prevent the balloon panel from being destroyed in the EditorUI#destroy() cascade. It should be destroyed along + // with the last editor only (https://github.com/ckeditor/ckeditor5/issues/12602). + if (editorBodyViewCollection && editorBodyViewCollection.has(this.balloonPanelView)) { + editorBodyViewCollection.remove(this.balloonPanelView); + } + if (!TooltipManager._editors.size) { + this._unpinTooltip(); + this.balloonPanelView.destroy(); + this.stopListening(); + TooltipManager._instance = null; + } + } + /** + * Returns {@link #balloonPanelView} {@link module:utils/dom/position~PositioningFunction positioning functions} for a given position + * name. + * + * @param position Name of the position (`s`, `se`, `sw`, `n`, `e`, or `w`). + * @returns Positioning functions to be used by the {@link #balloonPanelView}. + */ + static getPositioningFunctions(position) { + const defaultPositions = TooltipManager.defaultBalloonPositions; + return { + // South is most popular. We can use positioning heuristics to avoid clipping by the viewport with the sane fallback. + s: [ + defaultPositions.southArrowNorth, + defaultPositions.southArrowNorthEast, + defaultPositions.southArrowNorthWest + ], + n: [defaultPositions.northArrowSouth], + e: [defaultPositions.eastArrowWest], + w: [defaultPositions.westArrowEast], + sw: [defaultPositions.southArrowNorthEast], + se: [defaultPositions.southArrowNorthWest] + }[position]; + } + /** + * Handles hiding tooltips on `keydown` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + _onKeyDown(evt, domEvent) { + if (domEvent.key === 'Escape' && this._currentElementWithTooltip) { + this._unpinTooltip(); + domEvent.stopPropagation(); + } + } + /** + * Handles displaying tooltips on `mouseenter` and `focus` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + _onEnterOrFocus(evt, { target }) { + const elementWithTooltipAttribute = getDescendantWithTooltip(target); + // Abort when there's no descendant needing tooltip. + if (!elementWithTooltipAttribute) { + // Unpin if element is focused, regardless of whether it contains a label or not. + // It also prevents tooltips from overlapping the menu bar + if (evt.name === 'focus') { + this._unpinTooltip(); + } + return; + } + // Abort to avoid flashing when, for instance: + // * a tooltip is displayed for a focused element, then the same element gets mouseentered, + // * a tooltip is displayed for an element via mouseenter, then the focus moves to the same element. + if (elementWithTooltipAttribute === this._currentElementWithTooltip) { + return; + } + this._unpinTooltip(); + this._pinTooltipDebounced(elementWithTooltipAttribute, getTooltipData(elementWithTooltipAttribute)); + } + /** + * Handles hiding tooltips on `mouseleave` and `blur` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + _onLeaveOrBlur(evt, { target, relatedTarget }) { + if (evt.name === 'mouseleave') { + // Don't act when the event does not concern a DOM element (e.g. a mouseleave out of an entire document), + if (!isElement(target)) { + return; + } + const balloonElement = this.balloonPanelView.element; + const isEnteringBalloon = balloonElement && (balloonElement === relatedTarget || balloonElement.contains(relatedTarget)); + const isLeavingBalloon = !isEnteringBalloon && target === balloonElement; + // Do not hide the tooltip when the user moves the cursor over it. + if (isEnteringBalloon) { + this._unpinTooltipDebounced.cancel(); + return; + } + // If a tooltip is currently visible, don't act for a targets other than the one it is attached to. + // The only exception is leaving balloon, in this scenario tooltip should be closed. + // For instance, a random mouseleave far away in the page should not unpin the tooltip that was pinned because + // of a previous focus. Only leaving the same element should hide the tooltip. + if (!isLeavingBalloon && this._currentElementWithTooltip && target !== this._currentElementWithTooltip) { + return; + } + const descendantWithTooltip = getDescendantWithTooltip(target); + const relatedDescendantWithTooltip = getDescendantWithTooltip(relatedTarget); + // Unpin when the mouse was leaving element with a tooltip to a place which does not have or has a different tooltip. + // Note that this should happen whether the tooltip is already visible or not, for instance, + // it could be invisible but queued (debounced): it should get canceled. + if (isLeavingBalloon || (descendantWithTooltip && descendantWithTooltip !== relatedDescendantWithTooltip)) { + this._unpinTooltipDebounced(); + } + } + else { + // If a tooltip is currently visible, don't act for a targets other than the one it is attached to. + // For instance, a random blur in the web page should not unpin the tooltip that was pinned because of a previous mouseenter. + if (this._currentElementWithTooltip && target !== this._currentElementWithTooltip) { + return; + } + // Note that unpinning should happen whether the tooltip is already visible or not, for instance, it could be invisible but + // queued (debounced): it should get canceled (e.g. quick focus then quick blur using the keyboard). + this._unpinTooltipDebounced(); + } + } + /** + * Handles hiding tooltips on `scroll` in DOM. + * + * @param evt An object containing information about the fired event. + * @param domEvent The DOM event. + */ + _onScroll(evt, { target }) { + // No tooltip, no reason to react on scroll. + if (!this._currentElementWithTooltip) { + return; + } + // When scrolling a container that has both the balloon and the current element (common ancestor), the balloon can remain + // visible (e.g. scrolling ≤body>). Otherwise, to avoid glitches (clipping, lagging) better just hide the tooltip. + // Also, don't do anything when scrolling an unrelated DOM element that has nothing to do with the current element and the balloon. + if (target.contains(this.balloonPanelView.element) && target.contains(this._currentElementWithTooltip)) { + return; + } + this._unpinTooltip(); + } + /** + * Pins the tooltip to a specific DOM element. + * + * @param options.text Text of the tooltip to display. + * @param options.position The position of the tooltip. + * @param options.cssClass Additional CSS class of the balloon with the tooltip. + */ + _pinTooltip(targetDomElement, { text, position, cssClass }) { + this._unpinTooltip(); + // Use the body collection of the first editor. + const bodyViewCollection = first(TooltipManager._editors.values()).ui.view.body; + if (!bodyViewCollection.has(this.balloonPanelView)) { + bodyViewCollection.add(this.balloonPanelView); + } + this.tooltipTextView.text = text; + this.balloonPanelView.pin({ + target: targetDomElement, + positions: TooltipManager.getPositioningFunctions(position) + }); + this._resizeObserver = new ResizeObserver(targetDomElement, () => { + // The ResizeObserver will call its callback when the target element hides and the tooltip + // should also disappear (https://github.com/ckeditor/ckeditor5/issues/12492). + if (!isVisible(targetDomElement)) { + this._unpinTooltip(); + } + }); + this._mutationObserver.attach(targetDomElement); + this.balloonPanelView.class = [BALLOON_CLASS, cssClass] + .filter(className => className) + .join(' '); + // Start responding to changes in editor UI or content layout. For instance, when collaborators change content + // and a contextual toolbar attached to a content starts to move (and so should move the tooltip). + // Note: Using low priority to let other listeners that position contextual toolbars etc. to react first. + for (const editor of TooltipManager._editors) { + this.listenTo(editor.ui, 'update', this._updateTooltipPosition.bind(this), { priority: 'low' }); + } + this._currentElementWithTooltip = targetDomElement; + this._currentTooltipPosition = position; + } + /** + * Unpins the tooltip and cancels all queued pinning. + */ + _unpinTooltip() { + this._unpinTooltipDebounced.cancel(); + this._pinTooltipDebounced.cancel(); + this.balloonPanelView.unpin(); + for (const editor of TooltipManager._editors) { + this.stopListening(editor.ui, 'update'); + } + this._currentElementWithTooltip = null; + this._currentTooltipPosition = null; + this.tooltipTextView.text = ''; + if (this._resizeObserver) { + this._resizeObserver.destroy(); + } + this._mutationObserver.detach(); + } + /** + * Updates the position of the tooltip so it stays in sync with the element it is pinned to. + * + * Hides the tooltip when the element is no longer visible in DOM or the tooltip text was removed. + */ + _updateTooltipPosition() { + const tooltipData = getTooltipData(this._currentElementWithTooltip); + // This could happen if the tooltip was attached somewhere in a contextual content toolbar and the toolbar + // disappeared (e.g. removed an image), or the tooltip text was removed. + if (!isVisible(this._currentElementWithTooltip) || !tooltipData.text) { + this._unpinTooltip(); + return; + } + this.balloonPanelView.pin({ + target: this._currentElementWithTooltip, + positions: TooltipManager.getPositioningFunctions(tooltipData.position) + }); + } +} +/** + * A set of default {@link module:utils/dom/position~PositioningFunction positioning functions} used by the `TooltipManager` + * to pin tooltips in different positions. + */ +TooltipManager.defaultBalloonPositions = generatePositions({ + heightOffset: 5, + sideOffset: 13 +}); +/** + * A set of editors the single tooltip manager instance must listen to. + * This is mostly to handle `EditorUI#update` listeners from individual editors. + */ +TooltipManager._editors = new Set(); +/** + * A reference to the `TooltipManager` instance. The class is a singleton and as such, + * successive attempts at creating instances should return this instance. + */ +TooltipManager._instance = null; +export default TooltipManager; +function getDescendantWithTooltip(element) { + if (!isElement(element)) { + return null; + } + return element.closest('[data-cke-tooltip-text]:not([data-cke-tooltip-disabled])'); +} +function getTooltipData(element) { + return { + text: element.dataset.ckeTooltipText, + position: (element.dataset.ckeTooltipPosition || 's'), + cssClass: element.dataset.ckeTooltipClass || '' + }; +} +// Creates a simple `MutationObserver` instance wrapper that observes changes in the tooltip-related attributes of the given element. +// Used instead of the `MutationObserver` from the engine for simplicity. +function createMutationObserver(callback) { + const mutationObserver = new MutationObserver(() => { + callback(); + }); + return { + attach(element) { + mutationObserver.observe(element, { + attributes: true, + attributeFilter: ['data-cke-tooltip-text', 'data-cke-tooltip-position'] + }); + }, + detach() { + mutationObserver.disconnect(); + } + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/view.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/view.d.ts new file mode 100644 index 0000000..72eb6ea --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/view.d.ts @@ -0,0 +1,422 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/view + */ +import ViewCollection from './viewcollection.js'; +import Template, { type BindChain, type TemplateDefinition } from './template.js'; +import { Collection, type DecoratedMethodEvent, type Locale, type LocaleTranslate } from '@ckeditor/ckeditor5-utils'; +import '../theme/globals/globals.css'; +declare const View_base: import("@ckeditor/ckeditor5-utils").Mixed<{ + new (): import("@ckeditor/ckeditor5-utils").Observable; + prototype: import("@ckeditor/ckeditor5-utils").Observable; +}, import("@ckeditor/ckeditor5-utils").DomEmitter>; +/** + * The basic view class, which represents an HTML element created out of a + * {@link module:ui/view~View#template}. Views are building blocks of the user interface and handle + * interaction + * + * Views {@link module:ui/view~View#registerChild aggregate} children in + * {@link module:ui/view~View#createCollection collections} and manage the life cycle of DOM + * listeners e.g. by handling rendering and destruction. + * + * See the {@link module:ui/template~TemplateDefinition} syntax to learn more about shaping view + * elements, attributes and listeners. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * const bind = this.bindTemplate; + * + * // Views define their interface (state) using observable attributes. + * this.set( 'elementClass', 'bar' ); + * + * this.setTemplate( { + * tag: 'p', + * + * // The element of the view can be defined with its children. + * children: [ + * 'Hello', + * { + * tag: 'b', + * children: [ 'world!' ] + * } + * ], + * attributes: { + * class: [ + * 'foo', + * + * // Observable attributes control the state of the view in DOM. + * bind.to( 'elementClass' ) + * ] + * }, + * on: { + * // Views listen to DOM events and propagate them. + * click: bind.to( 'clicked' ) + * } + * } ); + * } + * } + * + * const view = new SampleView( locale ); + * + * view.render(); + * + * // Append

    Helloworld

    to the + * document.body.appendChild( view.element ); + * + * // Change the class attribute to

    Helloworld

    + * view.elementClass = 'baz'; + * + * // Respond to the "click" event in DOM by executing a custom action. + * view.on( 'clicked', () => { + * console.log( 'The view has been clicked!' ); + * } ); + * ``` + */ +export default class View extends View_base { + /** + * An HTML element of the view. `null` until {@link #render rendered} + * from the {@link #template}. + * + * ```ts + * class SampleView extends View { + * constructor() { + * super(); + * + * // A template instance the #element will be created from. + * this.setTemplate( { + * tag: 'p' + * + * // ... + * } ); + * } + * } + * + * const view = new SampleView(); + * + * // Renders the #template. + * view.render(); + * + * // Append the HTML element of the view to . + * document.body.appendChild( view.element ); + * ``` + * + * **Note**: The element of the view can also be assigned directly: + * + * ```ts + * view.element = document.querySelector( '#my-container' ); + * ``` + */ + element: TElement | null; + /** + * Set `true` when the view has already been {@link module:ui/view~View#render rendered}. + * + * @readonly + */ + isRendered: boolean; + /** + * A set of tools to localize the user interface. + * + * Also see {@link module:core/editor/editor~Editor#locale}. + * + * @readonly + */ + locale: Locale | undefined; + /** + * Shorthand for {@link module:utils/locale~Locale#t}. + * + * Note: If {@link #locale} instance hasn't been passed to the view this method may not + * be available. + * + * @see module:utils/locale~Locale#t + */ + t: LocaleTranslate | undefined; + /** + * Template of this view. It provides the {@link #element} representing + * the view in DOM, which is {@link #render rendered}. + */ + template?: Template; + viewUid?: string; + /** + * Collections registered with {@link #createCollection}. + */ + protected _viewCollections: Collection; + /** + * A collection of view instances, which have been added directly + * into the {@link module:ui/template~Template#children}. + */ + protected _unboundChildren: ViewCollection; + /** + * Cached {@link module:ui/template~BindChain bind chain} object created by the + * {@link #template}. See {@link #bindTemplate}. + */ + private _bindTemplate?; + /** + * Creates an instance of the {@link module:ui/view~View} class. + * + * Also see {@link #render}. + * + * @param locale The localization services instance. + */ + constructor(locale?: Locale); + /** + * Shorthand for {@link module:ui/template~Template.bind}, a binding + * {@link module:ui/template~BindChain interface} pre–configured for the view instance. + * + * It provides {@link module:ui/template~BindChain#to `to()`} and + * {@link module:ui/template~BindChain#if `if()`} methods that initialize bindings with + * observable attributes and attach DOM listeners. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * const bind = this.bindTemplate; + * + * // These {@link module:utils/observablemixin~Observable observable} attributes will control + * // the state of the view in DOM. + * this.set( { + * elementClass: 'foo', + * isEnabled: true + * } ); + * + * this.setTemplate( { + * tag: 'p', + * + * attributes: { + * // The class HTML attribute will follow elementClass + * // and isEnabled view attributes. + * class: [ + * bind.to( 'elementClass' ) + * bind.if( 'isEnabled', 'present-when-enabled' ) + * ] + * }, + * + * on: { + * // The view will fire the "clicked" event upon clicking

    in DOM. + * click: bind.to( 'clicked' ) + * } + * } ); + * } + * } + * ``` + */ + get bindTemplate(): BindChain; + /** + * Creates a new collection of views, which can be used as + * {@link module:ui/template~Template#children} of this view. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * const child = new ChildView( locale ); + * this.items = this.createCollection( [ child ] ); + * + * this.setTemplate( { + * tag: 'p', + * + * // `items` collection will render here. + * children: this.items + * } ); + * } + * } + * + * const view = new SampleView( locale ); + * view.render(); + * + * // It will append

    to the . + * document.body.appendChild( view.element ); + * ``` + * + * @param views Initial views of the collection. + * @returns A new collection of view instances. + */ + createCollection(views?: Iterable): ViewCollection; + /** + * Registers a new child view under the view instance. Once registered, a child + * view is managed by its parent, including {@link #render rendering} + * and {@link #destroy destruction}. + * + * To revert this, use {@link #deregisterChild}. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * this.childA = new SomeChildView( locale ); + * this.childB = new SomeChildView( locale ); + * + * this.setTemplate( { tag: 'p' } ); + * + * // Register the children. + * this.registerChild( [ this.childA, this.childB ] ); + * } + * + * render() { + * super.render(); + * + * this.element.appendChild( this.childA.element ); + * this.element.appendChild( this.childB.element ); + * } + * } + * + * const view = new SampleView( locale ); + * + * view.render(); + * + * // Will append

    . + * document.body.appendChild( view.element ); + * ``` + * + * **Note**: There's no need to add child views if they're already referenced in the + * {@link #template}: + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * this.childA = new SomeChildView( locale ); + * this.childB = new SomeChildView( locale ); + * + * this.setTemplate( { + * tag: 'p', + * + * // These children will be added automatically. There's no + * // need to call {@link #registerChild} for any of them. + * children: [ this.childA, this.childB ] + * } ); + * } + * + * // ... + * } + * ``` + * + * @param children Children views to be registered. + */ + registerChild(children: View | Iterable): void; + /** + * The opposite of {@link #registerChild}. Removes a child view from this view instance. + * Once removed, the child is no longer managed by its parent, e.g. it can safely + * become a child of another parent view. + * + * @see #registerChild + * @param children Child views to be removed. + */ + deregisterChild(children: View | Iterable): void; + /** + * Sets the {@link #template} of the view with with given definition. + * + * A shorthand for: + * + * ```ts + * view.setTemplate( definition ); + * ``` + * + * @param definition Definition of view's template. + */ + setTemplate(definition: TemplateDefinition): void; + /** + * {@link module:ui/template~Template.extend Extends} the {@link #template} of the view with + * with given definition. + * + * A shorthand for: + * + * ```ts + * Template.extend( view.template, definition ); + * ``` + * + * **Note**: Is requires the {@link #template} to be already set. See {@link #setTemplate}. + * + * @param definition Definition which extends the {@link #template}. + */ + extendTemplate(definition: Partial): void; + /** + * Recursively renders the view. + * + * Once the view is rendered: + * * the {@link #element} becomes an HTML element out of {@link #template}, + * * the {@link #isRendered} flag is set `true`. + * + * **Note**: The children of the view: + * * defined directly in the {@link #template} + * * residing in collections created by the {@link #createCollection} method, + * * and added by {@link #registerChild} + * are also rendered in the process. + * + * In general, `render()` method is the right place to keep the code which refers to the + * {@link #element} and should be executed at the very beginning of the view's life cycle. + * + * It is possible to {@link module:ui/template~Template.extend} the {@link #template} before + * the view is rendered. To allow an early customization of the view (e.g. by its parent), + * such references should be done in `render()`. + * + * ```ts + * class SampleView extends View { + * constructor() { + * this.setTemplate( { + * // ... + * } ); + * }, + * + * render() { + * // View#element becomes available. + * super.render(); + * + * // The "scroll" listener depends on #element. + * this.listenTo( window, 'scroll', () => { + * // A reference to #element would render the #template and make it non-extendable. + * if ( window.scrollY > 0 ) { + * this.element.scrollLeft = 100; + * } else { + * this.element.scrollLeft = 0; + * } + * } ); + * } + * } + * + * const view = new SampleView(); + * + * // Let's customize the view before it gets rendered. + * view.extendTemplate( { + * attributes: { + * class: [ + * 'additional-class' + * ] + * } + * } ); + * + * // Late rendering allows customization of the view. + * view.render(); + * ``` + */ + render(): void; + /** + * Recursively destroys the view instance and child views added by {@link #registerChild} and + * residing in collections created by the {@link #createCollection}. + * + * Destruction disables all event listeners: + * * created on the view, e.g. `view.on( 'event', () => {} )`, + * * defined in the {@link #template} for DOM events. + */ + destroy(): void; +} +/** + * Event fired by the {@link module:ui/view~View#render} method. Actual rendering is executed as a listener to + * this event with the default priority. + * + * See {@link module:utils/observablemixin~Observable#decorate} for more information and samples. + * + * @eventName ~View#render + */ +export type UIViewRenderEvent = DecoratedMethodEvent; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/view.js b/node_modules/@ckeditor/ckeditor5-ui/src/view.js new file mode 100644 index 0000000..f76366c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/view.js @@ -0,0 +1,396 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* eslint-disable @typescript-eslint/no-invalid-void-type */ +/** + * @module ui/view + */ +import ViewCollection from './viewcollection.js'; +import Template from './template.js'; +import { CKEditorError, Collection, DomEmitterMixin, ObservableMixin, isIterable } from '@ckeditor/ckeditor5-utils'; +import '../theme/globals/globals.css'; +/** + * The basic view class, which represents an HTML element created out of a + * {@link module:ui/view~View#template}. Views are building blocks of the user interface and handle + * interaction + * + * Views {@link module:ui/view~View#registerChild aggregate} children in + * {@link module:ui/view~View#createCollection collections} and manage the life cycle of DOM + * listeners e.g. by handling rendering and destruction. + * + * See the {@link module:ui/template~TemplateDefinition} syntax to learn more about shaping view + * elements, attributes and listeners. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * const bind = this.bindTemplate; + * + * // Views define their interface (state) using observable attributes. + * this.set( 'elementClass', 'bar' ); + * + * this.setTemplate( { + * tag: 'p', + * + * // The element of the view can be defined with its children. + * children: [ + * 'Hello', + * { + * tag: 'b', + * children: [ 'world!' ] + * } + * ], + * attributes: { + * class: [ + * 'foo', + * + * // Observable attributes control the state of the view in DOM. + * bind.to( 'elementClass' ) + * ] + * }, + * on: { + * // Views listen to DOM events and propagate them. + * click: bind.to( 'clicked' ) + * } + * } ); + * } + * } + * + * const view = new SampleView( locale ); + * + * view.render(); + * + * // Append

    Helloworld

    to the + * document.body.appendChild( view.element ); + * + * // Change the class attribute to

    Helloworld

    + * view.elementClass = 'baz'; + * + * // Respond to the "click" event in DOM by executing a custom action. + * view.on( 'clicked', () => { + * console.log( 'The view has been clicked!' ); + * } ); + * ``` + */ +export default class View extends DomEmitterMixin(ObservableMixin()) { + /** + * Creates an instance of the {@link module:ui/view~View} class. + * + * Also see {@link #render}. + * + * @param locale The localization services instance. + */ + constructor(locale) { + super(); + this.element = null; + this.isRendered = false; + this.locale = locale; + this.t = locale && locale.t; + this._viewCollections = new Collection(); + this._unboundChildren = this.createCollection(); + // Pass parent locale to its children. + this._viewCollections.on('add', (evt, collection) => { + collection.locale = locale; + collection.t = locale && locale.t; + }); + this.decorate('render'); + } + /** + * Shorthand for {@link module:ui/template~Template.bind}, a binding + * {@link module:ui/template~BindChain interface} pre–configured for the view instance. + * + * It provides {@link module:ui/template~BindChain#to `to()`} and + * {@link module:ui/template~BindChain#if `if()`} methods that initialize bindings with + * observable attributes and attach DOM listeners. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * const bind = this.bindTemplate; + * + * // These {@link module:utils/observablemixin~Observable observable} attributes will control + * // the state of the view in DOM. + * this.set( { + * elementClass: 'foo', + * isEnabled: true + * } ); + * + * this.setTemplate( { + * tag: 'p', + * + * attributes: { + * // The class HTML attribute will follow elementClass + * // and isEnabled view attributes. + * class: [ + * bind.to( 'elementClass' ) + * bind.if( 'isEnabled', 'present-when-enabled' ) + * ] + * }, + * + * on: { + * // The view will fire the "clicked" event upon clicking

    in DOM. + * click: bind.to( 'clicked' ) + * } + * } ); + * } + * } + * ``` + */ + get bindTemplate() { + if (this._bindTemplate) { + return this._bindTemplate; + } + return (this._bindTemplate = Template.bind(this, this)); + } + /** + * Creates a new collection of views, which can be used as + * {@link module:ui/template~Template#children} of this view. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * const child = new ChildView( locale ); + * this.items = this.createCollection( [ child ] ); + * + * this.setTemplate( { + * tag: 'p', + * + * // `items` collection will render here. + * children: this.items + * } ); + * } + * } + * + * const view = new SampleView( locale ); + * view.render(); + * + * // It will append

    to the . + * document.body.appendChild( view.element ); + * ``` + * + * @param views Initial views of the collection. + * @returns A new collection of view instances. + */ + createCollection(views) { + const collection = new ViewCollection(views); + this._viewCollections.add(collection); + return collection; + } + /** + * Registers a new child view under the view instance. Once registered, a child + * view is managed by its parent, including {@link #render rendering} + * and {@link #destroy destruction}. + * + * To revert this, use {@link #deregisterChild}. + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * this.childA = new SomeChildView( locale ); + * this.childB = new SomeChildView( locale ); + * + * this.setTemplate( { tag: 'p' } ); + * + * // Register the children. + * this.registerChild( [ this.childA, this.childB ] ); + * } + * + * render() { + * super.render(); + * + * this.element.appendChild( this.childA.element ); + * this.element.appendChild( this.childB.element ); + * } + * } + * + * const view = new SampleView( locale ); + * + * view.render(); + * + * // Will append

    . + * document.body.appendChild( view.element ); + * ``` + * + * **Note**: There's no need to add child views if they're already referenced in the + * {@link #template}: + * + * ```ts + * class SampleView extends View { + * constructor( locale ) { + * super( locale ); + * + * this.childA = new SomeChildView( locale ); + * this.childB = new SomeChildView( locale ); + * + * this.setTemplate( { + * tag: 'p', + * + * // These children will be added automatically. There's no + * // need to call {@link #registerChild} for any of them. + * children: [ this.childA, this.childB ] + * } ); + * } + * + * // ... + * } + * ``` + * + * @param children Children views to be registered. + */ + registerChild(children) { + if (!isIterable(children)) { + children = [children]; + } + for (const child of children) { + this._unboundChildren.add(child); + } + } + /** + * The opposite of {@link #registerChild}. Removes a child view from this view instance. + * Once removed, the child is no longer managed by its parent, e.g. it can safely + * become a child of another parent view. + * + * @see #registerChild + * @param children Child views to be removed. + */ + deregisterChild(children) { + if (!isIterable(children)) { + children = [children]; + } + for (const child of children) { + this._unboundChildren.remove(child); + } + } + /** + * Sets the {@link #template} of the view with with given definition. + * + * A shorthand for: + * + * ```ts + * view.setTemplate( definition ); + * ``` + * + * @param definition Definition of view's template. + */ + setTemplate(definition) { + this.template = new Template(definition); + } + /** + * {@link module:ui/template~Template.extend Extends} the {@link #template} of the view with + * with given definition. + * + * A shorthand for: + * + * ```ts + * Template.extend( view.template, definition ); + * ``` + * + * **Note**: Is requires the {@link #template} to be already set. See {@link #setTemplate}. + * + * @param definition Definition which extends the {@link #template}. + */ + extendTemplate(definition) { + Template.extend(this.template, definition); + } + /** + * Recursively renders the view. + * + * Once the view is rendered: + * * the {@link #element} becomes an HTML element out of {@link #template}, + * * the {@link #isRendered} flag is set `true`. + * + * **Note**: The children of the view: + * * defined directly in the {@link #template} + * * residing in collections created by the {@link #createCollection} method, + * * and added by {@link #registerChild} + * are also rendered in the process. + * + * In general, `render()` method is the right place to keep the code which refers to the + * {@link #element} and should be executed at the very beginning of the view's life cycle. + * + * It is possible to {@link module:ui/template~Template.extend} the {@link #template} before + * the view is rendered. To allow an early customization of the view (e.g. by its parent), + * such references should be done in `render()`. + * + * ```ts + * class SampleView extends View { + * constructor() { + * this.setTemplate( { + * // ... + * } ); + * }, + * + * render() { + * // View#element becomes available. + * super.render(); + * + * // The "scroll" listener depends on #element. + * this.listenTo( window, 'scroll', () => { + * // A reference to #element would render the #template and make it non-extendable. + * if ( window.scrollY > 0 ) { + * this.element.scrollLeft = 100; + * } else { + * this.element.scrollLeft = 0; + * } + * } ); + * } + * } + * + * const view = new SampleView(); + * + * // Let's customize the view before it gets rendered. + * view.extendTemplate( { + * attributes: { + * class: [ + * 'additional-class' + * ] + * } + * } ); + * + * // Late rendering allows customization of the view. + * view.render(); + * ``` + */ + render() { + if (this.isRendered) { + /** + * This View has already been rendered. + * + * @error ui-view-render-already-rendered + */ + throw new CKEditorError('ui-view-render-already-rendered', this); + } + // Render #element of the view. + if (this.template) { + this.element = this.template.render(); + // Auto–register view children from #template. + this.registerChild(this.template.getViews()); + } + this.isRendered = true; + } + /** + * Recursively destroys the view instance and child views added by {@link #registerChild} and + * residing in collections created by the {@link #createCollection}. + * + * Destruction disables all event listeners: + * * created on the view, e.g. `view.on( 'event', () => {} )`, + * * defined in the {@link #template} for DOM events. + */ + destroy() { + this.stopListening(); + this._viewCollections.map(c => c.destroy()); + // Template isn't obligatory for views. + if (this.template && this.template._revertData) { + this.template.revert(this.element); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.d.ts b/node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.d.ts new file mode 100644 index 0000000..4049db2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.d.ts @@ -0,0 +1,139 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/viewcollection + */ +import { Collection, type EmitterMixinDelegateChain } from '@ckeditor/ckeditor5-utils'; +import type View from './view.js'; +/** + * Collects {@link module:ui/view~View} instances. + * + * ```ts + * const parentView = new ParentView( locale ); + * const collection = new ViewCollection( locale ); + * + * collection.setParent( parentView.element ); + * + * const viewA = new ChildView( locale ); + * const viewB = new ChildView( locale ); + * ``` + * + * View collection renders and manages view {@link module:ui/view~View#element elements}: + * + * ```ts + * collection.add( viewA ); + * collection.add( viewB ); + * + * console.log( parentView.element.firsChild ); // -> viewA.element + * console.log( parentView.element.lastChild ); // -> viewB.element + * ``` + * + * It {@link module:ui/viewcollection~ViewCollection#delegate propagates} DOM events too: + * + * ```ts + * // Delegate #click and #keydown events from viewA and viewB to the parentView. + * collection.delegate( 'click' ).to( parentView ); + * + * parentView.on( 'click', ( evt ) => { + * console.log( `${ evt.source } has been clicked.` ); + * } ); + * + * // This event will be delegated to the parentView. + * viewB.fire( 'click' ); + * ``` + * + * **Note**: A view collection can be used directly in the {@link module:ui/template~TemplateDefinition definition} + * of a {@link module:ui/template~Template template}. + */ +export default class ViewCollection extends Collection { + id?: string; + /** + * A parent element within which child views are rendered and managed in DOM. + */ + private _parentElement; + /** + * Creates a new instance of the {@link module:ui/viewcollection~ViewCollection}. + * + * @param initialItems The initial items of the collection. + */ + constructor(initialItems?: Iterable); + /** + * Destroys the view collection along with child views. + * See the view {@link module:ui/view~View#destroy} method. + */ + destroy(): void; + /** + * Sets the parent HTML element of this collection. When parent is set, {@link #add adding} and + * {@link #remove removing} views in the collection synchronizes their + * {@link module:ui/view~View#element elements} in the parent element. + * + * @param element A new parent element. + */ + setParent(elementOrDocFragment: DocumentFragment | HTMLElement): void; + /** + * Delegates selected events coming from within views in the collection to any + * {@link module:utils/emittermixin~Emitter}. + * + * For the following views and collection: + * + * ```ts + * const viewA = new View(); + * const viewB = new View(); + * const viewC = new View(); + * + * const views = parentView.createCollection(); + * + * views.delegate( 'eventX' ).to( viewB ); + * views.delegate( 'eventX', 'eventY' ).to( viewC ); + * + * views.add( viewA ); + * ``` + * + * the `eventX` is delegated (fired by) `viewB` and `viewC` along with `customData`: + * + * ```ts + * viewA.fire( 'eventX', customData ); + * ``` + * + * and `eventY` is delegated (fired by) `viewC` along with `customData`: + * + * ```ts + * viewA.fire( 'eventY', customData ); + * ``` + * + * See {@link module:utils/emittermixin~Emitter#delegate}. + * + * @param events {@link module:ui/view~View} event names to be delegated to another + * {@link module:utils/emittermixin~Emitter}. + * @returns Object with `to` property, a function which accepts the destination + * of {@link module:utils/emittermixin~Emitter#delegate delegated} events. + */ + delegate(...events: Array): EmitterMixinDelegateChain; + /** + * This method {@link module:ui/view~View#render renders} a new view added to the collection. + * + * If the {@link #_parentElement parent element} of the collection is set, this method also adds + * the view's {@link module:ui/view~View#element} as a child of the parent in DOM at a specified index. + * + * **Note**: If index is not specified, the view's element is pushed as the last child + * of the parent element. + * + * @param view A new view added to the collection. + * @param index An index the view holds in the collection. When not specified, + * the view is added at the end. + */ + private _renderViewIntoCollectionParent; + /** + * Removes a child view from the collection. If the {@link #setParent parent element} of the + * collection has been set, the {@link module:ui/view~View#element element} of the view is also removed + * in DOM, reflecting the order of the collection. + * + * See the {@link #add} method. + * + * @param subject The view to remove, its id or index in the collection. + * @returns The removed view. + */ + remove(subject: TView | number | string): TView; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.js b/node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.js new file mode 100644 index 0000000..e1296de --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/src/viewcollection.js @@ -0,0 +1,206 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module ui/viewcollection + */ +import { CKEditorError, Collection } from '@ckeditor/ckeditor5-utils'; +/** + * Collects {@link module:ui/view~View} instances. + * + * ```ts + * const parentView = new ParentView( locale ); + * const collection = new ViewCollection( locale ); + * + * collection.setParent( parentView.element ); + * + * const viewA = new ChildView( locale ); + * const viewB = new ChildView( locale ); + * ``` + * + * View collection renders and manages view {@link module:ui/view~View#element elements}: + * + * ```ts + * collection.add( viewA ); + * collection.add( viewB ); + * + * console.log( parentView.element.firsChild ); // -> viewA.element + * console.log( parentView.element.lastChild ); // -> viewB.element + * ``` + * + * It {@link module:ui/viewcollection~ViewCollection#delegate propagates} DOM events too: + * + * ```ts + * // Delegate #click and #keydown events from viewA and viewB to the parentView. + * collection.delegate( 'click' ).to( parentView ); + * + * parentView.on( 'click', ( evt ) => { + * console.log( `${ evt.source } has been clicked.` ); + * } ); + * + * // This event will be delegated to the parentView. + * viewB.fire( 'click' ); + * ``` + * + * **Note**: A view collection can be used directly in the {@link module:ui/template~TemplateDefinition definition} + * of a {@link module:ui/template~Template template}. + */ +export default class ViewCollection extends Collection { + /** + * Creates a new instance of the {@link module:ui/viewcollection~ViewCollection}. + * + * @param initialItems The initial items of the collection. + */ + constructor(initialItems = []) { + super(initialItems, { + // An #id Number attribute should be legal and not break the `ViewCollection` instance. + // https://github.com/ckeditor/ckeditor5-ui/issues/93 + idProperty: 'viewUid' + }); + // Handle {@link module:ui/view~View#element} in DOM when a new view is added to the collection. + this.on('add', (evt, view, index) => { + this._renderViewIntoCollectionParent(view, index); + }); + // Handle {@link module:ui/view~View#element} in DOM when a view is removed from the collection. + this.on('remove', (evt, view) => { + if (view.element && this._parentElement) { + view.element.remove(); + } + }); + this._parentElement = null; + } + /** + * Destroys the view collection along with child views. + * See the view {@link module:ui/view~View#destroy} method. + */ + destroy() { + this.map(view => view.destroy()); + } + /** + * Sets the parent HTML element of this collection. When parent is set, {@link #add adding} and + * {@link #remove removing} views in the collection synchronizes their + * {@link module:ui/view~View#element elements} in the parent element. + * + * @param element A new parent element. + */ + setParent(elementOrDocFragment) { + this._parentElement = elementOrDocFragment; + // Take care of the initial collection items passed to the constructor. + for (const view of this) { + this._renderViewIntoCollectionParent(view); + } + } + /** + * Delegates selected events coming from within views in the collection to any + * {@link module:utils/emittermixin~Emitter}. + * + * For the following views and collection: + * + * ```ts + * const viewA = new View(); + * const viewB = new View(); + * const viewC = new View(); + * + * const views = parentView.createCollection(); + * + * views.delegate( 'eventX' ).to( viewB ); + * views.delegate( 'eventX', 'eventY' ).to( viewC ); + * + * views.add( viewA ); + * ``` + * + * the `eventX` is delegated (fired by) `viewB` and `viewC` along with `customData`: + * + * ```ts + * viewA.fire( 'eventX', customData ); + * ``` + * + * and `eventY` is delegated (fired by) `viewC` along with `customData`: + * + * ```ts + * viewA.fire( 'eventY', customData ); + * ``` + * + * See {@link module:utils/emittermixin~Emitter#delegate}. + * + * @param events {@link module:ui/view~View} event names to be delegated to another + * {@link module:utils/emittermixin~Emitter}. + * @returns Object with `to` property, a function which accepts the destination + * of {@link module:utils/emittermixin~Emitter#delegate delegated} events. + */ + delegate(...events) { + if (!events.length || !isStringArray(events)) { + /** + * All event names must be strings. + * + * @error ui-viewcollection-delegate-wrong-events + */ + throw new CKEditorError('ui-viewcollection-delegate-wrong-events', this); + } + return { + to: dest => { + // Activate delegating on existing views in this collection. + for (const view of this) { + for (const evtName of events) { + view.delegate(evtName).to(dest); + } + } + // Activate delegating on future views in this collection. + this.on('add', (evt, view) => { + for (const evtName of events) { + view.delegate(evtName).to(dest); + } + }); + // Deactivate delegating when view is removed from this collection. + this.on('remove', (evt, view) => { + for (const evtName of events) { + view.stopDelegating(evtName, dest); + } + }); + } + }; + } + /** + * This method {@link module:ui/view~View#render renders} a new view added to the collection. + * + * If the {@link #_parentElement parent element} of the collection is set, this method also adds + * the view's {@link module:ui/view~View#element} as a child of the parent in DOM at a specified index. + * + * **Note**: If index is not specified, the view's element is pushed as the last child + * of the parent element. + * + * @param view A new view added to the collection. + * @param index An index the view holds in the collection. When not specified, + * the view is added at the end. + */ + _renderViewIntoCollectionParent(view, index) { + if (!view.isRendered) { + view.render(); + } + if (view.element && this._parentElement) { + this._parentElement.insertBefore(view.element, this._parentElement.children[index]); + } + } + /** + * Removes a child view from the collection. If the {@link #setParent parent element} of the + * collection has been set, the {@link module:ui/view~View#element element} of the view is also removed + * in DOM, reflecting the order of the collection. + * + * See the {@link #add} method. + * + * @param subject The view to remove, its id or index in the collection. + * @returns The removed view. + */ + remove(subject) { + return super.remove(subject); + } +} +/** + * Check if all entries of the array are of `String` type. + * + * @param arr An array to be checked. + */ +function isStringArray(arr) { + return arr.every(a => typeof a == 'string'); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/arialiveannouncer/arialiveannouncer.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/arialiveannouncer/arialiveannouncer.css new file mode 100644 index 0000000..be1db3e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/arialiveannouncer/arialiveannouncer.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-aria-live-announcer { + position: absolute; + left: -10000px; + top: -10000px; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/autocomplete/autocomplete.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/autocomplete/autocomplete.css new file mode 100644 index 0000000..bcbf443 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/autocomplete/autocomplete.css @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-autocomplete { + position: relative; + + & > .ck-search__results { + position: absolute; + z-index: var(--ck-z-panel); + + &.ck-search__results_n { + bottom: 100%; + } + + &.ck-search__results_s { + top: 100%; + bottom: auto; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css new file mode 100644 index 0000000..b58c35a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/button/button.css @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "../../mixins/_unselectable.css"; +@import "../../mixins/_dir.css"; + +.ck.ck-button, +a.ck.ck-button { + @mixin ck-unselectable; + + position: relative; + display: inline-flex; + align-items: center; + + @mixin ck-dir ltr { + justify-content: left; + } + + @mixin ck-dir rtl { + justify-content: right; + } + + & .ck-button__label { + display: none; + } + + &.ck-button_with-text { + & .ck-button__label { + display: inline-block; + } + } + + /* Center the icon horizontally in a button without text. */ + &:not(.ck-button_with-text) { + justify-content: center; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css new file mode 100644 index 0000000..3e32531 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/button/switchbutton.css @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-button.ck-switchbutton { + & .ck-button__toggle { + display: block; + + & .ck-button__toggle__inner { + display: block; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/collapsible/collapsible.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/collapsible/collapsible.css new file mode 100644 index 0000000..9870007 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/collapsible/collapsible.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-collapsible.ck-collapsible_collapsed { + & > .ck-collapsible__children { + display: none; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css new file mode 100644 index 0000000..2d372e3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorgrid/colorgrid.css @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-color-grid { + display: grid; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css new file mode 100644 index 0000000..510bf24 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorpicker/colorpicker.css @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.color-picker-hex-input { + width: max-content; + + & .ck.ck-input { + min-width: unset; + } +} + +.ck.ck-color-picker__row { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + margin: var(--ck-spacing-large) 0 0; + width: unset; + + & .ck.ck-labeled-field-view { + padding-top: unset; + } + + & .ck.ck-input-text { + width: unset; + } + + & .ck-color-picker__hash-view { + padding-top: var(--ck-spacing-tiny); + padding-right: var(--ck-spacing-medium); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorselector/colorselector.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorselector/colorselector.css new file mode 100644 index 0000000..7d84861 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/colorselector/colorselector.css @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css"; + +.ck.ck-color-selector { + /* View fragment with color grids. */ + & .ck-color-grids-fragment { + & .ck-button.ck-color-selector__remove-color, + & .ck-button.ck-color-selector__color-picker { + display: flex; + align-items: center; + + @mixin ck-dir rtl { + justify-content: flex-start; + } + } + } + + /* View fragment with a color picker. */ + & .ck-color-picker-fragment { + & .ck.ck-color-selector_action-bar { + display: flex; + flex-direction: row; + justify-content: space-around; + + & .ck-button-save, + & .ck-button-cancel { + flex: 1 + } + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialog.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialog.css new file mode 100644 index 0000000..452dce2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialog.css @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-dialog-overlay { + user-select: none; + overscroll-behavior: none; + + position: fixed; + bottom: 0; + left: 0; + right: 0; + top: 0; + + &.ck-dialog-overlay__transparent { + pointer-events: none; + animation: none; + background: none; + } +} + +.ck.ck-dialog { + overscroll-behavior: none; + width: fit-content; + position: absolute; + + & .ck.ck-form__header { + flex-shrink: 0; + + & .ck-form__header__label { + cursor: grab; + } + } + + @nest .ck.ck-dialog-overlay.ck-dialog-overlay__transparent & { + pointer-events: all; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialogactions.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialogactions.css new file mode 100644 index 0000000..8db5039 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dialog/dialogactions.css @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-dialog { + & .ck.ck-dialog__actions { + display: flex; + justify-content: flex-end; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css new file mode 100644 index 0000000..f3da668 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/dropdown.css @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + --ck-dropdown-max-width: 75vw; +} + +.ck.ck-dropdown { + display: inline-block; + position: relative; + + & .ck-dropdown__arrow { + pointer-events: none; + z-index: var(--ck-z-default); + } + + /* Dropdown button should span horizontally, e.g. in vertical toolbars */ + & .ck-button.ck-dropdown__button { + width: 100%; + } + + & .ck-dropdown__panel { + display: none; + z-index: var(--ck-z-panel); + max-width: var(--ck-dropdown-max-width); + + position: absolute; + + &.ck-dropdown__panel-visible { + display: inline-block; + } + + &.ck-dropdown__panel_ne, + &.ck-dropdown__panel_nw, + &.ck-dropdown__panel_n, + &.ck-dropdown__panel_nmw, + &.ck-dropdown__panel_nme { + bottom: 100%; + } + + &.ck-dropdown__panel_se, + &.ck-dropdown__panel_sw, + &.ck-dropdown__panel_smw, + &.ck-dropdown__panel_sme, + &.ck-dropdown__panel_s { + /* + * Using transform: translate3d( 0, 100%, 0 ) causes blurry dropdown on Chrome 67-78+ on non-retina displays. + * See https://github.com/ckeditor/ckeditor5/issues/1053. + */ + top: 100%; + bottom: auto; + } + + &.ck-dropdown__panel_ne, + &.ck-dropdown__panel_se { + left: 0px; + } + + &.ck-dropdown__panel_nw, + &.ck-dropdown__panel_sw { + right: 0px; + } + + &.ck-dropdown__panel_s, + &.ck-dropdown__panel_n { + /* Positioning panels relative to the center of the button */ + left: 50%; + transform: translateX(-50%); + } + + &.ck-dropdown__panel_nmw, + &.ck-dropdown__panel_smw { + /* Positioning panels relative to the middle-west of the button */ + left: 75%; + transform: translateX(-75%); + } + + &.ck-dropdown__panel_nme, + &.ck-dropdown__panel_sme { + /* Positioning panels relative to the middle-east of the button */ + left: 25%; + transform: translateX(-25%); + } + } +} + +/* + * Toolbar dropdown panels should be always above the UI (eg. other dropdown panels) from the editor's content. + * See https://github.com/ckeditor/ckeditor5/issues/7874 + */ +.ck.ck-toolbar .ck-dropdown__panel { + z-index: calc( var(--ck-z-panel) + 1 ); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/listdropdown.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/listdropdown.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/listdropdown.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css new file mode 100644 index 0000000..cdd5145 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/splitbutton.css @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-splitbutton { + /* Enable font size inheritance, which allows fluid UI scaling. */ + font-size: inherit; + + & .ck-splitbutton__action:focus { + z-index: calc(var(--ck-z-default) + 1); + } +} + diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css new file mode 100644 index 0000000..c97f0ee --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/dropdown/toolbardropdown.css @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + --ck-toolbar-dropdown-max-width: 60vw; +} + +.ck.ck-toolbar-dropdown > .ck-dropdown__panel { + /* https://github.com/ckeditor/ckeditor5/issues/5586 */ + width: max-content; + max-width: var(--ck-toolbar-dropdown-max-width); + + & .ck-button { + &:focus { + z-index: calc(var(--ck-z-default) + 1); + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/accessibilityhelp.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/accessibilityhelp.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/accessibilityhelp.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/editorui.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/editorui.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/editorui/editorui.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css new file mode 100644 index 0000000..889bd00 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/formheader/formheader.css @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-form__header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: space-between; + + & h2.ck-form__header__label { + flex-grow: 1; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/highlightedtext/highlightedtext.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/highlightedtext/highlightedtext.css new file mode 100644 index 0000000..96fdae4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/highlightedtext/highlightedtext.css @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-highlighted-text mark { + background: var(--ck-color-highlight-background); + vertical-align: initial; + font-weight: inherit; + line-height: inherit; + font-size: inherit; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css new file mode 100644 index 0000000..b9ff7f2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/icon/icon.css @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-icon { + vertical-align: middle; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/input/input.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/input/input.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/input/input.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css new file mode 100644 index 0000000..e422e45 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/label/label.css @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-label { + display: block; +} + +.ck.ck-voice-label { + display: none; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css new file mode 100644 index 0000000..0184053 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledfield/labeledfieldview.css @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-labeled-field-view { + & > .ck.ck-labeled-field-view__input-wrapper { + display: flex; + position: relative; + } + + & .ck.ck-label { + display: block; + position: absolute; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledinput/labeledinput.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledinput/labeledinput.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/labeledinput/labeledinput.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css new file mode 100644 index 0000000..499ad12 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/list/list.css @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "../../mixins/_unselectable.css"; + +.ck.ck-list { + @mixin ck-unselectable; + + display: flex; + flex-direction: column; + + & .ck-list__item, + & .ck-list__separator { + display: block; + } + + /* Make sure that whatever child of the list item gets focus, it remains on the + top. Thanks to that, styles like box-shadow, outline, etc. are not masked by + adjacent list items. */ + & .ck-list__item > *:focus { + position: relative; + z-index: var(--ck-z-default); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubar.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubar.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubar.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenu.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenu.css new file mode 100644 index 0000000..25827ef --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenu.css @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-menu-bar__menu { + display: block; + position: relative; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenubutton.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenubutton.css new file mode 100644 index 0000000..116e66a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenubutton.css @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-menu-bar__menu { + & > .ck-menu-bar__menu__button > .ck-menu-bar__menu__button__arrow { + pointer-events: none; + z-index: var(--ck-z-default); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitem.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitem.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitem.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitembutton.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitembutton.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenulistitembutton.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenupanel.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenupanel.css new file mode 100644 index 0000000..834c797 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/menubar/menubarmenupanel.css @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + --ck-menu-bar-menu-max-width: 75vw; + --ck-menu-bar-nested-menu-horizontal-offset: 5px; +} + +.ck.ck-menu-bar__menu > .ck.ck-menu-bar__menu__panel { + z-index: var(--ck-z-panel); + max-width: var(--ck-menu-bar-menu-max-width); + position: absolute; + + &.ck-menu-bar__menu__panel_position_ne, + &.ck-menu-bar__menu__panel_position_nw { + bottom: 100%; + } + + &.ck-menu-bar__menu__panel_position_se, + &.ck-menu-bar__menu__panel_position_sw { + top: 100%; + bottom: auto; + } + + &.ck-menu-bar__menu__panel_position_ne, + &.ck-menu-bar__menu__panel_position_se { + left: 0px; + } + + &.ck-menu-bar__menu__panel_position_nw, + &.ck-menu-bar__menu__panel_position_sw { + right: 0px; + } + + &.ck-menu-bar__menu__panel_position_es, + &.ck-menu-bar__menu__panel_position_en { + left: calc( 100% - var(--ck-menu-bar-nested-menu-horizontal-offset) ); + } + + &.ck-menu-bar__menu__panel_position_es { + top: 0px; + } + + &.ck-menu-bar__menu__panel_position_en { + bottom: 0px; + } + + &.ck-menu-bar__menu__panel_position_ws, + &.ck-menu-bar__menu__panel_position_wn { + right: calc( 100% - var(--ck-menu-bar-nested-menu-horizontal-offset) ); + } + + &.ck-menu-bar__menu__panel_position_ws { + top: 0px; + } + + &.ck-menu-bar__menu__panel_position_wn { + bottom: 0px; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css new file mode 100644 index 0000000..c277a22 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonpanel.css @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + /* Make sure the balloon arrow does not float over its children. */ + --ck-balloon-panel-arrow-z-index: calc(var(--ck-z-default) - 3); +} + +.ck.ck-balloon-panel { + display: none; + position: absolute; + + z-index: var(--ck-z-panel); + + &.ck-balloon-panel_with-arrow { + &::before, + &::after { + content: ""; + position: absolute; + } + + &::before { + z-index: var(--ck-balloon-panel-arrow-z-index); + } + + &::after { + z-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1); + } + } + + &[class*="arrow_n"] { + &::before { + z-index: var(--ck-balloon-panel-arrow-z-index); + } + + &::after { + z-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1); + } + } + + &[class*="arrow_s"] { + &::before { + z-index: var(--ck-balloon-panel-arrow-z-index); + } + + &::after { + z-index: calc(var(--ck-balloon-panel-arrow-z-index) + 1); + } + } + + &.ck-balloon-panel_visible { + display: block; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css new file mode 100644 index 0000000..5599fc0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/balloonrotator.css @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck .ck-balloon-rotator__navigation { + display: flex; + align-items: center; + justify-content: center; +} + +/* Buttons inside a toolbar should be centered when rotator bar is wider. + * See: https://github.com/ckeditor/ckeditor5-ui/issues/495 + */ +.ck .ck-balloon-rotator__content .ck-toolbar { + justify-content: center; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css new file mode 100644 index 0000000..25c88b7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/fakepanel.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck .ck-fake-panel { + position: absolute; + + /* Fake panels should be placed under main balloon content. */ + z-index: calc(var(--ck-z-panel) - 1); +} + +.ck .ck-fake-panel div { + position: absolute; +} + +.ck .ck-fake-panel div:nth-child( 1 ) { + z-index: 2; +} + +.ck .ck-fake-panel div:nth-child( 2 ) { + z-index: 1; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css new file mode 100644 index 0000000..63d54cc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/panel/stickypanel.css @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-sticky-panel { + & .ck-sticky-panel__content_sticky { + z-index: var(--ck-z-panel); /* #315 */ + position: fixed; + top: 0; + } + + & .ck-sticky-panel__content_sticky_bottom-limit { + top: auto; + position: absolute; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css new file mode 100644 index 0000000..fc0f247 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css"; + +.ck-vertical-form .ck-button { + &::after { + content: ""; + width: 0; + position: absolute; + right: -1px; + top: -1px; + bottom: -1px; + z-index: 1; + } + + &:focus::after { + display: none; + } +} + +.ck.ck-responsive-form { + @mixin ck-media-phone { + & .ck-button { + &::after { + content: ""; + width: 0; + position: absolute; + right: -1px; + top: -1px; + bottom: -1px; + z-index: 1; + } + + &:focus::after { + display: none; + } + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/search/search.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/search/search.css new file mode 100644 index 0000000..5e02a70 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/search/search.css @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "@ckeditor/ckeditor5-ui/theme/mixins/_dir.css"; + +.ck.ck-search { + & > .ck-labeled-field-view { + & > .ck-labeled-field-view__input-wrapper > .ck-icon { + position: absolute; + top: 50%; + transform: translateY(-50%); + + @mixin ck-dir ltr { + left: var(--ck-spacing-medium); + } + + @mixin ck-dir rtl { + right: var(--ck-spacing-medium); + } + } + + & .ck-search__reset { + position: absolute; + top: 50%; + transform: translateY(-50%); + } + } + + & > .ck-search__results { + & > .ck-search__info { + & > span:first-child { + display: block; + } + + /* Hide the filtered view when nothing was found */ + &:not(.ck-hidden) ~ * { + display: none; + } + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/spinner/spinner.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/spinner/spinner.css new file mode 100644 index 0000000..7666f9f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/spinner/spinner.css @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + --ck-toolbar-spinner-size: 18px; +} + +.ck.ck-spinner-container { + display: block; + position: relative; +} + +.ck.ck-spinner { + position: absolute; + top: 50%; + left: 0; + right: 0; + margin: 0 auto; + transform: translateY(-50%); + z-index: 1; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/textarea/textarea.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/textarea/textarea.css new file mode 100644 index 0000000..061e059 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/textarea/textarea.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/* + * Note: This file should contain the wireframe styles only. But since there are no such styles, + * it acts as a message to the builder telling that it should look for the corresponding styles + * **in the theme** when compiling the editor. + */ diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css new file mode 100644 index 0000000..41266ec --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/blocktoolbar.css @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-block-toolbar-button { + position: absolute; + z-index: var(--ck-z-default); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css new file mode 100644 index 0000000..ef3ff5d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/toolbar/toolbar.css @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "../../mixins/_unselectable.css"; + +.ck.ck-toolbar { + @mixin ck-unselectable; + + display: flex; + flex-flow: row nowrap; + align-items: center; + + & > .ck-toolbar__items { + display: flex; + flex-flow: row wrap; + align-items: center; + flex-grow: 1; + + } + + & .ck.ck-toolbar__separator { + display: inline-block; + + /* + * A leading or trailing separator makes no sense (separates from nothing on one side). + * For instance, it can happen when toolbar items (also separators) are getting grouped one by one and + * moved to another toolbar in the dropdown. + */ + &:first-child, + &:last-child { + display: none; + } + } + + & .ck-toolbar__line-break { + flex-basis: 100%; + } + + &.ck-toolbar_grouping > .ck-toolbar__items { + flex-wrap: nowrap; + } + + &.ck-toolbar_vertical > .ck-toolbar__items { + flex-direction: column; + } + + &.ck-toolbar_floating > .ck-toolbar__items { + flex-wrap: nowrap; + } + + & > .ck.ck-toolbar__grouped-dropdown { + & > .ck-dropdown__button .ck-dropdown__arrow { + display: none; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css b/node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css new file mode 100644 index 0000000..e04ccb5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/components/tooltip/tooltip.css @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-balloon-panel.ck-tooltip { + z-index: calc( var(--ck-z-dialog) + 100 ); +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css new file mode 100644 index 0000000..feeb8e4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_hidden.css @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * A class which hides an element in DOM. + */ +.ck-hidden { + /* Override selector specificity. Otherwise, all elements with some display + style defined will override this one, which is not a desired result. */ + display: none !important; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_poweredby.css b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_poweredby.css new file mode 100644 index 0000000..af5f33b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_poweredby.css @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + --ck-powered-by-line-height: 10px; + --ck-powered-by-padding-vertical: 2px; + --ck-powered-by-padding-horizontal: 4px; + --ck-powered-by-text-color: hsl(0, 0%, 31%); + --ck-powered-by-border-radius: var(--ck-border-radius); + --ck-powered-by-background: hsl(0, 0%, 100%); + --ck-powered-by-border-color: var(--ck-color-focus-border); +} + +.ck.ck-balloon-panel.ck-powered-by-balloon { + --ck-border-radius: var(--ck-powered-by-border-radius); + + box-shadow: none; + background: var(--ck-powered-by-background); + min-height: unset; + z-index: calc( var(--ck-z-panel) - 1 ); + + & .ck.ck-powered-by { + line-height: var(--ck-powered-by-line-height); + + & a { + cursor: pointer; + display: flex; + align-items: center; + opacity: .66; + filter: grayscale(80%); + line-height: var(--ck-powered-by-line-height); + padding: var(--ck-powered-by-padding-vertical) var(--ck-powered-by-padding-horizontal); + } + + & .ck-powered-by__label { + font-size: 7.5px; + letter-spacing: -.2px; + padding-left: 2px; + text-transform: uppercase; + font-weight: bold; + margin-right: 4px; + cursor: pointer; + line-height: normal; + color: var(--ck-powered-by-text-color); + + } + + & .ck-icon { + display: block; + cursor: pointer; + } + + &:hover { + & a { + filter: grayscale(0%); + opacity: 1; + } + } + } + + &[class*="position_inside"] { + border-color: transparent; + } + + &[class*="position_border"] { + border: var(--ck-focus-ring); + border-color: var(--ck-powered-by-border-color); + } +} + diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css new file mode 100644 index 0000000..d19b884 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_reset.css @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +.ck.ck-reset, +.ck.ck-reset_all, +.ck-reset_all *:not(.ck-reset_all-excluded *) { + box-sizing: border-box; + width: auto; + height: auto; + position: static; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css new file mode 100644 index 0000000..a66cfd7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_transition.css @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * A class that disables all transitions of the element and its children. + */ +.ck-transitions-disabled, +.ck-transitions-disabled * { + transition: none !important; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css new file mode 100644 index 0000000..501988b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/_zindex.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +:root { + --ck-z-default: 1; + --ck-z-panel: calc( var(--ck-z-default) + 999 ); + --ck-z-dialog: 9999; +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/globals/globals.css b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/globals.css new file mode 100644 index 0000000..f0fb6c3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/globals/globals.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@import "./_hidden.css"; +@import "./_reset.css"; +@import "./_zindex.css"; +@import "./_transition.css"; +@import "./_poweredby.css"; diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/icons/accessibility.svg b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/accessibility.svg new file mode 100644 index 0000000..bbd7c7d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/accessibility.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/icons/color-tile-check.svg b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/color-tile-check.svg new file mode 100644 index 0000000..67e27d4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/color-tile-check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/icons/dropdown-arrow.svg b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/dropdown-arrow.svg new file mode 100644 index 0000000..84ffa9f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/dropdown-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/icons/project-logo.svg b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/project-logo.svg new file mode 100644 index 0000000..acf9f2c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/icons/project-logo.svg @@ -0,0 +1 @@ + diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_dir.css b/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_dir.css new file mode 100644 index 0000000..21a6158 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_dir.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@define-mixin ck-dir $direction { + @nest [dir="$(direction)"] & { + @mixin-content; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css b/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css new file mode 100644 index 0000000..3f45fb1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_rwd.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +@define-mixin ck-media-phone { + @media screen and (max-width: 600px) { + @mixin-content; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css b/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css new file mode 100644 index 0000000..bf6f1c4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-ui/theme/mixins/_unselectable.css @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +/** + * Makes element unselectable. + */ +@define-mixin ck-unselectable { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-undo/CHANGELOG.md new file mode 100644 index 0000000..70bb88e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/CHANGELOG.md @@ -0,0 +1,204 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v18.0.0...v19.0.0) (April 29, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v16.0.0...v17.0.0) (February 19, 2020) + +### Bug fixes + +* Focus the editor before executing toolbar buttons' command. See [ckeditor/ckeditor5#353](https://github.com/ckeditor/ckeditor5/issues/353). ([f56cc26](https://github.com/ckeditor/ckeditor5-undo/commit/f56cc26)) + +### Other changes + +* Updated translations. ([847543d](https://github.com/ckeditor/ckeditor5-undo/commit/847543d)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v15.0.0...v16.0.0) (December 4, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v11.0.5...v15.0.0) (October 23, 2019) + +### Other changes + +* Added `pluginName` property to editing plugin. ([0b19643](https://github.com/ckeditor/ckeditor5-undo/commit/0b19643)) +* Updated translations. ([c37a6c4](https://github.com/ckeditor/ckeditor5-undo/commit/c37a6c4)) ([1005475](https://github.com/ckeditor/ckeditor5-undo/commit/1005475)) + + +## [11.0.5](https://github.com/ckeditor/ckeditor5-undo/compare/v11.0.4...v11.0.5) (August 26, 2019) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([da87bf9](https://github.com/ckeditor/ckeditor5-undo/commit/da87bf9)) +* Made the undo and redo button icons match the editor UI language direction. See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([e5df329](https://github.com/ckeditor/ckeditor5-undo/commit/e5df329)) +* Updated translations. ([6f5803f](https://github.com/ckeditor/ckeditor5-undo/commit/6f5803f)) + + +## [11.0.4](https://github.com/ckeditor/ckeditor5-undo/compare/v11.0.3...v11.0.4) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.0.3](https://github.com/ckeditor/ckeditor5-undo/compare/v11.0.2...v11.0.3) (July 4, 2019) + +### Other changes + +* Use transparent batches in undo & redo commands. Closes [#97](https://github.com/ckeditor/ckeditor5-undo/issues/97). ([ef8b640](https://github.com/ckeditor/ckeditor5-undo/commit/ef8b640)) + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-undo/compare/v11.0.1...v11.0.2) (June 6, 2019) + +### Other changes + +* Updated translations. ([af36370](https://github.com/ckeditor/ckeditor5-undo/commit/af36370)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-undo/compare/v11.0.0...v11.0.1) (April 4, 2019) + +### Other changes + +* Updated translations. ([69faf7c](https://github.com/ckeditor/ckeditor5-undo/commit/69faf7c)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v10.0.4...v11.0.0) (February 28, 2019) + +### Other changes + +* Updated translations. ([b4b0015](https://github.com/ckeditor/ckeditor5-undo/commit/b4b0015)) ([345a34e](https://github.com/ckeditor/ckeditor5-undo/commit/345a34e)) ([5197001](https://github.com/ckeditor/ckeditor5-undo/commit/5197001)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-undo/compare/v10.0.3...v10.0.4) (December 5, 2018) + +### Other changes + +* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([6c8959b](https://github.com/ckeditor/ckeditor5-undo/commit/6c8959b)) +* Updated translations. ([b2fe351](https://github.com/ckeditor/ckeditor5-undo/commit/b2fe351)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-undo/compare/v10.0.2...v10.0.3) (October 8, 2018) + +### Other changes + +* Updated translations. ([7aec2df](https://github.com/ckeditor/ckeditor5-undo/commit/7aec2df)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-undo/compare/v10.0.1...v10.0.2) (July 18, 2018) + +### Other changes + +* Updated translations. ([433de24](https://github.com/ckeditor/ckeditor5-undo/commit/433de24)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-undo/compare/v10.0.0...v10.0.1) (June 21, 2018) + +### Other changes + +* Updated translations. ([d5942d5](https://github.com/ckeditor/ckeditor5-undo/commit/d5942d5)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-undo/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([bba4a8a](https://github.com/ckeditor/ckeditor5-undo/commit/bba4a8a)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-undo/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-undo/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +### Bug fixes + +* `UndoCommand` and `RedoCommand` should pass batch in `model.Model#enqueueChange` call. Closes [#84](https://github.com/ckeditor/ckeditor5-undo/issues/84). ([497af30](https://github.com/ckeditor/ckeditor5-undo/commit/497af30)) + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-undo/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Features + +* Updated icons for compatibility with the refreshed Lark theme. Minor adjustment in toolbar configuration (see [ckeditor/ckeditor5#645](https://github.com/ckeditor/ckeditor5/issues/645)). ([254cd89](https://github.com/ckeditor/ckeditor5-undo/commit/254cd89)) + +### Bug fixes + +* Do not register batches which have only non-document operations. Closes [#79](https://github.com/ckeditor/ckeditor5-undo/issues/79). Closes [ckeditor/ckeditor5#781](https://github.com/ckeditor/ckeditor5/issues/781). ([60ac1ab](https://github.com/ckeditor/ckeditor5-undo/commit/60ac1ab)) + +### Other changes + +* Aligned feature class naming to the new scheme. ([d4f0cc2](https://github.com/ckeditor/ckeditor5-undo/commit/d4f0cc2)) +* Updated translations. ([33171d5](https://github.com/ckeditor/ckeditor5-undo/commit/33171d5)) + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-undo/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Other changes + +* Updated translations. ([847838f](https://github.com/ckeditor/ckeditor5-undo/commit/847838f)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-undo/compare/v0.9.0...v1.0.0-alpha.1) (October 3, 2017) + +### Bug fixes + +* Selection should be correctly restored when undoing after all editor content was replaced or removed. Closes [#72](https://github.com/ckeditor/ckeditor5-undo/issues/72). ([58f953f](https://github.com/ckeditor/ckeditor5-undo/commit/58f953f)) + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-undo/compare/v0.8.1...v0.9.0) (September 3, 2017) + +### Other changes + +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([a94dd46](https://github.com/ckeditor/ckeditor5-undo/commit/a94dd46)) +* Cleaned up SVG icons. ([9cb1923](https://github.com/ckeditor/ckeditor5-undo/commit/9cb1923)) + +### BREAKING CHANGES + +* The command API has been changed. + + +## [0.8.1](https://github.com/ckeditor/ckeditor5-undo/compare/v0.8.0...v0.8.1) (May 7, 2017) + +### Other changes + +* Updated translations. ([d3847a6](https://github.com/ckeditor/ckeditor5-undo/commit/d3847a6)) + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-undo/compare/v0.7.1...v0.8.0) (April 5, 2017) + +### Features + +* Named existing plugin(s). ([90ab21c](https://github.com/ckeditor/ckeditor5-undo/commit/90ab21c)) + +### Other changes + +* Updated translations. ([730bf75](https://github.com/ckeditor/ckeditor5-undo/commit/730bf75)) + + +## [0.7.1](https://github.com/ckeditor/ckeditor5-undo/compare/v0.7.0...v0.7.1) (March 6, 2017) + +### Other changes + +* Updated translations. ([46a89fd](https://github.com/ckeditor/ckeditor5-undo/commit/46a89fd)) diff --git a/node_modules/@ckeditor/ckeditor5-undo/LICENSE.md b/node_modules/@ckeditor/ckeditor5-undo/LICENSE.md new file mode 100644 index 0000000..2f72956 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 undo feature** – https://github.com/ckeditor/ckeditor5-undo
    +Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-undo/README.md b/node_modules/@ckeditor/ckeditor5-undo/README.md new file mode 100644 index 0000000..1e00390 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/README.md @@ -0,0 +1,16 @@ +CKEditor 5 undo feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-undo.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-undo) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements undo support for CKEditor 5. + +## Documentation + +See the [`@ckeditor/ckeditor5-undo` package](https://ckeditor.com/docs/ckeditor5/latest/api/undo.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-undo/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-undo/ckeditor5-metadata.json new file mode 100644 index 0000000..451eb10 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/ckeditor5-metadata.json @@ -0,0 +1,23 @@ +{ + "plugins": [ + { + "name": "Undo", + "className": "Undo", + "description": "Support the undo and redo functionalities.", + "docs": "features/undo-redo.html", + "path": "src/undo.js", + "uiComponents": [ + { + "type": "Button", + "name": "undo", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/undo.svg" + }, + { + "type": "Button", + "name": "redo", + "iconPath": "@ckeditor/ckeditor5-core/theme/icons/redo.svg" + } + ] + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/contexts.json b/node_modules/@ckeditor/ckeditor5-undo/lang/contexts.json new file mode 100644 index 0000000..af7e2a3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/contexts.json @@ -0,0 +1,4 @@ +{ + "Undo": "Toolbar button tooltip for the Undo feature.", + "Redo": "Toolbar button tooltip for the Redo feature." +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ar.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ar.po new file mode 100644 index 0000000..a6e924e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ar.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "تراجع" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "إعادة" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ast.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ast.po new file mode 100644 index 0000000..f13379a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ast.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Asturian (https://app.transifex.com/ckeditor/teams/11143/ast/)\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Desfacer" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Refacer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/az.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/az.po new file mode 100644 index 0000000..c8a71a6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/az.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "İmtina et" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Təkrar et" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/bg.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/bg.po new file mode 100644 index 0000000..2b35bbc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/bg.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Отмени" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Повтори" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/bn.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/bn.po new file mode 100644 index 0000000..28bc7a4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/bn.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "পূর্বাবস্থায় ফেরান" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "রেডো" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ca.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ca.po new file mode 100644 index 0000000..3038c79 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ca.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Desfer" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Refer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/cs.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/cs.po new file mode 100644 index 0000000..5667fa0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/cs.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Zpět" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Znovu" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/da.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/da.po new file mode 100644 index 0000000..91a09e8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/da.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Fortryd" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Gentag" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/de-ch.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/de-ch.po new file mode 100644 index 0000000..2cfb4c2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/de-ch.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Rückgängig" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Wiederherstellen" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/de.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/de.po new file mode 100644 index 0000000..e9eba73 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/de.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Rückgängig" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Wiederherstellen" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/el.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/el.po new file mode 100644 index 0000000..683ac4b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/el.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Αναίρεση" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Επανάληψη" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-au.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-au.po new file mode 100644 index 0000000..80c085f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-au.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Undo" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Redo" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-gb.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-gb.po new file mode 100644 index 0000000..3cf3ede --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en-gb.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Undo" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Redo" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en.po new file mode 100644 index 0000000..7035187 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/en.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Undo" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Redo" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/eo.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/eo.po new file mode 100644 index 0000000..8e3fbbb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/eo.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Esperanto (https://app.transifex.com/ckeditor/teams/11143/eo/)\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Malfari" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Refari" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/es.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/es.po new file mode 100644 index 0000000..396a2c6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/es.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Deshacer" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Rehacer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/et.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/et.po new file mode 100644 index 0000000..8e45575 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/et.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Võta tagasi" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Tee uuesti" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/eu.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/eu.po new file mode 100644 index 0000000..f4d8a4e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/eu.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Basque (https://app.transifex.com/ckeditor/teams/11143/eu/)\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Desegin" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Berregin" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fa.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fa.po new file mode 100644 index 0000000..2b35ffd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fa.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "بازگردانی" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "باز انجام" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fi.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fi.po new file mode 100644 index 0000000..e81b46b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fi.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Peru" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Tee uudelleen" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fr.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fr.po new file mode 100644 index 0000000..4475896 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/fr.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Annuler" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Restaurer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/gl.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/gl.po new file mode 100644 index 0000000..c20efd5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/gl.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Desfacer" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Refacer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/he.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/he.po new file mode 100644 index 0000000..06f4808 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/he.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "ביטול" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "ביצוע מחדש" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hi.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hi.po new file mode 100644 index 0000000..01fee97 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hi.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Undo" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Redo" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hr.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hr.po new file mode 100644 index 0000000..b0da401 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hr.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Poništi" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Ponovi" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hu.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hu.po new file mode 100644 index 0000000..58f092d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/hu.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Visszavonás" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Újra" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/id.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/id.po new file mode 100644 index 0000000..06d8013 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/id.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Batal" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Lakukan lagi" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/it.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/it.po new file mode 100644 index 0000000..c3d9698 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/it.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Annulla" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Ripristina" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ja.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ja.po new file mode 100644 index 0000000..7908f80 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ja.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "元に戻す" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "やり直し" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/km.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/km.po new file mode 100644 index 0000000..9a1a08d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/km.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Khmer (https://app.transifex.com/ckeditor/teams/11143/km/)\n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "លែង​ធ្វើ​វិញ" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "ធ្វើ​វិញ" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/kn.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/kn.po new file mode 100644 index 0000000..2c7ff43 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/kn.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kannada (https://app.transifex.com/ckeditor/teams/11143/kn/)\n" +"Language: kn\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "‍‍ರದ್ದು" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "‍ಮತ್ತೆ ಮಾಡು" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ko.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ko.po new file mode 100644 index 0000000..29015e2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ko.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "실행 취소" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "다시 실행" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ku.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ku.po new file mode 100644 index 0000000..83f6deb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ku.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "وەک خۆی لێ بکەوە" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "هەلگەڕاندنەوە" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/lt.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/lt.po new file mode 100644 index 0000000..af049b2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/lt.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Atgal" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Pirmyn" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/lv.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/lv.po new file mode 100644 index 0000000..080e6ed --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/lv.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Atsaukt" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Uz priekšu" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ms.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ms.po new file mode 100644 index 0000000..2aaa1f1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ms.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Buat asal" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Buat semula" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/nb.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/nb.po new file mode 100644 index 0000000..b0d2df0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/nb.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Angre" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Gjør om" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ne.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ne.po new file mode 100644 index 0000000..2ab8ce6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ne.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "पूर्ववत" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "रिडु" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/nl.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/nl.po new file mode 100644 index 0000000..d01d28d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/nl.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Ongedaan maken" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Opnieuw" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/no.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/no.po new file mode 100644 index 0000000..4db94a1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/no.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Angre" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Gjør om" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pl.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pl.po new file mode 100644 index 0000000..cc2aad2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pl.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Cofnij" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Ponów" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt-br.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt-br.po new file mode 100644 index 0000000..a6624ad --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt-br.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Desfazer" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Refazer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt.po new file mode 100644 index 0000000..4c07b6e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/pt.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Desfazer" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Refazer" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ro.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ro.po new file mode 100644 index 0000000..14fd631 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ro.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Anulare" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Revenire" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ru.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ru.po new file mode 100644 index 0000000..e2df769 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ru.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Отменить" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Повторить" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/si.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/si.po new file mode 100644 index 0000000..5c82428 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/si.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Sinhala (Sri Lanka) (https://app.transifex.com/ckeditor/teams/11143/si_LK/)\n" +"Language: si_LK\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "අහෝසි කරන්න" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "නැවත කරන්න" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sk.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sk.po new file mode 100644 index 0000000..3872ee0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sk.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Späť" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Znova" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sq.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sq.po new file mode 100644 index 0000000..09623bd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sq.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Rikthe" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Ribëj" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr-latn.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr-latn.po new file mode 100644 index 0000000..8c13686 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr-latn.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Povlačenje" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Ponovo" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr.po new file mode 100644 index 0000000..10473a0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sr.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Повлачење" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Поново" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sv.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sv.po new file mode 100644 index 0000000..61aef68 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/sv.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Ångra" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Gör om" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/th.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/th.po new file mode 100644 index 0000000..fe9f818 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/th.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "ย้อนกลับ" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "ทำซ้ำ" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tk.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tk.po new file mode 100644 index 0000000..2e8fd6b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tk.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Yza gaýtar" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Öňe gaýtar" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tr.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tr.po new file mode 100644 index 0000000..2c93af9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tr.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Geri al" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Tekrar yap" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tt.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tt.po new file mode 100644 index 0000000..dd9e2ea --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/tt.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Tatar (https://app.transifex.com/ckeditor/teams/11143/tt/)\n" +"Language: tt\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Кабатла" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ug.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ug.po new file mode 100644 index 0000000..ca7f12c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ug.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "يېنىۋېلىش" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "تەكرارلاش" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/uk.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/uk.po new file mode 100644 index 0000000..c8b9483 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/uk.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Відміна" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Повтор" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ur.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ur.po new file mode 100644 index 0000000..afd9f14 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/ur.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "رد ترمیم" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "پھر سے کریں" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/uz.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/uz.po new file mode 100644 index 0000000..8b76312 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/uz.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Bekor qilish" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Takrorlash" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/vi.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/vi.po new file mode 100644 index 0000000..61f2e44 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/vi.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "Hoàn tác" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "Tiếp tục" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh-cn.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh-cn.po new file mode 100644 index 0000000..7327e02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh-cn.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "撤销" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "重做" diff --git a/node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh.po b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh.po new file mode 100644 index 0000000..81eb3e9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/lang/translations/zh.po @@ -0,0 +1,26 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "Toolbar button tooltip for the Undo feature." +msgid "Undo" +msgstr "取消" + +msgctxt "Toolbar button tooltip for the Redo feature." +msgid "Redo" +msgstr "重做" diff --git a/node_modules/@ckeditor/ckeditor5-undo/package.json b/node_modules/@ckeditor/ckeditor5-undo/package.json new file mode 100644 index 0000000..3122bcd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/package.json @@ -0,0 +1,38 @@ +{ + "name": "@ckeditor/ckeditor5-undo", + "version": "41.3.1", + "description": "Undo feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-feature", + "ckeditor5-plugin", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-engine": "41.3.1", + "@ckeditor/ckeditor5-ui": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-undo" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/augmentation.d.ts new file mode 100644 index 0000000..7f01619 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/augmentation.d.ts @@ -0,0 +1,16 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { Undo, UndoEditing, UndoUI, UndoCommand, RedoCommand } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface CommandsMap { + undo: UndoCommand; + redo: RedoCommand; + } + interface PluginsMap { + [Undo.pluginName]: Undo; + [UndoEditing.pluginName]: UndoEditing; + [UndoUI.pluginName]: UndoUI; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-undo/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/basecommand.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/basecommand.d.ts new file mode 100644 index 0000000..fbbf429 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/basecommand.d.ts @@ -0,0 +1,72 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/basecommand + */ +import { Command, type Editor } from '@ckeditor/ckeditor5-core'; +import { type Batch, type Operation, type Range } from '@ckeditor/ckeditor5-engine'; +/** + * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}. + */ +export default abstract class BaseCommand extends Command { + /** + * Stack of items stored by the command. These are pairs of: + * + * * {@link module:engine/model/batch~Batch batch} saved by the command, + * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch. + */ + protected _stack: Array<{ + batch: Batch; + selection: { + ranges: Array; + isBackward: boolean; + }; + }>; + /** + * Stores all batches that were created by this command. + * + * @internal + */ + _createdBatches: WeakSet; + /** + * @inheritDoc + */ + constructor(editor: Editor); + /** + * @inheritDoc + */ + refresh(): void; + /** + * Returns all batches created by this command. + */ + get createdBatches(): WeakSet; + /** + * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document} + * created by the editor which this command is registered to. + * + * @param batch The batch to add. + */ + addBatch(batch: Batch): void; + /** + * Removes all items from the stack. + */ + clearStack(): void; + /** + * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone. + * + * @param ranges Ranges to be restored. + * @param isBackward A flag describing whether the restored range was selected forward or backward. + * @param operations Operations which has been applied since selection has been stored. + */ + protected _restoreSelection(ranges: Array, isBackward: boolean, operations: Array): void; + /** + * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it. + * This is a helper method for {@link #execute}. + * + * @param batchToUndo The batch to be undone. + * @param undoingBatch The batch that will contain undoing changes. + */ + protected _undo(batchToUndo: Batch, undoingBatch: Batch): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/basecommand.js b/node_modules/@ckeditor/ckeditor5-undo/src/basecommand.js new file mode 100644 index 0000000..c659ad7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/basecommand.js @@ -0,0 +1,192 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/basecommand + */ +import { Command } from '@ckeditor/ckeditor5-core'; +import { transformSets, NoOperation } from '@ckeditor/ckeditor5-engine'; +/** + * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}. + */ +export default class BaseCommand extends Command { + /** + * @inheritDoc + */ + constructor(editor) { + super(editor); + /** + * Stack of items stored by the command. These are pairs of: + * + * * {@link module:engine/model/batch~Batch batch} saved by the command, + * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch. + */ + this._stack = []; + /** + * Stores all batches that were created by this command. + * + * @internal + */ + this._createdBatches = new WeakSet(); + // Refresh state, so the command is inactive right after initialization. + this.refresh(); + // This command should not depend on selection change. + this._isEnabledBasedOnSelection = false; + // Set the transparent batch for the `editor.data.set()` call if the + // batch type is not set already. + this.listenTo(editor.data, 'set', (evt, data) => { + // Create a shallow copy of the options to not change the original args. + // And make sure that an object is assigned to data[ 1 ]. + data[1] = { ...data[1] }; + const options = data[1]; + // If batch type is not set, default to non-undoable batch. + if (!options.batchType) { + options.batchType = { isUndoable: false }; + } + }, { priority: 'high' }); + // Clear the stack for the `transparent` batches. + this.listenTo(editor.data, 'set', (evt, data) => { + // We can assume that the object exists and it has a `batchType` property. + // It was ensured with a higher priority listener before. + const options = data[1]; + if (!options.batchType.isUndoable) { + this.clearStack(); + } + }); + } + /** + * @inheritDoc + */ + refresh() { + this.isEnabled = this._stack.length > 0; + } + /** + * Returns all batches created by this command. + */ + get createdBatches() { + return this._createdBatches; + } + /** + * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document} + * created by the editor which this command is registered to. + * + * @param batch The batch to add. + */ + addBatch(batch) { + const docSelection = this.editor.model.document.selection; + const selection = { + ranges: docSelection.hasOwnRange ? Array.from(docSelection.getRanges()) : [], + isBackward: docSelection.isBackward + }; + this._stack.push({ batch, selection }); + this.refresh(); + } + /** + * Removes all items from the stack. + */ + clearStack() { + this._stack = []; + this.refresh(); + } + /** + * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone. + * + * @param ranges Ranges to be restored. + * @param isBackward A flag describing whether the restored range was selected forward or backward. + * @param operations Operations which has been applied since selection has been stored. + */ + _restoreSelection(ranges, isBackward, operations) { + const model = this.editor.model; + const document = model.document; + // This will keep the transformed selection ranges. + const selectionRanges = []; + // Transform all ranges from the restored selection. + const transformedRangeGroups = ranges.map(range => range.getTransformedByOperations(operations)); + const allRanges = transformedRangeGroups.flat(); + for (const rangeGroup of transformedRangeGroups) { + // While transforming there could appear ranges that are contained by other ranges, we shall ignore them. + const transformed = rangeGroup + .filter(range => range.root != document.graveyard) + .filter(range => !isRangeContainedByAnyOtherRange(range, allRanges)); + // All the transformed ranges ended up in graveyard. + if (!transformed.length) { + continue; + } + // After the range got transformed, we have an array of ranges. Some of those + // ranges may be "touching" -- they can be next to each other and could be merged. + normalizeRanges(transformed); + // For each `range` from `ranges`, we take only one transformed range. + // This is because we want to prevent situation where single-range selection + // got transformed to multi-range selection. + selectionRanges.push(transformed[0]); + } + // @if CK_DEBUG_ENGINE // console.log( `Restored selection by undo: ${ selectionRanges.join( ', ' ) }` ); + // `selectionRanges` may be empty if all ranges ended up in graveyard. If that is the case, do not restore selection. + if (selectionRanges.length) { + model.change(writer => { + writer.setSelection(selectionRanges, { backward: isBackward }); + }); + } + } + /** + * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it. + * This is a helper method for {@link #execute}. + * + * @param batchToUndo The batch to be undone. + * @param undoingBatch The batch that will contain undoing changes. + */ + _undo(batchToUndo, undoingBatch) { + const model = this.editor.model; + const document = model.document; + // All changes done by the command execution will be saved as one batch. + this._createdBatches.add(undoingBatch); + const operationsToUndo = batchToUndo.operations.slice().filter(operation => operation.isDocumentOperation); + operationsToUndo.reverse(); + // We will process each operation from `batchToUndo`, in reverse order. If there were operations A, B and C in undone batch, + // we need to revert them in reverse order, so first C' (reversed C), then B', then A'. + for (const operationToUndo of operationsToUndo) { + const nextBaseVersion = operationToUndo.baseVersion + 1; + const historyOperations = Array.from(document.history.getOperations(nextBaseVersion)); + const transformedSets = transformSets([operationToUndo.getReversed()], historyOperations, { + useRelations: true, + document: this.editor.model.document, + padWithNoOps: false, + forceWeakRemove: true + }); + const reversedOperations = transformedSets.operationsA; + // After reversed operation has been transformed by all history operations, apply it. + for (let operation of reversedOperations) { + // Do not apply any operation on non-editable space. + const affectedSelectable = operation.affectedSelectable; + if (affectedSelectable && !model.canEditAt(affectedSelectable)) { + operation = new NoOperation(operation.baseVersion); + } + // Before applying, add the operation to the `undoingBatch`. + undoingBatch.addOperation(operation); + model.applyOperation(operation); + document.history.setOperationAsUndone(operationToUndo, operation); + } + } + } +} +/** + * Normalizes list of ranges by joining intersecting or "touching" ranges. + * + * @param ranges Ranges to be normalized. + */ +function normalizeRanges(ranges) { + ranges.sort((a, b) => a.start.isBefore(b.start) ? -1 : 1); + for (let i = 1; i < ranges.length; i++) { + const previousRange = ranges[i - 1]; + const joinedRange = previousRange.getJoined(ranges[i], true); + if (joinedRange) { + // Replace the ranges on the list with the new joined range. + i--; + ranges.splice(i, 2, joinedRange); + } + } +} +function isRangeContainedByAnyOtherRange(range, ranges) { + return ranges.some(otherRange => otherRange !== range && otherRange.containsRange(range, true)); +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/index.d.ts new file mode 100644 index 0000000..db23261 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/index.d.ts @@ -0,0 +1,13 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo + */ +export { default as Undo } from './undo.js'; +export { default as UndoEditing } from './undoediting.js'; +export { default as UndoUI } from './undoui.js'; +export type { default as UndoCommand } from './undocommand.js'; +export type { default as RedoCommand } from './redocommand.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/index.js b/node_modules/@ckeditor/ckeditor5-undo/src/index.js new file mode 100644 index 0000000..c14052c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/index.js @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo + */ +export { default as Undo } from './undo.js'; +export { default as UndoEditing } from './undoediting.js'; +export { default as UndoUI } from './undoui.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/redocommand.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/redocommand.d.ts new file mode 100644 index 0000000..a3c0452 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/redocommand.d.ts @@ -0,0 +1,27 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/redocommand + */ +import BaseCommand from './basecommand.js'; +/** + * The redo command stores {@link module:engine/model/batch~Batch batches} that were used to undo a batch by + * {@link module:undo/undocommand~UndoCommand}. It is able to redo a previously undone batch by reversing the undoing + * batches created by `UndoCommand`. The reversed batch is transformed by all the batches from + * {@link module:engine/model/document~Document#history history} that happened after the reversed undo batch. + * + * The redo command also takes care of restoring the {@link module:engine/model/document~Document#selection document selection}. + */ +export default class RedoCommand extends BaseCommand { + /** + * Executes the command. This method reverts the last {@link module:engine/model/batch~Batch batch} added to + * the command's stack, applies the reverted and transformed version on the + * {@link module:engine/model/document~Document document} and removes the batch from the stack. + * Then, it restores the {@link module:engine/model/document~Document#selection document selection}. + * + * @fires execute + */ + execute(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/redocommand.js b/node_modules/@ckeditor/ckeditor5-undo/src/redocommand.js new file mode 100644 index 0000000..f5f14de --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/redocommand.js @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/redocommand + */ +import BaseCommand from './basecommand.js'; +/** + * The redo command stores {@link module:engine/model/batch~Batch batches} that were used to undo a batch by + * {@link module:undo/undocommand~UndoCommand}. It is able to redo a previously undone batch by reversing the undoing + * batches created by `UndoCommand`. The reversed batch is transformed by all the batches from + * {@link module:engine/model/document~Document#history history} that happened after the reversed undo batch. + * + * The redo command also takes care of restoring the {@link module:engine/model/document~Document#selection document selection}. + */ +export default class RedoCommand extends BaseCommand { + /** + * Executes the command. This method reverts the last {@link module:engine/model/batch~Batch batch} added to + * the command's stack, applies the reverted and transformed version on the + * {@link module:engine/model/document~Document document} and removes the batch from the stack. + * Then, it restores the {@link module:engine/model/document~Document#selection document selection}. + * + * @fires execute + */ + execute() { + const item = this._stack.pop(); + const redoingBatch = this.editor.model.createBatch({ isUndo: true }); + // All changes have to be done in one `enqueueChange` callback so other listeners will not step between consecutive + // operations, or won't do changes to the document before selection is properly restored. + this.editor.model.enqueueChange(redoingBatch, () => { + const lastOperation = item.batch.operations[item.batch.operations.length - 1]; + const nextBaseVersion = lastOperation.baseVersion + 1; + const operations = this.editor.model.document.history.getOperations(nextBaseVersion); + this._restoreSelection(item.selection.ranges, item.selection.isBackward, operations); + this._undo(item.batch, redoingBatch); + }); + this.refresh(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undo.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/undo.d.ts new file mode 100644 index 0000000..395d33f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undo.d.ts @@ -0,0 +1,117 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undo + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import UndoEditing from './undoediting.js'; +import UndoUI from './undoui.js'; +/** + * The undo feature. + * + * This is a "glue" plugin which loads the {@link module:undo/undoediting~UndoEditing undo editing feature} + * and the {@link module:undo/undoui~UndoUI undo UI feature}. + * + * Below is an explanation of the undo mechanism working together with {@link module:engine/model/history~History History}: + * + * Whenever an {@link module:engine/model/operation/operation~Operation operation} is applied to the + * {@link module:engine/model/document~Document document}, it is saved to `History` as is. + * The {@link module:engine/model/batch~Batch batch} that owns that operation is also saved, in + * {@link module:undo/undocommand~UndoCommand}, together with the selection that was present in the document before the + * operation was applied. A batch is saved instead of the operation because changes are undone batch-by-batch, not operation-by-operation + * and a batch is seen as one undo step. + * + * After changes happen to the document, the `History` and `UndoCommand` stack can be represented as follows: + * + * ``` + * History Undo stack + * ============== ================================== + * [operation A1] [ batch A ] + * [operation B1] [ batch B ] + * [operation B2] [ batch C ] + * [operation C1] + * [operation C2] + * [operation B3] + * [operation C3] + * ``` + * + * Where operations starting with the same letter are from same batch. + * + * Undoing a batch means that a set of operations which will reverse the effects of that batch needs to be generated. + * For example, if a batch added several letters, undoing the batch should remove them. It is important to apply undoing + * operations in the reversed order, so if a batch has operation `X`, `Y`, `Z`, reversed operations `Zr`, `Yr` and `Xr` + * need to be applied. Otherwise reversed operation `Xr` would operate on a wrong document state, because operation `X` + * does not know that operations `Y` and `Z` happened. + * + * After operations from an undone batch got {@link module:engine/model/operation/operation~Operation#getReversed reversed}, + * one needs to make sure if they are ready to be applied. In the scenario above, operation `C3` is the last operation and `C3r` + * bases on up-to-date document state, so it can be applied to the document. + * + * ``` + * History Undo stack + * ================= ================================== + * [ operation A1 ] [ batch A ] + * [ operation B1 ] [ batch B ] + * [ operation B2 ] [ processing undoing batch C ] + * [ operation C1 ] + * [ operation C2 ] + * [ operation B3 ] + * [ operation C3 ] + * [ operation C3r ] + * ``` + * + * Next is operation `C2`, reversed to `C2r`. `C2r` bases on `C2`, so it bases on the wrong document state. It needs to be + * transformed by operations from history that happened after it, so it "knows" about them. Let us assume that `C2' = C2r * B3 * C3 * C3r`, + * where `*` means "transformed by". Rest of operations from that batch are processed in the same fashion. + * + * ``` + * History Undo stack Redo stack + * ================= ================================== ================================== + * [ operation A1 ] [ batch A ] [ batch Cr ] + * [ operation B1 ] [ batch B ] + * [ operation B2 ] + * [ operation C1 ] + * [ operation C2 ] + * [ operation B3 ] + * [ operation C3 ] + * [ operation C3r ] + * [ operation C2' ] + * [ operation C1' ] + * ``` + * + * Selective undo works on the same basis, however, instead of undoing the last batch in the undo stack, any batch can be undone. + * The same algorithm applies: operations from a batch (i.e. `A1`) are reversed and then transformed by operations stored in history. + * + * Redo also is very similar to undo. It has its own stack that is filled with undoing (reversed batches). Operations from + * the batch that is re-done are reversed-back, transformed in proper order and applied to the document. + * + * ``` + * History Undo stack Redo stack + * ================= ================================== ================================== + * [ operation A1 ] [ batch A ] + * [ operation B1 ] [ batch B ] + * [ operation B2 ] [ batch Crr ] + * [ operation C1 ] + * [ operation C2 ] + * [ operation B3 ] + * [ operation C3 ] + * [ operation C3r ] + * [ operation C2' ] + * [ operation C1' ] + * [ operation C1'r] + * [ operation C2'r] + * [ operation C3rr] + * ``` + */ +export default class Undo extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof UndoEditing, typeof UndoUI]; + /** + * @inheritDoc + */ + static get pluginName(): "Undo"; +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undo.js b/node_modules/@ckeditor/ckeditor5-undo/src/undo.js new file mode 100644 index 0000000..a0cbfb8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undo.js @@ -0,0 +1,121 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undo + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import UndoEditing from './undoediting.js'; +import UndoUI from './undoui.js'; +/** + * The undo feature. + * + * This is a "glue" plugin which loads the {@link module:undo/undoediting~UndoEditing undo editing feature} + * and the {@link module:undo/undoui~UndoUI undo UI feature}. + * + * Below is an explanation of the undo mechanism working together with {@link module:engine/model/history~History History}: + * + * Whenever an {@link module:engine/model/operation/operation~Operation operation} is applied to the + * {@link module:engine/model/document~Document document}, it is saved to `History` as is. + * The {@link module:engine/model/batch~Batch batch} that owns that operation is also saved, in + * {@link module:undo/undocommand~UndoCommand}, together with the selection that was present in the document before the + * operation was applied. A batch is saved instead of the operation because changes are undone batch-by-batch, not operation-by-operation + * and a batch is seen as one undo step. + * + * After changes happen to the document, the `History` and `UndoCommand` stack can be represented as follows: + * + * ``` + * History Undo stack + * ============== ================================== + * [operation A1] [ batch A ] + * [operation B1] [ batch B ] + * [operation B2] [ batch C ] + * [operation C1] + * [operation C2] + * [operation B3] + * [operation C3] + * ``` + * + * Where operations starting with the same letter are from same batch. + * + * Undoing a batch means that a set of operations which will reverse the effects of that batch needs to be generated. + * For example, if a batch added several letters, undoing the batch should remove them. It is important to apply undoing + * operations in the reversed order, so if a batch has operation `X`, `Y`, `Z`, reversed operations `Zr`, `Yr` and `Xr` + * need to be applied. Otherwise reversed operation `Xr` would operate on a wrong document state, because operation `X` + * does not know that operations `Y` and `Z` happened. + * + * After operations from an undone batch got {@link module:engine/model/operation/operation~Operation#getReversed reversed}, + * one needs to make sure if they are ready to be applied. In the scenario above, operation `C3` is the last operation and `C3r` + * bases on up-to-date document state, so it can be applied to the document. + * + * ``` + * History Undo stack + * ================= ================================== + * [ operation A1 ] [ batch A ] + * [ operation B1 ] [ batch B ] + * [ operation B2 ] [ processing undoing batch C ] + * [ operation C1 ] + * [ operation C2 ] + * [ operation B3 ] + * [ operation C3 ] + * [ operation C3r ] + * ``` + * + * Next is operation `C2`, reversed to `C2r`. `C2r` bases on `C2`, so it bases on the wrong document state. It needs to be + * transformed by operations from history that happened after it, so it "knows" about them. Let us assume that `C2' = C2r * B3 * C3 * C3r`, + * where `*` means "transformed by". Rest of operations from that batch are processed in the same fashion. + * + * ``` + * History Undo stack Redo stack + * ================= ================================== ================================== + * [ operation A1 ] [ batch A ] [ batch Cr ] + * [ operation B1 ] [ batch B ] + * [ operation B2 ] + * [ operation C1 ] + * [ operation C2 ] + * [ operation B3 ] + * [ operation C3 ] + * [ operation C3r ] + * [ operation C2' ] + * [ operation C1' ] + * ``` + * + * Selective undo works on the same basis, however, instead of undoing the last batch in the undo stack, any batch can be undone. + * The same algorithm applies: operations from a batch (i.e. `A1`) are reversed and then transformed by operations stored in history. + * + * Redo also is very similar to undo. It has its own stack that is filled with undoing (reversed batches). Operations from + * the batch that is re-done are reversed-back, transformed in proper order and applied to the document. + * + * ``` + * History Undo stack Redo stack + * ================= ================================== ================================== + * [ operation A1 ] [ batch A ] + * [ operation B1 ] [ batch B ] + * [ operation B2 ] [ batch Crr ] + * [ operation C1 ] + * [ operation C2 ] + * [ operation B3 ] + * [ operation C3 ] + * [ operation C3r ] + * [ operation C2' ] + * [ operation C1' ] + * [ operation C1'r] + * [ operation C2'r] + * [ operation C3rr] + * ``` + */ +export default class Undo extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [UndoEditing, UndoUI]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Undo'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undocommand.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/undocommand.d.ts new file mode 100644 index 0000000..792b0e2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undocommand.d.ts @@ -0,0 +1,37 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undocommand + */ +import BaseCommand from './basecommand.js'; +import type { Batch } from '@ckeditor/ckeditor5-engine'; +/** + * The undo command stores {@link module:engine/model/batch~Batch batches} applied to the + * {@link module:engine/model/document~Document document} and is able to undo a batch by reversing it and transforming by + * batches from {@link module:engine/model/document~Document#history history} that happened after the reversed batch. + * + * The undo command also takes care of restoring the {@link module:engine/model/document~Document#selection document selection}. + */ +export default class UndoCommand extends BaseCommand { + /** + * Executes the command. This method reverts a {@link module:engine/model/batch~Batch batch} added to the command's stack, transforms + * and applies the reverted version on the {@link module:engine/model/document~Document document} and removes the batch from the stack. + * Then, it restores the {@link module:engine/model/document~Document#selection document selection}. + * + * @fires execute + * @fires revert + * @param batch A batch that should be undone. If not set, the last added batch will be undone. + */ + execute(batch?: Batch | null): void; +} +/** + * Fired when execution of the command reverts some batch. + * + * @eventName ~UndoCommand#revert + */ +export type UndoCommandRevertEvent = { + name: 'revert'; + args: [batch: Batch, undoingBatch: Batch]; +}; diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undocommand.js b/node_modules/@ckeditor/ckeditor5-undo/src/undocommand.js new file mode 100644 index 0000000..d78640e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undocommand.js @@ -0,0 +1,44 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undocommand + */ +import BaseCommand from './basecommand.js'; +/** + * The undo command stores {@link module:engine/model/batch~Batch batches} applied to the + * {@link module:engine/model/document~Document document} and is able to undo a batch by reversing it and transforming by + * batches from {@link module:engine/model/document~Document#history history} that happened after the reversed batch. + * + * The undo command also takes care of restoring the {@link module:engine/model/document~Document#selection document selection}. + */ +export default class UndoCommand extends BaseCommand { + /** + * Executes the command. This method reverts a {@link module:engine/model/batch~Batch batch} added to the command's stack, transforms + * and applies the reverted version on the {@link module:engine/model/document~Document document} and removes the batch from the stack. + * Then, it restores the {@link module:engine/model/document~Document#selection document selection}. + * + * @fires execute + * @fires revert + * @param batch A batch that should be undone. If not set, the last added batch will be undone. + */ + execute(batch = null) { + // If batch is not given, set `batchIndex` to the last index in command stack. + const batchIndex = batch ? this._stack.findIndex(a => a.batch == batch) : this._stack.length - 1; + const item = this._stack.splice(batchIndex, 1)[0]; + const undoingBatch = this.editor.model.createBatch({ isUndo: true }); + // All changes have to be done in one `enqueueChange` callback so other listeners will not + // step between consecutive operations, or won't do changes to the document before selection is properly restored. + this.editor.model.enqueueChange(undoingBatch, () => { + this._undo(item.batch, undoingBatch); + const operations = this.editor.model.document.history.getOperations(item.batch.baseVersion); + this._restoreSelection(item.selection.ranges, item.selection.isBackward, operations); + }); + // Firing `revert` event after the change block to make sure that it includes all changes from post-fixers + // and make sure that the selection is "stabilized" (the selection range is saved after undo is executed and then + // restored on redo, so it is important that the selection range is saved after post-fixers are done). + this.fire('revert', item.batch, undoingBatch); + this.refresh(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undoediting.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/undoediting.d.ts new file mode 100644 index 0000000..e65464d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undoediting.d.ts @@ -0,0 +1,37 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undoediting + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +/** + * The undo engine feature. + * + * It introduces the `'undo'` and `'redo'` commands to the editor. + */ +export default class UndoEditing extends Plugin { + /** + * The command that manages the undo {@link module:engine/model/batch~Batch batches} stack (history). + * Created and registered during the {@link #init feature initialization}. + */ + private _undoCommand; + /** + * The command that manages the redo {@link module:engine/model/batch~Batch batches} stack (history). + * Created and registered during the {@link #init feature initialization}. + */ + private _redoCommand; + /** + * Keeps track of which batches were registered in undo. + */ + private _batchRegistry; + /** + * @inheritDoc + */ + static get pluginName(): "UndoEditing"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undoediting.js b/node_modules/@ckeditor/ckeditor5-undo/src/undoediting.js new file mode 100644 index 0000000..96705c3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undoediting.js @@ -0,0 +1,96 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undoediting + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import UndoCommand from './undocommand.js'; +import RedoCommand from './redocommand.js'; +/** + * The undo engine feature. + * + * It introduces the `'undo'` and `'redo'` commands to the editor. + */ +export default class UndoEditing extends Plugin { + constructor() { + super(...arguments); + /** + * Keeps track of which batches were registered in undo. + */ + this._batchRegistry = new WeakSet(); + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'UndoEditing'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const t = editor.t; + // Create commands. + this._undoCommand = new UndoCommand(editor); + this._redoCommand = new RedoCommand(editor); + // Register command to the editor. + editor.commands.add('undo', this._undoCommand); + editor.commands.add('redo', this._redoCommand); + this.listenTo(editor.model, 'applyOperation', (evt, args) => { + const operation = args[0]; + // Do not register batch if the operation is not a document operation. + // This prevents from creating empty undo steps, where all operations where non-document operations. + // Non-document operations creates and alters content in detached tree fragments (for example, document fragments). + // Most of time this is preparing data before it is inserted into actual tree (for example during copy & paste). + // Such operations should not be reversed. + if (!operation.isDocumentOperation) { + return; + } + const batch = operation.batch; + const isRedoBatch = this._redoCommand.createdBatches.has(batch); + const isUndoBatch = this._undoCommand.createdBatches.has(batch); + const wasProcessed = this._batchRegistry.has(batch); + // Skip the batch if it was already processed. + if (wasProcessed) { + return; + } + // Add the batch to the registry so it will not be processed again. + this._batchRegistry.add(batch); + if (!batch.isUndoable) { + return; + } + if (isRedoBatch) { + // If this batch comes from `redoCommand`, add it to the `undoCommand` stack. + this._undoCommand.addBatch(batch); + } + else if (!isUndoBatch) { + // If the batch comes neither from `redoCommand` nor from `undoCommand` then it is a new, regular batch. + // Add the batch to the `undoCommand` stack and clear the `redoCommand` stack. + this._undoCommand.addBatch(batch); + this._redoCommand.clearStack(); + } + }, { priority: 'highest' }); + this.listenTo(this._undoCommand, 'revert', (evt, undoneBatch, undoingBatch) => { + this._redoCommand.addBatch(undoingBatch); + }); + editor.keystrokes.set('CTRL+Z', 'undo'); + editor.keystrokes.set('CTRL+Y', 'redo'); + editor.keystrokes.set('CTRL+SHIFT+Z', 'redo'); + // Add the information about the keystrokes to the accessibility database. + editor.accessibility.addKeystrokeInfos({ + keystrokes: [ + { + label: t('Undo'), + keystroke: 'CTRL+Z' + }, + { + label: t('Redo'), + keystroke: [['CTRL+Y'], ['CTRL+SHIFT+Z']] + } + ] + }); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undoui.d.ts b/node_modules/@ckeditor/ckeditor5-undo/src/undoui.d.ts new file mode 100644 index 0000000..860aa4c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undoui.d.ts @@ -0,0 +1,34 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undoui + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +/** + * The undo UI feature. It introduces the `'undo'` and `'redo'` buttons to the editor. + */ +export default class UndoUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName(): "UndoUI"; + /** + * @inheritDoc + */ + init(): void; + /** + * Creates a button for the specified command. + * + * @param name Command name. + * @param label Button label. + * @param keystroke Command keystroke. + * @param Icon Source of the icon. + */ + private _addButtonsToFactory; + /** + * TODO + */ + private _createButton; +} diff --git a/node_modules/@ckeditor/ckeditor5-undo/src/undoui.js b/node_modules/@ckeditor/ckeditor5-undo/src/undoui.js new file mode 100644 index 0000000..c9e29ab --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-undo/src/undoui.js @@ -0,0 +1,73 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module undo/undoui + */ +import { icons, Plugin } from '@ckeditor/ckeditor5-core'; +import { ButtonView, MenuBarMenuListItemButtonView } from '@ckeditor/ckeditor5-ui'; +/** + * The undo UI feature. It introduces the `'undo'` and `'redo'` buttons to the editor. + */ +export default class UndoUI extends Plugin { + /** + * @inheritDoc + */ + static get pluginName() { + return 'UndoUI'; + } + /** + * @inheritDoc + */ + init() { + const editor = this.editor; + const locale = editor.locale; + const t = editor.t; + const localizedUndoIcon = locale.uiLanguageDirection == 'ltr' ? icons.undo : icons.redo; + const localizedRedoIcon = locale.uiLanguageDirection == 'ltr' ? icons.redo : icons.undo; + this._addButtonsToFactory('undo', t('Undo'), 'CTRL+Z', localizedUndoIcon); + this._addButtonsToFactory('redo', t('Redo'), 'CTRL+Y', localizedRedoIcon); + } + /** + * Creates a button for the specified command. + * + * @param name Command name. + * @param label Button label. + * @param keystroke Command keystroke. + * @param Icon Source of the icon. + */ + _addButtonsToFactory(name, label, keystroke, Icon) { + const editor = this.editor; + editor.ui.componentFactory.add(name, () => { + const buttonView = this._createButton(ButtonView, name, label, keystroke, Icon); + buttonView.set({ + tooltip: true + }); + return buttonView; + }); + editor.ui.componentFactory.add('menuBar:' + name, () => { + return this._createButton(MenuBarMenuListItemButtonView, name, label, keystroke, Icon); + }); + } + /** + * TODO + */ + _createButton(ButtonClass, name, label, keystroke, Icon) { + const editor = this.editor; + const locale = editor.locale; + const command = editor.commands.get(name); + const view = new ButtonClass(locale); + view.set({ + label, + icon: Icon, + keystroke + }); + view.bind('isEnabled').to(command, 'isEnabled'); + this.listenTo(view, 'execute', () => { + editor.execute(name); + editor.editing.view.focus(); + }); + return view; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-upload/CHANGELOG.md new file mode 100644 index 0000000..ade890b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/CHANGELOG.md @@ -0,0 +1,251 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v18.0.0...v19.0.0) (April 29, 2020) + +### Bug fixes + +* Restored a condition handling an edge case in upload when promise chains are aborted. Closes [ckeditor/ckeditor5#5892](https://github.com/ckeditor/ckeditor5/issues/5892). ([ed7187b](https://github.com/ckeditor/ckeditor5-upload/commit/ed7187b)) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v16.0.0...v17.0.0) (February 19, 2020) + +### Other changes + +* Updated translations. ([5be630b](https://github.com/ckeditor/ckeditor5-upload/commit/5be630b)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Other changes + +* Updated translations. ([188255c](https://github.com/ckeditor/ckeditor5-upload/commit/188255c)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v12.0.0...v15.0.0) (October 23, 2019) + +### Bug fixes + +* Add missing `catch()` clauses to file loader promises. ([40906d4](https://github.com/ckeditor/ckeditor5-upload/commit/40906d4)) + +### Other changes + +* Updated translations. ([290db0f](https://github.com/ckeditor/ckeditor5-upload/commit/290db0f)) ([1d7e907](https://github.com/ckeditor/ckeditor5-upload/commit/1d7e907)) + + +## [12.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v11.1.1...v12.0.0) (August 26, 2019) + +### Features + +* Implemented the `SimpleUploadAdapter` plugin which enables file uploads in CKEditor 5 using configurable `XMLHttpRequests` to a server. Closes [ckeditor/ckeditor5#1791](https://github.com/ckeditor/ckeditor5/issues/1791). ([441c597](https://github.com/ckeditor/ckeditor5-upload/commit/441c597)) + + ```js + import Base64UploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter' + ``` +* Implemented the responsive image support in the `SimpleUploadAdapter`. Closes [#97](https://github.com/ckeditor/ckeditor5-upload/issues/97). ([b5092a4](https://github.com/ckeditor/ckeditor5-upload/commit/b5092a4)) + +### Other changes + +* Add `ImageLoader.data` property for already read file to allow synchronous access to file data. ([ec56ab8](https://github.com/ckeditor/ckeditor5-upload/commit/ec56ab8)) +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([1893794](https://github.com/ckeditor/ckeditor5-upload/commit/1893794)) +* Updated translations. ([594b6c1](https://github.com/ckeditor/ckeditor5-upload/commit/594b6c1)) + +### BREAKING CHANGES + +* Moved the `Base64UploadAdapter` plugin file to `ckeditor5-upload/src/adapters/base64uploadadapter.js`. Make sure import paths your project are up–to–date: + +```js +import Base64UploadAdapter from '@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter' +``` + + +## [11.1.1](https://github.com/ckeditor/ckeditor5-upload/compare/v11.1.0...v11.1.1) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-upload/compare/v11.0.2...v11.1.0) (July 4, 2019) + +### Features + +* Introduced the Base64 image upload adapter. Closes [ckeditor/ckeditor5#1378](https://github.com/ckeditor/ckeditor5/issues/1378). ([938f0f7](https://github.com/ckeditor/ckeditor5-upload/commit/938f0f7)) + + +## [11.0.2](https://github.com/ckeditor/ckeditor5-upload/compare/v11.0.1...v11.0.2) (June 6, 2019) + +### Other changes + +* Updated translations. ([73c6761](https://github.com/ckeditor/ckeditor5-upload/commit/73c6761)) + + +## [11.0.1](https://github.com/ckeditor/ckeditor5-upload/compare/v11.0.0...v11.0.1) (April 4, 2019) + +### Other changes + +* Updated translations. ([eac33b1](https://github.com/ckeditor/ckeditor5-upload/commit/eac33b1)) + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v10.0.4...v11.0.0) (February 28, 2019) + +### Bug fixes + +* `FileLoader` now accepts `Promise` instead of a `File` instance. Closes [#87](https://github.com/ckeditor/ckeditor5-upload/issues/87). ([62a8c69](https://github.com/ckeditor/ckeditor5-upload/commit/62a8c69)) + +### Other changes + +* Add catch block for failed file promise in `FileRepository`. ([a2de5d5](https://github.com/ckeditor/ckeditor5-upload/commit/a2de5d5)) +* Updated translations. ([6aaad73](https://github.com/ckeditor/ckeditor5-upload/commit/6aaad73)) ([b0469a8](https://github.com/ckeditor/ckeditor5-upload/commit/b0469a8)) ([f6e27cb](https://github.com/ckeditor/ckeditor5-upload/commit/f6e27cb)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) +* The `FileLoader.file` property was changed to a getter which returns a native `Promise` instance instead of a `File` instance. The returned promise resolves to a `File` instance. + + +## [10.0.4](https://github.com/ckeditor/ckeditor5-upload/compare/v10.0.3...v10.0.4) (December 5, 2018) + +### Other changes + +* Updated translations. ([489b6fa](https://github.com/ckeditor/ckeditor5-upload/commit/489b6fa)) ([f435630](https://github.com/ckeditor/ckeditor5-upload/commit/f435630)) + + +## [10.0.3](https://github.com/ckeditor/ckeditor5-upload/compare/v10.0.2...v10.0.3) (October 8, 2018) + +### Other changes + +* Updated translations. ([871eb44](https://github.com/ckeditor/ckeditor5-upload/commit/871eb44)) + + +## [10.0.2](https://github.com/ckeditor/ckeditor5-upload/compare/v10.0.1...v10.0.2) (July 18, 2018) + +### Other changes + +* Updated translations. ([ce32eb2](https://github.com/ckeditor/ckeditor5-upload/commit/ce32eb2), [9adb325](https://github.com/ckeditor/ckeditor5-upload/commit/9adb325)) + + +## [10.0.1](https://github.com/ckeditor/ckeditor5-upload/compare/v10.0.0...v10.0.1) (June 21, 2018) + +### Other changes + +* Updated translations. + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([8293240](https://github.com/ckeditor/ckeditor5-upload/commit/8293240)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Bug fixes + +* Fixed incorrect `ImageUploadButton` and `ImageUploadCommand` binding. Closes [#77](https://github.com/ckeditor/ckeditor5-upload/issues/77). Closes https://github.com/ckeditor/ckeditor5-ui/issues/357. ([d231ea6](https://github.com/ckeditor/ckeditor5-upload/commit/d231ea6)) + +### Other changes + +* Migrated package styles to PostCSS. Moved visual styles to `@ckeditor/ckeditor5-theme-lark` (see [ckeditor/ckeditor5-ui#144](https://github.com/ckeditor/ckeditor5-ui/issues/144)). ([faf6100](https://github.com/ckeditor/ckeditor5-upload/commit/faf6100)) +* Moved the image upload plugins to the `@ckeditor/ckeditor5-image` package. Minor cleanup in the API. Closes [#22](https://github.com/ckeditor/ckeditor5-upload/issues/22). ([55697a9](https://github.com/ckeditor/ckeditor5-upload/commit/55697a9)) +* Use post-fixer API. ([08e9d09](https://github.com/ckeditor/ckeditor5-upload/commit/08e9d09)) + +### BREAKING CHANGES + +* Renamed `Adapter` to `UploadAdapter`. +* Removed `ImageUpload` plugin. It can be no found in ckeditor5-image repository. +* Removed `ImageUploadEngine` plugin. It can be no found in ckeditor5-image repository. +* Removed `ImageUploadProgress` plugin. It can be no found in ckeditor5-image repository. +* Removed `ImageUploadButton` plugin. It can be no found in ckeditor5-image repository. +* Renamed `FileRepository#createAdapter()` to `FileRepository#createUploadAdapter()`. +* Renamed `filerepository-no-adapter` error to `filerepository-no-upload-adapter`. + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-upload/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Bug fixes + +* Destroying `FileDialogButtonView` should not throw an error. Closes [#66](https://github.com/ckeditor/ckeditor5-upload/issues/66). ([2d4ba62](https://github.com/ckeditor/ckeditor5-upload/commit/2d4ba62)) +* Images pasted with additional HTML content will not be handled by the upload plugin which prevents data pasted from Microsoft Word to be treated as an image. Closes [#68](https://github.com/ckeditor/ckeditor5-upload/issues/68). ([8d0644a](https://github.com/ckeditor/ckeditor5-upload/commit/8d0644a)) + +### Other changes + +* Updated translations. ([93e9643](https://github.com/ckeditor/ckeditor5-upload/commit/93e9643)) +* Aligned UI library usage to the [changes in the UI framework](https://github.com/ckeditor/ckeditor5-ui/pull/332). + +### BREAKING CHANGES + +* The `FileDialogButtonView` is not a `ButtonView` instance anymore but a wrapper instead. The button of the component is available under the `#buttonView` property. + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-upload/compare/v0.2.0...v1.0.0-alpha.1) (October 3, 2017) + +### Bug fixes + +* Image placeholder is now correctly displayed in Firefox and Edge. Closes [#56](https://github.com/ckeditor/ckeditor5-upload/issues/56). ([785e88b](https://github.com/ckeditor/ckeditor5-upload/commit/785e88b)) +* Upload command should not crash when upload adapter is not specified (instead, FileRepository logs an error). Closes [#59](https://github.com/ckeditor/ckeditor5-upload/issues/59). ([14b738b](https://github.com/ckeditor/ckeditor5-upload/commit/14b738b)) + +### Other changes + +* `FileRepository` will automatically warn when it is initialized but no upload adapter was enabled. Closes [#58](https://github.com/ckeditor/ckeditor5-upload/issues/58). ([29aa315](https://github.com/ckeditor/ckeditor5-upload/commit/29aa315)) +* Placeholder images will now look better on wider editors. Closes [#63](https://github.com/ckeditor/ckeditor5-upload/issues/63). ([edb5e81](https://github.com/ckeditor/ckeditor5-upload/commit/edb5e81)) + + +## [0.2.0](https://github.com/ckeditor/ckeditor5-upload/compare/v0.1.0...v0.2.0) (September 3, 2017) + +### Bug fixes + +* [Safari, Edge] The image upload (button) feature will not throw an error anymore when trying to access picked files. The feature should not use the `for...of` loop on native `FileList` because Safari and Edge do not support `Symbol.iterator` for it yet. Closes [#35](https://github.com/ckeditor/ckeditor5-upload/issues/35). ([f4efd9b](https://github.com/ckeditor/ckeditor5-upload/commit/f4efd9b)) +* An image dropped on another image will not redirect the browser to the file's path. Closes [#32](https://github.com/ckeditor/ckeditor5-upload/issues/32). ([4f533be](https://github.com/ckeditor/ckeditor5-upload/commit/4f533be)) +* Bound `ImageUploadButton#isEnabled` to `ImageUploadCommand#isEnabled`. Closes [#43](https://github.com/ckeditor/ckeditor5-upload/issues/43). ([ba6de66](https://github.com/ckeditor/ckeditor5-upload/commit/ba6de66)) +* Fixed two issues related to dropping images. First, when dropping a file into an empty paragraph, that paragraph should be replaced with that image. Second, drop position should be read correctly when the editor is focused upon drop. Closes [#42](https://github.com/ckeditor/ckeditor5-upload/issues/42). Closes [#29](https://github.com/ckeditor/ckeditor5-upload/issues/29). ([fec452d](https://github.com/ckeditor/ckeditor5-upload/commit/fec452d)) +* Image will be inserted after the block if the selection is placed at the block's end. Closes [#7](https://github.com/ckeditor/ckeditor5-upload/issues/7). ([70742f9](https://github.com/ckeditor/ckeditor5-upload/commit/70742f9)) +* When image upload is aborted, now the "image placeholder" element is permanently removed so it is not reinserted on undo. Closes [#38](https://github.com/ckeditor/ckeditor5-upload/issues/38). ([aff6382](https://github.com/ckeditor/ckeditor5-upload/commit/aff6382)) + +### Features + +* Responsive images support in image upload. Closes [#34](https://github.com/ckeditor/ckeditor5-upload/issues/34). ([9a022a2](https://github.com/ckeditor/ckeditor5-upload/commit/9a022a2)) +* The `ImageUploadCommand` now accepts `insertAt` position which allows customizing where the image will be inserted. Closes [#45](https://github.com/ckeditor/ckeditor5-upload/issues/45). ([b90c8d7](https://github.com/ckeditor/ckeditor5-upload/commit/b90c8d7)) + +### Other changes + +* Aborting upload when image is removed and removing image on upload error. Closes [#2](https://github.com/ckeditor/ckeditor5-upload/issues/2). ([c3bbb57](https://github.com/ckeditor/ckeditor5-upload/commit/c3bbb57)) +* Aligned the implementation to the new Command API (see https://github.com/ckeditor/ckeditor5-core/issues/88). ([3d97b81](https://github.com/ckeditor/ckeditor5-upload/commit/3d97b81)) +* Changed from original to default image. Closes [#49](https://github.com/ckeditor/ckeditor5-upload/issues/49). ([d8d61f3](https://github.com/ckeditor/ckeditor5-upload/commit/d8d61f3)) +* Cleaned up SVG icons. ([ab81012](https://github.com/ckeditor/ckeditor5-upload/commit/ab81012)) +* Optional notification title when upload fails. Closes [#30](https://github.com/ckeditor/ckeditor5-upload/issues/30). ([1a6306c](https://github.com/ckeditor/ckeditor5-upload/commit/1a6306c)) + +### BREAKING CHANGES + +* `UploadImageCommand` does not optimize the drop position itself anymore. Instead, a separate `findOptimalInsertionPosition()` function was introduced. +* `UploadImageCommand` does not verify the type of file anymore. This needs to be done by the caller. +* The command API has been changed. + + +## 0.1.0 (May 7, 2017) + +### Features + +* Initial implementation. Closes [#1](https://github.com/ckeditor/ckeditor5-upload/issues/1). diff --git a/node_modules/@ckeditor/ckeditor5-upload/LICENSE.md b/node_modules/@ckeditor/ckeditor5-upload/LICENSE.md new file mode 100644 index 0000000..0fb0496 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/LICENSE.md @@ -0,0 +1,17 @@ +Software License Agreement +========================== + +**CKEditor 5 upload feature** – https://github.com/ckeditor/ckeditor5-upload
    +Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-upload/README.md b/node_modules/@ckeditor/ckeditor5-upload/README.md new file mode 100644 index 0000000..4679a2e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/README.md @@ -0,0 +1,16 @@ +CKEditor 5 file upload feature +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-upload.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-upload) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +This package implements various file upload utilities for CKEditor 5. + +## Documentation + +See the [`@ckeditor/ckeditor5-upload` package](https://ckeditor.com/docs/ckeditor5/latest/api/upload.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-upload/ckeditor5-metadata.json b/node_modules/@ckeditor/ckeditor5-upload/ckeditor5-metadata.json new file mode 100644 index 0000000..1f2b9c8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/ckeditor5-metadata.json @@ -0,0 +1,18 @@ +{ + "plugins": [ + { + "name": "Base64 upload adapter", + "className": "Base64UploadAdapter", + "description": "An image upload tool. It converts images inserted into the rich-text editor into Base64-encoded strings in the editor output.", + "docs": "features/images/image-upload/base64-upload-adapter.html", + "path": "src/adapters/base64uploadadapter.js" + }, + { + "name": "Simple upload adapter", + "className": "SimpleUploadAdapter", + "description": "An image upload tool. It allows for uploading images to an application running on your server using the XMLHttpRequest API with a minimal editor configuration.", + "docs": "features/images/image-upload/simple-upload-adapter.html", + "path": "src/adapters/simpleuploadadapter.js" + } + ] +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/contexts.json b/node_modules/@ckeditor/ckeditor5-upload/lang/contexts.json new file mode 100644 index 0000000..64b0ff2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/contexts.json @@ -0,0 +1,3 @@ +{ + "Upload in progress": "A message that a file upload is in progress." +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ar.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ar.po new file mode 100644 index 0000000..4ba5581 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ar.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "جاري الرفع" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/az.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/az.po new file mode 100644 index 0000000..56188c9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/az.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Yüklənir" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/bg.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/bg.po new file mode 100644 index 0000000..da74302 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/bg.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Качването е в процес" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/bn.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/bn.po new file mode 100644 index 0000000..4672d83 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/bn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "আপলোড চলছে" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ca.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ca.po new file mode 100644 index 0000000..6ff5400 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ca.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Carrega en curs" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/cs.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/cs.po new file mode 100644 index 0000000..81ea001 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/cs.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Probíhá nahrávání" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/da.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/da.po new file mode 100644 index 0000000..2da3ddb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/da.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload i gang" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/de-ch.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/de-ch.po new file mode 100644 index 0000000..fb0af27 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/de-ch.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n" +"Language: de_CH\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload läuft" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/de.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/de.po new file mode 100644 index 0000000..6c4b988 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/de.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload läuft" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/el.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/el.po new file mode 100644 index 0000000..bc57878 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/el.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Αποστολή σε εξέλιξη" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-au.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-au.po new file mode 100644 index 0000000..8590e7d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-au.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n" +"Language: en_AU\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload in progress" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-gb.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-gb.po new file mode 100644 index 0000000..69e745a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en-gb.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload in progress" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en.po new file mode 100644 index 0000000..c34c6c2 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/en.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language: \n" +"Language-Team: \n" +"Plural-Forms: \n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload in progress" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/es-co.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/es-co.po new file mode 100644 index 0000000..4d8980d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/es-co.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n" +"Language: es_CO\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Carga en progreso" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/es.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/es.po new file mode 100644 index 0000000..799bade --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/es.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Subida en progreso" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/et.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/et.po new file mode 100644 index 0000000..d4c7597 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/et.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Üleslaadimine pooleli" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fa.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fa.po new file mode 100644 index 0000000..6cf023c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fa.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Persian (https://app.transifex.com/ckeditor/teams/11143/fa/)\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "آپلود در حال انجام" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fi.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fi.po new file mode 100644 index 0000000..87b6533 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Finnish (https://app.transifex.com/ckeditor/teams/11143/fi/)\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Lähetys käynnissä" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fr.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fr.po new file mode 100644 index 0000000..3d8033c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/fr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: French (https://app.transifex.com/ckeditor/teams/11143/fr/)\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Téléchargement en cours" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/gl.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/gl.po new file mode 100644 index 0000000..86b760e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/gl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Galician (https://app.transifex.com/ckeditor/teams/11143/gl/)\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Envío en proceso" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/he.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/he.po new file mode 100644 index 0000000..a8f45a0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/he.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hebrew (https://app.transifex.com/ckeditor/teams/11143/he/)\n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "העלאה מתבצעת" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hi.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hi.po new file mode 100644 index 0000000..74faf7b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hindi (https://app.transifex.com/ckeditor/teams/11143/hi/)\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Upload in progress" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hr.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hr.po new file mode 100644 index 0000000..c93a045 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Croatian (https://app.transifex.com/ckeditor/teams/11143/hr/)\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Slanje u tijeku" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hu.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hu.po new file mode 100644 index 0000000..f79c2e6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/hu.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Hungarian (https://app.transifex.com/ckeditor/teams/11143/hu/)\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "A feltöltés folyamatban" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/id.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/id.po new file mode 100644 index 0000000..b053f45 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/id.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Indonesian (https://app.transifex.com/ckeditor/teams/11143/id/)\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Sedang mengunggah" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/it.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/it.po new file mode 100644 index 0000000..8ab8f57 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/it.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Italian (https://app.transifex.com/ckeditor/teams/11143/it/)\n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Caricamento in corso" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ja.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ja.po new file mode 100644 index 0000000..fb9c22c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ja.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Japanese (https://app.transifex.com/ckeditor/teams/11143/ja/)\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "アップロード中" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ko.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ko.po new file mode 100644 index 0000000..0d31b6f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ko.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Korean (https://app.transifex.com/ckeditor/teams/11143/ko/)\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "업로드 진행 중" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ku.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ku.po new file mode 100644 index 0000000..f4eb179 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ku.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Kurdish (https://app.transifex.com/ckeditor/teams/11143/ku/)\n" +"Language: ku\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "بارکردنەکە لە جێبەجێکردن دایە" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/lt.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/lt.po new file mode 100644 index 0000000..6ed8677 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/lt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Lithuanian (https://app.transifex.com/ckeditor/teams/11143/lt/)\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Įkelima" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/lv.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/lv.po new file mode 100644 index 0000000..429b366 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/lv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Latvian (https://app.transifex.com/ckeditor/teams/11143/lv/)\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Notiek augšupielāde" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ms.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ms.po new file mode 100644 index 0000000..8a56b8f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ms.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Malay (https://app.transifex.com/ckeditor/teams/11143/ms/)\n" +"Language: ms\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Muat naik sedang berlangsung" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/nb.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/nb.po new file mode 100644 index 0000000..dd5c67d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/nb.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/ckeditor/teams/11143/nb/)\n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Opplasting pågår" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ne.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ne.po new file mode 100644 index 0000000..5913682 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ne.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Nepali (Nepal) (https://app.transifex.com/ckeditor/teams/11143/ne_NP/)\n" +"Language: ne_NP\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "अपलोड हुदैछ" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/nl.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/nl.po new file mode 100644 index 0000000..b52c838 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/nl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Dutch (https://app.transifex.com/ckeditor/teams/11143/nl/)\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Bezig met uploaden" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/no.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/no.po new file mode 100644 index 0000000..3cc8490 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/no.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Norwegian (https://app.transifex.com/ckeditor/teams/11143/no/)\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Laster opp fil" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pl.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pl.po new file mode 100644 index 0000000..6533dae --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pl.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Polish (https://app.transifex.com/ckeditor/teams/11143/pl/)\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Trwa przesyłanie" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt-br.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt-br.po new file mode 100644 index 0000000..3fed768 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt-br.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/ckeditor/teams/11143/pt_BR/)\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Enviando dados" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt.po new file mode 100644 index 0000000..5bb2528 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/pt.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Portuguese (https://app.transifex.com/ckeditor/teams/11143/pt/)\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Carregamento em progresso" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ro.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ro.po new file mode 100644 index 0000000..58aa44b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ro.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Romanian (https://app.transifex.com/ckeditor/teams/11143/ro/)\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Încărcare în curs" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ru.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ru.po new file mode 100644 index 0000000..33206cf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ru.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Russian (https://app.transifex.com/ckeditor/teams/11143/ru/)\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Идёт загрузка" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sk.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sk.po new file mode 100644 index 0000000..b6573ac --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Slovak (https://app.transifex.com/ckeditor/teams/11143/sk/)\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Prebieha nahrávanie" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sq.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sq.po new file mode 100644 index 0000000..f70f7fb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sq.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Albanian (https://app.transifex.com/ckeditor/teams/11143/sq/)\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Duke ngarkuar" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr-latn.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr-latn.po new file mode 100644 index 0000000..d4a4047 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr-latn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (Latin) (https://app.transifex.com/ckeditor/teams/11143/sr@latin/)\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Postavljanje u toku" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr.po new file mode 100644 index 0000000..b01219d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Serbian (https://app.transifex.com/ckeditor/teams/11143/sr/)\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Постављање у току" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sv.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sv.po new file mode 100644 index 0000000..829ba5c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/sv.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Swedish (https://app.transifex.com/ckeditor/teams/11143/sv/)\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Uppladdning pågår" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/th.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/th.po new file mode 100644 index 0000000..ea5bc87 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/th.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Thai (https://app.transifex.com/ckeditor/teams/11143/th/)\n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "กำลังดำเนินการอัปโหลด" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/tk.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/tk.po new file mode 100644 index 0000000..22edf72 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/tk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkmen (https://app.transifex.com/ckeditor/teams/11143/tk/)\n" +"Language: tk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Ýüklemek dowam edýär" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/tr.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/tr.po new file mode 100644 index 0000000..0fce7a0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/tr.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Turkish (https://app.transifex.com/ckeditor/teams/11143/tr/)\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Yükleme işlemi devam ediyor" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ug.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ug.po new file mode 100644 index 0000000..0d27fb8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ug.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uyghur (https://app.transifex.com/ckeditor/teams/11143/ug/)\n" +"Language: ug\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "يۈكلىنىۋاتىدۇ" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/uk.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/uk.po new file mode 100644 index 0000000..2751c96 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/uk.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Ukrainian (https://app.transifex.com/ckeditor/teams/11143/uk/)\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Виконується завантаження" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ur.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ur.po new file mode 100644 index 0000000..018c08f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/ur.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Urdu (https://app.transifex.com/ckeditor/teams/11143/ur/)\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "آپلوڈ جاری ہے" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/uz.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/uz.po new file mode 100644 index 0000000..ee1b3d3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/uz.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Uzbek (https://app.transifex.com/ckeditor/teams/11143/uz/)\n" +"Language: uz\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Yuklanmoqda" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/vi.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/vi.po new file mode 100644 index 0000000..44b5beb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/vi.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Vietnamese (https://app.transifex.com/ckeditor/teams/11143/vi/)\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "Đang tải lên" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh-cn.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh-cn.po new file mode 100644 index 0000000..34b64b7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh-cn.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (China) (https://app.transifex.com/ckeditor/teams/11143/zh_CN/)\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "正在上传" diff --git a/node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh.po b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh.po new file mode 100644 index 0000000..f850570 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/lang/translations/zh.po @@ -0,0 +1,22 @@ +# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. +# +# !!! IMPORTANT !!! +# +# Before you edit this file, please keep in mind that contributing to the project +# translations is possible ONLY via the Transifex online service. +# +# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5. +# +# To learn more, check out the official contributor's guide: +# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html +# +msgid "" +msgstr "" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/ckeditor/teams/11143/zh_TW/)\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Content-Type: text/plain; charset=UTF-8\n" + +msgctxt "A message that a file upload is in progress." +msgid "Upload in progress" +msgstr "正在上傳" diff --git a/node_modules/@ckeditor/ckeditor5-upload/package.json b/node_modules/@ckeditor/ckeditor5-upload/package.json new file mode 100644 index 0000000..f9b6ee6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/package.json @@ -0,0 +1,36 @@ +{ + "name": "@ckeditor/ckeditor5-upload", + "version": "41.3.1", + "description": "Upload feature for CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-lib", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "@ckeditor/ckeditor5-core": "41.3.1", + "@ckeditor/ckeditor5-utils": "41.3.1" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-upload" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.d.ts new file mode 100644 index 0000000..cb0b5c7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.d.ts @@ -0,0 +1,33 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/adapters/base64uploadadapter + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import FileRepository from '../filerepository.js'; +/** + * A plugin that converts images inserted into the editor into [Base64 strings](https://en.wikipedia.org/wiki/Base64) + * in the {@glink installation/getting-started/getting-and-setting-data editor output}. + * + * This kind of image upload does not require server processing – images are stored with the rest of the text and + * displayed by the web browser without additional requests. + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} to learn about + * other ways to upload images into CKEditor 5. + */ +export default class Base64UploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof FileRepository]; + /** + * @inheritDoc + */ + static get pluginName(): "Base64UploadAdapter"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.js b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.js new file mode 100644 index 0000000..6e793ba --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/base64uploadadapter.js @@ -0,0 +1,81 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/adapters/base64uploadadapter + */ +/* globals window */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import FileRepository from '../filerepository.js'; +/** + * A plugin that converts images inserted into the editor into [Base64 strings](https://en.wikipedia.org/wiki/Base64) + * in the {@glink installation/getting-started/getting-and-setting-data editor output}. + * + * This kind of image upload does not require server processing – images are stored with the rest of the text and + * displayed by the web browser without additional requests. + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} to learn about + * other ways to upload images into CKEditor 5. + */ +export default class Base64UploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [FileRepository]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'Base64UploadAdapter'; + } + /** + * @inheritDoc + */ + init() { + this.editor.plugins.get(FileRepository).createUploadAdapter = loader => new Adapter(loader); + } +} +/** + * The upload adapter that converts images inserted into the editor into Base64 strings. + */ +class Adapter { + /** + * Creates a new adapter instance. + */ + constructor(loader) { + this.loader = loader; + } + /** + * Starts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#upload + */ + upload() { + return new Promise((resolve, reject) => { + const reader = this.reader = new window.FileReader(); + reader.addEventListener('load', () => { + resolve({ default: reader.result }); + }); + reader.addEventListener('error', err => { + reject(err); + }); + reader.addEventListener('abort', () => { + reject(); + }); + this.loader.file.then(file => { + reader.readAsDataURL(file); + }); + }); + } + /** + * Aborts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#abort + */ + abort() { + this.reader.abort(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.d.ts new file mode 100644 index 0000000..5eb7b1d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.d.ts @@ -0,0 +1,48 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/adapters/simpleuploadadapter + */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import FileRepository from '../filerepository.js'; +/** + * The Simple upload adapter allows uploading images to an application running on your server using + * the [`XMLHttpRequest`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) API with a + * minimal {@link module:upload/uploadconfig~SimpleUploadConfig editor configuration}. + * + * ```ts + * ClassicEditor + * .create( document.querySelector( '#editor' ), { + * simpleUpload: { + * uploadUrl: 'http://example.com', + * headers: { + * ... + * } + * } + * } ) + * .then( ... ) + * .catch( ... ); + * ``` + * + * See the {@glink features/images/image-upload/simple-upload-adapter "Simple upload adapter"} guide to learn how to + * learn more about the feature (configuration, server–side requirements, etc.). + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} to learn about + * other ways to upload images into CKEditor 5. + */ +export default class SimpleUploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires(): readonly [typeof FileRepository]; + /** + * @inheritDoc + */ + static get pluginName(): "SimpleUploadAdapter"; + /** + * @inheritDoc + */ + init(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js new file mode 100644 index 0000000..8302357 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/adapters/simpleuploadadapter.js @@ -0,0 +1,175 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/adapters/simpleuploadadapter + */ +/* globals XMLHttpRequest, FormData */ +import { Plugin } from '@ckeditor/ckeditor5-core'; +import FileRepository from '../filerepository.js'; +import { logWarning } from '@ckeditor/ckeditor5-utils'; +/** + * The Simple upload adapter allows uploading images to an application running on your server using + * the [`XMLHttpRequest`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) API with a + * minimal {@link module:upload/uploadconfig~SimpleUploadConfig editor configuration}. + * + * ```ts + * ClassicEditor + * .create( document.querySelector( '#editor' ), { + * simpleUpload: { + * uploadUrl: 'http://example.com', + * headers: { + * ... + * } + * } + * } ) + * .then( ... ) + * .catch( ... ); + * ``` + * + * See the {@glink features/images/image-upload/simple-upload-adapter "Simple upload adapter"} guide to learn how to + * learn more about the feature (configuration, server–side requirements, etc.). + * + * Check out the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} to learn about + * other ways to upload images into CKEditor 5. + */ +export default class SimpleUploadAdapter extends Plugin { + /** + * @inheritDoc + */ + static get requires() { + return [FileRepository]; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'SimpleUploadAdapter'; + } + /** + * @inheritDoc + */ + init() { + const options = this.editor.config.get('simpleUpload'); + if (!options) { + return; + } + if (!options.uploadUrl) { + /** + * The {@link module:upload/uploadconfig~SimpleUploadConfig#uploadUrl `config.simpleUpload.uploadUrl`} + * configuration required by the {@link module:upload/adapters/simpleuploadadapter~SimpleUploadAdapter `SimpleUploadAdapter`} + * is missing. Make sure the correct URL is specified for the image upload to work properly. + * + * @error simple-upload-adapter-missing-uploadurl + */ + logWarning('simple-upload-adapter-missing-uploadurl'); + return; + } + this.editor.plugins.get(FileRepository).createUploadAdapter = loader => { + return new Adapter(loader, options); + }; + } +} +/** + * Upload adapter. + */ +class Adapter { + /** + * Creates a new adapter instance. + */ + constructor(loader, options) { + this.loader = loader; + this.options = options; + } + /** + * Starts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#upload + */ + upload() { + return this.loader.file + .then(file => new Promise((resolve, reject) => { + this._initRequest(); + this._initListeners(resolve, reject, file); + this._sendRequest(file); + })); + } + /** + * Aborts the upload process. + * + * @see module:upload/filerepository~UploadAdapter#abort + */ + abort() { + if (this.xhr) { + this.xhr.abort(); + } + } + /** + * Initializes the `XMLHttpRequest` object using the URL specified as + * {@link module:upload/uploadconfig~SimpleUploadConfig#uploadUrl `simpleUpload.uploadUrl`} in the editor's + * configuration. + */ + _initRequest() { + const xhr = this.xhr = new XMLHttpRequest(); + xhr.open('POST', this.options.uploadUrl, true); + xhr.responseType = 'json'; + } + /** + * Initializes XMLHttpRequest listeners + * + * @param resolve Callback function to be called when the request is successful. + * @param reject Callback function to be called when the request cannot be completed. + * @param file Native File object. + */ + _initListeners(resolve, reject, file) { + const xhr = this.xhr; + const loader = this.loader; + const genericErrorText = `Couldn't upload file: ${file.name}.`; + xhr.addEventListener('error', () => reject(genericErrorText)); + xhr.addEventListener('abort', () => reject()); + xhr.addEventListener('load', () => { + const response = xhr.response; + if (!response || response.error) { + return reject(response && response.error && response.error.message ? response.error.message : genericErrorText); + } + const urls = response.url ? { default: response.url } : response.urls; + // Resolve with the normalized `urls` property and pass the rest of the response + // to allow customizing the behavior of features relying on the upload adapters. + resolve({ + ...response, + urls + }); + }); + // Upload progress when it is supported. + /* istanbul ignore else -- @preserve */ + if (xhr.upload) { + xhr.upload.addEventListener('progress', evt => { + if (evt.lengthComputable) { + loader.uploadTotal = evt.total; + loader.uploaded = evt.loaded; + } + }); + } + } + /** + * Prepares the data and sends the request. + * + * @param file File instance to be uploaded. + */ + _sendRequest(file) { + // Set headers if specified. + const headers = this.options.headers || {}; + // Use the withCredentials flag if specified. + const withCredentials = this.options.withCredentials || false; + for (const headerName of Object.keys(headers)) { + this.xhr.setRequestHeader(headerName, headers[headerName]); + } + this.xhr.withCredentials = withCredentials; + // Prepare the form data. + const data = new FormData(); + data.append('upload', file); + // Send the request. + this.xhr.send(data); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/augmentation.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/augmentation.d.ts new file mode 100644 index 0000000..4841f9d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/augmentation.d.ts @@ -0,0 +1,20 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { SimpleUploadConfig, FileRepository, SimpleUploadAdapter, Base64UploadAdapter } from './index.js'; +declare module '@ckeditor/ckeditor5-core' { + interface EditorConfig { + /** + * The configuration of the {@link module:upload/adapters/simpleuploadadapter~SimpleUploadAdapter simple upload adapter}. + * + * Read more in {@link module:upload/uploadconfig~SimpleUploadConfig}. + */ + simpleUpload?: SimpleUploadConfig; + } + interface PluginsMap { + [FileRepository.pluginName]: FileRepository; + [SimpleUploadAdapter.pluginName]: SimpleUploadAdapter; + [Base64UploadAdapter.pluginName]: Base64UploadAdapter; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/augmentation.js b/node_modules/@ckeditor/ckeditor5-upload/src/augmentation.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/augmentation.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/filereader.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/filereader.d.ts new file mode 100644 index 0000000..ce3b8cf --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/filereader.d.ts @@ -0,0 +1,56 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +declare const FileReader_base: { + new (): import("@ckeditor/ckeditor5-utils").Observable; + prototype: import("@ckeditor/ckeditor5-utils").Observable; +}; +/** + * Wrapper over the native `FileReader`. + */ +export default class FileReader extends FileReader_base { + total: number; + /** + * Instance of native FileReader. + */ + private readonly _reader; + /** + * Holds the data of an already loaded file. The file must be first loaded + * by using {@link module:upload/filereader~FileReader#read `read()`}. + */ + private _data?; + /** + * Number of bytes loaded. + * + * @readonly + * @observable + */ + loaded: number; + /** + * Creates an instance of the FileReader. + */ + constructor(); + /** + * Returns error that occurred during file reading. + */ + get error(): DOMException | null; + /** + * Holds the data of an already loaded file. The file must be first loaded + * by using {@link module:upload/filereader~FileReader#read `read()`}. + */ + get data(): string | undefined; + /** + * Reads the provided file. + * + * @param file Native File object. + * @returns Returns a promise that will be resolved with file's content. + * The promise will be rejected in case of an error or when the reading process is aborted. + */ + read(file: File): Promise; + /** + * Aborts file reader. + */ + abort(): void; +} +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/filereader.js b/node_modules/@ckeditor/ckeditor5-upload/src/filereader.js new file mode 100644 index 0000000..2df4c0d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/filereader.js @@ -0,0 +1,71 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/filereader + */ +/* globals window */ +import { ObservableMixin } from '@ckeditor/ckeditor5-utils'; +/** + * Wrapper over the native `FileReader`. + */ +export default class FileReader extends ObservableMixin() { + /** + * Creates an instance of the FileReader. + */ + constructor() { + super(); + const reader = new window.FileReader(); + this._reader = reader; + this._data = undefined; + this.set('loaded', 0); + reader.onprogress = evt => { + this.loaded = evt.loaded; + }; + } + /** + * Returns error that occurred during file reading. + */ + get error() { + return this._reader.error; + } + /** + * Holds the data of an already loaded file. The file must be first loaded + * by using {@link module:upload/filereader~FileReader#read `read()`}. + */ + get data() { + return this._data; + } + /** + * Reads the provided file. + * + * @param file Native File object. + * @returns Returns a promise that will be resolved with file's content. + * The promise will be rejected in case of an error or when the reading process is aborted. + */ + read(file) { + const reader = this._reader; + this.total = file.size; + return new Promise((resolve, reject) => { + reader.onload = () => { + const result = reader.result; + this._data = result; + resolve(result); + }; + reader.onerror = () => { + reject('error'); + }; + reader.onabort = () => { + reject('aborted'); + }; + this._reader.readAsDataURL(file); + }); + } + /** + * Aborts file reader. + */ + abort() { + this._reader.abort(); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/filerepository.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/filerepository.d.ts new file mode 100644 index 0000000..f0db9a6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/filerepository.d.ts @@ -0,0 +1,342 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/filerepository + */ +import { Plugin, PendingActions } from '@ckeditor/ckeditor5-core'; +import { Collection } from '@ckeditor/ckeditor5-utils'; +/** + * File repository plugin. A central point for managing file upload. + * + * To use it, first you need an upload adapter. Upload adapter's job is to handle communication with the server + * (sending the file and handling server's response). You can use one of the existing plugins introducing upload adapters + * (e.g. {@link module:easy-image/cloudservicesuploadadapter~CloudServicesUploadAdapter} or + * {@link module:adapter-ckfinder/uploadadapter~CKFinderUploadAdapter}) or write your own one – see + * the {@glink framework/deep-dive/upload-adapter Custom image upload adapter deep-dive} guide. + * + * Then, you can use {@link module:upload/filerepository~FileRepository#createLoader `createLoader()`} and the returned + * {@link module:upload/filerepository~FileLoader} instance to load and upload files. + */ +export default class FileRepository extends Plugin { + /** + * Collection of loaders associated with this repository. + */ + loaders: Collection; + /** + * A factory function which should be defined before using `FileRepository`. + * + * It should return a new instance of {@link module:upload/filerepository~UploadAdapter} that will be used to upload files. + * {@link module:upload/filerepository~FileLoader} instance associated with the adapter + * will be passed to that function. + * + * For more information and example see {@link module:upload/filerepository~UploadAdapter}. + */ + createUploadAdapter?: (loader: FileLoader) => UploadAdapter; + /** + * Loaders mappings used to retrieve loaders references. + */ + private _loadersMap; + /** + * Reference to a pending action registered in a {@link module:core/pendingactions~PendingActions} plugin + * while upload is in progress. When there is no upload then value is `null`. + */ + private _pendingAction; + /** + * Number of bytes uploaded. + * + * @readonly + * @observable + */ + uploaded: number; + /** + * Number of total bytes to upload. + * + * It might be different than the file size because of headers and additional data. + * It contains `null` if value is not available yet, so it's better to use {@link #uploadedPercent} to monitor + * the progress. + * + * @readonly + * @observable + */ + uploadTotal: number | null; + /** + * Upload progress in percents. + * + * @readonly + * @observable + */ + uploadedPercent: number; + /** + * @inheritDoc + */ + static get pluginName(): "FileRepository"; + /** + * @inheritDoc + */ + static get requires(): readonly [typeof PendingActions]; + /** + * @inheritDoc + */ + init(): void; + /** + * Returns the loader associated with specified file or promise. + * + * To get loader by id use `fileRepository.loaders.get( id )`. + * + * @param fileOrPromise Native file or promise handle. + */ + getLoader(fileOrPromise: File | Promise): FileLoader | null; + /** + * Creates a loader instance for the given file. + * + * Requires {@link #createUploadAdapter} factory to be defined. + * + * @param fileOrPromise Native File object or native Promise object which resolves to a File. + */ + createLoader(fileOrPromise: File | Promise): FileLoader | null; + /** + * Destroys the given loader. + * + * @param fileOrPromiseOrLoader File or Promise associated with that loader or loader itself. + */ + destroyLoader(fileOrPromiseOrLoader: File | Promise | FileLoader): void; + /** + * Registers or deregisters pending action bound with upload progress. + */ + private _updatePendingAction; +} +declare const FileLoader_base: { + new (): import("@ckeditor/ckeditor5-utils").Observable; + prototype: import("@ckeditor/ckeditor5-utils").Observable; +}; +/** + * File loader class. + * + * It is used to control the process of reading the file and uploading it using the specified upload adapter. + */ +declare class FileLoader extends FileLoader_base { + /** + * Unique id of FileLoader instance. + * + * @readonly + */ + readonly id: string; + /** + * Additional wrapper over the initial file promise passed to this loader. + */ + private _filePromiseWrapper; + /** + * Adapter instance associated with this file loader. + */ + private _adapter; + /** + * FileReader used by FileLoader. + */ + private _reader; + /** + * Current status of FileLoader. It can be one of the following: + * + * * 'idle', + * * 'reading', + * * 'uploading', + * * 'aborted', + * * 'error'. + * + * When reading status can change in a following way: + * + * `idle` -> `reading` -> `idle` + * `idle` -> `reading -> `aborted` + * `idle` -> `reading -> `error` + * + * When uploading status can change in a following way: + * + * `idle` -> `uploading` -> `idle` + * `idle` -> `uploading` -> `aborted` + * `idle` -> `uploading` -> `error` + * + * @readonly + * @observable + */ + status: 'idle' | 'reading' | 'uploading' | 'aborted' | 'error'; + /** + * Number of bytes uploaded. + * + * @readonly + * @observable + */ + uploaded: number; + /** + * Number of total bytes to upload. + * + * @readonly + * @observable + */ + uploadTotal: number | null; + /** + * Upload progress in percents. + * + * @readonly + * @observable + */ + uploadedPercent: number; + /** + * Response of the upload. + * + * @readonly + * @observable + */ + uploadResponse?: UploadResponse | null; + /** + * Creates a new instance of `FileLoader`. + * + * @param filePromise A promise which resolves to a file instance. + * @param uploadAdapterCreator The function which returns {@link module:upload/filerepository~UploadAdapter} instance. + */ + constructor(filePromise: Promise, uploadAdapterCreator: (loader: FileLoader) => UploadAdapter); + /** + * A `Promise` which resolves to a `File` instance associated with this file loader. + */ + get file(): Promise; + /** + * Returns the file data. To read its data, you need for first load the file + * by using the {@link module:upload/filerepository~FileLoader#read `read()`} method. + */ + get data(): string | undefined; + /** + * Reads file using {@link module:upload/filereader~FileReader}. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-read-wrong-status` when status + * is different than `idle`. + * + * Example usage: + * + * ```ts + * fileLoader.read() + * .then( data => { ... } ) + * .catch( err => { + * if ( err === 'aborted' ) { + * console.log( 'Reading aborted.' ); + * } else { + * console.log( 'Reading error.', err ); + * } + * } ); + * ``` + * + * @returns Returns promise that will be resolved with read data. Promise will be rejected if error + * occurs or if read process is aborted. + */ + read(): Promise; + /** + * Reads file using the provided {@link module:upload/filerepository~UploadAdapter}. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-upload-wrong-status` when status + * is different than `idle`. + * Example usage: + * + * ```ts + * fileLoader.upload() + * .then( data => { ... } ) + * .catch( e => { + * if ( e === 'aborted' ) { + * console.log( 'Uploading aborted.' ); + * } else { + * console.log( 'Uploading error.', e ); + * } + * } ); + * ``` + * + * @returns Returns promise that will be resolved with response data. Promise will be rejected if error + * occurs or if read process is aborted. + */ + upload(): Promise; + /** + * Aborts loading process. + */ + abort(): void; + /** + * Performs cleanup. + * + * @internal + */ + _destroy(): void; + /** + * Wraps a given file promise into another promise giving additional + * control (resolving, rejecting, checking if fulfilled) over it. + * + * @param filePromise The initial file promise to be wrapped. + */ + private _createFilePromiseWrapper; +} +export type { FileLoader }; +/** + * Upload adapter interface used by the {@link module:upload/filerepository~FileRepository file repository} + * to handle file upload. An upload adapter is a bridge between the editor and server that handles file uploads. + * It should contain a logic necessary to initiate an upload process and monitor its progress. + * + * Learn how to develop your own upload adapter for CKEditor 5 in the + * {@glink framework/deep-dive/upload-adapter "Custom upload adapter"} guide. + * + * @interface UploadAdapter + */ +export interface UploadAdapter { + /** + * Executes the upload process. + * This method should return a promise that will resolve when data will be uploaded to server. Promise should be + * resolved with an object containing information about uploaded file: + * + * ```json + * { + * default: 'http://server/default-size.image.png' + * } + * ``` + * + * Additionally, other image sizes can be provided: + * + * ```json + * { + * default: 'http://server/default-size.image.png', + * '160': 'http://server/size-160.image.png', + * '500': 'http://server/size-500.image.png', + * '1000': 'http://server/size-1000.image.png', + * '1052': 'http://server/default-size.image.png' + * } + * ``` + * + * You can also pass additional properties from the server. In this case you need to wrap URLs + * in the `urls` object and pass additional properties along the `urls` property. + * + * ```json + * { + * myCustomProperty: 'foo', + * urls: { + * default: 'http://server/default-size.image.png', + * '160': 'http://server/size-160.image.png', + * '500': 'http://server/size-500.image.png', + * '1000': 'http://server/size-1000.image.png', + * '1052': 'http://server/default-size.image.png' + * } + * } + * ``` + * + * NOTE: When returning multiple images, the widest returned one should equal the default one. It is essential to + * correctly set `width` attribute of the image. See this discussion: + * https://github.com/ckeditor/ckeditor5-easy-image/issues/4 for more information. + * + * Take a look at {@link module:upload/filerepository~UploadAdapter example Adapter implementation} and + * {@link module:upload/filerepository~FileRepository#createUploadAdapter createUploadAdapter method}. + * + * @returns Promise that should be resolved when data is uploaded. + */ + upload(): Promise; + /** + * Aborts the upload process. + * After aborting it should reject promise returned from {@link #upload upload()}. + * + * Take a look at {@link module:upload/filerepository~UploadAdapter example Adapter implementation} and + * {@link module:upload/filerepository~FileRepository#createUploadAdapter createUploadAdapter method}. + */ + abort?(): void; +} +export type UploadResponse = Record; diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/filerepository.js b/node_modules/@ckeditor/ckeditor5-upload/src/filerepository.js new file mode 100644 index 0000000..ebebee5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/filerepository.js @@ -0,0 +1,383 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/filerepository + */ +import { Plugin, PendingActions } from '@ckeditor/ckeditor5-core'; +import { CKEditorError, Collection, ObservableMixin, logWarning, uid } from '@ckeditor/ckeditor5-utils'; +import FileReader from './filereader.js'; +/** + * File repository plugin. A central point for managing file upload. + * + * To use it, first you need an upload adapter. Upload adapter's job is to handle communication with the server + * (sending the file and handling server's response). You can use one of the existing plugins introducing upload adapters + * (e.g. {@link module:easy-image/cloudservicesuploadadapter~CloudServicesUploadAdapter} or + * {@link module:adapter-ckfinder/uploadadapter~CKFinderUploadAdapter}) or write your own one – see + * the {@glink framework/deep-dive/upload-adapter Custom image upload adapter deep-dive} guide. + * + * Then, you can use {@link module:upload/filerepository~FileRepository#createLoader `createLoader()`} and the returned + * {@link module:upload/filerepository~FileLoader} instance to load and upload files. + */ +export default class FileRepository extends Plugin { + constructor() { + super(...arguments); + /** + * Collection of loaders associated with this repository. + */ + this.loaders = new Collection(); + /** + * Loaders mappings used to retrieve loaders references. + */ + this._loadersMap = new Map(); + /** + * Reference to a pending action registered in a {@link module:core/pendingactions~PendingActions} plugin + * while upload is in progress. When there is no upload then value is `null`. + */ + this._pendingAction = null; + } + /** + * @inheritDoc + */ + static get pluginName() { + return 'FileRepository'; + } + /** + * @inheritDoc + */ + static get requires() { + return [PendingActions]; + } + /** + * @inheritDoc + */ + init() { + // Keeps upload in a sync with pending actions. + this.loaders.on('change', () => this._updatePendingAction()); + this.set('uploaded', 0); + this.set('uploadTotal', null); + this.bind('uploadedPercent').to(this, 'uploaded', this, 'uploadTotal', (uploaded, total) => { + return total ? (uploaded / total * 100) : 0; + }); + } + /** + * Returns the loader associated with specified file or promise. + * + * To get loader by id use `fileRepository.loaders.get( id )`. + * + * @param fileOrPromise Native file or promise handle. + */ + getLoader(fileOrPromise) { + return this._loadersMap.get(fileOrPromise) || null; + } + /** + * Creates a loader instance for the given file. + * + * Requires {@link #createUploadAdapter} factory to be defined. + * + * @param fileOrPromise Native File object or native Promise object which resolves to a File. + */ + createLoader(fileOrPromise) { + if (!this.createUploadAdapter) { + /** + * You need to enable an upload adapter in order to be able to upload files. + * + * This warning shows up when {@link module:upload/filerepository~FileRepository} is being used + * without {@link module:upload/filerepository~FileRepository#createUploadAdapter defining an upload adapter}. + * + * **If you see this warning when using one of the {@glink installation/getting-started/predefined-builds + * CKEditor 5 Builds}** + * it means that you did not configure any of the upload adapters available by default in those builds. + * + * See the {@glink features/images/image-upload/image-upload comprehensive "Image upload overview"} to learn which upload + * adapters are available in the builds and how to configure them. + * + * **If you see this warning when using a custom build** there is a chance that you enabled + * a feature like {@link module:image/imageupload~ImageUpload}, + * or {@link module:image/imageupload/imageuploadui~ImageUploadUI} but you did not enable any upload adapter. + * You can choose one of the existing upload adapters listed in the + * {@glink features/images/image-upload/image-upload "Image upload overview"}. + * + * You can also implement your {@glink framework/deep-dive/upload-adapter own image upload adapter}. + * + * @error filerepository-no-upload-adapter + */ + logWarning('filerepository-no-upload-adapter'); + return null; + } + const loader = new FileLoader(Promise.resolve(fileOrPromise), this.createUploadAdapter); + this.loaders.add(loader); + this._loadersMap.set(fileOrPromise, loader); + // Store also file => loader mapping so loader can be retrieved by file instance returned upon Promise resolution. + if (fileOrPromise instanceof Promise) { + loader.file + .then(file => { + this._loadersMap.set(file, loader); + }) + // Every then() must have a catch(). + // File loader state (and rejections) are handled in read() and upload(). + // Also, see the "does not swallow the file promise rejection" test. + .catch(() => { }); + } + loader.on('change:uploaded', () => { + let aggregatedUploaded = 0; + for (const loader of this.loaders) { + aggregatedUploaded += loader.uploaded; + } + this.uploaded = aggregatedUploaded; + }); + loader.on('change:uploadTotal', () => { + let aggregatedTotal = 0; + for (const loader of this.loaders) { + if (loader.uploadTotal) { + aggregatedTotal += loader.uploadTotal; + } + } + this.uploadTotal = aggregatedTotal; + }); + return loader; + } + /** + * Destroys the given loader. + * + * @param fileOrPromiseOrLoader File or Promise associated with that loader or loader itself. + */ + destroyLoader(fileOrPromiseOrLoader) { + const loader = fileOrPromiseOrLoader instanceof FileLoader ? fileOrPromiseOrLoader : this.getLoader(fileOrPromiseOrLoader); + loader._destroy(); + this.loaders.remove(loader); + this._loadersMap.forEach((value, key) => { + if (value === loader) { + this._loadersMap.delete(key); + } + }); + } + /** + * Registers or deregisters pending action bound with upload progress. + */ + _updatePendingAction() { + const pendingActions = this.editor.plugins.get(PendingActions); + if (this.loaders.length) { + if (!this._pendingAction) { + const t = this.editor.t; + const getMessage = (value) => `${t('Upload in progress')} ${parseInt(value)}%.`; + this._pendingAction = pendingActions.add(getMessage(this.uploadedPercent)); + this._pendingAction.bind('message').to(this, 'uploadedPercent', getMessage); + } + } + else { + pendingActions.remove(this._pendingAction); + this._pendingAction = null; + } + } +} +/** + * File loader class. + * + * It is used to control the process of reading the file and uploading it using the specified upload adapter. + */ +class FileLoader extends ObservableMixin() { + /** + * Creates a new instance of `FileLoader`. + * + * @param filePromise A promise which resolves to a file instance. + * @param uploadAdapterCreator The function which returns {@link module:upload/filerepository~UploadAdapter} instance. + */ + constructor(filePromise, uploadAdapterCreator) { + super(); + this.id = uid(); + this._filePromiseWrapper = this._createFilePromiseWrapper(filePromise); + this._adapter = uploadAdapterCreator(this); + this._reader = new FileReader(); + this.set('status', 'idle'); + this.set('uploaded', 0); + this.set('uploadTotal', null); + this.bind('uploadedPercent').to(this, 'uploaded', this, 'uploadTotal', (uploaded, total) => { + return total ? (uploaded / total * 100) : 0; + }); + this.set('uploadResponse', null); + } + /** + * A `Promise` which resolves to a `File` instance associated with this file loader. + */ + get file() { + if (!this._filePromiseWrapper) { + // Loader was destroyed, return promise which resolves to null. + return Promise.resolve(null); + } + else { + // The `this._filePromiseWrapper.promise` is chained and not simply returned to handle a case when: + // + // * The `loader.file.then( ... )` is called by external code (returned promise is pending). + // * Then `loader._destroy()` is called (call is synchronous) which destroys the `loader`. + // * Promise returned by the first `loader.file.then( ... )` call is resolved. + // + // Returning `this._filePromiseWrapper.promise` will still resolve to a `File` instance so there + // is an additional check needed in the chain to see if `loader` was destroyed in the meantime. + return this._filePromiseWrapper.promise.then(file => this._filePromiseWrapper ? file : null); + } + } + /** + * Returns the file data. To read its data, you need for first load the file + * by using the {@link module:upload/filerepository~FileLoader#read `read()`} method. + */ + get data() { + return this._reader.data; + } + /** + * Reads file using {@link module:upload/filereader~FileReader}. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-read-wrong-status` when status + * is different than `idle`. + * + * Example usage: + * + * ```ts + * fileLoader.read() + * .then( data => { ... } ) + * .catch( err => { + * if ( err === 'aborted' ) { + * console.log( 'Reading aborted.' ); + * } else { + * console.log( 'Reading error.', err ); + * } + * } ); + * ``` + * + * @returns Returns promise that will be resolved with read data. Promise will be rejected if error + * occurs or if read process is aborted. + */ + read() { + if (this.status != 'idle') { + /** + * You cannot call read if the status is different than idle. + * + * @error filerepository-read-wrong-status + */ + throw new CKEditorError('filerepository-read-wrong-status', this); + } + this.status = 'reading'; + return this.file + .then(file => this._reader.read(file)) + .then(data => { + // Edge case: reader was aborted after file was read - double check for proper status. + // It can happen when image was deleted during its upload. + if (this.status !== 'reading') { + throw this.status; + } + this.status = 'idle'; + return data; + }) + .catch(err => { + if (err === 'aborted') { + this.status = 'aborted'; + throw 'aborted'; + } + this.status = 'error'; + throw this._reader.error ? this._reader.error : err; + }); + } + /** + * Reads file using the provided {@link module:upload/filerepository~UploadAdapter}. + * + * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `filerepository-upload-wrong-status` when status + * is different than `idle`. + * Example usage: + * + * ```ts + * fileLoader.upload() + * .then( data => { ... } ) + * .catch( e => { + * if ( e === 'aborted' ) { + * console.log( 'Uploading aborted.' ); + * } else { + * console.log( 'Uploading error.', e ); + * } + * } ); + * ``` + * + * @returns Returns promise that will be resolved with response data. Promise will be rejected if error + * occurs or if read process is aborted. + */ + upload() { + if (this.status != 'idle') { + /** + * You cannot call upload if the status is different than idle. + * + * @error filerepository-upload-wrong-status + */ + throw new CKEditorError('filerepository-upload-wrong-status', this); + } + this.status = 'uploading'; + return this.file + .then(() => this._adapter.upload()) + .then(data => { + this.uploadResponse = data; + this.status = 'idle'; + return data; + }) + .catch(err => { + if (this.status === 'aborted') { + throw 'aborted'; + } + this.status = 'error'; + throw err; + }); + } + /** + * Aborts loading process. + */ + abort() { + const status = this.status; + this.status = 'aborted'; + if (!this._filePromiseWrapper.isFulfilled) { + // Edge case: file loader is aborted before read() is called + // so it might happen that no one handled the rejection of this promise. + // See https://github.com/ckeditor/ckeditor5-upload/pull/100 + this._filePromiseWrapper.promise.catch(() => { }); + this._filePromiseWrapper.rejecter('aborted'); + } + else if (status == 'reading') { + this._reader.abort(); + } + else if (status == 'uploading' && this._adapter.abort) { + this._adapter.abort(); + } + this._destroy(); + } + /** + * Performs cleanup. + * + * @internal + */ + _destroy() { + this._filePromiseWrapper = undefined; + this._reader = undefined; + this._adapter = undefined; + this.uploadResponse = undefined; + } + /** + * Wraps a given file promise into another promise giving additional + * control (resolving, rejecting, checking if fulfilled) over it. + * + * @param filePromise The initial file promise to be wrapped. + */ + _createFilePromiseWrapper(filePromise) { + const wrapper = {}; + wrapper.promise = new Promise((resolve, reject) => { + wrapper.rejecter = reject; + wrapper.isFulfilled = false; + filePromise + .then(file => { + wrapper.isFulfilled = true; + resolve(file); + }) + .catch(err => { + wrapper.isFulfilled = true; + reject(err); + }); + }); + return wrapper; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/index.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/index.d.ts new file mode 100644 index 0000000..e5e0fc6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/index.d.ts @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload + */ +export { default as FileRepository, type UploadAdapter, type UploadResponse, type FileLoader } from './filerepository.js'; +export { default as Base64UploadAdapter } from './adapters/base64uploadadapter.js'; +export { default as SimpleUploadAdapter } from './adapters/simpleuploadadapter.js'; +export type { SimpleUploadConfig } from './uploadconfig.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/index.js b/node_modules/@ckeditor/ckeditor5-upload/src/index.js new file mode 100644 index 0000000..a5f614e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/index.js @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload + */ +export { default as FileRepository } from './filerepository.js'; +export { default as Base64UploadAdapter } from './adapters/base64uploadadapter.js'; +export { default as SimpleUploadAdapter } from './adapters/simpleuploadadapter.js'; +import './augmentation.js'; diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.d.ts b/node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.d.ts new file mode 100644 index 0000000..54620e5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.d.ts @@ -0,0 +1,90 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module upload/uploadconfig + */ +/** + * The configuration of the {@link module:upload/adapters/simpleuploadadapter~SimpleUploadAdapter simple upload adapter}. + * + * ```ts + * ClassicEditor + * .create( editorElement, { + * simpleUpload: { + * // The URL the images are uploaded to. + * uploadUrl: 'http://example.com', + * + * // Headers sent along with the XMLHttpRequest to the upload server. + * headers: { + * ... + * } + * } + * } ); + * .then( ... ) + * .catch( ... ); + * ``` + * + * See the {@glink features/images/image-upload/simple-upload-adapter "Simple upload adapter"} guide to learn more. + * + * See {@link module:core/editor/editorconfig~EditorConfig all editor configuration options}. + */ +export interface SimpleUploadConfig { + /** + * The path (URL) to the server (application) which handles the file upload. When specified, enables the automatic + * upload of resources (images) inserted into the editor content. + * + * Learn more about the server application requirements in the + * {@glink features/images/image-upload/simple-upload-adapter#server-side-configuration "Server-side configuration"} section + * of the feature guide. + */ + uploadUrl: string; + /** + * An object that defines additional [headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) sent with + * the request to the server during the upload. This is the right place to implement security mechanisms like + * authentication and [CSRF](https://developer.mozilla.org/en-US/docs/Glossary/CSRF) protection. + * + * ```ts + * ClassicEditor + * .create( editorElement, { + * simpleUpload: { + * headers: { + * 'X-CSRF-TOKEN': 'CSRF-Token', + * Authorization: 'Bearer ' + * } + * } + * } ); + * .then( ... ) + * .catch( ... ); + * ``` + * + * Learn more about the server application requirements in the + * {@glink features/images/image-upload/simple-upload-adapter#server-side-configuration "Server-side configuration"} section + * of the feature guide. + */ + headers?: Record; + /** + * This flag enables the + * [`withCredentials`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials) + * property of the request sent to the server during the upload. It affects cross-site requests only and, for instance, + * allows credentials such as cookies to be sent along with the request. + * + * ```ts + * ClassicEditor + * .create( editorElement, { + * simpleUpload: { + * withCredentials: true + * } + * } ); + * .then( ... ) + * .catch( ... ); + * ``` + * + * Learn more about the server application requirements in the + * {@glink features/images/image-upload/simple-upload-adapter#server-side-configuration "Server-side configuration"} section + * of the feature guide. + * + * @default false + */ + withCredentials?: boolean; +} diff --git a/node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.js b/node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.js new file mode 100644 index 0000000..4fffd02 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-upload/src/uploadconfig.js @@ -0,0 +1,5 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-utils/CHANGELOG.md b/node_modules/@ckeditor/ckeditor5-utils/CHANGELOG.md new file mode 100644 index 0000000..7629da3 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/CHANGELOG.md @@ -0,0 +1,324 @@ +Changelog +========= + +All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md. + +Changes for the past releases are available below. + +## [19.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v18.0.0...v19.0.0) (April 29, 2020) + +### MINOR BREAKING CHANGES + +* The `translate` function from the `translation-service` was marked as protected. See [#334](https://github.com/ckeditor/ckeditor5-utils/issues/334). +* The format of stored editor translations has been changed. If you use `window.CKEDITOR_TRANSLATIONS` please see [#334](https://github.com/ckeditor/ckeditor5-utils/issues/334). +* The `getPositionedAncestor()` helper will no longer return the passed element when it is positioned. + +### MAJOR BREAKING CHANGES + +* `env.isEdge` is no longer available. See [ckeditor/ckeditor5#6202](https://github.com/ckeditor/ckeditor5/issues/6202). + +### Features + +* Added the support for initializing `Collection` items via the `constructor()`. Closes [ckeditor/ckeditor5#6319](https://github.com/ckeditor/ckeditor5/issues/6319). ([8846e66](https://github.com/ckeditor/ckeditor5-utils/commit/8846e66)) +* Provided support for plural forms internalization. Part of [ckeditor/ckeditor5#6526](https://github.com/ckeditor/ckeditor5/issues/6526). ([5f6ea75](https://github.com/ckeditor/ckeditor5-utils/commit/5f6ea75)) + +### Bug fixes + +* Do not execute `ResizeObserver` callbacks when the resized element is invisible (but still in DOM) (see [ckeditor/ckeditor5#6570](https://github.com/ckeditor/ckeditor5/issues/6570)). ([fb13d9d](https://github.com/ckeditor/ckeditor5-utils/commit/fb13d9d)) +* Editor will now load correctly in environment with `Symbol` polyfill. Closes [ckeditor/ckeditor5#6489](https://github.com/ckeditor/ckeditor5/issues/6489). ([7cd1f48](https://github.com/ckeditor/ckeditor5-utils/commit/7cd1f48)) +* Fixed various cases with typing multi-byte Unicode sequences (like emojis). Closes [ckeditor/ckeditor5#3147](https://github.com/ckeditor/ckeditor5/issues/3147). Closes [ckeditor/ckeditor5#6495](https://github.com/ckeditor/ckeditor5/issues/6495). ([6dc1ba6](https://github.com/ckeditor/ckeditor5-utils/commit/6dc1ba6)) +* The `getOptimalPosition()` helper should prefer positions that fit inside the viewport even though there are some others that fit better into the limiter. Closes [ckeditor/ckeditor5#6181](https://github.com/ckeditor/ckeditor5/issues/6181). ([7cd1238](https://github.com/ckeditor/ckeditor5-utils/commit/7cd1238)) + +### Other changes + +* Removed `env.isEdge` as Edge is now detected and treated as Chrome. Closes [ckeditor/ckeditor5#6202](https://github.com/ckeditor/ckeditor5/issues/6202). ([2902b30](https://github.com/ckeditor/ckeditor5-utils/commit/2902b30)) +* The `getPositionedAncestor()` helper should use `offsetParent` instead of `getComputedStyle()` for performance reasons. Closes [ckeditor/ckeditor5#6573](https://github.com/ckeditor/ckeditor5/issues/6573). ([7939756](https://github.com/ckeditor/ckeditor5-utils/commit/7939756)) + + +## [18.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v17.0.0...v18.0.0) (March 19, 2020) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [17.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v16.0.0...v17.0.0) (February 19, 2020) + +### MINOR BREAKING CHANGES + +* The `getResizeObserver()` helper is no longer available. We recommend using the [`ResizeObserver`](http://ckeditor.com/docs/ckeditor5/latest/api/module_utils_dom_resizeobserver-ResizeObserver.html) class instead. + +### Features + +* Added iterator interface to the `Config` class. ([1fdf2f1](https://github.com/ckeditor/ckeditor5-utils/commit/1fdf2f1)) + +### Other changes + +* Improved `toMap()` method performance. This results in improved editor data processing speed. Closes [ckeditor/ckeditor5#5854](https://github.com/ckeditor/ckeditor5/issues/5854). ([fef816e](https://github.com/ckeditor/ckeditor5-utils/commit/fef816e)) +* Replaced the `getResizeObserver()` helper with the `ResizeObserver` class for performance reasons. See [ckeditor/ckeditor5#6145](https://github.com/ckeditor/ckeditor5/issues/6145). ([05c97f8](https://github.com/ckeditor/ckeditor5-utils/commit/05c97f8)) +* The `uid()` helper should be a lot faster. Closes [ckeditor/ckeditor5#6188](https://github.com/ckeditor/ckeditor5/issues/6188). ([b57fc3f](https://github.com/ckeditor/ckeditor5-utils/commit/b57fc3f)) + + +## [16.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v15.0.0...v16.0.0) (December 4, 2019) + +### Bug fixes + +* Improved error re-throwing by replacing the error stack. Closes [ckeditor/ckeditor5#5595](https://github.com/ckeditor/ckeditor5/issues/5595). ([7685c0d](https://github.com/ckeditor/ckeditor5-utils/commit/7685c0d)) + + +## [15.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v14.0.0...v15.0.0) (October 23, 2019) + +### Features + +* Implemented the `getResizeObserver()` helper that offers an entry to the native `ResizeObserver` API (see [ckeditor/ckeditor5#416](https://github.com/ckeditor/ckeditor5/issues/416)). ([875d5a4](https://github.com/ckeditor/ckeditor5-utils/commit/875d5a4)) +* Introduced `assertEqualMarkup()` test utility method. Closes [ckeditor/ckeditor5-paste-from-office#14](https://github.com/ckeditor/ckeditor5-paste-from-office/issues/14). ([ee1655f](https://github.com/ckeditor/ckeditor5-utils/commit/ee1655f)) +* Introduced support for creating elements in other XML namespaces. See [ckeditor/ckeditor5#1842](https://github.com/ckeditor/ckeditor5/issues/1842). ([37fbcb9](https://github.com/ckeditor/ckeditor5-utils/commit/37fbcb9)) + + Thanks [@Sebobo](https://github.com/Sebobo)! + +### Bug fixes + +* `Rect#excludeScrollbarsAndBorders` should support RTL environments. Fixed incorrect output of the method. Closes [#297](https://github.com/ckeditor/ckeditor5-utils/issues/297). ([35f34fc](https://github.com/ckeditor/ckeditor5-utils/commit/35f34fc)) + +### Other changes + +* Introduced the `CKEditorError.rethrowUnexpectedError()` helper. Added custom error handling for the `Emitter#fire()` function. Part of [ckeditor/ckeditor5#1304](https://github.com/ckeditor/ckeditor5/issues/1304). ([1d84705](https://github.com/ckeditor/ckeditor5-utils/commit/1d84705)) + + +## [14.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v13.0.1...v14.0.0) (August 26, 2019) + +### Features + +* Add feature detection of Unicode properties entities' support. ([21c0f6b](https://github.com/ckeditor/ckeditor5-utils/commit/21c0f6b)) +* Allowed specifying editor content language in `Locale`. Implemented the (UI and content) language direction discovery in `Locale`. Implemented `Locale#uiLanguage`, `Locale#uiLanguageDirection`, `Locale#contentLanguage`, and `Locale#contentLanguageDirection` properties. See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([91c95f3](https://github.com/ckeditor/ckeditor5-utils/commit/91c95f3)) + +### Other changes + +* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([71469ac](https://github.com/ckeditor/ckeditor5-utils/commit/71469ac)) +* Removed the CKEditor 5 logger and its usage. Part of [ckeditor/ckeditor5#383](https://github.com/ckeditor/ckeditor5/issues/383). ([584ef1d](https://github.com/ckeditor/ckeditor5-utils/commit/584ef1d)) + +### BREAKING CHANGES + +* The`Locale()` constructor arguments syntax has changed. Please refer to the API documentation to learn more. +* The `Locale#language` property has been deprecated by `Locale#uiLanguage`. Please refer to the API documentation to learn more. +* Removed the CKEditor 5 logger utility. + + +## [13.0.1](https://github.com/ckeditor/ckeditor5-utils/compare/v13.0.0...v13.0.1) (July 10, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [13.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v12.1.1...v13.0.0) (July 4, 2019) + +### Features + +* Added `env.isAndroid`. ([591f641](https://github.com/ckeditor/ckeditor5-utils/commit/591f641)) + +### Other changes + +* Added context as second required argument to the `CKEditorError`'s constructor, changed `isCKEditorError()` method to `is()`. Introduced the `areConnectedThroughProperties()` utility. See [ckeditor/ckeditor5-watchdog#1](https://github.com/ckeditor/ckeditor5-watchdog/issues/1). ([bacc764](https://github.com/ckeditor/ckeditor5-utils/commit/bacc764)) + +### BREAKING CHANGES + +* The list of `CKEditorError()`'s parameters was changed – now it requires the message, context and then data. The `isCKEditorError()` method was renamed to `is()`. + + +## [12.1.1](https://github.com/ckeditor/ckeditor5-utils/compare/v12.1.0...v12.1.1) (June 6, 2019) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [12.1.0](https://github.com/ckeditor/ckeditor5-utils/compare/v12.0.0...v12.1.0) (April 4, 2019) + +### Features + +* Added `isSafari` property and `isSafari()` helper to the `env` module. See: [ckeditor/ckeditor5#1463](https://github.com/ckeditor/ckeditor5/issues/1463). ([f1ba6ae](https://github.com/ckeditor/ckeditor5-utils/commit/f1ba6ae)) +* Made `FocusTracker#focusedElement` observable to bring support for multi-root editors (see [ckeditor/ckeditor5#1599](https://github.com/ckeditor/ckeditor5/issues/1599)). ([952d440](https://github.com/ckeditor/ckeditor5-utils/commit/952d440)) + + +## [12.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v11.1.0...v12.0.0) (February 28, 2019) + +### Features + +* Introduce `Collection.has()` method. Closes [#266](https://github.com/ckeditor/ckeditor5-utils/issues/266). ([312d55e](https://github.com/ckeditor/ckeditor5-utils/commit/312d55e)) + +### Bug fixes + +* Prevent infinite loops on `.once()`. Closes [#272](https://github.com/ckeditor/ckeditor5-utils/issues/272). Closes [#204](https://github.com/ckeditor/ckeditor5-utils/issues/204). ([54b8108](https://github.com/ckeditor/ckeditor5-utils/commit/54b8108)) +* Fixed memory leaks during editor initialization and destruction (see [ckeditor/ckeditor5#1341](https://github.com/ckeditor/ckeditor5/issues/1341)). ([94bc59e](https://github.com/ckeditor/ckeditor5-utils/commit/94bc59e)) + +### Other changes + +* Configuration options should be cloned to prevent features from altering the original values. Closes [#257](https://github.com/ckeditor/ckeditor5-utils/issues/257). ([7981d4e](https://github.com/ckeditor/ckeditor5-utils/commit/7981d4e)) +* DOM Elements will not be cloned when returned from `editor.config.get()`. Closes [#264](https://github.com/ckeditor/ckeditor5-utils/issues/264). ([4ad23b1](https://github.com/ckeditor/ckeditor5-utils/commit/4ad23b1)) +* Optimized `diff()` function to use `fastDiff()` function internally for large data sets. Closes [#269](https://github.com/ckeditor/ckeditor5-utils/issues/269). ([ee9bed0](https://github.com/ckeditor/ckeditor5-utils/commit/ee9bed0)) +* Replaced `for..of` statement in `EventEmitter` with `Array.prototype.forEach`. This changes allows building a React application using `create-react-app@2`. Closes [ckeditor/ckeditor5-react#40](https://github.com/ckeditor/ckeditor5-react/issues/40). ([900b54b](https://github.com/ckeditor/ckeditor5-utils/commit/900b54b)) + +### BREAKING CHANGES + +* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c)) + + +## [11.1.0](https://github.com/ckeditor/ckeditor5-utils/compare/v11.0.0...v11.1.0) (December 5, 2018) + +### Features + +* Implemented `env#isGecko()`. See [ckeditor/ckeditor5-engine#1439](https://github.com/ckeditor/ckeditor5-engine/issues/1439). ([53b7c94](https://github.com/ckeditor/ckeditor5-utils/commit/53b7c94)) + +### Other changes + +* Various fixes in the API documentation. Thanks to [@denisname](https://github.com/denisname)! + + +## [11.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v10.2.1...v11.0.0) (October 8, 2018) + +### Other changes + +* Removed the `lodash` library from this package (a modular `lodash` build has been kept under `src/lib/lodash/`). We now recommend using `lodash-es` directly. Closes [#251](https://github.com/ckeditor/ckeditor5-utils/issues/251). ([637c9e3](https://github.com/ckeditor/ckeditor5-utils/commit/637c9e3)) + +### BREAKING CHANGES + +* Removed the `lodash` library from this package (a modular `lodash` build has been kept under `src/lib/lodash/`). We now recommend using `lodash-es` directly. + + +## [10.2.1](https://github.com/ckeditor/ckeditor5-utils/compare/v10.2.0...v10.2.1) (July 18, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [10.2.0](https://github.com/ckeditor/ckeditor5-utils/compare/v10.1.0...v10.2.0) (July 18, 2018) + +### Features + +* Implemented a module exposing the `CKEDIOR_VERSION` to the global scope. Closes [ckeditor/ckeditor5#1005](https://github.com/ckeditor/ckeditor5/issues/1005). ([3546ac4](https://github.com/ckeditor/ckeditor5-utils/commit/3546ac4)) +* Introduced `env.isEdge`. ([13d4af4](https://github.com/ckeditor/ckeditor5-utils/commit/13d4af4)) + +### Bug fixes + +* The `isWindow()` helper should work in the Electron environment. Closes [ckeditor/ckeditor5#879](https://github.com/ckeditor/ckeditor5/issues/879). ([d561151](https://github.com/ckeditor/ckeditor5-utils/commit/d561151)) + + +## [10.1.0](https://github.com/ckeditor/ckeditor5-utils/compare/v10.0.0...v10.1.0) (June 21, 2018) + +### Features + +* Introduced `set:{property}` event in `ObservableMixin`. Closes [#171](https://github.com/ckeditor/ckeditor5-utils/issues/171). ([6ef1246](https://github.com/ckeditor/ckeditor5-utils/commit/6ef1246)) +* Introduced `fastDiff()` function. Closes [#235](https://github.com/ckeditor/ckeditor5-utils/issues/235). ([81fefc9](https://github.com/ckeditor/ckeditor5-utils/commit/81fefc9)) + +### Bug fixes + +* Error should not be thrown when scrolling the viewport from within an iframe in a different domain. Closes [ckeditor/ckeditor5#930](https://github.com/ckeditor/ckeditor5/issues/930). ([ad4656e](https://github.com/ckeditor/ckeditor5-utils/commit/ad4656e)) + + +## [10.0.0](https://github.com/ckeditor/ckeditor5-utils/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018) + +### Other changes + +* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([3177252](https://github.com/ckeditor/ckeditor5-utils/commit/3177252)) + +### BREAKING CHANGES + +* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information. + + +## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-utils/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-utils/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018) + +Internal changes only (updated dependencies, documentation, etc.). + + +## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-utils/compare/v1.0.0-alpha.2...v1.0.0-beta.1) (March 15, 2018) + +### Features + +* Introduce `bind().toMany()` binding chain in `ObservableMixin`. Closes [#224](https://github.com/ckeditor/ckeditor5-utils/issues/224). ([cfa7d0e](https://github.com/ckeditor/ckeditor5-utils/commit/cfa7d0e)) +* Introduced skipping items when binding collections. Closes [#215](https://github.com/ckeditor/ckeditor5-utils/issues/215). Closes https://github.com/ckeditor/ckeditor5-ui/issues/92. ([6e0d063](https://github.com/ckeditor/ckeditor5-utils/commit/6e0d063)) + +### Bug fixes + +* `Rect.getDomRangeRects()` should not throw if the provided DOM range starts in a text node. Closes [ckeditor/ckeditor5-ui#317](https://github.com/ckeditor/ckeditor5-ui/issues/317). ([bfa55e9](https://github.com/ckeditor/ckeditor5-utils/commit/bfa55e9)) +* Bulletproofed `isDomNode()` helper when used in iframes. Removed `isWindow()` logic from the helper. Closes [#201](https://github.com/ckeditor/ckeditor5-utils/issues/201). ([84ccda2](https://github.com/ckeditor/ckeditor5-utils/commit/84ccda2)) +* Long keystrokes should be handled properly by getEnvKeystrokeText on Mac. Added support for ⇧ and ⌥ modifiers. Closes [#206](https://github.com/ckeditor/ckeditor5-utils/issues/206). ([d8443e2](https://github.com/ckeditor/ckeditor5-utils/commit/d8443e2)) + +### Other changes + +* `ObservableMixin#unbind()` should not throw if used for an attribute which is not bound. Closes [#5](https://github.com/ckeditor/ckeditor5-utils/issues/5). ([848a818](https://github.com/ckeditor/ckeditor5-utils/commit/848a818)) +* Aligned behaviors of `EmitterMixin` methods responsible for adding end removing listeners. Closes [#144](https://github.com/ckeditor/ckeditor5-utils/issues/144). ([460d7f4](https://github.com/ckeditor/ckeditor5-utils/commit/460d7f4)) + + The `emitter.on()` now has the same behavior as `emitter.listenTo( emitter )` as well as `emitter.off()` is the same as `emitter.stopListening( emitter )`. This made `emitter.stopListening()` correctly remove all listeners added in any way to it which prevents memory leaks. +* Aligned code to the new Translation Service ([ckeditor/ckeditor5#624](https://github.com/ckeditor/ckeditor5/issues/624)). ([a51767a](https://github.com/ckeditor/ckeditor5-utils/commit/a51767a)) +* Introduced the `isText()` helper. Closes [#214](https://github.com/ckeditor/ckeditor5-utils/issues/214). ([a9a6bec](https://github.com/ckeditor/ckeditor5-utils/commit/a9a6bec)) +* Renamed `env.mac` to `env.isMac`. Closes [#222](https://github.com/ckeditor/ckeditor5-utils/issues/222). ([dc6b226](https://github.com/ckeditor/ckeditor5-utils/commit/dc6b226)) +* Renamed `isDomNode()` to `isNode()`. Closes [#219](https://github.com/ckeditor/ckeditor5-utils/issues/219). ([1823196](https://github.com/ckeditor/ckeditor5-utils/commit/1823196)) + +### BREAKING CHANGES + +* Renamed `env.mac` to `env.isMac`. +* `isDomNode()` was renamed to `isNode()`. + + +## [1.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-utils/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (November 14, 2017) + +### Bug fixes + +* Removed a period at the end of an error message because some browsers included the period in links to errors. Closes [#193](https://github.com/ckeditor/ckeditor5-utils/issues/193). ([fdebc2f](https://github.com/ckeditor/ckeditor5-utils/commit/fdebc2f)) + + +## [1.0.0-alpha.1](https://github.com/ckeditor/ckeditor5-utils/compare/v0.10.0...v1.0.0-alpha.1) (October 3, 2017) + +### Features + +* Scrolling DOM utilities should support multi-window scenarios. Closes [#175](https://github.com/ckeditor/ckeditor5-utils/issues/175). ([a5c27ea](https://github.com/ckeditor/ckeditor5-utils/commit/a5c27ea)) + +### Other changes + +* `CKEditorError#message`, `log.error()` and `log.warn()` will contain a link to the error documentation. Closes [#185](https://github.com/ckeditor/ckeditor5-utils/issues/185). ([b7a00c9](https://github.com/ckeditor/ckeditor5-utils/commit/b7a00c9)) + + +## [0.10.0](https://github.com/ckeditor/ckeditor5-utils/compare/v0.9.1...v0.10.0) (September 3, 2017) + +### Bug fixes + +* `FocusTracker` should remain in sync when multiple `blur` events are followed by the `focus` event. Closes [#159](https://github.com/ckeditor/ckeditor5-utils/issues/159). ([0ff1b34](https://github.com/ckeditor/ckeditor5-utils/commit/0ff1b34)) + +### Features + +* `KeystrokeHandler` should support priorities and proper keystroke cancelling. Closes [#180](https://github.com/ckeditor/ckeditor5-utils/issues/180). ([14af24c](https://github.com/ckeditor/ckeditor5-utils/commit/14af24c)) +* Added support for `'space'` key code in the `parseKeystroke()` helper. Closes [#169](https://github.com/ckeditor/ckeditor5-utils/issues/169). ([f86b1ad](https://github.com/ckeditor/ckeditor5-utils/commit/f86b1ad)) +* Introduced `ObservableMixin#decorate()` and support for setting `EmitterMixin#fire()`'s return value by listeners. Closes [#162](https://github.com/ckeditor/ckeditor5-utils/issues/162). ([377c875](https://github.com/ckeditor/ckeditor5-utils/commit/377c875)) +* Introduced a static `Rect.getDomRangeRects()` method for external usage. Closes [#168](https://github.com/ckeditor/ckeditor5-utils/issues/168). ([f67aea1](https://github.com/ckeditor/ckeditor5-utils/commit/f67aea1)) + +### Other changes + +* The `getOptimalPosition()` utility should accept the target option defined as a function. Closes [#157](https://github.com/ckeditor/ckeditor5-utils/issues/157). ([d63abae](https://github.com/ckeditor/ckeditor5-utils/commit/d63abae)) + + +## [0.9.1](https://github.com/ckeditor/ckeditor5-utils/compare/v0.9.0...v0.9.1) (May 7, 2017) + +### Bug fixes + +* The `Rect` utility should work for collapsed DOM Ranges. Closes [#153](https://github.com/ckeditor/ckeditor5-utils/issues/153). ([92aff35](https://github.com/ckeditor/ckeditor5-utils/commit/92aff35)) +* The `getOptimalPosition()` utility should consider limiter ancestors with CSS overflow. Closes [#148](https://github.com/ckeditor/ckeditor5-utils/issues/148). ([6bf1741](https://github.com/ckeditor/ckeditor5-utils/commit/6bf1741)) + + +## [0.9.0](https://github.com/ckeditor/ckeditor5-utils/compare/v0.8.0...v0.9.0) (April 5, 2017) + +### Bug fixes + +* The `getOptimalPosition()` utility should work fine when the parent element has a scroll. Closes [#139](https://github.com/ckeditor/ckeditor5-utils/issues/139). ([b878949](https://github.com/ckeditor/ckeditor5-utils/commit/b878949)) + +### Features + +* `Collection.bindTo()` method now is not only available in the `ViewCollection` but in all `Collection`s. Closes [#125](https://github.com/ckeditor/ckeditor5-utils/issues/125). ([4e299be](https://github.com/ckeditor/ckeditor5-utils/commit/4e299be)) +* Added the `first()` function. Closes [#130](https://github.com/ckeditor/ckeditor5-utils/issues/130). ([8ab07d2](https://github.com/ckeditor/ckeditor5-utils/commit/8ab07d2)) +* Two–way data binding between `Collection` instances. Closes [#132](https://github.com/ckeditor/ckeditor5-utils/issues/132). ([6b79624](https://github.com/ckeditor/ckeditor5-utils/commit/6b79624)) + + +## [0.8.0](https://github.com/ckeditor/ckeditor5-utils/compare/v0.7.0...v0.8.0) (March 6, 2017) + +### Features + +* Added ability to provide default configurations to `Config` constructor. Closes [#126](https://github.com/ckeditor/ckeditor5/issues/126). ([16a2a31](https://github.com/ckeditor/ckeditor5-utils/commit/16a2a31)) diff --git a/node_modules/@ckeditor/ckeditor5-utils/LICENSE.md b/node_modules/@ckeditor/ckeditor5-utils/LICENSE.md new file mode 100644 index 0000000..53a17c0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/LICENSE.md @@ -0,0 +1,21 @@ +Software License Agreement +========================== + +**CKEditor 5 utilities** – https://github.com/ckeditor/ckeditor5-utils
    +Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved. + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission. + +The following libraries are included in CKEditor under the [MIT license](https://opensource.org/licenses/MIT): + +* Lodash - Copyright (c) JS Foundation and other contributors https://js.foundation/. Based on Underscore.js, copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors http://underscorejs.org/. + +Trademarks +---------- + +**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders. diff --git a/node_modules/@ckeditor/ckeditor5-utils/README.md b/node_modules/@ckeditor/ckeditor5-utils/README.md new file mode 100644 index 0000000..8441bee --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/README.md @@ -0,0 +1,16 @@ +CKEditor 5 utilities +======================================== + +[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-utils.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-utils) +[![Coverage Status](https://coveralls.io/repos/github/ckeditor/ckeditor5/badge.svg?branch=master)](https://coveralls.io/github/ckeditor/ckeditor5?branch=master) +[![Build Status](https://travis-ci.com/ckeditor/ckeditor5.svg?branch=master)](https://app.travis-ci.com/github/ckeditor/ckeditor5) + +Various utilities used by CKEditor 5 and its features. This is a sort of CKEditor 5's standard library. + +## Documentation + +See the [`@ckeditor/ckeditor5-utils` package](https://ckeditor.com/docs/ckeditor5/latest/api/utils.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/). + +## License + +Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license). diff --git a/node_modules/@ckeditor/ckeditor5-utils/package.json b/node_modules/@ckeditor/ckeditor5-utils/package.json new file mode 100644 index 0000000..e82c1c4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/package.json @@ -0,0 +1,35 @@ +{ + "name": "@ckeditor/ckeditor5-utils", + "version": "41.3.1", + "description": "Miscellaneous utilities used by CKEditor 5.", + "keywords": [ + "ckeditor", + "ckeditor5", + "ckeditor 5", + "ckeditor5-lib", + "ckeditor5-dll" + ], + "type": "module", + "main": "src/index.js", + "dependencies": { + "lodash-es": "4.17.21" + }, + "author": "CKSource (http://cksource.com/)", + "license": "GPL-2.0-or-later", + "homepage": "https://ckeditor.com/ckeditor-5", + "bugs": "https://github.com/ckeditor/ckeditor5/issues", + "repository": { + "type": "git", + "url": "https://github.com/ckeditor/ckeditor5.git", + "directory": "packages/ckeditor5-utils" + }, + "files": [ + "lang", + "src/**/*.js", + "src/**/*.d.ts", + "theme", + "ckeditor5-metadata.json", + "CHANGELOG.md" + ], + "types": "src/index.d.ts" +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.d.ts new file mode 100644 index 0000000..0794e1b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.d.ts @@ -0,0 +1,17 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/abortabledebounce + */ +/** + * Returns a function wrapper that will execute the provided function and abort any previous call that is still in progress. + * + * @param func The function to be called. It will be provided with `AbortSignal` as the first parameter. + */ +export default function abortableDebounce, Ret>(func: (signal: AbortSignal, ...args: Args) => Ret): AbortableFunc; +export interface AbortableFunc, Ret> { + (...args: Args): Ret; + abort(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.js b/node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.js new file mode 100644 index 0000000..254c014 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/abortabledebounce.js @@ -0,0 +1,22 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/abortabledebounce + */ +/** + * Returns a function wrapper that will execute the provided function and abort any previous call that is still in progress. + * + * @param func The function to be called. It will be provided with `AbortSignal` as the first parameter. + */ +export default function abortableDebounce(func) { + let controller = new AbortController(); + function abortable(...args) { + controller.abort(); + controller = new AbortController(); + return func(controller.signal, ...args); + } + abortable.abort = () => controller.abort(); + return abortable; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.d.ts new file mode 100644 index 0000000..3b5f4f7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/areconnectedthroughproperties + */ +/** + * Traverses both structures to find out whether there is a reference that is shared between both structures. + */ +export default function areConnectedThroughProperties(obj1: object, obj2: object): boolean; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.js b/node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.js new file mode 100644 index 0000000..6384180 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/areconnectedthroughproperties.js @@ -0,0 +1,73 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/areconnectedthroughproperties + */ +/* globals EventTarget, Event */ +/** + * Traverses both structures to find out whether there is a reference that is shared between both structures. + */ +export default function areConnectedThroughProperties(obj1, obj2) { + if (obj1 === obj2 && isObject(obj1)) { + return true; + } + const subNodes1 = getSubNodes(obj1); + const subNodes2 = getSubNodes(obj2); + for (const node of subNodes1) { + if (subNodes2.has(node)) { + return true; + } + } + return false; +} +/** + * Traverses JS structure and stores all sub-nodes, including the head node. + * It walks into each iterable structures with the `try catch` block to omit errors that might be thrown during + * tree walking. All primitives, functions and built-ins are skipped. + */ +function getSubNodes(head) { + const nodes = [head]; + // Nodes are stored to prevent infinite looping. + const subNodes = new Set(); + while (nodes.length > 0) { + const node = nodes.shift(); + if (subNodes.has(node) || shouldNodeBeSkipped(node)) { + continue; + } + subNodes.add(node); + // Handle arrays, maps, sets, custom collections that implements `[ Symbol.iterator ]()`, etc. + if (node[Symbol.iterator]) { + // The custom editor iterators might cause some problems if the editor is crashed. + try { + nodes.push(...node); + } + catch (err) { + // eslint-disable-line no-empty + } + } + else { + nodes.push(...Object.values(node)); + } + } + return subNodes; +} +function shouldNodeBeSkipped(node) { + const type = Object.prototype.toString.call(node); + return (type === '[object Number]' || + type === '[object Boolean]' || + type === '[object String]' || + type === '[object Symbol]' || + type === '[object Function]' || + type === '[object Date]' || + type === '[object RegExp]' || + node === undefined || + node === null || + // Skip native DOM objects, e.g. Window, nodes, events, etc. + node instanceof EventTarget || + node instanceof Event); +} +function isObject(structure) { + return typeof structure === 'object' && structure !== null; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.d.ts new file mode 100644 index 0000000..98c5384 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.d.ts @@ -0,0 +1,123 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/ckeditorerror + */ +/** + * URL to the documentation with error codes. + */ +export declare const DOCUMENTATION_URL = "https://ckeditor.com/docs/ckeditor5/latest/support/error-codes.html"; +/** + * The CKEditor error class. + * + * You should throw `CKEditorError` when: + * + * * An unexpected situation occurred and the editor (most probably) will not work properly. Such exception will be handled + * by the {@link module:watchdog/watchdog~Watchdog watchdog} (if it is integrated), + * * If the editor is incorrectly integrated or the editor API is used in the wrong way. This way you will give + * feedback to the developer as soon as possible. Keep in mind that for common integration issues which should not + * stop editor initialization (like missing upload adapter, wrong name of a toolbar component) we use + * {@link module:utils/ckeditorerror~logWarning `logWarning()`} and + * {@link module:utils/ckeditorerror~logError `logError()`} + * to improve developers experience and let them see the a working editor as soon as possible. + * + * ```ts + * /** + * * Error thrown when a plugin cannot be loaded due to JavaScript errors, lack of plugins with a given name, etc. + * * + * * @error plugin-load + * * @param pluginName The name of the plugin that could not be loaded. + * * @param moduleName The name of the module which tried to load this plugin. + * *\/ + * throw new CKEditorError( 'plugin-load', { + * pluginName: 'foo', + * moduleName: 'bar' + * } ); + * ``` + */ +export default class CKEditorError extends Error { + /** + * A context of the error by which the Watchdog is able to determine which editor crashed. + */ + readonly context: object | null | undefined; + /** + * The additional error data passed to the constructor. Undefined if none was passed. + */ + readonly data?: object; + /** + * Creates an instance of the CKEditorError class. + * + * @param errorName The error id in an `error-name` format. A link to this error documentation page will be added + * to the thrown error's `message`. + * @param context A context of the error by which the {@link module:watchdog/watchdog~Watchdog watchdog} + * is able to determine which editor crashed. It should be an editor instance or a property connected to it. It can be also + * a `null` value if the editor should not be restarted in case of the error (e.g. during the editor initialization). + * The error context should be checked using the `areConnectedThroughProperties( editor, context )` utility + * to check if the object works as the context. + * @param data Additional data describing the error. A stringified version of this object + * will be appended to the error message, so the data are quickly visible in the console. The original + * data object will also be later available under the {@link #data} property. + */ + constructor(errorName: string, context?: object | null, data?: object); + /** + * Checks if the error is of the `CKEditorError` type. + */ + is(type: string): boolean; + /** + * A utility that ensures that the thrown error is a {@link module:utils/ckeditorerror~CKEditorError} one. + * It is useful when combined with the {@link module:watchdog/watchdog~Watchdog} feature, which can restart the editor in case + * of a {@link module:utils/ckeditorerror~CKEditorError} error. + * + * @param err The error to rethrow. + * @param context An object connected through properties with the editor instance. This context will be used + * by the watchdog to verify which editor should be restarted. + */ + static rethrowUnexpectedError(err: Error, context: object): never; +} +/** + * Logs a warning to the console with a properly formatted message and adds a link to the documentation. + * Use whenever you want to log a warning to the console. + * + * ```ts + * /** + * * There was a problem processing the configuration of the toolbar. The item with the given + * * name does not exist, so it was omitted when rendering the toolbar. + * * + * * @error toolbarview-item-unavailable + * * @param {String} name The name of the component. + * *\/ + * logWarning( 'toolbarview-item-unavailable', { name } ); + * ``` + * + * See also {@link module:utils/ckeditorerror~CKEditorError} for an explanation when to throw an error and when to log + * a warning or an error to the console. + * + * @param errorName The error name to be logged. + * @param data Additional data to be logged. + */ +export declare function logWarning(errorName: string, data?: object): void; +/** + * Logs an error to the console with a properly formatted message and adds a link to the documentation. + * Use whenever you want to log an error to the console. + * + * ```ts + * /** + * * There was a problem processing the configuration of the toolbar. The item with the given + * * name does not exist, so it was omitted when rendering the toolbar. + * * + * * @error toolbarview-item-unavailable + * * @param {String} name The name of the component. + * *\/ + * logError( 'toolbarview-item-unavailable', { name } ); + * ``` + * + * **Note**: In most cases logging a warning using {@link module:utils/ckeditorerror~logWarning} is enough. + * + * See also {@link module:utils/ckeditorerror~CKEditorError} for an explanation when to use each method. + * + * @param errorName The error name to be logged. + * @param data Additional data to be logged. + */ +export declare function logError(errorName: string, data?: object): void; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.js b/node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.js new file mode 100644 index 0000000..9d3d91e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/ckeditorerror.js @@ -0,0 +1,176 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/ckeditorerror + */ +/* globals console */ +/** + * URL to the documentation with error codes. + */ +export const DOCUMENTATION_URL = 'https://ckeditor.com/docs/ckeditor5/latest/support/error-codes.html'; +/** + * The CKEditor error class. + * + * You should throw `CKEditorError` when: + * + * * An unexpected situation occurred and the editor (most probably) will not work properly. Such exception will be handled + * by the {@link module:watchdog/watchdog~Watchdog watchdog} (if it is integrated), + * * If the editor is incorrectly integrated or the editor API is used in the wrong way. This way you will give + * feedback to the developer as soon as possible. Keep in mind that for common integration issues which should not + * stop editor initialization (like missing upload adapter, wrong name of a toolbar component) we use + * {@link module:utils/ckeditorerror~logWarning `logWarning()`} and + * {@link module:utils/ckeditorerror~logError `logError()`} + * to improve developers experience and let them see the a working editor as soon as possible. + * + * ```ts + * /** + * * Error thrown when a plugin cannot be loaded due to JavaScript errors, lack of plugins with a given name, etc. + * * + * * @error plugin-load + * * @param pluginName The name of the plugin that could not be loaded. + * * @param moduleName The name of the module which tried to load this plugin. + * *\/ + * throw new CKEditorError( 'plugin-load', { + * pluginName: 'foo', + * moduleName: 'bar' + * } ); + * ``` + */ +export default class CKEditorError extends Error { + /** + * Creates an instance of the CKEditorError class. + * + * @param errorName The error id in an `error-name` format. A link to this error documentation page will be added + * to the thrown error's `message`. + * @param context A context of the error by which the {@link module:watchdog/watchdog~Watchdog watchdog} + * is able to determine which editor crashed. It should be an editor instance or a property connected to it. It can be also + * a `null` value if the editor should not be restarted in case of the error (e.g. during the editor initialization). + * The error context should be checked using the `areConnectedThroughProperties( editor, context )` utility + * to check if the object works as the context. + * @param data Additional data describing the error. A stringified version of this object + * will be appended to the error message, so the data are quickly visible in the console. The original + * data object will also be later available under the {@link #data} property. + */ + constructor(errorName, context, data) { + super(getErrorMessage(errorName, data)); + this.name = 'CKEditorError'; + this.context = context; + this.data = data; + } + /** + * Checks if the error is of the `CKEditorError` type. + */ + is(type) { + return type === 'CKEditorError'; + } + /** + * A utility that ensures that the thrown error is a {@link module:utils/ckeditorerror~CKEditorError} one. + * It is useful when combined with the {@link module:watchdog/watchdog~Watchdog} feature, which can restart the editor in case + * of a {@link module:utils/ckeditorerror~CKEditorError} error. + * + * @param err The error to rethrow. + * @param context An object connected through properties with the editor instance. This context will be used + * by the watchdog to verify which editor should be restarted. + */ + static rethrowUnexpectedError(err, context) { + if (err.is && err.is('CKEditorError')) { + throw err; + } + /** + * An unexpected error occurred inside the CKEditor 5 codebase. This error will look like the original one + * to make the debugging easier. + * + * This error is only useful when the editor is initialized using the {@link module:watchdog/watchdog~Watchdog} feature. + * In case of such error (or any {@link module:utils/ckeditorerror~CKEditorError} error) the watchdog should restart the editor. + * + * @error unexpected-error + */ + const error = new CKEditorError(err.message, context); + // Restore the original stack trace to make the error look like the original one. + // See https://github.com/ckeditor/ckeditor5/issues/5595 for more details. + error.stack = err.stack; + throw error; + } +} +/** + * Logs a warning to the console with a properly formatted message and adds a link to the documentation. + * Use whenever you want to log a warning to the console. + * + * ```ts + * /** + * * There was a problem processing the configuration of the toolbar. The item with the given + * * name does not exist, so it was omitted when rendering the toolbar. + * * + * * @error toolbarview-item-unavailable + * * @param {String} name The name of the component. + * *\/ + * logWarning( 'toolbarview-item-unavailable', { name } ); + * ``` + * + * See also {@link module:utils/ckeditorerror~CKEditorError} for an explanation when to throw an error and when to log + * a warning or an error to the console. + * + * @param errorName The error name to be logged. + * @param data Additional data to be logged. + */ +export function logWarning(errorName, data) { + console.warn(...formatConsoleArguments(errorName, data)); +} +/** + * Logs an error to the console with a properly formatted message and adds a link to the documentation. + * Use whenever you want to log an error to the console. + * + * ```ts + * /** + * * There was a problem processing the configuration of the toolbar. The item with the given + * * name does not exist, so it was omitted when rendering the toolbar. + * * + * * @error toolbarview-item-unavailable + * * @param {String} name The name of the component. + * *\/ + * logError( 'toolbarview-item-unavailable', { name } ); + * ``` + * + * **Note**: In most cases logging a warning using {@link module:utils/ckeditorerror~logWarning} is enough. + * + * See also {@link module:utils/ckeditorerror~CKEditorError} for an explanation when to use each method. + * + * @param errorName The error name to be logged. + * @param data Additional data to be logged. + */ +export function logError(errorName, data) { + console.error(...formatConsoleArguments(errorName, data)); +} +/** + * Returns formatted link to documentation message. + */ +function getLinkToDocumentationMessage(errorName) { + return `\nRead more: ${DOCUMENTATION_URL}#error-${errorName}`; +} +/** + * Returns formatted error message. + */ +function getErrorMessage(errorName, data) { + const processedObjects = new WeakSet(); + const circularReferencesReplacer = (key, value) => { + if (typeof value === 'object' && value !== null) { + if (processedObjects.has(value)) { + return `[object ${value.constructor.name}]`; + } + processedObjects.add(value); + } + return value; + }; + const stringifiedData = data ? ` ${JSON.stringify(data, circularReferencesReplacer)}` : ''; + const documentationLink = getLinkToDocumentationMessage(errorName); + return errorName + stringifiedData + documentationLink; +} +/** + * Returns formatted console error arguments. + */ +function formatConsoleArguments(errorName, data) { + const documentationMessage = getLinkToDocumentationMessage(errorName); + return data ? [errorName, data, documentationMessage] : [errorName, documentationMessage]; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/collection.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/collection.d.ts new file mode 100644 index 0000000..7081741 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/collection.d.ts @@ -0,0 +1,433 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +declare const Collection_base: { + new (): import("./emittermixin.js").Emitter; + prototype: import("./emittermixin.js").Emitter; +}; +/** + * Collections are ordered sets of objects. Items in the collection can be retrieved by their indexes + * in the collection (like in an array) or by their ids. + * + * If an object without an `id` property is being added to the collection, the `id` property will be generated + * automatically. Note that the automatically generated id is unique only within this single collection instance. + * + * By default an item in the collection is identified by its `id` property. The name of the identifier can be + * configured through the constructor of the collection. + * + * @typeParam T The type of the collection element. + */ +export default class Collection> extends Collection_base implements Iterable { + /** + * The internal list of items in the collection. + */ + private readonly _items; + /** + * The internal map of items in the collection. + */ + private readonly _itemMap; + /** + * The name of the property which is considered to identify an item. + */ + private readonly _idProperty; + /** + * A collection instance this collection is bound to as a result + * of calling {@link #bindTo} method. + */ + private _bindToCollection?; + /** + * A helper mapping external items of a bound collection ({@link #bindTo}) + * and actual items of this collection. It provides information + * necessary to properly remove items bound to another collection. + * + * See {@link #_bindToInternalToExternalMap}. + */ + private readonly _bindToExternalToInternalMap; + /** + * A helper mapping items of this collection to external items of a bound collection + * ({@link #bindTo}). It provides information necessary to manage the bindings, e.g. + * to avoid loops in two–way bindings. + * + * See {@link #_bindToExternalToInternalMap}. + */ + private readonly _bindToInternalToExternalMap; + /** + * Stores indexes of skipped items from bound external collection. + */ + private _skippedIndexesFromExternal; + /** + * Creates a new Collection instance. + * + * You can pass a configuration object as the argument of the constructor: + * + * ```ts + * const emptyCollection = new Collection<{ name: string }>( { idProperty: 'name' } ); + * emptyCollection.add( { name: 'John' } ); + * console.log( collection.get( 'John' ) ); // -> { name: 'John' } + * ``` + * + * The collection is empty by default. You can add new items using the {@link #add} method: + * + * ```ts + * const collection = new Collection<{ id: string }>(); + * + * collection.add( { id: 'John' } ); + * console.log( collection.get( 0 ) ); // -> { id: 'John' } + * ``` + * + * @label NO_ITEMS + * @param options The options object. + * @param options.idProperty The name of the property which is used to identify an item. + * Items that do not have such a property will be assigned one when added to the collection. + */ + constructor(options?: { + readonly idProperty?: string; + }); + /** + * Creates a new Collection instance with specified initial items. + * + * ```ts + * const collection = new Collection<{ id: string }>( [ { id: 'John' }, { id: 'Mike' } ] ); + * + * console.log( collection.get( 0 ) ); // -> { id: 'John' } + * console.log( collection.get( 1 ) ); // -> { id: 'Mike' } + * console.log( collection.get( 'Mike' ) ); // -> { id: 'Mike' } + * ``` + * + * You can always pass a configuration object as the last argument of the constructor: + * + * ```ts + * const nonEmptyCollection = new Collection<{ name: string }>( [ { name: 'John' } ], { idProperty: 'name' } ); + * nonEmptyCollection.add( { name: 'George' } ); + * console.log( collection.get( 'George' ) ); // -> { name: 'George' } + * console.log( collection.get( 'John' ) ); // -> { name: 'John' } + * ``` + * + * @label INITIAL_ITEMS + * @param initialItems The initial items of the collection. + * @param options The options object. + * @param options.idProperty The name of the property which is used to identify an item. + * Items that do not have such a property will be assigned one when added to the collection. + */ + constructor(initialItems: Iterable, options?: { + readonly idProperty?: string; + }); + /** + * The number of items available in the collection. + */ + get length(): number; + /** + * Returns the first item from the collection or null when collection is empty. + */ + get first(): T | null; + /** + * Returns the last item from the collection or null when collection is empty. + */ + get last(): T | null; + /** + * Adds an item into the collection. + * + * If the item does not have an id, then it will be automatically generated and set on the item. + * + * @param item + * @param index The position of the item in the collection. The item + * is pushed to the collection when `index` not specified. + * @fires add + * @fires change + */ + add(item: T, index?: number): this; + /** + * Adds multiple items into the collection. + * + * Any item not containing an id will get an automatically generated one. + * + * @param items + * @param index The position of the insertion. Items will be appended if no `index` is specified. + * @fires add + * @fires change + */ + addMany(items: Iterable, index?: number): this; + /** + * Gets an item by its ID or index. + * + * @param idOrIndex The item ID or index in the collection. + * @returns The requested item or `null` if such item does not exist. + */ + get(idOrIndex: string | number): T | null; + /** + * Returns a Boolean indicating whether the collection contains an item. + * + * @param itemOrId The item or its ID in the collection. + * @returns `true` if the collection contains the item, `false` otherwise. + */ + has(itemOrId: T | string): boolean; + /** + * Gets an index of an item in the collection. + * When an item is not defined in the collection, the index will equal -1. + * + * @param itemOrId The item or its ID in the collection. + * @returns The index of a given item. + */ + getIndex(itemOrId: T | string): number; + /** + * Removes an item from the collection. + * + * @param subject The item to remove, its ID or index in the collection. + * @returns The removed item. + * @fires remove + * @fires change + */ + remove(subject: T | number | string): T; + /** + * Executes the callback for each item in the collection and composes an array or values returned by this callback. + * + * @typeParam U The result type of the callback. + * @param callback + * @param ctx Context in which the `callback` will be called. + * @returns The result of mapping. + */ + map(callback: (item: T, index: number) => U, ctx?: any): Array; + /** + * Performs the specified action for each item in the collection. + * + * @param ctx Context in which the `callback` will be called. + */ + forEach(callback: (item: T, index: number) => unknown, ctx?: any): void; + /** + * Finds the first item in the collection for which the `callback` returns a true value. + * + * @param callback + * @param ctx Context in which the `callback` will be called. + * @returns The item for which `callback` returned a true value. + */ + find(callback: (item: T, index: number) => boolean, ctx?: any): T | undefined; + /** + * Returns an array with items for which the `callback` returned a true value. + * + * @param callback + * @param ctx Context in which the `callback` will be called. + * @returns The array with matching items. + */ + filter(callback: (item: T, index: number) => boolean, ctx?: any): Array; + /** + * Removes all items from the collection and destroys the binding created using + * {@link #bindTo}. + * + * @fires remove + * @fires change + */ + clear(): void; + /** + * Binds and synchronizes the collection with another one. + * + * The binding can be a simple factory: + * + * ```ts + * class FactoryClass { + * public label: string; + * + * constructor( data: { label: string } ) { + * this.label = data.label; + * } + * } + * + * const source = new Collection<{ label: string }>( { idProperty: 'label' } ); + * const target = new Collection(); + * + * target.bindTo( source ).as( FactoryClass ); + * + * source.add( { label: 'foo' } ); + * source.add( { label: 'bar' } ); + * + * console.log( target.length ); // 2 + * console.log( target.get( 1 ).label ); // 'bar' + * + * source.remove( 0 ); + * console.log( target.length ); // 1 + * console.log( target.get( 0 ).label ); // 'bar' + * ``` + * + * or the factory driven by a custom callback: + * + * ```ts + * class FooClass { + * public label: string; + * + * constructor( data: { label: string } ) { + * this.label = data.label; + * } + * } + * + * class BarClass { + * public label: string; + * + * constructor( data: { label: string } ) { + * this.label = data.label; + * } + * } + * + * const source = new Collection<{ label: string }>( { idProperty: 'label' } ); + * const target = new Collection(); + * + * target.bindTo( source ).using( ( item ) => { + * if ( item.label == 'foo' ) { + * return new FooClass( item ); + * } else { + * return new BarClass( item ); + * } + * } ); + * + * source.add( { label: 'foo' } ); + * source.add( { label: 'bar' } ); + * + * console.log( target.length ); // 2 + * console.log( target.get( 0 ) instanceof FooClass ); // true + * console.log( target.get( 1 ) instanceof BarClass ); // true + * ``` + * + * or the factory out of property name: + * + * ```ts + * const source = new Collection<{ nested: { value: string } }>(); + * const target = new Collection<{ value: string }>(); + * + * target.bindTo( source ).using( 'nested' ); + * + * source.add( { nested: { value: 'foo' } } ); + * source.add( { nested: { value: 'bar' } } ); + * + * console.log( target.length ); // 2 + * console.log( target.get( 0 ).value ); // 'foo' + * console.log( target.get( 1 ).value ); // 'bar' + * ``` + * + * It's possible to skip specified items by returning null value: + * + * ```ts + * const source = new Collection<{ hidden: boolean }>(); + * const target = new Collection<{ hidden: boolean }>(); + * + * target.bindTo( source ).using( item => { + * if ( item.hidden ) { + * return null; + * } + * + * return item; + * } ); + * + * source.add( { hidden: true } ); + * source.add( { hidden: false } ); + * + * console.log( source.length ); // 2 + * console.log( target.length ); // 1 + * ``` + * + * **Note**: {@link #clear} can be used to break the binding. + * + * @typeParam S The type of `externalCollection` element. + * @param externalCollection A collection to be bound. + * @returns The binding chain object. + */ + bindTo>(externalCollection: Collection): CollectionBindToChain; + /** + * Finalizes and activates a binding initiated by {@link #bindTo}. + * + * @param factory A function which produces collection items. + */ + private _setUpBindToBinding; + /** + * Returns an unique id property for a given `item`. + * + * The method will generate new id and assign it to the `item` if it doesn't have any. + * + * @param item Item to be added. + */ + private _getItemIdBeforeAdding; + /** + * Core {@link #remove} method implementation shared in other functions. + * + * In contrast this method **does not** fire the {@link #event:change} event. + * + * @param subject The item to remove, its id or index in the collection. + * @returns Returns an array with the removed item and its index. + * @fires remove + */ + private _remove; + /** + * Iterable interface. + */ + [Symbol.iterator](): Iterator; +} +/** + * Fired when an item is added to the collection. + * + * @eventName ~Collection#add + * @param item The added item. + * @param index An index where the addition occurred. + */ +export type CollectionAddEvent = { + name: 'add'; + args: [item: T, index: number]; +}; +/** + * Fired when the collection was changed due to adding or removing items. + * + * @eventName ~Collection#change + * @param data Changed items. + */ +export type CollectionChangeEvent = { + name: 'change'; + args: [data: CollectionChangeEventData]; +}; +/** + * A structure describing the {@link ~Collection#event:change `Collection#change`} event. + */ +export type CollectionChangeEventData = { + /** + * A list of added items. + */ + added: Iterable; + /** + * A list of removed items. + */ + removed: Iterable; + /** + * An index where the addition or removal occurred. + */ + index: number; +}; +/** + * Fired when an item is removed from the collection. + * + * @eventName ~Collection#remove + * @param item The removed item. + * @param index Index from which item was removed. + */ +export type CollectionRemoveEvent = { + name: 'remove'; + args: [item: T, index: number]; +}; +/** + * An object returned by the {@link module:utils/collection~Collection#bindTo `bindTo()`} method + * providing functions that specify the type of the binding. + * + * See the {@link module:utils/collection~Collection#bindTo `bindTo()`} documentation for examples. + */ +export interface CollectionBindToChain { + /** + * Creates the class factory binding in which items of the source collection are passed to + * the constructor of the specified class. + * + * @param Class The class constructor used to create instances in the factory. + */ + as(Class: new (item: S) => T): void; + /** + * Creates a callback or a property binding. + * + * @param callbackOrProperty When the function is passed, it should return + * the collection items. When the string is provided, the property value is used to create the bound collection items. + */ + using(callbackOrProperty: keyof S | ((item: S) => T | null)): void; +} +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/collection.js b/node_modules/@ckeditor/ckeditor5-utils/src/collection.js new file mode 100644 index 0000000..c59ef58 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/collection.js @@ -0,0 +1,583 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/collection + */ +import EmitterMixin from './emittermixin.js'; +import CKEditorError from './ckeditorerror.js'; +import uid from './uid.js'; +import isIterable from './isiterable.js'; +/** + * Collections are ordered sets of objects. Items in the collection can be retrieved by their indexes + * in the collection (like in an array) or by their ids. + * + * If an object without an `id` property is being added to the collection, the `id` property will be generated + * automatically. Note that the automatically generated id is unique only within this single collection instance. + * + * By default an item in the collection is identified by its `id` property. The name of the identifier can be + * configured through the constructor of the collection. + * + * @typeParam T The type of the collection element. + */ +export default class Collection extends EmitterMixin() { + constructor(initialItemsOrOptions = {}, options = {}) { + super(); + const hasInitialItems = isIterable(initialItemsOrOptions); + if (!hasInitialItems) { + options = initialItemsOrOptions; + } + this._items = []; + this._itemMap = new Map(); + this._idProperty = options.idProperty || 'id'; + this._bindToExternalToInternalMap = new WeakMap(); + this._bindToInternalToExternalMap = new WeakMap(); + this._skippedIndexesFromExternal = []; + // Set the initial content of the collection (if provided in the constructor). + if (hasInitialItems) { + for (const item of initialItemsOrOptions) { + this._items.push(item); + this._itemMap.set(this._getItemIdBeforeAdding(item), item); + } + } + } + /** + * The number of items available in the collection. + */ + get length() { + return this._items.length; + } + /** + * Returns the first item from the collection or null when collection is empty. + */ + get first() { + return this._items[0] || null; + } + /** + * Returns the last item from the collection or null when collection is empty. + */ + get last() { + return this._items[this.length - 1] || null; + } + /** + * Adds an item into the collection. + * + * If the item does not have an id, then it will be automatically generated and set on the item. + * + * @param item + * @param index The position of the item in the collection. The item + * is pushed to the collection when `index` not specified. + * @fires add + * @fires change + */ + add(item, index) { + return this.addMany([item], index); + } + /** + * Adds multiple items into the collection. + * + * Any item not containing an id will get an automatically generated one. + * + * @param items + * @param index The position of the insertion. Items will be appended if no `index` is specified. + * @fires add + * @fires change + */ + addMany(items, index) { + if (index === undefined) { + index = this._items.length; + } + else if (index > this._items.length || index < 0) { + /** + * The `index` passed to {@link module:utils/collection~Collection#addMany `Collection#addMany()`} + * is invalid. It must be a number between 0 and the collection's length. + * + * @error collection-add-item-invalid-index + */ + throw new CKEditorError('collection-add-item-invalid-index', this); + } + let offset = 0; + for (const item of items) { + const itemId = this._getItemIdBeforeAdding(item); + const currentItemIndex = index + offset; + this._items.splice(currentItemIndex, 0, item); + this._itemMap.set(itemId, item); + this.fire('add', item, currentItemIndex); + offset++; + } + this.fire('change', { + added: items, + removed: [], + index + }); + return this; + } + /** + * Gets an item by its ID or index. + * + * @param idOrIndex The item ID or index in the collection. + * @returns The requested item or `null` if such item does not exist. + */ + get(idOrIndex) { + let item; + if (typeof idOrIndex == 'string') { + item = this._itemMap.get(idOrIndex); + } + else if (typeof idOrIndex == 'number') { + item = this._items[idOrIndex]; + } + else { + /** + * An index or ID must be given. + * + * @error collection-get-invalid-arg + */ + throw new CKEditorError('collection-get-invalid-arg', this); + } + return item || null; + } + /** + * Returns a Boolean indicating whether the collection contains an item. + * + * @param itemOrId The item or its ID in the collection. + * @returns `true` if the collection contains the item, `false` otherwise. + */ + has(itemOrId) { + if (typeof itemOrId == 'string') { + return this._itemMap.has(itemOrId); + } + else { // Object + const idProperty = this._idProperty; + const id = itemOrId[idProperty]; + return id && this._itemMap.has(id); + } + } + /** + * Gets an index of an item in the collection. + * When an item is not defined in the collection, the index will equal -1. + * + * @param itemOrId The item or its ID in the collection. + * @returns The index of a given item. + */ + getIndex(itemOrId) { + let item; + if (typeof itemOrId == 'string') { + item = this._itemMap.get(itemOrId); + } + else { + item = itemOrId; + } + return item ? this._items.indexOf(item) : -1; + } + /** + * Removes an item from the collection. + * + * @param subject The item to remove, its ID or index in the collection. + * @returns The removed item. + * @fires remove + * @fires change + */ + remove(subject) { + const [item, index] = this._remove(subject); + this.fire('change', { + added: [], + removed: [item], + index + }); + return item; + } + /** + * Executes the callback for each item in the collection and composes an array or values returned by this callback. + * + * @typeParam U The result type of the callback. + * @param callback + * @param ctx Context in which the `callback` will be called. + * @returns The result of mapping. + */ + map(callback, ctx) { + return this._items.map(callback, ctx); + } + /** + * Performs the specified action for each item in the collection. + * + * @param ctx Context in which the `callback` will be called. + */ + forEach(callback, ctx) { + this._items.forEach(callback, ctx); + } + /** + * Finds the first item in the collection for which the `callback` returns a true value. + * + * @param callback + * @param ctx Context in which the `callback` will be called. + * @returns The item for which `callback` returned a true value. + */ + find(callback, ctx) { + return this._items.find(callback, ctx); + } + /** + * Returns an array with items for which the `callback` returned a true value. + * + * @param callback + * @param ctx Context in which the `callback` will be called. + * @returns The array with matching items. + */ + filter(callback, ctx) { + return this._items.filter(callback, ctx); + } + /** + * Removes all items from the collection and destroys the binding created using + * {@link #bindTo}. + * + * @fires remove + * @fires change + */ + clear() { + if (this._bindToCollection) { + this.stopListening(this._bindToCollection); + this._bindToCollection = null; + } + const removedItems = Array.from(this._items); + while (this.length) { + this._remove(0); + } + this.fire('change', { + added: [], + removed: removedItems, + index: 0 + }); + } + /** + * Binds and synchronizes the collection with another one. + * + * The binding can be a simple factory: + * + * ```ts + * class FactoryClass { + * public label: string; + * + * constructor( data: { label: string } ) { + * this.label = data.label; + * } + * } + * + * const source = new Collection<{ label: string }>( { idProperty: 'label' } ); + * const target = new Collection(); + * + * target.bindTo( source ).as( FactoryClass ); + * + * source.add( { label: 'foo' } ); + * source.add( { label: 'bar' } ); + * + * console.log( target.length ); // 2 + * console.log( target.get( 1 ).label ); // 'bar' + * + * source.remove( 0 ); + * console.log( target.length ); // 1 + * console.log( target.get( 0 ).label ); // 'bar' + * ``` + * + * or the factory driven by a custom callback: + * + * ```ts + * class FooClass { + * public label: string; + * + * constructor( data: { label: string } ) { + * this.label = data.label; + * } + * } + * + * class BarClass { + * public label: string; + * + * constructor( data: { label: string } ) { + * this.label = data.label; + * } + * } + * + * const source = new Collection<{ label: string }>( { idProperty: 'label' } ); + * const target = new Collection(); + * + * target.bindTo( source ).using( ( item ) => { + * if ( item.label == 'foo' ) { + * return new FooClass( item ); + * } else { + * return new BarClass( item ); + * } + * } ); + * + * source.add( { label: 'foo' } ); + * source.add( { label: 'bar' } ); + * + * console.log( target.length ); // 2 + * console.log( target.get( 0 ) instanceof FooClass ); // true + * console.log( target.get( 1 ) instanceof BarClass ); // true + * ``` + * + * or the factory out of property name: + * + * ```ts + * const source = new Collection<{ nested: { value: string } }>(); + * const target = new Collection<{ value: string }>(); + * + * target.bindTo( source ).using( 'nested' ); + * + * source.add( { nested: { value: 'foo' } } ); + * source.add( { nested: { value: 'bar' } } ); + * + * console.log( target.length ); // 2 + * console.log( target.get( 0 ).value ); // 'foo' + * console.log( target.get( 1 ).value ); // 'bar' + * ``` + * + * It's possible to skip specified items by returning null value: + * + * ```ts + * const source = new Collection<{ hidden: boolean }>(); + * const target = new Collection<{ hidden: boolean }>(); + * + * target.bindTo( source ).using( item => { + * if ( item.hidden ) { + * return null; + * } + * + * return item; + * } ); + * + * source.add( { hidden: true } ); + * source.add( { hidden: false } ); + * + * console.log( source.length ); // 2 + * console.log( target.length ); // 1 + * ``` + * + * **Note**: {@link #clear} can be used to break the binding. + * + * @typeParam S The type of `externalCollection` element. + * @param externalCollection A collection to be bound. + * @returns The binding chain object. + */ + bindTo(externalCollection) { + if (this._bindToCollection) { + /** + * The collection cannot be bound more than once. + * + * @error collection-bind-to-rebind + */ + throw new CKEditorError('collection-bind-to-rebind', this); + } + this._bindToCollection = externalCollection; + return { + as: Class => { + this._setUpBindToBinding(item => new Class(item)); + }, + using: callbackOrProperty => { + if (typeof callbackOrProperty == 'function') { + this._setUpBindToBinding(callbackOrProperty); + } + else { + this._setUpBindToBinding(item => item[callbackOrProperty]); + } + } + }; + } + /** + * Finalizes and activates a binding initiated by {@link #bindTo}. + * + * @param factory A function which produces collection items. + */ + _setUpBindToBinding(factory) { + const externalCollection = this._bindToCollection; + // Adds the item to the collection once a change has been done to the external collection. + const addItem = (evt, externalItem, index) => { + const isExternalBoundToThis = externalCollection._bindToCollection == this; + const externalItemBound = externalCollection._bindToInternalToExternalMap.get(externalItem); + // If an external collection is bound to this collection, which makes it a 2–way binding, + // and the particular external collection item is already bound, don't add it here. + // The external item has been created **out of this collection's item** and (re)adding it will + // cause a loop. + if (isExternalBoundToThis && externalItemBound) { + this._bindToExternalToInternalMap.set(externalItem, externalItemBound); + this._bindToInternalToExternalMap.set(externalItemBound, externalItem); + } + else { + const item = factory(externalItem); + // When there is no item we need to remember skipped index first and then we can skip this item. + if (!item) { + this._skippedIndexesFromExternal.push(index); + return; + } + // Lets try to put item at the same index as index in external collection + // but when there are a skipped items in one or both collections we need to recalculate this index. + let finalIndex = index; + // When we try to insert item after some skipped items from external collection we need + // to include this skipped items and decrease index. + // + // For the following example: + // external -> [ 'A', 'B - skipped for internal', 'C - skipped for internal' ] + // internal -> [ A ] + // + // Another item is been added at the end of external collection: + // external.add( 'D' ) + // external -> [ 'A', 'B - skipped for internal', 'C - skipped for internal', 'D' ] + // + // We can't just add 'D' to internal at the same index as index in external because + // this will produce empty indexes what is invalid: + // internal -> [ 'A', empty, empty, 'D' ] + // + // So we need to include skipped items and decrease index + // internal -> [ 'A', 'D' ] + for (const skipped of this._skippedIndexesFromExternal) { + if (index > skipped) { + finalIndex--; + } + } + // We need to take into consideration that external collection could skip some items from + // internal collection. + // + // For the following example: + // internal -> [ 'A', 'B - skipped for external', 'C - skipped for external' ] + // external -> [ A ] + // + // Another item is been added at the end of external collection: + // external.add( 'D' ) + // external -> [ 'A', 'D' ] + // + // We need to include skipped items and place new item after them: + // internal -> [ 'A', 'B - skipped for external', 'C - skipped for external', 'D' ] + for (const skipped of externalCollection._skippedIndexesFromExternal) { + if (finalIndex >= skipped) { + finalIndex++; + } + } + this._bindToExternalToInternalMap.set(externalItem, item); + this._bindToInternalToExternalMap.set(item, externalItem); + this.add(item, finalIndex); + // After adding new element to internal collection we need update indexes + // of skipped items in external collection. + for (let i = 0; i < externalCollection._skippedIndexesFromExternal.length; i++) { + if (finalIndex <= externalCollection._skippedIndexesFromExternal[i]) { + externalCollection._skippedIndexesFromExternal[i]++; + } + } + } + }; + // Load the initial content of the collection. + for (const externalItem of externalCollection) { + addItem(null, externalItem, externalCollection.getIndex(externalItem)); + } + // Synchronize the with collection as new items are added. + this.listenTo(externalCollection, 'add', addItem); + // Synchronize the with collection as new items are removed. + this.listenTo(externalCollection, 'remove', (evt, externalItem, index) => { + const item = this._bindToExternalToInternalMap.get(externalItem); + if (item) { + this.remove(item); + } + // After removing element from external collection we need update/remove indexes + // of skipped items in internal collection. + this._skippedIndexesFromExternal = this._skippedIndexesFromExternal.reduce((result, skipped) => { + if (index < skipped) { + result.push(skipped - 1); + } + if (index > skipped) { + result.push(skipped); + } + return result; + }, []); + }); + } + /** + * Returns an unique id property for a given `item`. + * + * The method will generate new id and assign it to the `item` if it doesn't have any. + * + * @param item Item to be added. + */ + _getItemIdBeforeAdding(item) { + const idProperty = this._idProperty; + let itemId; + if ((idProperty in item)) { + itemId = item[idProperty]; + if (typeof itemId != 'string') { + /** + * This item's ID should be a string. + * + * @error collection-add-invalid-id + */ + throw new CKEditorError('collection-add-invalid-id', this); + } + if (this.get(itemId)) { + /** + * This item already exists in the collection. + * + * @error collection-add-item-already-exists + */ + throw new CKEditorError('collection-add-item-already-exists', this); + } + } + else { + item[idProperty] = itemId = uid(); + } + return itemId; + } + /** + * Core {@link #remove} method implementation shared in other functions. + * + * In contrast this method **does not** fire the {@link #event:change} event. + * + * @param subject The item to remove, its id or index in the collection. + * @returns Returns an array with the removed item and its index. + * @fires remove + */ + _remove(subject) { + let index, id, item; + let itemDoesNotExist = false; + const idProperty = this._idProperty; + if (typeof subject == 'string') { + id = subject; + item = this._itemMap.get(id); + itemDoesNotExist = !item; + if (item) { + index = this._items.indexOf(item); + } + } + else if (typeof subject == 'number') { + index = subject; + item = this._items[index]; + itemDoesNotExist = !item; + if (item) { + id = item[idProperty]; + } + } + else { + item = subject; + id = item[idProperty]; + index = this._items.indexOf(item); + itemDoesNotExist = (index == -1 || !this._itemMap.get(id)); + } + if (itemDoesNotExist) { + /** + * Item not found. + * + * @error collection-remove-404 + */ + throw new CKEditorError('collection-remove-404', this); + } + this._items.splice(index, 1); + this._itemMap.delete(id); + const externalItem = this._bindToInternalToExternalMap.get(item); + this._bindToInternalToExternalMap.delete(item); + this._bindToExternalToInternalMap.delete(externalItem); + this.fire('remove', item, index); + return [item, index]; + } + /** + * Iterable interface. + */ + [Symbol.iterator]() { + return this._items[Symbol.iterator](); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.d.ts new file mode 100644 index 0000000..141e70c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.d.ts @@ -0,0 +1,30 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/comparearrays + */ +/** + * Compares how given arrays relate to each other. One array can be: same as another array, prefix of another array + * or completely different. If arrays are different, first index at which they differ is returned. Otherwise, + * a flag specifying the relation is returned. Flags are negative numbers, so whenever a number >= 0 is returned + * it means that arrays differ. + * + * ```ts + * compareArrays( [ 0, 2 ], [ 0, 2 ] ); // 'same' + * compareArrays( [ 0, 2 ], [ 0, 2, 1 ] ); // 'prefix' + * compareArrays( [ 0, 2 ], [ 0 ] ); // 'extension' + * compareArrays( [ 0, 2 ], [ 1, 2 ] ); // 0 + * compareArrays( [ 0, 2 ], [ 0, 1 ] ); // 1 + * ``` + * + * @param a Array that is compared. + * @param b Array to compare with. + * @returns How array `a` is related to `b`. + */ +export default function compareArrays(a: ReadonlyArray, b: ReadonlyArray): ArrayRelation | number; +/** + * Array relation. + */ +export type ArrayRelation = 'extension' | 'same' | 'prefix'; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.js b/node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.js new file mode 100644 index 0000000..03e75c7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/comparearrays.js @@ -0,0 +1,47 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/comparearrays + */ +/** + * Compares how given arrays relate to each other. One array can be: same as another array, prefix of another array + * or completely different. If arrays are different, first index at which they differ is returned. Otherwise, + * a flag specifying the relation is returned. Flags are negative numbers, so whenever a number >= 0 is returned + * it means that arrays differ. + * + * ```ts + * compareArrays( [ 0, 2 ], [ 0, 2 ] ); // 'same' + * compareArrays( [ 0, 2 ], [ 0, 2, 1 ] ); // 'prefix' + * compareArrays( [ 0, 2 ], [ 0 ] ); // 'extension' + * compareArrays( [ 0, 2 ], [ 1, 2 ] ); // 0 + * compareArrays( [ 0, 2 ], [ 0, 1 ] ); // 1 + * ``` + * + * @param a Array that is compared. + * @param b Array to compare with. + * @returns How array `a` is related to `b`. + */ +export default function compareArrays(a, b) { + const minLen = Math.min(a.length, b.length); + for (let i = 0; i < minLen; i++) { + if (a[i] != b[i]) { + // The arrays are different. + return i; + } + } + // Both arrays were same at all points. + if (a.length == b.length) { + // If their length is also same, they are the same. + return 'same'; + } + else if (a.length < b.length) { + // Compared array is shorter so it is a prefix of the other array. + return 'prefix'; + } + else { + // Compared array is longer so it is an extension of the other array. + return 'extension'; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/config.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/config.d.ts new file mode 100644 index 0000000..f05b83e --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/config.d.ts @@ -0,0 +1,163 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Handles a configuration dictionary. + * + * @typeParam Cfg A type of the configuration dictionary. + */ +export default class Config { + /** + * Store for the whole configuration. + */ + private readonly _config; + /** + * Creates an instance of the {@link ~Config} class. + * + * @param configurations The initial configurations to be set. Usually, provided by the user. + * @param defaultConfigurations The default configurations. Usually, provided by the system. + */ + constructor(configurations?: Partial, defaultConfigurations?: Partial); + /** + * Set configuration values. + * + * It also accepts setting a "deep configuration" by using dots in the name. For example, `'resize.width'` sets + * the value for the `width` configuration in the `resize` subset. + * + * ```ts + * config.set( 'resize.width', 500 ); + * ``` + * + * It accepts both a name/value pair or an object, which properties and values will be used to set + * configurations. See {@link #set:CONFIG_OBJECT}. + * + * @label KEY_VALUE + * @param name The configuration name. Configuration names are case-sensitive. + * @param value The configuration value. + */ + set(name: K, value: GetSubConfig): void; + /** + * Set configuration values. + * + * It accepts an object, which properties and values will be used to set configurations. + * + * ```ts + * config.set( { + * width: 500 + * toolbar: { + * collapsed: true + * } + * } ); + * + * // Equivalent to: + * config.set( 'width', 500 ); + * config.set( 'toolbar.collapsed', true ); + * ``` + * + * Passing an object as the value will amend the configuration, not replace it. + * + * ```ts + * config.set( 'toolbar', { + * collapsed: true, + * } ); + * + * config.set( 'toolbar', { + * color: 'red', + * } ); + * + * config.get( 'toolbar.collapsed' ); // true + * config.get( 'toolbar.color' ); // 'red' + * ``` + * + * It accepts both a name/value pair or an object, which properties and values will be used to set + * configurations. See {@link #set:KEY_VALUE}. + * + * @label CONFIG_OBJECT + * @param config The configuration object from which take properties as + * configuration entries. Configuration names are case-sensitive. + */ + set(config: Partial): void; + /** + * Does exactly the same as {@link #set:KEY_VALUE} with one exception – passed configuration extends + * existing one, but does not overwrite already defined values. + * + * This method is supposed to be called by plugin developers to setup plugin's configurations. It would be + * rarely used for other needs. + * + * @label KEY_VALUE + * @param name The configuration name. Configuration names are case-sensitive. + * @param value The configuration value. + */ + define(name: K, value: GetSubConfig): void; + /** + * Does exactly the same as {@link #set:CONFIG_OBJECT} with one exception – passed configuration extends + * existing one, but does not overwrite already defined values. + * + * This method is supposed to be called by plugin developers to setup plugin's configurations. It would be + * rarely used for other needs. + * + * @label CONFIG_OBJECT + * @param config The configuration object from which take properties as + * configuration entries. Configuration names are case-sensitive. + */ + define(config: Partial): void; + /** + * Gets the value for a configuration entry. + * + * ```ts + * config.get( 'name' ); + * ``` + * + * Deep configurations can be retrieved by separating each part with a dot. + * + * ```ts + * config.get( 'toolbar.collapsed' ); + * ``` + * + * @param name The configuration name. Configuration names are case-sensitive. + * @returns The configuration value or `undefined` if the configuration entry was not found. + */ + get(name: K): GetSubConfig | undefined; + /** + * Iterates over all top level configuration names. + */ + names(): Iterable; + /** + * Saves passed configuration to the specified target (nested object). + * + * @param target Nested config object. + * @param name The configuration name or an object from which take properties as + * configuration entries. Configuration names are case-sensitive. + * @param value The configuration value. Used if a name is passed. + * @param isDefine Define if passed configuration should overwrite existing one. + */ + private _setToTarget; + /** + * Get specified configuration from specified source (nested object). + * + * @param source level of nested object. + * @param name The configuration name. Configuration names are case-sensitive. + * @returns The configuration value or `undefined` if the configuration entry was not found. + */ + private _getFromSource; + /** + * Iterates through passed object and calls {@link #_setToTarget} method with object key and value for each property. + * + * @param target Nested config object. + * @param configuration Configuration data set + * @param isDefine Defines if passed configuration is default configuration or not. + */ + private _setObjectToTarget; +} +/** + * An utility type excluding primitive values and arrays from the union. + */ +export type OnlyObject = Exclude>; +/** + * An utility type extracting configuration value from the given name. + * + * @typeParam T The type of a configuration dictionary. + * @typeParam K The literal type of configuration name (dot-separated path). + */ +export type GetSubConfig = K extends keyof T ? T[K] : K extends `${infer K1}.${infer K2}` ? K1 extends keyof T ? GetSubConfig, K2> : unknown : unknown; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/config.js b/node_modules/@ckeditor/ckeditor5-utils/src/config.js new file mode 100644 index 0000000..2aeb7db --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/config.js @@ -0,0 +1,163 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/config + */ +import { isPlainObject, isElement, cloneDeepWith } from 'lodash-es'; +/** + * Handles a configuration dictionary. + * + * @typeParam Cfg A type of the configuration dictionary. + */ +export default class Config { + /** + * Creates an instance of the {@link ~Config} class. + * + * @param configurations The initial configurations to be set. Usually, provided by the user. + * @param defaultConfigurations The default configurations. Usually, provided by the system. + */ + constructor(configurations, defaultConfigurations) { + this._config = {}; + // Set default configuration. + if (defaultConfigurations) { + // Clone the configuration to make sure that the properties will not be shared + // between editors and make the watchdog feature work correctly. + this.define(cloneConfig(defaultConfigurations)); + } + // Set initial configuration. + if (configurations) { + this._setObjectToTarget(this._config, configurations); + } + } + set(name, value) { + this._setToTarget(this._config, name, value); + } + define(name, value) { + const isDefine = true; + this._setToTarget(this._config, name, value, isDefine); + } + /** + * Gets the value for a configuration entry. + * + * ```ts + * config.get( 'name' ); + * ``` + * + * Deep configurations can be retrieved by separating each part with a dot. + * + * ```ts + * config.get( 'toolbar.collapsed' ); + * ``` + * + * @param name The configuration name. Configuration names are case-sensitive. + * @returns The configuration value or `undefined` if the configuration entry was not found. + */ + get(name) { + return this._getFromSource(this._config, name); + } + /** + * Iterates over all top level configuration names. + */ + *names() { + for (const name of Object.keys(this._config)) { + yield name; + } + } + /** + * Saves passed configuration to the specified target (nested object). + * + * @param target Nested config object. + * @param name The configuration name or an object from which take properties as + * configuration entries. Configuration names are case-sensitive. + * @param value The configuration value. Used if a name is passed. + * @param isDefine Define if passed configuration should overwrite existing one. + */ + _setToTarget(target, name, value, isDefine = false) { + // In case of an object, iterate through it and call `_setToTarget` again for each property. + if (isPlainObject(name)) { + this._setObjectToTarget(target, name, isDefine); + return; + } + // The configuration name should be split into parts if it has dots. E.g. `resize.width` -> [`resize`, `width`]. + const parts = name.split('.'); + // Take the name of the configuration out of the parts. E.g. `resize.width` -> `width`. + name = parts.pop(); + // Iterate over parts to check if currently stored configuration has proper structure. + for (const part of parts) { + // If there is no object for specified part then create one. + if (!isPlainObject(target[part])) { + target[part] = {}; + } + // Nested object becomes a target. + target = target[part]; + } + // In case of value is an object. + if (isPlainObject(value)) { + // We take care of proper config structure. + if (!isPlainObject(target[name])) { + target[name] = {}; + } + target = target[name]; + // And iterate through this object calling `_setToTarget` again for each property. + this._setObjectToTarget(target, value, isDefine); + return; + } + // Do nothing if we are defining configuration for non empty name. + if (isDefine && typeof target[name] != 'undefined') { + return; + } + target[name] = value; + } + /** + * Get specified configuration from specified source (nested object). + * + * @param source level of nested object. + * @param name The configuration name. Configuration names are case-sensitive. + * @returns The configuration value or `undefined` if the configuration entry was not found. + */ + _getFromSource(source, name) { + // The configuration name should be split into parts if it has dots. E.g. `resize.width` -> [`resize`, `width`]. + const parts = name.split('.'); + // Take the name of the configuration out of the parts. E.g. `resize.width` -> `width`. + name = parts.pop(); + // Iterate over parts to check if currently stored configuration has proper structure. + for (const part of parts) { + if (!isPlainObject(source[part])) { + source = null; + break; + } + // Nested object becomes a source. + source = source[part]; + } + // Always returns undefined for non existing configuration. + return source ? cloneConfig(source[name]) : undefined; + } + /** + * Iterates through passed object and calls {@link #_setToTarget} method with object key and value for each property. + * + * @param target Nested config object. + * @param configuration Configuration data set + * @param isDefine Defines if passed configuration is default configuration or not. + */ + _setObjectToTarget(target, configuration, isDefine) { + Object.keys(configuration).forEach(key => { + this._setToTarget(target, key, configuration[key], isDefine); + }); + } +} +/** + * Clones configuration object or value. + */ +function cloneConfig(source) { + return cloneDeepWith(source, leaveItemReferences); +} +/** + * A customized function for cloneDeepWith. + * In case if it's a DOM Element it will leave references to DOM Elements instead of cloning them. + * If it's a function it will leave reference to actuall function. + */ +function leaveItemReferences(value) { + return isElement(value) || typeof value === 'function' ? value : undefined; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/count.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/count.d.ts new file mode 100644 index 0000000..aa46566 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/count.d.ts @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/count + */ +/** + * Returns the number of items return by the iterator. + * + * ```ts + * count( [ 1, 2, 3, 4, 5 ] ); // 5; + * ``` + * + * @param iterable Any iterable. + * @returns Number of items returned by that iterable. + */ +export default function count(iterable: Iterable): number; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/count.js b/node_modules/@ckeditor/ckeditor5-utils/src/count.js new file mode 100644 index 0000000..e3eb6fd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/count.js @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/count + */ +/** + * Returns the number of items return by the iterator. + * + * ```ts + * count( [ 1, 2, 3, 4, 5 ] ); // 5; + * ``` + * + * @param iterable Any iterable. + * @returns Number of items returned by that iterable. + */ +export default function count(iterable) { + let count = 0; + for (const _ of iterable) { // eslint-disable-line no-unused-vars + count++; + } + return count; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/delay.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/delay.d.ts new file mode 100644 index 0000000..2e2147c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/delay.d.ts @@ -0,0 +1,19 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/delay + */ +/** + * Returns a function wrapper that will trigger a function after a specified wait time. + * The timeout can be canceled by calling the cancel function on the returned wrapped function. + * + * @param func The function to wrap. + * @param wait The timeout in ms. + */ +export default function delay) => any>(func: T, wait: number): DelayedFunc; +export interface DelayedFunc) => any> { + (...args: Parameters): void; + cancel(): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/delay.js b/node_modules/@ckeditor/ckeditor5-utils/src/delay.js new file mode 100644 index 0000000..fcdd7c4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/delay.js @@ -0,0 +1,26 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/delay + */ +/* globals setTimeout, clearTimeout */ +/** + * Returns a function wrapper that will trigger a function after a specified wait time. + * The timeout can be canceled by calling the cancel function on the returned wrapped function. + * + * @param func The function to wrap. + * @param wait The timeout in ms. + */ +export default function delay(func, wait) { + let timer; + function delayed(...args) { + delayed.cancel(); + timer = setTimeout(() => func(...args), wait); + } + delayed.cancel = () => { + clearTimeout(timer); + }; + return delayed; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/diff.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/diff.d.ts new file mode 100644 index 0000000..c8e5dfc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/diff.d.ts @@ -0,0 +1,31 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Calculates the difference between two arrays or strings producing an array containing a list of changes + * necessary to transform input into output. + * + * ```ts + * diff( 'aba', 'acca' ); // [ 'equal', 'insert', 'insert', 'delete', 'equal' ] + * ``` + * + * This function is based on the "O(NP) Sequence Comparison Algorithm" by Sun Wu, Udi Manber, Gene Myers, Webb Miller. + * Unfortunately, while it gives the most precise results, its to complex for longer strings/arrow (above 200 items). + * Therefore, `diff()` automatically switches to {@link module:utils/fastdiff~fastDiff `fastDiff()`} when detecting + * such a scenario. The return formats of both functions are identical. + * + * @param a Input array or string. + * @param b Output array or string. + * @param cmp Optional function used to compare array values, by default === is used. + * @returns Array of changes. + */ +declare function diff(a: ArrayLike, b: ArrayLike, cmp?: (a: T, b: T) => boolean): Array; +declare namespace diff { + var fastDiff: typeof import("./fastdiff.js").default; +} +export default diff; +/** + * The element of the result of {@link module:utils/diff~diff} function. + */ +export type DiffResult = 'equal' | 'insert' | 'delete'; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/diff.js b/node_modules/@ckeditor/ckeditor5-utils/src/diff.js new file mode 100644 index 0000000..b5254a4 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/diff.js @@ -0,0 +1,115 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/diff + */ +import fastDiff from './fastdiff.js'; +// The following code is based on the "O(NP) Sequence Comparison Algorithm" +// by Sun Wu, Udi Manber, Gene Myers, Webb Miller. +/** + * Calculates the difference between two arrays or strings producing an array containing a list of changes + * necessary to transform input into output. + * + * ```ts + * diff( 'aba', 'acca' ); // [ 'equal', 'insert', 'insert', 'delete', 'equal' ] + * ``` + * + * This function is based on the "O(NP) Sequence Comparison Algorithm" by Sun Wu, Udi Manber, Gene Myers, Webb Miller. + * Unfortunately, while it gives the most precise results, its to complex for longer strings/arrow (above 200 items). + * Therefore, `diff()` automatically switches to {@link module:utils/fastdiff~fastDiff `fastDiff()`} when detecting + * such a scenario. The return formats of both functions are identical. + * + * @param a Input array or string. + * @param b Output array or string. + * @param cmp Optional function used to compare array values, by default === is used. + * @returns Array of changes. + */ +export default function diff(a, b, cmp) { + // Set the comparator function. + cmp = cmp || function (a, b) { + return a === b; + }; + const aLength = a.length; + const bLength = b.length; + // Perform `fastDiff` for longer strings/arrays (see #269). + if (aLength > 200 || bLength > 200 || aLength + bLength > 300) { + return diff.fastDiff(a, b, cmp, true); + } + // Temporary action type statics. + let _insert, _delete; + // Swapped the arrays to use the shorter one as the first one. + if (bLength < aLength) { + const tmp = a; + a = b; + b = tmp; + // We swap the action types as well. + _insert = 'delete'; + _delete = 'insert'; + } + else { + _insert = 'insert'; + _delete = 'delete'; + } + const m = a.length; + const n = b.length; + const delta = n - m; + // Edit scripts, for each diagonal. + const es = {}; + // Furthest points, the furthest y we can get on each diagonal. + const fp = {}; + function snake(k) { + // We use -1 as an alternative below to handle initial values ( instead of filling the fp with -1 first ). + // Furthest points (y) on the diagonal below k. + const y1 = (fp[k - 1] !== undefined ? fp[k - 1] : -1) + 1; + // Furthest points (y) on the diagonal above k. + const y2 = fp[k + 1] !== undefined ? fp[k + 1] : -1; + // The way we should go to get further. + const dir = y1 > y2 ? -1 : 1; + // Clone previous changes array (if any). + if (es[k + dir]) { + es[k] = es[k + dir].slice(0); + } + // Create changes array. + if (!es[k]) { + es[k] = []; + } + // Push the action. + es[k].push(y1 > y2 ? _insert : _delete); + // Set the beginning coordinates. + let y = Math.max(y1, y2); + let x = y - k; + // Traverse the diagonal as long as the values match. + while (x < m && y < n && cmp(a[x], b[y])) { + x++; + y++; + // Push no change action. + es[k].push('equal'); + } + return y; + } + let p = 0; + let k; + // Traverse the graph until we reach the end of the longer string. + do { + // Updates furthest points and edit scripts for diagonals below delta. + for (k = -p; k < delta; k++) { + fp[k] = snake(k); + } + // Updates furthest points and edit scripts for diagonals above delta. + for (k = delta + p; k > delta; k--) { + fp[k] = snake(k); + } + // Updates furthest point and edit script for the delta diagonal. + // note that the delta diagonal is the one which goes through the sink (m, n). + fp[delta] = snake(delta); + p++; + } while (fp[delta] !== n); + // Return the final list of edit changes. + // We remove the first item that represents the action for the injected nulls. + return es[delta].slice(1); +} +// Store the API in static property to easily overwrite it in tests. +// Too bad dependency injection does not work in Webpack + ES 6 (const) + Babel. +diff.fastDiff = fastDiff; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.d.ts new file mode 100644 index 0000000..a717530 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.d.ts @@ -0,0 +1,59 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import type { DiffResult } from './diff.js'; +/** + * @module utils/difftochanges + */ +/** + * Creates a set of changes which need to be applied to the input in order to transform + * it into the output. This function can be used with strings or arrays. + * + * ```ts + * const input = Array.from( 'abc' ); + * const output = Array.from( 'xaby' ); + * const changes = diffToChanges( diff( input, output ), output ); + * + * changes.forEach( change => { + * if ( change.type == 'insert' ) { + * input.splice( change.index, 0, ...change.values ); + * } else if ( change.type == 'delete' ) { + * input.splice( change.index, change.howMany ); + * } + * } ); + * + * input.join( '' ) == output.join( '' ); // -> true + * ``` + * + * @typeParam T The type of output array element. + * @param diff Result of {@link module:utils/diff~diff}. + * @param output The string or array which was passed as diff's output. + * @returns Set of changes (insert or delete) which need to be applied to the input + * in order to transform it into the output. + */ +export default function diffToChanges(diff: ReadonlyArray, output: ArrayLike): Array>; +/** + * An object describing insertion change. + * + * @typeParam T The type of output array element. + */ +export interface InsertChange { + type: 'insert'; + index: number; + values: Array; +} +/** + * An object describing deletion change. + */ +export interface DeleteChange { + type: 'delete'; + index: number; + howMany: number; +} +/** + * The element of the result of {@link module:utils/difftochanges~diffToChanges} function. + * + * @typeParam T The type of output array element. + */ +export type Change = InsertChange | DeleteChange; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.js b/node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.js new file mode 100644 index 0000000..943bd95 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/difftochanges.js @@ -0,0 +1,79 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/difftochanges + */ +/** + * Creates a set of changes which need to be applied to the input in order to transform + * it into the output. This function can be used with strings or arrays. + * + * ```ts + * const input = Array.from( 'abc' ); + * const output = Array.from( 'xaby' ); + * const changes = diffToChanges( diff( input, output ), output ); + * + * changes.forEach( change => { + * if ( change.type == 'insert' ) { + * input.splice( change.index, 0, ...change.values ); + * } else if ( change.type == 'delete' ) { + * input.splice( change.index, change.howMany ); + * } + * } ); + * + * input.join( '' ) == output.join( '' ); // -> true + * ``` + * + * @typeParam T The type of output array element. + * @param diff Result of {@link module:utils/diff~diff}. + * @param output The string or array which was passed as diff's output. + * @returns Set of changes (insert or delete) which need to be applied to the input + * in order to transform it into the output. + */ +export default function diffToChanges(diff, output) { + const changes = []; + let index = 0; + let lastOperation = null; + diff.forEach(change => { + if (change == 'equal') { + pushLast(); + index++; + } + else if (change == 'insert') { + if (lastOperation && lastOperation.type == 'insert') { + lastOperation.values.push(output[index]); + } + else { + pushLast(); + lastOperation = { + type: 'insert', + index, + values: [output[index]] + }; + } + index++; + } + else /* if ( change == 'delete' ) */ { + if (lastOperation && lastOperation.type == 'delete') { + lastOperation.howMany++; + } + else { + pushLast(); + lastOperation = { + type: 'delete', + index, + howMany: 1 + }; + } + } + }); + pushLast(); + return changes; + function pushLast() { + if (lastOperation) { + changes.push(lastOperation); + lastOperation = null; + } + } +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.d.ts new file mode 100644 index 0000000..e893b52 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.d.ts @@ -0,0 +1,57 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Attributes to be applied to the HTML element. + */ +type HTMLElementAttributes = { + readonly [key: string]: string; +}; +/** + * Attributes to be applied to the SVG element. + */ +type SVGElementAttributes = HTMLElementAttributes & { + xmlns: string; +}; +/** + * Element or elements that will be added to the created element as children. Strings will be automatically turned into Text nodes. + */ +type ChildrenElements = Node | string | Iterable; +/** + * Creates an SVG element with attributes and children elements. + * + * ```ts + * createElement( document, 'mask', { xmlns: 'http://www.w3.org/2000/svg' } ); // + * createElement( document, 'mask', { xmlns: 'http://www.w3.org/2000/svg', id: 'foo' } ); // + * createElement( document, 'mask', { xmlns: 'http://www.w3.org/2000/svg' }, 'foo' ); // foo + * createElement( document, 'mask', { xmlns: 'http://www.w3.org/2000/svg' }, [ createElement(...) ] ); // <...> + * ``` + * + * @label SVG_ELEMENT + * @param doc Document used to create the element. + * @param name Name of the SVG element. + * @param attributes Object where keys represent attribute keys and values represent attribute values. + * @param children Child or any iterable of children. Strings will be automatically turned into Text nodes. + * @returns SVG element. + */ +export default function createElement(doc: Document, name: T, attributes: SVGElementAttributes, children?: ChildrenElements): SVGElementTagNameMap[T]; +/** + * Creates an HTML element with attributes and children elements. + * + * ```ts + * createElement( document, 'p' ); //

    + * createElement( document, 'p', { class: 'foo' } ); //

    + * createElement( document, 'p', null, 'foo' ); //

    foo

    + * createElement( document, 'p', null, [ createElement(...) ] ); //

    <...>

    + * ``` + * + * @label HTML_ELEMENT + * @param doc Document used to create the element. + * @param name Name of the HTML element. + * @param attributes Object where keys represent attribute keys and values represent attribute values. + * @param children Child or any iterable of children. Strings will be automatically turned into Text nodes. + * @returns HTML element. + */ +export default function createElement(doc: Document, name: T, attributes?: HTMLElementAttributes, children?: ChildrenElements): HTMLElementTagNameMap[T]; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.js new file mode 100644 index 0000000..e7c000a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/createelement.js @@ -0,0 +1,40 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/createelement + */ +import isIterable from '../isiterable.js'; +import { isString } from 'lodash-es'; +/** + * Creates an HTML or SVG element with attributes and children elements. + * + * ```ts + * createElement( document, 'p' ); //

    + * createElement( document, 'mask', { xmlns: 'http://www.w3.org/2000/svg' } ); // + * ``` + * + * @param doc Document used to create the element. + * @param name Name of the element. + * @param attributes Object where keys represent attribute keys and values represent attribute values. + * @param children Child or any iterable of children. Strings will be automatically turned into Text nodes. + * @returns HTML or SVG element. + */ +export default function createElement(doc, name, attributes = {}, children = []) { + const namespace = attributes && attributes.xmlns; + const element = namespace ? doc.createElementNS(namespace, name) : doc.createElement(name); + for (const key in attributes) { + element.setAttribute(key, attributes[key]); + } + if (isString(children) || !isIterable(children)) { + children = [children]; + } + for (let child of children) { + if (isString(child)) { + child = doc.createTextNode(child); + } + element.appendChild(child); + } + return element; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.d.ts new file mode 100644 index 0000000..fb71ac5 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.d.ts @@ -0,0 +1,142 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/emittermixin + */ +import { type Emitter, type CallbackOptions, type BaseEvent, type GetCallback } from '../emittermixin.js'; +import type EventInfo from '../eventinfo.js'; +import type { Constructor, Mixed } from '../mix.js'; +/** + * Mixin that injects the DOM events API into its host. It provides the API + * compatible with {@link module:utils/emittermixin~Emitter}. + * + * This function creates a class that inherits from the provided `base` and implements `Emitter` interface. + * + * DOM emitter mixin is by default available in the {@link module:ui/view~View} class, + * but it can also be mixed into any other class: + * + * ```ts + * import DomEmitterMixin from '../utils/dom/emittermixin.js'; + * + * class BaseClass { ... } + * + * class SomeView extends DomEmitterMixin( BaseClass ) {} + * + * const view = new SomeView(); + * view.listenTo( domElement, ( evt, domEvt ) => { + * console.log( evt, domEvt ); + * } ); + * ``` + * + * @label EXTENDS + */ +export default function DomEmitterMixin>(base: Base): Mixed; +/** + * Mixin that injects the DOM events API into its host. It provides the API + * compatible with {@link module:utils/emittermixin~Emitter}. + * + * This function creates a class that implements `Emitter` interface. + * + * DOM emitter mixin is by default available in the {@link module:ui/view~View} class, + * but it can also be mixed into any other class: + * + * ```ts + * import DomEmitterMixin from '../utils/dom/emittermixin.js'; + * + * class SomeView extends DomEmitterMixin() {} + * + * const view = new SomeView(); + * view.listenTo( domElement, ( evt, domEvt ) => { + * console.log( evt, domEvt ); + * } ); + * ``` + * + * @label NO_ARGUMENTS + */ +export default function DomEmitterMixin(): { + new (): DomEmitter; + prototype: DomEmitter; +}; +export interface DomEventMap extends HTMLElementEventMap, WindowEventMap { +} +/** + * Interface representing classes which mix in {@link module:utils/dom/emittermixin~DomEmitterMixin}. + * + * Can be easily implemented by a class by mixing the {@link module:utils/dom/emittermixin~DomEmitterMixin} mixin. + * + * ```ts + * class MyClass extends DomEmitterMixin( OtherBaseClass ) { + * // This class now implements the `Emitter` interface. + * } + * ``` + */ +export interface DomEmitter extends Emitter { + /** + * Registers a callback function to be executed when an event is fired in a specific Emitter or DOM Node. + * It is backwards compatible with {@link module:utils/emittermixin~Emitter#listenTo}. + * + * @label HTML_EMITTER + * @param emitter The object that fires the event. + * @param event The name of the event. + * @param callback The function to be called on event. + * @param options Additional options. + * @param options.useCapture Indicates that events of this type will be dispatched to the registered + * listener before being dispatched to any EventTarget beneath it in the DOM tree. + * @param options.usePassive Indicates that the function specified by listener will never call preventDefault() + * and prevents blocking browser's main thread by this event handler. + */ + listenTo(emitter: Node | Window, event: K, callback: (this: this, ev: EventInfo, event: DomEventMap[K]) => void, options?: CallbackOptions & { + readonly useCapture?: boolean; + readonly usePassive?: boolean; + }): void; + /** + * Registers a callback function to be executed when an event is fired in a specific (emitter) object. + * + * Events can be grouped in namespaces using `:`. + * When namespaced event is fired, it additionally fires all callbacks for that namespace. + * + * ```ts + * // myEmitter.on( ... ) is a shorthand for myEmitter.listenTo( myEmitter, ... ). + * myEmitter.on( 'myGroup', genericCallback ); + * myEmitter.on( 'myGroup:myEvent', specificCallback ); + * + * // genericCallback is fired. + * myEmitter.fire( 'myGroup' ); + * // both genericCallback and specificCallback are fired. + * myEmitter.fire( 'myGroup:myEvent' ); + * // genericCallback is fired even though there are no callbacks for "foo". + * myEmitter.fire( 'myGroup:foo' ); + * ``` + * + * An event callback can {@link module:utils/eventinfo~EventInfo#stop stop the event} and + * set the {@link module:utils/eventinfo~EventInfo#return return value} of the {@link #fire} method. + * + * @label DOM_EMITTER + * @typeParam TEvent The type describing the event. See {@link module:utils/emittermixin~BaseEvent}. + * @param emitter The object that fires the event. + * @param event The name of the event. + * @param callback The function to be called on event. + * @param options Additional options. + */ + listenTo(emitter: Emitter, event: TEvent['name'], callback: GetCallback, options?: CallbackOptions): void; + /** + * Stops listening for events. It can be used at different levels: + * It is backwards compatible with {@link module:utils/emittermixin~Emitter#listenTo}. + * + * * To stop listening to a specific callback. + * * To stop listening to a specific event. + * * To stop listening to all events fired by a specific object. + * * To stop listening to all events fired by all objects. + * + * @label DOM_STOP + * @param emitter The object to stop listening to. + * If omitted, stops it for all objects. + * @param event (Requires the `emitter`) The name of the event to stop listening to. If omitted, stops it + * for all events from `emitter`. + * @param callback (Requires the `event`) The function to be removed from the call list for the given + * `event`. + */ + stopListening(emitter?: Emitter | Node | Window, event?: string, callback?: Function): void; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.js new file mode 100644 index 0000000..95c589c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/emittermixin.js @@ -0,0 +1,239 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/emittermixin + */ +import EmitterMixin, { _getEmitterListenedTo, _setEmitterId } from '../emittermixin.js'; +import uid from '../uid.js'; +import isNode from './isnode.js'; +import isWindow from './iswindow.js'; +const defaultEmitterClass = DomEmitterMixin(EmitterMixin()); +export default function DomEmitterMixin(base) { + if (!base) { + return defaultEmitterClass; + } + class Mixin extends base { + listenTo(emitter, event, callback, options = {}) { + // Check if emitter is an instance of DOM Node. If so, use corresponding ProxyEmitter (or create one if not existing). + if (isNode(emitter) || isWindow(emitter)) { + const proxyOptions = { + capture: !!options.useCapture, + passive: !!options.usePassive + }; + const proxyEmitter = this._getProxyEmitter(emitter, proxyOptions) || new ProxyEmitter(emitter, proxyOptions); + this.listenTo(proxyEmitter, event, callback, options); + } + else { + // Execute parent class method with Emitter (or ProxyEmitter) instance. + super.listenTo(emitter, event, callback, options); + } + } + stopListening(emitter, event, callback) { + // Check if the emitter is an instance of DOM Node. If so, forward the call to the corresponding ProxyEmitters. + if (isNode(emitter) || isWindow(emitter)) { + const proxyEmitters = this._getAllProxyEmitters(emitter); + for (const proxy of proxyEmitters) { + this.stopListening(proxy, event, callback); + } + } + else { + // Execute parent class method with Emitter (or ProxyEmitter) instance. + super.stopListening(emitter, event, callback); + } + } + /** + * Retrieves ProxyEmitter instance for given DOM Node residing in this Host and given options. + * + * @param node DOM Node of the ProxyEmitter. + * @param options Additional options. + * @param options.useCapture Indicates that events of this type will be dispatched to the registered + * listener before being dispatched to any EventTarget beneath it in the DOM tree. + * @param options.usePassive Indicates that the function specified by listener will never call preventDefault() + * and prevents blocking browser's main thread by this event handler. + * @returns ProxyEmitter instance bound to the DOM Node. + */ + _getProxyEmitter(node, options) { + return _getEmitterListenedTo(this, getProxyEmitterId(node, options)); + } + /** + * Retrieves all the ProxyEmitter instances for given DOM Node residing in this Host. + * + * @param node DOM Node of the ProxyEmitter. + */ + _getAllProxyEmitters(node) { + return [ + { capture: false, passive: false }, + { capture: false, passive: true }, + { capture: true, passive: false }, + { capture: true, passive: true } + ].map(options => this._getProxyEmitter(node, options)).filter(proxy => !!proxy); + } + } + return Mixin; +} +// Backward compatibility with `mix` +([ + '_getProxyEmitter', '_getAllProxyEmitters', + 'on', 'once', 'off', 'listenTo', + 'stopListening', 'fire', 'delegate', 'stopDelegating', + '_addEventListener', '_removeEventListener' +]).forEach(key => { + DomEmitterMixin[key] = defaultEmitterClass.prototype[key]; +}); +/** + * Creates a ProxyEmitter instance. Such an instance is a bridge between a DOM Node firing events + * and any Host listening to them. It is backwards compatible with {@link module:utils/emittermixin~Emitter#on}. + * There is a separate instance for each combination of modes (useCapture & usePassive). The mode is concatenated with + * UID stored in HTMLElement to give each instance unique identifier. + * + * listenTo( click, ... ) + * +-----------------------------------------+ + * | stopListening( ... ) | + * +----------------------------+ | addEventListener( click, ... ) + * | Host | | +---------------------------------------------+ + * +----------------------------+ | | removeEventListener( click, ... ) | + * | _listeningTo: { | +----------v-------------+ | + * | UID+mode: { | | ProxyEmitter | | + * | emitter: ProxyEmitter, | +------------------------+ +------------v----------+ + * | callbacks: { | | events: { | | Node (HTMLElement) | + * | click: [ callbacks ] | | click: [ callbacks ] | +-----------------------+ + * | } | | }, | | data-ck-expando: UID | + * | } | | _domNode: Node, | +-----------------------+ + * | } | | _domListeners: {}, | | + * | +------------------------+ | | _emitterId: UID+mode | | + * | | DomEmitterMixin | | +--------------^---------+ | + * | +------------------------+ | | | | + * +--------------^-------------+ | +---------------------------------------------+ + * | | click (DOM Event) + * +-----------------------------------------+ + * fire( click, DOM Event ) + */ +class ProxyEmitter extends EmitterMixin() { + /** + * @param node DOM Node that fires events. + * @param options Additional options. + * @param options.useCapture Indicates that events of this type will be dispatched to the registered + * listener before being dispatched to any EventTarget beneath it in the DOM tree. + * @param options.usePassive Indicates that the function specified by listener will never call preventDefault() + * and prevents blocking browser's main thread by this event handler. + */ + constructor(node, options) { + super(); + // Set emitter ID to match DOM Node "expando" property. + _setEmitterId(this, getProxyEmitterId(node, options)); + // Remember the DOM Node this ProxyEmitter is bound to. + this._domNode = node; + // And given options. + this._options = options; + } + /** + * Registers a callback function to be executed when an event is fired. + * + * It attaches a native DOM listener to the DOM Node. When fired, + * a corresponding Emitter event will also fire with DOM Event object as an argument. + * + * **Note**: This is automatically called by the + * {@link module:utils/emittermixin~Emitter#listenTo `Emitter#listenTo()`}. + * + * @param event The name of the event. + */ + attach(event) { + // If the DOM Listener for given event already exist it is pointless + // to attach another one. + if (this._domListeners && this._domListeners[event]) { + return; + } + const domListener = this._createDomListener(event); + // Attach the native DOM listener to DOM Node. + this._domNode.addEventListener(event, domListener, this._options); + if (!this._domListeners) { + this._domListeners = {}; + } + // Store the native DOM listener in this ProxyEmitter. It will be helpful + // when stopping listening to the event. + this._domListeners[event] = domListener; + } + /** + * Stops executing the callback on the given event. + * + * **Note**: This is automatically called by the + * {@link module:utils/emittermixin~Emitter#stopListening `Emitter#stopListening()`}. + * + * @param event The name of the event. + */ + detach(event) { + let events; + // Remove native DOM listeners which are orphans. If no callbacks + // are awaiting given event, detach native DOM listener from DOM Node. + // See: {@link attach}. + if (this._domListeners[event] && (!(events = this._events[event]) || !events.callbacks.length)) { + this._domListeners[event].removeListener(); + } + } + /** + * Adds callback to emitter for given event. + * + * @internal + * @param event The name of the event. + * @param callback The function to be called on event. + * @param options Additional options. + */ + _addEventListener(event, callback, options) { + this.attach(event); + EmitterMixin().prototype._addEventListener.call(this, event, callback, options); + } + /** + * Removes callback from emitter for given event. + * + * @internal + * @param event The name of the event. + * @param callback The function to stop being called. + */ + _removeEventListener(event, callback) { + EmitterMixin().prototype._removeEventListener.call(this, event, callback); + this.detach(event); + } + /** + * Creates a native DOM listener callback. When the native DOM event + * is fired it will fire corresponding event on this ProxyEmitter. + * Note: A native DOM Event is passed as an argument. + * + * @param event The name of the event. + * @returns The DOM listener callback. + */ + _createDomListener(event) { + const domListener = (domEvt) => { + this.fire(event, domEvt); + }; + // Supply the DOM listener callback with a function that will help + // detach it from the DOM Node, when it is no longer necessary. + // See: {@link detach}. + domListener.removeListener = () => { + this._domNode.removeEventListener(event, domListener, this._options); + delete this._domListeners[event]; + }; + return domListener; + } +} +/** + * Gets an unique DOM Node identifier. The identifier will be set if not defined. + * + * @returns UID for given DOM Node. + */ +function getNodeUID(node) { + return node['data-ck-expando'] || (node['data-ck-expando'] = uid()); +} +/** + * Gets id of the ProxyEmitter for the given node. + */ +function getProxyEmitterId(node, options) { + let id = getNodeUID(node); + for (const option of Object.keys(options).sort()) { + if (options[option]) { + id += '-' + option; + } + } + return id; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.d.ts new file mode 100644 index 0000000..40afe85 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Returns the closest scrollable ancestor of a DOM element. + * + * @param domElement DOM element. + * @returns First ancestor of `domElement` that is scrollable or null if such ancestor doesn't exist. + */ +export default function findClosestScrollableAncestor(domElement: HTMLElement): HTMLElement | null; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.js new file mode 100644 index 0000000..3b488fb --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/findclosestscrollableancestor.js @@ -0,0 +1,31 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/findclosestscrollableancestor + */ +import global from './global.js'; +/** + * Returns the closest scrollable ancestor of a DOM element. + * + * @param domElement DOM element. + * @returns First ancestor of `domElement` that is scrollable or null if such ancestor doesn't exist. + */ +export default function findClosestScrollableAncestor(domElement) { + let element = domElement.parentElement; + if (!element) { + return null; + } + while (element.tagName != 'BODY') { + const overflow = element.style.overflowY || global.window.getComputedStyle(element).overflowY; + if (overflow === 'auto' || overflow === 'scroll') { + break; + } + element = element.parentElement; + if (!element) { + return null; + } + } + return element; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.d.ts new file mode 100644 index 0000000..6e7a301 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.d.ts @@ -0,0 +1,17 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/getancestors + */ +/** + * Returns all ancestors of given DOM node, starting from the top-most (root). Includes the given node itself. If the + * node is a part of `DocumentFragment` that `DocumentFragment` will be returned. In contrary, if the node is + * appended to a `Document`, that `Document` will not be returned (algorithms operating on DOM tree care for `Document#documentElement` + * at most, which will be returned). + * + * @param node DOM node. + * @returns Array of given `node` parents. + */ +export default function getAncestors(node: Node): Array; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.js new file mode 100644 index 0000000..418095f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getancestors.js @@ -0,0 +1,27 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals Node */ +/** + * @module utils/dom/getancestors + */ +/** + * Returns all ancestors of given DOM node, starting from the top-most (root). Includes the given node itself. If the + * node is a part of `DocumentFragment` that `DocumentFragment` will be returned. In contrary, if the node is + * appended to a `Document`, that `Document` will not be returned (algorithms operating on DOM tree care for `Document#documentElement` + * at most, which will be returned). + * + * @param node DOM node. + * @returns Array of given `node` parents. + */ +export default function getAncestors(node) { + const nodes = []; + let currentNode = node; + // We are interested in `Node`s `DocumentFragment`s only. + while (currentNode && currentNode.nodeType != Node.DOCUMENT_NODE) { + nodes.unshift(currentNode); + currentNode = currentNode.parentNode; + } + return nodes; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.d.ts new file mode 100644 index 0000000..6ce7f8b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.d.ts @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/getborderwidths + */ +/** + * Returns an object containing CSS border widths of a specified HTML element. + * + * @param element An element which has CSS borders. + * @returns An object containing `top`, `left`, `right` and `bottom` properties + * with numerical values of the `border-[top,left,right,bottom]-width` CSS styles. + */ +export default function getBorderWidths(element: HTMLElement): BorderWidths; +/** + * An object describing widths of `HTMLElement` borders. +*/ +export interface BorderWidths { + top: number; + right: number; + bottom: number; + left: number; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.js new file mode 100644 index 0000000..94975c9 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getborderwidths.js @@ -0,0 +1,24 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/getborderwidths + */ +/** + * Returns an object containing CSS border widths of a specified HTML element. + * + * @param element An element which has CSS borders. + * @returns An object containing `top`, `left`, `right` and `bottom` properties + * with numerical values of the `border-[top,left,right,bottom]-width` CSS styles. + */ +export default function getBorderWidths(element) { + // Call getComputedStyle on the window the element document belongs to. + const style = element.ownerDocument.defaultView.getComputedStyle(element); + return { + top: parseInt(style.borderTopWidth, 10), + right: parseInt(style.borderRightWidth, 10), + bottom: parseInt(style.borderBottomWidth, 10), + left: parseInt(style.borderLeftWidth, 10) + }; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.d.ts new file mode 100644 index 0000000..6c52614 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.d.ts @@ -0,0 +1,12 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Searches and returns the lowest common ancestor of two given nodes. + * + * @param nodeA First node. + * @param nodeB Second node. + * @returns Lowest common ancestor of both nodes or `null` if nodes do not have a common ancestor. + */ +export default function getCommonAncestor(nodeA: Node, nodeB: Node): Node | null; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.js new file mode 100644 index 0000000..5bcf951 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getcommonancestor.js @@ -0,0 +1,25 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/getcommonancestor + */ +import getAncestors from './getancestors.js'; +/** + * Searches and returns the lowest common ancestor of two given nodes. + * + * @param nodeA First node. + * @param nodeB Second node. + * @returns Lowest common ancestor of both nodes or `null` if nodes do not have a common ancestor. + */ +export default function getCommonAncestor(nodeA, nodeB) { + const ancestorsA = getAncestors(nodeA); + const ancestorsB = getAncestors(nodeB); + let i = 0; + // It does not matter which array is shorter. + while (ancestorsA[i] == ancestorsB[i] && ancestorsA[i]) { + i++; + } + return i === 0 ? null : ancestorsA[i - 1]; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.d.ts new file mode 100644 index 0000000..7bc24e7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.d.ts @@ -0,0 +1,14 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/getdatafromelement + */ +/** + * Gets data from a given source element. + * + * @param el The element from which the data will be retrieved. + * @returns The data string. + */ +export default function getDataFromElement(el: HTMLElement): string; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.js new file mode 100644 index 0000000..ab8ed04 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getdatafromelement.js @@ -0,0 +1,20 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals HTMLTextAreaElement */ +/** + * @module utils/dom/getdatafromelement + */ +/** + * Gets data from a given source element. + * + * @param el The element from which the data will be retrieved. + * @returns The data string. + */ +export default function getDataFromElement(el) { + if (el instanceof HTMLTextAreaElement) { + return el.value; + } + return el.innerHTML; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.d.ts new file mode 100644 index 0000000..2ebcc23 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.d.ts @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * For a given element, returns the nearest ancestor element which CSS position is not "static". + * + * @param element The native DOM element to be checked. + */ +export default function getPositionedAncestor(element?: HTMLElement): HTMLElement | null; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.js new file mode 100644 index 0000000..1e09a47 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/getpositionedancestor.js @@ -0,0 +1,22 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/getpositionedancestor + */ +import global from './global.js'; +/** + * For a given element, returns the nearest ancestor element which CSS position is not "static". + * + * @param element The native DOM element to be checked. + */ +export default function getPositionedAncestor(element) { + if (!element || !element.parentNode) { + return null; + } + if (element.offsetParent === global.document.body) { + return null; + } + return element.offsetParent; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/global.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/global.d.ts new file mode 100644 index 0000000..59062d8 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/global.d.ts @@ -0,0 +1,32 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/global + */ +/** + * A helper (module) giving an access to the global DOM objects such as `window` and `document`. + */ +export interface GlobalType { + readonly window: Window & typeof globalThis; + readonly document: Document; +} +/** + * A helper (module) giving an access to the global DOM objects such as `window` and + * `document`. Accessing these objects using this helper allows easy and bulletproof + * testing, i.e. stubbing native properties: + * + * ```ts + * import { global } from 'ckeditor5/utils'; + * + * // This stub will work for any code using global module. + * testUtils.sinon.stub( global, 'window', { + * innerWidth: 10000 + * } ); + * + * console.log( global.window.innerWidth ); + * ``` + */ +declare let globalVar: GlobalType; +export default globalVar; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/global.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/global.js new file mode 100644 index 0000000..a4e9501 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/global.js @@ -0,0 +1,35 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A helper (module) giving an access to the global DOM objects such as `window` and + * `document`. Accessing these objects using this helper allows easy and bulletproof + * testing, i.e. stubbing native properties: + * + * ```ts + * import { global } from 'ckeditor5/utils'; + * + * // This stub will work for any code using global module. + * testUtils.sinon.stub( global, 'window', { + * innerWidth: 10000 + * } ); + * + * console.log( global.window.innerWidth ); + * ``` + */ +let globalVar; // named globalVar instead of global: https://github.com/ckeditor/ckeditor5/issues/12971 +// In some environments window and document API might not be available. +try { + globalVar = { window, document }; +} +catch (e) { + // It's not possible to mock a window object to simulate lack of a window object without writing extremely convoluted code. + /* istanbul ignore next -- @preserve */ + // Let's cast it to not change module's API. + // We only handle this so loading editor in environments without window and document doesn't fail. + // For better DX we shouldn't introduce mixed types and require developers to check the type manually. + // This module should not be used on purpose in any environment outside browser. + globalVar = { window: {}, document: {} }; +} +export default globalVar; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.d.ts new file mode 100644 index 0000000..31964e7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.d.ts @@ -0,0 +1,14 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/indexof + */ +/** + * Returns index of the node in the parent element. + * + * @param node Node which index is tested. + * @returns Index of the node in the parent element. Returns 0 if node has no parent. + */ +export default function indexOf(node: Node): number; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.js new file mode 100644 index 0000000..62af893 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/indexof.js @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/indexof + */ +/** + * Returns index of the node in the parent element. + * + * @param node Node which index is tested. + * @returns Index of the node in the parent element. Returns 0 if node has no parent. + */ +export default function indexOf(node) { + let index = 0; + while (node.previousSibling) { + node = node.previousSibling; + index++; + } + return index; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.d.ts new file mode 100644 index 0000000..7cb5bcd --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.d.ts @@ -0,0 +1,15 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/insertat + */ +/** + * Inserts node to the parent at given index. + * + * @param parentElement Parent element. + * @param index Insertions index. + * @param nodeToInsert Node to insert. + */ +export default function insertAt(parentElement: Element, index: number, nodeToInsert: Node): void; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.js new file mode 100644 index 0000000..862515d --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/insertat.js @@ -0,0 +1,17 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/insertat + */ +/** + * Inserts node to the parent at given index. + * + * @param parentElement Parent element. + * @param index Insertions index. + * @param nodeToInsert Node to insert. + */ +export default function insertAt(parentElement, index, nodeToInsert) { + parentElement.insertBefore(nodeToInsert, parentElement.childNodes[index] || null); +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.d.ts new file mode 100644 index 0000000..e51a83c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/iscomment + */ +/** + * Checks whether the object is a native DOM Comment node. + */ +export default function isComment(obj: any): obj is Comment; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.js new file mode 100644 index 0000000..4bc419b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iscomment.js @@ -0,0 +1,14 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/* globals Node */ +/** + * @module utils/dom/iscomment + */ +/** + * Checks whether the object is a native DOM Comment node. + */ +export default function isComment(obj) { + return obj && obj.nodeType === Node.COMMENT_NODE; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.d.ts new file mode 100644 index 0000000..ee6761c --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isnode + */ +/** + * Checks if the object is a native DOM Node. + */ +export default function isNode(obj: any): obj is Node; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.js new file mode 100644 index 0000000..bf95d71 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isnode.js @@ -0,0 +1,21 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isnode + */ +/** + * Checks if the object is a native DOM Node. + */ +export default function isNode(obj) { + if (obj) { + if (obj.defaultView) { + return obj instanceof obj.defaultView.Document; + } + else if (obj.ownerDocument && obj.ownerDocument.defaultView) { + return obj instanceof obj.ownerDocument.defaultView.Node; + } + } + return false; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.d.ts new file mode 100644 index 0000000..d4d664f --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isrange + */ +/** + * Checks if the object is a native DOM Range. + */ +export default function isRange(obj: unknown): obj is Range; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.js new file mode 100644 index 0000000..59dca44 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isrange.js @@ -0,0 +1,13 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isrange + */ +/** + * Checks if the object is a native DOM Range. + */ +export default function isRange(obj) { + return Object.prototype.toString.apply(obj) == '[object Range]'; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.d.ts new file mode 100644 index 0000000..b05bd41 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/istext + */ +/** + * Checks if the object is a native DOM Text node. + */ +export default function isText(obj: unknown): obj is Text; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.js new file mode 100644 index 0000000..a528e6a --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/istext.js @@ -0,0 +1,13 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/istext + */ +/** + * Checks if the object is a native DOM Text node. + */ +export default function isText(obj) { + return Object.prototype.toString.call(obj) == '[object Text]'; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.d.ts new file mode 100644 index 0000000..64551f0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.d.ts @@ -0,0 +1,10 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * Checks if the given attribute name is valid in terms of HTML. + * + * @param name Attribute name. + */ +export default function isValidAttributeName(name: string): boolean; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.js new file mode 100644 index 0000000..19f4e67 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvalidattributename.js @@ -0,0 +1,22 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isvalidattributename + */ +import global from './global.js'; +/** + * Checks if the given attribute name is valid in terms of HTML. + * + * @param name Attribute name. + */ +export default function isValidAttributeName(name) { + try { + global.document.createAttribute(name); + } + catch (error) { + return false; + } + return true; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.d.ts new file mode 100644 index 0000000..a387536 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.d.ts @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isvisible + */ +/** + * Checks whether the element is visible to the user in DOM: + * + * * connected to the root of the document, + * * has no `display: none`, + * * has no ancestors with `display: none`. + * + * **Note**: This helper does not check whether the element is hidden by cropping, overflow, etc.. + * To check that, use {@link module:utils/dom/rect~Rect} instead. + */ +export default function isVisible(element: HTMLElement | null | undefined): boolean; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.js new file mode 100644 index 0000000..08c80b6 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/isvisible.js @@ -0,0 +1,20 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/isvisible + */ +/** + * Checks whether the element is visible to the user in DOM: + * + * * connected to the root of the document, + * * has no `display: none`, + * * has no ancestors with `display: none`. + * + * **Note**: This helper does not check whether the element is hidden by cropping, overflow, etc.. + * To check that, use {@link module:utils/dom/rect~Rect} instead. + */ +export default function isVisible(element) { + return !!(element && element.getClientRects && element.getClientRects().length); +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.d.ts new file mode 100644 index 0000000..16a56ea --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.d.ts @@ -0,0 +1,11 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/iswindow + */ +/** + * Checks if the object is a native DOM Window. + */ +export default function isWindow(obj: unknown): obj is Window; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.js new file mode 100644 index 0000000..ddaa247 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/iswindow.js @@ -0,0 +1,22 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/iswindow + */ +/** + * Checks if the object is a native DOM Window. + */ +export default function isWindow(obj) { + const stringifiedObject = Object.prototype.toString.apply(obj); + // Returns `true` for the `window` object in browser environments. + if (stringifiedObject == '[object Window]') { + return true; + } + // Returns `true` for the `window` object in the Electron environment. + if (stringifiedObject == '[object global]') { + return true; + } + return false; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/position.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/position.d.ts new file mode 100644 index 0000000..3fc58f0 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/position.d.ts @@ -0,0 +1,211 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +import Rect, { type RectSource } from './rect.js'; +/** + * Calculates the `position: absolute` coordinates of a given element so it can be positioned with respect to the + * target in the visually most efficient way, taking various restrictions like viewport or limiter geometry + * into consideration. + * + * **Note**: If there are no position coordinates found that meet the requirements (arguments of this helper), + * `null` is returned. + * + * ```ts + * // The element which is to be positioned. + * const element = document.body.querySelector( '#toolbar' ); + * + * // A target to which the element is positioned relatively. + * const target = document.body.querySelector( '#container' ); + * + * // Finding the optimal coordinates for the positioning. + * const { left, top, name } = getOptimalPosition( { + * element: element, + * target: target, + * + * // The algorithm will chose among these positions to meet the requirements such + * // as "limiter" element or "fitInViewport", set below. The positions are considered + * // in the order of the array. + * positions: [ + * // + * // [ Target ] + * // +-----------------+ + * // | Element | + * // +-----------------+ + * // + * targetRect => ( { + * top: targetRect.bottom, + * left: targetRect.left, + * name: 'mySouthEastPosition' + * } ), + * + * // + * // +-----------------+ + * // | Element | + * // +-----------------+ + * // [ Target ] + * // + * ( targetRect, elementRect ) => ( { + * top: targetRect.top - elementRect.height, + * left: targetRect.left, + * name: 'myNorthEastPosition' + * } ) + * ], + * + * // Find a position such guarantees the element remains within visible boundaries of . + * limiter: document.body, + * + * // Find a position such guarantees the element remains within visible boundaries of the browser viewport. + * fitInViewport: true + * } ); + * + * // The best position which fits into document.body and the viewport. May be useful + * // to set proper class on the `element`. + * console.log( name ); // -> "myNorthEastPosition" + * + * // Using the absolute coordinates which has been found to position the element + * // as in the diagram depicting the "myNorthEastPosition" position. + * element.style.top = top; + * element.style.left = left; + * ``` + * + * @param options The input data and configuration of the helper. + */ +export declare function getOptimalPosition({ element, target, positions, limiter, fitInViewport, viewportOffsetConfig }: Options): DomPoint | null; +/** + * A position object which instances are created and used by the {@link module:utils/dom/position~getOptimalPosition} helper. + * + * {@link module:utils/dom/position~DomPoint#top} and {@link module:utils/dom/position~DomPoint#left} properties of the position instance + * translate directly to the `top` and `left` properties in CSS "`position: absolute` coordinate system". If set on the positioned element + * in DOM, they will make it display it in the right place in the viewport. + */ +export interface DomPoint { + /** + * Position name. + */ + readonly name?: string; + /** + * Additional position configuration, as passed from the {@link module:utils/dom/position~PositioningFunction positioning function}. + * + * This object can be use, for instance, to pass through presentation options used by the consumer of the + * {@link module:utils/dom/position~getOptimalPosition} helper. + */ + readonly config?: object; + /** + * The left value in pixels in the CSS `position: absolute` coordinate system. + * Set it on the positioned element in DOM to move it to the position. + */ + readonly left: number; + /** + * The top value in pixels in the CSS `position: absolute` coordinate system. + * Set it on the positioned element in DOM to move it to the position. + */ + readonly top: number; +} +/** + * The `getOptimalPosition()` helper options. + */ +export interface Options { + /** + * Element that is to be positioned. + */ + readonly element: HTMLElement; + /** + * Target with respect to which the `element` is to be positioned. + */ + readonly target: RectSource | (() => RectSource); + /** + * An array of positioning functions. + * + * **Note**: Positioning functions are processed in the order of preference. The first function that works + * in the current environment (e.g. offers the complete fit in the viewport geometry) will be picked by + * `getOptimalPosition()`. + * + * **Note**: Any positioning function returning `null` is ignored. + */ + readonly positions: ReadonlyArray; + /** + * When set, the algorithm will chose position which fits the most in the + * limiter's bounding rect. + */ + readonly limiter?: RectSource | (() => (RectSource | null)) | null; + /** + * When set, the algorithm will chose such a position which fits `element` + * the most inside visible viewport. + */ + readonly fitInViewport?: boolean; + /** + * Viewport offset config object. It restricts the visible viewport available to the `getOptimalPosition()` from each side. + * + * ```ts + * { + * top: 50, + * right: 50, + * bottom: 50, + * left: 50 + * } + * ``` + */ + readonly viewportOffsetConfig?: { + readonly top?: number; + readonly right?: number; + readonly bottom?: number; + readonly left?: number; + }; +} +/** + * A positioning function which, based on positioned element and target {@link module:utils/dom/rect~Rect Rects}, returns rect coordinates + * representing the geometrical relation between them. Used by the {@link module:utils/dom/position~getOptimalPosition} helper. + * + * ```ts + * // This simple position will place the element directly under the target, in the middle: + * // + * // [ Target ] + * // +-----------------+ + * // | Element | + * // +-----------------+ + * // + * const position = ( targetRect, elementRect, [ viewportRect ] ) => ( { + * top: targetRect.bottom, + * left: targetRect.left + targetRect.width / 2 - elementRect.width / 2, + * name: 'bottomMiddle', + * + * // Note: The config is optional. + * config: { + * zIndex: '999' + * } + * } ); + * ``` + * + * @param elementRect The rect of the element to be positioned. + * @param targetRect The rect of the target the element (its rect) is relatively positioned to. + * @param viewportRect The rect of the visual browser viewport. + * @returns When the function returns `null`, it will not be considered by {@link module:utils/dom/position~getOptimalPosition}. + */ +export type PositioningFunction = (elementRect: Rect, targetRect: Rect, viewportRect: Rect, limiterRect?: Rect) => PositioningFunctionResult | null; +/** + * The result of {@link module:utils/dom/position~PositioningFunction}. + */ +export interface PositioningFunctionResult { + /** + * The `top` value of the element rect that would represent the position. + */ + top: number; + /** + * The `left` value of the element rect that would represent the position. + */ + left: number; + /** + * The name of the position. It helps the user of the {@link module:utils/dom/position~getOptimalPosition} + * helper to recognize different positioning function results. It will pass through to the {@link module:utils/dom/position~DomPoint} + * returned by the helper. + */ + name?: string; + /** + * An optional configuration that will pass-through the {@link module:utils/dom/position~getOptimalPosition} helper + * to the {@link module:utils/dom/position~DomPoint} returned by this helper. + * This configuration may, for instance, let the user of {@link module:utils/dom/position~getOptimalPosition} know that this particular + * position comes with a certain presentation. + */ + config?: object; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/position.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/position.js new file mode 100644 index 0000000..3e4c6a1 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/position.js @@ -0,0 +1,313 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/position + */ +import global from './global.js'; +import Rect from './rect.js'; +import getPositionedAncestor from './getpositionedancestor.js'; +import { isFunction } from 'lodash-es'; +// @if CK_DEBUG_POSITION // const { +// @if CK_DEBUG_POSITION // default: RectDrawer, +// @if CK_DEBUG_POSITION // diagonalStylesBlack, +// @if CK_DEBUG_POSITION // diagonalStylesGreen, +// @if CK_DEBUG_POSITION // diagonalStylesRed +// @if CK_DEBUG_POSITION // } = require( '@ckeditor/ckeditor5-utils/tests/_utils/rectdrawer' ); +// @if CK_DEBUG_POSITION // const TARGET_RECT_STYLE = { +// @if CK_DEBUG_POSITION // outlineWidth: '2px', outlineStyle: 'dashed', outlineColor: 'blue', outlineOffset: '2px' +// @if CK_DEBUG_POSITION // }; +// @if CK_DEBUG_POSITION // const VISIBLE_TARGET_RECT_STYLE = { +// @if CK_DEBUG_POSITION // ...diagonalStylesBlack, +// @if CK_DEBUG_POSITION // opacity: '1', +// @if CK_DEBUG_POSITION // backgroundColor: '#00000033', +// @if CK_DEBUG_POSITION // outlineWidth: '2px' +// @if CK_DEBUG_POSITION // }; +// @if CK_DEBUG_POSITION // const VIEWPORT_RECT_STYLE = { +// @if CK_DEBUG_POSITION // outlineWidth: '2px', +// @if CK_DEBUG_POSITION // outlineOffset: '-2px', +// @if CK_DEBUG_POSITION // outlineStyle: 'solid', +// @if CK_DEBUG_POSITION // outlineColor: 'red' +// @if CK_DEBUG_POSITION // }; +// @if CK_DEBUG_POSITION // const VISIBLE_LIMITER_RECT_STYLE = { +// @if CK_DEBUG_POSITION // ...diagonalStylesGreen, +// @if CK_DEBUG_POSITION // outlineWidth: '2px', +// @if CK_DEBUG_POSITION // outlineOffset: '-2px' +// @if CK_DEBUG_POSITION // }; +// @if CK_DEBUG_POSITION // const ELEMENT_RECT_STYLE = { +// @if CK_DEBUG_POSITION // outlineWidth: '2px', outlineColor: 'orange', outlineOffset: '-2px' +// @if CK_DEBUG_POSITION // }; +// @if CK_DEBUG_POSITION // const CHOSEN_POSITION_RECT_STYLE = { +// @if CK_DEBUG_POSITION // opacity: .5, outlineColor: 'magenta', backgroundColor: 'magenta' +// @if CK_DEBUG_POSITION // }; +/** + * Calculates the `position: absolute` coordinates of a given element so it can be positioned with respect to the + * target in the visually most efficient way, taking various restrictions like viewport or limiter geometry + * into consideration. + * + * **Note**: If there are no position coordinates found that meet the requirements (arguments of this helper), + * `null` is returned. + * + * ```ts + * // The element which is to be positioned. + * const element = document.body.querySelector( '#toolbar' ); + * + * // A target to which the element is positioned relatively. + * const target = document.body.querySelector( '#container' ); + * + * // Finding the optimal coordinates for the positioning. + * const { left, top, name } = getOptimalPosition( { + * element: element, + * target: target, + * + * // The algorithm will chose among these positions to meet the requirements such + * // as "limiter" element or "fitInViewport", set below. The positions are considered + * // in the order of the array. + * positions: [ + * // + * // [ Target ] + * // +-----------------+ + * // | Element | + * // +-----------------+ + * // + * targetRect => ( { + * top: targetRect.bottom, + * left: targetRect.left, + * name: 'mySouthEastPosition' + * } ), + * + * // + * // +-----------------+ + * // | Element | + * // +-----------------+ + * // [ Target ] + * // + * ( targetRect, elementRect ) => ( { + * top: targetRect.top - elementRect.height, + * left: targetRect.left, + * name: 'myNorthEastPosition' + * } ) + * ], + * + * // Find a position such guarantees the element remains within visible boundaries of . + * limiter: document.body, + * + * // Find a position such guarantees the element remains within visible boundaries of the browser viewport. + * fitInViewport: true + * } ); + * + * // The best position which fits into document.body and the viewport. May be useful + * // to set proper class on the `element`. + * console.log( name ); // -> "myNorthEastPosition" + * + * // Using the absolute coordinates which has been found to position the element + * // as in the diagram depicting the "myNorthEastPosition" position. + * element.style.top = top; + * element.style.left = left; + * ``` + * + * @param options The input data and configuration of the helper. + */ +export function getOptimalPosition({ element, target, positions, limiter, fitInViewport, viewportOffsetConfig }) { + // If the {@link module:utils/dom/position~Options#target} is a function, use what it returns. + // https://github.com/ckeditor/ckeditor5-utils/issues/157 + if (isFunction(target)) { + target = target(); + } + // If the {@link module:utils/dom/position~Options#limiter} is a function, use what it returns. + // https://github.com/ckeditor/ckeditor5-ui/issues/260 + if (isFunction(limiter)) { + limiter = limiter(); + } + const positionedElementAncestor = getPositionedAncestor(element); + const constrainedViewportRect = getConstrainedViewportRect(viewportOffsetConfig); + const elementRect = new Rect(element); + const visibleTargetRect = getVisibleViewportIntersectionRect(target, constrainedViewportRect); + let bestPosition; + // @if CK_DEBUG_POSITION // const targetRect = new Rect( target ); + // @if CK_DEBUG_POSITION // RectDrawer.clear(); + // @if CK_DEBUG_POSITION // RectDrawer.draw( targetRect, TARGET_RECT_STYLE, 'Target' ); + // @if CK_DEBUG_POSITION // if ( constrainedViewportRect ) { + // @if CK_DEBUG_POSITION // RectDrawer.draw( constrainedViewportRect, VIEWPORT_RECT_STYLE, 'Viewport' ); + // @if CK_DEBUG_POSITION // } + // If the target got cropped by ancestors or went off the screen, positioning does not make any sense. + if (!visibleTargetRect || !constrainedViewportRect.getIntersection(visibleTargetRect)) { + return null; + } + // @if CK_DEBUG_POSITION // RectDrawer.draw( visibleTargetRect, VISIBLE_TARGET_RECT_STYLE, 'VisTgt' ); + const positionOptions = { + targetRect: visibleTargetRect, + elementRect, + positionedElementAncestor, + viewportRect: constrainedViewportRect + }; + // If there are no limits, just grab the very first position and be done with that drama. + if (!limiter && !fitInViewport) { + bestPosition = new PositionObject(positions[0], positionOptions); + } + else { + if (limiter) { + const visibleLimiterRect = getVisibleViewportIntersectionRect(limiter, constrainedViewportRect); + if (visibleLimiterRect) { + positionOptions.limiterRect = visibleLimiterRect; + // @if CK_DEBUG_POSITION // RectDrawer.draw( visibleLimiterRect, VISIBLE_LIMITER_RECT_STYLE, 'VisLim' ); + } + } + // If there's no best position found, i.e. when all intersections have no area because + // rects have no width or height, then just return `null` + bestPosition = getBestPosition(positions, positionOptions); + } + return bestPosition; +} +/** + * Returns intersection of visible source `Rect` with Viewport `Rect`. In case when source `Rect` is not visible + * or there is no intersection between source `Rect` and Viewport `Rect`, `null` will be returned. + */ +function getVisibleViewportIntersectionRect(source, viewportRect) { + const visibleSourceRect = new Rect(source).getVisible(); + if (!visibleSourceRect) { + return null; + } + return visibleSourceRect.getIntersection(viewportRect); +} +/** + * Returns a viewport `Rect` shrunk by the viewport offset config from all sides. + */ +function getConstrainedViewportRect(viewportOffsetConfig) { + viewportOffsetConfig = Object.assign({ top: 0, bottom: 0, left: 0, right: 0 }, viewportOffsetConfig); + const viewportRect = new Rect(global.window); + viewportRect.top += viewportOffsetConfig.top; + viewportRect.height -= viewportOffsetConfig.top; + viewportRect.bottom -= viewportOffsetConfig.bottom; + viewportRect.height -= viewportOffsetConfig.bottom; + return viewportRect; +} +/** + * For a given array of positioning functions, returns such that provides the best + * fit of the `elementRect` into the `limiterRect` and `viewportRect`. + */ +function getBestPosition(positions, options) { + const { elementRect } = options; + // This is when element is fully visible. + const elementRectArea = elementRect.getArea(); + const positionInstances = positions + .map(positioningFunction => new PositionObject(positioningFunction, options)) + // Some positioning functions may return `null` if they don't want to participate. + .filter(position => !!position.name); + let maxFitFactor = 0; + let bestPosition = null; + for (const position of positionInstances) { + const { limiterIntersectionArea, viewportIntersectionArea } = position; + // If a such position is found that element is fully contained by the limiter then, obviously, + // there will be no better one, so finishing. + if (limiterIntersectionArea === elementRectArea) { + // @if CK_DEBUG_POSITION // RectDrawer.draw( position._rect, CHOSEN_POSITION_RECT_STYLE, [ + // @if CK_DEBUG_POSITION // position.name, + // @if CK_DEBUG_POSITION // '100% fit', + // @if CK_DEBUG_POSITION // ].join( '\n' ) ); + return position; + } + // To maximize both viewport and limiter intersection areas we use distance on _viewportIntersectionArea + // and _limiterIntersectionArea plane (without sqrt because we are looking for max value). + const fitFactor = viewportIntersectionArea ** 2 + limiterIntersectionArea ** 2; + // @if CK_DEBUG_POSITION // RectDrawer.draw( position._rect, { opacity: .4 }, [ + // @if CK_DEBUG_POSITION // position.name, + // @if CK_DEBUG_POSITION // 'Vi=' + Math.round( viewportIntersectionArea ), + // @if CK_DEBUG_POSITION // 'Li=' + Math.round( limiterIntersectionArea ) + // @if CK_DEBUG_POSITION // ].join( '\n' ) ); + if (fitFactor > maxFitFactor) { + maxFitFactor = fitFactor; + bestPosition = position; + } + } + // @if CK_DEBUG_POSITION // if ( bestPosition ) { + // @if CK_DEBUG_POSITION // RectDrawer.draw( bestPosition._rect, CHOSEN_POSITION_RECT_STYLE ); + // @if CK_DEBUG_POSITION // } + return bestPosition; +} +/** + * A position class which instances are created and used by the {@link module:utils/dom/position~getOptimalPosition} helper. + * + * {@link module:utils/dom/position~Position#top} and {@link module:utils/dom/position~Position#left} properties of the position instance + * translate directly to the `top` and `left` properties in CSS "`position: absolute` coordinate system". If set on the positioned element + * in DOM, they will make it display it in the right place in the viewport. + */ +class PositionObject { + /** + * Creates an instance of the {@link module:utils/dom/position~PositionObject} class. + * + * @param positioningFunction function The function that defines the expected + * coordinates the positioned element should move to. + * @param options options object. + * @param options.elementRect The positioned element rect. + * @param options.targetRect The target element rect. + * @param options.viewportRect The viewport rect. + * @param options.limiterRect The limiter rect. + * @param options.positionedElementAncestor Nearest element ancestor element which CSS position is not "static". + */ + constructor(positioningFunction, options) { + const positioningFunctionOutput = positioningFunction(options.targetRect, options.elementRect, options.viewportRect, options.limiterRect); + // Nameless position for a function that didn't participate. + if (!positioningFunctionOutput) { + return; + } + const { left, top, name, config } = positioningFunctionOutput; + this.name = name; + this.config = config; + this._positioningFunctionCoordinates = { left, top }; + this._options = options; + } + /** + * The left value in pixels in the CSS `position: absolute` coordinate system. + * Set it on the positioned element in DOM to move it to the position. + */ + get left() { + return this._absoluteRect.left; + } + /** + * The top value in pixels in the CSS `position: absolute` coordinate system. + * Set it on the positioned element in DOM to move it to the position. + */ + get top() { + return this._absoluteRect.top; + } + /** + * An intersection area between positioned element and limiter within viewport constraints. + */ + get limiterIntersectionArea() { + const limiterRect = this._options.limiterRect; + if (limiterRect) { + return limiterRect.getIntersectionArea(this._rect); + } + return 0; + } + /** + * An intersection area between positioned element and viewport. + */ + get viewportIntersectionArea() { + const viewportRect = this._options.viewportRect; + return viewportRect.getIntersectionArea(this._rect); + } + /** + * An already positioned element rect. A clone of the element rect passed to the constructor + * but placed in the viewport according to the positioning function. + */ + get _rect() { + if (this._cachedRect) { + return this._cachedRect; + } + this._cachedRect = this._options.elementRect.clone().moveTo(this._positioningFunctionCoordinates.left, this._positioningFunctionCoordinates.top); + return this._cachedRect; + } + /** + * An already absolutely positioned element rect. See ({@link #_rect}). + */ + get _absoluteRect() { + if (this._cachedAbsoluteRect) { + return this._cachedAbsoluteRect; + } + this._cachedAbsoluteRect = this._rect.toAbsoluteRect(); + return this._cachedAbsoluteRect; + } +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.d.ts new file mode 100644 index 0000000..6ab21a7 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.d.ts @@ -0,0 +1,195 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A helper class representing a `ClientRect` object, e.g. value returned by + * the native `object.getBoundingClientRect()` method. Provides a set of methods + * to manipulate the rect and compare it against other rect instances. + */ +export default class Rect { + /** + * The "top" value of the rect. + * + * @readonly + */ + top: number; + /** + * The "right" value of the rect. + * + * @readonly + */ + right: number; + /** + * The "bottom" value of the rect. + * + * @readonly + */ + bottom: number; + /** + * The "left" value of the rect. + * + * @readonly + */ + left: number; + /** + * The "width" value of the rect. + * + * @readonly + */ + width: number; + /** + * The "height" value of the rect. + * + * @readonly + */ + height: number; + /** + * The object this rect is for. + * + * @readonly + */ + private _source; + /** + * Creates an instance of rect. + * + * ```ts + * // Rect of an HTMLElement. + * const rectA = new Rect( document.body ); + * + * // Rect of a DOM Range. + * const rectB = new Rect( document.getSelection().getRangeAt( 0 ) ); + * + * // Rect of a window (web browser viewport). + * const rectC = new Rect( window ); + * + * // Rect out of an object. + * const rectD = new Rect( { top: 0, right: 10, bottom: 10, left: 0, width: 10, height: 10 } ); + * + * // Rect out of another Rect instance. + * const rectE = new Rect( rectD ); + * + * // Rect out of a ClientRect. + * const rectF = new Rect( document.body.getClientRects().item( 0 ) ); + * ``` + * + * **Note**: By default a rect of an HTML element includes its CSS borders and scrollbars (if any) + * ant the rect of a `window` includes scrollbars too. Use {@link #excludeScrollbarsAndBorders} + * to get the inner part of the rect. + * + * @param source A source object to create the rect. + */ + constructor(source: RectSource); + /** + * Returns a clone of the rect. + * + * @returns A cloned rect. + */ + clone(): Rect; + /** + * Moves the rect so that its upper–left corner lands in desired `[ x, y ]` location. + * + * @param x Desired horizontal location. + * @param y Desired vertical location. + * @returns A rect which has been moved. + */ + moveTo(x: number, y: number): this; + /** + * Moves the rect in–place by a dedicated offset. + * + * @param x A horizontal offset. + * @param y A vertical offset + * @returns A rect which has been moved. + */ + moveBy(x: number, y: number): this; + /** + * Returns a new rect a a result of intersection with another rect. + */ + getIntersection(anotherRect: Rect): Rect | null; + /** + * Returns the area of intersection with another rect. + * + * @returns Area of intersection. + */ + getIntersectionArea(anotherRect: Rect): number; + /** + * Returns the area of the rect. + */ + getArea(): number; + /** + * Returns a new rect, a part of the original rect, which is actually visible to the user and is relative to the,`body`, + * e.g. an original rect cropped by parent element rects which have `overflow` set in CSS + * other than `"visible"`. + * + * If there's no such visible rect, which is when the rect is limited by one or many of + * the ancestors, `null` is returned. + * + * **Note**: This method does not consider the boundaries of the viewport (window). + * To get a rect cropped by all ancestors and the viewport, use an intersection such as: + * + * ```ts + * const visibleInViewportRect = new Rect( window ).getIntersection( new Rect( source ).getVisible() ); + * ``` + * + * @returns A visible rect instance or `null`, if there's none. + */ + getVisible(): Rect | null; + /** + * Checks if all property values ({@link #top}, {@link #left}, {@link #right}, + * {@link #bottom}, {@link #width} and {@link #height}) are the equal in both rect + * instances. + * + * @param anotherRect A rect instance to compare with. + * @returns `true` when Rects are equal. `false` otherwise. + */ + isEqual(anotherRect: Rect): boolean; + /** + * Checks whether a rect fully contains another rect instance. + * + * @param anotherRect + * @returns `true` if contains, `false` otherwise. + */ + contains(anotherRect: Rect): boolean; + /** + * Recalculates screen coordinates to coordinates relative to the positioned ancestor offset. + */ + toAbsoluteRect(): Rect; + /** + * Excludes scrollbars and CSS borders from the rect. + * + * * Borders are removed when {@link #_source} is an HTML element. + * * Scrollbars are excluded from HTML elements and the `window`. + * + * @returns A rect which has been updated. + */ + excludeScrollbarsAndBorders(): this; + /** + * Returns an array of rects of the given native DOM Range. + * + * @param range A native DOM range. + * @returns DOM Range rects. + */ + static getDomRangeRects(range: Range): Array; + /** + * Returns a bounding rectangle that contains all the given `rects`. + * + * @param rects A list of rectangles that should be contained in the result rectangle. + * @returns Bounding rectangle or `null` if no `rects` were given. + */ + static getBoundingRect(rects: Iterable): Rect | null; +} +/** + * A source of {@link module:utils/dom/rect~Rect}. + */ +export type RectSource = HTMLElement | Range | Window | RectLike; +/** + * An object that describes properties of `ClientRect` object. + */ +export interface RectLike { + readonly top: number; + readonly right: number; + readonly bottom: number; + readonly left: number; + readonly width: number; + readonly height: number; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.js new file mode 100644 index 0000000..76a6001 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/rect.js @@ -0,0 +1,474 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/rect + */ +import isRange from './isrange.js'; +import isWindow from './iswindow.js'; +import getBorderWidths from './getborderwidths.js'; +import isText from './istext.js'; +import getPositionedAncestor from './getpositionedancestor.js'; +import global from './global.js'; +const rectProperties = ['top', 'right', 'bottom', 'left', 'width', 'height']; +/** + * A helper class representing a `ClientRect` object, e.g. value returned by + * the native `object.getBoundingClientRect()` method. Provides a set of methods + * to manipulate the rect and compare it against other rect instances. + */ +export default class Rect { + /** + * Creates an instance of rect. + * + * ```ts + * // Rect of an HTMLElement. + * const rectA = new Rect( document.body ); + * + * // Rect of a DOM Range. + * const rectB = new Rect( document.getSelection().getRangeAt( 0 ) ); + * + * // Rect of a window (web browser viewport). + * const rectC = new Rect( window ); + * + * // Rect out of an object. + * const rectD = new Rect( { top: 0, right: 10, bottom: 10, left: 0, width: 10, height: 10 } ); + * + * // Rect out of another Rect instance. + * const rectE = new Rect( rectD ); + * + * // Rect out of a ClientRect. + * const rectF = new Rect( document.body.getClientRects().item( 0 ) ); + * ``` + * + * **Note**: By default a rect of an HTML element includes its CSS borders and scrollbars (if any) + * ant the rect of a `window` includes scrollbars too. Use {@link #excludeScrollbarsAndBorders} + * to get the inner part of the rect. + * + * @param source A source object to create the rect. + */ + constructor(source) { + const isSourceRange = isRange(source); + Object.defineProperty(this, '_source', { + // If the source is a Rect instance, copy it's #_source. + value: source._source || source, + writable: true, + enumerable: false + }); + if (isDomElement(source) || isSourceRange) { + // The `Rect` class depends on `getBoundingClientRect` and `getClientRects` DOM methods. If the source + // of a rect in an HTML element or a DOM range but it does not belong to any rendered DOM tree, these methods + // will fail to obtain the geometry and the rect instance makes little sense to the features using it. + // To get rid of this warning make sure the source passed to the constructor is a descendant of `window.document.body`. + // @if CK_DEBUG // const sourceNode = isSourceRange ? source.startContainer : source; + // @if CK_DEBUG // if ( !sourceNode.ownerDocument || !sourceNode.ownerDocument.body.contains( sourceNode ) ) { + // @if CK_DEBUG // console.warn( + // @if CK_DEBUG // 'rect-source-not-in-dom: The source of this rect does not belong to any rendered DOM tree.', + // @if CK_DEBUG // { source } ); + // @if CK_DEBUG // } + if (isSourceRange) { + const rangeRects = Rect.getDomRangeRects(source); + copyRectProperties(this, Rect.getBoundingRect(rangeRects)); + } + else { + copyRectProperties(this, source.getBoundingClientRect()); + } + } + else if (isWindow(source)) { + const { innerWidth, innerHeight } = source; + copyRectProperties(this, { + top: 0, + right: innerWidth, + bottom: innerHeight, + left: 0, + width: innerWidth, + height: innerHeight + }); + } + else { + copyRectProperties(this, source); + } + } + /** + * Returns a clone of the rect. + * + * @returns A cloned rect. + */ + clone() { + return new Rect(this); + } + /** + * Moves the rect so that its upper–left corner lands in desired `[ x, y ]` location. + * + * @param x Desired horizontal location. + * @param y Desired vertical location. + * @returns A rect which has been moved. + */ + moveTo(x, y) { + this.top = y; + this.right = x + this.width; + this.bottom = y + this.height; + this.left = x; + return this; + } + /** + * Moves the rect in–place by a dedicated offset. + * + * @param x A horizontal offset. + * @param y A vertical offset + * @returns A rect which has been moved. + */ + moveBy(x, y) { + this.top += y; + this.right += x; + this.left += x; + this.bottom += y; + return this; + } + /** + * Returns a new rect a a result of intersection with another rect. + */ + getIntersection(anotherRect) { + const rect = { + top: Math.max(this.top, anotherRect.top), + right: Math.min(this.right, anotherRect.right), + bottom: Math.min(this.bottom, anotherRect.bottom), + left: Math.max(this.left, anotherRect.left), + width: 0, + height: 0 + }; + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; + if (rect.width < 0 || rect.height < 0) { + return null; + } + else { + const newRect = new Rect(rect); + newRect._source = this._source; + return newRect; + } + } + /** + * Returns the area of intersection with another rect. + * + * @returns Area of intersection. + */ + getIntersectionArea(anotherRect) { + const rect = this.getIntersection(anotherRect); + if (rect) { + return rect.getArea(); + } + else { + return 0; + } + } + /** + * Returns the area of the rect. + */ + getArea() { + return this.width * this.height; + } + /** + * Returns a new rect, a part of the original rect, which is actually visible to the user and is relative to the,`body`, + * e.g. an original rect cropped by parent element rects which have `overflow` set in CSS + * other than `"visible"`. + * + * If there's no such visible rect, which is when the rect is limited by one or many of + * the ancestors, `null` is returned. + * + * **Note**: This method does not consider the boundaries of the viewport (window). + * To get a rect cropped by all ancestors and the viewport, use an intersection such as: + * + * ```ts + * const visibleInViewportRect = new Rect( window ).getIntersection( new Rect( source ).getVisible() ); + * ``` + * + * @returns A visible rect instance or `null`, if there's none. + */ + getVisible() { + const source = this._source; + let visibleRect = this.clone(); + // There's no ancestor to crop with the overflow. + if (isBody(source)) { + return visibleRect; + } + let child = source; + let parent = source.parentNode || source.commonAncestorContainer; + let absolutelyPositionedChildElement; + // Check the ancestors all the way up to the . + while (parent && !isBody(parent)) { + const isParentOverflowVisible = getElementOverflow(parent) === 'visible'; + if (child instanceof HTMLElement && getElementPosition(child) === 'absolute') { + absolutelyPositionedChildElement = child; + } + const parentElementPosition = getElementPosition(parent); + // The child will be cropped only if it has `position: absolute` and the parent has `position: relative` + some overflow. + // Otherwise there's no chance of visual clipping and the parent can be skipped + // https://github.com/ckeditor/ckeditor5/issues/14107. + // + // condition: isParentOverflowVisible + // +---------------------------+ + // | #parent | + // | (overflow: visible) | + // | +-----------+---------------+ + // | | child | + // | +-----------+---------------+ + // +---------------------------+ + // + // condition: absolutelyPositionedChildElement && parentElementPosition === 'relative' && isParentOverflowVisible + // +---------------------------+ + // | parent | + // | (position: relative;) | + // | (overflow: visible;) | + // | +-----------+---------------+ + // | | child | + // | | (position: absolute;) | + // | +-----------+---------------+ + // +---------------------------+ + // + // condition: absolutelyPositionedChildElement && parentElementPosition !== 'relative' + // +---------------------------+ + // | parent | + // | (position: static;) | + // | +-----------+---------------+ + // | | child | + // | | (position: absolute;) | + // | +-----------+---------------+ + // +---------------------------+ + if (isParentOverflowVisible || + absolutelyPositionedChildElement && ((parentElementPosition === 'relative' && isParentOverflowVisible) || + parentElementPosition !== 'relative')) { + child = parent; + parent = parent.parentNode; + continue; + } + const parentRect = new Rect(parent); + const intersectionRect = visibleRect.getIntersection(parentRect); + if (intersectionRect) { + if (intersectionRect.getArea() < visibleRect.getArea()) { + // Reduce the visible rect to the intersection. + visibleRect = intersectionRect; + } + } + else { + // There's no intersection, the rect is completely invisible. + return null; + } + child = parent; + parent = parent.parentNode; + } + return visibleRect; + } + /** + * Checks if all property values ({@link #top}, {@link #left}, {@link #right}, + * {@link #bottom}, {@link #width} and {@link #height}) are the equal in both rect + * instances. + * + * @param anotherRect A rect instance to compare with. + * @returns `true` when Rects are equal. `false` otherwise. + */ + isEqual(anotherRect) { + for (const prop of rectProperties) { + if (this[prop] !== anotherRect[prop]) { + return false; + } + } + return true; + } + /** + * Checks whether a rect fully contains another rect instance. + * + * @param anotherRect + * @returns `true` if contains, `false` otherwise. + */ + contains(anotherRect) { + const intersectRect = this.getIntersection(anotherRect); + return !!(intersectRect && intersectRect.isEqual(anotherRect)); + } + /** + * Recalculates screen coordinates to coordinates relative to the positioned ancestor offset. + */ + toAbsoluteRect() { + const { scrollX, scrollY } = global.window; + const absoluteRect = this.clone().moveBy(scrollX, scrollY); + if (isDomElement(absoluteRect._source)) { + const positionedAncestor = getPositionedAncestor(absoluteRect._source); + if (positionedAncestor) { + shiftRectToCompensatePositionedAncestor(absoluteRect, positionedAncestor); + } + } + return absoluteRect; + } + /** + * Excludes scrollbars and CSS borders from the rect. + * + * * Borders are removed when {@link #_source} is an HTML element. + * * Scrollbars are excluded from HTML elements and the `window`. + * + * @returns A rect which has been updated. + */ + excludeScrollbarsAndBorders() { + const source = this._source; + let scrollBarWidth, scrollBarHeight, direction; + if (isWindow(source)) { + scrollBarWidth = source.innerWidth - source.document.documentElement.clientWidth; + scrollBarHeight = source.innerHeight - source.document.documentElement.clientHeight; + direction = source.getComputedStyle(source.document.documentElement).direction; + } + else { + const borderWidths = getBorderWidths(source); + scrollBarWidth = source.offsetWidth - source.clientWidth - borderWidths.left - borderWidths.right; + scrollBarHeight = source.offsetHeight - source.clientHeight - borderWidths.top - borderWidths.bottom; + direction = source.ownerDocument.defaultView.getComputedStyle(source).direction; + this.left += borderWidths.left; + this.top += borderWidths.top; + this.right -= borderWidths.right; + this.bottom -= borderWidths.bottom; + this.width = this.right - this.left; + this.height = this.bottom - this.top; + } + this.width -= scrollBarWidth; + if (direction === 'ltr') { + this.right -= scrollBarWidth; + } + else { + this.left += scrollBarWidth; + } + this.height -= scrollBarHeight; + this.bottom -= scrollBarHeight; + return this; + } + /** + * Returns an array of rects of the given native DOM Range. + * + * @param range A native DOM range. + * @returns DOM Range rects. + */ + static getDomRangeRects(range) { + const rects = []; + // Safari does not iterate over ClientRectList using for...of loop. + const clientRects = Array.from(range.getClientRects()); + if (clientRects.length) { + for (const rect of clientRects) { + rects.push(new Rect(rect)); + } + } + // If there's no client rects for the Range, use parent container's bounding rect + // instead and adjust rect's width to simulate the actual geometry of such range. + // https://github.com/ckeditor/ckeditor5-utils/issues/153 + // https://github.com/ckeditor/ckeditor5-ui/issues/317 + else { + let startContainer = range.startContainer; + if (isText(startContainer)) { + startContainer = startContainer.parentNode; + } + const rect = new Rect(startContainer.getBoundingClientRect()); + rect.right = rect.left; + rect.width = 0; + rects.push(rect); + } + return rects; + } + /** + * Returns a bounding rectangle that contains all the given `rects`. + * + * @param rects A list of rectangles that should be contained in the result rectangle. + * @returns Bounding rectangle or `null` if no `rects` were given. + */ + static getBoundingRect(rects) { + const boundingRectData = { + left: Number.POSITIVE_INFINITY, + top: Number.POSITIVE_INFINITY, + right: Number.NEGATIVE_INFINITY, + bottom: Number.NEGATIVE_INFINITY, + width: 0, + height: 0 + }; + let rectangleCount = 0; + for (const rect of rects) { + rectangleCount++; + boundingRectData.left = Math.min(boundingRectData.left, rect.left); + boundingRectData.top = Math.min(boundingRectData.top, rect.top); + boundingRectData.right = Math.max(boundingRectData.right, rect.right); + boundingRectData.bottom = Math.max(boundingRectData.bottom, rect.bottom); + } + if (rectangleCount == 0) { + return null; + } + boundingRectData.width = boundingRectData.right - boundingRectData.left; + boundingRectData.height = boundingRectData.bottom - boundingRectData.top; + return new Rect(boundingRectData); + } +} +/** + * Acquires all the rect properties from the passed source. + */ +function copyRectProperties(rect, source) { + for (const p of rectProperties) { + rect[p] = source[p]; + } +} +/** + * Checks if provided object is a HTML element. + */ +function isBody(value) { + if (!isDomElement(value)) { + return false; + } + return value === value.ownerDocument.body; +} +/** + * Checks if provided object "looks like" a DOM Element and has API required by `Rect` class. + */ +function isDomElement(value) { + // Note: earlier we used `isElement()` from lodash library, however that function is less performant because + // it makes complicated checks to make sure that given value is a DOM element. + return value !== null && typeof value === 'object' && value.nodeType === 1 && typeof value.getBoundingClientRect === 'function'; +} +/** + * Returns the value of the `position` style of an `HTMLElement`. + */ +function getElementPosition(element) { + return element instanceof HTMLElement ? element.ownerDocument.defaultView.getComputedStyle(element).position : 'static'; +} +/** + * Returns the value of the `overflow` style of an `HTMLElement` or a `Range`. + */ +function getElementOverflow(element) { + return element instanceof HTMLElement ? element.ownerDocument.defaultView.getComputedStyle(element).overflow : 'visible'; +} +/** + * For a given absolute Rect coordinates object and a positioned element ancestor, it updates its + * coordinates that make up for the position and the scroll of the ancestor. + * + * This is necessary because while Rects (and DOMRects) are relative to the browser's viewport, their coordinates + * are used in real–life to position elements with `position: absolute`, which are scoped by any positioned + * (and scrollable) ancestors. + */ +function shiftRectToCompensatePositionedAncestor(rect, positionedElementAncestor) { + const ancestorPosition = new Rect(positionedElementAncestor); + const ancestorBorderWidths = getBorderWidths(positionedElementAncestor); + let moveX = 0; + let moveY = 0; + // (https://github.com/ckeditor/ckeditor5-ui-default/issues/126) + // If there's some positioned ancestor of the panel, then its `Rect` must be taken into + // consideration. `Rect` is always relative to the viewport while `position: absolute` works + // with respect to that positioned ancestor. + moveX -= ancestorPosition.left; + moveY -= ancestorPosition.top; + // (https://github.com/ckeditor/ckeditor5-utils/issues/139) + // If there's some positioned ancestor of the panel, not only its position must be taken into + // consideration (see above) but also its internal scrolls. Scroll have an impact here because `Rect` + // is relative to the viewport (it doesn't care about scrolling), while `position: absolute` + // must compensate that scrolling. + moveX += positionedElementAncestor.scrollLeft; + moveY += positionedElementAncestor.scrollTop; + // (https://github.com/ckeditor/ckeditor5-utils/issues/139) + // If there's some positioned ancestor of the panel, then its `Rect` includes its CSS `borderWidth` + // while `position: absolute` positioning does not consider it. + // E.g. `{ position: absolute, top: 0, left: 0 }` means upper left corner of the element, + // not upper-left corner of its border. + moveX -= ancestorBorderWidths.left; + moveY -= ancestorBorderWidths.top; + rect.moveBy(moveX, moveY); +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.d.ts new file mode 100644 index 0000000..65e7a44 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.d.ts @@ -0,0 +1,13 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/remove + */ +/** + * Removes given node from parent. + * + * @param node Node to remove. + */ +export default function remove(node: Node): void; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.js new file mode 100644 index 0000000..7942fdc --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/remove.js @@ -0,0 +1,18 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/remove + */ +/** + * Removes given node from parent. + * + * @param node Node to remove. + */ +export default function remove(node) { + const parent = node.parentNode; + if (parent) { + parent.removeChild(node); + } +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.d.ts new file mode 100644 index 0000000..483d1aa --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.d.ts @@ -0,0 +1,74 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * A helper class which instances allow performing custom actions when native DOM elements are resized. + * + * ```ts + * const editableElement = editor.editing.view.getDomRoot(); + * + * const observer = new ResizeObserver( editableElement, entry => { + * console.log( 'The editable element has been resized in DOM.' ); + * console.log( entry.target ); // -> editableElement + * console.log( entry.contentRect.width ); // -> e.g. '423px' + * } ); + * ``` + * + * It uses the [native DOM resize observer](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver) + * under the hood. + */ +export default class ResizeObserver { + /** + * The element observed by this observer. + */ + private readonly _element; + /** + * The callback executed each time {@link #_element} is resized. + */ + private readonly _callback; + /** + * The single native observer instance shared across all {@link module:utils/dom/resizeobserver~ResizeObserver} instances. + */ + private static _observerInstance; + /** + * A mapping of native DOM elements and their callbacks shared across all + * {@link module:utils/dom/resizeobserver~ResizeObserver} instances. + */ + private static _elementCallbacks; + /** + * Creates an instance of the `ResizeObserver` class. + * + * @param element A DOM element that is to be observed for resizing. Note that + * the element must be visible (i.e. not detached from DOM) for the observer to work. + * @param callback A function called when the observed element was resized. It passes + * the [`ResizeObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry) + * object with information about the resize event. + */ + constructor(element: Element, callback: (entry: ResizeObserverEntry) => void); + /** + * The element observed by this observer. + */ + get element(): Element; + /** + * Destroys the observer which disables the `callback` passed to the {@link #constructor}. + */ + destroy(): void; + /** + * Registers a new resize callback for the DOM element. + */ + private static _addElementCallback; + /** + * Removes a resize callback from the DOM element. If no callbacks are left + * for the element, it removes the element from the native observer. + */ + private static _deleteElementCallback; + /** + * Returns are registered resize callbacks for the DOM element. + */ + private static _getElementCallbacks; + /** + * Creates the single native observer shared across all `ResizeObserver` instances. + */ + private static _createObserver; +} diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.js new file mode 100644 index 0000000..eb5610b --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/resizeobserver.js @@ -0,0 +1,127 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/resizeobserver + */ +import global from './global.js'; +/** + * A helper class which instances allow performing custom actions when native DOM elements are resized. + * + * ```ts + * const editableElement = editor.editing.view.getDomRoot(); + * + * const observer = new ResizeObserver( editableElement, entry => { + * console.log( 'The editable element has been resized in DOM.' ); + * console.log( entry.target ); // -> editableElement + * console.log( entry.contentRect.width ); // -> e.g. '423px' + * } ); + * ``` + * + * It uses the [native DOM resize observer](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver) + * under the hood. + */ +class ResizeObserver { + /** + * Creates an instance of the `ResizeObserver` class. + * + * @param element A DOM element that is to be observed for resizing. Note that + * the element must be visible (i.e. not detached from DOM) for the observer to work. + * @param callback A function called when the observed element was resized. It passes + * the [`ResizeObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserverEntry) + * object with information about the resize event. + */ + constructor(element, callback) { + // **Note**: For the maximum performance, this class ensures only a single instance of the native + // observer is used no matter how many instances of this class were created. + if (!ResizeObserver._observerInstance) { + ResizeObserver._createObserver(); + } + this._element = element; + this._callback = callback; + ResizeObserver._addElementCallback(element, callback); + ResizeObserver._observerInstance.observe(element); + } + /** + * The element observed by this observer. + */ + get element() { + return this._element; + } + /** + * Destroys the observer which disables the `callback` passed to the {@link #constructor}. + */ + destroy() { + ResizeObserver._deleteElementCallback(this._element, this._callback); + } + /** + * Registers a new resize callback for the DOM element. + */ + static _addElementCallback(element, callback) { + if (!ResizeObserver._elementCallbacks) { + ResizeObserver._elementCallbacks = new Map(); + } + let callbacks = ResizeObserver._elementCallbacks.get(element); + if (!callbacks) { + callbacks = new Set(); + ResizeObserver._elementCallbacks.set(element, callbacks); + } + callbacks.add(callback); + } + /** + * Removes a resize callback from the DOM element. If no callbacks are left + * for the element, it removes the element from the native observer. + */ + static _deleteElementCallback(element, callback) { + const callbacks = ResizeObserver._getElementCallbacks(element); + // Remove the element callback. Check if exist first in case someone + // called destroy() twice. + if (callbacks) { + callbacks.delete(callback); + // If no callbacks left for the element, also remove the element. + if (!callbacks.size) { + ResizeObserver._elementCallbacks.delete(element); + ResizeObserver._observerInstance.unobserve(element); + } + } + if (ResizeObserver._elementCallbacks && !ResizeObserver._elementCallbacks.size) { + ResizeObserver._observerInstance = null; + ResizeObserver._elementCallbacks = null; + } + } + /** + * Returns are registered resize callbacks for the DOM element. + */ + static _getElementCallbacks(element) { + if (!ResizeObserver._elementCallbacks) { + return null; + } + return ResizeObserver._elementCallbacks.get(element); + } + /** + * Creates the single native observer shared across all `ResizeObserver` instances. + */ + static _createObserver() { + ResizeObserver._observerInstance = new global.window.ResizeObserver(entries => { + for (const entry of entries) { + const callbacks = ResizeObserver._getElementCallbacks(entry.target); + if (callbacks) { + for (const callback of callbacks) { + callback(entry); + } + } + } + }); + } +} +/** + * The single native observer instance shared across all {@link module:utils/dom/resizeobserver~ResizeObserver} instances. + */ +ResizeObserver._observerInstance = null; +/** + * A mapping of native DOM elements and their callbacks shared across all + * {@link module:utils/dom/resizeobserver~ResizeObserver} instances. + */ +ResizeObserver._elementCallbacks = null; +export default ResizeObserver; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.d.ts b/node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.d.ts new file mode 100644 index 0000000..c2a6289 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.d.ts @@ -0,0 +1,73 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +type IfTrue = T extends true ? true : never; +/** + * Makes any page `HTMLElement` or `Range` (`target`) visible inside the browser viewport. + * This helper will scroll all `target` ancestors and the web browser viewport to reveal the target to + * the user. If the `target` is already visible, nothing will happen. + * + * @param options Additional configuration of the scrolling behavior. + * @param options.target A target, which supposed to become visible to the user. + * @param options.viewportOffset An offset from the edge of the viewport (in pixels) + * the `target` will be moved by if the viewport is scrolled. It enhances the user experience + * by keeping the `target` some distance from the edge of the viewport and thus making it easier to + * read or edit by the user. + * @param options.ancestorOffset An offset from the boundary of scrollable ancestors (if any) + * the `target` will be moved by if the viewport is scrolled. It enhances the user experience + * by keeping the `target` some distance from the edge of the ancestors and thus making it easier to + * read or edit by the user. + * @param options.alignToTop When set `true`, the helper will make sure the `target` is scrolled up + * to the top boundary of the viewport and/or scrollable ancestors if scrolled up. When not set + * (default), the `target` will be revealed by scrolling as little as possible. This option will + * not affect `targets` that must be scrolled down because they will appear at the top of the boundary + * anyway. + * + * ``` + * scrollViewportToShowTarget() with scrollViewportToShowTarget() with + * Initial state alignToTop unset (default) alignToTop = true + * + * ┌────────────────────────────────┬─┐ ┌────────────────────────────────┬─┐ ┌────────────────────────────────┬─┐ + * │ │▲│ │ │▲│ │ [ Target to be revealed ] │▲│ + * │ │ │ │ │ │ │ │ │ + * │ │█│ │ │ │ │ │ │ + * │ │█│ │ │ │ │ │ │ + * │ │ │ │ │█│ │ │ │ + * │ │ │ │ │█│ │ │█│ + * │ │ │ │ │ │ │ │█│ + * │ │▼│ │ [ Target to be revealed ] │▼│ │ │▼│ + * └────────────────────────────────┴─┘ └────────────────────────────────┴─┘ └────────────────────────────────┴─┘ + * + * + * [ Target to be revealed ] + *``` + * + * @param options.forceScroll When set `true`, the `target` will be aligned to the top of the viewport + * and scrollable ancestors whether it is already visible or not. This option will only work when `alignToTop` + * is `true` + */ +export declare function scrollViewportToShowTarget>({ target, viewportOffset, ancestorOffset, alignToTop, forceScroll }: { + readonly target: HTMLElement | Range; + readonly viewportOffset?: number | { + top: number; + bottom: number; + left: number; + right: number; + }; + readonly ancestorOffset?: number; + readonly alignToTop?: T; + readonly forceScroll?: U; +}): void; +/** + * Makes any page `HTMLElement` or `Range` (target) visible within its scrollable ancestors, + * e.g. if they have `overflow: scroll` CSS style. + * + * @param target A target, which supposed to become visible to the user. + * @param ancestorOffset An offset between the target and the boundary of scrollable ancestors + * to be maintained while scrolling. + * @param limiterElement The outermost ancestor that should be scrolled. If specified, it can prevent + * scrolling the whole page. + */ +export declare function scrollAncestorsToShowTarget(target: HTMLElement | Range, ancestorOffset?: number, limiterElement?: HTMLElement): void; +export {}; diff --git a/node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.js b/node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.js new file mode 100644 index 0000000..1a09341 --- /dev/null +++ b/node_modules/@ckeditor/ckeditor5-utils/src/dom/scroll.js @@ -0,0 +1,383 @@ +/** + * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ +/** + * @module utils/dom/scroll + */ +import isRange from './isrange.js'; +import Rect from './rect.js'; +import isText from './istext.js'; +/** + * Makes any page `HTMLElement` or `Range` (`target`) visible inside the browser viewport. + * This helper will scroll all `target` ancestors and the web browser viewport to reveal the target to + * the user. If the `target` is already visible, nothing will happen. + * + * @param options Additional configuration of the scrolling behavior. + * @param options.target A target, which supposed to become visible to the user. + * @param options.viewportOffset An offset from the edge of the viewport (in pixels) + * the `target` will be moved by if the viewport is scrolled. It enhances the user experience + * by keeping the `target` some distance from the edge of the viewport and thus making it easier to + * read or edit by the user. + * @param options.ancestorOffset An offset from the boundary of scrollable ancestors (if any) + * the `target` will be moved by if the viewport is scrolled. It enhances the user experience + * by keeping the `target` some distance from the edge of the ancestors and thus making it easier to + * read or edit by the user. + * @param options.alignToTop When set `true`, the helper will make sure the `target` is scrolled up + * to the top boundary of the viewport and/or scrollable ancestors if scrolled up. When not set + * (default), the `target` will be revealed by scrolling as little as possible. This option will + * not affect `targets` that must be scrolled down because they will appear at the top of the boundary + * anyway. + * + * ``` + * scrollViewportToShowTarget() with scrollViewportToShowTarget() with + * Initial state alignToTop unset (default) alignToTop = true + * + * ┌────────────────────────────────┬─┐ ┌────────────────────────────────┬─┐ ┌────────────────────────────────┬─┐ + * │ │▲│ │ │▲│ │ [ Target to be revealed ] │▲│ + * │ │ │ │ │ │ │ │ │ + * │ │█│ │ │ │ │ │ │ + * │ │█│ │ │ │ │ │ │ + * │ │ │ │ │█│ │ │ │ + * │ │ │ │ │█│ │ │█│ + * │ │ │ │ │ │ │ │█│ + * │ │▼│ │ [ Target to be revealed ] │▼│ │ │▼│ + * └────────────────────────────────┴─┘ └────────────────────────────────┴─┘ └────────────────────────────────┴─┘ + * + * + * [ Target to be revealed ] + *``` + * + * @param options.forceScroll When set `true`, the `target` will be aligned to the top of the viewport + * and scrollable ancestors whether it is already visible or not. This option will only work when `alignToTop` + * is `true` + */ +export function scrollViewportToShowTarget({ target, viewportOffset = 0, ancestorOffset = 0, alignToTop, forceScroll }) { + const targetWindow = getWindow(target); + let currentWindow = targetWindow; + let currentFrame = null; + viewportOffset = normalizeViewportOffset(viewportOffset); + // Iterate over all windows, starting from target's parent window up to window#top. + while (currentWindow) { + let firstAncestorToScroll; + // Let's scroll target's ancestors first to reveal it. Then, once the ancestor scrolls + // settled down, the algorithm can eventually scroll the viewport of the current window. + // + // Note: If the current window is target's **original** window (e.g. the first one), + // start scrolling the closest parent of the target. If not, scroll the closest parent + // of an iframe that resides in the current window. + if (currentWindow == targetWindow) { + firstAncestorToScroll = getParentElement(target); + } + else { + firstAncestorToScroll = getParentElement(currentFrame); + } + // Scroll the target's ancestors first. Once done, scrolling the viewport is easy. + scrollAncestorsToShowRect({ + parent: firstAncestorToScroll, + getRect: () => { + // Note: If the target does not belong to the current window **directly**, + // i.e. it resides in an iframe belonging to the window, obtain the target's rect + // in the coordinates of the current window. By default, a Rect returns geometry + // relative to the current window's viewport. To make it work in a parent window, + // it must be shifted. + return getRectRelativeToWindow(target, currentWindow); + }, + alignToTop, + ancestorOffset, + forceScroll + }); + // Obtain the rect of the target after it has been scrolled within its ancestors. + // It's time to scroll the viewport. + const targetRect = getRectRelativeToWindow(target, currentWindow); + scrollWindowToShowRect({ + window: currentWindow, + rect: targetRect, + viewportOffset, + alignToTop, + forceScroll + }); + if (currentWindow.parent != currentWindow) { + // Keep the reference to the -

    +
    +
    +
    +
    - - -
    -
    -
    -
    -
    -
    -
    - Message Us -

    Get Any Consultations ? - Contact With Us

    -
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + Message Us +

    Get Any Consultations ? + Contact With Us

    -
    -
    -
    -
    -
    -
    -
    - -
    +
    +
    +
    +
    + +
    +
    +
    +
    -
    -
    - -
    +
    +
    +
    +
    -
    -
    - -
    +
    +
    +
    +
    -
    -
    - -
    +
    +
    +
    +
    -
    -
    - -
    +
    +
    +
    +
    - -
    +
    +
    -
    - -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 295fdbcf369c9ac37da015c147261732e583b262 Mon Sep 17 00:00:00 2001 From: Mohammed Shahnawaz <97173613+imshn@users.noreply.github.com> Date: Sun, 12 May 2024 15:20:59 +0000 Subject: [PATCH 3/6] Bugs fixes --- app.js | 4 +- public/contact.html | 30 +- public/service.html | 760 -------------------------------------------- 3 files changed, 26 insertions(+), 768 deletions(-) delete mode 100644 public/service.html diff --git a/app.js b/app.js index b83e98e..85d857b 100644 --- a/app.js +++ b/app.js @@ -13,7 +13,7 @@ const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: "thewebgenix@gmail.com", - pass: "Ineedthispassword", + pass: "ineedthispassword", } }); @@ -23,7 +23,7 @@ app.get('/', (req, res) => { }); app.get("/service", (req, res) => { - res.sendFile("service.html", { root: path.join(__dirname, 'public') }) + res.sendFile("service-details.html", { root: path.join(__dirname, 'public') }) }) app.get("/about", (req, res) => { diff --git a/public/contact.html b/public/contact.html index 0aca899..71e5b21 100644 --- a/public/contact.html +++ b/public/contact.html @@ -399,15 +399,33 @@

    Subscribe Our $(document).ready(function () { $('#contactForm').submit(function (e) { e.preventDefault(); // Prevent form submission + const API_USERNAME = 'your-mailtrap-username'; + const API_PASSWORD = 'your-mailtrap-password'; + const MAILTRAP_INBOX_ID = 'your-mailtrap-inbox-id'; - // Get form data - var formData = { - name: $('#name').val(), - email: $('#email').val(), - email: $('#phone').val(), - message: $('#message').val() + // Mailtrap API URL + const MAILTRAP_API_URL = `https://mailtrap.io/api/v1/inboxes/${MAILTRAP_INBOX_ID}/messages`; + + // Email data + + let name = $('#name').val() + let email = $('#email').val() + let phone = $('#phone').val() + let message = $('#message').val() + + const emailData = { + from_email: 'from@example.com', + to_email: 'to@example.com', + subject: 'Test Email from Node.js', + html_body: `

    Name:

    ${name}
    +

    Email:

    ${email}
    +

    Phone:

    ${phone}
    +

    Message:

    ${message}` }; + + + // Submit form data using AJAX $.ajax({ type: 'POST', diff --git a/public/service.html b/public/service.html deleted file mode 100644 index f4142d3..0000000 --- a/public/service.html +++ /dev/null @@ -1,760 +0,0 @@ - - - - - - - - - - - - - WebGenix | Our Services - - - - - - - - - - - -
    -
    -
    -
    -
    -
    - - -
    -
    -
    - -
    -
    About Us
    -

    - Trusted IT experts delivering innovative solutions, stellar service, and lasting partnerships -

    -
    -
    -
    Contact Us
    - -
    - -
    -
    - -
    - - -
    - - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -

    Our Services

    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - What We Do -

    Popular Solution For Growth Business

    -

    - Professional Design Agency to provide solutions -

    -
    -

    - A professional design agency crafting popular solutions for - business growth. Our creative experts strategize compelling - designs that resonate with audiences, propelling brands toward - success through inspired visuals and seamless user experiences. -

    - Discover More -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    - Features -

    Build Your Business Workflow Faster

    -

    - Professional Design Agency to provide solutions -

    -
    -

    - Streamline your business operations with our efficient workflow - solutions. Accelerate productivity and maximize output through - optimized processes tailored to your needs. -

    - Discover More -
    -
    -
    -
    -
    -
    -

    Workflow

    -

    - Optimize operations and supercharge productivity with our - streamlined workflow solutions, designed to enhance - efficiency. -

    -
    -
    -
    -
    -

    Design Strategy

    -

    - Craft a visionary design strategy that aligns aesthetics, - functionality and brand identity for maximum impact. -

    -
    -
    -
    -
    -

    Web Development

    -

    - Elevate your online presence with our cutting-edge web - development services, delivering seamless user experiences. -

    -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    - Process -

    How Does We Works

    -

    Professional Design Agency to provide solutions

    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Project Layouts

    -

    - refers to the initial phase of a project where the - foundational structure and design are planned and established. - -

    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Project Analysis

    -

    - is the process of critically examining various aspects of the - project to gain insights, identify potential challenges, and - make informed decisions. -

    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Final Results

    -

    - marks the culmination of the project, showcasing the outcomes - of the team's efforts and the realization of the project's - objectives. -

    -
    -
    -
    -
    -
    -
    - - -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - Working Module -

    Creative Web Design Process

    -

    Professional Design Agency to provide solutions

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - Step 01 -

    Make Smart Plan

    -

    - Thorough research, defining goals, aligning objectives with user needs. -

    -
    -
    -
    -
    -
    -
    - -
    -
    - Step 02 -

    Prototype

    -

    - Plan set, prototype created, refining ideas, ensuring user satisfaction. -

    -
    -
    -
    -
    -
    -
    - -
    -
    - Step 03 -

    Development

    -

    - Prototype approved, design transitions to coding for functional, responsive website. -

    -
    -
    -
    -
    -
    -
    - -
    -
    - Step 04 -

    Get Results

    -

    - Post-launch, analyze metrics to refine website for better performance. -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    - Latest Work -

    Professional Experience

    -

    Professional Design Agency to provide solutions

    -
    -
    -
    -
    - - -
    -
    - Img - -
    - -
    -
    -
    - -
    - - -
    -
    - Img - -
    - -
    -
    -
    - -
    -
    -
    - Img - -
    - -
    -
    -
    - -
    -
    -
    - Img - -
    - -
    -
    -
    - - -
    - - -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -

    Need Any Projects?

    -

    Professional Design Agency to provide solutions

    -
    -
    -
    - -
    -
    -
    -
    - - -
    -
    - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From b0e02f69781bd81acdb812ecc62ba9623867a9b4 Mon Sep 17 00:00:00 2001 From: Mohammed Shahnawaz <97173613+imshn@users.noreply.github.com> Date: Sun, 12 May 2024 15:24:46 +0000 Subject: [PATCH 4/6] deleted 404 page --- public/404.html | 214 ------------------------------------------------ 1 file changed, 214 deletions(-) delete mode 100644 public/404.html diff --git a/public/404.html b/public/404.html deleted file mode 100644 index c4c0b3a..0000000 --- a/public/404.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - DGital - Digital Agency HTML Template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    - Loading... -
    -
    - - - - -
    - - -
    -
    -
    -
    -

    Not Found

    -
    - -
    -
    -
    -
    -
    - - - - -
    -
    -
    -
    - -

    404

    -

    Page Not Found

    -

    We’re sorry, the page you have looked for does not exist in our website! Maybe go to our home page or try to use a search?

    - Go Back To Home -
    -
    -
    -
    - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - \ No newline at end of file From 701d1a66e96760a6591d0f624bff9f241024255c Mon Sep 17 00:00:00 2001 From: Mohammed Shahnawaz <97173613+imshn@users.noreply.github.com> Date: Sun, 12 May 2024 15:43:44 +0000 Subject: [PATCH 5/6] nodemon: script --- node_modules/.bin/nodemon | 1 + node_modules/.bin/nodetouch | 1 + node_modules/.bin/nopt | 1 + node_modules/.bin/semver | 1 + node_modules/.package-lock.json | 322 +++++ node_modules/abbrev/LICENSE | 46 + node_modules/abbrev/README.md | 23 + node_modules/abbrev/abbrev.js | 61 + node_modules/abbrev/package.json | 21 + node_modules/anymatch/LICENSE | 15 + node_modules/anymatch/README.md | 87 ++ node_modules/anymatch/index.d.ts | 20 + node_modules/anymatch/index.js | 104 ++ node_modules/anymatch/package.json | 48 + .../balanced-match/.github/FUNDING.yml | 2 + node_modules/balanced-match/LICENSE.md | 21 + node_modules/balanced-match/README.md | 97 ++ node_modules/balanced-match/index.js | 62 + node_modules/balanced-match/package.json | 48 + .../binary-extensions/binary-extensions.json | 263 ++++ .../binary-extensions.json.d.ts | 3 + node_modules/binary-extensions/index.d.ts | 14 + node_modules/binary-extensions/index.js | 1 + node_modules/binary-extensions/license | 10 + node_modules/binary-extensions/package.json | 40 + node_modules/binary-extensions/readme.md | 25 + node_modules/brace-expansion/LICENSE | 21 + node_modules/brace-expansion/README.md | 129 ++ node_modules/brace-expansion/index.js | 201 +++ node_modules/brace-expansion/package.json | 47 + node_modules/braces/CHANGELOG.md | 184 +++ node_modules/braces/LICENSE | 21 + node_modules/braces/README.md | 593 +++++++++ node_modules/braces/index.js | 170 +++ node_modules/braces/lib/compile.js | 57 + node_modules/braces/lib/constants.js | 57 + node_modules/braces/lib/expand.js | 113 ++ node_modules/braces/lib/parse.js | 333 +++++ node_modules/braces/lib/stringify.js | 32 + node_modules/braces/lib/utils.js | 112 ++ node_modules/braces/package.json | 77 ++ node_modules/chokidar/LICENSE | 21 + node_modules/chokidar/README.md | 308 +++++ node_modules/chokidar/index.js | 973 +++++++++++++++ node_modules/chokidar/lib/constants.js | 66 + node_modules/chokidar/lib/fsevents-handler.js | 526 ++++++++ node_modules/chokidar/lib/nodefs-handler.js | 654 ++++++++++ node_modules/chokidar/package.json | 70 ++ node_modules/chokidar/types/index.d.ts | 192 +++ node_modules/concat-map/.travis.yml | 4 + node_modules/concat-map/LICENSE | 18 + node_modules/concat-map/README.markdown | 62 + node_modules/concat-map/example/map.js | 6 + node_modules/concat-map/index.js | 13 + node_modules/concat-map/package.json | 43 + node_modules/concat-map/test/map.js | 39 + node_modules/fill-range/LICENSE | 21 + node_modules/fill-range/README.md | 237 ++++ node_modules/fill-range/index.js | 249 ++++ node_modules/fill-range/package.json | 69 ++ node_modules/glob-parent/CHANGELOG.md | 110 ++ node_modules/glob-parent/LICENSE | 15 + node_modules/glob-parent/README.md | 137 +++ node_modules/glob-parent/index.js | 42 + node_modules/glob-parent/package.json | 48 + node_modules/has-flag/index.js | 8 + node_modules/has-flag/license | 9 + node_modules/has-flag/package.json | 44 + node_modules/has-flag/readme.md | 70 ++ node_modules/ignore-by-default/LICENSE | 14 + node_modules/ignore-by-default/README.md | 26 + node_modules/ignore-by-default/index.js | 12 + node_modules/ignore-by-default/package.json | 34 + node_modules/is-binary-path/index.d.ts | 17 + node_modules/is-binary-path/index.js | 7 + node_modules/is-binary-path/license | 9 + node_modules/is-binary-path/package.json | 40 + node_modules/is-binary-path/readme.md | 34 + node_modules/is-extglob/LICENSE | 21 + node_modules/is-extglob/README.md | 107 ++ node_modules/is-extglob/index.js | 20 + node_modules/is-extglob/package.json | 69 ++ node_modules/is-glob/LICENSE | 21 + node_modules/is-glob/README.md | 206 ++++ node_modules/is-glob/index.js | 150 +++ node_modules/is-glob/package.json | 81 ++ node_modules/is-number/LICENSE | 21 + node_modules/is-number/README.md | 187 +++ node_modules/is-number/index.js | 18 + node_modules/is-number/package.json | 82 ++ node_modules/minimatch/LICENSE | 15 + node_modules/minimatch/README.md | 230 ++++ node_modules/minimatch/minimatch.js | 947 ++++++++++++++ node_modules/minimatch/package.json | 33 + node_modules/nodemon/.prettierrc.json | 3 + node_modules/nodemon/LICENSE | 21 + node_modules/nodemon/README.md | 462 +++++++ node_modules/nodemon/bin/nodemon.js | 16 + node_modules/nodemon/bin/windows-kill.exe | Bin 0 -> 80384 bytes node_modules/nodemon/doc/cli/authors.txt | 8 + node_modules/nodemon/doc/cli/config.txt | 44 + node_modules/nodemon/doc/cli/help.txt | 29 + node_modules/nodemon/doc/cli/logo.txt | 20 + node_modules/nodemon/doc/cli/options.txt | 36 + node_modules/nodemon/doc/cli/topics.txt | 8 + node_modules/nodemon/doc/cli/usage.txt | 3 + node_modules/nodemon/doc/cli/whoami.txt | 9 + node_modules/nodemon/lib/cli/index.js | 49 + node_modules/nodemon/lib/cli/parse.js | 230 ++++ node_modules/nodemon/lib/config/command.js | 43 + node_modules/nodemon/lib/config/defaults.js | 34 + node_modules/nodemon/lib/config/exec.js | 234 ++++ node_modules/nodemon/lib/config/index.js | 93 ++ node_modules/nodemon/lib/config/load.js | 223 ++++ node_modules/nodemon/lib/help/index.js | 27 + node_modules/nodemon/lib/index.js | 1 + node_modules/nodemon/lib/monitor/index.js | 4 + node_modules/nodemon/lib/monitor/match.js | 276 +++++ node_modules/nodemon/lib/monitor/run.js | 555 +++++++++ node_modules/nodemon/lib/monitor/signals.js | 34 + node_modules/nodemon/lib/monitor/watch.js | 244 ++++ node_modules/nodemon/lib/nodemon.js | 311 +++++ node_modules/nodemon/lib/rules/add.js | 89 ++ node_modules/nodemon/lib/rules/index.js | 53 + node_modules/nodemon/lib/rules/parse.js | 43 + node_modules/nodemon/lib/spawn.js | 74 ++ node_modules/nodemon/lib/utils/bus.js | 44 + node_modules/nodemon/lib/utils/clone.js | 40 + node_modules/nodemon/lib/utils/colour.js | 26 + node_modules/nodemon/lib/utils/index.js | 103 ++ node_modules/nodemon/lib/utils/log.js | 82 ++ node_modules/nodemon/lib/utils/merge.js | 47 + node_modules/nodemon/lib/version.js | 100 ++ .../nodemon/node_modules/debug/LICENSE | 20 + .../nodemon/node_modules/debug/README.md | 481 ++++++++ .../nodemon/node_modules/debug/package.json | 59 + .../nodemon/node_modules/debug/src/browser.js | 269 ++++ .../nodemon/node_modules/debug/src/common.js | 274 +++++ .../nodemon/node_modules/debug/src/index.js | 10 + .../nodemon/node_modules/debug/src/node.js | 263 ++++ node_modules/nodemon/node_modules/ms/index.js | 162 +++ .../nodemon/node_modules/ms/license.md | 21 + .../nodemon/node_modules/ms/package.json | 37 + .../nodemon/node_modules/ms/readme.md | 60 + node_modules/nodemon/package.json | 74 ++ node_modules/nopt/.npmignore | 0 node_modules/nopt/LICENSE | 23 + node_modules/nopt/README.md | 208 ++++ node_modules/nopt/bin/nopt.js | 44 + node_modules/nopt/examples/my-program.js | 30 + node_modules/nopt/lib/nopt.js | 552 +++++++++ node_modules/nopt/package.json | 12 + node_modules/normalize-path/LICENSE | 21 + node_modules/normalize-path/README.md | 127 ++ node_modules/normalize-path/index.js | 35 + node_modules/normalize-path/package.json | 77 ++ node_modules/picomatch/CHANGELOG.md | 136 ++ node_modules/picomatch/LICENSE | 21 + node_modules/picomatch/README.md | 708 +++++++++++ node_modules/picomatch/index.js | 3 + node_modules/picomatch/lib/constants.js | 179 +++ node_modules/picomatch/lib/parse.js | 1091 +++++++++++++++++ node_modules/picomatch/lib/picomatch.js | 342 ++++++ node_modules/picomatch/lib/scan.js | 391 ++++++ node_modules/picomatch/lib/utils.js | 64 + node_modules/picomatch/package.json | 81 ++ node_modules/pstree.remy/.travis.yml | 8 + node_modules/pstree.remy/LICENSE | 7 + node_modules/pstree.remy/README.md | 26 + node_modules/pstree.remy/lib/index.js | 37 + node_modules/pstree.remy/lib/tree.js | 37 + node_modules/pstree.remy/lib/utils.js | 53 + node_modules/pstree.remy/package.json | 33 + .../pstree.remy/tests/fixtures/index.js | 13 + node_modules/pstree.remy/tests/fixtures/out1 | 10 + node_modules/pstree.remy/tests/fixtures/out2 | 29 + node_modules/pstree.remy/tests/index.test.js | 51 + node_modules/readdirp/LICENSE | 21 + node_modules/readdirp/README.md | 122 ++ node_modules/readdirp/index.d.ts | 43 + node_modules/readdirp/index.js | 287 +++++ node_modules/readdirp/package.json | 122 ++ node_modules/semver/LICENSE | 15 + node_modules/semver/README.md | 654 ++++++++++ node_modules/semver/bin/semver.js | 188 +++ node_modules/semver/classes/comparator.js | 141 +++ node_modules/semver/classes/index.js | 5 + node_modules/semver/classes/range.js | 540 ++++++++ node_modules/semver/classes/semver.js | 302 +++++ node_modules/semver/functions/clean.js | 6 + node_modules/semver/functions/cmp.js | 52 + node_modules/semver/functions/coerce.js | 60 + .../semver/functions/compare-build.js | 7 + .../semver/functions/compare-loose.js | 3 + node_modules/semver/functions/compare.js | 5 + node_modules/semver/functions/diff.js | 65 + node_modules/semver/functions/eq.js | 3 + node_modules/semver/functions/gt.js | 3 + node_modules/semver/functions/gte.js | 3 + node_modules/semver/functions/inc.js | 19 + node_modules/semver/functions/lt.js | 3 + node_modules/semver/functions/lte.js | 3 + node_modules/semver/functions/major.js | 3 + node_modules/semver/functions/minor.js | 3 + node_modules/semver/functions/neq.js | 3 + node_modules/semver/functions/parse.js | 16 + node_modules/semver/functions/patch.js | 3 + node_modules/semver/functions/prerelease.js | 6 + node_modules/semver/functions/rcompare.js | 3 + node_modules/semver/functions/rsort.js | 3 + node_modules/semver/functions/satisfies.js | 10 + node_modules/semver/functions/sort.js | 3 + node_modules/semver/functions/valid.js | 6 + node_modules/semver/index.js | 89 ++ node_modules/semver/internal/constants.js | 35 + node_modules/semver/internal/debug.js | 9 + node_modules/semver/internal/identifiers.js | 23 + node_modules/semver/internal/lrucache.js | 40 + node_modules/semver/internal/parse-options.js | 15 + node_modules/semver/internal/re.js | 217 ++++ node_modules/semver/package.json | 77 ++ node_modules/semver/preload.js | 2 + node_modules/semver/range.bnf | 16 + node_modules/semver/ranges/gtr.js | 4 + node_modules/semver/ranges/intersects.js | 7 + node_modules/semver/ranges/ltr.js | 4 + node_modules/semver/ranges/max-satisfying.js | 25 + node_modules/semver/ranges/min-satisfying.js | 24 + node_modules/semver/ranges/min-version.js | 61 + node_modules/semver/ranges/outside.js | 80 ++ node_modules/semver/ranges/simplify.js | 47 + node_modules/semver/ranges/subset.js | 247 ++++ node_modules/semver/ranges/to-comparators.js | 8 + node_modules/semver/ranges/valid.js | 11 + node_modules/simple-update-notifier/LICENSE | 21 + node_modules/simple-update-notifier/README.md | 82 ++ .../simple-update-notifier/build/index.d.ts | 13 + .../simple-update-notifier/build/index.js | 210 ++++ .../simple-update-notifier/package.json | 100 ++ .../src/borderedText.ts | 12 + .../simple-update-notifier/src/cache.spec.ts | 17 + .../simple-update-notifier/src/cache.ts | 44 + .../src/getDistVersion.spec.ts | 35 + .../src/getDistVersion.ts | 29 + .../src/hasNewVersion.spec.ts | 82 ++ .../src/hasNewVersion.ts | 40 + .../simple-update-notifier/src/index.spec.ts | 27 + .../simple-update-notifier/src/index.ts | 34 + .../simple-update-notifier/src/isNpmOrYarn.ts | 12 + .../simple-update-notifier/src/types.ts | 8 + node_modules/supports-color/browser.js | 5 + node_modules/supports-color/index.js | 131 ++ node_modules/supports-color/license | 9 + node_modules/supports-color/package.json | 53 + node_modules/supports-color/readme.md | 66 + node_modules/to-regex-range/LICENSE | 21 + node_modules/to-regex-range/README.md | 305 +++++ node_modules/to-regex-range/index.js | 288 +++++ node_modules/to-regex-range/package.json | 88 ++ node_modules/touch/LICENSE | 15 + node_modules/touch/README.md | 52 + node_modules/touch/bin/nodetouch.js | 112 ++ node_modules/touch/index.js | 224 ++++ node_modules/touch/package.json | 28 + .../undefsafe/.github/workflows/release.yml | 25 + node_modules/undefsafe/.jscsrc | 13 + node_modules/undefsafe/.jshintrc | 16 + node_modules/undefsafe/.travis.yml | 18 + node_modules/undefsafe/LICENSE | 22 + node_modules/undefsafe/README.md | 63 + node_modules/undefsafe/example.js | 14 + node_modules/undefsafe/lib/undefsafe.js | 125 ++ node_modules/undefsafe/package.json | 34 + package-lock.json | 338 ++++- package.json | 5 +- 275 files changed, 26441 insertions(+), 3 deletions(-) create mode 120000 node_modules/.bin/nodemon create mode 120000 node_modules/.bin/nodetouch create mode 120000 node_modules/.bin/nopt create mode 120000 node_modules/.bin/semver create mode 100644 node_modules/abbrev/LICENSE create mode 100644 node_modules/abbrev/README.md create mode 100644 node_modules/abbrev/abbrev.js create mode 100644 node_modules/abbrev/package.json create mode 100644 node_modules/anymatch/LICENSE create mode 100644 node_modules/anymatch/README.md create mode 100644 node_modules/anymatch/index.d.ts create mode 100644 node_modules/anymatch/index.js create mode 100644 node_modules/anymatch/package.json create mode 100644 node_modules/balanced-match/.github/FUNDING.yml create mode 100644 node_modules/balanced-match/LICENSE.md create mode 100644 node_modules/balanced-match/README.md create mode 100644 node_modules/balanced-match/index.js create mode 100644 node_modules/balanced-match/package.json create mode 100644 node_modules/binary-extensions/binary-extensions.json create mode 100644 node_modules/binary-extensions/binary-extensions.json.d.ts create mode 100644 node_modules/binary-extensions/index.d.ts create mode 100644 node_modules/binary-extensions/index.js create mode 100644 node_modules/binary-extensions/license create mode 100644 node_modules/binary-extensions/package.json create mode 100644 node_modules/binary-extensions/readme.md create mode 100644 node_modules/brace-expansion/LICENSE create mode 100644 node_modules/brace-expansion/README.md create mode 100644 node_modules/brace-expansion/index.js create mode 100644 node_modules/brace-expansion/package.json create mode 100644 node_modules/braces/CHANGELOG.md create mode 100644 node_modules/braces/LICENSE create mode 100644 node_modules/braces/README.md create mode 100644 node_modules/braces/index.js create mode 100644 node_modules/braces/lib/compile.js create mode 100644 node_modules/braces/lib/constants.js create mode 100644 node_modules/braces/lib/expand.js create mode 100644 node_modules/braces/lib/parse.js create mode 100644 node_modules/braces/lib/stringify.js create mode 100644 node_modules/braces/lib/utils.js create mode 100644 node_modules/braces/package.json create mode 100644 node_modules/chokidar/LICENSE create mode 100644 node_modules/chokidar/README.md create mode 100644 node_modules/chokidar/index.js create mode 100644 node_modules/chokidar/lib/constants.js create mode 100644 node_modules/chokidar/lib/fsevents-handler.js create mode 100644 node_modules/chokidar/lib/nodefs-handler.js create mode 100644 node_modules/chokidar/package.json create mode 100644 node_modules/chokidar/types/index.d.ts create mode 100644 node_modules/concat-map/.travis.yml create mode 100644 node_modules/concat-map/LICENSE create mode 100644 node_modules/concat-map/README.markdown create mode 100644 node_modules/concat-map/example/map.js create mode 100644 node_modules/concat-map/index.js create mode 100644 node_modules/concat-map/package.json create mode 100644 node_modules/concat-map/test/map.js create mode 100644 node_modules/fill-range/LICENSE create mode 100644 node_modules/fill-range/README.md create mode 100644 node_modules/fill-range/index.js create mode 100644 node_modules/fill-range/package.json create mode 100644 node_modules/glob-parent/CHANGELOG.md create mode 100644 node_modules/glob-parent/LICENSE create mode 100644 node_modules/glob-parent/README.md create mode 100644 node_modules/glob-parent/index.js create mode 100644 node_modules/glob-parent/package.json create mode 100644 node_modules/has-flag/index.js create mode 100644 node_modules/has-flag/license create mode 100644 node_modules/has-flag/package.json create mode 100644 node_modules/has-flag/readme.md create mode 100644 node_modules/ignore-by-default/LICENSE create mode 100644 node_modules/ignore-by-default/README.md create mode 100644 node_modules/ignore-by-default/index.js create mode 100644 node_modules/ignore-by-default/package.json create mode 100644 node_modules/is-binary-path/index.d.ts create mode 100644 node_modules/is-binary-path/index.js create mode 100644 node_modules/is-binary-path/license create mode 100644 node_modules/is-binary-path/package.json create mode 100644 node_modules/is-binary-path/readme.md create mode 100644 node_modules/is-extglob/LICENSE create mode 100644 node_modules/is-extglob/README.md create mode 100644 node_modules/is-extglob/index.js create mode 100644 node_modules/is-extglob/package.json create mode 100644 node_modules/is-glob/LICENSE create mode 100644 node_modules/is-glob/README.md create mode 100644 node_modules/is-glob/index.js create mode 100644 node_modules/is-glob/package.json create mode 100644 node_modules/is-number/LICENSE create mode 100644 node_modules/is-number/README.md create mode 100644 node_modules/is-number/index.js create mode 100644 node_modules/is-number/package.json create mode 100644 node_modules/minimatch/LICENSE create mode 100644 node_modules/minimatch/README.md create mode 100644 node_modules/minimatch/minimatch.js create mode 100644 node_modules/minimatch/package.json create mode 100644 node_modules/nodemon/.prettierrc.json create mode 100644 node_modules/nodemon/LICENSE create mode 100644 node_modules/nodemon/README.md create mode 100755 node_modules/nodemon/bin/nodemon.js create mode 100644 node_modules/nodemon/bin/windows-kill.exe create mode 100644 node_modules/nodemon/doc/cli/authors.txt create mode 100644 node_modules/nodemon/doc/cli/config.txt create mode 100644 node_modules/nodemon/doc/cli/help.txt create mode 100644 node_modules/nodemon/doc/cli/logo.txt create mode 100644 node_modules/nodemon/doc/cli/options.txt create mode 100644 node_modules/nodemon/doc/cli/topics.txt create mode 100644 node_modules/nodemon/doc/cli/usage.txt create mode 100644 node_modules/nodemon/doc/cli/whoami.txt create mode 100644 node_modules/nodemon/lib/cli/index.js create mode 100644 node_modules/nodemon/lib/cli/parse.js create mode 100644 node_modules/nodemon/lib/config/command.js create mode 100644 node_modules/nodemon/lib/config/defaults.js create mode 100644 node_modules/nodemon/lib/config/exec.js create mode 100644 node_modules/nodemon/lib/config/index.js create mode 100644 node_modules/nodemon/lib/config/load.js create mode 100644 node_modules/nodemon/lib/help/index.js create mode 100644 node_modules/nodemon/lib/index.js create mode 100644 node_modules/nodemon/lib/monitor/index.js create mode 100644 node_modules/nodemon/lib/monitor/match.js create mode 100644 node_modules/nodemon/lib/monitor/run.js create mode 100644 node_modules/nodemon/lib/monitor/signals.js create mode 100644 node_modules/nodemon/lib/monitor/watch.js create mode 100644 node_modules/nodemon/lib/nodemon.js create mode 100644 node_modules/nodemon/lib/rules/add.js create mode 100644 node_modules/nodemon/lib/rules/index.js create mode 100644 node_modules/nodemon/lib/rules/parse.js create mode 100644 node_modules/nodemon/lib/spawn.js create mode 100644 node_modules/nodemon/lib/utils/bus.js create mode 100644 node_modules/nodemon/lib/utils/clone.js create mode 100644 node_modules/nodemon/lib/utils/colour.js create mode 100644 node_modules/nodemon/lib/utils/index.js create mode 100644 node_modules/nodemon/lib/utils/log.js create mode 100644 node_modules/nodemon/lib/utils/merge.js create mode 100644 node_modules/nodemon/lib/version.js create mode 100644 node_modules/nodemon/node_modules/debug/LICENSE create mode 100644 node_modules/nodemon/node_modules/debug/README.md create mode 100644 node_modules/nodemon/node_modules/debug/package.json create mode 100644 node_modules/nodemon/node_modules/debug/src/browser.js create mode 100644 node_modules/nodemon/node_modules/debug/src/common.js create mode 100644 node_modules/nodemon/node_modules/debug/src/index.js create mode 100644 node_modules/nodemon/node_modules/debug/src/node.js create mode 100644 node_modules/nodemon/node_modules/ms/index.js create mode 100644 node_modules/nodemon/node_modules/ms/license.md create mode 100644 node_modules/nodemon/node_modules/ms/package.json create mode 100644 node_modules/nodemon/node_modules/ms/readme.md create mode 100644 node_modules/nodemon/package.json create mode 100644 node_modules/nopt/.npmignore create mode 100644 node_modules/nopt/LICENSE create mode 100644 node_modules/nopt/README.md create mode 100755 node_modules/nopt/bin/nopt.js create mode 100755 node_modules/nopt/examples/my-program.js create mode 100644 node_modules/nopt/lib/nopt.js create mode 100644 node_modules/nopt/package.json create mode 100644 node_modules/normalize-path/LICENSE create mode 100644 node_modules/normalize-path/README.md create mode 100644 node_modules/normalize-path/index.js create mode 100644 node_modules/normalize-path/package.json create mode 100644 node_modules/picomatch/CHANGELOG.md create mode 100644 node_modules/picomatch/LICENSE create mode 100644 node_modules/picomatch/README.md create mode 100644 node_modules/picomatch/index.js create mode 100644 node_modules/picomatch/lib/constants.js create mode 100644 node_modules/picomatch/lib/parse.js create mode 100644 node_modules/picomatch/lib/picomatch.js create mode 100644 node_modules/picomatch/lib/scan.js create mode 100644 node_modules/picomatch/lib/utils.js create mode 100644 node_modules/picomatch/package.json create mode 100644 node_modules/pstree.remy/.travis.yml create mode 100644 node_modules/pstree.remy/LICENSE create mode 100644 node_modules/pstree.remy/README.md create mode 100644 node_modules/pstree.remy/lib/index.js create mode 100644 node_modules/pstree.remy/lib/tree.js create mode 100644 node_modules/pstree.remy/lib/utils.js create mode 100644 node_modules/pstree.remy/package.json create mode 100644 node_modules/pstree.remy/tests/fixtures/index.js create mode 100644 node_modules/pstree.remy/tests/fixtures/out1 create mode 100644 node_modules/pstree.remy/tests/fixtures/out2 create mode 100644 node_modules/pstree.remy/tests/index.test.js create mode 100644 node_modules/readdirp/LICENSE create mode 100644 node_modules/readdirp/README.md create mode 100644 node_modules/readdirp/index.d.ts create mode 100644 node_modules/readdirp/index.js create mode 100644 node_modules/readdirp/package.json create mode 100644 node_modules/semver/LICENSE create mode 100644 node_modules/semver/README.md create mode 100755 node_modules/semver/bin/semver.js create mode 100644 node_modules/semver/classes/comparator.js create mode 100644 node_modules/semver/classes/index.js create mode 100644 node_modules/semver/classes/range.js create mode 100644 node_modules/semver/classes/semver.js create mode 100644 node_modules/semver/functions/clean.js create mode 100644 node_modules/semver/functions/cmp.js create mode 100644 node_modules/semver/functions/coerce.js create mode 100644 node_modules/semver/functions/compare-build.js create mode 100644 node_modules/semver/functions/compare-loose.js create mode 100644 node_modules/semver/functions/compare.js create mode 100644 node_modules/semver/functions/diff.js create mode 100644 node_modules/semver/functions/eq.js create mode 100644 node_modules/semver/functions/gt.js create mode 100644 node_modules/semver/functions/gte.js create mode 100644 node_modules/semver/functions/inc.js create mode 100644 node_modules/semver/functions/lt.js create mode 100644 node_modules/semver/functions/lte.js create mode 100644 node_modules/semver/functions/major.js create mode 100644 node_modules/semver/functions/minor.js create mode 100644 node_modules/semver/functions/neq.js create mode 100644 node_modules/semver/functions/parse.js create mode 100644 node_modules/semver/functions/patch.js create mode 100644 node_modules/semver/functions/prerelease.js create mode 100644 node_modules/semver/functions/rcompare.js create mode 100644 node_modules/semver/functions/rsort.js create mode 100644 node_modules/semver/functions/satisfies.js create mode 100644 node_modules/semver/functions/sort.js create mode 100644 node_modules/semver/functions/valid.js create mode 100644 node_modules/semver/index.js create mode 100644 node_modules/semver/internal/constants.js create mode 100644 node_modules/semver/internal/debug.js create mode 100644 node_modules/semver/internal/identifiers.js create mode 100644 node_modules/semver/internal/lrucache.js create mode 100644 node_modules/semver/internal/parse-options.js create mode 100644 node_modules/semver/internal/re.js create mode 100644 node_modules/semver/package.json create mode 100644 node_modules/semver/preload.js create mode 100644 node_modules/semver/range.bnf create mode 100644 node_modules/semver/ranges/gtr.js create mode 100644 node_modules/semver/ranges/intersects.js create mode 100644 node_modules/semver/ranges/ltr.js create mode 100644 node_modules/semver/ranges/max-satisfying.js create mode 100644 node_modules/semver/ranges/min-satisfying.js create mode 100644 node_modules/semver/ranges/min-version.js create mode 100644 node_modules/semver/ranges/outside.js create mode 100644 node_modules/semver/ranges/simplify.js create mode 100644 node_modules/semver/ranges/subset.js create mode 100644 node_modules/semver/ranges/to-comparators.js create mode 100644 node_modules/semver/ranges/valid.js create mode 100644 node_modules/simple-update-notifier/LICENSE create mode 100644 node_modules/simple-update-notifier/README.md create mode 100644 node_modules/simple-update-notifier/build/index.d.ts create mode 100644 node_modules/simple-update-notifier/build/index.js create mode 100644 node_modules/simple-update-notifier/package.json create mode 100644 node_modules/simple-update-notifier/src/borderedText.ts create mode 100644 node_modules/simple-update-notifier/src/cache.spec.ts create mode 100644 node_modules/simple-update-notifier/src/cache.ts create mode 100644 node_modules/simple-update-notifier/src/getDistVersion.spec.ts create mode 100644 node_modules/simple-update-notifier/src/getDistVersion.ts create mode 100644 node_modules/simple-update-notifier/src/hasNewVersion.spec.ts create mode 100644 node_modules/simple-update-notifier/src/hasNewVersion.ts create mode 100644 node_modules/simple-update-notifier/src/index.spec.ts create mode 100644 node_modules/simple-update-notifier/src/index.ts create mode 100644 node_modules/simple-update-notifier/src/isNpmOrYarn.ts create mode 100644 node_modules/simple-update-notifier/src/types.ts create mode 100644 node_modules/supports-color/browser.js create mode 100644 node_modules/supports-color/index.js create mode 100644 node_modules/supports-color/license create mode 100644 node_modules/supports-color/package.json create mode 100644 node_modules/supports-color/readme.md create mode 100644 node_modules/to-regex-range/LICENSE create mode 100644 node_modules/to-regex-range/README.md create mode 100644 node_modules/to-regex-range/index.js create mode 100644 node_modules/to-regex-range/package.json create mode 100644 node_modules/touch/LICENSE create mode 100644 node_modules/touch/README.md create mode 100755 node_modules/touch/bin/nodetouch.js create mode 100644 node_modules/touch/index.js create mode 100644 node_modules/touch/package.json create mode 100644 node_modules/undefsafe/.github/workflows/release.yml create mode 100644 node_modules/undefsafe/.jscsrc create mode 100644 node_modules/undefsafe/.jshintrc create mode 100644 node_modules/undefsafe/.travis.yml create mode 100644 node_modules/undefsafe/LICENSE create mode 100644 node_modules/undefsafe/README.md create mode 100644 node_modules/undefsafe/example.js create mode 100644 node_modules/undefsafe/lib/undefsafe.js create mode 100644 node_modules/undefsafe/package.json diff --git a/node_modules/.bin/nodemon b/node_modules/.bin/nodemon new file mode 120000 index 0000000..1056ddc --- /dev/null +++ b/node_modules/.bin/nodemon @@ -0,0 +1 @@ +../nodemon/bin/nodemon.js \ No newline at end of file diff --git a/node_modules/.bin/nodetouch b/node_modules/.bin/nodetouch new file mode 120000 index 0000000..3409fdb --- /dev/null +++ b/node_modules/.bin/nodetouch @@ -0,0 +1 @@ +../touch/bin/nodetouch.js \ No newline at end of file diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt new file mode 120000 index 0000000..6b6566e --- /dev/null +++ b/node_modules/.bin/nopt @@ -0,0 +1 @@ +../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver new file mode 120000 index 0000000..5aaadf4 --- /dev/null +++ b/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index ea55f1d..d497bca 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -319,6 +319,11 @@ "lodash-es": "4.17.21" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -331,11 +336,39 @@ "node": ">= 0.6" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/blurhash": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", @@ -364,6 +397,26 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -390,6 +443,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/ckeditor5": { "version": "41.3.1", "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-41.3.1.tgz", @@ -434,6 +510,11 @@ "color-name": "^1.0.0" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -593,6 +674,17 @@ "node": ">= 0.10.0" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -652,6 +744,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -663,6 +766,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -733,6 +844,11 @@ "node": ">=0.10.0" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -746,6 +862,44 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", @@ -802,6 +956,17 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -823,6 +988,76 @@ "node": ">=6.0.0" } }, + "node_modules/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -855,6 +1090,17 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -867,6 +1113,11 @@ "node": ">= 0.10" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -903,6 +1154,17 @@ "node": ">= 0.8" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -927,6 +1189,17 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -1007,6 +1280,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1015,6 +1299,28 @@ "node": ">= 0.8" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1023,6 +1329,17 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1035,6 +1352,11 @@ "node": ">= 0.6" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE new file mode 100644 index 0000000..9bcfa9d --- /dev/null +++ b/node_modules/abbrev/LICENSE @@ -0,0 +1,46 @@ +This software is dual-licensed under the ISC and MIT licenses. +You may use this software under EITHER of the following licenses. + +---------- + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---------- + +Copyright Isaac Z. Schlueter and Contributors +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/abbrev/README.md b/node_modules/abbrev/README.md new file mode 100644 index 0000000..99746fe --- /dev/null +++ b/node_modules/abbrev/README.md @@ -0,0 +1,23 @@ +# abbrev-js + +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev). + +Usage: + + var abbrev = require("abbrev"); + abbrev("foo", "fool", "folding", "flop"); + + // returns: + { fl: 'flop' + , flo: 'flop' + , flop: 'flop' + , fol: 'folding' + , fold: 'folding' + , foldi: 'folding' + , foldin: 'folding' + , folding: 'folding' + , foo: 'foo' + , fool: 'fool' + } + +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands. diff --git a/node_modules/abbrev/abbrev.js b/node_modules/abbrev/abbrev.js new file mode 100644 index 0000000..7b1dc5d --- /dev/null +++ b/node_modules/abbrev/abbrev.js @@ -0,0 +1,61 @@ +module.exports = exports = abbrev.abbrev = abbrev + +abbrev.monkeyPatch = monkeyPatch + +function monkeyPatch () { + Object.defineProperty(Array.prototype, 'abbrev', { + value: function () { return abbrev(this) }, + enumerable: false, configurable: true, writable: true + }) + + Object.defineProperty(Object.prototype, 'abbrev', { + value: function () { return abbrev(Object.keys(this)) }, + enumerable: false, configurable: true, writable: true + }) +} + +function abbrev (list) { + if (arguments.length !== 1 || !Array.isArray(list)) { + list = Array.prototype.slice.call(arguments, 0) + } + for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { + args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) + } + + // sort them lexicographically, so that they're next to their nearest kin + args = args.sort(lexSort) + + // walk through each, seeing how much it has in common with the next and previous + var abbrevs = {} + , prev = "" + for (var i = 0, l = args.length ; i < l ; i ++) { + var current = args[i] + , next = args[i + 1] || "" + , nextMatches = true + , prevMatches = true + if (current === next) continue + for (var j = 0, cl = current.length ; j < cl ; j ++) { + var curChar = current.charAt(j) + nextMatches = nextMatches && curChar === next.charAt(j) + prevMatches = prevMatches && curChar === prev.charAt(j) + if (!nextMatches && !prevMatches) { + j ++ + break + } + } + prev = current + if (j === cl) { + abbrevs[current] = current + continue + } + for (var a = current.substr(0, j) ; j <= cl ; j ++) { + abbrevs[a] = current + a += current.charAt(j) + } + } + return abbrevs +} + +function lexSort (a, b) { + return a === b ? 0 : a > b ? 1 : -1 +} diff --git a/node_modules/abbrev/package.json b/node_modules/abbrev/package.json new file mode 100644 index 0000000..bf4e801 --- /dev/null +++ b/node_modules/abbrev/package.json @@ -0,0 +1,21 @@ +{ + "name": "abbrev", + "version": "1.1.1", + "description": "Like ruby's abbrev module, but in js", + "author": "Isaac Z. Schlueter ", + "main": "abbrev.js", + "scripts": { + "test": "tap test.js --100", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "repository": "http://github.com/isaacs/abbrev-js", + "license": "ISC", + "devDependencies": { + "tap": "^10.1" + }, + "files": [ + "abbrev.js" + ] +} diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE new file mode 100644 index 0000000..491766c --- /dev/null +++ b/node_modules/anymatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com) + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/anymatch/README.md b/node_modules/anymatch/README.md new file mode 100644 index 0000000..1dd67f5 --- /dev/null +++ b/node_modules/anymatch/README.md @@ -0,0 +1,87 @@ +anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master) +====== +Javascript module to match a string against a regular expression, glob, string, +or function that takes the string as an argument and returns a truthy or falsy +value. The matcher can also be an array of any or all of these. Useful for +allowing a very flexible user-defined config to define things like file paths. + +__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__ + + +Usage +----- +```sh +npm install anymatch +``` + +#### anymatch(matchers, testString, [returnIndex], [options]) +* __matchers__: (_Array|String|RegExp|Function_) +String to be directly matched, string with glob patterns, regular expression +test, function that takes the testString as an argument and returns a truthy +value if it should be matched, or an array of any number and mix of these types. +* __testString__: (_String|Array_) The string to test against the matchers. If +passed as an array, the first element of the array will be used as the +`testString` for non-function matchers, while the entire array will be applied +as the arguments for function matchers. +* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options. + * __returnIndex__: (_Boolean [optional]_) If true, return the array index of +the first matcher that that testString matched, or -1 if no match, instead of a +boolean result. + +```js +const anymatch = require('anymatch'); + +const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ; + +anymatch(matchers, 'path/to/file.js'); // true +anymatch(matchers, 'path/anyjs/baz.js'); // true +anymatch(matchers, 'path/to/foo.js'); // true +anymatch(matchers, 'path/to/bar.js'); // true +anymatch(matchers, 'bar.js'); // false + +// returnIndex = true +anymatch(matchers, 'foo.js', {returnIndex: true}); // 2 +anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1 + +// any picomatc + +// using globs to match directories and their children +anymatch('node_modules', 'node_modules'); // true +anymatch('node_modules', 'node_modules/somelib/index.js'); // false +anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true +anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false +anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true + +const matcher = anymatch(matchers); +['foo.js', 'bar.js'].filter(matcher); // [ 'foo.js' ] +anymatch master* ❯ + +``` + +#### anymatch(matchers) +You can also pass in only your matcher(s) to get a curried function that has +already been bound to the provided matching criteria. This can be used as an +`Array#filter` callback. + +```js +var matcher = anymatch(matchers); + +matcher('path/to/file.js'); // true +matcher('path/anyjs/baz.js', true); // 1 + +['foo.js', 'bar.js'].filter(matcher); // ['foo.js'] +``` + +Changelog +---------- +[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases) + +- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only. +- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information). +- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch) +for glob pattern matching. Issues with glob pattern matching should be +reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues). + +License +------- +[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE) diff --git a/node_modules/anymatch/index.d.ts b/node_modules/anymatch/index.d.ts new file mode 100644 index 0000000..3ef7eaa --- /dev/null +++ b/node_modules/anymatch/index.d.ts @@ -0,0 +1,20 @@ +type AnymatchFn = (testString: string) => boolean; +type AnymatchPattern = string|RegExp|AnymatchFn; +type AnymatchMatcher = AnymatchPattern|AnymatchPattern[] +type AnymatchTester = { + (testString: string|any[], returnIndex: true): number; + (testString: string|any[]): boolean; +} + +type PicomatchOptions = {dot: boolean}; + +declare const anymatch: { + (matchers: AnymatchMatcher): AnymatchTester; + (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester; + (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number; + (matchers: AnymatchMatcher, testString: string|any[]): boolean; +} + +export {AnymatchMatcher as Matcher} +export {AnymatchTester as Tester} +export default anymatch diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js new file mode 100644 index 0000000..8eb73e9 --- /dev/null +++ b/node_modules/anymatch/index.js @@ -0,0 +1,104 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { value: true }); + +const picomatch = require('picomatch'); +const normalizePath = require('normalize-path'); + +/** + * @typedef {(testString: string) => boolean} AnymatchFn + * @typedef {string|RegExp|AnymatchFn} AnymatchPattern + * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher + */ +const BANG = '!'; +const DEFAULT_OPTIONS = {returnIndex: false}; +const arrify = (item) => Array.isArray(item) ? item : [item]; + +/** + * @param {AnymatchPattern} matcher + * @param {object} options + * @returns {AnymatchFn} + */ +const createPattern = (matcher, options) => { + if (typeof matcher === 'function') { + return matcher; + } + if (typeof matcher === 'string') { + const glob = picomatch(matcher, options); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; +}; + +/** + * @param {Array} patterns + * @param {Array} negPatterns + * @param {String|Array} args + * @param {Boolean} returnIndex + * @returns {boolean|number} + */ +const matchPatterns = (patterns, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== 'string') { + throw new TypeError('anymatch: second argument must be a string: got ' + + Object.prototype.toString.call(_path)) + } + const path = normalizePath(_path, false); + + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path)) { + return returnIndex ? -1 : false; + } + } + + const applied = isList && [path].concat(args.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (isList ? pattern(...applied) : pattern(path)) { + return returnIndex ? index : true; + } + } + + return returnIndex ? -1 : false; +}; + +/** + * @param {AnymatchMatcher} matchers + * @param {Array|string} testString + * @param {object} options + * @returns {boolean|number|Function} + */ +const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError('anymatch: specify first argument'); + } + const opts = typeof options === 'boolean' ? {returnIndex: options} : options; + const returnIndex = opts.returnIndex || false; + + // Early cache for matchers. + const mtchers = arrify(matchers); + const negatedGlobs = mtchers + .filter(item => typeof item === 'string' && item.charAt(0) === BANG) + .map(item => item.slice(1)) + .map(item => picomatch(item, opts)); + const patterns = mtchers + .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG)) + .map(matcher => createPattern(matcher, opts)); + + if (testString == null) { + return (testString, ri = false) => { + const returnIndex = typeof ri === 'boolean' ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + } + } + + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); +}; + +anymatch.default = anymatch; +module.exports = anymatch; diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json new file mode 100644 index 0000000..2cb2307 --- /dev/null +++ b/node_modules/anymatch/package.json @@ -0,0 +1,48 @@ +{ + "name": "anymatch", + "version": "3.1.3", + "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions", + "files": [ + "index.js", + "index.d.ts" + ], + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "author": { + "name": "Elan Shanker", + "url": "https://github.com/es128" + }, + "license": "ISC", + "homepage": "https://github.com/micromatch/anymatch", + "repository": { + "type": "git", + "url": "https://github.com/micromatch/anymatch" + }, + "keywords": [ + "match", + "any", + "string", + "file", + "fs", + "list", + "glob", + "regex", + "regexp", + "regular", + "expression", + "function" + ], + "scripts": { + "test": "nyc mocha", + "mocha": "mocha" + }, + "devDependencies": { + "mocha": "^6.1.3", + "nyc": "^14.0.0" + }, + "engines": { + "node": ">= 8" + } +} diff --git a/node_modules/balanced-match/.github/FUNDING.yml b/node_modules/balanced-match/.github/FUNDING.yml new file mode 100644 index 0000000..cea8b16 --- /dev/null +++ b/node_modules/balanced-match/.github/FUNDING.yml @@ -0,0 +1,2 @@ +tidelift: "npm/balanced-match" +patreon: juliangruber diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md new file mode 100644 index 0000000..2cdc8e4 --- /dev/null +++ b/node_modules/balanced-match/LICENSE.md @@ -0,0 +1,21 @@ +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/balanced-match/README.md b/node_modules/balanced-match/README.md new file mode 100644 index 0000000..d2a48b6 --- /dev/null +++ b/node_modules/balanced-match/README.md @@ -0,0 +1,97 @@ +# balanced-match + +Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! + +[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) +[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) + +[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) + +## Example + +Get the first matching pair of braces: + +```js +var balanced = require('balanced-match'); + +console.log(balanced('{', '}', 'pre{in{nested}}post')); +console.log(balanced('{', '}', 'pre{first}between{second}post')); +console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); +``` + +The matches are: + +```bash +$ node example.js +{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } +{ start: 3, + end: 9, + pre: 'pre', + body: 'first', + post: 'between{second}post' } +{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } +``` + +## API + +### var m = balanced(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +object with those keys: + +* **start** the index of the first match of `a` +* **end** the index of the matching `b` +* **pre** the preamble, `a` and `b` not included +* **body** the match, `a` and `b` not included +* **post** the postscript, `a` and `b` not included + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. + +### var r = balanced.range(a, b, str) + +For the first non-nested matching pair of `a` and `b` in `str`, return an +array with indexes: `[ , ]`. + +If there's no match, `undefined` will be returned. + +If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install balanced-match +``` + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/balanced-match/index.js b/node_modules/balanced-match/index.js new file mode 100644 index 0000000..c67a646 --- /dev/null +++ b/node_modules/balanced-match/index.js @@ -0,0 +1,62 @@ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + if(a===b) { + return [ai, bi]; + } + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json new file mode 100644 index 0000000..ce6073e --- /dev/null +++ b/node_modules/balanced-match/package.json @@ -0,0 +1,48 @@ +{ + "name": "balanced-match", + "description": "Match balanced character pairs, like \"{\" and \"}\"", + "version": "1.0.2", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/balanced-match.git" + }, + "homepage": "https://github.com/juliangruber/balanced-match", + "main": "index.js", + "scripts": { + "test": "tape test/test.js", + "bench": "matcha test/bench.js" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [ + "match", + "regexp", + "test", + "balanced", + "parse" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/node_modules/binary-extensions/binary-extensions.json b/node_modules/binary-extensions/binary-extensions.json new file mode 100644 index 0000000..ac08048 --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json @@ -0,0 +1,263 @@ +[ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "afdesign", + "afphoto", + "afpub", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "appimage", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "flatpak", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "odp", + "ods", + "odt", + "oga", + "ogg", + "ogv", + "otf", + "ott", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rpm", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "snap", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" +] diff --git a/node_modules/binary-extensions/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts new file mode 100644 index 0000000..94a248c --- /dev/null +++ b/node_modules/binary-extensions/binary-extensions.json.d.ts @@ -0,0 +1,3 @@ +declare const binaryExtensionsJson: readonly string[]; + +export = binaryExtensionsJson; diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts new file mode 100644 index 0000000..f469ac5 --- /dev/null +++ b/node_modules/binary-extensions/index.d.ts @@ -0,0 +1,14 @@ +/** +List of binary file extensions. + +@example +``` +import binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` +*/ +declare const binaryExtensions: readonly string[]; + +export = binaryExtensions; diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js new file mode 100644 index 0000000..d46e468 --- /dev/null +++ b/node_modules/binary-extensions/index.js @@ -0,0 +1 @@ +module.exports = require('./binary-extensions.json'); diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license new file mode 100644 index 0000000..5493a1a --- /dev/null +++ b/node_modules/binary-extensions/license @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Paul Miller (https://paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/binary-extensions/package.json b/node_modules/binary-extensions/package.json new file mode 100644 index 0000000..4710c33 --- /dev/null +++ b/node_modules/binary-extensions/package.json @@ -0,0 +1,40 @@ +{ + "name": "binary-extensions", + "version": "2.3.0", + "description": "List of binary file extensions", + "license": "MIT", + "repository": "sindresorhus/binary-extensions", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "sideEffects": false, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "binary-extensions.json", + "binary-extensions.json.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "json", + "list", + "array" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md new file mode 100644 index 0000000..88519b3 --- /dev/null +++ b/node_modules/binary-extensions/readme.md @@ -0,0 +1,25 @@ +# binary-extensions + +> List of binary file extensions + +The list is just a [JSON file](binary-extensions.json) and can be used anywhere. + +## Install + +```sh +npm install binary-extensions +``` + +## Usage + +```js +const binaryExtensions = require('binary-extensions'); + +console.log(binaryExtensions); +//=> ['3ds', '3g2', …] +``` + +## Related + +- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file +- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE new file mode 100644 index 0000000..de32266 --- /dev/null +++ b/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/brace-expansion/README.md b/node_modules/brace-expansion/README.md new file mode 100644 index 0000000..6b4e0e1 --- /dev/null +++ b/node_modules/brace-expansion/README.md @@ -0,0 +1,129 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/brace-expansion/index.js b/node_modules/brace-expansion/index.js new file mode 100644 index 0000000..0478be8 --- /dev/null +++ b/node_modules/brace-expansion/index.js @@ -0,0 +1,201 @@ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json new file mode 100644 index 0000000..a18faa8 --- /dev/null +++ b/node_modules/brace-expansion/package.json @@ -0,0 +1,47 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "1.1.11", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh", + "bench": "matcha test/perf/bench.js" + }, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "devDependencies": { + "matcha": "^0.7.0", + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/node_modules/braces/CHANGELOG.md b/node_modules/braces/CHANGELOG.md new file mode 100644 index 0000000..36f798b --- /dev/null +++ b/node_modules/braces/CHANGELOG.md @@ -0,0 +1,184 @@ +# Release history + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +
    + Guiding Principles + +- Changelogs are for humans, not machines. +- There should be an entry for every single version. +- The same types of changes should be grouped. +- Versions and sections should be linkable. +- The latest version comes first. +- The release date of each versions is displayed. +- Mention whether you follow Semantic Versioning. + +
    + +
    + Types of changes + +Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_): + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + +
    + +## [3.0.0] - 2018-04-08 + +v3.0 is a complete refactor, resulting in a faster, smaller codebase, with fewer deps, and a more accurate parser and compiler. + +**Breaking Changes** + +- The undocumented `.makeRe` method was removed + +**Non-breaking changes** + +- Caching was removed + +## [2.3.2] - 2018-04-08 + +- start refactoring +- cover sets +- better range handling + +## [2.3.1] - 2018-02-17 + +- Remove unnecessary escape in Regex. (#14) + +## [2.3.0] - 2017-10-19 + +- minor code reorganization +- optimize regex +- expose `maxLength` option + +## [2.2.1] - 2017-05-30 + +- don't condense when braces contain extglobs + +## [2.2.0] - 2017-05-28 + +- ensure word boundaries are preserved +- fixes edge case where extglob characters precede a brace pattern + +## [2.1.1] - 2017-04-27 + +- use snapdragon-node +- handle edge case +- optimizations, lint + +## [2.0.4] - 2017-04-11 + +- pass opts to compiler +- minor optimization in create method +- re-write parser handlers to remove negation regex + +## [2.0.3] - 2016-12-10 + +- use split-string +- clear queue at the end +- adds sequences example +- add unit tests + +## [2.0.2] - 2016-10-21 + +- fix comma handling in nested extglobs + +## [2.0.1] - 2016-10-20 + +- add comments +- more tests, ensure quotes are stripped + +## [2.0.0] - 2016-10-19 + +- don't expand braces inside character classes +- add quantifier pattern + +## [1.8.5] - 2016-05-21 + +- Refactor (#10) + +## [1.8.4] - 2016-04-20 + +- fixes https://github.com/jonschlinkert/micromatch/issues/66 + +## [1.8.0] - 2015-03-18 + +- adds exponent examples, tests +- fixes the first example in https://github.com/jonschlinkert/micromatch/issues/38 + +## [1.6.0] - 2015-01-30 + +- optimizations, `bash` mode: +- improve path escaping + +## [1.5.0] - 2015-01-28 + +- Merge pull request #5 from eush77/lib-files + +## [1.4.0] - 2015-01-24 + +- add extglob tests +- externalize exponent function +- better whitespace handling + +## [1.3.0] - 2015-01-24 + +- make regex patterns explicity + +## [1.1.0] - 2015-01-11 + +- don't create a match group with `makeRe` + +## [1.0.0] - 2014-12-23 + +- Merge commit '97b05f5544f8348736a8efaecf5c32bbe3e2ad6e' +- support empty brace syntax +- better bash coverage +- better support for regex strings + +## [0.1.4] - 2014-11-14 + +- improve recognition of bad args, recognize mismatched argument types +- support escaping +- remove pathname-expansion +- support whitespace in patterns + +## [0.1.0] + +- first commit + +[2.3.2]: https://github.com/micromatch/braces/compare/2.3.1...2.3.2 +[2.3.1]: https://github.com/micromatch/braces/compare/2.3.0...2.3.1 +[2.3.0]: https://github.com/micromatch/braces/compare/2.2.1...2.3.0 +[2.2.1]: https://github.com/micromatch/braces/compare/2.2.0...2.2.1 +[2.2.0]: https://github.com/micromatch/braces/compare/2.1.1...2.2.0 +[2.1.1]: https://github.com/micromatch/braces/compare/2.1.0...2.1.1 +[2.1.0]: https://github.com/micromatch/braces/compare/2.0.4...2.1.0 +[2.0.4]: https://github.com/micromatch/braces/compare/2.0.3...2.0.4 +[2.0.3]: https://github.com/micromatch/braces/compare/2.0.2...2.0.3 +[2.0.2]: https://github.com/micromatch/braces/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/micromatch/braces/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/micromatch/braces/compare/1.8.5...2.0.0 +[1.8.5]: https://github.com/micromatch/braces/compare/1.8.4...1.8.5 +[1.8.4]: https://github.com/micromatch/braces/compare/1.8.0...1.8.4 +[1.8.0]: https://github.com/micromatch/braces/compare/1.6.0...1.8.0 +[1.6.0]: https://github.com/micromatch/braces/compare/1.5.0...1.6.0 +[1.5.0]: https://github.com/micromatch/braces/compare/1.4.0...1.5.0 +[1.4.0]: https://github.com/micromatch/braces/compare/1.3.0...1.4.0 +[1.3.0]: https://github.com/micromatch/braces/compare/1.2.0...1.3.0 +[1.2.0]: https://github.com/micromatch/braces/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/micromatch/braces/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/micromatch/braces/compare/0.1.4...1.0.0 +[0.1.4]: https://github.com/micromatch/braces/compare/0.1.0...0.1.4 + +[Unreleased]: https://github.com/micromatch/braces/compare/0.1.0...HEAD +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog \ No newline at end of file diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE new file mode 100644 index 0000000..d32ab44 --- /dev/null +++ b/node_modules/braces/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/braces/README.md b/node_modules/braces/README.md new file mode 100644 index 0000000..cba2f60 --- /dev/null +++ b/node_modules/braces/README.md @@ -0,0 +1,593 @@ +# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces) + +> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save braces +``` + +## v3.0.0 Released!! + +See the [changelog](CHANGELOG.md) for details. + +## Why use braces? + +Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters. + +* **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests) +* **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity. +* **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up. +* **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written). +* **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)). +* [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']` +* [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']` +* [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']` +* [Supports escaping](#escaping) - To prevent evaluation of special characters. + +## Usage + +The main export is a function that takes one or more brace `patterns` and `options`. + +```js +const braces = require('braces'); +// braces(patterns[, options]); + +console.log(braces(['{01..05}', '{a..e}'])); +//=> ['(0[1-5])', '([a-e])'] + +console.log(braces(['{01..05}', '{a..e}'], { expand: true })); +//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e'] +``` + +### Brace Expansion vs. Compilation + +By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching. + +**Compiled** + +```js +console.log(braces('a/{x,y,z}/b')); +//=> ['a/(x|y|z)/b'] +console.log(braces(['a/{01..20}/b', 'a/{1..5}/b'])); +//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ] +``` + +**Expanded** + +Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)): + +```js +console.log(braces('a/{x,y,z}/b', { expand: true })); +//=> ['a/x/b', 'a/y/b', 'a/z/b'] + +console.log(braces.expand('{01..10}')); +//=> ['01','02','03','04','05','06','07','08','09','10'] +``` + +### Lists + +Expand lists (like Bash "sets"): + +```js +console.log(braces('a/{foo,bar,baz}/*.js')); +//=> ['a/(foo|bar|baz)/*.js'] + +console.log(braces.expand('a/{foo,bar,baz}/*.js')); +//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js'] +``` + +### Sequences + +Expand ranges of characters (like Bash "sequences"): + +```js +console.log(braces.expand('{1..3}')); // ['1', '2', '3'] +console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b'] +console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c'] +console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c'] + +// supports zero-padded ranges +console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b'] +console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b'] +``` + +See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options. + +### Steppped ranges + +Steps, or increments, may be used with ranges: + +```js +console.log(braces.expand('{2..10..2}')); +//=> ['2', '4', '6', '8', '10'] + +console.log(braces('{2..10..2}')); +//=> ['(2|4|6|8|10)'] +``` + +When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion. + +### Nesting + +Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved. + +**"Expanded" braces** + +```js +console.log(braces.expand('a{b,c,/{x,y}}/e')); +//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e'] + +console.log(braces.expand('a/{x,{1..5},y}/c')); +//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c'] +``` + +**"Optimized" braces** + +```js +console.log(braces('a{b,c,/{x,y}}/e')); +//=> ['a(b|c|/(x|y))/e'] + +console.log(braces('a/{x,{1..5},y}/c')); +//=> ['a/(x|([1-5])|y)/c'] +``` + +### Escaping + +**Escaping braces** + +A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_: + +```js +console.log(braces.expand('a\\{d,c,b}e')); +//=> ['a{d,c,b}e'] + +console.log(braces.expand('a{d,c,b\\}e')); +//=> ['a{d,c,b}e'] +``` + +**Escaping commas** + +Commas inside braces may also be escaped: + +```js +console.log(braces.expand('a{b\\,c}d')); +//=> ['a{b,c}d'] + +console.log(braces.expand('a{d\\,c,b}e')); +//=> ['ad,ce', 'abe'] +``` + +**Single items** + +Following bash conventions, a brace pattern is also not expanded when it contains a single character: + +```js +console.log(braces.expand('a{b}c')); +//=> ['a{b}c'] +``` + +## Options + +### options.maxLength + +**Type**: `Number` + +**Default**: `65,536` + +**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera. + +```js +console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error +``` + +### options.expand + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing). + +```js +console.log(braces('a/{b,c}/d', { expand: true })); +//=> [ 'a/b/d', 'a/c/d' ] +``` + +### options.nodupes + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Remove duplicates from the returned array. + +### options.rangeLimit + +**Type**: `Number` + +**Default**: `1000` + +**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`. + +You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether. + +**Examples** + +```js +// pattern exceeds the "rangeLimit", so it's optimized automatically +console.log(braces.expand('{1..1000}')); +//=> ['([1-9]|[1-9][0-9]{1,2}|1000)'] + +// pattern does not exceed "rangeLimit", so it's NOT optimized +console.log(braces.expand('{1..100}')); +//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100'] +``` + +### options.transform + +**Type**: `Function` + +**Default**: `undefined` + +**Description**: Customize range expansion. + +**Example: Transforming non-numeric values** + +```js +const alpha = braces.expand('x/{a..e}/y', { + transform(value, index) { + // When non-numeric values are passed, "value" is a character code. + return 'foo/' + String.fromCharCode(value) + '-' + index; + } +}); +console.log(alpha); +//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ] +``` + +**Example: Transforming numeric values** + +```js +const numeric = braces.expand('{1..5}', { + transform(value) { + // when numeric values are passed, "value" is a number + return 'foo/' + value * 2; + } +}); +console.log(numeric); +//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ] +``` + +### options.quantifiers + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times. + +Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists) + +The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists. + +**Examples** + +```js +const braces = require('braces'); +console.log(braces('a/b{1,3}/{x,y,z}')); +//=> [ 'a/b(1|3)/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true})); +//=> [ 'a/b{1,3}/(x|y|z)' ] +console.log(braces('a/b{1,3}/{x,y,z}', {quantifiers: true, expand: true})); +//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ] +``` + +### options.unescape + +**Type**: `Boolean` + +**Default**: `undefined` + +**Description**: Strip backslashes that were used for escaping from the result. + +## What is "brace expansion"? + +Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs). + +In addition to "expansion", braces are also used for matching. In other words: + +* [brace expansion](#brace-expansion) is for generating new lists +* [brace matching](#brace-matching) is for filtering existing lists + +
    +More about brace expansion (click to expand) + +There are two main types of brace expansion: + +1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}` +2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges". + +Here are some example brace patterns to illustrate how they work: + +**Sets** + +``` +{a,b,c} => a b c +{a,b,c}{1,2} => a1 a2 b1 b2 c1 c2 +``` + +**Sequences** + +``` +{1..9} => 1 2 3 4 5 6 7 8 9 +{4..-4} => 4 3 2 1 0 -1 -2 -3 -4 +{1..20..3} => 1 4 7 10 13 16 19 +{a..j} => a b c d e f g h i j +{j..a} => j i h g f e d c b a +{a..z..3} => a d g j m p s v y +``` + +**Combination** + +Sets and sequences can be mixed together or used along with any other strings. + +``` +{a,b,c}{1..3} => a1 a2 a3 b1 b2 b3 c1 c2 c3 +foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar +``` + +The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases. + +## Brace matching + +In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching. + +For example, the pattern `foo/{1..3}/bar` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +``` + +But not: + +``` +baz/1/qux +baz/2/qux +baz/3/qux +``` + +Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings: + +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` + +## Brace matching pitfalls + +Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of. + +### tldr + +**"brace bombs"** + +* brace expansion can eat up a huge amount of processing resources +* as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially +* users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!) + +For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section. + +### The solution + +Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries. + +### Geometric complexity + +At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`. + +For example, the following sets demonstrate quadratic (`O(n^2)`) complexity: + +``` +{1,2}{3,4} => (2X2) => 13 14 23 24 +{1,2}{3,4}{5,6} => (2X2X2) => 135 136 145 146 235 236 245 246 +``` + +But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity: + +``` +{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248 + 249 257 258 259 267 268 269 347 348 349 357 + 358 359 367 368 369 +``` + +Now, imagine how this complexity grows given that each element is a n-tuple: + +``` +{1..100}{1..100} => (100X100) => 10,000 elements (38.4 kB) +{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB) +``` + +Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control. + +**More information** + +Interested in learning more about brace expansion? + +* [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion) +* [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion) +* [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) + +
    + +## Performance + +Braces is not only screaming fast, it's also more accurate the other brace expansion libraries. + +### Better algorithms + +Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_. + +Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently. + +**The proof is in the numbers** + +Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively. + +| **Pattern** | **braces** | **[minimatch][]** | +| --- | --- | --- | +| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs)| N/A (freezes) | +| `{1..1000000000000000}` | `41 B` (1ms 15μs) | N/A (freezes) | +| `{1..100000000000000}` | `40 B` (890μs) | N/A (freezes) | +| `{1..10000000000000}` | `39 B` (2ms 49μs) | N/A (freezes) | +| `{1..1000000000000}` | `38 B` (608μs) | N/A (freezes) | +| `{1..100000000000}` | `37 B` (397μs) | N/A (freezes) | +| `{1..10000000000}` | `35 B` (983μs) | N/A (freezes) | +| `{1..1000000000}` | `34 B` (798μs) | N/A (freezes) | +| `{1..100000000}` | `33 B` (733μs) | N/A (freezes) | +| `{1..10000000}` | `32 B` (5ms 632μs) | `78.89 MB` (16s 388ms 569μs) | +| `{1..1000000}` | `31 B` (1ms 381μs) | `6.89 MB` (1s 496ms 887μs) | +| `{1..100000}` | `30 B` (950μs) | `588.89 kB` (146ms 921μs) | +| `{1..10000}` | `29 B` (1ms 114μs) | `48.89 kB` (14ms 187μs) | +| `{1..1000}` | `28 B` (760μs) | `3.89 kB` (1ms 453μs) | +| `{1..100}` | `22 B` (345μs) | `291 B` (196μs) | +| `{1..10}` | `10 B` (533μs) | `20 B` (37μs) | +| `{1..3}` | `7 B` (190μs) | `5 B` (27μs) | + +### Faster algorithms + +When you need expansion, braces is still much faster. + +_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_ + +| **Pattern** | **braces** | **[minimatch][]** | +| --- | --- | --- | +| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) | +| `{1..1000000}` | `6.89 MB` (458ms 576μs) | `6.89 MB` (1s 491ms 621μs) | +| `{1..100000}` | `588.89 kB` (20ms 728μs) | `588.89 kB` (156ms 919μs) | +| `{1..10000}` | `48.89 kB` (2ms 202μs) | `48.89 kB` (13ms 641μs) | +| `{1..1000}` | `3.89 kB` (1ms 796μs) | `3.89 kB` (1ms 958μs) | +| `{1..100}` | `291 B` (424μs) | `291 B` (211μs) | +| `{1..10}` | `20 B` (487μs) | `20 B` (72μs) | +| `{1..3}` | `5 B` (166μs) | `5 B` (27μs) | + +If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js). + +## Benchmarks + +### Running benchmarks + +Install dev dependencies: + +```bash +npm i -d && npm benchmark +``` + +### Latest results + +Braces is more accurate, without sacrificing performance. + +```bash +# range (expanded) + braces x 29,040 ops/sec ±3.69% (91 runs sampled)) + minimatch x 4,735 ops/sec ±1.28% (90 runs sampled) + +# range (optimized for regex) + braces x 382,878 ops/sec ±0.56% (94 runs sampled) + minimatch x 1,040 ops/sec ±0.44% (93 runs sampled) + +# nested ranges (expanded) + braces x 19,744 ops/sec ±2.27% (92 runs sampled)) + minimatch x 4,579 ops/sec ±0.50% (93 runs sampled) + +# nested ranges (optimized for regex) + braces x 246,019 ops/sec ±2.02% (93 runs sampled) + minimatch x 1,028 ops/sec ±0.39% (94 runs sampled) + +# set (expanded) + braces x 138,641 ops/sec ±0.53% (95 runs sampled) + minimatch x 219,582 ops/sec ±0.98% (94 runs sampled) + +# set (optimized for regex) + braces x 388,408 ops/sec ±0.41% (95 runs sampled) + minimatch x 44,724 ops/sec ±0.91% (89 runs sampled) + +# nested sets (expanded) + braces x 84,966 ops/sec ±0.48% (94 runs sampled) + minimatch x 140,720 ops/sec ±0.37% (95 runs sampled) + +# nested sets (optimized for regex) + braces x 263,340 ops/sec ±2.06% (92 runs sampled) + minimatch x 28,714 ops/sec ±0.40% (90 runs sampled) +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 197 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [doowb](https://github.com/doowb) | +| 1 | [es128](https://github.com/es128) | +| 1 | [eush77](https://github.com/eush77) | +| 1 | [hemanth](https://github.com/hemanth) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ \ No newline at end of file diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js new file mode 100644 index 0000000..0eee0f5 --- /dev/null +++ b/node_modules/braces/index.js @@ -0,0 +1,170 @@ +'use strict'; + +const stringify = require('./lib/stringify'); +const compile = require('./lib/compile'); +const expand = require('./lib/expand'); +const parse = require('./lib/parse'); + +/** + * Expand the given pattern or create a regex-compatible string. + * + * ```js + * const braces = require('braces'); + * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)'] + * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c'] + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {String} + * @api public + */ + +const braces = (input, options = {}) => { + let output = []; + + if (Array.isArray(input)) { + for (let pattern of input) { + let result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); + } + + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * // braces.parse(pattern, [, options]); + * const ast = braces.parse('a/{b,c}/d'); + * console.log(ast); + * ``` + * @param {String} pattern Brace pattern to parse + * @param {Object} options + * @return {Object} Returns an AST + * @api public + */ + +braces.parse = (input, options = {}) => parse(input, options); + +/** + * Creates a braces string from an AST, or an AST node. + * + * ```js + * const braces = require('braces'); + * let ast = braces.parse('foo/{a,b}/bar'); + * console.log(stringify(ast.nodes[2])); //=> '{a,b}' + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.stringify = (input, options = {}) => { + if (typeof input === 'string') { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); +}; + +/** + * Compiles a brace pattern into a regex-compatible, optimized string. + * This method is called by the main [braces](#braces) function by default. + * + * ```js + * const braces = require('braces'); + * console.log(braces.compile('a/{b,c}/d')); + * //=> ['a/(b|c)/d'] + * ``` + * @param {String} `input` Brace pattern or AST. + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.compile = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + return compile(input, options); +}; + +/** + * Expands a brace pattern into an array. This method is called by the + * main [braces](#braces) function when `options.expand` is true. Before + * using this method it's recommended that you read the [performance notes](#performance)) + * and advantages of using [.compile](#compile) instead. + * + * ```js + * const braces = require('braces'); + * console.log(braces.expand('a/{b,c}/d')); + * //=> ['a/b/d', 'a/c/d']; + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.expand = (input, options = {}) => { + if (typeof input === 'string') { + input = braces.parse(input, options); + } + + let result = expand(input, options); + + // filter out empty strings if specified + if (options.noempty === true) { + result = result.filter(Boolean); + } + + // filter out duplicates if specified + if (options.nodupes === true) { + result = [...new Set(result)]; + } + + return result; +}; + +/** + * Processes a brace pattern and returns either an expanded array + * (if `options.expand` is true), a highly optimized regex-compatible string. + * This method is called by the main [braces](#braces) function. + * + * ```js + * const braces = require('braces'); + * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}')) + * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)' + * ``` + * @param {String} `pattern` Brace pattern + * @param {Object} `options` + * @return {Array} Returns an array of expanded values. + * @api public + */ + +braces.create = (input, options = {}) => { + if (input === '' || input.length < 3) { + return [input]; + } + + return options.expand !== true + ? braces.compile(input, options) + : braces.expand(input, options); +}; + +/** + * Expose "braces" + */ + +module.exports = braces; diff --git a/node_modules/braces/lib/compile.js b/node_modules/braces/lib/compile.js new file mode 100644 index 0000000..3e984a4 --- /dev/null +++ b/node_modules/braces/lib/compile.js @@ -0,0 +1,57 @@ +'use strict'; + +const fill = require('fill-range'); +const utils = require('./utils'); + +const compile = (ast, options = {}) => { + let walk = (node, parent = {}) => { + let invalidBlock = utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options.escapeInvalid === true ? '\\' : ''; + let output = ''; + + if (node.isOpen === true) { + return prefix + node.value; + } + if (node.isClose === true) { + return prefix + node.value; + } + + if (node.type === 'open') { + return invalid ? (prefix + node.value) : '('; + } + + if (node.type === 'close') { + return invalid ? (prefix + node.value) : ')'; + } + + if (node.type === 'comma') { + return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); + } + + if (node.value) { + return node.value; + } + + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + let range = fill(...args, { ...options, wrap: false, toRegex: true }); + + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + + if (node.nodes) { + for (let child of node.nodes) { + output += walk(child, node); + } + } + return output; + }; + + return walk(ast); +}; + +module.exports = compile; diff --git a/node_modules/braces/lib/constants.js b/node_modules/braces/lib/constants.js new file mode 100644 index 0000000..a937943 --- /dev/null +++ b/node_modules/braces/lib/constants.js @@ -0,0 +1,57 @@ +'use strict'; + +module.exports = { + MAX_LENGTH: 1024 * 64, + + // Digits + CHAR_0: '0', /* 0 */ + CHAR_9: '9', /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 'A', /* A */ + CHAR_LOWERCASE_A: 'a', /* a */ + CHAR_UPPERCASE_Z: 'Z', /* Z */ + CHAR_LOWERCASE_Z: 'z', /* z */ + + CHAR_LEFT_PARENTHESES: '(', /* ( */ + CHAR_RIGHT_PARENTHESES: ')', /* ) */ + + CHAR_ASTERISK: '*', /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: '&', /* & */ + CHAR_AT: '@', /* @ */ + CHAR_BACKSLASH: '\\', /* \ */ + CHAR_BACKTICK: '`', /* ` */ + CHAR_CARRIAGE_RETURN: '\r', /* \r */ + CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */ + CHAR_COLON: ':', /* : */ + CHAR_COMMA: ',', /* , */ + CHAR_DOLLAR: '$', /* . */ + CHAR_DOT: '.', /* . */ + CHAR_DOUBLE_QUOTE: '"', /* " */ + CHAR_EQUAL: '=', /* = */ + CHAR_EXCLAMATION_MARK: '!', /* ! */ + CHAR_FORM_FEED: '\f', /* \f */ + CHAR_FORWARD_SLASH: '/', /* / */ + CHAR_HASH: '#', /* # */ + CHAR_HYPHEN_MINUS: '-', /* - */ + CHAR_LEFT_ANGLE_BRACKET: '<', /* < */ + CHAR_LEFT_CURLY_BRACE: '{', /* { */ + CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */ + CHAR_LINE_FEED: '\n', /* \n */ + CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */ + CHAR_PERCENT: '%', /* % */ + CHAR_PLUS: '+', /* + */ + CHAR_QUESTION_MARK: '?', /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */ + CHAR_RIGHT_CURLY_BRACE: '}', /* } */ + CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */ + CHAR_SEMICOLON: ';', /* ; */ + CHAR_SINGLE_QUOTE: '\'', /* ' */ + CHAR_SPACE: ' ', /* */ + CHAR_TAB: '\t', /* \t */ + CHAR_UNDERSCORE: '_', /* _ */ + CHAR_VERTICAL_LINE: '|', /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */ +}; diff --git a/node_modules/braces/lib/expand.js b/node_modules/braces/lib/expand.js new file mode 100644 index 0000000..376c748 --- /dev/null +++ b/node_modules/braces/lib/expand.js @@ -0,0 +1,113 @@ +'use strict'; + +const fill = require('fill-range'); +const stringify = require('./stringify'); +const utils = require('./utils'); + +const append = (queue = '', stash = '', enclose = false) => { + let result = []; + + queue = [].concat(queue); + stash = [].concat(stash); + + if (!stash.length) return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash; + } + + for (let item of queue) { + if (Array.isArray(item)) { + for (let value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === 'string') ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele)); + } + } + } + return utils.flatten(result); +}; + +const expand = (ast, options = {}) => { + let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit; + + let walk = (node, parent = {}) => { + node.queue = []; + + let p = parent; + let q = parent.queue; + + while (p.type !== 'brace' && p.type !== 'root' && p.parent) { + p = p.parent; + q = p.queue; + } + + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } + + if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ['{}'])); + return; + } + + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); + } + + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } + + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } + + let enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; + + while (block.type !== 'brace' && block.type !== 'root' && block.parent) { + block = block.parent; + queue = block.queue; + } + + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i]; + + if (child.type === 'comma' && node.type === 'brace') { + if (i === 1) queue.push(''); + queue.push(''); + continue; + } + + if (child.type === 'close') { + q.push(append(q.pop(), queue, enclose)); + continue; + } + + if (child.value && child.type !== 'open') { + queue.push(append(queue.pop(), child.value)); + continue; + } + + if (child.nodes) { + walk(child, node); + } + } + + return queue; + }; + + return utils.flatten(walk(ast)); +}; + +module.exports = expand; diff --git a/node_modules/braces/lib/parse.js b/node_modules/braces/lib/parse.js new file mode 100644 index 0000000..145ea26 --- /dev/null +++ b/node_modules/braces/lib/parse.js @@ -0,0 +1,333 @@ +'use strict'; + +const stringify = require('./stringify'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + CHAR_BACKSLASH, /* \ */ + CHAR_BACKTICK, /* ` */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_RIGHT_SQUARE_BRACKET, /* ] */ + CHAR_DOUBLE_QUOTE, /* " */ + CHAR_SINGLE_QUOTE, /* ' */ + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE +} = require('./constants'); + +/** + * parse + */ + +const parse = (input, options = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + let opts = options || {}; + let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + + let ast = { type: 'root', input, nodes: [] }; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth = 0; + let value; + let memo = {}; + + /** + * Helpers + */ + + const advance = () => input[index++]; + const push = node => { + if (node.type === 'text' && prev.type === 'dot') { + prev.type = 'text'; + } + + if (prev && prev.type === 'text' && node.type === 'text') { + prev.value += node.value; + return; + } + + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; + + push({ type: 'bos' }); + + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); + + /** + * Invalid chars + */ + + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } + + /** + * Escaped chars + */ + + if (value === CHAR_BACKSLASH) { + push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() }); + continue; + } + + /** + * Right square bracket (literal): ']' + */ + + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({ type: 'text', value: '\\' + value }); + continue; + } + + /** + * Left square bracket: '[' + */ + + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + + let closed = true; + let next; + + while (index < length && (next = advance())) { + value += next; + + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + + if (brackets === 0) { + break; + } + } + } + + push({ type: 'text', value }); + continue; + } + + /** + * Parentheses + */ + + if (value === CHAR_LEFT_PARENTHESES) { + block = push({ type: 'paren', nodes: [] }); + stack.push(block); + push({ type: 'text', value }); + continue; + } + + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== 'paren') { + push({ type: 'text', value }); + continue; + } + block = stack.pop(); + push({ type: 'text', value }); + block = stack[stack.length - 1]; + continue; + } + + /** + * Quotes: '|"|` + */ + + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + let open = value; + let next; + + if (options.keepQuotes !== true) { + value = ''; + } + + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + + if (next === open) { + if (options.keepQuotes === true) value += next; + break; + } + + value += next; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Left curly brace: '{' + */ + + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + + let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true; + let brace = { + type: 'brace', + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + + block = push(brace); + stack.push(block); + push({ type: 'open', value }); + continue; + } + + /** + * Right curly brace: '}' + */ + + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== 'brace') { + push({ type: 'text', value }); + continue; + } + + let type = 'close'; + block = stack.pop(); + block.close = true; + + push({ type, value }); + depth--; + + block = stack[stack.length - 1]; + continue; + } + + /** + * Comma: ',' + */ + + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open = block.nodes.shift(); + block.nodes = [open, { type: 'text', value: stringify(block) }]; + } + + push({ type: 'comma', value }); + block.commas++; + continue; + } + + /** + * Dot: '.' + */ + + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + let siblings = block.nodes; + + if (depth === 0 || siblings.length === 0) { + push({ type: 'text', value }); + continue; + } + + if (prev.type === 'dot') { + block.range = []; + prev.value += value; + prev.type = 'range'; + + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = 'text'; + continue; + } + + block.ranges++; + block.args = []; + continue; + } + + if (prev.type === 'range') { + siblings.pop(); + + let before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + + push({ type: 'dot', value }); + continue; + } + + /** + * Text + */ + + push({ type: 'text', value }); + } + + // Mark imbalanced braces and brackets as invalid + do { + block = stack.pop(); + + if (block.type !== 'root') { + block.nodes.forEach(node => { + if (!node.nodes) { + if (node.type === 'open') node.isOpen = true; + if (node.type === 'close') node.isClose = true; + if (!node.nodes) node.type = 'text'; + node.invalid = true; + } + }); + + // get the location of the block on parent.nodes (block's siblings) + let parent = stack[stack.length - 1]; + let index = parent.nodes.indexOf(block); + // replace the (invalid) block with it's nodes + parent.nodes.splice(index, 1, ...block.nodes); + } + } while (stack.length > 0); + + push({ type: 'eos' }); + return ast; +}; + +module.exports = parse; diff --git a/node_modules/braces/lib/stringify.js b/node_modules/braces/lib/stringify.js new file mode 100644 index 0000000..414b7bc --- /dev/null +++ b/node_modules/braces/lib/stringify.js @@ -0,0 +1,32 @@ +'use strict'; + +const utils = require('./utils'); + +module.exports = (ast, options = {}) => { + let stringify = (node, parent = {}) => { + let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ''; + + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return '\\' + node.value; + } + return node.value; + } + + if (node.value) { + return node.value; + } + + if (node.nodes) { + for (let child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + + return stringify(ast); +}; + diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js new file mode 100644 index 0000000..e3551a6 --- /dev/null +++ b/node_modules/braces/lib/utils.js @@ -0,0 +1,112 @@ +'use strict'; + +exports.isInteger = num => { + if (typeof num === 'number') { + return Number.isInteger(num); + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isInteger(Number(num)); + } + return false; +}; + +/** + * Find a node of the given type + */ + +exports.find = (node, type) => node.nodes.find(node => node.type === type); + +/** + * Find a node of the given type + */ + +exports.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) return false; + if (!exports.isInteger(min) || !exports.isInteger(max)) return false; + return ((Number(max) - Number(min)) / Number(step)) >= limit; +}; + +/** + * Escape the given node with '\\' before node.value + */ + +exports.escapeNode = (block, n = 0, type) => { + let node = block.nodes[n]; + if (!node) return; + + if ((type && node.type === type) || node.type === 'open' || node.type === 'close') { + if (node.escaped !== true) { + node.value = '\\' + node.value; + node.escaped = true; + } + } +}; + +/** + * Returns true if the given brace node should be enclosed in literal braces + */ + +exports.encloseBrace = node => { + if (node.type !== 'brace') return false; + if ((node.commas >> 0 + node.ranges >> 0) === 0) { + node.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a brace node is invalid. + */ + +exports.isInvalidBrace = block => { + if (block.type !== 'brace') return false; + if (block.invalid === true || block.dollar) return true; + if ((block.commas >> 0 + block.ranges >> 0) === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; +}; + +/** + * Returns true if a node is an open or close node + */ + +exports.isOpenOrClose = node => { + if (node.type === 'open' || node.type === 'close') { + return true; + } + return node.open === true || node.close === true; +}; + +/** + * Reduce an array of text nodes. + */ + +exports.reduce = nodes => nodes.reduce((acc, node) => { + if (node.type === 'text') acc.push(node.value); + if (node.type === 'range') node.type = 'text'; + return acc; +}, []); + +/** + * Flatten an array + */ + +exports.flatten = (...args) => { + const result = []; + const flat = arr => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; +}; diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json new file mode 100644 index 0000000..3f52e34 --- /dev/null +++ b/node_modules/braces/package.json @@ -0,0 +1,77 @@ +{ + "name": "braces", + "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.", + "version": "3.0.2", + "homepage": "https://github.com/micromatch/braces", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Elan Shanker (https://github.com/es128)", + "Eugene Sharygin (https://github.com/eush77)", + "hemanth.hm (http://h3manth.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/braces", + "bugs": { + "url": "https://github.com/micromatch/braces/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "mocha", + "benchmark": "node benchmark" + }, + "dependencies": { + "fill-range": "^7.0.1" + }, + "devDependencies": { + "ansi-colors": "^3.2.4", + "bash-path": "^2.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1" + }, + "keywords": [ + "alpha", + "alphabetical", + "bash", + "brace", + "braces", + "expand", + "expansion", + "filepath", + "fill", + "fs", + "glob", + "globbing", + "letter", + "match", + "matches", + "matching", + "number", + "numerical", + "path", + "range", + "ranges", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "lint": { + "reflinks": true + }, + "plugins": [ + "gulp-format-md" + ] + } +} diff --git a/node_modules/chokidar/LICENSE b/node_modules/chokidar/LICENSE new file mode 100644 index 0000000..fa9162b --- /dev/null +++ b/node_modules/chokidar/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/chokidar/README.md b/node_modules/chokidar/README.md new file mode 100644 index 0000000..8e25dec --- /dev/null +++ b/node_modules/chokidar/README.md @@ -0,0 +1,308 @@ +# Chokidar [![Weekly downloads](https://img.shields.io/npm/dw/chokidar.svg)](https://github.com/paulmillr/chokidar) [![Yearly downloads](https://img.shields.io/npm/dy/chokidar.svg)](https://github.com/paulmillr/chokidar) + +> Minimal and efficient cross-platform file watching library + +[![NPM](https://nodei.co/npm/chokidar.png)](https://www.npmjs.com/package/chokidar) + +## Why? + +Node.js `fs.watch`: + +* Doesn't report filenames on MacOS. +* Doesn't report events at all when using editors like Sublime on MacOS. +* Often reports events twice. +* Emits most changes as `rename`. +* Does not provide an easy way to recursively watch file trees. +* Does not support recursive watching on Linux. + +Node.js `fs.watchFile`: + +* Almost as bad at event handling. +* Also does not provide any recursive watching. +* Results in high CPU utilization. + +Chokidar resolves these problems. + +Initially made for **[Brunch](https://brunch.io/)** (an ultra-swift web app build tool), it is now used in +[Microsoft's Visual Studio Code](https://github.com/microsoft/vscode), +[gulp](https://github.com/gulpjs/gulp/), +[karma](https://karma-runner.github.io/), +[PM2](https://github.com/Unitech/PM2), +[browserify](http://browserify.org/), +[webpack](https://webpack.github.io/), +[BrowserSync](https://www.browsersync.io/), +and [many others](https://www.npmjs.com/browse/depended/chokidar). +It has proven itself in production environments. + +Version 3 is out! Check out our blog post about it: [Chokidar 3: How to save 32TB of traffic every week](https://paulmillr.com/posts/chokidar-3-save-32tb-of-traffic/) + +## How? + +Chokidar does still rely on the Node.js core `fs` module, but when using +`fs.watch` and `fs.watchFile` for watching, it normalizes the events it +receives, often checking for truth by getting file stats and/or dir contents. + +On MacOS, chokidar by default uses a native extension exposing the Darwin +`FSEvents` API. This provides very efficient recursive watching compared with +implementations like `kqueue` available on most \*nix platforms. Chokidar still +does have to do some work to normalize the events received that way as well. + +On most other platforms, the `fs.watch`-based implementation is the default, which +avoids polling and keeps CPU usage down. Be advised that chokidar will initiate +watchers recursively for everything within scope of the paths that have been +specified, so be judicious about not wasting system resources by watching much +more than needed. + +## Getting started + +Install with npm: + +```sh +npm install chokidar +``` + +Then `require` and use it in your code: + +```javascript +const chokidar = require('chokidar'); + +// One-liner for current directory +chokidar.watch('.').on('all', (event, path) => { + console.log(event, path); +}); +``` + +## API + +```javascript +// Example of a more typical implementation structure + +// Initialize watcher. +const watcher = chokidar.watch('file, dir, glob, or array', { + ignored: /(^|[\/\\])\../, // ignore dotfiles + persistent: true +}); + +// Something to use when events are received. +const log = console.log.bind(console); +// Add event listeners. +watcher + .on('add', path => log(`File ${path} has been added`)) + .on('change', path => log(`File ${path} has been changed`)) + .on('unlink', path => log(`File ${path} has been removed`)); + +// More possible events. +watcher + .on('addDir', path => log(`Directory ${path} has been added`)) + .on('unlinkDir', path => log(`Directory ${path} has been removed`)) + .on('error', error => log(`Watcher error: ${error}`)) + .on('ready', () => log('Initial scan complete. Ready for changes')) + .on('raw', (event, path, details) => { // internal + log('Raw event info:', event, path, details); + }); + +// 'add', 'addDir' and 'change' events also receive stat() results as second +// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats +watcher.on('change', (path, stats) => { + if (stats) console.log(`File ${path} changed size to ${stats.size}`); +}); + +// Watch new files. +watcher.add('new-file'); +watcher.add(['new-file-2', 'new-file-3', '**/other-file*']); + +// Get list of actual paths being watched on the filesystem +var watchedPaths = watcher.getWatched(); + +// Un-watch some files. +await watcher.unwatch('new-file*'); + +// Stop watching. +// The method is async! +watcher.close().then(() => console.log('closed')); + +// Full list of options. See below for descriptions. +// Do not use this example! +chokidar.watch('file', { + persistent: true, + + ignored: '*.txt', + ignoreInitial: false, + followSymlinks: true, + cwd: '.', + disableGlobbing: false, + + usePolling: false, + interval: 100, + binaryInterval: 300, + alwaysStat: false, + depth: 99, + awaitWriteFinish: { + stabilityThreshold: 2000, + pollInterval: 100 + }, + + ignorePermissionErrors: false, + atomic: true // or a custom 'atomicity delay', in milliseconds (default 100) +}); + +``` + +`chokidar.watch(paths, [options])` + +* `paths` (string or array of strings). Paths to files, dirs to be watched +recursively, or glob patterns. + - Note: globs must not contain windows separators (`\`), + because that's how they work by the standard — + you'll need to replace them with forward slashes (`/`). + - Note 2: for additional glob documentation, check out low-level + library: [picomatch](https://github.com/micromatch/picomatch). +* `options` (object) Options object as defined below: + +#### Persistence + +* `persistent` (default: `true`). Indicates whether the process +should continue to run as long as files are being watched. If set to +`false` when using `fsevents` to watch, no more events will be emitted +after `ready`, even if the process continues to run. + +#### Path filtering + +* `ignored` ([anymatch](https://github.com/es128/anymatch)-compatible definition) +Defines files/paths to be ignored. The whole relative or absolute path is +tested, not just filename. If a function with two arguments is provided, it +gets called twice per path - once with a single argument (the path), second +time with two arguments (the path and the +[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) +object of that path). +* `ignoreInitial` (default: `false`). If set to `false` then `add`/`addDir` events are also emitted for matching paths while +instantiating the watching as chokidar discovers these file paths (before the `ready` event). +* `followSymlinks` (default: `true`). When `false`, only the +symlinks themselves will be watched for changes instead of following +the link references and bubbling events through the link's path. +* `cwd` (no default). The base directory from which watch `paths` are to be +derived. Paths emitted with events will be relative to this. +* `disableGlobbing` (default: `false`). If set to `true` then the strings passed to `.watch()` and `.add()` are treated as +literal path names, even if they look like globs. + +#### Performance + +* `usePolling` (default: `false`). +Whether to use fs.watchFile (backed by polling), or fs.watch. If polling +leads to high CPU utilization, consider setting this to `false`. It is +typically necessary to **set this to `true` to successfully watch files over +a network**, and it may be necessary to successfully watch files in other +non-standard situations. Setting to `true` explicitly on MacOS overrides the +`useFsEvents` default. You may also set the CHOKIDAR_USEPOLLING env variable +to true (1) or false (0) in order to override this option. +* _Polling-specific settings_ (effective when `usePolling: true`) + * `interval` (default: `100`). Interval of file system polling, in milliseconds. You may also + set the CHOKIDAR_INTERVAL env variable to override this option. + * `binaryInterval` (default: `300`). Interval of file system + polling for binary files. + ([see list of binary extensions](https://github.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) +* `useFsEvents` (default: `true` on MacOS). Whether to use the +`fsevents` watching interface if available. When set to `true` explicitly +and `fsevents` is available this supercedes the `usePolling` setting. When +set to `false` on MacOS, `usePolling: true` becomes the default. +* `alwaysStat` (default: `false`). If relying upon the +[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) +object that may get passed with `add`, `addDir`, and `change` events, set +this to `true` to ensure it is provided even in cases where it wasn't +already available from the underlying watch events. +* `depth` (default: `undefined`). If set, limits how many levels of +subdirectories will be traversed. +* `awaitWriteFinish` (default: `false`). +By default, the `add` event will fire when a file first appears on disk, before +the entire file has been written. Furthermore, in some cases some `change` +events will be emitted while the file is being written. In some cases, +especially when watching for large files there will be a need to wait for the +write operation to finish before responding to a file creation or modification. +Setting `awaitWriteFinish` to `true` (or a truthy value) will poll file size, +holding its `add` and `change` events until the size does not change for a +configurable amount of time. The appropriate duration setting is heavily +dependent on the OS and hardware. For accurate detection this parameter should +be relatively high, making file watching much less responsive. +Use with caution. + * *`options.awaitWriteFinish` can be set to an object in order to adjust + timing params:* + * `awaitWriteFinish.stabilityThreshold` (default: 2000). Amount of time in + milliseconds for a file size to remain constant before emitting its event. + * `awaitWriteFinish.pollInterval` (default: 100). File size polling interval, in milliseconds. + +#### Errors + +* `ignorePermissionErrors` (default: `false`). Indicates whether to watch files +that don't have read permissions if possible. If watching fails due to `EPERM` +or `EACCES` with this set to `true`, the errors will be suppressed silently. +* `atomic` (default: `true` if `useFsEvents` and `usePolling` are `false`). +Automatically filters out artifacts that occur when using editors that use +"atomic writes" instead of writing directly to the source file. If a file is +re-added within 100 ms of being deleted, Chokidar emits a `change` event +rather than `unlink` then `add`. If the default of 100 ms does not work well +for you, you can override it by setting `atomic` to a custom value, in +milliseconds. + +### Methods & Events + +`chokidar.watch()` produces an instance of `FSWatcher`. Methods of `FSWatcher`: + +* `.add(path / paths)`: Add files, directories, or glob patterns for tracking. +Takes an array of strings or just one string. +* `.on(event, callback)`: Listen for an FS event. +Available events: `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `ready`, +`raw`, `error`. +Additionally `all` is available which gets emitted with the underlying event +name and path for every event other than `ready`, `raw`, and `error`. `raw` is internal, use it carefully. +* `.unwatch(path / paths)`: Stop watching files, directories, or glob patterns. +Takes an array of strings or just one string. +* `.close()`: **async** Removes all listeners from watched files. Asynchronous, returns Promise. Use with `await` to ensure bugs don't happen. +* `.getWatched()`: Returns an object representing all the paths on the file +system being watched by this `FSWatcher` instance. The object's keys are all the +directories (using absolute paths unless the `cwd` option was used), and the +values are arrays of the names of the items contained in each directory. + +## CLI + +If you need a CLI interface for your file watching, check out +[chokidar-cli](https://github.com/open-cli-tools/chokidar-cli), allowing you to +execute a command on each change, or get a stdio stream of change events. + +## Install Troubleshooting + +* `npm WARN optional dep failed, continuing fsevents@n.n.n` + * This message is normal part of how `npm` handles optional dependencies and is + not indicative of a problem. Even if accompanied by other related error messages, + Chokidar should function properly. + +* `TypeError: fsevents is not a constructor` + * Update chokidar by doing `rm -rf node_modules package-lock.json yarn.lock && npm install`, or update your dependency that uses chokidar. + +* Chokidar is producing `ENOSP` error on Linux, like this: + * `bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell` + `Error: watch /home/ ENOSPC` + * This means Chokidar ran out of file handles and you'll need to increase their count by executing the following command in Terminal: + `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p` + +## Changelog + +For more detailed changelog, see [`full_changelog.md`](.github/full_changelog.md). +- **v3.5 (Jan 6, 2021):** Support for ARM Macs with Apple Silicon. Fixes for deleted symlinks. +- **v3.4 (Apr 26, 2020):** Support for directory-based symlinks. Fixes for macos file replacement. +- **v3.3 (Nov 2, 2019):** `FSWatcher#close()` method became async. That fixes IO race conditions related to close method. +- **v3.2 (Oct 1, 2019):** Improve Linux RAM usage by 50%. Race condition fixes. Windows glob fixes. Improve stability by using tight range of dependency versions. +- **v3.1 (Sep 16, 2019):** dotfiles are no longer filtered out by default. Use `ignored` option if needed. Improve initial Linux scan time by 50%. +- **v3 (Apr 30, 2019):** massive CPU & RAM consumption improvements; reduces deps / package size by a factor of 17x and bumps Node.js requirement to v8.16 and higher. +- **v2 (Dec 29, 2017):** Globs are now posix-style-only; without windows support. Tons of bugfixes. +- **v1 (Apr 7, 2015):** Glob support, symlink support, tons of bugfixes. Node 0.8+ is supported +- **v0.1 (Apr 20, 2012):** Initial release, extracted from [Brunch](https://github.com/brunch/brunch/blob/9847a065aea300da99bd0753f90354cde9de1261/src/helpers.coffee#L66) + +## Also + +Why was chokidar named this way? What's the meaning behind it? + +>Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India. + +## License + +MIT (c) Paul Miller (), see [LICENSE](LICENSE) file. diff --git a/node_modules/chokidar/index.js b/node_modules/chokidar/index.js new file mode 100644 index 0000000..8752893 --- /dev/null +++ b/node_modules/chokidar/index.js @@ -0,0 +1,973 @@ +'use strict'; + +const { EventEmitter } = require('events'); +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); +const readdirp = require('readdirp'); +const anymatch = require('anymatch').default; +const globParent = require('glob-parent'); +const isGlob = require('is-glob'); +const braces = require('braces'); +const normalizePath = require('normalize-path'); + +const NodeFsHandler = require('./lib/nodefs-handler'); +const FsEventsHandler = require('./lib/fsevents-handler'); +const { + EV_ALL, + EV_READY, + EV_ADD, + EV_CHANGE, + EV_UNLINK, + EV_ADD_DIR, + EV_UNLINK_DIR, + EV_RAW, + EV_ERROR, + + STR_CLOSE, + STR_END, + + BACK_SLASH_RE, + DOUBLE_SLASH_RE, + SLASH_OR_BACK_SLASH_RE, + DOT_RE, + REPLACER_RE, + + SLASH, + SLASH_SLASH, + BRACE_START, + BANG, + ONE_DOT, + TWO_DOTS, + GLOBSTAR, + SLASH_GLOBSTAR, + ANYMATCH_OPTS, + STRING_TYPE, + FUNCTION_TYPE, + EMPTY_STR, + EMPTY_FN, + + isWindows, + isMacos, + isIBMi +} = require('./lib/constants'); + +const stat = promisify(fs.stat); +const readdir = promisify(fs.readdir); + +/** + * @typedef {String} Path + * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName + * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType + */ + +/** + * + * @typedef {Object} WatchHelpers + * @property {Boolean} followSymlinks + * @property {'stat'|'lstat'} statMethod + * @property {Path} path + * @property {Path} watchPath + * @property {Function} entryPath + * @property {Boolean} hasGlob + * @property {Object} globFilter + * @property {Function} filterPath + * @property {Function} filterDir + */ + +const arrify = (value = []) => Array.isArray(value) ? value : [value]; +const flatten = (list, result = []) => { + list.forEach(item => { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + }); + return result; +}; + +const unifyPaths = (paths_) => { + /** + * @type {Array} + */ + const paths = flatten(arrify(paths_)); + if (!paths.every(p => typeof p === STRING_TYPE)) { + throw new TypeError(`Non-string provided as watch path: ${paths}`); + } + return paths.map(normalizePathToUnix); +}; + +// If SLASH_SLASH occurs at the beginning of path, it is not replaced +// because "//StoragePC/DrivePool/Movies" is a valid network path +const toUnix = (string) => { + let str = string.replace(BACK_SLASH_RE, SLASH); + let prepend = false; + if (str.startsWith(SLASH_SLASH)) { + prepend = true; + } + while (str.match(DOUBLE_SLASH_RE)) { + str = str.replace(DOUBLE_SLASH_RE, SLASH); + } + if (prepend) { + str = SLASH + str; + } + return str; +}; + +// Our version of upath.normalize +// TODO: this is not equal to path-normalize module - investigate why +const normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path))); + +const normalizeIgnored = (cwd = EMPTY_STR) => (path) => { + if (typeof path !== STRING_TYPE) return path; + return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path)); +}; + +const getAbsolutePath = (path, cwd) => { + if (sysPath.isAbsolute(path)) { + return path; + } + if (path.startsWith(BANG)) { + return BANG + sysPath.join(cwd, path.slice(1)); + } + return sysPath.join(cwd, path); +}; + +const undef = (opts, key) => opts[key] === undefined; + +/** + * Directory entry. + * @property {Path} path + * @property {Set} items + */ +class DirEntry { + /** + * @param {Path} dir + * @param {Function} removeWatcher + */ + constructor(dir, removeWatcher) { + this.path = dir; + this._removeWatcher = removeWatcher; + /** @type {Set} */ + this.items = new Set(); + } + + add(item) { + const {items} = this; + if (!items) return; + if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item); + } + + async remove(item) { + const {items} = this; + if (!items) return; + items.delete(item); + if (items.size > 0) return; + + const dir = this.path; + try { + await readdir(dir); + } catch (err) { + if (this._removeWatcher) { + this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir)); + } + } + } + + has(item) { + const {items} = this; + if (!items) return; + return items.has(item); + } + + /** + * @returns {Array} + */ + getChildren() { + const {items} = this; + if (!items) return; + return [...items.values()]; + } + + dispose() { + this.items.clear(); + delete this.path; + delete this._removeWatcher; + delete this.items; + Object.freeze(this); + } +} + +const STAT_METHOD_F = 'stat'; +const STAT_METHOD_L = 'lstat'; +class WatchHelper { + constructor(path, watchPath, follow, fsw) { + this.fsw = fsw; + this.path = path = path.replace(REPLACER_RE, EMPTY_STR); + this.watchPath = watchPath; + this.fullWatchPath = sysPath.resolve(watchPath); + this.hasGlob = watchPath !== path; + /** @type {object|boolean} */ + if (path === EMPTY_STR) this.hasGlob = false; + this.globSymlink = this.hasGlob && follow ? undefined : false; + this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false; + this.dirParts = this.getDirParts(path); + this.dirParts.forEach((parts) => { + if (parts.length > 1) parts.pop(); + }); + this.followSymlinks = follow; + this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L; + } + + checkGlobSymlink(entry) { + // only need to resolve once + // first entry should always have entry.parentDir === EMPTY_STR + if (this.globSymlink === undefined) { + this.globSymlink = entry.fullParentDir === this.fullWatchPath ? + false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath}; + } + + if (this.globSymlink) { + return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath); + } + + return entry.fullPath; + } + + entryPath(entry) { + return sysPath.join(this.watchPath, + sysPath.relative(this.watchPath, this.checkGlobSymlink(entry)) + ); + } + + filterPath(entry) { + const {stats} = entry; + if (stats && stats.isSymbolicLink()) return this.filterDir(entry); + const resolvedPath = this.entryPath(entry); + const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ? + this.globFilter(resolvedPath) : true; + return matchesGlob && + this.fsw._isntIgnored(resolvedPath, stats) && + this.fsw._hasReadPermissions(stats); + } + + getDirParts(path) { + if (!this.hasGlob) return []; + const parts = []; + const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path]; + expandedPath.forEach((path) => { + parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE)); + }); + return parts; + } + + filterDir(entry) { + if (this.hasGlob) { + const entryParts = this.getDirParts(this.checkGlobSymlink(entry)); + let globstar = false; + this.unmatchedGlob = !this.dirParts.some((parts) => { + return parts.every((part, i) => { + if (part === GLOBSTAR) globstar = true; + return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS); + }); + }); + } + return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats); + } +} + +/** + * Watches files & directories for changes. Emitted events: + * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error` + * + * new FSWatcher() + * .add(directories) + * .on('add', path => log('File', path, 'was added')) + */ +class FSWatcher extends EventEmitter { +// Not indenting methods for history sake; for now. +constructor(_opts) { + super(); + + const opts = {}; + if (_opts) Object.assign(opts, _opts); // for frozen objects + + /** @type {Map} */ + this._watched = new Map(); + /** @type {Map} */ + this._closers = new Map(); + /** @type {Set} */ + this._ignoredPaths = new Set(); + + /** @type {Map} */ + this._throttled = new Map(); + + /** @type {Map} */ + this._symlinkPaths = new Map(); + + this._streams = new Set(); + this.closed = false; + + // Set up default options. + if (undef(opts, 'persistent')) opts.persistent = true; + if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false; + if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false; + if (undef(opts, 'interval')) opts.interval = 100; + if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300; + if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false; + opts.enableBinaryInterval = opts.binaryInterval !== opts.interval; + + // Enable fsevents on OS X when polling isn't explicitly enabled. + if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling; + + // If we can't use fsevents, ensure the options reflect it's disabled. + const canUseFsEvents = FsEventsHandler.canUse(); + if (!canUseFsEvents) opts.useFsEvents = false; + + // Use polling on Mac if not using fsevents. + // Other platforms use non-polling fs_watch. + if (undef(opts, 'usePolling') && !opts.useFsEvents) { + opts.usePolling = isMacos; + } + + // Always default to polling on IBM i because fs.watch() is not available on IBM i. + if(isIBMi) { + opts.usePolling = true; + } + + // Global override (useful for end-developers that need to force polling for all + // instances of chokidar, regardless of usage/dependency depth) + const envPoll = process.env.CHOKIDAR_USEPOLLING; + if (envPoll !== undefined) { + const envLower = envPoll.toLowerCase(); + + if (envLower === 'false' || envLower === '0') { + opts.usePolling = false; + } else if (envLower === 'true' || envLower === '1') { + opts.usePolling = true; + } else { + opts.usePolling = !!envLower; + } + } + const envInterval = process.env.CHOKIDAR_INTERVAL; + if (envInterval) { + opts.interval = Number.parseInt(envInterval, 10); + } + + // Editor atomic write normalization enabled by default with fs.watch + if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents; + if (opts.atomic) this._pendingUnlinks = new Map(); + + if (undef(opts, 'followSymlinks')) opts.followSymlinks = true; + + if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false; + if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {}; + const awf = opts.awaitWriteFinish; + if (awf) { + if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000; + if (!awf.pollInterval) awf.pollInterval = 100; + this._pendingWrites = new Map(); + } + if (opts.ignored) opts.ignored = arrify(opts.ignored); + + let readyCalls = 0; + this._emitReady = () => { + readyCalls++; + if (readyCalls >= this._readyCount) { + this._emitReady = EMPTY_FN; + this._readyEmitted = true; + // use process.nextTick to allow time for listener to be bound + process.nextTick(() => this.emit(EV_READY)); + } + }; + this._emitRaw = (...args) => this.emit(EV_RAW, ...args); + this._readyEmitted = false; + this.options = opts; + + // Initialize with proper watcher. + if (opts.useFsEvents) { + this._fsEventsHandler = new FsEventsHandler(this); + } else { + this._nodeFsHandler = new NodeFsHandler(this); + } + + // You’re frozen when your heart’s not open. + Object.freeze(opts); +} + +// Public methods + +/** + * Adds paths to be watched on an existing FSWatcher instance + * @param {Path|Array} paths_ + * @param {String=} _origAdd private; for handling non-existent paths to be watched + * @param {Boolean=} _internal private; indicates a non-user add + * @returns {FSWatcher} for chaining + */ +add(paths_, _origAdd, _internal) { + const {cwd, disableGlobbing} = this.options; + this.closed = false; + let paths = unifyPaths(paths_); + if (cwd) { + paths = paths.map((path) => { + const absPath = getAbsolutePath(path, cwd); + + // Check `path` instead of `absPath` because the cwd portion can't be a glob + if (disableGlobbing || !isGlob(path)) { + return absPath; + } + return normalizePath(absPath); + }); + } + + // set aside negated glob strings + paths = paths.filter((path) => { + if (path.startsWith(BANG)) { + this._ignoredPaths.add(path.slice(1)); + return false; + } + + // if a path is being added that was previously ignored, stop ignoring it + this._ignoredPaths.delete(path); + this._ignoredPaths.delete(path + SLASH_GLOBSTAR); + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = undefined; + + return true; + }); + + if (this.options.useFsEvents && this._fsEventsHandler) { + if (!this._readyCount) this._readyCount = paths.length; + if (this.options.persistent) this._readyCount += paths.length; + paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path)); + } else { + if (!this._readyCount) this._readyCount = 0; + this._readyCount += paths.length; + Promise.all( + paths.map(async path => { + const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd); + if (res) this._emitReady(); + return res; + }) + ).then(results => { + if (this.closed) return; + results.filter(item => item).forEach(item => { + this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); + }); + }); + } + + return this; +} + +/** + * Close watchers or start ignoring events from specified paths. + * @param {Path|Array} paths_ - string or array of strings, file/directory paths and/or globs + * @returns {FSWatcher} for chaining +*/ +unwatch(paths_) { + if (this.closed) return this; + const paths = unifyPaths(paths_); + const {cwd} = this.options; + + paths.forEach((path) => { + // convert to absolute path unless relative path already matches + if (!sysPath.isAbsolute(path) && !this._closers.has(path)) { + if (cwd) path = sysPath.join(cwd, path); + path = sysPath.resolve(path); + } + + this._closePath(path); + + this._ignoredPaths.add(path); + if (this._watched.has(path)) { + this._ignoredPaths.add(path + SLASH_GLOBSTAR); + } + + // reset the cached userIgnored anymatch fn + // to make ignoredPaths changes effective + this._userIgnored = undefined; + }); + + return this; +} + +/** + * Close watchers and remove all listeners from watched paths. + * @returns {Promise}. +*/ +close() { + if (this.closed) return this._closePromise; + this.closed = true; + + // Memory management. + this.removeAllListeners(); + const closers = []; + this._closers.forEach(closerList => closerList.forEach(closer => { + const promise = closer(); + if (promise instanceof Promise) closers.push(promise); + })); + this._streams.forEach(stream => stream.destroy()); + this._userIgnored = undefined; + this._readyCount = 0; + this._readyEmitted = false; + this._watched.forEach(dirent => dirent.dispose()); + ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => { + this[`_${key}`].clear(); + }); + + this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve(); + return this._closePromise; +} + +/** + * Expose list of watched paths + * @returns {Object} for chaining +*/ +getWatched() { + const watchList = {}; + this._watched.forEach((entry, dir) => { + const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; + watchList[key || ONE_DOT] = entry.getChildren().sort(); + }); + return watchList; +} + +emitWithAll(event, args) { + this.emit(...args); + if (event !== EV_ERROR) this.emit(EV_ALL, ...args); +} + +// Common helpers +// -------------- + +/** + * Normalize and emit events. + * Calling _emit DOES NOT MEAN emit() would be called! + * @param {EventName} event Type of event + * @param {Path} path File or directory path + * @param {*=} val1 arguments to be passed with event + * @param {*=} val2 + * @param {*=} val3 + * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ +async _emit(event, path, val1, val2, val3) { + if (this.closed) return; + + const opts = this.options; + if (isWindows) path = sysPath.normalize(path); + if (opts.cwd) path = sysPath.relative(opts.cwd, path); + /** @type Array */ + const args = [event, path]; + if (val3 !== undefined) args.push(val1, val2, val3); + else if (val2 !== undefined) args.push(val1, val2); + else if (val1 !== undefined) args.push(val1); + + const awf = opts.awaitWriteFinish; + let pw; + if (awf && (pw = this._pendingWrites.get(path))) { + pw.lastChange = new Date(); + return this; + } + + if (opts.atomic) { + if (event === EV_UNLINK) { + this._pendingUnlinks.set(path, args); + setTimeout(() => { + this._pendingUnlinks.forEach((entry, path) => { + this.emit(...entry); + this.emit(EV_ALL, ...entry); + this._pendingUnlinks.delete(path); + }); + }, typeof opts.atomic === 'number' ? opts.atomic : 100); + return this; + } + if (event === EV_ADD && this._pendingUnlinks.has(path)) { + event = args[0] = EV_CHANGE; + this._pendingUnlinks.delete(path); + } + } + + if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) { + const awfEmit = (err, stats) => { + if (err) { + event = args[0] = EV_ERROR; + args[1] = err; + this.emitWithAll(event, args); + } else if (stats) { + // if stats doesn't exist the file must have been deleted + if (args.length > 2) { + args[2] = stats; + } else { + args.push(stats); + } + this.emitWithAll(event, args); + } + }; + + this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); + return this; + } + + if (event === EV_CHANGE) { + const isThrottled = !this._throttle(EV_CHANGE, path, 50); + if (isThrottled) return this; + } + + if (opts.alwaysStat && val1 === undefined && + (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE) + ) { + const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path; + let stats; + try { + stats = await stat(fullPath); + } catch (err) {} + // Suppress event when fs_stat fails, to avoid sending undefined 'stat' + if (!stats || this.closed) return; + args.push(stats); + } + this.emitWithAll(event, args); + + return this; +} + +/** + * Common handler for errors + * @param {Error} error + * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ +_handleError(error) { + const code = error && error.code; + if (error && code !== 'ENOENT' && code !== 'ENOTDIR' && + (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES')) + ) { + this.emit(EV_ERROR, error); + } + return error || this.closed; +} + +/** + * Helper utility for throttling + * @param {ThrottleType} actionType type being throttled + * @param {Path} path being acted upon + * @param {Number} timeout duration of time to suppress duplicate actions + * @returns {Object|false} tracking object or false if action should be suppressed + */ +_throttle(actionType, path, timeout) { + if (!this._throttled.has(actionType)) { + this._throttled.set(actionType, new Map()); + } + + /** @type {Map} */ + const action = this._throttled.get(actionType); + /** @type {Object} */ + const actionPath = action.get(path); + + if (actionPath) { + actionPath.count++; + return false; + } + + let timeoutObject; + const clear = () => { + const item = action.get(path); + const count = item ? item.count : 0; + action.delete(path); + clearTimeout(timeoutObject); + if (item) clearTimeout(item.timeoutObject); + return count; + }; + timeoutObject = setTimeout(clear, timeout); + const thr = {timeoutObject, clear, count: 0}; + action.set(path, thr); + return thr; +} + +_incrReadyCount() { + return this._readyCount++; +} + +/** + * Awaits write operation to finish. + * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback. + * @param {Path} path being acted upon + * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished + * @param {EventName} event + * @param {Function} awfEmit Callback to be called when ready for event to be emitted. + */ +_awaitWriteFinish(path, threshold, event, awfEmit) { + let timeoutHandler; + + let fullPath = path; + if (this.options.cwd && !sysPath.isAbsolute(path)) { + fullPath = sysPath.join(this.options.cwd, path); + } + + const now = new Date(); + + const awaitWriteFinish = (prevStat) => { + fs.stat(fullPath, (err, curStat) => { + if (err || !this._pendingWrites.has(path)) { + if (err && err.code !== 'ENOENT') awfEmit(err); + return; + } + + const now = Number(new Date()); + + if (prevStat && curStat.size !== prevStat.size) { + this._pendingWrites.get(path).lastChange = now; + } + const pw = this._pendingWrites.get(path); + const df = now - pw.lastChange; + + if (df >= threshold) { + this._pendingWrites.delete(path); + awfEmit(undefined, curStat); + } else { + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval, + curStat + ); + } + }); + }; + + if (!this._pendingWrites.has(path)) { + this._pendingWrites.set(path, { + lastChange: now, + cancelWait: () => { + this._pendingWrites.delete(path); + clearTimeout(timeoutHandler); + return event; + } + }); + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval + ); + } +} + +_getGlobIgnored() { + return [...this._ignoredPaths.values()]; +} + +/** + * Determines whether user has asked to ignore this path. + * @param {Path} path filepath or dir + * @param {fs.Stats=} stats result of fs.stat + * @returns {Boolean} + */ +_isIgnored(path, stats) { + if (this.options.atomic && DOT_RE.test(path)) return true; + if (!this._userIgnored) { + const {cwd} = this.options; + const ign = this.options.ignored; + + const ignored = ign && ign.map(normalizeIgnored(cwd)); + const paths = arrify(ignored) + .filter((path) => typeof path === STRING_TYPE && !isGlob(path)) + .map((path) => path + SLASH_GLOBSTAR); + const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths); + this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS); + } + + return this._userIgnored([path, stats]); +} + +_isntIgnored(path, stat) { + return !this._isIgnored(path, stat); +} + +/** + * Provides a set of common helpers and properties relating to symlink and glob handling. + * @param {Path} path file, directory, or glob pattern being watched + * @param {Number=} depth at any depth > 0, this isn't a glob + * @returns {WatchHelper} object containing helpers for this path + */ +_getWatchHelpers(path, depth) { + const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); + const follow = this.options.followSymlinks; + + return new WatchHelper(path, watchPath, follow, this); +} + +// Directory helpers +// ----------------- + +/** + * Provides directory tracking objects + * @param {String} directory path of the directory + * @returns {DirEntry} the directory's tracking object + */ +_getWatchedDir(directory) { + if (!this._boundRemove) this._boundRemove = this._remove.bind(this); + const dir = sysPath.resolve(directory); + if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove)); + return this._watched.get(dir); +} + +// File helpers +// ------------ + +/** + * Check for read permissions. + * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405 + * @param {fs.Stats} stats - object, result of fs_stat + * @returns {Boolean} indicates whether the file can be read +*/ +_hasReadPermissions(stats) { + if (this.options.ignorePermissionErrors) return true; + + // stats.mode may be bigint + const md = stats && Number.parseInt(stats.mode, 10); + const st = md & 0o777; + const it = Number.parseInt(st.toString(8)[0], 10); + return Boolean(4 & it); +} + +/** + * Handles emitting unlink events for + * files and directories, and via recursion, for + * files and directories within directories that are unlinked + * @param {String} directory within which the following item is located + * @param {String} item base path of item/directory + * @returns {void} +*/ +_remove(directory, item, isDirectory) { + // if what is being deleted is a directory, get that directory's paths + // for recursive deleting and cleaning of watched object + // if it is not a directory, nestedDirectoryChildren will be empty array + const path = sysPath.join(directory, item); + const fullPath = sysPath.resolve(path); + isDirectory = isDirectory != null + ? isDirectory + : this._watched.has(path) || this._watched.has(fullPath); + + // prevent duplicate handling in case of arriving here nearly simultaneously + // via multiple paths (such as _handleFile and _handleDir) + if (!this._throttle('remove', path, 100)) return; + + // if the only watched file is removed, watch for its return + if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) { + this.add(directory, item, true); + } + + // This will create a new entry in the watched object in either case + // so we got to do the directory check beforehand + const wp = this._getWatchedDir(path); + const nestedDirectoryChildren = wp.getChildren(); + + // Recursively remove children directories / files. + nestedDirectoryChildren.forEach(nested => this._remove(path, nested)); + + // Check if item was on the watched list and remove it + const parent = this._getWatchedDir(directory); + const wasTracked = parent.has(item); + parent.remove(item); + + // Fixes issue #1042 -> Relative paths were detected and added as symlinks + // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612), + // but never removed from the map in case the path was deleted. + // This leads to an incorrect state if the path was recreated: + // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553 + if (this._symlinkPaths.has(fullPath)) { + this._symlinkPaths.delete(fullPath); + } + + // If we wait for this file to be fully written, cancel the wait. + let relPath = path; + if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path); + if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) { + const event = this._pendingWrites.get(relPath).cancelWait(); + if (event === EV_ADD) return; + } + + // The Entry will either be a directory that just got removed + // or a bogus entry to a file, in either case we have to remove it + this._watched.delete(path); + this._watched.delete(fullPath); + const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK; + if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path); + + // Avoid conflicts if we later create another file with the same name + if (!this.options.useFsEvents) { + this._closePath(path); + } +} + +/** + * Closes all watchers for a path + * @param {Path} path + */ +_closePath(path) { + this._closeFile(path) + const dir = sysPath.dirname(path); + this._getWatchedDir(dir).remove(sysPath.basename(path)); +} + +/** + * Closes only file-specific watchers + * @param {Path} path + */ +_closeFile(path) { + const closers = this._closers.get(path); + if (!closers) return; + closers.forEach(closer => closer()); + this._closers.delete(path); +} + +/** + * + * @param {Path} path + * @param {Function} closer + */ +_addPathCloser(path, closer) { + if (!closer) return; + let list = this._closers.get(path); + if (!list) { + list = []; + this._closers.set(path, list); + } + list.push(closer); +} + +_readdirp(root, opts) { + if (this.closed) return; + const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts}; + let stream = readdirp(root, options); + this._streams.add(stream); + stream.once(STR_CLOSE, () => { + stream = undefined; + }); + stream.once(STR_END, () => { + if (stream) { + this._streams.delete(stream); + stream = undefined; + } + }); + return stream; +} + +} + +// Export FSWatcher class +exports.FSWatcher = FSWatcher; + +/** + * Instantiates watcher with paths to be tracked. + * @param {String|Array} paths file/directory paths and/or globs + * @param {Object=} options chokidar opts + * @returns an instance of FSWatcher for chaining. + */ +const watch = (paths, options) => { + const watcher = new FSWatcher(options); + watcher.add(paths); + return watcher; +}; + +exports.watch = watch; diff --git a/node_modules/chokidar/lib/constants.js b/node_modules/chokidar/lib/constants.js new file mode 100644 index 0000000..4743865 --- /dev/null +++ b/node_modules/chokidar/lib/constants.js @@ -0,0 +1,66 @@ +'use strict'; + +const {sep} = require('path'); +const {platform} = process; +const os = require('os'); + +exports.EV_ALL = 'all'; +exports.EV_READY = 'ready'; +exports.EV_ADD = 'add'; +exports.EV_CHANGE = 'change'; +exports.EV_ADD_DIR = 'addDir'; +exports.EV_UNLINK = 'unlink'; +exports.EV_UNLINK_DIR = 'unlinkDir'; +exports.EV_RAW = 'raw'; +exports.EV_ERROR = 'error'; + +exports.STR_DATA = 'data'; +exports.STR_END = 'end'; +exports.STR_CLOSE = 'close'; + +exports.FSEVENT_CREATED = 'created'; +exports.FSEVENT_MODIFIED = 'modified'; +exports.FSEVENT_DELETED = 'deleted'; +exports.FSEVENT_MOVED = 'moved'; +exports.FSEVENT_CLONED = 'cloned'; +exports.FSEVENT_UNKNOWN = 'unknown'; +exports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1; +exports.FSEVENT_TYPE_FILE = 'file'; +exports.FSEVENT_TYPE_DIRECTORY = 'directory'; +exports.FSEVENT_TYPE_SYMLINK = 'symlink'; + +exports.KEY_LISTENERS = 'listeners'; +exports.KEY_ERR = 'errHandlers'; +exports.KEY_RAW = 'rawEmitters'; +exports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW]; + +exports.DOT_SLASH = `.${sep}`; + +exports.BACK_SLASH_RE = /\\/g; +exports.DOUBLE_SLASH_RE = /\/\//; +exports.SLASH_OR_BACK_SLASH_RE = /[/\\]/; +exports.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/; +exports.REPLACER_RE = /^\.[/\\]/; + +exports.SLASH = '/'; +exports.SLASH_SLASH = '//'; +exports.BRACE_START = '{'; +exports.BANG = '!'; +exports.ONE_DOT = '.'; +exports.TWO_DOTS = '..'; +exports.STAR = '*'; +exports.GLOBSTAR = '**'; +exports.ROOT_GLOBSTAR = '/**/*'; +exports.SLASH_GLOBSTAR = '/**'; +exports.DIR_SUFFIX = 'Dir'; +exports.ANYMATCH_OPTS = {dot: true}; +exports.STRING_TYPE = 'string'; +exports.FUNCTION_TYPE = 'function'; +exports.EMPTY_STR = ''; +exports.EMPTY_FN = () => {}; +exports.IDENTITY_FN = val => val; + +exports.isWindows = platform === 'win32'; +exports.isMacos = platform === 'darwin'; +exports.isLinux = platform === 'linux'; +exports.isIBMi = os.type() === 'OS400'; diff --git a/node_modules/chokidar/lib/fsevents-handler.js b/node_modules/chokidar/lib/fsevents-handler.js new file mode 100644 index 0000000..fe29393 --- /dev/null +++ b/node_modules/chokidar/lib/fsevents-handler.js @@ -0,0 +1,526 @@ +'use strict'; + +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); + +let fsevents; +try { + fsevents = require('fsevents'); +} catch (error) { + if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error); +} + +if (fsevents) { + // TODO: real check + const mtch = process.version.match(/v(\d+)\.(\d+)/); + if (mtch && mtch[1] && mtch[2]) { + const maj = Number.parseInt(mtch[1], 10); + const min = Number.parseInt(mtch[2], 10); + if (maj === 8 && min < 16) { + fsevents = undefined; + } + } +} + +const { + EV_ADD, + EV_CHANGE, + EV_ADD_DIR, + EV_UNLINK, + EV_ERROR, + STR_DATA, + STR_END, + FSEVENT_CREATED, + FSEVENT_MODIFIED, + FSEVENT_DELETED, + FSEVENT_MOVED, + // FSEVENT_CLONED, + FSEVENT_UNKNOWN, + FSEVENT_FLAG_MUST_SCAN_SUBDIRS, + FSEVENT_TYPE_FILE, + FSEVENT_TYPE_DIRECTORY, + FSEVENT_TYPE_SYMLINK, + + ROOT_GLOBSTAR, + DIR_SUFFIX, + DOT_SLASH, + FUNCTION_TYPE, + EMPTY_FN, + IDENTITY_FN +} = require('./constants'); + +const Depth = (value) => isNaN(value) ? {} : {depth: value}; + +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const realpath = promisify(fs.realpath); + +const statMethods = { stat, lstat }; + +/** + * @typedef {String} Path + */ + +/** + * @typedef {Object} FsEventsWatchContainer + * @property {Set} listeners + * @property {Function} rawEmitter + * @property {{stop: Function}} watcher + */ + +// fsevents instance helper functions +/** + * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances) + * @type {Map} + */ +const FSEventsWatchers = new Map(); + +// Threshold of duplicate path prefixes at which to start +// consolidating going forward +const consolidateThreshhold = 10; + +const wrongEventFlags = new Set([ + 69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912 +]); + +/** + * Instantiates the fsevents interface + * @param {Path} path path to be watched + * @param {Function} callback called when fsevents is bound and ready + * @returns {{stop: Function}} new fsevents instance + */ +const createFSEventsInstance = (path, callback) => { + const stop = fsevents.watch(path, callback); + return {stop}; +}; + +/** + * Instantiates the fsevents interface or binds listeners to an existing one covering + * the same file tree. + * @param {Path} path - to be watched + * @param {Path} realPath - real path for symlinks + * @param {Function} listener - called when fsevents emits events + * @param {Function} rawEmitter - passes data to listeners of the 'raw' event + * @returns {Function} closer + */ +function setFSEventsListener(path, realPath, listener, rawEmitter) { + let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath; + + const parentPath = sysPath.dirname(watchPath); + let cont = FSEventsWatchers.get(watchPath); + + // If we've accumulated a substantial number of paths that + // could have been consolidated by watching one directory + // above the current one, create a watcher on the parent + // path instead, so that we do consolidate going forward. + if (couldConsolidate(parentPath)) { + watchPath = parentPath; + } + + const resolvedPath = sysPath.resolve(path); + const hasSymlink = resolvedPath !== realPath; + + const filteredListener = (fullPath, flags, info) => { + if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath); + if ( + fullPath === resolvedPath || + !fullPath.indexOf(resolvedPath + sysPath.sep) + ) listener(fullPath, flags, info); + }; + + // check if there is already a watcher on a parent path + // modifies `watchPath` to the parent path when it finds a match + let watchedParent = false; + for (const watchedPath of FSEventsWatchers.keys()) { + if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) { + watchPath = watchedPath; + cont = FSEventsWatchers.get(watchPath); + watchedParent = true; + break; + } + } + + if (cont || watchedParent) { + cont.listeners.add(filteredListener); + } else { + cont = { + listeners: new Set([filteredListener]), + rawEmitter, + watcher: createFSEventsInstance(watchPath, (fullPath, flags) => { + if (!cont.listeners.size) return; + if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return; + const info = fsevents.getInfo(fullPath, flags); + cont.listeners.forEach(list => { + list(fullPath, flags, info); + }); + + cont.rawEmitter(info.event, fullPath, info); + }) + }; + FSEventsWatchers.set(watchPath, cont); + } + + // removes this instance's listeners and closes the underlying fsevents + // instance if there are no more listeners left + return () => { + const lst = cont.listeners; + + lst.delete(filteredListener); + if (!lst.size) { + FSEventsWatchers.delete(watchPath); + if (cont.watcher) return cont.watcher.stop().then(() => { + cont.rawEmitter = cont.watcher = undefined; + Object.freeze(cont); + }); + } + }; +} + +// Decide whether or not we should start a new higher-level +// parent watcher +const couldConsolidate = (path) => { + let count = 0; + for (const watchPath of FSEventsWatchers.keys()) { + if (watchPath.indexOf(path) === 0) { + count++; + if (count >= consolidateThreshhold) { + return true; + } + } + } + + return false; +}; + +// returns boolean indicating whether fsevents can be used +const canUse = () => fsevents && FSEventsWatchers.size < 128; + +// determines subdirectory traversal levels from root to path +const calcDepth = (path, root) => { + let i = 0; + while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++; + return i; +}; + +// returns boolean indicating whether the fsevents' event info has the same type +// as the one returned by fs.stat +const sameTypes = (info, stats) => ( + info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() || + info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() || + info.type === FSEVENT_TYPE_FILE && stats.isFile() +) + +/** + * @mixin + */ +class FsEventsHandler { + +/** + * @param {import('../index').FSWatcher} fsw + */ +constructor(fsw) { + this.fsw = fsw; +} +checkIgnored(path, stats) { + const ipaths = this.fsw._ignoredPaths; + if (this.fsw._isIgnored(path, stats)) { + ipaths.add(path); + if (stats && stats.isDirectory()) { + ipaths.add(path + ROOT_GLOBSTAR); + } + return true; + } + + ipaths.delete(path); + ipaths.delete(path + ROOT_GLOBSTAR); +} + +addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD; + this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts); +} + +async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + try { + const stats = await stat(path) + if (this.fsw.closed) return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } catch (error) { + if (error.code === 'EACCES') { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } +} + +handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) { + if (this.fsw.closed || this.checkIgnored(path)) return; + + if (event === EV_UNLINK) { + const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY + // suppress unlink events on never before seen files + if (isDirectory || watchedDir.has(item)) { + this.fsw._remove(parent, item, isDirectory); + } + } else { + if (event === EV_ADD) { + // track new directories + if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path); + + if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) { + // push symlinks back to the top of the stack to get handled + const curDepth = opts.depth === undefined ? + undefined : calcDepth(fullPath, realPath) + 1; + return this._addToFsEvents(path, false, true, curDepth); + } + + // track new paths + // (other than symlinks being followed, which will be tracked soon) + this.fsw._getWatchedDir(parent).add(item); + } + /** + * @type {'add'|'addDir'|'unlink'|'unlinkDir'} + */ + const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event; + this.fsw._emit(eventName, path); + if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true); + } +} + +/** + * Handle symlinks encountered during directory scan + * @param {String} watchPath - file/dir path to be watched with fsevents + * @param {String} realPath - real path (in case of symlinks) + * @param {Function} transform - path transformer + * @param {Function} globFilter - path filter in case a glob pattern was provided + * @returns {Function} closer for the watcher instance +*/ +_watchWithFsEvents(watchPath, realPath, transform, globFilter) { + if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return; + const opts = this.fsw.options; + const watchCallback = async (fullPath, flags, info) => { + if (this.fsw.closed) return; + if ( + opts.depth !== undefined && + calcDepth(fullPath, realPath) > opts.depth + ) return; + const path = transform(sysPath.join( + watchPath, sysPath.relative(watchPath, fullPath) + )); + if (globFilter && !globFilter(path)) return; + // ensure directories are tracked + const parent = sysPath.dirname(path); + const item = sysPath.basename(path); + const watchedDir = this.fsw._getWatchedDir( + info.type === FSEVENT_TYPE_DIRECTORY ? path : parent + ); + + // correct for wrong events emitted + if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) { + if (typeof opts.ignored === FUNCTION_TYPE) { + let stats; + try { + stats = await stat(path); + } catch (error) {} + if (this.fsw.closed) return; + if (this.checkIgnored(path, stats)) return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + switch (info.event) { + case FSEVENT_CREATED: + case FSEVENT_MODIFIED: + return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + case FSEVENT_DELETED: + case FSEVENT_MOVED: + return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + }; + + const closer = setFSEventsListener( + watchPath, + realPath, + watchCallback, + this.fsw._emitRaw + ); + + this.fsw._emitReady(); + return closer; +} + +/** + * Handle symlinks encountered during directory scan + * @param {String} linkPath path to symlink + * @param {String} fullPath absolute path to the symlink + * @param {Function} transform pre-existing path transformer + * @param {Number} curDepth level of subdirectories traversed to where symlink is + * @returns {Promise} + */ +async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) { + // don't follow the same symlink more than once + if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return; + + this.fsw._symlinkPaths.set(fullPath, true); + this.fsw._incrReadyCount(); + + try { + const linkTarget = await realpath(linkPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(linkTarget)) { + return this.fsw._emitReady(); + } + + this.fsw._incrReadyCount(); + + // add the linkTarget for watching with a wrapper for transform + // that causes emitted paths to incorporate the link's path + this._addToFsEvents(linkTarget || linkPath, (path) => { + let aliasedPath = linkPath; + if (linkTarget && linkTarget !== DOT_SLASH) { + aliasedPath = path.replace(linkTarget, linkPath); + } else if (path !== DOT_SLASH) { + aliasedPath = sysPath.join(linkPath, path); + } + return transform(aliasedPath); + }, false, curDepth); + } catch(error) { + if (this.fsw._handleError(error)) { + return this.fsw._emitReady(); + } + } +} + +/** + * + * @param {Path} newPath + * @param {fs.Stats} stats + */ +emitAdd(newPath, stats, processPath, opts, forceAdd) { + const pp = processPath(newPath); + const isDir = stats.isDirectory(); + const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp)); + const base = sysPath.basename(pp); + + // ensure empty dirs get tracked + if (isDir) this.fsw._getWatchedDir(pp); + if (dirObj.has(base)) return; + dirObj.add(base); + + if (!opts.ignoreInitial || forceAdd === true) { + this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats); + } +} + +initWatch(realPath, path, wh, processPath) { + if (this.fsw.closed) return; + const closer = this._watchWithFsEvents( + wh.watchPath, + sysPath.resolve(realPath || wh.watchPath), + processPath, + wh.globFilter + ); + this.fsw._addPathCloser(path, closer); +} + +/** + * Handle added path with fsevents + * @param {String} path file/dir path or glob pattern + * @param {Function|Boolean=} transform converts working path to what the user expects + * @param {Boolean=} forceAdd ensure add is emitted + * @param {Number=} priorDepth Level of subdirectories already traversed. + * @returns {Promise} + */ +async _addToFsEvents(path, transform, forceAdd, priorDepth) { + if (this.fsw.closed) { + return; + } + const opts = this.fsw.options; + const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN; + + const wh = this.fsw._getWatchHelpers(path); + + // evaluate what is at the path we're being asked to watch + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + throw null; + } + if (stats.isDirectory()) { + // emit addDir unless this is a glob parent + if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd); + + // don't recurse further if it would exceed depth setting + if (priorDepth && priorDepth > opts.depth) return; + + // scan the contents of the dir + this.fsw._readdirp(wh.watchPath, { + fileFilter: entry => wh.filterPath(entry), + directoryFilter: entry => wh.filterDir(entry), + ...Depth(opts.depth - (priorDepth || 0)) + }).on(STR_DATA, (entry) => { + // need to check filterPath on dirs b/c filterDir is less restrictive + if (this.fsw.closed) { + return; + } + if (entry.stats.isDirectory() && !wh.filterPath(entry)) return; + + const joinedPath = sysPath.join(wh.watchPath, entry.path); + const {fullPath} = entry; + + if (wh.followSymlinks && entry.stats.isSymbolicLink()) { + // preserve the current depth here since it can't be derived from + // real paths past the symlink + const curDepth = opts.depth === undefined ? + undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; + + this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); + } else { + this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd); + } + }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => { + this.fsw._emitReady(); + }); + } else { + this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd); + this.fsw._emitReady(); + } + } catch (error) { + if (!error || this.fsw._handleError(error)) { + // TODO: Strange thing: "should not choke on an ignored watch path" will be failed without 2 ready calls -__- + this.fsw._emitReady(); + this.fsw._emitReady(); + } + } + + if (opts.persistent && forceAdd !== true) { + if (typeof transform === FUNCTION_TYPE) { + // realpath has already been resolved + this.initWatch(undefined, path, wh, processPath); + } else { + let realPath; + try { + realPath = await realpath(wh.watchPath); + } catch (e) {} + this.initWatch(realPath, path, wh, processPath); + } + } +} + +} + +module.exports = FsEventsHandler; +module.exports.canUse = canUse; diff --git a/node_modules/chokidar/lib/nodefs-handler.js b/node_modules/chokidar/lib/nodefs-handler.js new file mode 100644 index 0000000..199cfe9 --- /dev/null +++ b/node_modules/chokidar/lib/nodefs-handler.js @@ -0,0 +1,654 @@ +'use strict'; + +const fs = require('fs'); +const sysPath = require('path'); +const { promisify } = require('util'); +const isBinaryPath = require('is-binary-path'); +const { + isWindows, + isLinux, + EMPTY_FN, + EMPTY_STR, + KEY_LISTENERS, + KEY_ERR, + KEY_RAW, + HANDLER_KEYS, + EV_CHANGE, + EV_ADD, + EV_ADD_DIR, + EV_ERROR, + STR_DATA, + STR_END, + BRACE_START, + STAR +} = require('./constants'); + +const THROTTLE_MODE_WATCH = 'watch'; + +const open = promisify(fs.open); +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const close = promisify(fs.close); +const fsrealpath = promisify(fs.realpath); + +const statMethods = { lstat, stat }; + +// TODO: emit errors properly. Example: EMFILE on Macos. +const foreach = (val, fn) => { + if (val instanceof Set) { + val.forEach(fn); + } else { + fn(val); + } +}; + +const addAndConvert = (main, prop, item) => { + let container = main[prop]; + if (!(container instanceof Set)) { + main[prop] = container = new Set([container]); + } + container.add(item); +}; + +const clearItem = cont => key => { + const set = cont[key]; + if (set instanceof Set) { + set.clear(); + } else { + delete cont[key]; + } +}; + +const delFromSet = (main, prop, item) => { + const container = main[prop]; + if (container instanceof Set) { + container.delete(item); + } else if (container === item) { + delete main[prop]; + } +}; + +const isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val; + +/** + * @typedef {String} Path + */ + +// fs_watch helpers + +// object to hold per-process fs_watch instances +// (may be shared across chokidar FSWatcher instances) + +/** + * @typedef {Object} FsWatchContainer + * @property {Set} listeners + * @property {Set} errHandlers + * @property {Set} rawEmitters + * @property {fs.FSWatcher=} watcher + * @property {Boolean=} watcherUnusable + */ + +/** + * @type {Map} + */ +const FsWatchInstances = new Map(); + +/** + * Instantiates the fs_watch interface + * @param {String} path to be watched + * @param {Object} options to be passed to fs_watch + * @param {Function} listener main event handler + * @param {Function} errHandler emits info about errors + * @param {Function} emitRaw emits raw event data + * @returns {fs.FSWatcher} new fsevents instance + */ +function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { + const handleEvent = (rawEvent, evPath) => { + listener(path); + emitRaw(rawEvent, evPath, {watchedPath: path}); + + // emit based on events occurring for files from a directory's watcher in + // case the file's watcher misses it (and rely on throttling to de-dupe) + if (evPath && path !== evPath) { + fsWatchBroadcast( + sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath) + ); + } + }; + try { + return fs.watch(path, options, handleEvent); + } catch (error) { + errHandler(error); + } +} + +/** + * Helper for passing fs_watch event data to a collection of listeners + * @param {Path} fullPath absolute path bound to fs_watch instance + * @param {String} type listener type + * @param {*=} val1 arguments to be passed to listeners + * @param {*=} val2 + * @param {*=} val3 + */ +const fsWatchBroadcast = (fullPath, type, val1, val2, val3) => { + const cont = FsWatchInstances.get(fullPath); + if (!cont) return; + foreach(cont[type], (listener) => { + listener(val1, val2, val3); + }); +}; + +/** + * Instantiates the fs_watch interface or binds listeners + * to an existing one covering the same file system entry + * @param {String} path + * @param {String} fullPath absolute path + * @param {Object} options to be passed to fs_watch + * @param {Object} handlers container for event listener functions + */ +const setFsWatchListener = (path, fullPath, options, handlers) => { + const {listener, errHandler, rawEmitter} = handlers; + let cont = FsWatchInstances.get(fullPath); + + /** @type {fs.FSWatcher=} */ + let watcher; + if (!options.persistent) { + watcher = createFsWatchInstance( + path, options, listener, errHandler, rawEmitter + ); + return watcher.close.bind(watcher); + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_ERR, errHandler); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + watcher = createFsWatchInstance( + path, + options, + fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), + errHandler, // no need to use broadcast here + fsWatchBroadcast.bind(null, fullPath, KEY_RAW) + ); + if (!watcher) return; + watcher.on(EV_ERROR, async (error) => { + const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR); + cont.watcherUnusable = true; // documented since Node 10.4.1 + // Workaround for https://github.com/joyent/node/issues/4337 + if (isWindows && error.code === 'EPERM') { + try { + const fd = await open(path, 'r'); + await close(fd); + broadcastErr(error); + } catch (err) {} + } else { + broadcastErr(error); + } + }); + cont = { + listeners: listener, + errHandlers: errHandler, + rawEmitters: rawEmitter, + watcher + }; + FsWatchInstances.set(fullPath, cont); + } + // const index = cont.listeners.indexOf(listener); + + // removes this instance's listeners and closes the underlying fs_watch + // instance if there are no more listeners left + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_ERR, errHandler); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + // Check to protect against issue gh-730. + // if (cont.watcherUnusable) { + cont.watcher.close(); + // } + FsWatchInstances.delete(fullPath); + HANDLER_KEYS.forEach(clearItem(cont)); + cont.watcher = undefined; + Object.freeze(cont); + } + }; +}; + +// fs_watchFile helpers + +// object to hold per-process fs_watchFile instances +// (may be shared across chokidar FSWatcher instances) +const FsWatchFileInstances = new Map(); + +/** + * Instantiates the fs_watchFile interface or binds listeners + * to an existing one covering the same file system entry + * @param {String} path to be watched + * @param {String} fullPath absolute path + * @param {Object} options options to be passed to fs_watchFile + * @param {Object} handlers container for event listener functions + * @returns {Function} closer + */ +const setFsWatchFileListener = (path, fullPath, options, handlers) => { + const {listener, rawEmitter} = handlers; + let cont = FsWatchFileInstances.get(fullPath); + + /* eslint-disable no-unused-vars, prefer-destructuring */ + let listeners = new Set(); + let rawEmitters = new Set(); + + const copts = cont && cont.options; + if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) { + // "Upgrade" the watcher to persistence or a quicker interval. + // This creates some unlikely edge case issues if the user mixes + // settings in a very weird way, but solving for those cases + // doesn't seem worthwhile for the added complexity. + listeners = cont.listeners; + rawEmitters = cont.rawEmitters; + fs.unwatchFile(fullPath); + cont = undefined; + } + + /* eslint-enable no-unused-vars, prefer-destructuring */ + + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + // TODO + // listeners.add(listener); + // rawEmitters.add(rawEmitter); + cont = { + listeners: listener, + rawEmitters: rawEmitter, + options, + watcher: fs.watchFile(fullPath, options, (curr, prev) => { + foreach(cont.rawEmitters, (rawEmitter) => { + rawEmitter(EV_CHANGE, fullPath, {curr, prev}); + }); + const currmtime = curr.mtimeMs; + if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) { + foreach(cont.listeners, (listener) => listener(path, curr)); + } + }) + }; + FsWatchFileInstances.set(fullPath, cont); + } + // const index = cont.listeners.indexOf(listener); + + // Removes this instance's listeners and closes the underlying fs_watchFile + // instance if there are no more listeners left. + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + FsWatchFileInstances.delete(fullPath); + fs.unwatchFile(fullPath); + cont.options = cont.watcher = undefined; + Object.freeze(cont); + } + }; +}; + +/** + * @mixin + */ +class NodeFsHandler { + +/** + * @param {import("../index").FSWatcher} fsW + */ +constructor(fsW) { + this.fsw = fsW; + this._boundHandleError = (error) => fsW._handleError(error); +} + +/** + * Watch file for changes with fs_watchFile or fs_watch. + * @param {String} path to file or dir + * @param {Function} listener on fs change + * @returns {Function} closer for the watcher instance + */ +_watchWithNodeFs(path, listener) { + const opts = this.fsw.options; + const directory = sysPath.dirname(path); + const basename = sysPath.basename(path); + const parent = this.fsw._getWatchedDir(directory); + parent.add(basename); + const absolutePath = sysPath.resolve(path); + const options = {persistent: opts.persistent}; + if (!listener) listener = EMPTY_FN; + + let closer; + if (opts.usePolling) { + options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ? + opts.binaryInterval : opts.interval; + closer = setFsWatchFileListener(path, absolutePath, options, { + listener, + rawEmitter: this.fsw._emitRaw + }); + } else { + closer = setFsWatchListener(path, absolutePath, options, { + listener, + errHandler: this._boundHandleError, + rawEmitter: this.fsw._emitRaw + }); + } + return closer; +} + +/** + * Watch a file and emit add event if warranted. + * @param {Path} file Path + * @param {fs.Stats} stats result of fs_stat + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @returns {Function} closer for the watcher instance + */ +_handleFile(file, stats, initialAdd) { + if (this.fsw.closed) { + return; + } + const dirname = sysPath.dirname(file); + const basename = sysPath.basename(file); + const parent = this.fsw._getWatchedDir(dirname); + // stats is always present + let prevStats = stats; + + // if the file is already being watched, do nothing + if (parent.has(basename)) return; + + const listener = async (path, newStats) => { + if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return; + if (!newStats || newStats.mtimeMs === 0) { + try { + const newStats = await stat(file); + if (this.fsw.closed) return; + // Check that change event was not fired because of changed only accessTime. + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + if (isLinux && prevStats.ino !== newStats.ino) { + this.fsw._closeFile(path) + prevStats = newStats; + this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener)); + } else { + prevStats = newStats; + } + } catch (error) { + // Fix issues where mtime is null but file is still present + this.fsw._remove(dirname, basename); + } + // add is about to be emitted if file not already tracked in parent + } else if (parent.has(basename)) { + // Check that change event was not fired because of changed only accessTime. + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + prevStats = newStats; + } + } + // kick off the watcher + const closer = this._watchWithNodeFs(file, listener); + + // emit an add event if we're supposed to + if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) { + if (!this.fsw._throttle(EV_ADD, file, 0)) return; + this.fsw._emit(EV_ADD, file, stats); + } + + return closer; +} + +/** + * Handle symlinks encountered while reading a dir. + * @param {Object} entry returned by readdirp + * @param {String} directory path of dir being read + * @param {String} path of this item + * @param {String} item basename of this item + * @returns {Promise} true if no more processing is needed for this entry. + */ +async _handleSymlink(entry, directory, path, item) { + if (this.fsw.closed) { + return; + } + const full = entry.fullPath; + const dir = this.fsw._getWatchedDir(directory); + + if (!this.fsw.options.followSymlinks) { + // watch symlink directly (don't follow) and detect changes + this.fsw._incrReadyCount(); + + let linkPath; + try { + linkPath = await fsrealpath(path); + } catch (e) { + this.fsw._emitReady(); + return true; + } + + if (this.fsw.closed) return; + if (dir.has(item)) { + if (this.fsw._symlinkPaths.get(full) !== linkPath) { + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_CHANGE, path, entry.stats); + } + } else { + dir.add(item); + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_ADD, path, entry.stats); + } + this.fsw._emitReady(); + return true; + } + + // don't follow the same symlink more than once + if (this.fsw._symlinkPaths.has(full)) { + return true; + } + + this.fsw._symlinkPaths.set(full, true); +} + +_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) { + // Normalize the directory name on Windows + directory = sysPath.join(directory, EMPTY_STR); + + if (!wh.hasGlob) { + throttler = this.fsw._throttle('readdir', directory, 1000); + if (!throttler) return; + } + + const previous = this.fsw._getWatchedDir(wh.path); + const current = new Set(); + + let stream = this.fsw._readdirp(directory, { + fileFilter: entry => wh.filterPath(entry), + directoryFilter: entry => wh.filterDir(entry), + depth: 0 + }).on(STR_DATA, async (entry) => { + if (this.fsw.closed) { + stream = undefined; + return; + } + const item = entry.path; + let path = sysPath.join(directory, item); + current.add(item); + + if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) { + return; + } + + if (this.fsw.closed) { + stream = undefined; + return; + } + // Files that present in current directory snapshot + // but absent in previous are added to watch list and + // emit `add` event. + if (item === target || !target && !previous.has(item)) { + this.fsw._incrReadyCount(); + + // ensure relativeness of path is preserved in case of watcher reuse + path = sysPath.join(dir, sysPath.relative(dir, path)); + + this._addToNodeFs(path, initialAdd, wh, depth + 1); + } + }).on(EV_ERROR, this._boundHandleError); + + return new Promise(resolve => + stream.once(STR_END, () => { + if (this.fsw.closed) { + stream = undefined; + return; + } + const wasThrottled = throttler ? throttler.clear() : false; + + resolve(); + + // Files that absent in current directory snapshot + // but present in previous emit `remove` event + // and are removed from @watched[directory]. + previous.getChildren().filter((item) => { + return item !== directory && + !current.has(item) && + // in case of intersecting globs; + // a path may have been filtered out of this readdir, but + // shouldn't be removed because it matches a different glob + (!wh.hasGlob || wh.filterPath({ + fullPath: sysPath.resolve(directory, item) + })); + }).forEach((item) => { + this.fsw._remove(directory, item); + }); + + stream = undefined; + + // one more time for any missed in case changes came in extremely quickly + if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler); + }) + ); +} + +/** + * Read directory to add / remove files from `@watched` list and re-read it on change. + * @param {String} dir fs path + * @param {fs.Stats} stats + * @param {Boolean} initialAdd + * @param {Number} depth relative to user-supplied path + * @param {String} target child path targeted for watch + * @param {Object} wh Common watch helpers for this path + * @param {String} realpath + * @returns {Promise} closer for the watcher instance. + */ +async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) { + const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir)); + const tracked = parentDir.has(sysPath.basename(dir)); + if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) { + if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats); + } + + // ensure dir is tracked (harmless if redundant) + parentDir.add(sysPath.basename(dir)); + this.fsw._getWatchedDir(dir); + let throttler; + let closer; + + const oDepth = this.fsw.options.depth; + if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) { + if (!target) { + await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler); + if (this.fsw.closed) return; + } + + closer = this._watchWithNodeFs(dir, (dirPath, stats) => { + // if current directory is removed, do nothing + if (stats && stats.mtimeMs === 0) return; + + this._handleRead(dirPath, false, wh, target, dir, depth, throttler); + }); + } + return closer; +} + +/** + * Handle added file, directory, or glob pattern. + * Delegates call to _handleFile / _handleDir after checks. + * @param {String} path to file or ir + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @param {Object} priorWh depth relative to user-supplied path + * @param {Number} depth Child path actually targeted for watch + * @param {String=} target Child path actually targeted for watch + * @returns {Promise} + */ +async _addToNodeFs(path, initialAdd, priorWh, depth, target) { + const ready = this.fsw._emitReady; + if (this.fsw._isIgnored(path) || this.fsw.closed) { + ready(); + return false; + } + + const wh = this.fsw._getWatchHelpers(path, depth); + if (!wh.hasGlob && priorWh) { + wh.hasGlob = priorWh.hasGlob; + wh.globFilter = priorWh.globFilter; + wh.filterPath = entry => priorWh.filterPath(entry); + wh.filterDir = entry => priorWh.filterDir(entry); + } + + // evaluate what is at the path we're being asked to watch + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + ready(); + return false; + } + + const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START); + let closer; + if (stats.isDirectory()) { + const absPath = sysPath.resolve(path); + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) return; + closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath); + if (this.fsw.closed) return; + // preserve this symlink's target path + if (absPath !== targetPath && targetPath !== undefined) { + this.fsw._symlinkPaths.set(absPath, targetPath); + } + } else if (stats.isSymbolicLink()) { + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) return; + const parent = sysPath.dirname(wh.watchPath); + this.fsw._getWatchedDir(parent).add(wh.watchPath); + this.fsw._emit(EV_ADD, wh.watchPath, stats); + closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath); + if (this.fsw.closed) return; + + // preserve this symlink's target path + if (targetPath !== undefined) { + this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath); + } + } else { + closer = this._handleFile(wh.watchPath, stats, initialAdd); + } + ready(); + + this.fsw._addPathCloser(path, closer); + return false; + + } catch (error) { + if (this.fsw._handleError(error)) { + ready(); + return path; + } + } +} + +} + +module.exports = NodeFsHandler; diff --git a/node_modules/chokidar/package.json b/node_modules/chokidar/package.json new file mode 100644 index 0000000..e8f8b3d --- /dev/null +++ b/node_modules/chokidar/package.json @@ -0,0 +1,70 @@ +{ + "name": "chokidar", + "description": "Minimal and efficient cross-platform file watching library", + "version": "3.6.0", + "homepage": "https://github.com/paulmillr/chokidar", + "author": "Paul Miller (https://paulmillr.com)", + "contributors": [ + "Paul Miller (https://paulmillr.com)", + "Elan Shanker" + ], + "engines": { + "node": ">= 8.10.0" + }, + "main": "index.js", + "types": "./types/index.d.ts", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "devDependencies": { + "@types/node": "^14", + "chai": "^4.3", + "dtslint": "^3.3.0", + "eslint": "^7.0.0", + "mocha": "^7.0.0", + "rimraf": "^3.0.0", + "sinon": "^9.0.1", + "sinon-chai": "^3.3.0", + "typescript": "^4.4.3", + "upath": "^1.2.0" + }, + "files": [ + "index.js", + "lib/*.js", + "types/index.d.ts" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/paulmillr/chokidar.git" + }, + "bugs": { + "url": "https://github.com/paulmillr/chokidar/issues" + }, + "license": "MIT", + "scripts": { + "dtslint": "dtslint types", + "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", + "build": "npm ls", + "mocha": "mocha --exit --timeout 90000", + "test": "npm run lint && npm run mocha" + }, + "keywords": [ + "fs", + "watch", + "watchFile", + "watcher", + "watching", + "file", + "fsevents" + ], + "funding": "https://paulmillr.com/funding/" +} diff --git a/node_modules/chokidar/types/index.d.ts b/node_modules/chokidar/types/index.d.ts new file mode 100644 index 0000000..4558066 --- /dev/null +++ b/node_modules/chokidar/types/index.d.ts @@ -0,0 +1,192 @@ +// TypeScript Version: 3.0 + +/// + +import * as fs from "fs"; +import { EventEmitter } from "events"; +import { Matcher } from 'anymatch'; + +export class FSWatcher extends EventEmitter implements fs.FSWatcher { + options: WatchOptions; + + /** + * Constructs a new FSWatcher instance with optional WatchOptions parameter. + */ + constructor(options?: WatchOptions); + + /** + * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one + * string. + */ + add(paths: string | ReadonlyArray): this; + + /** + * Stop watching files, directories, or glob patterns. Takes an array of strings or just one + * string. + */ + unwatch(paths: string | ReadonlyArray): this; + + /** + * Returns an object representing all the paths on the file system being watched by this + * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless + * the `cwd` option was used), and the values are arrays of the names of the items contained in + * each directory. + */ + getWatched(): { + [directory: string]: string[]; + }; + + /** + * Removes all listeners from watched files. + */ + close(): Promise; + + on(event: 'add'|'addDir'|'change', listener: (path: string, stats?: fs.Stats) => void): this; + + on(event: 'all', listener: (eventName: 'add'|'addDir'|'change'|'unlink'|'unlinkDir', path: string, stats?: fs.Stats) => void): this; + + /** + * Error occurred + */ + on(event: 'error', listener: (error: Error) => void): this; + + /** + * Exposes the native Node `fs.FSWatcher events` + */ + on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this; + + /** + * Fires when the initial scan is complete + */ + on(event: 'ready', listener: () => void): this; + + on(event: 'unlink'|'unlinkDir', listener: (path: string) => void): this; + + on(event: string, listener: (...args: any[]) => void): this; + + ref(): this; + + unref(): this; +} + +export interface WatchOptions { + /** + * Indicates whether the process should continue to run as long as files are being watched. If + * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`, + * even if the process continues to run. + */ + persistent?: boolean; + + /** + * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to + * be ignored. The whole relative or absolute path is tested, not just filename. If a function + * with two arguments is provided, it gets called twice per path - once with a single argument + * (the path), second time with two arguments (the path and the + * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path). + */ + ignored?: Matcher; + + /** + * If set to `false` then `add`/`addDir` events are also emitted for matching paths while + * instantiating the watching as chokidar discovers these file paths (before the `ready` event). + */ + ignoreInitial?: boolean; + + /** + * When `false`, only the symlinks themselves will be watched for changes instead of following + * the link references and bubbling events through the link's path. + */ + followSymlinks?: boolean; + + /** + * The base directory from which watch `paths` are to be derived. Paths emitted with events will + * be relative to this. + */ + cwd?: string; + + /** + * If set to true then the strings passed to .watch() and .add() are treated as literal path + * names, even if they look like globs. Default: false. + */ + disableGlobbing?: boolean; + + /** + * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU + * utilization, consider setting this to `false`. It is typically necessary to **set this to + * `true` to successfully watch files over a network**, and it may be necessary to successfully + * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides + * the `useFsEvents` default. + */ + usePolling?: boolean; + + /** + * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly + * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on + * OS X, `usePolling: true` becomes the default. + */ + useFsEvents?: boolean; + + /** + * If relying upon the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that + * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is + * provided even in cases where it wasn't already available from the underlying watch events. + */ + alwaysStat?: boolean; + + /** + * If set, limits how many levels of subdirectories will be traversed. + */ + depth?: number; + + /** + * Interval of file system polling. + */ + interval?: number; + + /** + * Interval of file system polling for binary files. ([see list of binary extensions](https://gi + * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) + */ + binaryInterval?: number; + + /** + * Indicates whether to watch files that don't have read permissions if possible. If watching + * fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed + * silently. + */ + ignorePermissionErrors?: boolean; + + /** + * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts + * that occur when using editors that use "atomic writes" instead of writing directly to the + * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change` + * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you, + * you can override it by setting `atomic` to a custom value, in milliseconds. + */ + atomic?: boolean | number; + + /** + * can be set to an object in order to adjust timing params: + */ + awaitWriteFinish?: AwaitWriteFinishOptions | boolean; +} + +export interface AwaitWriteFinishOptions { + /** + * Amount of time in milliseconds for a file size to remain constant before emitting its event. + */ + stabilityThreshold?: number; + + /** + * File size polling interval. + */ + pollInterval?: number; +} + +/** + * produces an instance of `FSWatcher`. + */ +export function watch( + paths: string | ReadonlyArray, + options?: WatchOptions +): FSWatcher; diff --git a/node_modules/concat-map/.travis.yml b/node_modules/concat-map/.travis.yml new file mode 100644 index 0000000..f1d0f13 --- /dev/null +++ b/node_modules/concat-map/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/node_modules/concat-map/LICENSE b/node_modules/concat-map/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/concat-map/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/concat-map/README.markdown b/node_modules/concat-map/README.markdown new file mode 100644 index 0000000..408f70a --- /dev/null +++ b/node_modules/concat-map/README.markdown @@ -0,0 +1,62 @@ +concat-map +========== + +Concatenative mapdashery. + +[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) + +[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) + +example +======= + +``` js +var concatMap = require('concat-map'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); +``` + +*** + +``` +[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] +``` + +methods +======= + +``` js +var concatMap = require('concat-map') +``` + +concatMap(xs, fn) +----------------- + +Return an array of concatenated elements by calling `fn(x, i)` for each element +`x` and each index `i` in the array `xs`. + +When `fn(x, i)` returns an array, its result will be concatenated with the +result array. If `fn(x, i)` returns anything else, that value will be pushed +onto the end of the result array. + +install +======= + +With [npm](http://npmjs.org) do: + +``` +npm install concat-map +``` + +license +======= + +MIT + +notes +===== + +This module was written while sitting high above the ground in a tree. diff --git a/node_modules/concat-map/example/map.js b/node_modules/concat-map/example/map.js new file mode 100644 index 0000000..3365621 --- /dev/null +++ b/node_modules/concat-map/example/map.js @@ -0,0 +1,6 @@ +var concatMap = require('../'); +var xs = [ 1, 2, 3, 4, 5, 6 ]; +var ys = concatMap(xs, function (x) { + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; +}); +console.dir(ys); diff --git a/node_modules/concat-map/index.js b/node_modules/concat-map/index.js new file mode 100644 index 0000000..b29a781 --- /dev/null +++ b/node_modules/concat-map/index.js @@ -0,0 +1,13 @@ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; diff --git a/node_modules/concat-map/package.json b/node_modules/concat-map/package.json new file mode 100644 index 0000000..d3640e6 --- /dev/null +++ b/node_modules/concat-map/package.json @@ -0,0 +1,43 @@ +{ + "name" : "concat-map", + "description" : "concatenative mapdashery", + "version" : "0.0.1", + "repository" : { + "type" : "git", + "url" : "git://github.com/substack/node-concat-map.git" + }, + "main" : "index.js", + "keywords" : [ + "concat", + "concatMap", + "map", + "functional", + "higher-order" + ], + "directories" : { + "example" : "example", + "test" : "test" + }, + "scripts" : { + "test" : "tape test/*.js" + }, + "devDependencies" : { + "tape" : "~2.4.0" + }, + "license" : "MIT", + "author" : { + "name" : "James Halliday", + "email" : "mail@substack.net", + "url" : "http://substack.net" + }, + "testling" : { + "files" : "test/*.js", + "browsers" : { + "ie" : [ 6, 7, 8, 9 ], + "ff" : [ 3.5, 10, 15.0 ], + "chrome" : [ 10, 22 ], + "safari" : [ 5.1 ], + "opera" : [ 12 ] + } + } +} diff --git a/node_modules/concat-map/test/map.js b/node_modules/concat-map/test/map.js new file mode 100644 index 0000000..fdbd702 --- /dev/null +++ b/node_modules/concat-map/test/map.js @@ -0,0 +1,39 @@ +var concatMap = require('../'); +var test = require('tape'); + +test('empty or not', function (t) { + var xs = [ 1, 2, 3, 4, 5, 6 ]; + var ixes = []; + var ys = concatMap(xs, function (x, ix) { + ixes.push(ix); + return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; + }); + t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); + t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); + t.end(); +}); + +test('always something', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('scalars', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function (x) { + return x === 'b' ? [ 'B', 'B', 'B' ] : x; + }); + t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); + t.end(); +}); + +test('undefs', function (t) { + var xs = [ 'a', 'b', 'c', 'd' ]; + var ys = concatMap(xs, function () {}); + t.same(ys, [ undefined, undefined, undefined, undefined ]); + t.end(); +}); diff --git a/node_modules/fill-range/LICENSE b/node_modules/fill-range/LICENSE new file mode 100644 index 0000000..9af4a67 --- /dev/null +++ b/node_modules/fill-range/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/fill-range/README.md b/node_modules/fill-range/README.md new file mode 100644 index 0000000..8d756fe --- /dev/null +++ b/node_modules/fill-range/README.md @@ -0,0 +1,237 @@ +# fill-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/fill-range.svg?style=flat)](https://www.npmjs.com/package/fill-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![NPM total downloads](https://img.shields.io/npm/dt/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/fill-range.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/fill-range) + +> Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex` + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save fill-range +``` + +## Usage + +Expands numbers and letters, optionally using a `step` as the last argument. _(Numbers may be defined as JavaScript numbers or strings)_. + +```js +const fill = require('fill-range'); +// fill(from, to[, step, options]); + +console.log(fill('1', '10')); //=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] +console.log(fill('1', '10', { toRegex: true })); //=> [1-9]|10 +``` + +**Params** + +* `from`: **{String|Number}** the number or letter to start with +* `to`: **{String|Number}** the number or letter to end with +* `step`: **{String|Number|Object|Function}** Optionally pass a [step](#optionsstep) to use. +* `options`: **{Object|Function}**: See all available [options](#options) + +## Examples + +By default, an array of values is returned. + +**Alphabetical ranges** + +```js +console.log(fill('a', 'e')); //=> ['a', 'b', 'c', 'd', 'e'] +console.log(fill('A', 'E')); //=> [ 'A', 'B', 'C', 'D', 'E' ] +``` + +**Numerical ranges** + +Numbers can be defined as actual numbers or strings. + +```js +console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ] +console.log(fill('1', '5')); //=> [ 1, 2, 3, 4, 5 ] +``` + +**Negative ranges** + +Numbers can be defined as actual numbers or strings. + +```js +console.log(fill('-5', '-1')); //=> [ '-5', '-4', '-3', '-2', '-1' ] +console.log(fill('-5', '5')); //=> [ '-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5' ] +``` + +**Steps (increments)** + +```js +// numerical ranges with increments +console.log(fill('0', '25', 4)); //=> [ '0', '4', '8', '12', '16', '20', '24' ] +console.log(fill('0', '25', 5)); //=> [ '0', '5', '10', '15', '20', '25' ] +console.log(fill('0', '25', 6)); //=> [ '0', '6', '12', '18', '24' ] + +// alphabetical ranges with increments +console.log(fill('a', 'z', 4)); //=> [ 'a', 'e', 'i', 'm', 'q', 'u', 'y' ] +console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ] +console.log(fill('a', 'z', 6)); //=> [ 'a', 'g', 'm', 's', 'y' ] +``` + +## Options + +### options.step + +**Type**: `number` (formatted as a string or number) + +**Default**: `undefined` + +**Description**: The increment to use for the range. Can be used with letters or numbers. + +**Example(s)** + +```js +// numbers +console.log(fill('1', '10', 2)); //=> [ '1', '3', '5', '7', '9' ] +console.log(fill('1', '10', 3)); //=> [ '1', '4', '7', '10' ] +console.log(fill('1', '10', 4)); //=> [ '1', '5', '9' ] + +// letters +console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ] +console.log(fill('a', 'z', 7)); //=> [ 'a', 'h', 'o', 'v' ] +console.log(fill('a', 'z', 9)); //=> [ 'a', 'j', 's' ] +``` + +### options.strictRanges + +**Type**: `boolean` + +**Default**: `false` + +**Description**: By default, `null` is returned when an invalid range is passed. Enable this option to throw a `RangeError` on invalid ranges. + +**Example(s)** + +The following are all invalid: + +```js +fill('1.1', '2'); // decimals not supported in ranges +fill('a', '2'); // incompatible range values +fill(1, 10, 'foo'); // invalid "step" argument +``` + +### options.stringify + +**Type**: `boolean` + +**Default**: `undefined` + +**Description**: Cast all returned values to strings. By default, integers are returned as numbers. + +**Example(s)** + +```js +console.log(fill(1, 5)); //=> [ 1, 2, 3, 4, 5 ] +console.log(fill(1, 5, { stringify: true })); //=> [ '1', '2', '3', '4', '5' ] +``` + +### options.toRegex + +**Type**: `boolean` + +**Default**: `undefined` + +**Description**: Create a regex-compatible source string, instead of expanding values to an array. + +**Example(s)** + +```js +// alphabetical range +console.log(fill('a', 'e', { toRegex: true })); //=> '[a-e]' +// alphabetical with step +console.log(fill('a', 'z', 3, { toRegex: true })); //=> 'a|d|g|j|m|p|s|v|y' +// numerical range +console.log(fill('1', '100', { toRegex: true })); //=> '[1-9]|[1-9][0-9]|100' +// numerical range with zero padding +console.log(fill('000001', '100000', { toRegex: true })); +//=> '0{5}[1-9]|0{4}[1-9][0-9]|0{3}[1-9][0-9]{2}|0{2}[1-9][0-9]{3}|0[1-9][0-9]{4}|100000' +``` + +### options.transform + +**Type**: `function` + +**Default**: `undefined` + +**Description**: Customize each value in the returned array (or [string](#optionstoRegex)). _(you can also pass this function as the last argument to `fill()`)_. + +**Example(s)** + +```js +// add zero padding +console.log(fill(1, 5, value => String(value).padStart(4, '0'))); +//=> ['0001', '0002', '0003', '0004', '0005'] +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 116 | [jonschlinkert](https://github.com/jonschlinkert) | +| 4 | [paulmillr](https://github.com/paulmillr) | +| 2 | [realityking](https://github.com/realityking) | +| 2 | [bluelovers](https://github.com/bluelovers) | +| 1 | [edorivai](https://github.com/edorivai) | +| 1 | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)! + +
    + + + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._ \ No newline at end of file diff --git a/node_modules/fill-range/index.js b/node_modules/fill-range/index.js new file mode 100644 index 0000000..97ce35a --- /dev/null +++ b/node_modules/fill-range/index.js @@ -0,0 +1,249 @@ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ + +'use strict'; + +const util = require('util'); +const toRegexRange = require('to-regex-range'); + +const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); + +const transform = toNumber => { + return value => toNumber === true ? Number(value) : String(value); +}; + +const isValidValue = value => { + return typeof value === 'number' || (typeof value === 'string' && value !== ''); +}; + +const isNumber = num => Number.isInteger(+num); + +const zeros = input => { + let value = `${input}`; + let index = -1; + if (value[0] === '-') value = value.slice(1); + if (value === '0') return false; + while (value[++index] === '0'); + return index > 0; +}; + +const stringify = (start, end, options) => { + if (typeof start === 'string' || typeof end === 'string') { + return true; + } + return options.stringify === true; +}; + +const pad = (input, maxLength, toNumber) => { + if (maxLength > 0) { + let dash = input[0] === '-' ? '-' : ''; + if (dash) input = input.slice(1); + input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0')); + } + if (toNumber === false) { + return String(input); + } + return input; +}; + +const toMaxLen = (input, maxLength) => { + let negative = input[0] === '-' ? '-' : ''; + if (negative) { + input = input.slice(1); + maxLength--; + } + while (input.length < maxLength) input = '0' + input; + return negative ? ('-' + input) : input; +}; + +const toSequence = (parts, options) => { + parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + + let prefix = options.capture ? '' : '?:'; + let positives = ''; + let negatives = ''; + let result; + + if (parts.positives.length) { + positives = parts.positives.join('|'); + } + + if (parts.negatives.length) { + negatives = `-(${prefix}${parts.negatives.join('|')})`; + } + + if (positives && negatives) { + result = `${positives}|${negatives}`; + } else { + result = positives || negatives; + } + + if (options.wrap) { + return `(${prefix}${result})`; + } + + return result; +}; + +const toRange = (a, b, isNumbers, options) => { + if (isNumbers) { + return toRegexRange(a, b, { wrap: false, ...options }); + } + + let start = String.fromCharCode(a); + if (a === b) return start; + + let stop = String.fromCharCode(b); + return `[${start}-${stop}]`; +}; + +const toRegex = (start, end, options) => { + if (Array.isArray(start)) { + let wrap = options.wrap === true; + let prefix = options.capture ? '' : '?:'; + return wrap ? `(${prefix}${start.join('|')})` : start.join('|'); + } + return toRegexRange(start, end, options); +}; + +const rangeError = (...args) => { + return new RangeError('Invalid range arguments: ' + util.inspect(...args)); +}; + +const invalidRange = (start, end, options) => { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; +}; + +const invalidStep = (step, options) => { + if (options.strictRanges === true) { + throw new TypeError(`Expected step "${step}" to be a number`); + } + return []; +}; + +const fillNumbers = (start, end, step = 1, options = {}) => { + let a = Number(start); + let b = Number(end); + + if (!Number.isInteger(a) || !Number.isInteger(b)) { + if (options.strictRanges === true) throw rangeError([start, end]); + return []; + } + + // fix negative zero + if (a === 0) a = 0; + if (b === 0) b = 0; + + let descending = a > b; + let startString = String(start); + let endString = String(end); + let stepString = String(step); + step = Math.max(Math.abs(step), 1); + + let padded = zeros(startString) || zeros(endString) || zeros(stepString); + let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; + let toNumber = padded === false && stringify(start, end, options) === false; + let format = options.transform || transform(toNumber); + + if (options.toRegex && step === 1) { + return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); + } + + let parts = { negatives: [], positives: [] }; + let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num)); + let range = []; + let index = 0; + + while (descending ? a >= b : a <= b) { + if (options.toRegex === true && step > 1) { + push(a); + } else { + range.push(pad(format(a, index), maxLen, toNumber)); + } + a = descending ? a - step : a + step; + index++; + } + + if (options.toRegex === true) { + return step > 1 + ? toSequence(parts, options) + : toRegex(range, null, { wrap: false, ...options }); + } + + return range; +}; + +const fillLetters = (start, end, step = 1, options = {}) => { + if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) { + return invalidRange(start, end, options); + } + + + let format = options.transform || (val => String.fromCharCode(val)); + let a = `${start}`.charCodeAt(0); + let b = `${end}`.charCodeAt(0); + + let descending = a > b; + let min = Math.min(a, b); + let max = Math.max(a, b); + + if (options.toRegex && step === 1) { + return toRange(min, max, false, options); + } + + let range = []; + let index = 0; + + while (descending ? a >= b : a <= b) { + range.push(format(a, index)); + a = descending ? a - step : a + step; + index++; + } + + if (options.toRegex === true) { + return toRegex(range, null, { wrap: false, options }); + } + + return range; +}; + +const fill = (start, end, step, options = {}) => { + if (end == null && isValidValue(start)) { + return [start]; + } + + if (!isValidValue(start) || !isValidValue(end)) { + return invalidRange(start, end, options); + } + + if (typeof step === 'function') { + return fill(start, end, 1, { transform: step }); + } + + if (isObject(step)) { + return fill(start, end, 0, step); + } + + let opts = { ...options }; + if (opts.capture === true) opts.wrap = true; + step = step || opts.step || 1; + + if (!isNumber(step)) { + if (step != null && !isObject(step)) return invalidStep(step, opts); + return fill(start, end, 1, step); + } + + if (isNumber(start) && isNumber(end)) { + return fillNumbers(start, end, step, opts); + } + + return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); +}; + +module.exports = fill; diff --git a/node_modules/fill-range/package.json b/node_modules/fill-range/package.json new file mode 100644 index 0000000..07d3076 --- /dev/null +++ b/node_modules/fill-range/package.json @@ -0,0 +1,69 @@ +{ + "name": "fill-range", + "description": "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`", + "version": "7.0.1", + "homepage": "https://github.com/jonschlinkert/fill-range", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Edo Rivai (edo.rivai.nl)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Paul Miller (paulmillr.com)", + "Rouven Weßling (www.rouvenwessling.de)", + "(https://github.com/wtgtybhertgeghgtwtg)" + ], + "repository": "jonschlinkert/fill-range", + "bugs": { + "url": "https://github.com/jonschlinkert/fill-range/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "devDependencies": { + "gulp-format-md": "^2.0.0", + "mocha": "^6.1.1" + }, + "keywords": [ + "alpha", + "alphabetical", + "array", + "bash", + "brace", + "expand", + "expansion", + "fill", + "glob", + "match", + "matches", + "matching", + "number", + "numerical", + "range", + "ranges", + "regex", + "sh" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/glob-parent/CHANGELOG.md b/node_modules/glob-parent/CHANGELOG.md new file mode 100644 index 0000000..fb9de96 --- /dev/null +++ b/node_modules/glob-parent/CHANGELOG.md @@ -0,0 +1,110 @@ +### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06) + + +### Bug Fixes + +* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366)) + +### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27) + + +### Bug Fixes + +* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb)) + +## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27) + + +### Features + +* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3)) + +## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27) + + +### ⚠ BREAKING CHANGES + +* Drop support for node <6 & bump dependencies + +### Miscellaneous Chores + +* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a)) + +## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27) + + +### ⚠ BREAKING CHANGES + +* question marks are valid path characters on Windows so avoid flagging as a glob when alone +* Update is-glob dependency + +### Features + +* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e)) +* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841)) +* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281)) + +## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27) + + +### Features + +* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b)) +* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd)) +* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be)) +* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388)) +* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76)) + + +### Bug Fixes + +* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf)) + +### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27) + + +### Features + +* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc)) + + +### Bug Fixes + +* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030)) + +## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27) + + +### ⚠ BREAKING CHANGES + +* update is-glob dependency + +### Features + +* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd)) + +## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27) + + +### Features + +* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2)) + +## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27) + +## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27) + + +### Reverts + +* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0)) + +## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27) + + +### Features + +* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233)) + +## 1.0.0 (2021-01-27) + diff --git a/node_modules/glob-parent/LICENSE b/node_modules/glob-parent/LICENSE new file mode 100644 index 0000000..63222d7 --- /dev/null +++ b/node_modules/glob-parent/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2015, 2019 Elan Shanker + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/glob-parent/README.md b/node_modules/glob-parent/README.md new file mode 100644 index 0000000..36a2793 --- /dev/null +++ b/node_modules/glob-parent/README.md @@ -0,0 +1,137 @@ +

    + + + +

    + +# glob-parent + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +Extract the non-magic parent path from a glob string. + +## Usage + +```js +var globParent = require('glob-parent'); + +globParent('path/to/*.js'); // 'path/to' +globParent('/root/path/to/*.js'); // '/root/path/to' +globParent('/*.js'); // '/' +globParent('*.js'); // '.' +globParent('**/*.js'); // '.' +globParent('path/{to,from}'); // 'path' +globParent('path/!(to|from)'); // 'path' +globParent('path/?(to|from)'); // 'path' +globParent('path/+(to|from)'); // 'path' +globParent('path/*(to|from)'); // 'path' +globParent('path/@(to|from)'); // 'path' +globParent('path/**/*'); // 'path' + +// if provided a non-glob path, returns the nearest dir +globParent('path/foo/bar.js'); // 'path/foo' +globParent('path/foo/'); // 'path/foo' +globParent('path/foo'); // 'path' (see issue #3 for details) +``` + +## API + +### `globParent(maybeGlobString, [options])` + +Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below. + +#### options + +```js +{ + // Disables the automatic conversion of slashes for Windows + flipBackslashes: true +} +``` + +## Escaping + +The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters: + +- `?` (question mark) unless used as a path segment alone +- `*` (asterisk) +- `|` (pipe) +- `(` (opening parenthesis) +- `)` (closing parenthesis) +- `{` (opening curly brace) +- `}` (closing curly brace) +- `[` (opening bracket) +- `]` (closing bracket) + +**Example** + +```js +globParent('foo/[bar]/') // 'foo' +globParent('foo/\\[bar]/') // 'foo/[bar]' +``` + +## Limitations + +### Braces & Brackets +This library attempts a quick and imperfect method of determining which path +parts have glob magic without fully parsing/lexing the pattern. There are some +advanced use cases that can trip it up, such as nested braces where the outer +pair is escaped and the inner one contains a path separator. If you find +yourself in the unlikely circumstance of being affected by this or need to +ensure higher-fidelity glob handling in your library, it is recommended that you +pre-process your input with [expand-braces] and/or [expand-brackets]. + +### Windows +Backslashes are not valid path separators for globs. If a path with backslashes +is provided anyway, for simple cases, glob-parent will replace the path +separator for you and return the non-glob parent path (now with +forward-slashes, which are still valid as Windows path separators). + +This cannot be used in conjunction with escape characters. + +```js +// BAD +globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)' + +// GOOD +globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)' +``` + +If you are using escape characters for a pattern without path parts (i.e. +relative to `cwd`), prefix with `./` to avoid confusing glob-parent. + +```js +// BAD +globParent('foo \\[bar]') // 'foo ' +globParent('foo \\[bar]*') // 'foo ' + +// GOOD +globParent('./foo \\[bar]') // 'foo [bar]' +globParent('./foo \\[bar]*') // '.' +``` + +## License + +ISC + +[expand-braces]: https://github.com/jonschlinkert/expand-braces +[expand-brackets]: https://github.com/jonschlinkert/expand-brackets + +[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg +[npm-url]: https://www.npmjs.com/package/glob-parent +[npm-image]: https://img.shields.io/npm/v/glob-parent.svg + +[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master +[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master + +[travis-url]: https://travis-ci.org/gulpjs/glob-parent +[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci + +[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent +[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor + +[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent +[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg diff --git a/node_modules/glob-parent/index.js b/node_modules/glob-parent/index.js new file mode 100644 index 0000000..09e257e --- /dev/null +++ b/node_modules/glob-parent/index.js @@ -0,0 +1,42 @@ +'use strict'; + +var isGlob = require('is-glob'); +var pathPosixDirname = require('path').posix.dirname; +var isWin32 = require('os').platform() === 'win32'; + +var slash = '/'; +var backslash = /\\/g; +var enclosure = /[\{\[].*[\}\]]$/; +var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; +var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; + +/** + * @param {string} str + * @param {Object} opts + * @param {boolean} [opts.flipBackslashes=true] + * @returns {string} + */ +module.exports = function globParent(str, opts) { + var options = Object.assign({ flipBackslashes: true }, opts); + + // flip windows path separators + if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); + } + + // special case for strings ending in enclosure containing path separator + if (enclosure.test(str)) { + str += slash; + } + + // preserves full path in case of trailing path separator + str += 'a'; + + // remove path parts that are globby + do { + str = pathPosixDirname(str); + } while (isGlob(str) || globby.test(str)); + + // remove escape chars and return result + return str.replace(escaped, '$1'); +}; diff --git a/node_modules/glob-parent/package.json b/node_modules/glob-parent/package.json new file mode 100644 index 0000000..125c971 --- /dev/null +++ b/node_modules/glob-parent/package.json @@ -0,0 +1,48 @@ +{ + "name": "glob-parent", + "version": "5.1.2", + "description": "Extract the non-magic parent path from a glob string.", + "author": "Gulp Team (https://gulpjs.com/)", + "contributors": [ + "Elan Shanker (https://github.com/es128)", + "Blaine Bublitz " + ], + "repository": "gulpjs/glob-parent", + "license": "ISC", + "engines": { + "node": ">= 6" + }, + "main": "index.js", + "files": [ + "LICENSE", + "index.js" + ], + "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", + "test": "nyc mocha --async-only", + "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit", + "coveralls": "nyc report --reporter=text-lcov | coveralls" + }, + "dependencies": { + "is-glob": "^4.0.1" + }, + "devDependencies": { + "coveralls": "^3.0.11", + "eslint": "^2.13.1", + "eslint-config-gulp": "^3.0.1", + "expect": "^1.20.2", + "mocha": "^6.0.2", + "nyc": "^13.3.0" + }, + "keywords": [ + "glob", + "parent", + "strip", + "path", + "dirname", + "directory", + "base", + "wildcard" + ] +} diff --git a/node_modules/has-flag/index.js b/node_modules/has-flag/index.js new file mode 100644 index 0000000..5139728 --- /dev/null +++ b/node_modules/has-flag/index.js @@ -0,0 +1,8 @@ +'use strict'; +module.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); +}; diff --git a/node_modules/has-flag/license b/node_modules/has-flag/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/has-flag/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/has-flag/package.json b/node_modules/has-flag/package.json new file mode 100644 index 0000000..e1eb17a --- /dev/null +++ b/node_modules/has-flag/package.json @@ -0,0 +1,44 @@ +{ + "name": "has-flag", + "version": "3.0.0", + "description": "Check if argv has a specific flag", + "license": "MIT", + "repository": "sindresorhus/has-flag", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "has", + "check", + "detect", + "contains", + "find", + "flag", + "cli", + "command-line", + "argv", + "process", + "arg", + "args", + "argument", + "arguments", + "getopt", + "minimist", + "optimist" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + } +} diff --git a/node_modules/has-flag/readme.md b/node_modules/has-flag/readme.md new file mode 100644 index 0000000..677893c --- /dev/null +++ b/node_modules/has-flag/readme.md @@ -0,0 +1,70 @@ +# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag) + +> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag + +Correctly stops looking after an `--` argument terminator. + + +## Install + +``` +$ npm install has-flag +``` + + +## Usage + +```js +// foo.js +const hasFlag = require('has-flag'); + +hasFlag('unicorn'); +//=> true + +hasFlag('--unicorn'); +//=> true + +hasFlag('f'); +//=> true + +hasFlag('-f'); +//=> true + +hasFlag('foo=bar'); +//=> true + +hasFlag('foo'); +//=> false + +hasFlag('rainbow'); +//=> false +``` + +``` +$ node foo.js -f --unicorn --foo=bar -- --rainbow +``` + + +## API + +### hasFlag(flag, [argv]) + +Returns a boolean for whether the flag exists. + +#### flag + +Type: `string` + +CLI flag to look for. The `--` prefix is optional. + +#### argv + +Type: `string[]`
    +Default: `process.argv` + +CLI arguments. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/ignore-by-default/LICENSE b/node_modules/ignore-by-default/LICENSE new file mode 100644 index 0000000..ee1e367 --- /dev/null +++ b/node_modules/ignore-by-default/LICENSE @@ -0,0 +1,14 @@ +ISC License (ISC) +Copyright (c) 2016, Mark Wubben + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. diff --git a/node_modules/ignore-by-default/README.md b/node_modules/ignore-by-default/README.md new file mode 100644 index 0000000..ee77191 --- /dev/null +++ b/node_modules/ignore-by-default/README.md @@ -0,0 +1,26 @@ +# ignore-by-default + +This is a package aimed at Node.js development tools. It provides a list of +directories that should probably be ignored by such tools, e.g. when watching +for file changes. + +It's used by [AVA](https://www.npmjs.com/package/ava) and +[nodemon](https://www.npmjs.com/package/nodemon). + +[Please contribute!](./CONTRIBUTING.md) + +## Installation + +``` +npm install --save ignore-by-default +``` + +## Usage + +The `ignore-by-default` module exports a `directories()` function, which will +return an array of directory names. These are the ones you should ignore. + +```js +// ['.git', '.sass_cache', …] +var ignoredDirectories = require('ignore-by-default').directories() +``` diff --git a/node_modules/ignore-by-default/index.js b/node_modules/ignore-by-default/index.js new file mode 100644 index 0000000..c65857d --- /dev/null +++ b/node_modules/ignore-by-default/index.js @@ -0,0 +1,12 @@ +'use strict' + +exports.directories = function () { + return [ + '.git', // Git repository files, see + '.nyc_output', // Temporary directory where nyc stores coverage data, see + '.sass-cache', // Cache folder for node-sass, see + 'bower_components', // Where Bower packages are installed, see + 'coverage', // Standard output directory for code coverage reports, see + 'node_modules' // Where Node modules are installed, see + ] +} diff --git a/node_modules/ignore-by-default/package.json b/node_modules/ignore-by-default/package.json new file mode 100644 index 0000000..38e0d2b --- /dev/null +++ b/node_modules/ignore-by-default/package.json @@ -0,0 +1,34 @@ +{ + "name": "ignore-by-default", + "version": "1.0.1", + "description": "A list of directories you should ignore by default", + "main": "index.js", + "files": [ + "index.js" + ], + "scripts": { + "test": "standard && node test.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/novemberborn/ignore-by-default.git" + }, + "keywords": [ + "ignore", + "chokidar", + "watcher", + "exclude", + "glob", + "pattern" + ], + "author": "Mark Wubben (https://novemberborn.net/)", + "license": "ISC", + "bugs": { + "url": "https://github.com/novemberborn/ignore-by-default/issues" + }, + "homepage": "https://github.com/novemberborn/ignore-by-default#readme", + "devDependencies": { + "figures": "^1.4.0", + "standard": "^6.0.4" + } +} diff --git a/node_modules/is-binary-path/index.d.ts b/node_modules/is-binary-path/index.d.ts new file mode 100644 index 0000000..19dcd43 --- /dev/null +++ b/node_modules/is-binary-path/index.d.ts @@ -0,0 +1,17 @@ +/** +Check if a file path is a binary file. + +@example +``` +import isBinaryPath = require('is-binary-path'); + +isBinaryPath('source/unicorn.png'); +//=> true + +isBinaryPath('source/unicorn.txt'); +//=> false +``` +*/ +declare function isBinaryPath(filePath: string): boolean; + +export = isBinaryPath; diff --git a/node_modules/is-binary-path/index.js b/node_modules/is-binary-path/index.js new file mode 100644 index 0000000..ef7548c --- /dev/null +++ b/node_modules/is-binary-path/index.js @@ -0,0 +1,7 @@ +'use strict'; +const path = require('path'); +const binaryExtensions = require('binary-extensions'); + +const extensions = new Set(binaryExtensions); + +module.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase()); diff --git a/node_modules/is-binary-path/license b/node_modules/is-binary-path/license new file mode 100644 index 0000000..401b1c7 --- /dev/null +++ b/node_modules/is-binary-path/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2019 Sindre Sorhus (https://sindresorhus.com), Paul Miller (https://paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/is-binary-path/package.json b/node_modules/is-binary-path/package.json new file mode 100644 index 0000000..a8d005a --- /dev/null +++ b/node_modules/is-binary-path/package.json @@ -0,0 +1,40 @@ +{ + "name": "is-binary-path", + "version": "2.1.0", + "description": "Check if a file path is a binary file", + "license": "MIT", + "repository": "sindresorhus/is-binary-path", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "binary", + "extensions", + "extension", + "file", + "path", + "check", + "detect", + "is" + ], + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node_modules/is-binary-path/readme.md b/node_modules/is-binary-path/readme.md new file mode 100644 index 0000000..b4ab025 --- /dev/null +++ b/node_modules/is-binary-path/readme.md @@ -0,0 +1,34 @@ +# is-binary-path [![Build Status](https://travis-ci.org/sindresorhus/is-binary-path.svg?branch=master)](https://travis-ci.org/sindresorhus/is-binary-path) + +> Check if a file path is a binary file + + +## Install + +``` +$ npm install is-binary-path +``` + + +## Usage + +```js +const isBinaryPath = require('is-binary-path'); + +isBinaryPath('source/unicorn.png'); +//=> true + +isBinaryPath('source/unicorn.txt'); +//=> false +``` + + +## Related + +- [binary-extensions](https://github.com/sindresorhus/binary-extensions) - List of binary file extensions +- [is-text-path](https://github.com/sindresorhus/is-text-path) - Check if a filepath is a text file + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com) diff --git a/node_modules/is-extglob/LICENSE b/node_modules/is-extglob/LICENSE new file mode 100644 index 0000000..842218c --- /dev/null +++ b/node_modules/is-extglob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/is-extglob/README.md b/node_modules/is-extglob/README.md new file mode 100644 index 0000000..0416af5 --- /dev/null +++ b/node_modules/is-extglob/README.md @@ -0,0 +1,107 @@ +# is-extglob [![NPM version](https://img.shields.io/npm/v/is-extglob.svg?style=flat)](https://www.npmjs.com/package/is-extglob) [![NPM downloads](https://img.shields.io/npm/dm/is-extglob.svg?style=flat)](https://npmjs.org/package/is-extglob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-extglob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-extglob) + +> Returns true if a string has an extglob. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-extglob +``` + +## Usage + +```js +var isExtglob = require('is-extglob'); +``` + +**True** + +```js +isExtglob('?(abc)'); +isExtglob('@(abc)'); +isExtglob('!(abc)'); +isExtglob('*(abc)'); +isExtglob('+(abc)'); +``` + +**False** + +Escaped extglobs: + +```js +isExtglob('\\?(abc)'); +isExtglob('\\@(abc)'); +isExtglob('\\!(abc)'); +isExtglob('\\*(abc)'); +isExtglob('\\+(abc)'); +``` + +Everything else... + +```js +isExtglob('foo.js'); +isExtglob('!foo.js'); +isExtglob('*.js'); +isExtglob('**/abc.js'); +isExtglob('abc/*.js'); +isExtglob('abc/(aaa|bbb).js'); +isExtglob('abc/[a-z].js'); +isExtglob('abc/{a,b}.js'); +isExtglob('abc/?.js'); +isExtglob('abc.js'); +isExtglob('abc/def/ghi.js'); +``` + +## History + +**v2.0** + +Adds support for escaping. Escaped exglobs no longer return true. + +## About + +### Related projects + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 12, 2016._ \ No newline at end of file diff --git a/node_modules/is-extglob/index.js b/node_modules/is-extglob/index.js new file mode 100644 index 0000000..c1d986f --- /dev/null +++ b/node_modules/is-extglob/index.js @@ -0,0 +1,20 @@ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function isExtglob(str) { + if (typeof str !== 'string' || str === '') { + return false; + } + + var match; + while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { + if (match[2]) return true; + str = str.slice(match.index + match[0].length); + } + + return false; +}; diff --git a/node_modules/is-extglob/package.json b/node_modules/is-extglob/package.json new file mode 100644 index 0000000..7a90836 --- /dev/null +++ b/node_modules/is-extglob/package.json @@ -0,0 +1,69 @@ +{ + "name": "is-extglob", + "description": "Returns true if a string has an extglob.", + "version": "2.1.1", + "homepage": "https://github.com/jonschlinkert/is-extglob", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "repository": "jonschlinkert/is-extglob", + "bugs": { + "url": "https://github.com/jonschlinkert/is-extglob/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "gulp-format-md": "^0.1.10", + "mocha": "^3.0.2" + }, + "keywords": [ + "bash", + "braces", + "check", + "exec", + "expression", + "extglob", + "glob", + "globbing", + "globstar", + "is", + "match", + "matches", + "pattern", + "regex", + "regular", + "string", + "test" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "has-glob", + "is-glob", + "micromatch" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/is-glob/LICENSE b/node_modules/is-glob/LICENSE new file mode 100644 index 0000000..3f2eca1 --- /dev/null +++ b/node_modules/is-glob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2017, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/is-glob/README.md b/node_modules/is-glob/README.md new file mode 100644 index 0000000..740724b --- /dev/null +++ b/node_modules/is-glob/README.md @@ -0,0 +1,206 @@ +# is-glob [![NPM version](https://img.shields.io/npm/v/is-glob.svg?style=flat)](https://www.npmjs.com/package/is-glob) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![NPM total downloads](https://img.shields.io/npm/dt/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![Build Status](https://img.shields.io/github/workflow/status/micromatch/is-glob/dev)](https://github.com/micromatch/is-glob/actions) + +> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-glob +``` + +You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob). + +## Usage + +```js +var isGlob = require('is-glob'); +``` + +### Default behavior + +**True** + +Patterns that have glob characters or regex patterns will return `true`: + +```js +isGlob('!foo.js'); +isGlob('*.js'); +isGlob('**/abc.js'); +isGlob('abc/*.js'); +isGlob('abc/(aaa|bbb).js'); +isGlob('abc/[a-z].js'); +isGlob('abc/{a,b}.js'); +//=> true +``` + +Extglobs + +```js +isGlob('abc/@(a).js'); +isGlob('abc/!(a).js'); +isGlob('abc/+(a).js'); +isGlob('abc/*(a).js'); +isGlob('abc/?(a).js'); +//=> true +``` + +**False** + +Escaped globs or extglobs return `false`: + +```js +isGlob('abc/\\@(a).js'); +isGlob('abc/\\!(a).js'); +isGlob('abc/\\+(a).js'); +isGlob('abc/\\*(a).js'); +isGlob('abc/\\?(a).js'); +isGlob('\\!foo.js'); +isGlob('\\*.js'); +isGlob('\\*\\*/abc.js'); +isGlob('abc/\\*.js'); +isGlob('abc/\\(aaa|bbb).js'); +isGlob('abc/\\[a-z].js'); +isGlob('abc/\\{a,b}.js'); +//=> false +``` + +Patterns that do not have glob patterns return `false`: + +```js +isGlob('abc.js'); +isGlob('abc/def/ghi.js'); +isGlob('foo.js'); +isGlob('abc/@.js'); +isGlob('abc/+.js'); +isGlob('abc/?.js'); +isGlob(); +isGlob(null); +//=> false +``` + +Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)): + +```js +isGlob(['**/*.js']); +isGlob(['foo.js']); +//=> false +``` + +### Option strict + +When `options.strict === false` the behavior is less strict in determining if a pattern is a glob. Meaning that +some patterns that would return `false` may return `true`. This is done so that matching libraries like [micromatch](https://github.com/micromatch/micromatch) have a chance at determining if the pattern is a glob or not. + +**True** + +Patterns that have glob characters or regex patterns will return `true`: + +```js +isGlob('!foo.js', {strict: false}); +isGlob('*.js', {strict: false}); +isGlob('**/abc.js', {strict: false}); +isGlob('abc/*.js', {strict: false}); +isGlob('abc/(aaa|bbb).js', {strict: false}); +isGlob('abc/[a-z].js', {strict: false}); +isGlob('abc/{a,b}.js', {strict: false}); +//=> true +``` + +Extglobs + +```js +isGlob('abc/@(a).js', {strict: false}); +isGlob('abc/!(a).js', {strict: false}); +isGlob('abc/+(a).js', {strict: false}); +isGlob('abc/*(a).js', {strict: false}); +isGlob('abc/?(a).js', {strict: false}); +//=> true +``` + +**False** + +Escaped globs or extglobs return `false`: + +```js +isGlob('\\!foo.js', {strict: false}); +isGlob('\\*.js', {strict: false}); +isGlob('\\*\\*/abc.js', {strict: false}); +isGlob('abc/\\*.js', {strict: false}); +isGlob('abc/\\(aaa|bbb).js', {strict: false}); +isGlob('abc/\\[a-z].js', {strict: false}); +isGlob('abc/\\{a,b}.js', {strict: false}); +//=> false +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit") +* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks") +* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.") +* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 47 | [jonschlinkert](https://github.com/jonschlinkert) | +| 5 | [doowb](https://github.com/doowb) | +| 1 | [phated](https://github.com/phated) | +| 1 | [danhper](https://github.com/danhper) | +| 1 | [paulmillr](https://github.com/paulmillr) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on March 27, 2019._ \ No newline at end of file diff --git a/node_modules/is-glob/index.js b/node_modules/is-glob/index.js new file mode 100644 index 0000000..620f563 --- /dev/null +++ b/node_modules/is-glob/index.js @@ -0,0 +1,150 @@ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +var isExtglob = require('is-extglob'); +var chars = { '{': '}', '(': ')', '[': ']'}; +var strictCheck = function(str) { + if (str[0] === '!') { + return true; + } + var index = 0; + var pipeIndex = -2; + var closeSquareIndex = -2; + var closeCurlyIndex = -2; + var closeParenIndex = -2; + var backSlashIndex = -2; + while (index < str.length) { + if (str[index] === '*') { + return true; + } + + if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) { + return true; + } + + if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') { + if (closeSquareIndex < index) { + closeSquareIndex = str.indexOf(']', index); + } + if (closeSquareIndex > index) { + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + } + } + + if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') { + closeCurlyIndex = str.indexOf('}', index); + if (closeCurlyIndex > index) { + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { + return true; + } + } + } + + if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') { + closeParenIndex = str.indexOf(')', index); + if (closeParenIndex > index) { + backSlashIndex = str.indexOf('\\', index); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + + if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') { + if (pipeIndex < index) { + pipeIndex = str.indexOf('|', index); + } + if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') { + closeParenIndex = str.indexOf(')', pipeIndex); + if (closeParenIndex > pipeIndex) { + backSlashIndex = str.indexOf('\\', pipeIndex); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + } + + if (str[index] === '\\') { + var open = str[index + 1]; + index += 2; + var close = chars[open]; + + if (close) { + var n = str.indexOf(close, index); + if (n !== -1) { + index = n + 1; + } + } + + if (str[index] === '!') { + return true; + } + } else { + index++; + } + } + return false; +}; + +var relaxedCheck = function(str) { + if (str[0] === '!') { + return true; + } + var index = 0; + while (index < str.length) { + if (/[*?{}()[\]]/.test(str[index])) { + return true; + } + + if (str[index] === '\\') { + var open = str[index + 1]; + index += 2; + var close = chars[open]; + + if (close) { + var n = str.indexOf(close, index); + if (n !== -1) { + index = n + 1; + } + } + + if (str[index] === '!') { + return true; + } + } else { + index++; + } + } + return false; +}; + +module.exports = function isGlob(str, options) { + if (typeof str !== 'string' || str === '') { + return false; + } + + if (isExtglob(str)) { + return true; + } + + var check = strictCheck; + + // optionally relax check + if (options && options.strict === false) { + check = relaxedCheck; + } + + return check(str); +}; diff --git a/node_modules/is-glob/package.json b/node_modules/is-glob/package.json new file mode 100644 index 0000000..858af03 --- /dev/null +++ b/node_modules/is-glob/package.json @@ -0,0 +1,81 @@ +{ + "name": "is-glob", + "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.", + "version": "4.0.3", + "homepage": "https://github.com/micromatch/is-glob", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Brian Woodward (https://twitter.com/doowb)", + "Daniel Perez (https://tuvistavie.com)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "micromatch/is-glob", + "bugs": { + "url": "https://github.com/micromatch/is-glob/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha && node benchmark.js" + }, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "devDependencies": { + "gulp-format-md": "^0.1.10", + "mocha": "^3.0.2" + }, + "keywords": [ + "bash", + "braces", + "check", + "exec", + "expression", + "extglob", + "glob", + "globbing", + "globstar", + "is", + "match", + "matches", + "pattern", + "regex", + "regular", + "string", + "test" + ], + "verb": { + "layout": "default", + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assemble", + "base", + "update", + "verb" + ] + }, + "reflinks": [ + "assemble", + "bach", + "base", + "composer", + "gulp", + "has-glob", + "is-valid-glob", + "micromatch", + "npm", + "scaffold", + "verb", + "vinyl" + ] + } +} diff --git a/node_modules/is-number/LICENSE b/node_modules/is-number/LICENSE new file mode 100644 index 0000000..9af4a67 --- /dev/null +++ b/node_modules/is-number/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/is-number/README.md b/node_modules/is-number/README.md new file mode 100644 index 0000000..eb8149e --- /dev/null +++ b/node_modules/is-number/README.md @@ -0,0 +1,187 @@ +# is-number [![NPM version](https://img.shields.io/npm/v/is-number.svg?style=flat)](https://www.npmjs.com/package/is-number) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![NPM total downloads](https://img.shields.io/npm/dt/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-number.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-number) + +> Returns true if the value is a finite number. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-number +``` + +## Why is this needed? + +In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use `+`, `-`, or `Number()` to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results: + +```js +console.log(+[]); //=> 0 +console.log(+''); //=> 0 +console.log(+' '); //=> 0 +console.log(typeof NaN); //=> 'number' +``` + +This library offers a performant way to smooth out edge cases like these. + +## Usage + +```js +const isNumber = require('is-number'); +``` + +See the [tests](./test.js) for more examples. + +### true + +```js +isNumber(5e3); // true +isNumber(0xff); // true +isNumber(-1.1); // true +isNumber(0); // true +isNumber(1); // true +isNumber(1.1); // true +isNumber(10); // true +isNumber(10.10); // true +isNumber(100); // true +isNumber('-1.1'); // true +isNumber('0'); // true +isNumber('012'); // true +isNumber('0xff'); // true +isNumber('1'); // true +isNumber('1.1'); // true +isNumber('10'); // true +isNumber('10.10'); // true +isNumber('100'); // true +isNumber('5e3'); // true +isNumber(parseInt('012')); // true +isNumber(parseFloat('012')); // true +``` + +### False + +Everything else is false, as you would expect: + +```js +isNumber(Infinity); // false +isNumber(NaN); // false +isNumber(null); // false +isNumber(undefined); // false +isNumber(''); // false +isNumber(' '); // false +isNumber('foo'); // false +isNumber([1]); // false +isNumber([]); // false +isNumber(function () {}); // false +isNumber({}); // false +``` + +## Release history + +### 7.0.0 + +* Refactor. Now uses `.isFinite` if it exists. +* Performance is about the same as v6.0 when the value is a string or number. But it's now 3x-4x faster when the value is not a string or number. + +### 6.0.0 + +* Optimizations, thanks to @benaadams. + +### 5.0.0 + +**Breaking changes** + +* removed support for `instanceof Number` and `instanceof String` + +## Benchmarks + +As with all benchmarks, take these with a grain of salt. See the [benchmarks](./benchmark/index.js) for more detail. + +``` +# all +v7.0 x 413,222 ops/sec ±2.02% (86 runs sampled) +v6.0 x 111,061 ops/sec ±1.29% (85 runs sampled) +parseFloat x 317,596 ops/sec ±1.36% (86 runs sampled) +fastest is 'v7.0' + +# string +v7.0 x 3,054,496 ops/sec ±1.05% (89 runs sampled) +v6.0 x 2,957,781 ops/sec ±0.98% (88 runs sampled) +parseFloat x 3,071,060 ops/sec ±1.13% (88 runs sampled) +fastest is 'parseFloat,v7.0' + +# number +v7.0 x 3,146,895 ops/sec ±0.89% (89 runs sampled) +v6.0 x 3,214,038 ops/sec ±1.07% (89 runs sampled) +parseFloat x 3,077,588 ops/sec ±1.07% (87 runs sampled) +fastest is 'v6.0' +``` + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.") +* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive. | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ") +* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.") +* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 49 | [jonschlinkert](https://github.com/jonschlinkert) | +| 5 | [charlike-old](https://github.com/charlike-old) | +| 1 | [benaadams](https://github.com/benaadams) | +| 1 | [realityking](https://github.com/realityking) | + +### Author + +**Jon Schlinkert** + +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 15, 2018._ \ No newline at end of file diff --git a/node_modules/is-number/index.js b/node_modules/is-number/index.js new file mode 100644 index 0000000..27f19b7 --- /dev/null +++ b/node_modules/is-number/index.js @@ -0,0 +1,18 @@ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +module.exports = function(num) { + if (typeof num === 'number') { + return num - num === 0; + } + if (typeof num === 'string' && num.trim() !== '') { + return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + } + return false; +}; diff --git a/node_modules/is-number/package.json b/node_modules/is-number/package.json new file mode 100644 index 0000000..3715072 --- /dev/null +++ b/node_modules/is-number/package.json @@ -0,0 +1,82 @@ +{ + "name": "is-number", + "description": "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.", + "version": "7.0.0", + "homepage": "https://github.com/jonschlinkert/is-number", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Olsten Larck (https://i.am.charlike.online)", + "Rouven Weßling (www.rouvenwessling.de)" + ], + "repository": "jonschlinkert/is-number", + "bugs": { + "url": "https://github.com/jonschlinkert/is-number/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.12.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "ansi": "^0.3.1", + "benchmark": "^2.1.4", + "gulp-format-md": "^1.0.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "cast", + "check", + "coerce", + "coercion", + "finite", + "integer", + "is", + "isnan", + "is-nan", + "is-num", + "is-number", + "isnumber", + "isfinite", + "istype", + "kind", + "math", + "nan", + "num", + "number", + "numeric", + "parseFloat", + "parseInt", + "test", + "type", + "typeof", + "value" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "related": { + "list": [ + "is-plain-object", + "is-primitive", + "isobject", + "kind-of" + ] + }, + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/minimatch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md new file mode 100644 index 0000000..33ede1d --- /dev/null +++ b/node_modules/minimatch/README.md @@ -0,0 +1,230 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://travis-ci.org/isaacs/minimatch.svg?branch=master)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instantiating the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself if this option is set. When not set, an empty list +is returned if there are no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + +### partial + +Compare a partial path to a pattern. As long as the parts of the path that +are present are not contradicted by the pattern, it will be treated as a +match. This is useful in applications where you're walking through a +folder structure, and don't yet have the full path, but want to ensure that +you do not walk down paths that can never be a match. + +For example, + +```js +minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d +minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d +minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a +``` + +### allowWindowsEscape + +Windows path separator `\` is by default converted to `/`, which +prohibits the usage of `\` as a escape character. This flag skips that +behavior and allows using the escape character. + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. diff --git a/node_modules/minimatch/minimatch.js b/node_modules/minimatch/minimatch.js new file mode 100644 index 0000000..fda45ad --- /dev/null +++ b/node_modules/minimatch/minimatch.js @@ -0,0 +1,947 @@ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = (function () { try { return require('path') } catch (e) {}}()) || { + sep: '/' +} +minimatch.sep = path.sep + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + b = b || {} + var t = {} + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || typeof def !== 'object' || !Object.keys(def).length) { + return minimatch + } + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + m.Minimatch.defaults = function defaults (options) { + return orig.defaults(ext(def, options)).Minimatch + } + + m.filter = function filter (pattern, options) { + return orig.filter(pattern, ext(def, options)) + } + + m.defaults = function defaults (options) { + return orig.defaults(ext(def, options)) + } + + m.makeRe = function makeRe (pattern, options) { + return orig.makeRe(pattern, ext(def, options)) + } + + m.braceExpand = function braceExpand (pattern, options) { + return orig.braceExpand(pattern, ext(def, options)) + } + + m.match = function (list, pattern, options) { + return orig.match(list, pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + assertValidPattern(pattern) + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + assertValidPattern(pattern) + + if (!options) options = {} + + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (!options.allowWindowsEscape && path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + this.partial = !!options.partial + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) } + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + assertValidPattern(pattern) + + // Thanks to Yeting Li for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +var MAX_PATTERN_LENGTH = 1024 * 64 +var assertValidPattern = function (pattern) { + if (typeof pattern !== 'string') { + throw new TypeError('invalid pattern') + } + + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError('pattern is too long') + } +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + assertValidPattern(pattern) + + var options = this.options + + // shortcuts + if (pattern === '**') { + if (!options.noglobstar) + return GLOBSTAR + else + pattern = '*' + } + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + /* istanbul ignore next */ + case '/': { + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + } + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '[': case '.': case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) /* istanbul ignore next - should be impossible */ { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) /* istanbul ignore next - should be impossible */ { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = function match (f, partial) { + if (typeof partial === 'undefined') partial = this.partial + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + /* istanbul ignore if */ + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + /* istanbul ignore if */ + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + hit = f === p + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else /* istanbul ignore else */ if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + return (fi === fl - 1) && (file[fi] === '') + } + + // should be unreachable. + /* istanbul ignore next */ + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json new file mode 100644 index 0000000..566efdf --- /dev/null +++ b/node_modules/minimatch/package.json @@ -0,0 +1,33 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me)", + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "3.1.2", + "publishConfig": { + "tag": "v3-legacy" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "devDependencies": { + "tap": "^15.1.6" + }, + "license": "ISC", + "files": [ + "minimatch.js" + ] +} diff --git a/node_modules/nodemon/.prettierrc.json b/node_modules/nodemon/.prettierrc.json new file mode 100644 index 0000000..544138b --- /dev/null +++ b/node_modules/nodemon/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/node_modules/nodemon/LICENSE b/node_modules/nodemon/LICENSE new file mode 100644 index 0000000..19c91a2 --- /dev/null +++ b/node_modules/nodemon/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2010 - present, Remy Sharp, https://remysharp.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/nodemon/README.md b/node_modules/nodemon/README.md new file mode 100644 index 0000000..e1ad049 --- /dev/null +++ b/node_modules/nodemon/README.md @@ -0,0 +1,462 @@ +

    + Nodemon Logo +

    + +# nodemon + +nodemon is a tool that helps develop Node.js based applications by automatically restarting the node application when file changes in the directory are detected. + +nodemon does **not** require *any* additional changes to your code or method of development. nodemon is a replacement wrapper for `node`. To use `nodemon`, replace the word `node` on the command line when executing your script. + +[![NPM version](https://badge.fury.io/js/nodemon.svg)](https://npmjs.org/package/nodemon) +[![Backers on Open Collective](https://opencollective.com/nodemon/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/nodemon/sponsors/badge.svg)](#sponsors) + +# Installation + +Either through cloning with git or by using [npm](http://npmjs.org) (the recommended way): + +```bash +npm install -g nodemon # or using yarn: yarn global add nodemon +``` + +And nodemon will be installed globally to your system path. + +You can also install nodemon as a development dependency: + +```bash +npm install --save-dev nodemon # or using yarn: yarn add nodemon -D +``` + +With a local installation, nodemon will not be available in your system path or you can't use it directly from the command line. Instead, the local installation of nodemon can be run by calling it from within an npm script (such as `npm start`) or using `npx nodemon`. + +# Usage + +nodemon wraps your application, so you can pass all the arguments you would normally pass to your app: + +```bash +nodemon [your node app] +``` + +For CLI options, use the `-h` (or `--help`) argument: + +```bash +nodemon -h +``` + +Using nodemon is simple, if my application accepted a host and port as the arguments, I would start it as so: + +```bash +nodemon ./server.js localhost 8080 +``` + +Any output from this script is prefixed with `[nodemon]`, otherwise all output from your application, errors included, will be echoed out as expected. + +You can also pass the `inspect` flag to node through the command line as you would normally: + +```bash +nodemon --inspect ./server.js 80 +``` + +If you have a `package.json` file for your app, you can omit the main script entirely and nodemon will read the `package.json` for the `main` property and use that value as the app ([ref](https://github.com/remy/nodemon/issues/14)). + +nodemon will also search for the `scripts.start` property in `package.json` (as of nodemon 1.1.x). + +Also check out the [FAQ](https://github.com/remy/nodemon/blob/master/faq.md) or [issues](https://github.com/remy/nodemon/issues) for nodemon. + +## Automatic re-running + +nodemon was originally written to restart hanging processes such as web servers, but now supports apps that cleanly exit. If your script exits cleanly, nodemon will continue to monitor the directory (or directories) and restart the script if there are any changes. + +## Manual restarting + +Whilst nodemon is running, if you need to manually restart your application, instead of stopping and restart nodemon, you can type `rs` with a carriage return, and nodemon will restart your process. + +## Config files + +nodemon supports local and global configuration files. These are usually named `nodemon.json` and can be located in the current working directory or in your home directory. An alternative local configuration file can be specified with the `--config ` option. + +The specificity is as follows, so that a command line argument will always override the config file settings: + +- command line arguments +- local config +- global config + +A config file can take any of the command line arguments as JSON key values, for example: + +```json +{ + "verbose": true, + "ignore": ["*.test.js", "**/fixtures/**"], + "execMap": { + "rb": "ruby", + "pde": "processing --sketch={{pwd}} --run" + } +} +``` + +The above `nodemon.json` file might be my global config so that I have support for ruby files and processing files, and I can run `nodemon demo.pde` and nodemon will automatically know how to run the script even though out of the box support for processing scripts. + +A further example of options can be seen in [sample-nodemon.md](https://github.com/remy/nodemon/blob/master/doc/sample-nodemon.md) + +### package.json + +If you want to keep all your package configurations in one place, nodemon supports using `package.json` for configuration. +Specify the config in the same format as you would for a config file but under `nodemonConfig` in the `package.json` file, for example, take the following `package.json`: + +```json +{ + "name": "nodemon", + "homepage": "http://nodemon.io", + "...": "... other standard package.json values", + "nodemonConfig": { + "ignore": ["**/test/**", "**/docs/**"], + "delay": 2500 + } +} +``` + +Note that if you specify a `--config` file or provide a local `nodemon.json` any `package.json` config is ignored. + +*This section needs better documentation, but for now you can also see `nodemon --help config` ([also here](https://github.com/remy/nodemon/blob/master/doc/cli/config.txt))*. + +## Using nodemon as a module + +Please see [doc/requireable.md](doc/requireable.md) + +## Using nodemon as child process + +Please see [doc/events.md](doc/events.md#Using_nodemon_as_child_process) + +## Running non-node scripts + +nodemon can also be used to execute and monitor other programs. nodemon will read the file extension of the script being run and monitor that extension instead of `.js` if there's no `nodemon.json`: + +```bash +nodemon --exec "python -v" ./app.py +``` + +Now nodemon will run `app.py` with python in verbose mode (note that if you're not passing args to the exec program, you don't need the quotes), and look for new or modified files with the `.py` extension. + +### Default executables + +Using the `nodemon.json` config file, you can define your own default executables using the `execMap` property. This is particularly useful if you're working with a language that isn't supported by default by nodemon. + +To add support for nodemon to know about the `.pl` extension (for Perl), the `nodemon.json` file would add: + +```json +{ + "execMap": { + "pl": "perl" + } +} +``` + +Now running the following, nodemon will know to use `perl` as the executable: + +```bash +nodemon script.pl +``` + +It's generally recommended to use the global `nodemon.json` to add your own `execMap` options. However, if there's a common default that's missing, this can be merged in to the project so that nodemon supports it by default, by changing [default.js](https://github.com/remy/nodemon/blob/master/lib/config/defaults.js) and sending a pull request. + +## Monitoring multiple directories + +By default nodemon monitors the current working directory. If you want to take control of that option, use the `--watch` option to add specific paths: + +```bash +nodemon --watch app --watch libs app/server.js +``` + +Now nodemon will only restart if there are changes in the `./app` or `./libs` directory. By default nodemon will traverse sub-directories, so there's no need in explicitly including sub-directories. + +Nodemon also supports unix globbing, e.g `--watch './lib/*'`. The globbing pattern must be quoted. For advanced globbing, [see `picomatch` documentation](https://github.com/micromatch/picomatch#advanced-globbing), the library that nodemon uses through `chokidar` (which in turn uses it through `anymatch`). + +## Specifying extension watch list + +By default, nodemon looks for files with the `.js`, `.mjs`, `.coffee`, `.litcoffee`, and `.json` extensions. If you use the `--exec` option and monitor `app.py` nodemon will monitor files with the extension of `.py`. However, you can specify your own list with the `-e` (or `--ext`) switch like so: + +```bash +nodemon -e js,pug +``` + +Now nodemon will restart on any changes to files in the directory (or subdirectories) with the extensions `.js`, `.pug`. + +## Ignoring files + +By default, nodemon will only restart when a `.js` JavaScript file changes. In some cases you will want to ignore some specific files, directories or file patterns, to prevent nodemon from prematurely restarting your application. + +This can be done via the command line: + +```bash +nodemon --ignore lib/ --ignore tests/ +``` + +Or specific files can be ignored: + +```bash +nodemon --ignore lib/app.js +``` + +Patterns can also be ignored (but be sure to quote the arguments): + +```bash +nodemon --ignore 'lib/*.js' +``` + +**Important** the ignore rules are patterns matched to the full absolute path, and this determines how many files are monitored. If using a wild card glob pattern, it needs to be used as `**` or omitted entirely. For example, `nodemon --ignore '**/test/**'` will work, whereas `--ignore '*/test/*'` will not. + +Note that by default, nodemon will ignore the `.git`, `node_modules`, `bower_components`, `.nyc_output`, `coverage` and `.sass-cache` directories and *add* your ignored patterns to the list. If you want to indeed watch a directory like `node_modules`, you need to [override the underlying default ignore rules](https://github.com/remy/nodemon/blob/master/faq.md#overriding-the-underlying-default-ignore-rules). + +## Application isn't restarting + +In some networked environments (such as a container running nodemon reading across a mounted drive), you will need to use the `legacyWatch: true` which enables Chokidar's polling. + +Via the CLI, use either `--legacy-watch` or `-L` for short: + +```bash +nodemon -L +``` + +Though this should be a last resort as it will poll every file it can find. + +## Delaying restarting + +In some situations, you may want to wait until a number of files have changed. The timeout before checking for new file changes is 1 second. If you're uploading a number of files and it's taking some number of seconds, this could cause your app to restart multiple times unnecessarily. + +To add an extra throttle, or delay restarting, use the `--delay` command: + +```bash +nodemon --delay 10 server.js +``` + +For more precision, milliseconds can be specified. Either as a float: + +```bash +nodemon --delay 2.5 server.js +``` + +Or using the time specifier (ms): + +```bash +nodemon --delay 2500ms server.js +``` + +The delay figure is number of seconds (or milliseconds, if specified) to delay before restarting. So nodemon will only restart your app the given number of seconds after the *last* file change. + +If you are setting this value in `nodemon.json`, the value will always be interpreted in milliseconds. E.g., the following are equivalent: + +```bash +nodemon --delay 2.5 + +{ + "delay": 2500 +} +``` + +## Gracefully reloading down your script + +It is possible to have nodemon send any signal that you specify to your application. + +```bash +nodemon --signal SIGHUP server.js +``` + +Your application can handle the signal as follows. + +```js +process.once("SIGHUP", function () { + reloadSomeConfiguration(); +}) +``` + +Please note that nodemon will send this signal to every process in the process tree. + +If you are using `cluster`, then each workers (as well as the master) will receive the signal. If you wish to terminate all workers on receiving a `SIGHUP`, a common pattern is to catch the `SIGHUP` in the master, and forward `SIGTERM` to all workers, while ensuring that all workers ignore `SIGHUP`. + +```js +if (cluster.isMaster) { + process.on("SIGHUP", function () { + for (const worker of Object.values(cluster.workers)) { + worker.process.kill("SIGTERM"); + } + }); +} else { + process.on("SIGHUP", function() {}) +} +``` + +## Controlling shutdown of your script + +nodemon sends a kill signal to your application when it sees a file update. If you need to clean up on shutdown inside your script you can capture the kill signal and handle it yourself. + +The following example will listen once for the `SIGUSR2` signal (used by nodemon to restart), run the clean up process and then kill itself for nodemon to continue control: + +```js +process.once('SIGUSR2', function () { + gracefulShutdown(function () { + process.kill(process.pid, 'SIGUSR2'); + }); +}); +``` + +Note that the `process.kill` is *only* called once your shutdown jobs are complete. Hat tip to [Benjie Gillam](http://www.benjiegillam.com/2011/08/node-js-clean-restart-and-faster-development-with-nodemon/) for writing this technique up. + +## Triggering events when nodemon state changes + +If you want growl like notifications when nodemon restarts or to trigger an action when an event happens, then you can either `require` nodemon or add event actions to your `nodemon.json` file. + +For example, to trigger a notification on a Mac when nodemon restarts, `nodemon.json` looks like this: + +```json +{ + "events": { + "restart": "osascript -e 'display notification \"app restarted\" with title \"nodemon\"'" + } +} +``` + +A full list of available events is listed on the [event states wiki](https://github.com/remy/nodemon/wiki/Events#states). Note that you can bind to both states and messages. + +## Pipe output to somewhere else + +```js +nodemon({ + script: ..., + stdout: false // important: this tells nodemon not to output to console +}).on('readable', function() { // the `readable` event indicates that data is ready to pick up + this.stdout.pipe(fs.createWriteStream('output.txt')); + this.stderr.pipe(fs.createWriteStream('err.txt')); +}); +``` + +## Using nodemon in your gulp workflow + +Check out the [gulp-nodemon](https://github.com/JacksonGariety/gulp-nodemon) plugin to integrate nodemon with the rest of your project's gulp workflow. + +## Using nodemon in your Grunt workflow + +Check out the [grunt-nodemon](https://github.com/ChrisWren/grunt-nodemon) plugin to integrate nodemon with the rest of your project's grunt workflow. + +## Pronunciation + +> nodemon, is it pronounced: node-mon, no-demon or node-e-mon (like pokémon)? + +Well...I've been asked this many times before. I like that I've been asked this before. There's been bets as to which one it actually is. + +The answer is simple, but possibly frustrating. I'm not saying (how I pronounce it). It's up to you to call it as you like. All answers are correct :) + +## Design principles + +- Fewer flags is better +- Works across all platforms +- Fewer features +- Let individuals build on top of nodemon +- Offer all CLI functionality as an API +- Contributions must have and pass tests + +Nodemon is not perfect, and CLI arguments has sprawled beyond where I'm completely happy, but perhaps it can be reduced a little one day. + +## FAQ + +See the [FAQ](https://github.com/remy/nodemon/blob/master/faq.md) and please add your own questions if you think they would help others. + +## Backers + +Thank you to all [our backers](https://opencollective.com/nodemon#backer)! 🙏 + +[![nodemon backers](https://opencollective.com/nodemon/backers.svg?width=890)](https://opencollective.com/nodemon#backers) + +## Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Sponsor this project today ❤️](https://opencollective.com/nodemon#sponsor) + +
    buy instagram followers on skweezer.net today +Netpositive +KasynoHEX +Casinoonlineaams.com +Best Aussie casinos at aussielowdepositcasino.com +Best online casinos not on GamStop in the UK +freebets.ltd.uk +TheCasinoDB +Marketing +Rating of best betting sites in Australia +inkedin +AU Internet Pokies +CasinoAus +AU Online Casinos +Top Australian Gambling +casino online stranieri +Goread.io +We are the most advanced casino guide! +Best Australian online casinos. Reviewed by Correct Casinos. +Casino utan svensk licens + +Do My Online Class - NoNeedToStudy.com +Slotmachineweb.com +Website dedicated to finding the best and safest licensed online casinos in India +CasinoWizard +Scommesseseriea.eu +Gambe Online AU +Gamble Online +Italianonlinecasino.net +nongamstopcasinos.net +Scommesse777 +Twicsy +At Casinoaustraliaonline.com, we review, compare and list all the best gambling sites for Aussies.
+ +Casinon utan svensk licens erbjuder generösa bonusar och kampanjer. Besök coolspins.net för att utforska säkra och pålitliga alternativ. +BestUSCasinos +TightPoker +Buy Instagram Likes +Find the best casinos online. Casinot.biz lists and reviews online casinos. +btcgaming +Norway's biggest and most reliable online casino portal +OnlineCasinosSpelen +Beoordelen van nieuwe online casino's 2023 +CasinoZonderRegistratie.net - Nederlandse Top Casino's +OSLabs is a nonprofit tech accelerator devoted to furthering high-impact open source software within a collaborative community of dedicated engineers and mentors +Ilmaiset Pitkävetovihjeet +NyeCasino.me is a website that lists the newest and best online casinos in Norway +Famoid is a digital marketing agency that specializes in social media services and tools. +LookSlots +Gives a fun for our users +We are the leading Nearshore Technology Solutions company. We architect and engineer scalable and high-performing software solutions. +Buy real Instagram followers from Twicsy starting at only $2.97. Twicsy has been voted the best site to buy followers from the likes of US Magazine. +SocialWick offers the best Instagram Followers in the market. If you are looking to boost your organic growth, buy Instagram followers from SocialWick +Online United States Casinos +https://bestnongamstopcasinos.net +Aviators +Online iGaming platform with reliable and trusted reviews. +$1 deposit casino +Online Casinos Australia +Looking to boost your YouTube channel? Buy YouTube subscribers with Views4You and watch your audience grow! +casinosonlineaus +Verified reviews of the most reputable Canadian online casinos at leafletcasino.com +Buy Telegram Members +Najděte nejlepší online casino v České republice +We review the entire iGaming industry from A to Z +Helping Swedes finding safe unlicensed casinos +free spins no deposit +I migliori casinò online dagli esperti di SitiCasinoNonAAMS +Best Australian Online Casinos in 2024 +MEGAFAMOUS.com +PopularityBazaar helps you quickly grow your social media accounts. Buy 100% real likes, followers, views, comments, and more to kickstart your online presence. +Non-GamStop NonStop Casino +philippinescasinos.ph +Incognito +NonGamStopBets Casinos not on GamStop +Buy real Instagram followers from Stormlikes starting at only $2.97. Stormlikes has been voted the best site to buy followers from the likes of US Magazine. +UpGrow is the Best Instagram Growth Service in 2024. Get more real Instagram followers with our AI-powered growth engine to get 10x faster results. +Reviewing companies in high-risk industries like online casinos, forex brokers and crypto exchanges + +Analysis of payment methods for use in the iGaming +30 Best Casinos Not on Gamstop in 2024 +Twitter Video Downloader HD Tool allows you to store tweets on your device (mobile or PC) for free. +
    + +Please note that links to the sponsors above are not direct endorsements nor affiliated with any of contributors of the nodemon project. + +# License + +MIT [http://rem.mit-license.org](http://rem.mit-license.org) diff --git a/node_modules/nodemon/bin/nodemon.js b/node_modules/nodemon/bin/nodemon.js new file mode 100755 index 0000000..3d490f1 --- /dev/null +++ b/node_modules/nodemon/bin/nodemon.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +const cli = require('../lib/cli'); +const nodemon = require('../lib/'); +const options = cli.parse(process.argv); + +nodemon(options); + +const fs = require('fs'); + +// checks for available update and returns an instance +const pkg = JSON.parse(fs.readFileSync(__dirname + '/../package.json')); + +if (pkg.version.indexOf('0.0.0') !== 0 && options.noUpdateNotifier !== true) { + require('simple-update-notifier')({ pkg }); +} diff --git a/node_modules/nodemon/bin/windows-kill.exe b/node_modules/nodemon/bin/windows-kill.exe new file mode 100644 index 0000000000000000000000000000000000000000..98d7d7f7ed95fd8662f82dda3d16203f0d76e580 GIT binary patch literal 80384 zcmeHw3qaIW_WvDVU=(pia}>*ROk62bQ7rMvjDUX8K~eEhsemvDiGah5;#)&Yn#SC= zw%Q(2xn>^&6@w`-0$~0d}ka`(zb2?T)lJdJ@?#m z&OP`2m?7pPPfe(>pR^t@(W5$CHCT3 z_Ut*Poa~~aVuxv_&182LnF@+b$>S!P<`n1J`b0&wj*(eU*z>|y9XEckMe$wtr*4Tx zy!Q`BHn->S@Ma^2pKNZ+;m4aV1MIl*$d*}vdnUEp(hhLt4+l11!C{Xrop^d0hbwe!VmGNdhIBY`;~VN1+_1|BwR2v9hLv2c!R zfUFX!WJI`7mbF63BOc#qxV0Mg0>X7gjFl)j z6|662EEe%Bz`Imo53UfET`q@`#RRr}?77*FY{mv$3v3qr zb?~F%Rn82R`$%N0UWbHAc;dAjUggY;dHR${guIL>D>vv$6%m4H(vz#)zw0GYD5dWr7ksOmQxW0287Tm`7 zGAJqPt8~W1G&EJgwF}s1fE9=PqAMxd*B33IsL2=o60OW@tOJMgpES-`WWQZvdN(nx zM_Z7XZsl~lfIKz`$nu{;^sC5*7KLSouTYp6evbf3e|#J`jPr4L9az!qi>^Vm zwk@b%oXDxS5_LC9b{oHvtl%|%3*@nxsG;(oLiMYtssz^z6f1PF_A!#yMgLL~igiDQ z4G5!HYZ2D3r0xVp6^IC~Jz_*6W2-!l`8?-xRZgcW=S>t2i}%(}iubzqA@_|y=({rg zOJR|MciZ6P)?TMhC_klheqGxi$%RNpF}0+4K38p*;5r~qmxFF&cMu#Kk2doLP|UKq zHCHMlMi5+M4PN72$mlvGxRQYwGE(QzE>B>No?uM*!1$@LV60adPc|G22P@a&7{N6S z{ve9=9O@qQmr3-CiT)GFa2-U`@ER#UQorW*-6g(7DF=AUol?pkIps;DtVOSISp+jW^w}Rw#cn?nWO!a7$2eYu7}s1j-~-SYvdPr&uy9lP%OW%?+6= z9*9|v!dP9W1=qLnN6=Ht5-xRWQ{qq5wofg8*Q@WE%vh>-=ZJ(Z{hcSFjilbiSZsaKywy`F<+pbtqRjb3yqPp0zC-C7)?iby|gQ_jBH#@E-+1=zk`j;~LP31DZ#v@iD z@H)l|-hH(ntUBTxFB7G?cBWD#Lo=`OK~SX*+3D;>Z2AUabC<-%sV(0VR@<6*{gZ1# z){)6!!G1K=Qjc^wVoFf?WmZ=%m7bSG2z@st-s3vpHO>OFwO(U102L|KwbyGLLby~{ zSPa=^w9DE}WiM2=Yp39n>IL;~wq#mnSf*vp@Kyg_-kwZU8Lq?6wdOSvy2opLeGGcv zOV#MUUgO&c^FSRB>;NN^uK}&jh%xXsF(pWY;A6Fe3M#dSe5>me5u;?N{B&xYtySut zvwDlU0zs-*zw%kwPjFFND)(xZ(LfRkWBaPwLL)V=@HkZEe5$RUL2B#E(Y(?v`s9yM zLHSf&umKnN++exNxBJt89dEzggRr}&ft0h7DmV)j3`;C-s9>c5oK@lTzyKBA6F{o) zeO}{e!lk+*9O^O} zZ>I94fJ=MNt%ytdmk>T(FB1rWY-e&z0tS9sSz{!AnGd_xm;|v^1Pn+jCkW+>W6}+R zK8eEasCsH%Xr89{x20B!FfUdXSmkR3cLu5q#mMp+FHa?=+Q%@9P`OPIFkv>KkX!r? zYudGP7gPGzVZpUsa8J}h%%8cKND|Uos2B~Dpz|8{Kxc5w;2c8*m)y;Q_A-~{ya|$fyp}E~>xr(Vep&}pswj>&@VEipeBP*_q*#t7zxBZXA?{|;ZdyV6; zco$st@%t^C2k^y#HO3*fMd`q)B!OcxXre-^yauG0>dSS>mJK_!=@3o7TP^F0H@_6~Fp7RiyA`$Nr zcgH|zRZ=wXN9Bv64Tyj%_@YH!wlkFZjs2vRZ#*#xt_23@lscq-{s5uM!m|nG3!)A7 z4jArtQfao)!X}P*WbQ!Oh+hLD4b3M>$^c=lQhU`qqDH$rXsoU(ukr6G$j=q3SY)tc z;t$;!mcZ@Pz<@Z04GBcjct>jqwD!d@(U!>=`b>gr1S;@UnyU_b2ClQG6szH=`RG|* zFUt zGWum6alV#k>C3YWS`b~@)9OM-*Fo_(QDL~u7Rr~xR4Dm%yqxwPSj^RSN0RdkEa+SY_xkQhU{?~tPioVI8l3@ zu;LUiNDsknK|!|7$AakquQnbU%+b^w8}* zF89zECE{ITENP|mP`PvZ^pGnX6czD8#iD3yMJZY*x-qq@k4Nkbi>D5pV40CQLs`J_ z{>%FZEebH4p%$r2pba=~5M1L?g3|^&%BbNDNf=URM<)de99s#YV+>e%&+DfUNeT$P z>a4DPRqoYFr=CaPKunp&%!AXdF?mL{rCh?GuZ;5`-|{$fxcOXaM7}0MHJ@ z2n>@8`jqW{-DR(NlHe|kc>+`TT4Gq0(vvrH?6o#<0ouPT1)65>lu>*}SfFG2RdJZ5 zgo>!Hw=$Lz|2B3H7Wa5f{M*>C45tKGc$LSQBxbfj%yr0XTmy7P%0QuFdZIoyWgwP# zDFdx;?LnG@+>-_h?zE%gh;|e)=Hw7SyiIS^*((~-!X5Qb2*i2;Y`{2Od>?44!QnuQ zry?l=DY3z&+^3fEA?6K8`FSP*NO|lUNQvK18{1REWbS1$_ZmR)euevPBnK(OY&G|# z68CiqcY(N<@Ae9=F*p;b0|#vRpnpeM!cvkjNRf~qT!KX{p^GG8m?GiJUevP77g4Ra zVJq=fUTu5C?j)ir#mlGKs+5yJvz;kNv0&{(6mH|CoGnanJ^Bk4J1Iwn@+Dqcts>-( z8e;)fMVg+Lk!hXayP^pU+?kSyL2ptg*lwWLIG<|Ut&OF|Rgt0x(^c7oNz;pCq1RfG zi$Xp9l`EAtidH(OJA(wvaNfRFyh+V&dPAGUAdw%xAM!r~-fNsblrQ_V=-K%@Xe`MR zTeqhCsO~{XBUCI}(h|(y(jqIvx0}G?n(rk{;?cIGl~Ko)16tg4HSqv9X}y$1E!&lf zR{OT2z1LVhgbQt}EKVRi>&6}8pIga-JxEss4`@KV^Gd9xW!LR=4f3%zQ<>R$^Hl9toxjSw-DEg*J7rE+H1T7cvJvpLRWpVdju$@ zenF!(Y-^=r5VKgU(c`9aHTPAmj9HFQbp#jz9g8qHZQ=dNaixI4B%N!rk8GarHQs|1 zp<)JB8%l~KofgDgXEc)ooj|kVO)8vv3Bl(RK9vX<6W!YN)C92@c8}N5As5EV5WzhL zE3y$7Ee}#fxwVy876}y*7$x-vOqn!N>f4RN%tPx$zuNF$Zxa9Hrufg7_?u<^ZtYlv zd@^K_{*sjSwQ9fiDYr)8`usA9_ueGZ9h0H|e$A~7r35tF3eAb_8b|9_U?(Qd+Ca2oUsc6B8mEu8h*$FQ~-Pq!{yr@?SL0snYZ+@I|$b)#lO^`zftA zrIjtFSXy-QDVA1^s2_pqW(KBM9#`gB9~SG)NLJfL;_I7Kh0tAC6U6Tq_x_0#rQHS1 z;J$Qekt%Ui3Gr_L+&+^gW6|h3jby!Xr1ovDhzDsX)&qZ6pek5F9 zUWA@0xZWdsmBo88?20t(rk1~r3xy>$m>glVC_Ttl?OP{aD#mi zhF%fNk|B0{AQ2T_v84JKnbGP>sYxyOXdG=Y?pD*J*AD%QC(k1*Q^wMv*hKIafDOgL z`LR~l4l9JEo;+mjwa0=Z?#}v`B3Fl6R=4RaxNp>8vk{Hj#=_sVq`EfViUTMFtQZ28 zbAeti51Jg{DnHzl3P%J(tS*U0aN#I1rADYg&J+=oLrtoyZ7O0FX<{w9b(%;SuopDg z$740Dk(Z{!PNY=x-Q!5!Zd|nasiNKEbv)jy9?gsI9{?{%2(`u)pBk2Mw zLq;9VCQn^LhzDX;b6dQbZkaJdHJe~RJZbV2sVcKjExVM(4HXns`;rqts#*)3)}M|) zQQ`C`^(Ry~Ys{;i)u_K$yvsmI6?i|dz%&$&YD}M$R!zqjlq_b%fTk*?MxsSE$|Nb( z=GB`dBx+DbPO6r2(Fy21xSU+&(XYCbw5l2+TY;uhAqJ}JdQ1a z{+8E}%WHfHh_x=XI@I-$>iO7MO{(Fo*H^NgVFp&)M(8EA?uUM&)(tDYNNeyWOCq)A zec~7`KM9cvU{Ci`-gny2F+lO~0L4$hfLH}drwzw=#I;MD)`4t=|(#zkBQ_V6MQ(|p`E35}iov(yZWx8~(u-1dLk1b+s=|~K~4zr*}k%Pc+6OO&;da1uhf~fSy?0FN`LEN6%2#7;rmGWVe5R~jWlopRw z+VMbO)k5~XlZLqp?GU0q-HD@mQuq-XVcgp82nVqzwHM4Yg)!0c$c6jb z_nwJnDGU+M+TOl%_V!k^y56qZzru7PqTy5yGj?#1R#(V7k)^=Jl^7 zOW0DSh917h7o6)nqw85B=BX9a&9K|k7T+( z`v5xu9hTSN2af!*l`P8pgKrVz8^26K`9iFKDA%dd_EtKPq*cVFSeK*7we6|CF?)y5 z;<+kBVu^iw#VF*#BDn(VW91l#SE+JPiyPcfOhnZGz9m~jG!KAOe% z1=0zc)?9@AH0$D~#djb?2Y2a8=~Bzf49wBivY8a45%q4GPcSy14ZSOh;Ioz%SD2XP z5%)zL<*b!%+v&_2m#Rp?P9@+>>|I{l4HMv29&eZcpXPCS9(hU*)_9qdm98GAsc2 zq~^1~pT*6SCQhLfoh@`JLs_a)=(O0Yzv_jUO`L^xTOrV7{*<14@qd~|tE!YY<_A`Qj+V0ob;lJ2wOeYaQ@ zDV=tvbj40Dt&`XIb8k?%wNKNSO1qsFOETdlip2RQt<3E?4_T ziFlWIc^fW+kJ}ZY`gWz5l~UeN%XvINPH}*o%m6v#)N)2Ba$cl{;nucS%7P}7){|OH zwGO+kqH-Dmpr-7#WQ-JN>Fp(Br(uk8w;Qd9-x98 ze-&O!%JU;UuegjV(rv69N4PYvn2Kcyo)CDD6$c7d_ejGlCMfAO4hM#$ts|B3UWN`{ zCgPrmqj7NfCq?R{;8KUHrM8l!Uad$y5DlsEM{vMk5I;I8tKTL#qjzXor>O7YgN*Uh zv9kKN5hJwJQ7F?7AfyA%#a96yf$l5&W2s%0G7z6A0%$5yhE$~_@c|2SS}b*JQ?eVA zqdR3F9jMT&ps~p9H7>^|mA;N=4OiF2gGln##YFIy#XDv3KVulcy6n0D!4=b!NM3NE zhmpr?j3mw&JbQsDT1h9~RV$|JS5No)Ecrh zu3Hzy;>xw5lkxdCi$=(X^TAD6DWVbr&j;uJD7UprzLJyDy2fD+K`ylO$a{s21Hz z=W(>nNUa#Nnil35j;S?{iS`;3xSmNS-tiwK?m$yl9Pc&K845qczaJY+J^<_nrUK(E z+6>O{Bj^l20w=GbRMYNB5i~A~OHc9gtQ*7a-ANR%i@_APC|b-=*pvrn^BPTk3Y&ov zo2d#L4QE4J6E||>2wlJGq`$hCE9xHSTQ7`Pmj#!TL9IfOvyX-ux3O-ttnPi-Bye?M z2v~(1Vn+|z5O*q^w*eEx5c}07a7vv2s&Gz}Ih({W3Y&$&+0^nrDBH7-#AckrrXG6{ z`98tqHCA%f^eY2w(N590<~zCS^ua|5YK?c$Na;3yo+{hIO`@pkRJM3IMz+N*3g;Jr z31W+#>OvGqoNrS&$IF~eVxq#PC^#Fvn$49Gn;qCJ%WZ?H3 zQv&5nx-`7k5r#xrW-|7jv%Rown<4MyHm~NT1GgG@XF}VlIH|ziF#c{YQeyfoGVL|@KVe>tjkNeU(r!ECilY0}@>3dTYl&zt zi11)xbd`1_63A?*zh%^M+)+~j#65am;MSYHNIQ01BDhW>&=bLW5L9V($c>6%wL0@l z*aJi2ZF|J-u&sClB*5rGIUYP;iDe(3XJMC)c;Q1mawiIiNyy?(55a=!fY@I}kGBxJ zM2nW&5p!6iI0wSS$@su+lqhg`NbCY=rE7~$pcqn(chiT&p)ez!Fh)Rt9?9mFC!AWb zJ3{gMpVf#@gQaUnZ8s2JA`$99c)TqPwtR7n3ELd;XGEm)2{XOGP>!{Doh(EB@yeKo zxp(j0W1%QG>f{*RD+0>x)pfYG8x`;%uxLQ-h4P=g&Iqw18d$AX{07CQ)Hjfd3D@yY zscHDvD{kmKsEAqFI2){l^5RcXpms<7sXHy9!DYN_2D*+J ziLUMCHHp|V9oQ$tpB4`65#m1(Du(@-1@el^PY`fNjRT!XFJbxV0E*J^E<$=HAl*ND zjq|RcY}#ii8%*_Pt=xqBz|e9R=}tkZkAU+ePIh!UOGify zO+y+752E3rF?Qp2i{rKubhTPx$Sy~Rcn?nbo{g#mC+ENU(QoXIO`6)1zP_h_N&6}i zSH1lzjcEGh9jmoZA}+o{itOsy#;@ZwT5br*l zG^q!6S>v}`D^hCUMZJN;y6^Ocv^sq|?OW5)5YI|$7xg;u3e6TCZWpx;kZhTb24tST zV++PO%z>f2+mKD8t*&jG({8{u{~+yKuXw%A1wxLt9syM4iyX8utQbUJEOcgWj>KS| zH^>t0%&_*_u7BCm0XOQ=LTELD;exx(a;v+|ZlR(>OzM#L9MP`PZLE0q*&1j4q4XFI z?*_}a$JTy=jRl_eaYL6cjA2VC)EX5P4j97gEt*dKr8a)sVevCmPyBw=dgRI@&IsXF z<5o05Xn$fs@3y*&8QoZE)EAG{_RyBL7$8sMXw8qA0P7{r*DIuJan1o`O@&F7IwYz-#;vM;#c5UuhM_JW7X7Clb8zhINi7Y{BlAiHA{Qls94v z&7JSy$z#-$q{l|Y==3rHgW{c3t)dOmP4B%jtR3p)DO2)&Z;mCNp8TqqMn-ye1$d4q#&_@jQYERM8>NwhlcpF zEe-?Tr7+5pHBip0{P0!~c4#t>xlR+W207C#GtX8E|3C(3=(B$V5tneb}=M?UF&UoQx8 zX}_KVFl2|b7~4?nY=6N@QE;W;_$vjcE+S%BF7%`DKcuib%_PNNqj-u5*$l$A8j}!@ zaD0kEh~Fk`L6PCWsXHR^im)L&&|0>^{0m4X`kz48Fcn%mMbUt!@8Iur(9q*?>$RDg z`RyX?_-7iAy*=!Zh2mwDl_KEil(sluN3@k){OwM#)??W@9~u3J7!UdFQI~9&w;YEu_`ag>^NiBk@tt62fa- z(g`8ggCeK6`w$Y*wlR*Qol^>!3{`5;UBgp3QA15aF}FwwRF}k)0{Ef>=26ai)h${ zD-Lyz@rCMqIJnAd8JA{7LQd(N8fO=rc!xPVx&)JZMa}8LFU#vg=IQZ-*nFR+;T>2M ztQI(L0)>IpW*KRNYuN`Oc zLbpE$FK>^pQMtY~i}a=`svY(Fz|(tt2Sx0Hxe4vJ6;H>Zy)yG+p-9i%-C8fY27>fp z^>ZG?P_#`o?(*-rL_N!s0&WM0|7#f9ko7&D9*log1OKN~{E=t69K|EsW5r-2*-3h5 z=GG=ss_GrCXa$M?GhC4$>)@?{>RJYEN}xt)5-+9x>^Anjjua$BUoOL!euI==>`T`x zIvDuZ3Y3Ab+$LhaipN;rVWPDE(m#^y+E%62AWB_h#kV<@wB%&h?qt_~%ZhJpMUDc? zith@FY^jzNbwv(aVM=6mvg=5)OWO<6fn~+_7N;XWCGxQAKyu{a72l1r6*=)Rzdku~ zKOe;Ok5r`8CA;2Eu1KrLV~FWLR7^UPf+>E2P#$&P1T+sz`L3`Yb%|bma)tIVmKwu6 z;Tqzd&_BAPG!of0$hi(VQ?R(|yy8=) zucJ<&&ti5;4MXY*q;94iG#;NokMmCssnjv>fH%N~pV zl}|gA7FB6KA1~ReO8YTF7!!HYWu+5|qD!e2%rw=)wtty~$ZEWBF<|B}#DotGclLK_ zHz7y)E?t#&9Rg^->_m!as?gqtnB$W2U8XASEeK*1VHMhy2vGw_pq&rBGvl)X%>#q9 z4y0jR*s+}k0+sXj7=hz3Z;t`|^H2QKz&}Iy=MOl2^7i+aC}}nDjptu@HJGL%YuEy?o`)%BDS&q&sWV8Q(QP&{J>KFS-sWuw&es1 zv%21MTw-yVb!qtOCZ4W^z9;1DvUYzjHD||YR|nKel7UXPL&xY&SVHxV*7&A-Xn9SY zH53bK2zmR)W9x8x58L8SOi+IX4R>JDyMk2L^-$bYScF!8JzWf z7pbaM=U?T=4OXn9tu$|^#UHU^xfE^fRh_0EalmGEb?JfQ9+o!bz;~sc@+>R<#p=@B z_cI*KS@2~hLOZ{)x{w>K46DjF4d3n9>+PX~)xAAh^UrHg531%R2OH#jYy4CBS7jzn zqUld?eI>Z217PUf<4xDa@5lM$YnXWTUCr<`$07Vu8-w88ZW(Mfc%2=wv<`P3$H?{| z$gpgDA7>V|*ukkeJcOhM`Df*i;Q3cc`Tt7!d-(FxVF$kFFQqL+n)ngU3u$`BSMm2# z&~3bb2ghJPj&$5vX$^$Ox@kJCeUkCPtm!>D7bHnMYB5g4@#87WfZ2Gqh@L1&2mzS^1}h4yDghE{NbF}_%bAu%00-|(qOCb zSgGO{8-!n0Fn+USelL+teEbqfzt4B_p+#y@D!uYCVc>h*+r{p0lhP?=P^Z`KhU`)U zY^YzzmA|z$jlWTe#CrlSeMd4LR@xizo}eqoHN0EU^LQ_8N2M=WdZ8~yTIt#2cRYgg zQ(G;>2Ys%BmPKE(jNgybkN?9R+gjR(+-9Qkg(>B8-$sWo$9{NAF0bphbY6bMLCez) z$!S!HzzLN8rj*XZn-RwMij=y;BJMqxP83L>Y*nPvV1us=tw_M!>CxY{&9#lM!vp6> z#Qoe-mlVB8hJTfzLS&-B8E&Wy$I38EhD9=5D#JB0d`yO8|03l-B*#COA(Q2Fkl~dw zOpu`3}f67k6`^d1p3~!P1EtX-C46|goTIMraj*pPx02#*0FkFV8 z%k;ZtI8%m?$?z^2u9fK(eLt7u69VwMyA=uvhRf}>zCwzNGE}HMW0{%O@8cfQb6BIW;lm;`4t8?&<_d=|2J)}QrZxd;{d*rgT~ zI0~{03l`dvii>g)E-sp!Z7;~4S!m-l6ANv&lCzSMCMpc3WY4x)3JcGoP||B2k@Q&p zs04S-m0*oYf^pp>c(1H?zSSQ;GdtImU5KCZ$|ltqi4pVWSDSKXaK_OYx zR9Y~rD7&!K*IU;p?4tvQ|YaecAV zRGMGxEX*~{Dwt<8Ir0^*oT(|hD3{|(3IK~ur8YS(N$$g$^+xr#itT@uDOM75m1(dk zDPw}Emnq37tW|73DSgC*6w83h}c6+gXuqhoZbBjUU6V+RW`l4D%NgX@cVkK@qIz_x> zMpgaE2^P6c_}63aLaB8@?!*P94%-|q)x`Oxr%XsgK-I2FZ1y-R$tv{RKh@aE`kEto}~_ZLD4KzNpUIf`%I2Iii=H!#YMANWh4D{Qqk<9;`v1| zT8^zm>Y7}?dVBExo#U_<_O=&09XNX#oQJk<$<4K+at0@%K{;$G^H5>Lpi#PsHU|co z(&9o}5?Bdn=Y=-Aqj7p1-Pr8ltjgpQ(v+Mj*#(Y~#rBD?N}+As%$saEP3x7DZ_Al2 z7bdk7)j8H#i2mhQ4!dnm@jP3Sv(!;MN2QNk2yQn&`kX>E$&tlQpOqxdOL-gOR%D;ZB0ZEtSqx(*bpeR|1*<$tiRM z*P?uiBe{nVpDH7oqPw>dy0~QuH|aRGYz1Rk0sN>OU4T~{*&z<`SQ(+nRniqm_+85z z%AvMj3Gj*|eA)7|`BDBr{Su&W7VzX0xuo9#aO5WiiBm&hohQ#<81e<@!o{5A97 zvm^>7jq0icd>PWp0@9)g598mCwA%yH+9FNu?ovlCVpvxxjc0)@m*+_M)iMlB=SCxB zwM3_rp<{y-7ya_Z`N%1Yxe|wBFe>&4jXJV*mMXnO6{bwYLvda>3Y+1HuiB~WEUOaz z2I*MiH|nS^52@1Yh@K|407twO-fH>8U+okc!mX}^j&u3mK~3TproK28G>R)jxG^1w zhIo?B zkZy_&>hh4jYS$P~%3GqMr7|c^&5z2Zc6BJ@xpXCZsvnOkuc9lZkxi)l^{RBjlUofv z6k4?&S*23C@@Yamny>T}j6WoM3938_Pog3j#1Ctsvz(f)9&`*cuvR2 zpi^TyQr+SGfVJ2}4p z_1EpEd?|ycsW+0-%B~wQZGx@PmW|^LoR9b=;&W+rWmuU3zs-&? z|6Tf+TzY@O=*Mnq%nEJ}UvI~aXUv2&iEd6&Ok5mG2W~A2CgI9h%_PPy@zE^EMUXEZ zmZS3e6wvR_$6QM&%$X#X^@)qi$(scph?7ozk|t!tOii*7&AkCQLRKpIBsxgLBRYRN zT$^Kj@x!HZex3jvA$JAfl7OrB#}SGh^2c!*HGViNmw~xlRSqkstMkL9bGmwe9H+xE zpDJ$#r_=f4IGq7F5esVN?*k}*hd_$QWRSkJUTA~Gx{TvJi`HBphWc;|7cR`53DYy( zLRqfekrR_@;c^XrxEr|KXf-ZFqB8-<>yh$iNOW<)c~F^s%A~(HPqTs-0Ofm5}e0feLTTq~7dYERb@j#XmJ15o}Jf*ElG$>dGW z&e9)YYy;V2W~nsdZUVg)arti|Fpr#{|LudA1z<(%HQr~HzjF|#ipL-s>o`76PGgJ>)b1xb;&ib4g=b<@aIBGV$v~&&!K&7 z!?>r6QwmQF0%7nasEbyBG~d$Rf%>ZeNH`jE;sEMBuKwM2Zt{ax(x)epm1yHyn`STjlsiay*j?0Jj*B(l^WT&XJ)kazsRW zIFxG-UR2i3QCb!?qE(45D*%sIM&T1e;)pH|bfj1HSk9JZ$$H%iNbV6i-Wk6z6E;)g ztwWwo3jRtRyK;bmwX;XnMb@wXN(RA4zfFzfAk^2#l zQP#P22y5LxJY6Y+1}~Yy`-jAJ?xABna`nuF_SD|qwysT0>k^{bESJ-S{KWSfK&5;N zBs`U`v2xa6k8hU5^UnnEP|B&G>twy@MIku{An{)VNaej85ArBJ5s>7}0;KXT10?yx zlUxcQm3O8bSC^N{(iyw_)~L_c`@>5%jKf$0+Rj&nuy&eujQUVD>fR0<@hkz4^k^x( z0gxO$@}soQ_Lv@dCwWsuwca=A?tKjKADsS5=X zj-1lg%H(qmQcJw)wS?9YVL=);*FHqgTc`u>q6ov+cdD+U-@TTOcwg1VvlxfiRBo57FD zojwWm(@hFb?G7Z|{{d2(rdufMHlPg)+YY|e#-BqQ2Trfig@j~b+(+HhPx5usg)p5X zGQ`k>u_^GmIM?8~0j)zQ{ycmc;lMjEuFfOXXDh1DtZv#6rbT_4donf$-ox|5Dgn68 zSA;XefOgDqXRDfstnhTw$qYGCem%>IW$Z!t9~7N_F!1;dS79DsF6l(+>bN>j=c~fm zWoYY>&xMtQW`(4a{Yqdz8gj`-S+F0@cX{}AKyt=jQoIz9-1~A|DxZ$Eo)BKr87F?7 zb6a8V(a|`|#|Z&^$>E$>vOn1zW3c949rg>T&kX#M=K$1g|Hv#&ZflkcoDn>Xz#D<5 zHs9G4#&nXdaipsWJZ}I`(zOJ-l3OgpP5mVNmw@D2^_SXT7eI240aCus`0AA@Kav?V z(deI{aY{R?M|*n&bf$QT?jAsLO9sgK`n6)+9i3U%+-TUa6WUD&76zS2FAwzk8)%9D zTIfUY0a-7@wNiZcKuI4DAf^8skX#Zv7{xpHj$mCe$X$l^tw;MN-c+2}o zM@HGh(>1L$tkq1U>0o<1Zzpk5dMg%%c|v2dz2FVu3#t zkY)frt5TvQJ5q>-=DWs7IQ6H(za)SM(S*XU1wNPzg~#ejDWsP3Lx3FO6T1>0@PWEY zxv}Pa_-sC=%aqgxNM|?X)bi3Xe*`*Ow~YrrKyzZw%Ed#3Iwn1^$S5u@BxHR5iAC8ZctPaA{1PVLaL4x_Szs@9OkwRCFk|s|C8uDY z#FFSSf_!!RlFW_2M?mW25L^>mvr8TPxd~(Y!-783U{7coe~$60HrN%lmpI7}Hl7Ka z;3!PWE^#>Rwuz4HoY^DbGwj(pHarF=4U(L8JKm2dcmCgos$T$nDC_KhOZ`-s|3&%$ z;uCP;Jtk$s*c5Ag|2||$);>hVRelrje;R9X@oZ;Fy1igtL7{DyZE|*@(>8^5WtQBV z@Z5uw`4UT+C3&(XJyqfOLP%l`Uc{J79l2(6{N%)#nc1ZUIhnjIbmpo3V8MG%T^S#OY|rE2%WonRhM@7E9*n^pp|FnWKr1mn9}%r^r87 zxnvzI7E6j{a$G;NKpe8e5}}B%49()vuRm-C9v@4k$?oFBIksq3vSLiIwZ+>pF1WExOZ=nn}2cD5QY(6&UQK1&gR3URLj1aE5fSO3ZPN@^Q zYRor~T|+K}=NRJPf?cQLiDxE%;;A%Wve_C+k)Cm8+USjwFOgao<-LO_(0wwC^D^z( zMYC*YQIvuL@9uc^%sJU53ITDT#AZjX4P{a_!(GLy>6@O-FveoDjBy~#-vCXLNVO-u2WB$q);2i}>oK`c{#ESOo6 zjlTsqdeA*orJbCT zhiQbr-@F3c(2gV>S$0W5?>VKtaWB{#*xsm_d3bKwyRcvHe!Zo}9zcP=5l#tZKM`f@Y1L{5k3sq0?|zYR z(o$liTpv)}j?v&XN|{_>cQ~^PCl%2(En|0TClyHpK(4P3kK~;VXLQ<$HbEa!z9tEw;H4PGl3f3HXnhhblWB;?Xqi`RHU~`)n6NpkV0<_oeJ6tt zWzu9W&B4LtD$|Ve1q+3i1O($Ry@ysW4}#PAW>^)&VEp7E%#UF(y29dFn1WTSl1B8S z#Rne!OOzO@9kyA;_5~^>8q3EwONxl#8H4F1Eo7P@N3EZ~T4eGT_Xn^*x&e3EmtY;Z z5XX&x8{n;rqG@(>$37&x8gfN{?kB29n=?wZ+In2+QaVJM*#CI%MFFCBftD`%+ zui^KC55dq_=!-DH336C{&!)bEqr13U;7!XVsKdS50E7wlfKNu4?%c**gZmGJ@x2W8 zGJGY%9>D&%KO=k6J=(qSPXUkbcrbk*K!go|H^URnTEKmMaqmDhfbhuxCHQXc&e8=z^8@+0>23` zW|)MJ16(hMJ%IE_zYI4cAE17?WM_OglI@Yh_vn^?=1@v<>7f0lXQW z%6J!GH9XZ9!GBw%c2x%$Jwl=(SVkT+1V53(HGo5sB>Ygo1Mt)){{a}4Eaf!-UJp-s zrvdgzVXW|G>_h;!!6zg9CZGsUGz2dhDTO-#=E&h(z(w$+^J2hFGM?ayQJ@DO`rE=k z!Y@a-9&o*YHjMBg!0+KHuOXGONuyEsz)uBy3ZC$<0sbI|2@c0S6qUscc$*xiJFo-r zq$k}|#apE?zGKNY!c!Y~3UDv{2Jk0%Tn-a_ZY=Z$p6(&vf+xAV0K28b2EfzZ=cDj@ z5%vJK8xMORjPJ~{5%3;_>AerV9WpJFAiWtHfG|OND@1sLRdSf#snFY!eCSMXIOxsA zROm_X3h3=Y4Rjzlb`tbQnC?93K65B!5&RfF7vVp;y95Pj4Ic$>fJZaq?@$Og6Mi5( zs)xbs9AZnt;dH=A_!jp+VS(lU6QyV=#06R)l!byrEQZ0hfXnee8t`5oM8M}-F%80- zfDZxO1xWd70K)+50kwbz4O<=#7z-EyXa>{)P6ccQSON&3avC-pvDHEFB(E|E{wfIM zKQN`@LZ_63-$j}HoP0ZorD*DZMv-1RaDJ~!Habia(F|5PJXxN4x4e^Azh|>fi zyP6dmmaob$+@hhUC_Yz>_>!~ih9?Q>V@E}`zLZZnsX{VlXCl%t9W|6`_6>OetxAOJ zOYsAcJIHIQiZ|rqr{o>NAPIs|9|KyF@qaRui3}9)?rY{Wfe4%42TV3$~ zk7g_ksoFI4nzl!yXT5ks)SfTC`?5>UxAu>{FPCarcF0BjKk&eS=?mL_^U~qMHO~$F zu;}H>cFtY=-M6p4`fB!d_g|i~A^Y_i%Qg=Ca>nczZ@B!6VT%?o?sCNyS3IWTXxA*6ziN{a=^yux+A1-XW?%S0MpZI#-qQB1V z=z8n%Gc{MZZe+SkF2?^?H@YorUJR|CIPcYuuF`v#{ql161F7DJ?)WPH^>+_$J+^Do zoT!(kUUO&H=;2SFTDh48r3jX%kU;2Kz38kt1@$^4- zEG|2G!_XX92&4OPRzW&n6L0xwj zUU%7F_k8i{yS2*(JrK`|G$t!Mum8uNN{rY#^5n^r-~7@!{^+;gAKkYD?(dJ!oit4| z^s`}+_m<4ad}HbBKXiC{&4t#>(43c#Okddgwd&74`|R(JmpG3{*4;k0%dK;}=MZ4|jRL_Q$_JzOC2hkRWYu)03yK@Z9v`!UNwg{rU8@=r!H<-Lg-7 z@#vvz7bkx9#Ix}(ykPXt2SSHG_l14I^V9n5yY8W0 z=iRSfz3;JO`%77$H;orORAI3DIcj#tHwN?^)ETojzV@6lHu>ohSvS*M&%bw(1&C1? zpKvreD^41oc}%O-GM!Gx+O%oI3c z2?=c2F#L#+*~|n%U{^YayHEwIG`Ef)AM zvjDD#{>wD_UDRn4C{?xG4osqWll1M#`R8hk-jB57B|fQV(Q7ZE(;R;%E&0R9`RIAf zpUfBIOM0B;pRa2!J=fJ<^Q6CU{xEV|AD6R=%v0Ke z#IGhAr$37UM>LoIJPUueFyFAHB%Pyc_?3$CoMX^9i~l+3o5epYjQP=ru`s-{3hMBE zrl2;B06JI#9gGEYe-wN$-Tw!1^hSo3LFa@u`nm|BlVJqG8piMq#5#={hI+l*DBc)k z*pG2~e+cyXIsNho4^aldI*RLYr*#fUD?SaCBM{anp6N>XbHQ@2x18wC1<%v2v`;m` zo8f)?RCRw+?Ne!T>eQ(di;j+FCXTR1uDOQA;der=z4lr*eE4uSYSbu} znwrYSj~~w_PoB*8rFg2zva+)Hp0or%UNwLId{$Og2B|Hs#R4rB_;0oVAE5s;3Whg` z3A&CsS9(Zbe!ulKtu>`1#NqhQeaLrDq>ll?gE59m@o(ibX2USV* zhTtMPx>6(u)5w;P;>u@GEsRFr(qB~va+WBgQOOJ#G`}kS?EF$_y@~woqO^V{4QbWocp|qFAw{6zoIrQg}H_7`soeA$#yGgzV=OEwjll;-6*iX`) z68_h|BMG}vc}McmoXbW1gmKe8~? zGw(v~=g-dD=cSK5A@kx(pRbvA@Qt!FKkfan?+foAtQzmQHa@fC-)eu}yZFpopUsai zotFQ9pWR&gZTQz!?mr#e)b*S1@2}Baq(>?D+*n+*s%_7Qmd*dysbw#%`*&KedA*)~ zaovHf`%aeboL@HhG$X!RaFv5c+DJoVcB_nq2QGrZor z@Yt;5zjU~N>Ygpyn!4RbzaGWP9@_E#WmEssUG6fbyI*i@O>qY{-tS;GtX0;sTn*K`RB>{qLQ_g|NQHo>gm6={u7~FFyHvLOKL`cr1~G&NExZz z-bOrj!A-h9Qu#k=q>PP~o$!I>CmRwU#sAn$o|&LOA7=s)$#0HVbRu{)e4rzIbNCT$ zVEGe&1rN2%%s{0YiJLA^PQw{{gMd$d1<&S|-v$}un(&u5sMBPKF2|bUQ-XB0T?50v zSNTm%mg?dqQuzYQtd6&o|7=@-at@oR?WcsB+x|^wi~UV7E%o2h{*^Ww4E|pI|DR~> z)MtKce+V*ym0Q96UgcNh|K6~r{AUllpPZx31go>=j{m`U{2sWARsW}8GqRiFaU0lV zzxzGP8cgOFDxDSGfBJ*y9;`eqxIad_YpJLIKkMlmj4i=Djh`3NCVpvzFUdN6fxIt7 zufV)eC8%2mY#?oO;#AJY+%rgM4zJ&mwlN*oU7(IFP%TKufw)!W1&eye+zoq_L+W+~rfyVmOAG!ap zK%q!~wSO7$U~M81_+Y*<`d~bQ;l6K#FUi``h%UtES@?B9d=79I;z%y>|8Muf&VMeX z+)Cb-^8feOJ+;l2`d3=)#f9_@4pR`{2e`(@geQa02jkHg?!hK_4{d~Z6W>Ebj*IVT z4c%Dz*Il5vJDT8axF^^-u5N=v+$e=OBI| zZYDCT`BAtIp5&FntM!S2#1Uo`Dfdn>Y~N||Ct8Z(*9c7U*OpH z|5N|FAKmPYApY_HO!s5IxBUN5F0a?SNII;TE~`oy#Y`o z#h3e_hv*`fYtDjQz1}*)p9@l{dH$fV`8GMjH27gH{6)_uVZD^z_1uta(ADc97~wr9 z^fK=+8nW;?U>(vK+2&Vz644AtzY{?R=2`H{??f!`fk=yMu|SIjevJk2OHypvIsCcq zVtbt@v__5`>4MzhXavBvXk~_Nl_B(oE|;(8(wC{u}(UTUw_|C@j`qN8`l^bRA?zYbhej?SV3^HBUGyjs2z z?yh1+`YZTANaawh!;XCL)MG*BvSSIA5@Q`M|6BE8#%>6+A)32bP86!Sq+t z-22knK&0h%z>aXAfp}H&-4yHfhDIdY#LVq=XB^;=~f+whWMJILI|GNI~qx|<@ zM893OXP_<5*ZzU+DVY5OY5o)OK>Zt&8Q7MB>91~If%JiCB|wpa2h;p+o<3__ev;gxiS-!|aX`aFra7QQ)->MXGS z|5I`G`m;GYt7#Se6`Lrw42%cbPN6#&zNz%zLjR_0-yEGAq?5@CvgYXCi?qa(!U>K-B^|9u-*&tT*R^UC&VQ>Moq(8}2`(LZS zn#X@q|38}j=}&3Udw%j$;7NZPuTRRJ_RGz2bY7_BCHONueWyc_L6FWGFP8fU7%B3U z{d|AmB4tnCVQG$|IY`M%e{SSMcv@R3G6?<&{$jZ!U_>@o`Wl6MUM%L|)55=LW0HN; zV+DmTw*7x={(t25lMH*03-I!v`2qIA-EYnR!ZmE+&|-oALJLSwiZD2G7X*6rHT>^T z2f$E@dl(C4`WhAt;_p!}Cww3z8*qAmNa*u&dKS8z2m@dZ#c{IID5N|{r$L%N8ijR< z^<61F5H3%w*AQNTE4Y786Sy{vmNWbs`M;*;-UE5+^8JzJ&qZ0NZkprijPPQW zU(M&&hR?_TPe5mCA8!Zf{%d8b^DU8iKm8lT95NawP$yVGH1e&5%(ryJE`OS^c1MPDcOFoUKid=;`^=(BbHB{0GUM%_J)J)~@ z?=3$=E+3WgYk0*5T@hA1{bsy^4+dAOXbS^q4g-Kp-Ha-)!_&=UML>xMx7znA=n zpvW`uhv6&XX*{FyHRY&{5gqw&;9r0z9#;6~x}(UT*s{2}nL+$S6|~Le@0)Ect-V4Ei)EOiLnV@Ij1m(A@bY0Yr%e*?CIW6aXAPm_^t|4hIatw z!ncEW!Fy$Y51`_z5K!>+J2!M!H4C2d68?GkadMc};WS_LgIAmd0m9L}5z)iI{GEfs zQ=NYu(&8KO$~qx1{|?a4gID;S3z9zSGM$UQIq5^dTWv?my9b`|Tj2wFB>|__1yOEW zHQlR(gnJTR!4ogaOYRZ)f5TIn9-j7<3LU{WWc(%>F9NFT7g1mRsq-}!Ci@3EY7^*A z>@E1Ca+u=euZAaHWEYAz=BSN$;O`G0p!tu={uF#-K$<%GJt8lw5dqwC5GZ_h8wlw_=P~F8RPrIurhOxduiFg^ytDGteG|b;(m+8eLlPOd1&W4lTvw z;^IM;fuNR|&6H+hu_G7@m${hOh8}bfEO9{$ z`E@cE6U#?FN&3*lvN?sOc{Y1#L2=Qrp8fj7^)%Uva*A^cie?S#IVodg?}VPFQb%@C zZgydDk!@Jd1-856vzuwauAXxWEJkMWw@fI_*V+OLOvVbFxc&&nd{U7nc_2 zIeO<5&l#LuI;YRPemzZdvWp7xY^9FLYH46)G7WXuou!V{qP$|6+m+|w7Jntrhn%Ih z9H+g&u|SRkW4Fz9LW(Un-Ci)SpwKqUR_aSsC#RGls{_Th+UD5`O@;J1tY>yo=_5w0`q?&-z{KtJfb|U$?$~J^Ops zhWrgB8`f^PcSGd{-A2R4=#8e0u^ZzyCTtWorf;0OF>7P~#*&R?8<%ffy>acvdpA~Y z+^})e#?2c&8+UE2-gszZ%|>x!-NyQjo1dwE=Fl_s&p>#Iy!ffqRT?T0hc^M3E3+zB fS8lEpD-91PJe>9L>W4iK*FPLfb4-i7NEY~iij|%i literal 0 HcmV?d00001 diff --git a/node_modules/nodemon/doc/cli/authors.txt b/node_modules/nodemon/doc/cli/authors.txt new file mode 100644 index 0000000..6c77a12 --- /dev/null +++ b/node_modules/nodemon/doc/cli/authors.txt @@ -0,0 +1,8 @@ + + Remy Sharp - author and maintainer + https://github.com/remy + https://twitter.com/rem + + Contributors: https://github.com/remy/nodemon/graphs/contributors ❤︎ + + Please help make nodemon better: https://github.com/remy/nodemon/ diff --git a/node_modules/nodemon/doc/cli/config.txt b/node_modules/nodemon/doc/cli/config.txt new file mode 100644 index 0000000..5de9bba --- /dev/null +++ b/node_modules/nodemon/doc/cli/config.txt @@ -0,0 +1,44 @@ + + Typically the options to control nodemon are passed in via the CLI and are + listed under: nodemon --help options + + nodemon can also be configured via a local and global config file: + + * $HOME/nodemon.json + * $PWD/nodemon.json OR --config + * nodemonConfig in package.json + + All config options in the .json file map 1-to-1 with the CLI options, so a + config could read as: + + { + "ext": "*.pde", + "verbose": true, + "exec": "processing --sketch=game --run" + } + + There are a limited number of variables available in the config (since you + could use backticks on the CLI to use a variable, backticks won't work in + the .json config). + + * {{pwd}} - the current directory + * {{filename}} - the filename you pass to nodemon + + For example: + + { + "ext": "*.pde", + "verbose": true, + "exec": "processing --sketch={{pwd}} --run" + } + + The global config file is useful for setting up default executables + instead of repeating the same option in each of your local configs: + + { + "verbose": true, + "execMap": { + "rb": "ruby", + "pde": "processing --sketch={{pwd}} --run" + } + } diff --git a/node_modules/nodemon/doc/cli/help.txt b/node_modules/nodemon/doc/cli/help.txt new file mode 100644 index 0000000..7ba4ff2 --- /dev/null +++ b/node_modules/nodemon/doc/cli/help.txt @@ -0,0 +1,29 @@ + Usage: nodemon [options] [script.js] [args] + + Options: + + --config file ............ alternate nodemon.json config file to use + -e, --ext ................ extensions to look for, ie. js,pug,hbs. + -x, --exec app ........... execute script with "app", ie. -x "python -v". + -w, --watch path ......... watch directory "path" or files. use once for + each directory or file to watch. + -i, --ignore ............. ignore specific files or directories. + -V, --verbose ............ show detail on what is causing restarts. + -- ........... to tell nodemon stop slurping arguments. + + Note: if the script is omitted, nodemon will try to read "main" from + package.json and without a nodemon.json, nodemon will monitor .js, .mjs, .coffee, + .litcoffee, and .json by default. + + For advanced nodemon configuration use nodemon.json: nodemon --help config + See also the sample: https://github.com/remy/nodemon/wiki/Sample-nodemon.json + + Examples: + + $ nodemon server.js + $ nodemon -w ../foo server.js apparg1 apparg2 + $ nodemon --exec python app.py + $ nodemon --exec "make build" -e "styl hbs" + $ nodemon app.js -- --config # pass config to app.js + + \x1B[1mAll options are documented under: \x1B[4mnodemon --help options\x1B[0m diff --git a/node_modules/nodemon/doc/cli/logo.txt b/node_modules/nodemon/doc/cli/logo.txt new file mode 100644 index 0000000..150f97f --- /dev/null +++ b/node_modules/nodemon/doc/cli/logo.txt @@ -0,0 +1,20 @@ + ; ; + kO. x0 + KMX, .:x0kc. 'KMN + 0MMM0: 'oKMMMMMMMXd, ;OMMMX + oMMMMMWKOONMMMMMMMMMMMMMWOOKWMMMMMx + OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK. + .oWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd. + KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN + KMMMMMMMMMMMMMMW0k0WMMMMMMMMMMMMMMW + KMMMMMMMMMMMNk:. :xNMMMMMMMMMMMW + KMMMMMMMMMMK OMMMMMMMMMMW + KMMMMMMMMMMO xMMMMMMMMMMN + KMMMMMMMMMMO xMMMMMMMMMMN + KMMMMMMMMMMO xMMMMMMMMMMN + KMMMMMMMMMMO xMMMMMMMMMMN + KMMMMMMMMMMO xMMMMMMMMMMN + KMMMMMMMMMNc ;NMMMMMMMMMN + KMMMMMW0o' .lOWMMMMMN + KMMKd; ,oKMMN + kX: ,K0 \ No newline at end of file diff --git a/node_modules/nodemon/doc/cli/options.txt b/node_modules/nodemon/doc/cli/options.txt new file mode 100644 index 0000000..598ae63 --- /dev/null +++ b/node_modules/nodemon/doc/cli/options.txt @@ -0,0 +1,36 @@ + +Configuration + --config .......... alternate nodemon.json config file to use + --exitcrash .............. exit on crash, allows nodemon to work with other watchers + -i, --ignore ............. ignore specific files or directories + --no-colors .............. disable color output + --signal ........ use specified kill signal instead of default (ex. SIGTERM) + -w, --watch path ......... watch directory "dir" or files. use once for each + directory or file to watch + --no-update-notifier ..... opt-out of update version check + +Execution + -C, --on-change-only ..... execute script on change only, not startup + --cwd .............. change into before running the script + -e, --ext ................ extensions to look for, ie. "js,pug,hbs" + -I, --no-stdin ........... nodemon passes stdin directly to child process + --spawn .................. force nodemon to use spawn (over fork) [node only] + -x, --exec app ........... execute script with "app", ie. -x "python -v" + -- ........... to tell nodemon stop slurping arguments + +Watching + -d, --delay n ............ debounce restart for "n" seconds + -L, --legacy-watch ....... use polling to watch for changes (typically needed + when watching over a network/Docker) + -P, --polling-interval ... combined with -L, milliseconds to poll for (default 100) + +Information + --dump ................... print full debug configuration + -h, --help ............... default help + --help ........... help on a specific feature. Try "--help topics" + -q, --quiet .............. minimise nodemon messages to start/stop only + -v, --version ............ current nodemon version + -V, --verbose ............ show detail on what is causing restarts + + +> Note that any unrecognised arguments are passed to the executing command. diff --git a/node_modules/nodemon/doc/cli/topics.txt b/node_modules/nodemon/doc/cli/topics.txt new file mode 100644 index 0000000..9fe3e2b --- /dev/null +++ b/node_modules/nodemon/doc/cli/topics.txt @@ -0,0 +1,8 @@ + + options .................. show all available nodemon options + config ................... default config options using nodemon.json + authors .................. contributors to this project + logo ..................... <3 + whoami ................... I, AM, NODEMON \o/ + + Please support https://github.com/remy/nodemon/ diff --git a/node_modules/nodemon/doc/cli/usage.txt b/node_modules/nodemon/doc/cli/usage.txt new file mode 100644 index 0000000..bca98b5 --- /dev/null +++ b/node_modules/nodemon/doc/cli/usage.txt @@ -0,0 +1,3 @@ + Usage: nodemon [nodemon options] [script.js] [args] + + See "nodemon --help" for more. diff --git a/node_modules/nodemon/doc/cli/whoami.txt b/node_modules/nodemon/doc/cli/whoami.txt new file mode 100644 index 0000000..efc3382 --- /dev/null +++ b/node_modules/nodemon/doc/cli/whoami.txt @@ -0,0 +1,9 @@ +__/\\\\\_____/\\\_______/\\\\\_______/\\\\\\\\\\\\_____/\\\\\\\\\\\\\\\__/\\\\____________/\\\\_______/\\\\\_______/\\\\\_____/\\\_ + _\/\\\\\\___\/\\\_____/\\\///\\\____\/\\\////////\\\__\/\\\///////////__\/\\\\\\________/\\\\\\_____/\\\///\\\____\/\\\\\\___\/\\\_ + _\/\\\/\\\__\/\\\___/\\\/__\///\\\__\/\\\______\//\\\_\/\\\_____________\/\\\//\\\____/\\\//\\\___/\\\/__\///\\\__\/\\\/\\\__\/\\\_ + _\/\\\//\\\_\/\\\__/\\\______\//\\\_\/\\\_______\/\\\_\/\\\\\\\\\\\_____\/\\\\///\\\/\\\/_\/\\\__/\\\______\//\\\_\/\\\//\\\_\/\\\_ + _\/\\\\//\\\\/\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/\\\///////______\/\\\__\///\\\/___\/\\\_\/\\\_______\/\\\_\/\\\\//\\\\/\\\_ + _\/\\\_\//\\\/\\\_\//\\\______/\\\__\/\\\_______\/\\\_\/\\\_____________\/\\\____\///_____\/\\\_\//\\\______/\\\__\/\\\_\//\\\/\\\_ + _\/\\\__\//\\\\\\__\///\\\__/\\\____\/\\\_______/\\\__\/\\\_____________\/\\\_____________\/\\\__\///\\\__/\\\____\/\\\__\//\\\\\\_ + _\/\\\___\//\\\\\____\///\\\\\/_____\/\\\\\\\\\\\\/___\/\\\\\\\\\\\\\\\_\/\\\_____________\/\\\____\///\\\\\/_____\/\\\___\//\\\\\_ + _\///_____\/////_______\/////_______\////////////_____\///////////////__\///______________\///_______\/////_______\///_____\/////__ \ No newline at end of file diff --git a/node_modules/nodemon/lib/cli/index.js b/node_modules/nodemon/lib/cli/index.js new file mode 100644 index 0000000..bf9e809 --- /dev/null +++ b/node_modules/nodemon/lib/cli/index.js @@ -0,0 +1,49 @@ +var parse = require('./parse'); + +/** + * Converts a string to command line args, in particular + * groups together quoted values. + * This is a utility function to allow calling nodemon as a required + * library, but with the CLI args passed in (instead of an object). + * + * @param {String} string + * @return {Array} + */ +function stringToArgs(string) { + var args = []; + + var parts = string.split(' '); + var length = parts.length; + var i = 0; + var open = false; + var grouped = ''; + var lead = ''; + + for (; i < length; i++) { + lead = parts[i].substring(0, 1); + if (lead === '"' || lead === '\'') { + open = lead; + grouped = parts[i].substring(1); + } else if (open && parts[i].slice(-1) === open) { + open = false; + grouped += ' ' + parts[i].slice(0, -1); + args.push(grouped); + } else if (open) { + grouped += ' ' + parts[i]; + } else { + args.push(parts[i]); + } + } + + return args; +} + +module.exports = { + parse: function (argv) { + if (typeof argv === 'string') { + argv = stringToArgs(argv); + } + + return parse(argv); + }, +}; \ No newline at end of file diff --git a/node_modules/nodemon/lib/cli/parse.js b/node_modules/nodemon/lib/cli/parse.js new file mode 100644 index 0000000..ad74003 --- /dev/null +++ b/node_modules/nodemon/lib/cli/parse.js @@ -0,0 +1,230 @@ +/* + +nodemon is a utility for node, and replaces the use of the executable +node. So the user calls `nodemon foo.js` instead. + +nodemon can be run in a number of ways: + +`nodemon` - tries to use package.json#main property to run +`nodemon` - if no package, looks for index.js +`nodemon app.js` - runs app.js +`nodemon --arg app.js --apparg` - eats arg1, and runs app.js with apparg +`nodemon --apparg` - as above, but passes apparg to package.json#main (or + index.js) +`nodemon --debug app.js + +*/ + +var fs = require('fs'); +var path = require('path'); +var existsSync = fs.existsSync || path.existsSync; + +module.exports = parse; + +/** + * Parses the command line arguments `process.argv` and returns the + * nodemon options, the user script and the executable script. + * + * @param {Array} full process arguments, including `node` leading arg + * @return {Object} { options, script, args } + */ +function parse(argv) { + if (typeof argv === 'string') { + argv = argv.split(' '); + } + + var eat = function (i, args) { + if (i <= args.length) { + return args.splice(i + 1, 1).pop(); + } + }; + + var args = argv.slice(2); + var script = null; + var nodemonOptions = { scriptPosition: null }; + + var nodemonOpt = nodemonOption.bind(null, nodemonOptions); + var lookForArgs = true; + + // move forward through the arguments + for (var i = 0; i < args.length; i++) { + // if the argument looks like a file, then stop eating + if (!script) { + if (args[i] === '.' || existsSync(args[i])) { + script = args.splice(i, 1).pop(); + + // we capture the position of the script because we'll reinsert it in + // the right place in run.js:command (though I'm not sure we should even + // take it out of the array in the first place, but this solves passing + // arguments to the exec process for now). + nodemonOptions.scriptPosition = i; + i--; + continue; + } + } + + if (lookForArgs) { + // respect the standard way of saying: hereafter belongs to my script + if (args[i] === '--') { + args.splice(i, 1); + nodemonOptions.scriptPosition = i; + // cycle back one argument, as we just ate this one up + i--; + + // ignore all further nodemon arguments + lookForArgs = false; + + // move to the next iteration + continue; + } + + if (nodemonOpt(args[i], eat.bind(null, i, args)) !== false) { + args.splice(i, 1); + // cycle back one argument, as we just ate this one up + i--; + } + } + } + + nodemonOptions.script = script; + nodemonOptions.args = args; + + return nodemonOptions; +} + + +/** + * Given an argument (ie. from process.argv), sets nodemon + * options and can eat up the argument value + * + * @param {Object} options object that will be updated + * @param {Sting} current argument from argv + * @param {Function} the callback to eat up the next argument in argv + * @return {Boolean} false if argument was not a nodemon arg + */ +function nodemonOption(options, arg, eatNext) { + // line separation on purpose to help legibility + if (arg === '--help' || arg === '-h' || arg === '-?') { + var help = eatNext(); + options.help = help ? help : true; + } else + + if (arg === '--version' || arg === '-v') { + options.version = true; + } else + + if (arg === '--no-update-notifier') { + options.noUpdateNotifier = true; + } else + + if (arg === '--spawn') { + options.spawn = true; + } else + + if (arg === '--dump') { + options.dump = true; + } else + + if (arg === '--verbose' || arg === '-V') { + options.verbose = true; + } else + + if (arg === '--legacy-watch' || arg === '-L') { + options.legacyWatch = true; + } else + + if (arg === '--polling-interval' || arg === '-P') { + options.pollingInterval = parseInt(eatNext(), 10); + } else + + // Depricated as this is "on" by default + if (arg === '--js') { + options.js = true; + } else + + if (arg === '--quiet' || arg === '-q') { + options.quiet = true; + } else + + if (arg === '--config') { + options.configFile = eatNext(); + } else + + if (arg === '--watch' || arg === '-w') { + if (!options.watch) { options.watch = []; } + options.watch.push(eatNext()); + } else + + if (arg === '--ignore' || arg === '-i') { + if (!options.ignore) { options.ignore = []; } + options.ignore.push(eatNext()); + } else + + if (arg === '--exitcrash') { + options.exitcrash = true; + } else + + if (arg === '--delay' || arg === '-d') { + options.delay = parseDelay(eatNext()); + } else + + if (arg === '--exec' || arg === '-x') { + options.exec = eatNext(); + } else + + if (arg === '--no-stdin' || arg === '-I') { + options.stdin = false; + } else + + if (arg === '--on-change-only' || arg === '-C') { + options.runOnChangeOnly = true; + } else + + if (arg === '--ext' || arg === '-e') { + options.ext = eatNext(); + } else + + if (arg === '--no-colours' || arg === '--no-colors') { + options.colours = false; + } else + + if (arg === '--signal' || arg === '-s') { + options.signal = eatNext(); + } else + + if (arg === '--cwd') { + options.cwd = eatNext(); + + // go ahead and change directory. This is primarily for nodemon tools like + // grunt-nodemon - we're doing this early because it will affect where the + // user script is searched for. + process.chdir(path.resolve(options.cwd)); + } else { + + // this means we didn't match + return false; + } +} + +/** + * Given an argument (ie. from nodemonOption()), will parse and return the + * equivalent millisecond value or 0 if the argument cannot be parsed + * + * @param {String} argument value given to the --delay option + * @return {Number} millisecond equivalent of the argument + */ +function parseDelay(value) { + var millisPerSecond = 1000; + var millis = 0; + + if (value.match(/^\d*ms$/)) { + // Explicitly parse for milliseconds when using ms time specifier + millis = parseInt(value, 10); + } else { + // Otherwise, parse for seconds, with or without time specifier then convert + millis = parseFloat(value) * millisPerSecond; + } + + return isNaN(millis) ? 0 : millis; +} + diff --git a/node_modules/nodemon/lib/config/command.js b/node_modules/nodemon/lib/config/command.js new file mode 100644 index 0000000..9839b5c --- /dev/null +++ b/node_modules/nodemon/lib/config/command.js @@ -0,0 +1,43 @@ +module.exports = command; + +/** + * command constructs the executable command to run in a shell including the + * user script, the command arguments. + * + * @param {Object} settings Object as: + * { execOptions: { + * exec: String, + * [script: String], + * [scriptPosition: Number], + * [execArgs: Array] + * } + * } + * @return {Object} an object with the node executable and the + * arguments to the command + */ +function command(settings) { + var options = settings.execOptions; + var executable = options.exec; + var args = []; + + // after "executable" go the exec args (like --debug, etc) + if (options.execArgs) { + [].push.apply(args, options.execArgs); + } + + // then goes the user's script arguments + if (options.args) { + [].push.apply(args, options.args); + } + + // after the "executable" goes the user's script + if (options.script) { + args.splice((options.scriptPosition || 0) + + options.execArgs.length, 0, options.script); + } + + return { + executable: executable, + args: args, + }; +} diff --git a/node_modules/nodemon/lib/config/defaults.js b/node_modules/nodemon/lib/config/defaults.js new file mode 100644 index 0000000..dc95d34 --- /dev/null +++ b/node_modules/nodemon/lib/config/defaults.js @@ -0,0 +1,34 @@ +var ignoreRoot = require('ignore-by-default').directories(); + +// default options for config.options +const defaults = { + restartable: 'rs', + colours: true, + execMap: { + py: 'python', + rb: 'ruby', + ts: 'ts-node', + // more can be added here such as ls: lsc - but please ensure it's cross + // compatible with linux, mac and windows, or make the default.js + // dynamically append the `.cmd` for node based utilities + }, + ignoreRoot: ignoreRoot.map((_) => `**/${_}/**`), + watch: ['*.*'], + stdin: true, + runOnChangeOnly: false, + verbose: false, + signal: 'SIGUSR2', + // 'stdout' refers to the default behaviour of a required nodemon's child, + // but also includes stderr. If this is false, data is still dispatched via + // nodemon.on('stdout/stderr') + stdout: true, + watchOptions: {}, +}; + +const nodeOptions = process.env.NODE_OPTIONS || ''; // ? + +if (/--(loader|import)\b/.test(nodeOptions)) { + delete defaults.execMap.ts; +} + +module.exports = defaults; diff --git a/node_modules/nodemon/lib/config/exec.js b/node_modules/nodemon/lib/config/exec.js new file mode 100644 index 0000000..6d17eab --- /dev/null +++ b/node_modules/nodemon/lib/config/exec.js @@ -0,0 +1,234 @@ +const path = require('path'); +const fs = require('fs'); +const existsSync = fs.existsSync; +const utils = require('../utils'); + +module.exports = exec; +module.exports.expandScript = expandScript; + +/** + * Reads the cwd/package.json file and looks to see if it can load a script + * and possibly an exec first from package.main, then package.start. + * + * @return {Object} exec & script if found + */ +function execFromPackage() { + // doing a try/catch because we can't use the path.exist callback pattern + // or we could, but the code would get messy, so this will do exactly + // what we're after - if the file doesn't exist, it'll throw. + try { + // note: this isn't nodemon's package, it's the user's cwd package + var pkg = require(path.join(process.cwd(), 'package.json')); + if (pkg.main !== undefined) { + // no app found to run - so give them a tip and get the feck out + return { exec: null, script: pkg.main }; + } + + if (pkg.scripts && pkg.scripts.start) { + return { exec: pkg.scripts.start }; + } + } catch (e) {} + + return null; +} + +function replace(map, str) { + var re = new RegExp('{{(' + Object.keys(map).join('|') + ')}}', 'g'); + return str.replace(re, function (all, m) { + return map[m] || all || ''; + }); +} + +function expandScript(script, ext) { + if (!ext) { + ext = '.js'; + } + if (script.indexOf(ext) !== -1) { + return script; + } + + if (existsSync(path.resolve(script))) { + return script; + } + + if (existsSync(path.resolve(script + ext))) { + return script + ext; + } + + return script; +} + +/** + * Discovers all the options required to run the script + * and if a custom exec has been passed in, then it will + * also try to work out what extensions to monitor and + * whether there's a special way of running that script. + * + * @param {Object} nodemonOptions + * @param {Object} execMap + * @return {Object} new and updated version of nodemonOptions + */ +function exec(nodemonOptions, execMap) { + if (!execMap) { + execMap = {}; + } + + var options = utils.clone(nodemonOptions || {}); + var script; + + // if there's no script passed, try to get it from the first argument + if (!options.script && (options.args || []).length) { + script = expandScript( + options.args[0], + options.ext && '.' + (options.ext || 'js').split(',')[0] + ); + + // if the script was found, shift it off our args + if (script !== options.args[0]) { + options.script = script; + options.args.shift(); + } + } + + // if there's no exec found yet, then try to read it from the local + // package.json this logic used to sit in the cli/parse, but actually the cli + // should be parsed first, then the user options (via nodemon.json) then + // finally default down to pot shots at the directory via package.json + if (!options.exec && !options.script) { + var found = execFromPackage(); + if (found !== null) { + if (found.exec) { + options.exec = found.exec; + } + if (!options.script) { + options.script = found.script; + } + if (Array.isArray(options.args) && options.scriptPosition === null) { + options.scriptPosition = options.args.length; + } + } + } + + // var options = utils.clone(nodemonOptions || {}); + script = path.basename(options.script || ''); + + var scriptExt = path.extname(script).slice(1); + + var extension = options.ext; + if (extension === undefined) { + var isJS = scriptExt === 'js' || scriptExt === 'mjs' || scriptExt === 'cjs'; + extension = isJS || !scriptExt ? 'js,mjs,cjs' : scriptExt; + extension += ',json'; // Always watch JSON files + } + + var execDefined = !!options.exec; + + // allows the user to simplify cli usage: + // https://github.com/remy/nodemon/issues/195 + // but always give preference to the user defined argument + if (!options.exec && execMap[scriptExt] !== undefined) { + options.exec = execMap[scriptExt]; + execDefined = true; + } + + options.execArgs = nodemonOptions.execArgs || []; + + if (Array.isArray(options.exec)) { + options.execArgs = options.exec; + options.exec = options.execArgs.shift(); + } + + if (options.exec === undefined) { + options.exec = 'node'; + } else { + // allow variable substitution for {{filename}} and {{pwd}} + var substitution = replace.bind(null, { + filename: options.script, + pwd: process.cwd(), + }); + + var newExec = substitution(options.exec); + if ( + newExec !== options.exec && + options.exec.indexOf('{{filename}}') !== -1 + ) { + options.script = null; + } + options.exec = newExec; + + var newExecArgs = options.execArgs.map(substitution); + if (newExecArgs.join('') !== options.execArgs.join('')) { + options.execArgs = newExecArgs; + delete options.script; + } + } + + if (options.exec === 'node' && options.nodeArgs && options.nodeArgs.length) { + options.execArgs = options.execArgs.concat(options.nodeArgs); + } + + // note: indexOf('coffee') handles both .coffee and .litcoffee + if ( + !execDefined && + options.exec === 'node' && + scriptExt.indexOf('coffee') !== -1 + ) { + options.exec = 'coffee'; + + // we need to get execArgs set before the script + // for example, in `nodemon --debug my-script.coffee --my-flag`, debug is an + // execArg, while my-flag is a script arg + var leadingArgs = (options.args || []).splice(0, options.scriptPosition); + options.execArgs = options.execArgs.concat(leadingArgs); + options.scriptPosition = 0; + + if (options.execArgs.length > 0) { + // because this is the coffee executable, we need to combine the exec args + // into a single argument after the nodejs flag + options.execArgs = ['--nodejs', options.execArgs.join(' ')]; + } + } + + if (options.exec === 'coffee') { + // don't override user specified extension tracking + if (options.ext === undefined) { + if (extension) { + extension += ','; + } + extension += 'coffee,litcoffee'; + } + + // because windows can't find 'coffee', it needs the real file 'coffee.cmd' + if (utils.isWindows) { + options.exec += '.cmd'; + } + } + + // allow users to make a mistake on the extension to monitor + // converts .js, pug => js,pug + // BIG NOTE: user can't do this: nodemon -e *.js + // because the terminal will automatically expand the glob against + // the file system :( + extension = (extension.match(/[^,*\s]+/g) || []) + .map((ext) => ext.replace(/^\./, '')) + .join(','); + + options.ext = extension; + + if (options.script) { + options.script = expandScript( + options.script, + extension && '.' + extension.split(',')[0] + ); + } + + options.env = {}; + // make sure it's an object (and since we don't have ) + if ({}.toString.apply(nodemonOptions.env) === '[object Object]') { + options.env = utils.clone(nodemonOptions.env); + } else if (nodemonOptions.env !== undefined) { + throw new Error('nodemon env values must be an object: { PORT: 8000 }'); + } + + return options; +} diff --git a/node_modules/nodemon/lib/config/index.js b/node_modules/nodemon/lib/config/index.js new file mode 100644 index 0000000..c78c435 --- /dev/null +++ b/node_modules/nodemon/lib/config/index.js @@ -0,0 +1,93 @@ +/** + * Manages the internal config of nodemon, checking for the state of support + * with fs.watch, how nodemon can watch files (using find or fs methods). + * + * This is *not* the user's config. + */ +var debug = require('debug')('nodemon'); +var load = require('./load'); +var rules = require('../rules'); +var utils = require('../utils'); +var pinVersion = require('../version').pin; +var command = require('./command'); +var rulesToMonitor = require('../monitor/match').rulesToMonitor; +var bus = utils.bus; + +function reset() { + rules.reset(); + + config.dirs = []; + config.options = { ignore: [], watch: [], monitor: [] }; + config.lastStarted = 0; + config.loaded = []; +} + +var config = { + run: false, + system: { + cwd: process.cwd(), + }, + required: false, + dirs: [], + timeout: 1000, + options: {}, +}; + +/** + * Take user defined settings, then detect the local machine capability, then + * look for local and global nodemon.json files and merge together the final + * settings with the config for nodemon. + * + * @param {Object} settings user defined settings for nodemon (typically on + * the cli) + * @param {Function} ready callback fired once the config is loaded + */ +config.load = function (settings, ready) { + reset(); + var config = this; + load(settings, config.options, config, function (options) { + config.options = options; + + if (options.watch.length === 0) { + // this is to catch when the watch is left blank + options.watch.push('*.*'); + } + + if (options['watch_interval']) { // jshint ignore:line + options.watchInterval = options['watch_interval']; // jshint ignore:line + } + + config.watchInterval = options.watchInterval || null; + if (options.signal) { + config.signal = options.signal; + } + + var cmd = command(config.options); + config.command = { + raw: cmd, + string: utils.stringify(cmd.executable, cmd.args), + }; + + // now run automatic checks on system adding to the config object + options.monitor = rulesToMonitor(options.watch, options.ignore, config); + + var cwd = process.cwd(); + debug('config: dirs', config.dirs); + if (config.dirs.length === 0) { + config.dirs.unshift(cwd); + } + + bus.emit('config:update', config); + pinVersion().then(function () { + ready(config); + }).catch(e => { + // this doesn't help testing, but does give exposure on syntax errors + console.error(e.stack); + setTimeout(() => { throw e; }, 0); + }); + }); +}; + +config.reset = reset; + +module.exports = config; diff --git a/node_modules/nodemon/lib/config/load.js b/node_modules/nodemon/lib/config/load.js new file mode 100644 index 0000000..75d8443 --- /dev/null +++ b/node_modules/nodemon/lib/config/load.js @@ -0,0 +1,223 @@ +var debug = require('debug')('nodemon'); +var fs = require('fs'); +var path = require('path'); +var exists = fs.exists || path.exists; +var utils = require('../utils'); +var rules = require('../rules'); +var parse = require('../rules/parse'); +var exec = require('./exec'); +var defaults = require('./defaults'); + +module.exports = load; +module.exports.mutateExecOptions = mutateExecOptions; + +var existsSync = fs.existsSync || path.existsSync; + +function findAppScript() { + // nodemon has been run alone, so try to read the package file + // or try to read the index.js file + + var pkg = + existsSync(path.join(process.cwd(), 'package.json')) && + require(path.join(process.cwd(), 'package.json')); + if ((!pkg || pkg.main == undefined) && existsSync('./index.js')) { + return 'index.js'; + } +} + +/** + * Load the nodemon config, first reading the global root/nodemon.json, then + * the local nodemon.json to the exec and then overwriting using any user + * specified settings (i.e. from the cli) + * + * @param {Object} settings user defined settings + * @param {Function} ready callback that receives complete config + */ +function load(settings, options, config, callback) { + config.loaded = []; + // first load the root nodemon.json + loadFile(options, config, utils.home, function (options) { + // then load the user's local configuration file + if (settings.configFile) { + options.configFile = path.resolve(settings.configFile); + } + loadFile(options, config, process.cwd(), function (options) { + // Then merge over with the user settings (parsed from the cli). + // Note that merge protects and favours existing values over new values, + // and thus command line arguments get priority + options = utils.merge(settings, options); + + // legacy support + if (!Array.isArray(options.ignore)) { + options.ignore = [options.ignore]; + } + + if (!options.ignoreRoot) { + options.ignoreRoot = defaults.ignoreRoot; + } + + // blend the user ignore and the default ignore together + if (options.ignoreRoot && options.ignore) { + if (!Array.isArray(options.ignoreRoot)) { + options.ignoreRoot = [options.ignoreRoot]; + } + options.ignore = options.ignoreRoot.concat(options.ignore); + } else { + options.ignore = defaults.ignore.concat(options.ignore); + } + + // add in any missing defaults + options = utils.merge(options, defaults); + + if (!options.script && !options.exec) { + var found = findAppScript(); + if (found) { + if (!options.args) { + options.args = []; + } + // if the script is found as a result of not being on the command + // line, then we move any of the pre double-dash args in execArgs + const n = + options.scriptPosition === null + ? options.args.length + : options.scriptPosition; + + options.execArgs = (options.execArgs || []).concat( + options.args.splice(0, n) + ); + options.scriptPosition = null; + + options.script = found; + } + } + + mutateExecOptions(options); + + if (options.quiet) { + utils.quiet(); + } + + if (options.verbose) { + utils.debug = true; + } + + // simplify the ready callback to be called after the rules are normalised + // from strings to regexp through the rules lib. Note that this gets + // created *after* options is overwritten twice in the lines above. + var ready = function (options) { + normaliseRules(options, callback); + }; + + ready(options); + }); + }); +} + +function normaliseRules(options, ready) { + // convert ignore and watch options to rules/regexp + rules.watch.add(options.watch); + rules.ignore.add(options.ignore); + + // normalise the watch and ignore arrays + options.watch = options.watch === false ? false : rules.rules.watch; + options.ignore = rules.rules.ignore; + + ready(options); +} + +/** + * Looks for a config in the current working directory, and a config in the + * user's home directory, merging the two together, giving priority to local + * config. This can then be overwritten later by command line arguments + * + * @param {Function} ready callback to pass loaded settings to + */ +function loadFile(options, config, dir, ready) { + if (!ready) { + ready = function () {}; + } + + var callback = function (settings) { + // prefer the local nodemon.json and fill in missing items using + // the global options + ready(utils.merge(settings, options)); + }; + + if (!dir) { + return callback({}); + } + + var filename = options.configFile || path.join(dir, 'nodemon.json'); + + if (config.loaded.indexOf(filename) !== -1) { + // don't bother re-parsing the same config file + return callback({}); + } + + fs.readFile(filename, 'utf8', function (err, data) { + if (err) { + if (err.code === 'ENOENT') { + if (!options.configFile && dir !== utils.home) { + // if no specified local config file and local nodemon.json + // doesn't exist, try the package.json + return loadPackageJSON(config, callback); + } + } + return callback({}); + } + + var settings = {}; + + try { + settings = JSON.parse(data.toString('utf8').replace(/^\uFEFF/, '')); + if (!filename.endsWith('package.json') || settings.nodemonConfig) { + config.loaded.push(filename); + } + } catch (e) { + utils.log.fail('Failed to parse config ' + filename); + console.error(e); + process.exit(1); + } + + // options values will overwrite settings + callback(settings); + }); +} + +function loadPackageJSON(config, ready) { + if (!ready) { + ready = () => {}; + } + + const dir = process.cwd(); + const filename = path.join(dir, 'package.json'); + const packageLoadOptions = { configFile: filename }; + return loadFile(packageLoadOptions, config, dir, (settings) => { + ready(settings.nodemonConfig || {}); + }); +} + +function mutateExecOptions(options) { + // work out the execOptions based on the final config we have + options.execOptions = exec( + { + script: options.script, + exec: options.exec, + args: options.args, + scriptPosition: options.scriptPosition, + nodeArgs: options.nodeArgs, + execArgs: options.execArgs, + ext: options.ext, + env: options.env, + }, + options.execMap + ); + + // clean up values that we don't need at the top level + delete options.scriptPosition; + delete options.script; + delete options.args; + delete options.ext; + + return options; +} diff --git a/node_modules/nodemon/lib/help/index.js b/node_modules/nodemon/lib/help/index.js new file mode 100644 index 0000000..1054b60 --- /dev/null +++ b/node_modules/nodemon/lib/help/index.js @@ -0,0 +1,27 @@ +var fs = require('fs'); +var path = require('path'); +const supportsColor = require('supports-color'); + +module.exports = help; + +const highlight = supportsColor.stdout ? '\x1B\[$1m' : ''; + +function help(item) { + if (!item) { + item = 'help'; + } else if (item === true) { // if used with -h or --help and no args + item = 'help'; + } + + // cleanse the filename to only contain letters + // aka: /\W/g but figured this was eaiser to read + item = item.replace(/[^a-z]/gi, ''); + + try { + var dir = path.join(__dirname, '..', '..', 'doc', 'cli', item + '.txt'); + var body = fs.readFileSync(dir, 'utf8'); + return body.replace(/\\x1B\[(.)m/g, highlight); + } catch (e) { + return '"' + item + '" help can\'t be found'; + } +} diff --git a/node_modules/nodemon/lib/index.js b/node_modules/nodemon/lib/index.js new file mode 100644 index 0000000..0eca5c4 --- /dev/null +++ b/node_modules/nodemon/lib/index.js @@ -0,0 +1 @@ +module.exports = require('./nodemon'); \ No newline at end of file diff --git a/node_modules/nodemon/lib/monitor/index.js b/node_modules/nodemon/lib/monitor/index.js new file mode 100644 index 0000000..89db029 --- /dev/null +++ b/node_modules/nodemon/lib/monitor/index.js @@ -0,0 +1,4 @@ +module.exports = { + run: require('./run'), + watch: require('./watch').watch, +}; diff --git a/node_modules/nodemon/lib/monitor/match.js b/node_modules/nodemon/lib/monitor/match.js new file mode 100644 index 0000000..2ac3b29 --- /dev/null +++ b/node_modules/nodemon/lib/monitor/match.js @@ -0,0 +1,276 @@ +const minimatch = require('minimatch'); +const path = require('path'); +const fs = require('fs'); +const debug = require('debug')('nodemon:match'); +const utils = require('../utils'); + +module.exports = match; +module.exports.rulesToMonitor = rulesToMonitor; + +function rulesToMonitor(watch, ignore, config) { + var monitor = []; + + if (!Array.isArray(ignore)) { + if (ignore) { + ignore = [ignore]; + } else { + ignore = []; + } + } + + if (!Array.isArray(watch)) { + if (watch) { + watch = [watch]; + } else { + watch = []; + } + } + + if (watch && watch.length) { + monitor = utils.clone(watch); + } + + if (ignore) { + [].push.apply(monitor, (ignore || []).map(function (rule) { + return '!' + rule; + })); + } + + var cwd = process.cwd(); + + // next check if the monitored paths are actual directories + // or just patterns - and expand the rule to include *.* + monitor = monitor.map(function (rule) { + var not = rule.slice(0, 1) === '!'; + + if (not) { + rule = rule.slice(1); + } + + if (rule === '.' || rule === '.*') { + rule = '*.*'; + } + + var dir = path.resolve(cwd, rule); + + try { + var stat = fs.statSync(dir); + if (stat.isDirectory()) { + rule = dir; + if (rule.slice(-1) !== '/') { + rule += '/'; + } + rule += '**/*'; + + // `!not` ... sorry. + if (!not) { + config.dirs.push(dir); + } + } else { + // ensures we end up in the check that tries to get a base directory + // and then adds it to the watch list + throw new Error(); + } + } catch (e) { + var base = tryBaseDir(dir); + if (!not && base) { + if (config.dirs.indexOf(base) === -1) { + config.dirs.push(base); + } + } + } + + if (rule.slice(-1) === '/') { + // just slap on a * anyway + rule += '*'; + } + + // if the url ends with * but not **/* and not *.* + // then convert to **/* - somehow it was missed :-\ + if (rule.slice(-4) !== '**/*' && + rule.slice(-1) === '*' && + rule.indexOf('*.') === -1) { + + if (rule.slice(-2) !== '**') { + rule += '*/*'; + } + } + + + return (not ? '!' : '') + rule; + }); + + return monitor; +} + +function tryBaseDir(dir) { + var stat; + if (/[?*\{\[]+/.test(dir)) { // if this is pattern, then try to find the base + try { + var base = path.dirname(dir.replace(/([?*\{\[]+.*$)/, 'foo')); + stat = fs.statSync(base); + if (stat.isDirectory()) { + return base; + } + } catch (error) { + // console.log(error); + } + } else { + try { + stat = fs.statSync(dir); + // if this path is actually a single file that exists, then just monitor + // that, *specifically*. + if (stat.isFile() || stat.isDirectory()) { + return dir; + } + } catch (e) { } + } + + return false; +} + +function match(files, monitor, ext) { + // sort the rules by highest specificity (based on number of slashes) + // ignore rules (!) get sorted highest as they take precedent + const cwd = process.cwd(); + var rules = monitor.sort(function (a, b) { + var r = b.split(path.sep).length - a.split(path.sep).length; + var aIsIgnore = a.slice(0, 1) === '!'; + var bIsIgnore = b.slice(0, 1) === '!'; + + if (aIsIgnore || bIsIgnore) { + if (aIsIgnore) { + return -1; + } + + return 1; + } + + if (r === 0) { + return b.length - a.length; + } + return r; + }).map(function (s) { + var prefix = s.slice(0, 1); + + if (prefix === '!') { + if (s.indexOf('!' + cwd) === 0) { + return s; + } + + // if it starts with a period, then let's get the relative path + if (s.indexOf('!.') === 0) { + return '!' + path.resolve(cwd, s.substring(1)); + } + + return '!**' + (prefix !== path.sep ? path.sep : '') + s.slice(1); + } + + // if it starts with a period, then let's get the relative path + if (s.indexOf('.') === 0) { + return path.resolve(cwd, s); + } + + if (s.indexOf(cwd) === 0) { + return s; + } + + return '**' + (prefix !== path.sep ? path.sep : '') + s; + }); + + debug('rules', rules); + + var good = []; + var whitelist = []; // files that we won't check against the extension + var ignored = 0; + var watched = 0; + var usedRules = []; + var minimatchOpts = { + dot: true, + }; + + // enable case-insensitivity on Windows + if (utils.isWindows) { + minimatchOpts.nocase = true; + } + + files.forEach(function (file) { + file = path.resolve(cwd, file); + + var matched = false; + for (var i = 0; i < rules.length; i++) { + if (rules[i].slice(0, 1) === '!') { + if (!minimatch(file, rules[i], minimatchOpts)) { + debug('ignored', file, 'rule:', rules[i]); + ignored++; + matched = true; + break; + } + } else { + debug('matched', file, 'rule:', rules[i]); + if (minimatch(file, rules[i], minimatchOpts)) { + watched++; + + // don't repeat the output if a rule is matched + if (usedRules.indexOf(rules[i]) === -1) { + usedRules.push(rules[i]); + utils.log.detail('matched rule: ' + rules[i]); + } + + // if the rule doesn't match the WATCH EVERYTHING + // but *does* match a rule that ends with *.*, then + // white list it - in that we don't run it through + // the extension check too. + if (rules[i] !== '**' + path.sep + '*.*' && + rules[i].slice(-3) === '*.*') { + whitelist.push(file); + } else if (path.basename(file) === path.basename(rules[i])) { + // if the file matches the actual rule, then it's put on whitelist + whitelist.push(file); + } else { + good.push(file); + } + matched = true; + break; + } else { + // utils.log.detail('no match: ' + rules[i], file); + } + } + } + if (!matched) { + ignored++; + } + }); + + debug('good', good) + + // finally check the good files against the extensions that we're monitoring + if (ext) { + if (ext.indexOf(',') === -1) { + ext = '**/*.' + ext; + } else { + ext = '**/*.{' + ext + '}'; + } + + good = good.filter(function (file) { + // only compare the filename to the extension test + return minimatch(path.basename(file), ext, minimatchOpts); + }); + } // else assume *.* + + var result = good.concat(whitelist); + + if (utils.isWindows) { + // fix for windows testing - I *think* this is okay to do + result = result.map(function (file) { + return file.slice(0, 1).toLowerCase() + file.slice(1); + }); + } + + return { + result: result, + ignored: ignored, + watched: watched, + total: files.length, + }; +} diff --git a/node_modules/nodemon/lib/monitor/run.js b/node_modules/nodemon/lib/monitor/run.js new file mode 100644 index 0000000..e05041e --- /dev/null +++ b/node_modules/nodemon/lib/monitor/run.js @@ -0,0 +1,555 @@ +var debug = require('debug')('nodemon:run'); +const statSync = require('fs').statSync; +var utils = require('../utils'); +var bus = utils.bus; +var childProcess = require('child_process'); +var spawn = childProcess.spawn; +var exec = childProcess.exec; +var execSync = childProcess.execSync; +var fork = childProcess.fork; +var watch = require('./watch').watch; +var config = require('../config'); +var child = null; // the actual child process we spawn +var killedAfterChange = false; +var noop = () => {}; +var restart = null; +var psTree = require('pstree.remy'); +var path = require('path'); +var signals = require('./signals'); +const undefsafe = require('undefsafe'); +const osRelease = parseInt(require('os').release().split('.')[0], 10); + +function run(options) { + var cmd = config.command.raw; + // moved up + // we need restart function below in the global scope for run.kill + /*jshint validthis:true*/ + restart = run.bind(this, options); + run.restart = restart; + + // binding options with instance of run + // so that we can use it in run.kill + run.options = options; + + var runCmd = !options.runOnChangeOnly || config.lastStarted !== 0; + if (runCmd) { + utils.log.status('starting `' + config.command.string + '`'); + } else { + // should just watch file if command is not to be run + // had another alternate approach + // to stop process being forked/spawned in the below code + // but this approach does early exit and makes code cleaner + debug('start watch on: %s', config.options.watch); + if (config.options.watch !== false) { + watch(); + return; + } + } + + config.lastStarted = Date.now(); + + var stdio = ['pipe', 'pipe', 'pipe']; + + if (config.options.stdout) { + stdio = ['pipe', process.stdout, process.stderr]; + } + + if (config.options.stdin === false) { + stdio = [process.stdin, process.stdout, process.stderr]; + } + + var sh = 'sh'; + var shFlag = '-c'; + + const binPath = process.cwd() + '/node_modules/.bin'; + + const spawnOptions = { + env: Object.assign({}, process.env, options.execOptions.env, { + PATH: + binPath + + path.delimiter + + (undefsafe(options, '.execOptions.env.PATH') || process.env.PATH), + }), + stdio: stdio, + }; + + var executable = cmd.executable; + + if (utils.isWindows) { + // if the exec includes a forward slash, reverse it for windows compat + // but *only* apply to the first command, and none of the arguments. + // ref #1251 and #1236 + if (executable.indexOf('/') !== -1) { + executable = executable + .split(' ') + .map((e, i) => { + if (i === 0) { + return path.normalize(e); + } + return e; + }) + .join(' '); + } + // taken from npm's cli: https://git.io/vNFD4 + sh = process.env.comspec || 'cmd'; + shFlag = '/d /s /c'; + spawnOptions.windowsVerbatimArguments = true; + spawnOptions.windowsHide = true; + } + + var args = runCmd ? utils.stringify(executable, cmd.args) : ':'; + var spawnArgs = [sh, [shFlag, args], spawnOptions]; + + const firstArg = cmd.args[0] || ''; + + var inBinPath = false; + try { + inBinPath = statSync(`${binPath}/${executable}`).isFile(); + } catch (e) {} + + // hasStdio allows us to correctly handle stdin piping + // see: https://git.io/vNtX3 + const hasStdio = utils.satisfies('>= 6.4.0 || < 5'); + + // forking helps with sub-process handling and tends to clean up better + // than spawning, but it should only be used under specific conditions + const shouldFork = + !config.options.spawn && + !inBinPath && + !(firstArg.indexOf('-') === 0) && // don't fork if there's a node exec arg + firstArg !== 'inspect' && // don't fork it's `inspect` debugger + executable === 'node' && // only fork if node + utils.version.major > 4; // only fork if node version > 4 + + if (shouldFork) { + // this assumes the first argument is the script and slices it out, since + // we're forking + var forkArgs = cmd.args.slice(1); + var env = utils.merge(options.execOptions.env, process.env); + stdio.push('ipc'); + const forkOptions = { + env: env, + stdio: stdio, + silent: !hasStdio, + }; + if (utils.isWindows) { + forkOptions.windowsHide = true; + } + child = fork(options.execOptions.script, forkArgs, forkOptions); + utils.log.detail('forking'); + debug('fork', sh, shFlag, args); + } else { + utils.log.detail('spawning'); + child = spawn.apply(null, spawnArgs); + debug('spawn', sh, shFlag, args); + } + + if (config.required) { + var emit = { + stdout: function (data) { + bus.emit('stdout', data); + }, + stderr: function (data) { + bus.emit('stderr', data); + }, + }; + + // now work out what to bind to... + if (config.options.stdout) { + child.on('stdout', emit.stdout).on('stderr', emit.stderr); + } else { + child.stdout.on('data', emit.stdout); + child.stderr.on('data', emit.stderr); + + bus.stdout = child.stdout; + bus.stderr = child.stderr; + } + + if (shouldFork) { + child.on('message', function (message, sendHandle) { + bus.emit('message', message, sendHandle); + }); + } + } + + bus.emit('start'); + + utils.log.detail('child pid: ' + child.pid); + + child.on('error', function (error) { + bus.emit('error', error); + if (error.code === 'ENOENT') { + utils.log.error('unable to run executable: "' + cmd.executable + '"'); + process.exit(1); + } else { + utils.log.error('failed to start child process: ' + error.code); + throw error; + } + }); + + child.on('exit', function (code, signal) { + if (child && child.stdin) { + process.stdin.unpipe(child.stdin); + } + + if (code === 127) { + utils.log.error( + 'failed to start process, "' + cmd.executable + '" exec not found' + ); + bus.emit('error', code); + process.exit(); + } + + // If the command failed with code 2, it may or may not be a syntax error + // See: http://git.io/fNOAR + // We will only assume a parse error, if the child failed quickly + if (code === 2 && Date.now() < config.lastStarted + 500) { + utils.log.error('process failed, unhandled exit code (2)'); + utils.log.error(''); + utils.log.error('Either the command has a syntax error,'); + utils.log.error('or it is exiting with reserved code 2.'); + utils.log.error(''); + utils.log.error('To keep nodemon running even after a code 2,'); + utils.log.error('add this to the end of your command: || exit 1'); + utils.log.error(''); + utils.log.error('Read more here: https://git.io/fNOAG'); + utils.log.error(''); + utils.log.error('nodemon will stop now so that you can fix the command.'); + utils.log.error(''); + bus.emit('error', code); + process.exit(); + } + + // In case we killed the app ourselves, set the signal thusly + if (killedAfterChange) { + killedAfterChange = false; + signal = config.signal; + } + // this is nasty, but it gives it windows support + if (utils.isWindows && signal === 'SIGTERM') { + signal = config.signal; + } + + if (signal === config.signal || code === 0) { + // this was a clean exit, so emit exit, rather than crash + debug('bus.emit(exit) via ' + config.signal); + bus.emit('exit', signal); + + // exit the monitor, but do it gracefully + if (signal === config.signal) { + return restart(); + } + + if (code === 0) { + // clean exit - wait until file change to restart + if (runCmd) { + utils.log.status('clean exit - waiting for changes before restart'); + } + child = null; + } + } else { + bus.emit('crash'); + if (options.exitcrash) { + utils.log.fail('app crashed'); + if (!config.required) { + process.exit(1); + } + } else { + utils.log.fail( + 'app crashed - waiting for file changes before' + ' starting...' + ); + child = null; + } + } + + if (config.options.restartable) { + // stdin needs to kick in again to be able to listen to the + // restart command + process.stdin.resume(); + } + }); + + // moved the run.kill outside to handle both the cases + // intial start + // no start + + // connect stdin to the child process (options.stdin is on by default) + if (options.stdin) { + process.stdin.resume(); + // FIXME decide whether or not we need to decide the encoding + // process.stdin.setEncoding('utf8'); + + // swallow the stdin error if it happens + // ref: https://github.com/remy/nodemon/issues/1195 + if (hasStdio) { + child.stdin.on('error', () => {}); + process.stdin.pipe(child.stdin); + } else { + if (child.stdout) { + child.stdout.pipe(process.stdout); + } else { + utils.log.error( + 'running an unsupported version of node ' + process.version + ); + utils.log.error( + 'nodemon may not work as expected - ' + + 'please consider upgrading to LTS' + ); + } + } + + bus.once('exit', function () { + if (child && process.stdin.unpipe) { + // node > 0.8 + process.stdin.unpipe(child.stdin); + } + }); + } + + debug('start watch on: %s', config.options.watch); + if (config.options.watch !== false) { + watch(); + } +} + +function waitForSubProcesses(pid, callback) { + debug('checking ps tree for pids of ' + pid); + psTree(pid, (err, pids) => { + if (!pids.length) { + return callback(); + } + + utils.log.status( + `still waiting for ${pids.length} sub-process${ + pids.length > 2 ? 'es' : '' + } to finish...` + ); + setTimeout(() => waitForSubProcesses(pid, callback), 1000); + }); +} + +function kill(child, signal, callback) { + if (!callback) { + callback = noop; + } + + if (utils.isWindows) { + const taskKill = () => { + try { + exec('taskkill /pid ' + child.pid + ' /T /F'); + } catch (e) { + utils.log.error('Could not shutdown sub process cleanly'); + } + }; + + // We are handling a 'SIGKILL' , 'SIGUSR2' and 'SIGUSR1' POSIX signal under Windows the + // same way it is handled on a UNIX system: We are performing + // a hard shutdown without waiting for the process to clean-up. + if ( + signal === 'SIGKILL' || + osRelease < 10 || + signal === 'SIGUSR2' || + signal === 'SIGUSR1' + ) { + debug('terminating process group by force: %s', child.pid); + + // We are using the taskkill utility to terminate the whole + // process group ('/t') of the child ('/pid') by force ('/f'). + // We need to end all sub processes, because the 'child' + // process in this context is actually a cmd.exe wrapper. + taskKill(); + callback(); + return; + } + + try { + // We are using the Windows Management Instrumentation Command-line + // (wmic.exe) to resolve the sub-child process identifier, because the + // 'child' process in this context is actually a cmd.exe wrapper. + // We want to send the termination signal directly to the node process. + // The '2> nul' silences the no process found error message. + const resultBuffer = execSync( + `wmic process where (ParentProcessId=${child.pid}) get ProcessId 2> nul` + ); + const result = resultBuffer.toString().match(/^[0-9]+/m); + + // If there is no sub-child process we fall back to the child process. + const processId = Array.isArray(result) ? result[0] : child.pid; + + debug('sending kill signal SIGINT to process: %s', processId); + + // We are using the standalone 'windows-kill' executable to send the + // standard POSIX signal 'SIGINT' to the node process. This fixes #1720. + const windowsKill = path.normalize( + `${__dirname}/../../bin/windows-kill.exe` + ); + + // We have to detach the 'windows-kill' execution completely from this + // process group to avoid terminating the nodemon process itself. + // See: https://github.com/alirdn/windows-kill#how-it-works--limitations + // + // Therefore we are using 'start' to create a new cmd.exe context. + // The '/min' option hides the new terminal window and the '/wait' + // option lets the process wait for the command to finish. + + execSync( + `start "windows-kill" /min /wait "${windowsKill}" -SIGINT ${processId}` + ); + } catch (e) { + taskKill(); + } + callback(); + } else { + // we use psTree to kill the full subtree of nodemon, because when + // spawning processes like `coffee` under the `--debug` flag, it'll spawn + // it's own child, and that can't be killed by nodemon, so psTree gives us + // an array of PIDs that have spawned under nodemon, and we send each the + // configured signal (default: SIGUSR2) signal, which fixes #335 + // note that psTree also works if `ps` is missing by looking in /proc + let sig = signal.replace('SIG', ''); + + psTree(child.pid, function (err, pids) { + // if ps isn't native to the OS, then we need to send the numeric value + // for the signal during the kill, `signals` is a lookup table for that. + if (!psTree.hasPS) { + sig = signals[signal]; + } + + // the sub processes need to be killed from smallest to largest + debug('sending kill signal to ' + pids.join(', ')); + + child.kill(signal); + + pids.sort().forEach((pid) => exec(`kill -${sig} ${pid}`, noop)); + + waitForSubProcesses(child.pid, () => { + // finally kill the main user process + exec(`kill -${sig} ${child.pid}`, callback); + }); + }); + } +} + +run.kill = function (noRestart, callback) { + // I hate code like this :( - Remy (author of said code) + if (typeof noRestart === 'function') { + callback = noRestart; + noRestart = false; + } + + if (!callback) { + callback = noop; + } + + if (child !== null) { + // if the stdin piping is on, we need to unpipe, but also close stdin on + // the child, otherwise linux can throw EPIPE or ECONNRESET errors. + if (run.options.stdin) { + process.stdin.unpipe(child.stdin); + } + + // For the on('exit', ...) handler above the following looks like a + // crash, so we set the killedAfterChange flag if a restart is planned + if (!noRestart) { + killedAfterChange = true; + } + + /* Now kill the entire subtree of processes belonging to nodemon */ + var oldPid = child.pid; + if (child) { + kill(child, config.signal, function () { + // this seems to fix the 0.11.x issue with the "rs" restart command, + // though I'm unsure why. it seems like more data is streamed in to + // stdin after we close. + if (child && run.options.stdin && child.stdin && oldPid === child.pid) { + child.stdin.end(); + } + callback(); + }); + } + } else if (!noRestart) { + // if there's no child, then we need to manually start the process + // this is because as there was no child, the child.on('exit') event + // handler doesn't exist which would normally trigger the restart. + bus.once('start', callback); + run.restart(); + } else { + callback(); + } +}; + +run.restart = noop; + +bus.on('quit', function onQuit(code) { + if (code === undefined) { + code = 0; + } + + // remove event listener + var exitTimer = null; + var exit = function () { + clearTimeout(exitTimer); + exit = noop; // null out in case of race condition + child = null; + if (!config.required) { + // Execute all other quit listeners. + bus.listeners('quit').forEach(function (listener) { + if (listener !== onQuit) { + listener(); + } + }); + process.exit(code); + } else { + bus.emit('exit'); + } + }; + + // if we're not running already, don't bother with trying to kill + if (config.run === false) { + return exit(); + } + + // immediately try to stop any polling + config.run = false; + + if (child) { + // give up waiting for the kids after 10 seconds + exitTimer = setTimeout(exit, 10 * 1000); + child.removeAllListeners('exit'); + child.once('exit', exit); + + kill(child, 'SIGINT'); + } else { + exit(); + } +}); + +bus.on('restart', function () { + // run.kill will send a SIGINT to the child process, which will cause it + // to terminate, which in turn uses the 'exit' event handler to restart + run.kill(); +}); + +// remove the child file on exit +process.on('exit', function () { + utils.log.detail('exiting'); + if (child) { + child.kill(); + } +}); + +// because windows borks when listening for the SIG* events +if (!utils.isWindows) { + bus.once('boot', () => { + // usual suspect: ctrl+c exit + process.once('SIGINT', () => bus.emit('quit', 130)); + process.once('SIGTERM', () => { + bus.emit('quit', 143); + if (child) { + child.kill('SIGTERM'); + } + }); + }); +} + +module.exports = run; diff --git a/node_modules/nodemon/lib/monitor/signals.js b/node_modules/nodemon/lib/monitor/signals.js new file mode 100644 index 0000000..daff6e0 --- /dev/null +++ b/node_modules/nodemon/lib/monitor/signals.js @@ -0,0 +1,34 @@ +module.exports = { + SIGHUP: 1, + SIGINT: 2, + SIGQUIT: 3, + SIGILL: 4, + SIGTRAP: 5, + SIGABRT: 6, + SIGBUS: 7, + SIGFPE: 8, + SIGKILL: 9, + SIGUSR1: 10, + SIGSEGV: 11, + SIGUSR2: 12, + SIGPIPE: 13, + SIGALRM: 14, + SIGTERM: 15, + SIGSTKFLT: 16, + SIGCHLD: 17, + SIGCONT: 18, + SIGSTOP: 19, + SIGTSTP: 20, + SIGTTIN: 21, + SIGTTOU: 22, + SIGURG: 23, + SIGXCPU: 24, + SIGXFSZ: 25, + SIGVTALRM: 26, + SIGPROF: 27, + SIGWINCH: 28, + SIGIO: 29, + SIGPWR: 30, + SIGSYS: 31, + SIGRTMIN: 35, +} diff --git a/node_modules/nodemon/lib/monitor/watch.js b/node_modules/nodemon/lib/monitor/watch.js new file mode 100644 index 0000000..d0ac7fe --- /dev/null +++ b/node_modules/nodemon/lib/monitor/watch.js @@ -0,0 +1,244 @@ +module.exports.watch = watch; +module.exports.resetWatchers = resetWatchers; + +var debug = require('debug')('nodemon:watch'); +var debugRoot = require('debug')('nodemon'); +var chokidar = require('chokidar'); +var undefsafe = require('undefsafe'); +var config = require('../config'); +var path = require('path'); +var utils = require('../utils'); +var bus = utils.bus; +var match = require('./match'); +var watchers = []; +var debouncedBus; + +bus.on('reset', resetWatchers); + +function resetWatchers() { + debugRoot('resetting watchers'); + watchers.forEach(function (watcher) { + watcher.close(); + }); + watchers = []; +} + +function watch() { + if (watchers.length) { + debug('early exit on watch, still watching (%s)', watchers.length); + return; + } + + var dirs = [].slice.call(config.dirs); + + debugRoot('start watch on: %s', dirs.join(', ')); + const rootIgnored = config.options.ignore; + debugRoot('ignored', rootIgnored); + + var watchedFiles = []; + + const promise = new Promise(function (resolve) { + const dotFilePattern = /[/\\]\./; + var ignored = match.rulesToMonitor( + [], // not needed + Array.from(rootIgnored), + config + ).map(pattern => pattern.slice(1)); + + const addDotFile = dirs.filter(dir => dir.match(dotFilePattern)); + + // don't ignore dotfiles if explicitly watched. + if (addDotFile.length === 0) { + ignored.push(dotFilePattern); + } + + var watchOptions = { + ignorePermissionErrors: true, + ignored: ignored, + persistent: true, + usePolling: config.options.legacyWatch || false, + interval: config.options.pollingInterval, + // note to future developer: I've gone back and forth on adding `cwd` + // to the props and in some cases it fixes bugs but typically it causes + // bugs elsewhere (since nodemon is used is so many ways). the final + // decision is to *not* use it at all and work around it + // cwd: ... + }; + + if (utils.isWindows) { + watchOptions.disableGlobbing = true; + } + + if (utils.isIBMi) { + watchOptions.usePolling = true; + } + + if (process.env.TEST) { + watchOptions.useFsEvents = false; + } + + var watcher = chokidar.watch( + dirs, + Object.assign({}, watchOptions, config.options.watchOptions || {}) + ); + + watcher.ready = false; + + var total = 0; + + watcher.on('change', filterAndRestart); + watcher.on('unlink', filterAndRestart); + watcher.on('add', function (file) { + if (watcher.ready) { + return filterAndRestart(file); + } + + watchedFiles.push(file); + bus.emit('watching', file); + debug('chokidar watching: %s', file); + }); + watcher.on('ready', function () { + watchedFiles = Array.from(new Set(watchedFiles)); // ensure no dupes + total = watchedFiles.length; + watcher.ready = true; + resolve(total); + debugRoot('watch is complete'); + }); + + watcher.on('error', function (error) { + if (error.code === 'EINVAL') { + utils.log.error( + 'Internal watch failed. Likely cause: too many ' + + 'files being watched (perhaps from the root of a drive?\n' + + 'See https://github.com/paulmillr/chokidar/issues/229 for details' + ); + } else { + utils.log.error('Internal watch failed: ' + error.message); + process.exit(1); + } + }); + + watchers.push(watcher); + }); + + return promise.catch(e => { + // this is a core error and it should break nodemon - so I have to break + // out of a promise using the setTimeout + setTimeout(() => { + throw e; + }); + }).then(function () { + utils.log.detail(`watching ${watchedFiles.length} file${ + watchedFiles.length === 1 ? '' : 's'}`); + return watchedFiles; + }); +} + +function filterAndRestart(files) { + if (!Array.isArray(files)) { + files = [files]; + } + + if (files.length) { + var cwd = process.cwd(); + if (this.options && this.options.cwd) { + cwd = this.options.cwd; + } + + utils.log.detail( + 'files triggering change check: ' + + files + .map(file => { + const res = path.relative(cwd, file); + return res; + }) + .join(', ') + ); + + // make sure the path is right and drop an empty + // filenames (sometimes on windows) + files = files.filter(Boolean).map(file => { + return path.relative(process.cwd(), path.relative(cwd, file)); + }); + + if (utils.isWindows) { + // ensure the drive letter is in uppercase (c:\foo -> C:\foo) + files = files.map(f => { + if (f.indexOf(':') === -1) { return f; } + return f[0].toUpperCase() + f.slice(1); + }); + } + + + debug('filterAndRestart on', files); + + var matched = match( + files, + config.options.monitor, + undefsafe(config, 'options.execOptions.ext') + ); + + debug('matched?', JSON.stringify(matched)); + + // if there's no matches, then test to see if the changed file is the + // running script, if so, let's allow a restart + if (config.options.execOptions && config.options.execOptions.script) { + const script = path.resolve(config.options.execOptions.script); + if (matched.result.length === 0 && script) { + const length = script.length; + files.find(file => { + if (file.substr(-length, length) === script) { + matched = { + result: [file], + total: 1, + }; + return true; + } + }); + } + } + + utils.log.detail( + 'changes after filters (before/after): ' + + [files.length, matched.result.length].join('/') + ); + + // reset the last check so we're only looking at recently modified files + config.lastStarted = Date.now(); + + if (matched.result.length) { + if (config.options.delay > 0) { + utils.log.detail('delaying restart for ' + config.options.delay + 'ms'); + if (debouncedBus === undefined) { + debouncedBus = debounce(restartBus, config.options.delay); + } + debouncedBus(matched); + } else { + return restartBus(matched); + } + } + } +} + +function restartBus(matched) { + utils.log.status('restarting due to changes...'); + matched.result.map(file => { + utils.log.detail(path.relative(process.cwd(), file)); + }); + + if (config.options.verbose) { + utils.log._log(''); + } + + bus.emit('restart', matched.result); +} + +function debounce(fn, delay) { + var timer = null; + return function () { + const context = this; + const args = arguments; + clearTimeout(timer); + timer = setTimeout(() =>fn.apply(context, args), delay); + }; +} diff --git a/node_modules/nodemon/lib/nodemon.js b/node_modules/nodemon/lib/nodemon.js new file mode 100644 index 0000000..ce649cb --- /dev/null +++ b/node_modules/nodemon/lib/nodemon.js @@ -0,0 +1,311 @@ +var debug = require('debug')('nodemon'); +var path = require('path'); +var monitor = require('./monitor'); +var cli = require('./cli'); +var version = require('./version'); +var util = require('util'); +var utils = require('./utils'); +var bus = utils.bus; +var help = require('./help'); +var config = require('./config'); +var spawn = require('./spawn'); +const defaults = require('./config/defaults') +var eventHandlers = {}; + +// this is fairly dirty, but theoretically sound since it's part of the +// stable module API +config.required = utils.isRequired; + +function nodemon(settings) { + bus.emit('boot'); + nodemon.reset(); + + // allow the cli string as the argument to nodemon, and allow for + // `node nodemon -V app.js` or just `-V app.js` + if (typeof settings === 'string') { + settings = settings.trim(); + if (settings.indexOf('node') !== 0) { + if (settings.indexOf('nodemon') !== 0) { + settings = 'nodemon ' + settings; + } + settings = 'node ' + settings; + } + settings = cli.parse(settings); + } + + // set the debug flag as early as possible to get all the detailed logging + if (settings.verbose) { + utils.debug = true; + } + + if (settings.help) { + if (process.stdout.isTTY) { + process.stdout._handle.setBlocking(true); // nodejs/node#6456 + } + console.log(help(settings.help)); + if (!config.required) { + process.exit(0); + } + } + + if (settings.version) { + version().then(function (v) { + console.log(v); + if (!config.required) { + process.exit(0); + } + }); + return; + } + + // nodemon tools like grunt-nodemon. This affects where + // the script is being run from, and will affect where + // nodemon looks for the nodemon.json files + if (settings.cwd) { + // this is protection to make sure we haven't dont the chdir already... + // say like in cli/parse.js (which is where we do this once already!) + if (process.cwd() !== path.resolve(config.system.cwd, settings.cwd)) { + process.chdir(settings.cwd); + } + } + + const cwd = process.cwd(); + + config.load(settings, function (config) { + if (!config.options.dump && !config.options.execOptions.script && + config.options.execOptions.exec === 'node') { + if (!config.required) { + console.log(help('usage')); + process.exit(); + } + return; + } + + // before we print anything, update the colour setting on logging + utils.colours = config.options.colours; + + // always echo out the current version + utils.log.info(version.pinned); + + const cwd = process.cwd(); + + if (config.options.cwd) { + utils.log.detail('process root: ' + cwd); + } + + config.loaded.map(file => file.replace(cwd, '.')).forEach(file => { + utils.log.detail('reading config ' + file); + }); + + if (config.options.stdin && config.options.restartable) { + // allow nodemon to restart when the use types 'rs\n' + process.stdin.resume(); + process.stdin.setEncoding('utf8'); + process.stdin.on('data', data => { + const str = data.toString().trim().toLowerCase(); + + // if the keys entered match the restartable value, then restart! + if (str === config.options.restartable) { + bus.emit('restart'); + } else if (data.charCodeAt(0) === 12) { // ctrl+l + console.clear(); + } + }); + } else if (config.options.stdin) { + // so let's make sure we don't eat the key presses + // but also, since we're wrapping, watch out for + // special keys, like ctrl+c x 2 or '.exit' or ctrl+d or ctrl+l + var ctrlC = false; + var buffer = ''; + + process.stdin.on('data', function (data) { + data = data.toString(); + buffer += data; + const chr = data.charCodeAt(0); + + // if restartable, echo back + if (chr === 3) { + if (ctrlC) { + process.exit(0); + } + + ctrlC = true; + return; + } else if (buffer === '.exit' || chr === 4) { // ctrl+d + process.exit(); + } else if (chr === 13 || chr === 10) { // enter / carriage return + buffer = ''; + } else if (chr === 12) { // ctrl+l + console.clear(); + buffer = ''; + } + ctrlC = false; + }); + if (process.stdin.setRawMode) { + process.stdin.setRawMode(true); + } + } + + if (config.options.restartable) { + utils.log.info('to restart at any time, enter `' + + config.options.restartable + '`'); + } + + if (!config.required) { + const restartSignal = config.options.signal === 'SIGUSR2' ? 'SIGHUP' : 'SIGUSR2'; + process.on(restartSignal, nodemon.restart); + utils.bus.on('error', () => { + utils.log.fail((new Error().stack)); + }); + utils.log.detail((config.options.restartable ? 'or ' : '') + 'send ' + + restartSignal + ' to ' + process.pid + ' to restart'); + } + + const ignoring = config.options.monitor.map(function (rule) { + if (rule.slice(0, 1) !== '!') { + return false; + } + + rule = rule.slice(1); + + // don't notify of default ignores + if (defaults.ignoreRoot.indexOf(rule) !== -1) { + return false; + return rule.slice(3).slice(0, -3); + } + + if (rule.startsWith(cwd)) { + return rule.replace(cwd, '.'); + } + + return rule; + }).filter(Boolean).join(' '); + if (ignoring) utils.log.detail('ignoring: ' + ignoring); + + utils.log.info('watching path(s): ' + config.options.monitor.map(function (rule) { + if (rule.slice(0, 1) !== '!') { + try { + rule = path.relative(process.cwd(), rule); + } catch (e) {} + + return rule; + } + + return false; + }).filter(Boolean).join(' ')); + + utils.log.info('watching extensions: ' + (config.options.execOptions.ext || '(all)')); + + if (config.options.dump) { + utils.log._log('log', '--------------'); + utils.log._log('log', 'node: ' + process.version); + utils.log._log('log', 'nodemon: ' + version.pinned); + utils.log._log('log', 'command: ' + process.argv.join(' ')); + utils.log._log('log', 'cwd: ' + cwd); + utils.log._log('log', ['OS:', process.platform, process.arch].join(' ')); + utils.log._log('log', '--------------'); + utils.log._log('log', util.inspect(config, { depth: null })); + utils.log._log('log', '--------------'); + if (!config.required) { + process.exit(); + } + + return; + } + + config.run = true; + + if (config.options.stdout === false) { + nodemon.on('start', function () { + nodemon.stdout = bus.stdout; + nodemon.stderr = bus.stderr; + + bus.emit('readable'); + }); + } + + if (config.options.events && Object.keys(config.options.events).length) { + Object.keys(config.options.events).forEach(function (key) { + utils.log.detail('bind ' + key + ' -> `' + + config.options.events[key] + '`'); + nodemon.on(key, function () { + if (config.options && config.options.events) { + spawn(config.options.events[key], config, + [].slice.apply(arguments)); + } + }); + }); + } + + monitor.run(config.options); + + }); + + return nodemon; +} + +nodemon.restart = function () { + utils.log.status('restarting child process'); + bus.emit('restart'); + return nodemon; +}; + +nodemon.addListener = nodemon.on = function (event, handler) { + if (!eventHandlers[event]) { eventHandlers[event] = []; } + eventHandlers[event].push(handler); + bus.on(event, handler); + return nodemon; +}; + +nodemon.once = function (event, handler) { + if (!eventHandlers[event]) { eventHandlers[event] = []; } + eventHandlers[event].push(handler); + bus.once(event, function () { + debug('bus.once(%s)', event); + eventHandlers[event].splice(eventHandlers[event].indexOf(handler), 1); + handler.apply(this, arguments); + }); + return nodemon; +}; + +nodemon.emit = function () { + bus.emit.apply(bus, [].slice.call(arguments)); + return nodemon; +}; + +nodemon.removeAllListeners = function (event) { + // unbind only the `nodemon.on` event handlers + Object.keys(eventHandlers).filter(function (e) { + return event ? e === event : true; + }).forEach(function (event) { + eventHandlers[event].forEach(function (handler) { + bus.removeListener(event, handler); + eventHandlers[event].splice(eventHandlers[event].indexOf(handler), 1); + }); + }); + + return nodemon; +}; + +nodemon.reset = function (done) { + bus.emit('reset', done); +}; + +bus.on('reset', function (done) { + debug('reset'); + nodemon.removeAllListeners(); + monitor.run.kill(true, function () { + utils.reset(); + config.reset(); + config.run = false; + if (done) { + done(); + } + }); +}); + +// expose the full config +nodemon.config = config; + +module.exports = nodemon; + diff --git a/node_modules/nodemon/lib/rules/add.js b/node_modules/nodemon/lib/rules/add.js new file mode 100644 index 0000000..de85bb7 --- /dev/null +++ b/node_modules/nodemon/lib/rules/add.js @@ -0,0 +1,89 @@ +'use strict'; + +var utils = require('../utils'); + +// internal +var reEscComments = /\\#/g; +// note that '^^' is used in place of escaped comments +var reUnescapeComments = /\^\^/g; +var reComments = /#.*$/; +var reEscapeChars = /[.|\-[\]()\\]/g; +var reAsterisk = /\*/g; + +module.exports = add; + +/** + * Converts file patterns or regular expressions to nodemon + * compatible RegExp matching rules. Note: the `rules` argument + * object is modified to include the new rule and new RegExp + * + * ### Example: + * + * var rules = { watch: [], ignore: [] }; + * add(rules, 'watch', '*.js'); + * add(rules, 'ignore', '/public/'); + * add(rules, 'watch', ':(\d)*\.js'); // note: string based regexp + * add(rules, 'watch', /\d*\.js/); + * + * @param {Object} rules containing `watch` and `ignore`. Also updated during + * execution + * @param {String} which must be either "watch" or "ignore" + * @param {String|RegExp} the actual rule. + */ +function add(rules, which, rule) { + if (!{ ignore: 1, watch: 1}[which]) { + throw new Error('rules/index.js#add requires "ignore" or "watch" as the ' + + 'first argument'); + } + + if (Array.isArray(rule)) { + rule.forEach(function (rule) { + add(rules, which, rule); + }); + return; + } + + // support the rule being a RegExp, but reformat it to + // the custom : format that we're working with. + if (rule instanceof RegExp) { + // rule = ':' + rule.toString().replace(/^\/(.*?)\/$/g, '$1'); + utils.log.error('RegExp format no longer supported, but globs are.'); + return; + } + + // remove comments and trim lines + // this mess of replace methods is escaping "\#" to allow for emacs temp files + + // first up strip comments and remove blank head or tails + rule = (rule || '').replace(reEscComments, '^^') + .replace(reComments, '') + .replace(reUnescapeComments, '#').trim(); + + var regexp = false; + + if (typeof rule === 'string' && rule.substring(0, 1) === ':') { + rule = rule.substring(1); + utils.log.error('RegExp no longer supported: ' + rule); + regexp = true; + } else if (rule.length === 0) { + // blank line (or it was a comment) + return; + } + + if (regexp) { + // rules[which].push(rule); + } else { + // rule = rule.replace(reEscapeChars, '\\$&') + // .replace(reAsterisk, '.*'); + + rules[which].push(rule); + // compile a regexp of all the rules for this ignore or watch + var re = rules[which].map(function (rule) { + return rule.replace(reEscapeChars, '\\$&') + .replace(reAsterisk, '.*'); + }).join('|'); + + // used for the directory matching + rules[which].re = new RegExp(re); + } +} diff --git a/node_modules/nodemon/lib/rules/index.js b/node_modules/nodemon/lib/rules/index.js new file mode 100644 index 0000000..04aa92f --- /dev/null +++ b/node_modules/nodemon/lib/rules/index.js @@ -0,0 +1,53 @@ +'use strict'; +var utils = require('../utils'); +var add = require('./add'); +var parse = require('./parse'); + +// exported +var rules = { ignore: [], watch: [] }; + +/** + * Loads a nodemon config file and populates the ignore + * and watch rules with it's contents, and calls callback + * with the new rules + * + * @param {String} filename + * @param {Function} callback + */ +function load(filename, callback) { + parse(filename, function (err, result) { + if (err) { + // we should have bombed already, but + utils.log.error(err); + callback(err); + } + + if (result.raw) { + result.raw.forEach(add.bind(null, rules, 'ignore')); + } else { + result.ignore.forEach(add.bind(null, rules, 'ignore')); + result.watch.forEach(add.bind(null, rules, 'watch')); + } + + callback(null, rules); + }); +} + +module.exports = { + reset: function () { // just used for testing + rules.ignore.length = rules.watch.length = 0; + delete rules.ignore.re; + delete rules.watch.re; + }, + load: load, + ignore: { + test: add.bind(null, rules, 'ignore'), + add: add.bind(null, rules, 'ignore'), + }, + watch: { + test: add.bind(null, rules, 'watch'), + add: add.bind(null, rules, 'watch'), + }, + add: add.bind(null, rules), + rules: rules, +}; \ No newline at end of file diff --git a/node_modules/nodemon/lib/rules/parse.js b/node_modules/nodemon/lib/rules/parse.js new file mode 100644 index 0000000..6e1cace --- /dev/null +++ b/node_modules/nodemon/lib/rules/parse.js @@ -0,0 +1,43 @@ +'use strict'; +var fs = require('fs'); + +/** + * Parse the nodemon config file, supporting both old style + * plain text config file, and JSON version of the config + * + * @param {String} filename + * @param {Function} callback + */ +function parse(filename, callback) { + var rules = { + ignore: [], + watch: [], + }; + + fs.readFile(filename, 'utf8', function (err, content) { + + if (err) { + return callback(err); + } + + var json = null; + try { + json = JSON.parse(content); + } catch (e) {} + + if (json !== null) { + rules = { + ignore: json.ignore || [], + watch: json.watch || [], + }; + + return callback(null, rules); + } + + // otherwise return the raw file + return callback(null, { raw: content.split(/\n/) }); + }); +} + +module.exports = parse; + diff --git a/node_modules/nodemon/lib/spawn.js b/node_modules/nodemon/lib/spawn.js new file mode 100644 index 0000000..256734a --- /dev/null +++ b/node_modules/nodemon/lib/spawn.js @@ -0,0 +1,74 @@ +const path = require('path'); +const utils = require('./utils'); +const merge = utils.merge; +const bus = utils.bus; +const spawn = require('child_process').spawn; + +module.exports = function spawnCommand(command, config, eventArgs) { + var stdio = ['pipe', 'pipe', 'pipe']; + + if (config.options.stdout) { + stdio = ['pipe', process.stdout, process.stderr]; + } + + const env = merge(process.env, { FILENAME: eventArgs[0] }); + + var sh = 'sh'; + var shFlag = '-c'; + var spawnOptions = { + env: merge(config.options.execOptions.env, env), + stdio: stdio, + }; + + if (!Array.isArray(command)) { + command = [command]; + } + + if (utils.isWindows) { + // if the exec includes a forward slash, reverse it for windows compat + // but *only* apply to the first command, and none of the arguments. + // ref #1251 and #1236 + command = command.map(executable => { + if (executable.indexOf('/') === -1) { + return executable; + } + + return executable.split(' ').map((e, i) => { + if (i === 0) { + return path.normalize(e); + } + return e; + }).join(' '); + }); + // taken from npm's cli: https://git.io/vNFD4 + sh = process.env.comspec || 'cmd'; + shFlag = '/d /s /c'; + spawnOptions.windowsVerbatimArguments = true; + spawnOptions.windowsHide = true; + } + + const args = command.join(' '); + const child = spawn(sh, [shFlag, args], spawnOptions); + + if (config.required) { + var emit = { + stdout: function (data) { + bus.emit('stdout', data); + }, + stderr: function (data) { + bus.emit('stderr', data); + }, + }; + + // now work out what to bind to... + if (config.options.stdout) { + child.on('stdout', emit.stdout).on('stderr', emit.stderr); + } else { + child.stdout.on('data', emit.stdout); + child.stderr.on('data', emit.stderr); + + bus.stdout = child.stdout; + bus.stderr = child.stderr; + } + } +}; diff --git a/node_modules/nodemon/lib/utils/bus.js b/node_modules/nodemon/lib/utils/bus.js new file mode 100644 index 0000000..4e120c5 --- /dev/null +++ b/node_modules/nodemon/lib/utils/bus.js @@ -0,0 +1,44 @@ +var events = require('events'); +var debug = require('debug')('nodemon'); +var util = require('util'); + +var Bus = function () { + events.EventEmitter.call(this); +}; + +util.inherits(Bus, events.EventEmitter); + +var bus = new Bus(); + +// /* +var collected = {}; +bus.on('newListener', function (event) { + debug('bus new listener: %s (%s)', event, bus.listeners(event).length); + if (!collected[event]) { + collected[event] = true; + bus.on(event, function () { + debug('bus emit: %s', event); + }); + } +}); + +// */ + +// proxy process messages (if forked) to the bus +process.on('message', function (event) { + debug('process.message(%s)', event); + bus.emit(event); +}); + +var emit = bus.emit; + +// if nodemon was spawned via a fork, allow upstream communication +// via process.send +if (process.send) { + bus.emit = function (event, data) { + process.send({ type: event, data: data }); + emit.apply(bus, arguments); + }; +} + +module.exports = bus; diff --git a/node_modules/nodemon/lib/utils/clone.js b/node_modules/nodemon/lib/utils/clone.js new file mode 100644 index 0000000..6ba6330 --- /dev/null +++ b/node_modules/nodemon/lib/utils/clone.js @@ -0,0 +1,40 @@ +module.exports = clone; + +// via http://stackoverflow.com/a/728694/22617 +function clone(obj) { + // Handle the 3 simple types, and null or undefined + if (null === obj || 'object' !== typeof obj) { + return obj; + } + + var copy; + + // Handle Date + if (obj instanceof Date) { + copy = new Date(); + copy.setTime(obj.getTime()); + return copy; + } + + // Handle Array + if (obj instanceof Array) { + copy = []; + for (var i = 0, len = obj.length; i < len; i++) { + copy[i] = clone(obj[i]); + } + return copy; + } + + // Handle Object + if (obj instanceof Object) { + copy = {}; + for (var attr in obj) { + if (obj.hasOwnProperty && obj.hasOwnProperty(attr)) { + copy[attr] = clone(obj[attr]); + } + } + return copy; + } + + throw new Error('Unable to copy obj! Its type isn\'t supported.'); +} \ No newline at end of file diff --git a/node_modules/nodemon/lib/utils/colour.js b/node_modules/nodemon/lib/utils/colour.js new file mode 100644 index 0000000..8c1b590 --- /dev/null +++ b/node_modules/nodemon/lib/utils/colour.js @@ -0,0 +1,26 @@ +/** + * Encodes a string in a colour: red, yellow or green + * @param {String} c colour to highlight in + * @param {String} str the string to encode + * @return {String} coloured string for terminal printing + */ +function colour(c, str) { + return (colour[c] || colour.black) + str + colour.black; +} + +function strip(str) { + re.lastIndex = 0; // reset position + return str.replace(re, ''); +} + +colour.red = '\x1B[31m'; +colour.yellow = '\x1B[33m'; +colour.green = '\x1B[32m'; +colour.black = '\x1B[39m'; + +var reStr = Object.keys(colour).map(key => colour[key]).join('|'); +var re = new RegExp(('(' + reStr + ')').replace(/\[/g, '\\['), 'g'); + +colour.strip = strip; + +module.exports = colour; diff --git a/node_modules/nodemon/lib/utils/index.js b/node_modules/nodemon/lib/utils/index.js new file mode 100644 index 0000000..9265121 --- /dev/null +++ b/node_modules/nodemon/lib/utils/index.js @@ -0,0 +1,103 @@ +var noop = function () { }; +var path = require('path'); +const semver = require('semver'); +var version = process.versions.node.split('.') || [null, null, null]; + +var utils = (module.exports = { + semver: semver, + satisfies: test => semver.satisfies(process.versions.node, test), + version: { + major: parseInt(version[0] || 0, 10), + minor: parseInt(version[1] || 0, 10), + patch: parseInt(version[2] || 0, 10), + }, + clone: require('./clone'), + merge: require('./merge'), + bus: require('./bus'), + isWindows: process.platform === 'win32', + isMac: process.platform === 'darwin', + isLinux: process.platform === 'linux', + isIBMi: require('os').type() === 'OS400', + isRequired: (function () { + var p = module.parent; + while (p) { + // in electron.js engine it happens + if (!p.filename) { + return true; + } + if (p.filename.indexOf('bin' + path.sep + 'nodemon.js') !== -1) { + return false; + } + p = p.parent; + } + + return true; + })(), + home: process.env.HOME || process.env.HOMEPATH, + quiet: function () { + // nukes the logging + if (!this.debug) { + for (var method in utils.log) { + if (typeof utils.log[method] === 'function') { + utils.log[method] = noop; + } + } + } + }, + reset: function () { + if (!this.debug) { + for (var method in utils.log) { + if (typeof utils.log[method] === 'function') { + delete utils.log[method]; + } + } + } + this.debug = false; + }, + regexpToText: function (t) { + return t + .replace(/\.\*\\./g, '*.') + .replace(/\\{2}/g, '^^') + .replace(/\\/g, '') + .replace(/\^\^/g, '\\'); + }, + stringify: function (exec, args) { + // serializes an executable string and array of arguments into a string + args = args || []; + + return [exec] + .concat( + args.map(function (arg) { + // if an argument contains a space, we want to show it with quotes + // around it to indicate that it is a single argument + if (arg.length > 0 && arg.indexOf(' ') === -1) { + return arg; + } + // this should correctly escape nested quotes + return JSON.stringify(arg); + }) + ) + .join(' ') + .trim(); + }, +}); + +utils.log = require('./log')(utils.isRequired); + +Object.defineProperty(utils, 'debug', { + set: function (value) { + this.log.debug = value; + }, + get: function () { + return this.log.debug; + }, +}); + +Object.defineProperty(utils, 'colours', { + set: function (value) { + this.log.useColours = value; + }, + get: function () { + return this.log.useColours; + }, +}); diff --git a/node_modules/nodemon/lib/utils/log.js b/node_modules/nodemon/lib/utils/log.js new file mode 100644 index 0000000..6580087 --- /dev/null +++ b/node_modules/nodemon/lib/utils/log.js @@ -0,0 +1,82 @@ +var colour = require('./colour'); +var bus = require('./bus'); +var required = false; +var useColours = true; + +var coding = { + log: 'black', + info: 'yellow', + status: 'green', + detail: 'yellow', + fail: 'red', + error: 'red', +}; + +function log(type, text) { + var msg = '[nodemon] ' + (text || ''); + + if (useColours) { + msg = colour(coding[type], msg); + } + + // always push the message through our bus, using nextTick + // to help testing and get _out of_ promises. + process.nextTick(() => { + bus.emit('log', { type: type, message: text, colour: msg }); + }); + + // but if we're running on the command line, also echo out + // question: should we actually just consume our own events? + if (!required) { + if (type === 'error') { + console.error(msg); + } else { + console.log(msg || ''); + } + } +} + +var Logger = function (r) { + if (!(this instanceof Logger)) { + return new Logger(r); + } + this.required(r); + return this; +}; + +Object.keys(coding).forEach(function (type) { + Logger.prototype[type] = log.bind(null, type); +}); + +// detail is for messages that are turned on during debug +Logger.prototype.detail = function (msg) { + if (this.debug) { + log('detail', msg); + } +}; + +Logger.prototype.required = function (val) { + required = val; +}; + +Logger.prototype.debug = false; +Logger.prototype._log = function (type, msg) { + if (required) { + bus.emit('log', { type: type, message: msg || '', colour: msg || '' }); + } else if (type === 'error') { + console.error(msg); + } else { + console.log(msg || ''); + } +}; + +Object.defineProperty(Logger.prototype, 'useColours', { + set: function (val) { + useColours = val; + }, + get: function () { + return useColours; + }, +}); + +module.exports = Logger; diff --git a/node_modules/nodemon/lib/utils/merge.js b/node_modules/nodemon/lib/utils/merge.js new file mode 100644 index 0000000..1f3440b --- /dev/null +++ b/node_modules/nodemon/lib/utils/merge.js @@ -0,0 +1,47 @@ +var clone = require('./clone'); + +module.exports = merge; + +function typesMatch(a, b) { + return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b)); +} + +/** + * A deep merge of the source based on the target. + * @param {Object} source [description] + * @param {Object} target [description] + * @return {Object} [description] + */ +function merge(source, target, result) { + if (result === undefined) { + result = clone(source); + } + + // merge missing values from the target to the source + Object.getOwnPropertyNames(target).forEach(function (key) { + if (source[key] === undefined) { + result[key] = target[key]; + } + }); + + Object.getOwnPropertyNames(source).forEach(function (key) { + var value = source[key]; + + if (target[key] && typesMatch(value, target[key])) { + // merge empty values + if (value === '') { + result[key] = target[key]; + } + + if (Array.isArray(value)) { + if (value.length === 0 && target[key].length) { + result[key] = target[key].slice(0); + } + } else if (typeof value === 'object') { + result[key] = merge(value, target[key]); + } + } + }); + + return result; +} \ No newline at end of file diff --git a/node_modules/nodemon/lib/version.js b/node_modules/nodemon/lib/version.js new file mode 100644 index 0000000..d0f5104 --- /dev/null +++ b/node_modules/nodemon/lib/version.js @@ -0,0 +1,100 @@ +module.exports = version; +module.exports.pin = pin; + +var fs = require('fs'); +var path = require('path'); +var exec = require('child_process').exec; +var root = null; + +function pin() { + return version().then(function (v) { + version.pinned = v; + }); +} + +function version(callback) { + // first find the package.json as this will be our root + var promise = findPackage(path.dirname(module.parent.filename)) + .then(function (dir) { + // now try to load the package + var v = require(path.resolve(dir, 'package.json')).version; + + if (v && v !== '0.0.0-development') { + return v; + } + + root = dir; + + // else we're in development, give the commit out + // get the last commit and whether the working dir is dirty + var promises = [ + branch().catch(function () { return 'master'; }), + commit().catch(function () { return ''; }), + dirty().catch(function () { return 0; }), + ]; + + // use the cached result as the export + return Promise.all(promises).then(function (res) { + var branch = res[0]; + var commit = res[1]; + var dirtyCount = parseInt(res[2], 10); + var curr = branch + ': ' + commit; + if (dirtyCount !== 0) { + curr += ' (' + dirtyCount + ' dirty files)'; + } + + return curr; + }); + }).catch(function (error) { + console.log(error.stack); + throw error; + }); + + if (callback) { + promise.then(function (res) { + callback(null, res); + }, callback); + } + + return promise; +} + +function findPackage(dir) { + if (dir === '/') { + return Promise.reject(new Error('package not found')); + } + return new Promise(function (resolve) { + fs.stat(path.resolve(dir, 'package.json'), function (error, exists) { + if (error || !exists) { + return resolve(findPackage(path.resolve(dir, '..'))); + } + + resolve(dir); + }); + }); +} + +function command(cmd) { + return new Promise(function (resolve, reject) { + exec(cmd, { cwd: root }, function (err, stdout, stderr) { + var error = stderr.trim(); + if (error) { + return reject(new Error(error)); + } + resolve(stdout.split('\n').join('')); + }); + }); +} + +function commit() { + return command('git rev-parse HEAD'); +} + +function branch() { + return command('git rev-parse --abbrev-ref HEAD'); +} + +function dirty() { + return command('expr $(git status --porcelain 2>/dev/null| ' + + 'egrep "^(M| M)" | wc -l)'); +} diff --git a/node_modules/nodemon/node_modules/debug/LICENSE b/node_modules/nodemon/node_modules/debug/LICENSE new file mode 100644 index 0000000..1a9820e --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/node_modules/nodemon/node_modules/debug/README.md b/node_modules/nodemon/node_modules/debug/README.md new file mode 100644 index 0000000..e9c3e04 --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/README.md @@ -0,0 +1,481 @@ +# debug +[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny JavaScript debugging utility modelled after Node.js core's debugging +technique. Works in Node.js and web browsers. + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example [_app.js_](./examples/node/app.js): + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %o', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example [_worker.js_](./examples/node/worker.js): + +```js +var a = require('debug')('worker:a') + , b = require('debug')('worker:b'); + +function work() { + a('doing lots of uninteresting work'); + setTimeout(work, Math.random() * 1000); +} + +work(); + +function workb() { + b('doing some work'); + setTimeout(workb, Math.random() * 2000); +} + +workb(); +``` + +The `DEBUG` environment variable is then used to enable these based on space or +comma-delimited names. + +Here are some examples: + +screen shot 2017-08-08 at 12 53 04 pm +screen shot 2017-08-08 at 12 53 38 pm +screen shot 2017-08-08 at 12 53 25 pm + +#### Windows command prompt notes + +##### CMD + +On Windows the environment variable is set using the `set` command. + +```cmd +set DEBUG=*,-not_this +``` + +Example: + +```cmd +set DEBUG=* & node app.js +``` + +##### PowerShell (VS Code default) + +PowerShell uses different syntax to set environment variables. + +```cmd +$env:DEBUG = "*,-not_this" +``` + +Example: + +```cmd +$env:DEBUG='app';node app.js +``` + +Then, run the program to be debugged as usual. + +npm script example: +```js + "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js", +``` + +## Namespace Colors + +Every debug instance has a color generated for it based on its namespace name. +This helps when visually parsing the debug output to identify which debug instance +a debug line belongs to. + +#### Node.js + +In Node.js, colors are enabled when stderr is a TTY. You also _should_ install +the [`supports-color`](https://npmjs.org/supports-color) module alongside debug, +otherwise debug will only use a small handful of basic colors. + + + +#### Web Browser + +Colors are also enabled on "Web Inspectors" that understand the `%c` formatting +option. These are WebKit web inspectors, Firefox ([since version +31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) +and the Firebug plugin for Firefox (any version). + + + + +## Millisecond diff + +When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + + +When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below: + + + + +## Conventions + +If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output. + +## Wildcards + +The `*` character may be used as a wildcard. Suppose for example your library has +debuggers named "connect:bodyParser", "connect:compress", "connect:session", +instead of listing all three with +`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do +`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + +You can also exclude specific debuggers by prefixing them with a "-" character. +For example, `DEBUG=*,-connect:*` would include all debuggers except those +starting with "connect:". + +## Environment Variables + +When running through Node.js, you can set a few environment variables that will +change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + +__Note:__ The environment variables beginning with `DEBUG_` end up being +converted into an Options object that gets used with `%o`/`%O` formatters. +See the Node.js documentation for +[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) +for the complete list. + +## Formatters + +Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. +Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + + +### Custom formatters + +You can add custom formatters by extending the `debug.formatters` object. +For example, if you wanted to add support for rendering a Buffer as hex with +`%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + + +## Browser Support + +You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), +or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), +if you don't want to build it yourself. + +Debug's enable state is currently persisted by `localStorage`. +Consider the situation shown below where you have `worker:a` and `worker:b`, +and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_. + + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example [_stdout.js_](./examples/node/stdout.js): + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + +## Extend +You can simply extend debugger +```js +const log = require('debug')('auth'); + +//creates new debug instance with extended namespace +const logSign = log.extend('sign'); +const logLogin = log.extend('login'); + +log('hello'); // auth hello +logSign('hello'); //auth:sign hello +logLogin('hello'); //auth:login hello +``` + +## Set dynamically + +You can also enable debug dynamically by calling the `enable()` method : + +```js +let debug = require('debug'); + +console.log(1, debug.enabled('test')); + +debug.enable('test'); +console.log(2, debug.enabled('test')); + +debug.disable(); +console.log(3, debug.enabled('test')); + +``` + +print : +``` +1 false +2 true +3 false +``` + +Usage : +`enable(namespaces)` +`namespaces` can include modes separated by a colon and wildcards. + +Note that calling `enable()` completely overrides previously set DEBUG variable : + +``` +$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' +=> false +``` + +`disable()` + +Will disable all namespaces. The functions returns the namespaces currently +enabled (and skipped). This can be useful if you want to disable debugging +temporarily without knowing what was enabled to begin with. + +For example: + +```js +let debug = require('debug'); +debug.enable('foo:*,-foo:bar'); +let namespaces = debug.disable(); +debug.enable(namespaces); +``` + +Note: There is no guarantee that the string will be identical to the initial +enable string, but semantically they will be identical. + +## Checking whether a debug target is enabled + +After you've created a debug instance, you can determine whether or not it is +enabled by checking the `enabled` property: + +```javascript +const debug = require('debug')('http'); + +if (debug.enabled) { + // do stuff... +} +``` + +You can also manually toggle this property to force the debug instance to be +enabled or disabled. + +## Usage in child processes + +Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process. +For example: + +```javascript +worker = fork(WORKER_WRAP_PATH, [workerPath], { + stdio: [ + /* stdin: */ 0, + /* stdout: */ 'pipe', + /* stderr: */ 'pipe', + 'ipc', + ], + env: Object.assign({}, process.env, { + DEBUG_COLORS: 1 // without this settings, colors won't be shown + }), +}); + +worker.stderr.pipe(process.stderr, { end: false }); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + - Josh Junon + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2018-2021 Josh Junon + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/nodemon/node_modules/debug/package.json b/node_modules/nodemon/node_modules/debug/package.json new file mode 100644 index 0000000..3bcdc24 --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/package.json @@ -0,0 +1,59 @@ +{ + "name": "debug", + "version": "4.3.4", + "repository": { + "type": "git", + "url": "git://github.com/debug-js/debug.git" + }, + "description": "Lightweight debugging utility for Node.js and the browser", + "keywords": [ + "debug", + "log", + "debugger" + ], + "files": [ + "src", + "LICENSE", + "README.md" + ], + "author": "Josh Junon ", + "contributors": [ + "TJ Holowaychuk ", + "Nathan Rajlich (http://n8.io)", + "Andrew Rhyne " + ], + "license": "MIT", + "scripts": { + "lint": "xo", + "test": "npm run test:node && npm run test:browser && npm run lint", + "test:node": "istanbul cover _mocha -- test.js", + "test:browser": "karma start --single-run", + "test:coverage": "cat ./coverage/lcov.info | coveralls" + }, + "dependencies": { + "ms": "2.1.2" + }, + "devDependencies": { + "brfs": "^2.0.1", + "browserify": "^16.2.3", + "coveralls": "^3.0.2", + "istanbul": "^0.4.5", + "karma": "^3.1.4", + "karma-browserify": "^6.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-mocha": "^1.3.0", + "mocha": "^5.2.0", + "mocha-lcov-reporter": "^1.2.0", + "xo": "^0.23.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + }, + "main": "./src/index.js", + "browser": "./src/browser.js", + "engines": { + "node": ">=6.0" + } +} diff --git a/node_modules/nodemon/node_modules/debug/src/browser.js b/node_modules/nodemon/node_modules/debug/src/browser.js new file mode 100644 index 0000000..cd0fc35 --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/src/browser.js @@ -0,0 +1,269 @@ +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ + +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); +exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; +})(); + +/** + * Colors. + */ + +exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +// eslint-disable-next-line complexity +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ +exports.log = console.debug || console.log || (() => {}); + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; diff --git a/node_modules/nodemon/node_modules/debug/src/common.js b/node_modules/nodemon/node_modules/debug/src/common.js new file mode 100644 index 0000000..e3291b2 --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/src/common.js @@ -0,0 +1,274 @@ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + +function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require('ms'); + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + + return enabledCache; + }, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; +} + +module.exports = setup; diff --git a/node_modules/nodemon/node_modules/debug/src/index.js b/node_modules/nodemon/node_modules/debug/src/index.js new file mode 100644 index 0000000..bf4c57f --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/node_modules/nodemon/node_modules/debug/src/node.js b/node_modules/nodemon/node_modules/debug/src/node.js new file mode 100644 index 0000000..79bc085 --- /dev/null +++ b/node_modules/nodemon/node_modules/debug/src/node.js @@ -0,0 +1,263 @@ +/** + * Module dependencies. + */ + +const tty = require('tty'); +const util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util.deprecate( + () => {}, + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' +); + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = require('supports-color'); + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty.isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util.format(...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; diff --git a/node_modules/nodemon/node_modules/ms/index.js b/node_modules/nodemon/node_modules/ms/index.js new file mode 100644 index 0000000..c4498bc --- /dev/null +++ b/node_modules/nodemon/node_modules/ms/index.js @@ -0,0 +1,162 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} diff --git a/node_modules/nodemon/node_modules/ms/license.md b/node_modules/nodemon/node_modules/ms/license.md new file mode 100644 index 0000000..69b6125 --- /dev/null +++ b/node_modules/nodemon/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/nodemon/node_modules/ms/package.json b/node_modules/nodemon/node_modules/ms/package.json new file mode 100644 index 0000000..eea666e --- /dev/null +++ b/node_modules/nodemon/node_modules/ms/package.json @@ -0,0 +1,37 @@ +{ + "name": "ms", + "version": "2.1.2", + "description": "Tiny millisecond conversion utility", + "repository": "zeit/ms", + "main": "./index", + "files": [ + "index.js" + ], + "scripts": { + "precommit": "lint-staged", + "lint": "eslint lib/* bin/*", + "test": "mocha tests.js" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "license": "MIT", + "devDependencies": { + "eslint": "4.12.1", + "expect.js": "0.3.1", + "husky": "0.14.3", + "lint-staged": "5.0.0", + "mocha": "4.0.1" + } +} diff --git a/node_modules/nodemon/node_modules/ms/readme.md b/node_modules/nodemon/node_modules/ms/readme.md new file mode 100644 index 0000000..9a1996b --- /dev/null +++ b/node_modules/nodemon/node_modules/ms/readme.md @@ -0,0 +1,60 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +ms('-3 days') // -259200000 +ms('-1h') // -3600000 +ms('-200') // -200 +``` + +### Convert from Milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(-3 * 60000) // "-3m" +ms(ms('10 hours')) // "10h" +``` + +### Time Format Written-Out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(-3 * 60000, { long: true }) // "-3 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [Node.js](https://nodejs.org) and in the browser +- If a number is supplied to `ms`, a string with a unit is returned +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned + +## Related Packages + +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node_modules/nodemon/package.json b/node_modules/nodemon/package.json new file mode 100644 index 0000000..bf64fc4 --- /dev/null +++ b/node_modules/nodemon/package.json @@ -0,0 +1,74 @@ +{ + "name": "nodemon", + "homepage": "https://nodemon.io", + "author": { + "name": "Remy Sharp", + "url": "https://github.com/remy" + }, + "bin": { + "nodemon": "./bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "repository": { + "type": "git", + "url": "https://github.com/remy/nodemon.git" + }, + "description": "Simple monitor script for use during development of a Node.js app.", + "keywords": [ + "cli", + "monitor", + "monitor", + "development", + "restart", + "autoload", + "reload", + "terminal" + ], + "license": "MIT", + "main": "./lib/nodemon", + "scripts": { + "commitmsg": "commitlint -e", + "coverage": "istanbul cover _mocha -- --timeout 30000 --ui bdd --reporter list test/**/*.test.js", + "lint": "eslint lib/**/*.js", + "test": "npm run lint && npm run spec", + "spec": "for FILE in test/**/*.test.js; do echo $FILE; TEST=1 mocha --exit --timeout 30000 $FILE; if [ $? -ne 0 ]; then exit 1; fi; sleep 1; done", + "postspec": "npm run clean", + "clean": "rm -rf test/fixtures/test*.js test/fixtures/test*.md", + "web": "node web", + "semantic-release": "semantic-release", + "prepush": "npm run lint", + "killall": "ps auxww | grep node | grep -v grep | awk '{ print $2 }' | xargs kill -9" + }, + "devDependencies": { + "@commitlint/cli": "^11.0.0", + "@commitlint/config-conventional": "^11.0.0", + "async": "1.4.2", + "coffee-script": "~1.7.1", + "eslint": "^7.32.0", + "husky": "^7.0.4", + "mocha": "^2.5.3", + "nyc": "^15.1.0", + "proxyquire": "^1.8.0", + "semantic-release": "^18.0.0", + "should": "~4.0.0" + }, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "version": "3.1.0", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } +} diff --git a/node_modules/nopt/.npmignore b/node_modules/nopt/.npmignore new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/nopt/LICENSE b/node_modules/nopt/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/nopt/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/nopt/README.md b/node_modules/nopt/README.md new file mode 100644 index 0000000..eeddfd4 --- /dev/null +++ b/node_modules/nopt/README.md @@ -0,0 +1,208 @@ +If you want to write an option parser, and have it be good, there are +two ways to do it. The Right Way, and the Wrong Way. + +The Wrong Way is to sit down and write an option parser. We've all done +that. + +The Right Way is to write some complex configurable program with so many +options that you go half-insane just trying to manage them all, and put +it off with duct-tape solutions until you see exactly to the core of the +problem, and finally snap and write an awesome option parser. + +If you want to write an option parser, don't write an option parser. +Write a package manager, or a source control system, or a service +restarter, or an operating system. You probably won't end up with a +good one of those, but if you don't give up, and you are relentless and +diligent enough in your procrastination, you may just end up with a very +nice option parser. + +## USAGE + + // my-program.js + var nopt = require("nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + , "many" : [String, Array] + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag"] + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + console.log(parsed) + +This would give you support for any of the following: + +```bash +$ node my-program.js --foo "blerp" --no-flag +{ "foo" : "blerp", "flag" : false } + +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag +{ bar: 7, foo: "Mr. Hand", flag: true } + +$ node my-program.js --foo "blerp" -f -----p +{ foo: "blerp", flag: true, pick: true } + +$ node my-program.js -fp --foofoo +{ foo: "Mr. Foo", flag: true, pick: true } + +$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } + +$ node my-program.js --blatzk 1000 -fp # unknown opts are ok. +{ blatzk: 1000, flag: true, pick: true } + +$ node my-program.js --blatzk true -fp # but they need a value +{ blatzk: true, flag: true, pick: true } + +$ node my-program.js --no-blatzk -fp # unless they start with "no-" +{ blatzk: false, flag: true, pick: true } + +$ node my-program.js --baz b/a/z # known paths are resolved. +{ baz: "/Users/isaacs/b/a/z" } + +# if Array is one of the types, then it can take many +# values, and will always be an array. The other types provided +# specify what types are allowed in the list. + +$ node my-program.js --many 1 --many null --many foo +{ many: ["1", "null", "foo"] } + +$ node my-program.js --many foo +{ many: ["foo"] } +``` + +Read the tests at the bottom of `lib/nopt.js` for more examples of +what this puppy can do. + +## Types + +The following types are supported, and defined on `nopt.typeDefs` + +* String: A normal string. No parsing is done. +* path: A file system path. Gets resolved against cwd if not absolute. +* url: A url. If it doesn't parse, it isn't accepted. +* Number: Must be numeric. +* Date: Must parse as a date. If it does, and `Date` is one of the options, + then it will return a Date object, not a string. +* Boolean: Must be either `true` or `false`. If an option is a boolean, + then it does not need a value, and its presence will imply `true` as + the value. To negate boolean flags, do `--no-whatever` or `--whatever + false` +* NaN: Means that the option is strictly not allowed. Any value will + fail. +* Stream: An object matching the "Stream" class in node. Valuable + for use when validating programmatically. (npm uses this to let you + supply any WriteStream on the `outfd` and `logfd` config options.) +* Array: If `Array` is specified as one of the types, then the value + will be parsed as a list of options. This means that multiple values + can be specified, and that the value will always be an array. + +If a type is an array of values not on this list, then those are +considered valid values. For instance, in the example above, the +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, +and any other value will be rejected. + +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be +interpreted as their JavaScript equivalents, and numeric values will be +interpreted as a number. + +You can also mix types and values, or multiple types, in a list. For +instance `{ blah: [Number, null] }` would allow a value to be set to +either a Number or null. + +To define a new type, add it to `nopt.typeDefs`. Each item in that +hash is an object with a `type` member and a `validate` method. The +`type` member is an object that matches what goes in the type list. The +`validate` method is a function that gets called with `validate(data, +key, val)`. Validate methods should assign `data[key]` to the valid +value of `val` if it can be handled properly, or return boolean +`false` if it cannot. + +You can also call `nopt.clean(data, types, typeDefs)` to clean up a +config object and remove its invalid properties. + +## Error Handling + +By default, nopt outputs a warning to standard error when invalid +options are found. You can change this behavior by assigning a method +to `nopt.invalidHandler`. This method will be called with +the offending `nopt.invalidHandler(key, val, types)`. + +If no `nopt.invalidHandler` is assigned, then it will console.error +its whining. If it is assigned to boolean `false` then the warning is +suppressed. + +## Abbreviations + +Yes, they are supported. If you define options like this: + +```javascript +{ "foolhardyelephants" : Boolean +, "pileofmonkeys" : Boolean } +``` + +Then this will work: + +```bash +node program.js --foolhar --pil +node program.js --no-f --pileofmon +# etc. +``` + +## Shorthands + +Shorthands are a hash of shorter option names to a snippet of args that +they expand to. + +If multiple one-character shorthands are all combined, and the +combination does not unambiguously match any other option or shorthand, +then they will be broken up into their constituent parts. For example: + +```json +{ "s" : ["--loglevel", "silent"] +, "g" : "--global" +, "f" : "--force" +, "p" : "--parseable" +, "l" : "--long" +} +``` + +```bash +npm ls -sgflp +# just like doing this: +npm ls --loglevel silent --global --force --long --parseable +``` + +## The Rest of the args + +The config object returned by nopt is given a special member called +`argv`, which is an object with the following fields: + +* `remain`: The remaining args after all the parsing has occurred. +* `original`: The args as they originally appeared. +* `cooked`: The args after flags and shorthands are expanded. + +## Slicing + +Node programs are called with more or less the exact argv as it appears +in C land, after the v8 and node-specific options have been plucked off. +As such, `argv[0]` is always `node` and `argv[1]` is always the +JavaScript program being run. + +That's usually not very useful to you. So they're sliced off by +default. If you want them, then you can pass in `0` as the last +argument, or any other number that you'd like to slice off the start of +the list. diff --git a/node_modules/nopt/bin/nopt.js b/node_modules/nopt/bin/nopt.js new file mode 100755 index 0000000..df90c72 --- /dev/null +++ b/node_modules/nopt/bin/nopt.js @@ -0,0 +1,44 @@ +#!/usr/bin/env node +var nopt = require("../lib/nopt") + , types = { num: Number + , bool: Boolean + , help: Boolean + , list: Array + , "num-list": [Number, Array] + , "str-list": [String, Array] + , "bool-list": [Boolean, Array] + , str: String } + , shorthands = { s: [ "--str", "astring" ] + , b: [ "--bool" ] + , nb: [ "--no-bool" ] + , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ] + , "?": ["--help"] + , h: ["--help"] + , H: ["--help"] + , n: [ "--num", "125" ] } + , parsed = nopt( types + , shorthands + , process.argv + , 2 ) + +console.log("parsed", parsed) + +if (parsed.help) { + console.log("") + console.log("nopt cli tester") + console.log("") + console.log("types") + console.log(Object.keys(types).map(function M (t) { + var type = types[t] + if (Array.isArray(type)) { + return [t, type.map(function (type) { return type.name })] + } + return [t, type && type.name] + }).reduce(function (s, i) { + s[i[0]] = i[1] + return s + }, {})) + console.log("") + console.log("shorthands") + console.log(shorthands) +} diff --git a/node_modules/nopt/examples/my-program.js b/node_modules/nopt/examples/my-program.js new file mode 100755 index 0000000..142447e --- /dev/null +++ b/node_modules/nopt/examples/my-program.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +//process.env.DEBUG_NOPT = 1 + +// my-program.js +var nopt = require("../lib/nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag", "true"] + , "g" : ["--flag"] + , "s" : "--flag" + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + +console.log("parsed =\n"+ require("util").inspect(parsed)) diff --git a/node_modules/nopt/lib/nopt.js b/node_modules/nopt/lib/nopt.js new file mode 100644 index 0000000..ff802da --- /dev/null +++ b/node_modules/nopt/lib/nopt.js @@ -0,0 +1,552 @@ +// info about each config option. + +var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG + ? function () { console.error.apply(console, arguments) } + : function () {} + +var url = require("url") + , path = require("path") + , Stream = require("stream").Stream + , abbrev = require("abbrev") + +module.exports = exports = nopt +exports.clean = clean + +exports.typeDefs = + { String : { type: String, validate: validateString } + , Boolean : { type: Boolean, validate: validateBoolean } + , url : { type: url, validate: validateUrl } + , Number : { type: Number, validate: validateNumber } + , path : { type: path, validate: validatePath } + , Stream : { type: Stream, validate: validateStream } + , Date : { type: Date, validate: validateDate } + } + +function nopt (types, shorthands, args, slice) { + args = args || process.argv + types = types || {} + shorthands = shorthands || {} + if (typeof slice !== "number") slice = 2 + + debug(types, shorthands, args, slice) + + args = args.slice(slice) + var data = {} + , key + , remain = [] + , cooked = args + , original = args.slice(0) + + parse(args, data, remain, types, shorthands) + // now data is full + clean(data, types, exports.typeDefs) + data.argv = {remain:remain,cooked:cooked,original:original} + data.argv.toString = function () { + return this.original.map(JSON.stringify).join(" ") + } + return data +} + +function clean (data, types, typeDefs) { + typeDefs = typeDefs || exports.typeDefs + var remove = {} + , typeDefault = [false, true, null, String, Number] + + Object.keys(data).forEach(function (k) { + if (k === "argv") return + var val = data[k] + , isArray = Array.isArray(val) + , type = types[k] + if (!isArray) val = [val] + if (!type) type = typeDefault + if (type === Array) type = typeDefault.concat(Array) + if (!Array.isArray(type)) type = [type] + + debug("val=%j", val) + debug("types=", type) + val = val.map(function (val) { + // if it's an unknown value, then parse false/true/null/numbers/dates + if (typeof val === "string") { + debug("string %j", val) + val = val.trim() + if ((val === "null" && ~type.indexOf(null)) + || (val === "true" && + (~type.indexOf(true) || ~type.indexOf(Boolean))) + || (val === "false" && + (~type.indexOf(false) || ~type.indexOf(Boolean)))) { + val = JSON.parse(val) + debug("jsonable %j", val) + } else if (~type.indexOf(Number) && !isNaN(val)) { + debug("convert to number", val) + val = +val + } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) { + debug("convert to date", val) + val = new Date(val) + } + } + + if (!types.hasOwnProperty(k)) { + return val + } + + // allow `--no-blah` to set 'blah' to null if null is allowed + if (val === false && ~type.indexOf(null) && + !(~type.indexOf(false) || ~type.indexOf(Boolean))) { + val = null + } + + var d = {} + d[k] = val + debug("prevalidated val", d, val, types[k]) + if (!validate(d, k, val, types[k], typeDefs)) { + if (exports.invalidHandler) { + exports.invalidHandler(k, val, types[k], data) + } else if (exports.invalidHandler !== false) { + debug("invalid: "+k+"="+val, types[k]) + } + return remove + } + debug("validated val", d, val, types[k]) + return d[k] + }).filter(function (val) { return val !== remove }) + + if (!val.length) delete data[k] + else if (isArray) { + debug(isArray, data[k], val) + data[k] = val + } else data[k] = val[0] + + debug("k=%s val=%j", k, val, data[k]) + }) +} + +function validateString (data, k, val) { + data[k] = String(val) +} + +function validatePath (data, k, val) { + data[k] = path.resolve(String(val)) + return true +} + +function validateNumber (data, k, val) { + debug("validate Number %j %j %j", k, val, isNaN(val)) + if (isNaN(val)) return false + data[k] = +val +} + +function validateDate (data, k, val) { + debug("validate Date %j %j %j", k, val, Date.parse(val)) + var s = Date.parse(val) + if (isNaN(s)) return false + data[k] = new Date(val) +} + +function validateBoolean (data, k, val) { + if (val instanceof Boolean) val = val.valueOf() + else if (typeof val === "string") { + if (!isNaN(val)) val = !!(+val) + else if (val === "null" || val === "false") val = false + else val = true + } else val = !!val + data[k] = val +} + +function validateUrl (data, k, val) { + val = url.parse(String(val)) + if (!val.host) return false + data[k] = val.href +} + +function validateStream (data, k, val) { + if (!(val instanceof Stream)) return false + data[k] = val +} + +function validate (data, k, val, type, typeDefs) { + // arrays are lists of types. + if (Array.isArray(type)) { + for (var i = 0, l = type.length; i < l; i ++) { + if (type[i] === Array) continue + if (validate(data, k, val, type[i], typeDefs)) return true + } + delete data[k] + return false + } + + // an array of anything? + if (type === Array) return true + + // NaN is poisonous. Means that something is not allowed. + if (type !== type) { + debug("Poison NaN", k, val, type) + delete data[k] + return false + } + + // explicit list of values + if (val === type) { + debug("Explicitly allowed %j", val) + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + return true + } + + // now go through the list of typeDefs, validate against each one. + var ok = false + , types = Object.keys(typeDefs) + for (var i = 0, l = types.length; i < l; i ++) { + debug("test type %j %j %j", k, val, types[i]) + var t = typeDefs[types[i]] + if (t && type === t.type) { + var d = {} + ok = false !== t.validate(d, k, val) + val = d[k] + if (ok) { + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + break + } + } + } + debug("OK? %j (%j %j %j)", ok, k, val, types[i]) + + if (!ok) delete data[k] + return ok +} + +function parse (args, data, remain, types, shorthands) { + debug("parse", args, data, remain) + + var key = null + , abbrevs = abbrev(Object.keys(types)) + , shortAbbr = abbrev(Object.keys(shorthands)) + + for (var i = 0; i < args.length; i ++) { + var arg = args[i] + debug("arg", arg) + + if (arg.match(/^-{2,}$/)) { + // done with keys. + // the rest are args. + remain.push.apply(remain, args.slice(i + 1)) + args[i] = "--" + break + } + if (arg.charAt(0) === "-") { + if (arg.indexOf("=") !== -1) { + var v = arg.split("=") + arg = v.shift() + v = v.join("=") + args.splice.apply(args, [i, 1].concat([arg, v])) + } + // see if it's a shorthand + // if so, splice and back up to re-parse it. + var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs) + debug("arg=%j shRes=%j", arg, shRes) + if (shRes) { + debug(arg, shRes) + args.splice.apply(args, [i, 1].concat(shRes)) + if (arg !== shRes[0]) { + i -- + continue + } + } + arg = arg.replace(/^-+/, "") + var no = false + while (arg.toLowerCase().indexOf("no-") === 0) { + no = !no + arg = arg.substr(3) + } + + if (abbrevs[arg]) arg = abbrevs[arg] + + var isArray = types[arg] === Array || + Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 + + var val + , la = args[i + 1] + + var isBool = no || + types[arg] === Boolean || + Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || + (la === "false" && + (types[arg] === null || + Array.isArray(types[arg]) && ~types[arg].indexOf(null))) + + if (isBool) { + // just set and move along + val = !no + // however, also support --bool true or --bool false + if (la === "true" || la === "false") { + val = JSON.parse(la) + la = null + if (no) val = !val + i ++ + } + + // also support "foo":[Boolean, "bar"] and "--foo bar" + if (Array.isArray(types[arg]) && la) { + if (~types[arg].indexOf(la)) { + // an explicit type + val = la + i ++ + } else if ( la === "null" && ~types[arg].indexOf(null) ) { + // null allowed + val = null + i ++ + } else if ( !la.match(/^-{2,}[^-]/) && + !isNaN(la) && + ~types[arg].indexOf(Number) ) { + // number + val = +la + i ++ + } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { + // string + val = la + i ++ + } + } + + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + continue + } + + if (la && la.match(/^-{2,}$/)) { + la = undefined + i -- + } + + val = la === undefined ? true : la + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + i ++ + continue + } + remain.push(arg) + } +} + +function resolveShort (arg, shorthands, shortAbbr, abbrevs) { + // handle single-char shorthands glommed together, like + // npm ls -glp, but only if there is one dash, and only if + // all of the chars are single-char shorthands, and it's + // not a match to some other abbrev. + arg = arg.replace(/^-+/, '') + if (abbrevs[arg] && !shorthands[arg]) { + return null + } + if (shortAbbr[arg]) { + arg = shortAbbr[arg] + } else { + var singles = shorthands.___singles + if (!singles) { + singles = Object.keys(shorthands).filter(function (s) { + return s.length === 1 + }).reduce(function (l,r) { l[r] = true ; return l }, {}) + shorthands.___singles = singles + } + var chrs = arg.split("").filter(function (c) { + return singles[c] + }) + if (chrs.join("") === arg) return chrs.map(function (c) { + return shorthands[c] + }).reduce(function (l, r) { + return l.concat(r) + }, []) + } + + if (shorthands[arg] && !Array.isArray(shorthands[arg])) { + shorthands[arg] = shorthands[arg].split(/\s+/) + } + return shorthands[arg] +} + +if (module === require.main) { +var assert = require("assert") + , util = require("util") + + , shorthands = + { s : ["--loglevel", "silent"] + , d : ["--loglevel", "info"] + , dd : ["--loglevel", "verbose"] + , ddd : ["--loglevel", "silly"] + , noreg : ["--no-registry"] + , reg : ["--registry"] + , "no-reg" : ["--no-registry"] + , silent : ["--loglevel", "silent"] + , verbose : ["--loglevel", "verbose"] + , h : ["--usage"] + , H : ["--usage"] + , "?" : ["--usage"] + , help : ["--usage"] + , v : ["--version"] + , f : ["--force"] + , desc : ["--description"] + , "no-desc" : ["--no-description"] + , "local" : ["--no-global"] + , l : ["--long"] + , p : ["--parseable"] + , porcelain : ["--parseable"] + , g : ["--global"] + } + + , types = + { aoa: Array + , nullstream: [null, Stream] + , date: Date + , str: String + , browser : String + , cache : path + , color : ["always", Boolean] + , depth : Number + , description : Boolean + , dev : Boolean + , editor : path + , force : Boolean + , global : Boolean + , globalconfig : path + , group : [String, Number] + , gzipbin : String + , logfd : [Number, Stream] + , loglevel : ["silent","win","error","warn","info","verbose","silly"] + , long : Boolean + , "node-version" : [false, String] + , npaturl : url + , npat : Boolean + , "onload-script" : [false, String] + , outfd : [Number, Stream] + , parseable : Boolean + , pre: Boolean + , prefix: path + , proxy : url + , "rebuild-bundle" : Boolean + , registry : url + , searchopts : String + , searchexclude: [null, String] + , shell : path + , t: [Array, String] + , tag : String + , tar : String + , tmp : path + , "unsafe-perm" : Boolean + , usage : Boolean + , user : String + , username : String + , userconfig : path + , version : Boolean + , viewer: path + , _exit : Boolean + } + +; [["-v", {version:true}, []] + ,["---v", {version:true}, []] + ,["ls -s --no-reg connect -d", + {loglevel:"info",registry:null},["ls","connect"]] + ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]] + ,["ls --registry blargle", {}, ["ls"]] + ,["--no-registry", {registry:null}, []] + ,["--no-color true", {color:false}, []] + ,["--no-color false", {color:true}, []] + ,["--no-color", {color:false}, []] + ,["--color false", {color:false}, []] + ,["--color --logfd 7", {logfd:7,color:true}, []] + ,["--color=true", {color:true}, []] + ,["--logfd=10", {logfd:10}, []] + ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] + ,["--tmp=tmp -tar=gtar", + {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] + ,["--logfd x", {}, []] + ,["a -true -- -no-false", {true:true},["a","-no-false"]] + ,["a -no-false", {false:false},["a"]] + ,["a -no-no-true", {true:true}, ["a"]] + ,["a -no-no-no-false", {false:false}, ["a"]] + ,["---NO-no-No-no-no-no-nO-no-no"+ + "-No-no-no-no-no-no-no-no-no"+ + "-no-no-no-no-NO-NO-no-no-no-no-no-no"+ + "-no-body-can-do-the-boogaloo-like-I-do" + ,{"body-can-do-the-boogaloo-like-I-do":false}, []] + ,["we are -no-strangers-to-love "+ + "--you-know the-rules --and so-do-i "+ + "---im-thinking-of=a-full-commitment "+ + "--no-you-would-get-this-from-any-other-guy "+ + "--no-gonna-give-you-up "+ + "-no-gonna-let-you-down=true "+ + "--no-no-gonna-run-around false "+ + "--desert-you=false "+ + "--make-you-cry false "+ + "--no-tell-a-lie "+ + "--no-no-and-hurt-you false" + ,{"strangers-to-love":false + ,"you-know":"the-rules" + ,"and":"so-do-i" + ,"you-would-get-this-from-any-other-guy":false + ,"gonna-give-you-up":false + ,"gonna-let-you-down":false + ,"gonna-run-around":false + ,"desert-you":false + ,"make-you-cry":false + ,"tell-a-lie":false + ,"and-hurt-you":false + },["we", "are"]] + ,["-t one -t two -t three" + ,{t: ["one", "two", "three"]} + ,[]] + ,["-t one -t null -t three four five null" + ,{t: ["one", "null", "three"]} + ,["four", "five", "null"]] + ,["-t foo" + ,{t:["foo"]} + ,[]] + ,["--no-t" + ,{t:["false"]} + ,[]] + ,["-no-no-t" + ,{t:["true"]} + ,[]] + ,["-aoa one -aoa null -aoa 100" + ,{aoa:["one", null, 100]} + ,[]] + ,["-str 100" + ,{str:"100"} + ,[]] + ,["--color always" + ,{color:"always"} + ,[]] + ,["--no-nullstream" + ,{nullstream:null} + ,[]] + ,["--nullstream false" + ,{nullstream:null} + ,[]] + ,["--notadate 2011-01-25" + ,{notadate: "2011-01-25"} + ,[]] + ,["--date 2011-01-25" + ,{date: new Date("2011-01-25")} + ,[]] + ].forEach(function (test) { + var argv = test[0].split(/\s+/) + , opts = test[1] + , rem = test[2] + , actual = nopt(types, shorthands, argv, 0) + , parsed = actual.argv + delete actual.argv + console.log(util.inspect(actual, false, 2, true), parsed.remain) + for (var i in opts) { + var e = JSON.stringify(opts[i]) + , a = JSON.stringify(actual[i] === undefined ? null : actual[i]) + if (e && typeof e === "object") { + assert.deepEqual(e, a) + } else { + assert.equal(e, a) + } + } + assert.deepEqual(rem, parsed.remain) + }) +} diff --git a/node_modules/nopt/package.json b/node_modules/nopt/package.json new file mode 100644 index 0000000..d1118e3 --- /dev/null +++ b/node_modules/nopt/package.json @@ -0,0 +1,12 @@ +{ "name" : "nopt" +, "version" : "1.0.10" +, "description" : "Option parsing for Node, supporting types, shorthands, etc. Used by npm." +, "author" : "Isaac Z. Schlueter (http://blog.izs.me/)" +, "main" : "lib/nopt.js" +, "scripts" : { "test" : "node lib/nopt.js" } +, "repository" : "http://github.com/isaacs/nopt" +, "bin" : "./bin/nopt.js" +, "license" : + { "type" : "MIT" + , "url" : "https://github.com/isaacs/nopt/raw/master/LICENSE" } +, "dependencies" : { "abbrev" : "1" }} diff --git a/node_modules/normalize-path/LICENSE b/node_modules/normalize-path/LICENSE new file mode 100644 index 0000000..d32ab44 --- /dev/null +++ b/node_modules/normalize-path/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/normalize-path/README.md b/node_modules/normalize-path/README.md new file mode 100644 index 0000000..726d4d6 --- /dev/null +++ b/node_modules/normalize-path/README.md @@ -0,0 +1,127 @@ +# normalize-path [![NPM version](https://img.shields.io/npm/v/normalize-path.svg?style=flat)](https://www.npmjs.com/package/normalize-path) [![NPM monthly downloads](https://img.shields.io/npm/dm/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![NPM total downloads](https://img.shields.io/npm/dt/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/normalize-path.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/normalize-path) + +> Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save normalize-path +``` + +## Usage + +```js +const normalize = require('normalize-path'); + +console.log(normalize('\\foo\\bar\\baz\\')); +//=> '/foo/bar/baz' +``` + +**win32 namespaces** + +```js +console.log(normalize('\\\\?\\UNC\\Server01\\user\\docs\\Letter.txt')); +//=> '//?/UNC/Server01/user/docs/Letter.txt' + +console.log(normalize('\\\\.\\CdRomX')); +//=> '//./CdRomX' +``` + +**Consecutive slashes** + +Condenses multiple consecutive forward slashes (except for leading slashes in win32 namespaces) to a single slash. + +```js +console.log(normalize('.//foo//bar///////baz/')); +//=> './foo/bar/baz' +``` + +### Trailing slashes + +By default trailing slashes are removed. Pass `false` as the last argument to disable this behavior and _**keep** trailing slashes_: + +```js +console.log(normalize('foo\\bar\\baz\\', false)); //=> 'foo/bar/baz/' +console.log(normalize('./foo/bar/baz/', false)); //=> './foo/bar/baz/' +``` + +## Release history + +### v3.0 + +No breaking changes in this release. + +* a check was added to ensure that [win32 namespaces](https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces) are handled properly by win32 `path.parse()` after a path has been normalized by this library. +* a minor optimization was made to simplify how the trailing separator was handled + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Related projects + +Other useful path-related libraries: + +* [contains-path](https://www.npmjs.com/package/contains-path): Return true if a file path contains the given path. | [homepage](https://github.com/jonschlinkert/contains-path "Return true if a file path contains the given path.") +* [is-absolute](https://www.npmjs.com/package/is-absolute): Returns true if a file path is absolute. Does not rely on the path module… [more](https://github.com/jonschlinkert/is-absolute) | [homepage](https://github.com/jonschlinkert/is-absolute "Returns true if a file path is absolute. Does not rely on the path module and can be used as a polyfill for node.js native `path.isAbolute`.") +* [is-relative](https://www.npmjs.com/package/is-relative): Returns `true` if the path appears to be relative. | [homepage](https://github.com/jonschlinkert/is-relative "Returns `true` if the path appears to be relative.") +* [parse-filepath](https://www.npmjs.com/package/parse-filepath): Pollyfill for node.js `path.parse`, parses a filepath into an object. | [homepage](https://github.com/jonschlinkert/parse-filepath "Pollyfill for node.js `path.parse`, parses a filepath into an object.") +* [path-ends-with](https://www.npmjs.com/package/path-ends-with): Return `true` if a file path ends with the given string/suffix. | [homepage](https://github.com/jonschlinkert/path-ends-with "Return `true` if a file path ends with the given string/suffix.") +* [unixify](https://www.npmjs.com/package/unixify): Convert Windows file paths to unix paths. | [homepage](https://github.com/jonschlinkert/unixify "Convert Windows file paths to unix paths.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 35 | [jonschlinkert](https://github.com/jonschlinkert) | +| 1 | [phated](https://github.com/phated) | + +### Author + +**Jon Schlinkert** + +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) + +### License + +Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 19, 2018._ \ No newline at end of file diff --git a/node_modules/normalize-path/index.js b/node_modules/normalize-path/index.js new file mode 100644 index 0000000..6fac553 --- /dev/null +++ b/node_modules/normalize-path/index.js @@ -0,0 +1,35 @@ +/*! + * normalize-path + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + */ + +module.exports = function(path, stripTrailing) { + if (typeof path !== 'string') { + throw new TypeError('expected path to be a string'); + } + + if (path === '\\' || path === '/') return '/'; + + var len = path.length; + if (len <= 1) return path; + + // ensure that win32 namespaces has two leading slashes, so that the path is + // handled properly by the win32 version of path.parse() after being normalized + // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces + var prefix = ''; + if (len > 4 && path[3] === '\\') { + var ch = path[2]; + if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') { + path = path.slice(2); + prefix = '//'; + } + } + + var segs = path.split(/[/\\]+/); + if (stripTrailing !== false && segs[segs.length - 1] === '') { + segs.pop(); + } + return prefix + segs.join('/'); +}; diff --git a/node_modules/normalize-path/package.json b/node_modules/normalize-path/package.json new file mode 100644 index 0000000..ad61098 --- /dev/null +++ b/node_modules/normalize-path/package.json @@ -0,0 +1,77 @@ +{ + "name": "normalize-path", + "description": "Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.", + "version": "3.0.0", + "homepage": "https://github.com/jonschlinkert/normalize-path", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Blaine Bublitz (https://twitter.com/BlaineBublitz)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)" + ], + "repository": "jonschlinkert/normalize-path", + "bugs": { + "url": "https://github.com/jonschlinkert/normalize-path/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "gulp-format-md": "^1.0.0", + "minimist": "^1.2.0", + "mocha": "^3.5.3" + }, + "keywords": [ + "absolute", + "backslash", + "delimiter", + "file", + "file-path", + "filepath", + "fix", + "forward", + "fp", + "fs", + "normalize", + "path", + "relative", + "separator", + "slash", + "slashes", + "trailing", + "unix", + "urix" + ], + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "description": "Other useful path-related libraries:", + "list": [ + "contains-path", + "is-absolute", + "is-relative", + "parse-filepath", + "path-ends-with", + "path-ends-with", + "unixify" + ] + }, + "lint": { + "reflinks": true + } + } +} diff --git a/node_modules/picomatch/CHANGELOG.md b/node_modules/picomatch/CHANGELOG.md new file mode 100644 index 0000000..8ccc6c1 --- /dev/null +++ b/node_modules/picomatch/CHANGELOG.md @@ -0,0 +1,136 @@ +# Release history + +**All notable changes to this project will be documented in this file.** + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +
    + Guiding Principles + +- Changelogs are for humans, not machines. +- There should be an entry for every single version. +- The same types of changes should be grouped. +- Versions and sections should be linkable. +- The latest version comes first. +- The release date of each versions is displayed. +- Mention whether you follow Semantic Versioning. + +
    + +
    + Types of changes + +Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_): + +- `Added` for new features. +- `Changed` for changes in existing functionality. +- `Deprecated` for soon-to-be removed features. +- `Removed` for now removed features. +- `Fixed` for any bug fixes. +- `Security` in case of vulnerabilities. + +
    + +## 2.3.1 (2022-01-02) + +### Fixed + +* Fixes bug when a pattern containing an expression after the closing parenthesis (`/!(*.d).{ts,tsx}`) was incorrectly converted to regexp ([9f241ef](https://github.com/micromatch/picomatch/commit/9f241ef)). + +### Changed + +* Some documentation improvements ([f81d236](https://github.com/micromatch/picomatch/commit/f81d236), [421e0e7](https://github.com/micromatch/picomatch/commit/421e0e7)). + +## 2.3.0 (2021-05-21) + +### Fixed + +* Fixes bug where file names with two dots were not being matched consistently with negation extglobs containing a star ([56083ef](https://github.com/micromatch/picomatch/commit/56083ef)) + +## 2.2.3 (2021-04-10) + +### Fixed + +* Do not skip pattern seperator for square brackets ([fb08a30](https://github.com/micromatch/picomatch/commit/fb08a30)). +* Set negatedExtGlob also if it does not span the whole pattern ([032e3f5](https://github.com/micromatch/picomatch/commit/032e3f5)). + +## 2.2.2 (2020-03-21) + +### Fixed + +* Correctly handle parts of the pattern after parentheses in the `scan` method ([e15b920](https://github.com/micromatch/picomatch/commit/e15b920)). + +## 2.2.1 (2020-01-04) + +* Fixes [#49](https://github.com/micromatch/picomatch/issues/49), so that braces with no sets or ranges are now propertly treated as literals. + +## 2.2.0 (2020-01-04) + +* Disable fastpaths mode for the parse method ([5b8d33f](https://github.com/micromatch/picomatch/commit/5b8d33f)) +* Add `tokens`, `slashes`, and `parts` to the object returned by `picomatch.scan()`. + +## 2.1.0 (2019-10-31) + +* add benchmarks for scan ([4793b92](https://github.com/micromatch/picomatch/commit/4793b92)) +* Add eslint object-curly-spacing rule ([707c650](https://github.com/micromatch/picomatch/commit/707c650)) +* Add prefer-const eslint rule ([5c7501c](https://github.com/micromatch/picomatch/commit/5c7501c)) +* Add support for nonegate in scan API ([275c9b9](https://github.com/micromatch/picomatch/commit/275c9b9)) +* Change lets to consts. Move root import up. ([4840625](https://github.com/micromatch/picomatch/commit/4840625)) +* closes https://github.com/micromatch/picomatch/issues/21 ([766bcb0](https://github.com/micromatch/picomatch/commit/766bcb0)) +* Fix "Extglobs" table in readme ([eb19da8](https://github.com/micromatch/picomatch/commit/eb19da8)) +* fixes https://github.com/micromatch/picomatch/issues/20 ([9caca07](https://github.com/micromatch/picomatch/commit/9caca07)) +* fixes https://github.com/micromatch/picomatch/issues/26 ([fa58f45](https://github.com/micromatch/picomatch/commit/fa58f45)) +* Lint test ([d433a34](https://github.com/micromatch/picomatch/commit/d433a34)) +* lint unit tests ([0159b55](https://github.com/micromatch/picomatch/commit/0159b55)) +* Make scan work with noext ([6c02e03](https://github.com/micromatch/picomatch/commit/6c02e03)) +* minor linting ([c2a2b87](https://github.com/micromatch/picomatch/commit/c2a2b87)) +* minor parser improvements ([197671d](https://github.com/micromatch/picomatch/commit/197671d)) +* remove eslint since it... ([07876fa](https://github.com/micromatch/picomatch/commit/07876fa)) +* remove funding file ([8ebe96d](https://github.com/micromatch/picomatch/commit/8ebe96d)) +* Remove unused funks ([cbc6d54](https://github.com/micromatch/picomatch/commit/cbc6d54)) +* Run eslint during pretest, fix existing eslint findings ([0682367](https://github.com/micromatch/picomatch/commit/0682367)) +* support `noparen` in scan ([3d37569](https://github.com/micromatch/picomatch/commit/3d37569)) +* update changelog ([7b34e77](https://github.com/micromatch/picomatch/commit/7b34e77)) +* update travis ([777f038](https://github.com/micromatch/picomatch/commit/777f038)) +* Use eslint-disable-next-line instead of eslint-disable ([4e7c1fd](https://github.com/micromatch/picomatch/commit/4e7c1fd)) + +## 2.0.7 (2019-05-14) + +* 2.0.7 ([9eb9a71](https://github.com/micromatch/picomatch/commit/9eb9a71)) +* supports lookbehinds ([1f63f7e](https://github.com/micromatch/picomatch/commit/1f63f7e)) +* update .verb.md file with typo change ([2741279](https://github.com/micromatch/picomatch/commit/2741279)) +* fix: typo in README ([0753e44](https://github.com/micromatch/picomatch/commit/0753e44)) + +## 2.0.4 (2019-04-10) + +### Fixed + +- Readme link [fixed](https://github.com/micromatch/picomatch/pull/13/commits/a96ab3aa2b11b6861c23289964613d85563b05df) by @danez. +- `options.capture` now works as expected when fastpaths are enabled. See https://github.com/micromatch/picomatch/pull/12/commits/26aefd71f1cfaf95c37f1c1fcab68a693b037304. Thanks to @DrPizza. + +## 2.0.0 (2019-04-10) + +### Added + +- Adds support for `options.onIgnore`. See the readme for details +- Adds support for `options.onResult`. See the readme for details + +### Breaking changes + +- The unixify option was renamed to `windows` +- caching and all related options and methods have been removed + +## 1.0.0 (2018-11-05) + +- adds `.onMatch` option +- improvements to `.scan` method +- numerous improvements and optimizations for matching and parsing +- better windows path handling + +## 0.1.0 - 2017-04-13 + +First release. + + +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog diff --git a/node_modules/picomatch/LICENSE b/node_modules/picomatch/LICENSE new file mode 100644 index 0000000..3608dca --- /dev/null +++ b/node_modules/picomatch/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/picomatch/README.md b/node_modules/picomatch/README.md new file mode 100644 index 0000000..b0526e2 --- /dev/null +++ b/node_modules/picomatch/README.md @@ -0,0 +1,708 @@ +

    Picomatch

    + +

    + +version + + +test status + + +coverage status + + +downloads + +

    + +
    +
    + +

    +Blazing fast and accurate glob matcher written in JavaScript.
    +No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions. +

    + +
    +
    + +## Why picomatch? + +* **Lightweight** - No dependencies +* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function. +* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps) +* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files) +* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes. +* **Well tested** - Thousands of unit tests + +See the [library comparison](#library-comparisons) to other libraries. + +
    +
    + +## Table of Contents + +
    Click to expand + +- [Install](#install) +- [Usage](#usage) +- [API](#api) + * [picomatch](#picomatch) + * [.test](#test) + * [.matchBase](#matchbase) + * [.isMatch](#ismatch) + * [.parse](#parse) + * [.scan](#scan) + * [.compileRe](#compilere) + * [.makeRe](#makere) + * [.toRegex](#toregex) +- [Options](#options) + * [Picomatch options](#picomatch-options) + * [Scan Options](#scan-options) + * [Options Examples](#options-examples) +- [Globbing features](#globbing-features) + * [Basic globbing](#basic-globbing) + * [Advanced globbing](#advanced-globbing) + * [Braces](#braces) + * [Matching special characters as literals](#matching-special-characters-as-literals) +- [Library Comparisons](#library-comparisons) +- [Benchmarks](#benchmarks) +- [Philosophies](#philosophies) +- [About](#about) + * [Author](#author) + * [License](#license) + +_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_ + +
    + +
    +
    + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +npm install --save picomatch +``` + +
    + +## Usage + +The main export is a function that takes a glob pattern and an options object and returns a function for matching strings. + +```js +const pm = require('picomatch'); +const isMatch = pm('*.js'); + +console.log(isMatch('abcd')); //=> false +console.log(isMatch('a.js')); //=> true +console.log(isMatch('a.md')); //=> false +console.log(isMatch('a/b.js')); //=> false +``` + +
    + +## API + +### [picomatch](lib/picomatch.js#L32) + +Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information. + +**Params** + +* `globs` **{String|Array}**: One or more glob patterns. +* `options` **{Object=}** +* `returns` **{Function=}**: Returns a matcher function. + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch(glob[, options]); + +const isMatch = picomatch('*.!(*a)'); +console.log(isMatch('a.a')); //=> false +console.log(isMatch('a.b')); //=> true +``` + +### [.test](lib/picomatch.js#L117) + +Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string. + +**Params** + +* `input` **{String}**: String to test. +* `regex` **{RegExp}** +* `returns` **{Object}**: Returns an object with matching info. + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.test(input, regex[, options]); + +console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); +// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } +``` + +### [.matchBase](lib/picomatch.js#L161) + +Match the basename of a filepath. + +**Params** + +* `input` **{String}**: String to test. +* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe). +* `returns` **{Boolean}** + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.matchBase(input, glob[, options]); +console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true +``` + +### [.isMatch](lib/picomatch.js#L183) + +Returns true if **any** of the given glob `patterns` match the specified `string`. + +**Params** + +* **{String|Array}**: str The string to test. +* **{String|Array}**: patterns One or more glob patterns to use for matching. +* **{Object}**: See available [options](#options). +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.isMatch(string, patterns[, options]); + +console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true +console.log(picomatch.isMatch('a.a', 'b.*')); //=> false +``` + +### [.parse](lib/picomatch.js#L199) + +Parse a glob pattern to create the source string for a regular expression. + +**Params** + +* `pattern` **{String}** +* `options` **{Object}** +* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string. + +**Example** + +```js +const picomatch = require('picomatch'); +const result = picomatch.parse(pattern[, options]); +``` + +### [.scan](lib/picomatch.js#L231) + +Scan a glob pattern to separate the pattern into segments. + +**Params** + +* `input` **{String}**: Glob pattern to scan. +* `options` **{Object}** +* `returns` **{Object}**: Returns an object with + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.scan(input[, options]); + +const result = picomatch.scan('!./foo/*.js'); +console.log(result); +{ prefix: '!./', + input: '!./foo/*.js', + start: 3, + base: 'foo', + glob: '*.js', + isBrace: false, + isBracket: false, + isGlob: true, + isExtglob: false, + isGlobstar: false, + negated: true } +``` + +### [.compileRe](lib/picomatch.js#L245) + +Compile a regular expression from the `state` object returned by the +[parse()](#parse) method. + +**Params** + +* `state` **{Object}** +* `options` **{Object}** +* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser. +* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. +* `returns` **{RegExp}** + +### [.makeRe](lib/picomatch.js#L286) + +Create a regular expression from a parsed glob pattern. + +**Params** + +* `state` **{String}**: The object returned from the `.parse` method. +* `options` **{Object}** +* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. +* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression. +* `returns` **{RegExp}**: Returns a regex created from the given pattern. + +**Example** + +```js +const picomatch = require('picomatch'); +const state = picomatch.parse('*.js'); +// picomatch.compileRe(state[, options]); + +console.log(picomatch.compileRe(state)); +//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +``` + +### [.toRegex](lib/picomatch.js#L321) + +Create a regular expression from the given regex source string. + +**Params** + +* `source` **{String}**: Regular expression source string. +* `options` **{Object}** +* `returns` **{RegExp}** + +**Example** + +```js +const picomatch = require('picomatch'); +// picomatch.toRegex(source[, options]); + +const { output } = picomatch.parse('*.js'); +console.log(picomatch.toRegex(output)); +//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +``` + +
    + +## Options + +### Picomatch options + +The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API. + +| **Option** | **Type** | **Default value** | **Description** | +| --- | --- | --- | --- | +| `basename` | `boolean` | `false` | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes. For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. | +| `bash` | `boolean` | `false` | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). | +| `capture` | `boolean` | `undefined` | Return regex matches in supporting methods. | +| `contains` | `boolean` | `undefined` | Allows glob to match any part of the given string(s). | +| `cwd` | `string` | `process.cwd()` | Current working directory. Used by `picomatch.split()` | +| `debug` | `boolean` | `undefined` | Debug regular expressions when an error is thrown. | +| `dot` | `boolean` | `false` | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true | +| `expandRange` | `function` | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. | +| `failglob` | `boolean` | `false` | Throws an error if no matches are found. Based on the bash option of the same name. | +| `fastpaths` | `boolean` | `true` | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. | +| `flags` | `string` | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. | +| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. | +| `ignore` | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. | +| `keepQuotes` | `boolean` | `false` | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes. | +| `literalBrackets` | `boolean` | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. | +| `matchBase` | `boolean` | `false` | Alias for `basename` | +| `maxLength` | `boolean` | `65536` | Limit the max length of the input string. An error is thrown if the input string is longer than this value. | +| `nobrace` | `boolean` | `false` | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. | +| `nobracket` | `boolean` | `undefined` | Disable matching with regex brackets. | +| `nocase` | `boolean` | `false` | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. | +| `nodupes` | `boolean` | `true` | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. | +| `noext` | `boolean` | `false` | Alias for `noextglob` | +| `noextglob` | `boolean` | `false` | Disable support for matching with extglobs (like `+(a\|b)`) | +| `noglobstar` | `boolean` | `false` | Disable support for matching nested directories with globstars (`**`) | +| `nonegate` | `boolean` | `false` | Disable support for negating with leading `!` | +| `noquantifiers` | `boolean` | `false` | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. | +| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. | +| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. | +| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. | +| `posix` | `boolean` | `false` | Support POSIX character classes ("posix brackets"). | +| `posixSlashes` | `boolean` | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself | +| `prepend` | `boolean` | `undefined` | String to prepend to the generated regex used for matching. | +| `regex` | `boolean` | `false` | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). | +| `strictBrackets` | `boolean` | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. | +| `strictSlashes` | `boolean` | `undefined` | When true, picomatch won't match trailing slashes with single stars. | +| `unescape` | `boolean` | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. | +| `unixify` | `boolean` | `undefined` | Alias for `posixSlashes`, for backwards compatibility. | + +picomatch has automatic detection for regex positive and negative lookbehinds. If the pattern contains a negative lookbehind, you must be using Node.js >= 8.10 or else picomatch will throw an error. + +### Scan Options + +In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method. + +| **Option** | **Type** | **Default value** | **Description** | +| --- | --- | --- | --- | +| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern | +| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true | + +**Example** + +```js +const picomatch = require('picomatch'); +const result = picomatch.scan('!./foo/*.js', { tokens: true }); +console.log(result); +// { +// prefix: '!./', +// input: '!./foo/*.js', +// start: 3, +// base: 'foo', +// glob: '*.js', +// isBrace: false, +// isBracket: false, +// isGlob: true, +// isExtglob: false, +// isGlobstar: false, +// negated: true, +// maxDepth: 2, +// tokens: [ +// { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true }, +// { value: 'foo', depth: 1, isGlob: false }, +// { value: '*.js', depth: 1, isGlob: true } +// ], +// slashes: [ 2, 6 ], +// parts: [ 'foo', '*.js' ] +// } +``` + +
    + +### Options Examples + +#### options.expandRange + +**Type**: `function` + +**Default**: `undefined` + +Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need. + +**Example** + +The following example shows how to create a glob that matches a folder + +```js +const fill = require('fill-range'); +const regex = pm.makeRe('foo/{01..25}/bar', { + expandRange(a, b) { + return `(${fill(a, b, { toRegex: true })})`; + } +}); + +console.log(regex); +//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/ + +console.log(regex.test('foo/00/bar')) // false +console.log(regex.test('foo/01/bar')) // true +console.log(regex.test('foo/10/bar')) // true +console.log(regex.test('foo/22/bar')) // true +console.log(regex.test('foo/25/bar')) // true +console.log(regex.test('foo/26/bar')) // false +``` + +#### options.format + +**Type**: `function` + +**Default**: `undefined` + +Custom function for formatting strings before they're matched. + +**Example** + +```js +// strip leading './' from strings +const format = str => str.replace(/^\.\//, ''); +const isMatch = picomatch('foo/*.js', { format }); +console.log(isMatch('./foo/bar.js')); //=> true +``` + +#### options.onMatch + +```js +const onMatch = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onMatch }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +#### options.onIgnore + +```js +const onIgnore = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onIgnore, ignore: 'f*' }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +#### options.onResult + +```js +const onResult = ({ glob, regex, input, output }) => { + console.log({ glob, regex, input, output }); +}; + +const isMatch = picomatch('*', { onResult, ignore: 'f*' }); +isMatch('foo'); +isMatch('bar'); +isMatch('baz'); +``` + +
    +
    + +## Globbing features + +* [Basic globbing](#basic-globbing) (Wildcard matching) +* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching) + +### Basic globbing + +| **Character** | **Description** | +| --- | --- | +| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. | +| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` on Windows) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. | +| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots. | +| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. | + +#### Matching behavior vs. Bash + +Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions: + +* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`. +* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`. + +
    + +### Advanced globbing + +* [extglobs](#extglobs) +* [POSIX brackets](#posix-brackets) +* [Braces](#brace-expansion) + +#### Extglobs + +| **Pattern** | **Description** | +| --- | --- | +| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` | +| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` | +| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` | +| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` | +| `!(pattern)` | Match _anything but_ `pattern` | + +**Examples** + +```js +const pm = require('picomatch'); + +// *(pattern) matches ZERO or more of "pattern" +console.log(pm.isMatch('a', 'a*(z)')); // true +console.log(pm.isMatch('az', 'a*(z)')); // true +console.log(pm.isMatch('azzz', 'a*(z)')); // true + +// +(pattern) matches ONE or more of "pattern" +console.log(pm.isMatch('a', 'a*(z)')); // true +console.log(pm.isMatch('az', 'a*(z)')); // true +console.log(pm.isMatch('azzz', 'a*(z)')); // true + +// supports multiple extglobs +console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false + +// supports nested extglobs +console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true +``` + +#### POSIX brackets + +POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true. + +**Enable POSIX bracket support** + +```js +console.log(pm.makeRe('[[:word:]]+', { posix: true })); +//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/ +``` + +**Supported POSIX classes** + +The following named POSIX bracket expressions are supported: + +* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]` +* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`. +* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`. +* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`. +* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`. +* `[:digit:]` - Numerical digits, equivalent to `[0-9]`. +* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`. +* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`. +* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`. +* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`. +* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`. +* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`. +* `[:word:]` - Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`. +* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`. + +See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information. + +### Braces + +Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces. + +### Matching special characters as literals + +If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes: + +**Special Characters** + +Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms. + +To match any of the following characters as literals: `$^*+?()[] + +Examples: + +```js +console.log(pm.makeRe('foo/bar \\(1\\)')); +console.log(pm.makeRe('foo/bar \\(1\\)')); +``` + +
    +
    + +## Library Comparisons + +The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets). + +| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - | +| Advancing globbing | ✔ | ✔ | ✔ | - | - | - | - | +| Brace _matching_ | ✔ | ✔ | ✔ | - | - | ✔ | - | +| Brace _expansion_ | ✔ | ✔ | - | - | - | ✔ | - | +| Extglobs | partial | ✔ | ✔ | - | ✔ | - | - | +| Posix brackets | - | ✔ | ✔ | - | - | - | ✔ | +| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ | +| File system operations | - | - | - | - | - | - | - | + +
    +
    + +## Benchmarks + +Performance comparison of picomatch and minimatch. + +``` +# .makeRe star + picomatch x 1,993,050 ops/sec ±0.51% (91 runs sampled) + minimatch x 627,206 ops/sec ±1.96% (87 runs sampled)) + +# .makeRe star; dot=true + picomatch x 1,436,640 ops/sec ±0.62% (91 runs sampled) + minimatch x 525,876 ops/sec ±0.60% (88 runs sampled) + +# .makeRe globstar + picomatch x 1,592,742 ops/sec ±0.42% (90 runs sampled) + minimatch x 962,043 ops/sec ±1.76% (91 runs sampled)d) + +# .makeRe globstars + picomatch x 1,615,199 ops/sec ±0.35% (94 runs sampled) + minimatch x 477,179 ops/sec ±1.33% (91 runs sampled) + +# .makeRe with leading star + picomatch x 1,220,856 ops/sec ±0.40% (92 runs sampled) + minimatch x 453,564 ops/sec ±1.43% (94 runs sampled) + +# .makeRe - basic braces + picomatch x 392,067 ops/sec ±0.70% (90 runs sampled) + minimatch x 99,532 ops/sec ±2.03% (87 runs sampled)) +``` + +
    +
    + +## Philosophies + +The goal of this library is to be blazing fast, without compromising on accuracy. + +**Accuracy** + +The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`. + +Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements. + +**Performance** + +Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer. + +
    +
    + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +### License + +Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). diff --git a/node_modules/picomatch/index.js b/node_modules/picomatch/index.js new file mode 100644 index 0000000..d2f2bc5 --- /dev/null +++ b/node_modules/picomatch/index.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./lib/picomatch'); diff --git a/node_modules/picomatch/lib/constants.js b/node_modules/picomatch/lib/constants.js new file mode 100644 index 0000000..a62ef38 --- /dev/null +++ b/node_modules/picomatch/lib/constants.js @@ -0,0 +1,179 @@ +'use strict'; + +const path = require('path'); +const WIN_SLASH = '\\\\/'; +const WIN_NO_SLASH = `[^${WIN_SLASH}]`; + +/** + * Posix glob regex + */ + +const DOT_LITERAL = '\\.'; +const PLUS_LITERAL = '\\+'; +const QMARK_LITERAL = '\\?'; +const SLASH_LITERAL = '\\/'; +const ONE_CHAR = '(?=.)'; +const QMARK = '[^/]'; +const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; +const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; +const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; +const NO_DOT = `(?!${DOT_LITERAL})`; +const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; +const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; +const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; +const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; +const STAR = `${QMARK}*?`; + +const POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR, + START_ANCHOR +}; + +/** + * Windows glob regex + */ + +const WINDOWS_CHARS = { + ...POSIX_CHARS, + + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)` +}; + +/** + * POSIX Bracket Regex + */ + +const POSIX_REGEX_SOURCE = { + alnum: 'a-zA-Z0-9', + alpha: 'a-zA-Z', + ascii: '\\x00-\\x7F', + blank: ' \\t', + cntrl: '\\x00-\\x1F\\x7F', + digit: '0-9', + graph: '\\x21-\\x7E', + lower: 'a-z', + print: '\\x20-\\x7E ', + punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', + space: ' \\t\\r\\n\\v\\f', + upper: 'A-Z', + word: 'A-Za-z0-9_', + xdigit: 'A-Fa-f0-9' +}; + +module.exports = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE, + + // regular expressions + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, + + // Replace globs with equivalent patterns to reduce parsing time. + REPLACEMENTS: { + '***': '*', + '**/**': '**', + '**/**/**': '**' + }, + + // Digits + CHAR_0: 48, /* 0 */ + CHAR_9: 57, /* 9 */ + + // Alphabet chars. + CHAR_UPPERCASE_A: 65, /* A */ + CHAR_LOWERCASE_A: 97, /* a */ + CHAR_UPPERCASE_Z: 90, /* Z */ + CHAR_LOWERCASE_Z: 122, /* z */ + + CHAR_LEFT_PARENTHESES: 40, /* ( */ + CHAR_RIGHT_PARENTHESES: 41, /* ) */ + + CHAR_ASTERISK: 42, /* * */ + + // Non-alphabetic chars. + CHAR_AMPERSAND: 38, /* & */ + CHAR_AT: 64, /* @ */ + CHAR_BACKWARD_SLASH: 92, /* \ */ + CHAR_CARRIAGE_RETURN: 13, /* \r */ + CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ + CHAR_COLON: 58, /* : */ + CHAR_COMMA: 44, /* , */ + CHAR_DOT: 46, /* . */ + CHAR_DOUBLE_QUOTE: 34, /* " */ + CHAR_EQUAL: 61, /* = */ + CHAR_EXCLAMATION_MARK: 33, /* ! */ + CHAR_FORM_FEED: 12, /* \f */ + CHAR_FORWARD_SLASH: 47, /* / */ + CHAR_GRAVE_ACCENT: 96, /* ` */ + CHAR_HASH: 35, /* # */ + CHAR_HYPHEN_MINUS: 45, /* - */ + CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ + CHAR_LEFT_CURLY_BRACE: 123, /* { */ + CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ + CHAR_LINE_FEED: 10, /* \n */ + CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ + CHAR_PERCENT: 37, /* % */ + CHAR_PLUS: 43, /* + */ + CHAR_QUESTION_MARK: 63, /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ + CHAR_RIGHT_CURLY_BRACE: 125, /* } */ + CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ + CHAR_SEMICOLON: 59, /* ; */ + CHAR_SINGLE_QUOTE: 39, /* ' */ + CHAR_SPACE: 32, /* */ + CHAR_TAB: 9, /* \t */ + CHAR_UNDERSCORE: 95, /* _ */ + CHAR_VERTICAL_LINE: 124, /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ + + SEP: path.sep, + + /** + * Create EXTGLOB_CHARS + */ + + extglobChars(chars) { + return { + '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, + '?': { type: 'qmark', open: '(?:', close: ')?' }, + '+': { type: 'plus', open: '(?:', close: ')+' }, + '*': { type: 'star', open: '(?:', close: ')*' }, + '@': { type: 'at', open: '(?:', close: ')' } + }; + }, + + /** + * Create GLOB_CHARS + */ + + globChars(win32) { + return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; + } +}; diff --git a/node_modules/picomatch/lib/parse.js b/node_modules/picomatch/lib/parse.js new file mode 100644 index 0000000..58269d0 --- /dev/null +++ b/node_modules/picomatch/lib/parse.js @@ -0,0 +1,1091 @@ +'use strict'; + +const constants = require('./constants'); +const utils = require('./utils'); + +/** + * Constants + */ + +const { + MAX_LENGTH, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS +} = constants; + +/** + * Helpers + */ + +const expandRange = (args, options) => { + if (typeof options.expandRange === 'function') { + return options.expandRange(...args, options); + } + + args.sort(); + const value = `[${args.join('-')}]`; + + try { + /* eslint-disable-next-line no-new */ + new RegExp(value); + } catch (ex) { + return args.map(v => utils.escapeRegex(v)).join('..'); + } + + return value; +}; + +/** + * Create the message for a syntax error + */ + +const syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; +}; + +/** + * Parse the given input string. + * @param {String} input + * @param {Object} options + * @return {Object} + */ + +const parse = (input, options) => { + if (typeof input !== 'string') { + throw new TypeError('Expected a string'); + } + + input = REPLACEMENTS[input] || input; + + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + const bos = { type: 'bos', value: '', output: opts.prepend || '' }; + const tokens = [bos]; + + const capture = opts.capture ? '' : '?:'; + const win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const PLATFORM_CHARS = constants.globChars(win32); + const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); + + const { + DOT_LITERAL, + PLUS_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK, + QMARK_NO_DOT, + STAR, + START_ANCHOR + } = PLATFORM_CHARS; + + const globstar = opts => { + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const nodot = opts.dot ? '' : NO_DOT; + const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; + let star = opts.bash === true ? globstar(opts) : STAR; + + if (opts.capture) { + star = `(${star})`; + } + + // minimatch options support + if (typeof opts.noext === 'boolean') { + opts.noextglob = opts.noext; + } + + const state = { + input, + index: -1, + start: 0, + dot: opts.dot === true, + consumed: '', + output: '', + prefix: '', + backtrack: false, + negated: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + globstar: false, + tokens + }; + + input = utils.removePrefix(input, state); + len = input.length; + + const extglobs = []; + const braces = []; + const stack = []; + let prev = bos; + let value; + + /** + * Tokenizing helpers + */ + + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance = state.advance = () => input[++state.index] || ''; + const remaining = () => input.slice(state.index + 1); + const consume = (value = '', num = 0) => { + state.consumed += value; + state.index += num; + }; + + const append = token => { + state.output += token.output != null ? token.output : token.value; + consume(token.value); + }; + + const negate = () => { + let count = 1; + + while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { + advance(); + state.start++; + count++; + } + + if (count % 2 === 0) { + return false; + } + + state.negated = true; + state.start++; + return true; + }; + + const increment = type => { + state[type]++; + stack.push(type); + }; + + const decrement = type => { + state[type]--; + stack.pop(); + }; + + /** + * Push tokens onto the tokens array. This helper speeds up + * tokenizing by 1) helping us avoid backtracking as much as possible, + * and 2) helping us avoid creating extra tokens when consecutive + * characters are plain text. This improves performance and simplifies + * lookbehinds. + */ + + const push = tok => { + if (prev.type === 'globstar') { + const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); + const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); + + if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = 'star'; + prev.value = '*'; + prev.output = star; + state.output += prev.output; + } + } + + if (extglobs.length && tok.type !== 'paren') { + extglobs[extglobs.length - 1].inner += tok.value; + } + + if (tok.value || tok.output) append(tok); + if (prev && prev.type === 'text' && tok.type === 'text') { + prev.value += tok.value; + prev.output = (prev.output || '') + tok.value; + return; + } + + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + + const extglobOpen = (type, value) => { + const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; + + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + const output = (opts.capture ? '(' : '') + token.open; + + increment('parens'); + push({ type, value, output: state.output ? '' : ONE_CHAR }); + push({ type: 'paren', extglob: true, value: advance(), output }); + extglobs.push(token); + }; + + const extglobClose = token => { + let output = token.close + (opts.capture ? ')' : ''); + let rest; + + if (token.type === 'negate') { + let extglobStar = star; + + if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { + extglobStar = globstar(opts); + } + + if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { + output = token.close = `)$))${extglobStar}`; + } + + if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { + // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis. + // In this case, we need to parse the string and use it in the output of the original pattern. + // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`. + // + // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`. + const expression = parse(rest, { ...options, fastpaths: false }).output; + + output = token.close = `)${expression})${extglobStar})`; + } + + if (token.prev.type === 'bos') { + state.negatedExtglob = true; + } + } + + push({ type: 'paren', extglob: true, value, output }); + decrement('parens'); + }; + + /** + * Fast paths + */ + + if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { + let backslashes = false; + + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === '\\') { + backslashes = true; + return m; + } + + if (first === '?') { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ''); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); + } + return QMARK.repeat(chars.length); + } + + if (first === '.') { + return DOT_LITERAL.repeat(chars.length); + } + + if (first === '*') { + if (esc) { + return esc + first + (rest ? star : ''); + } + return star; + } + return esc ? m : `\\${m}`; + }); + + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ''); + } else { + output = output.replace(/\\+/g, m => { + return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); + }); + } + } + + if (output === input && opts.contains === true) { + state.output = input; + return state; + } + + state.output = utils.wrapOutput(output, state, options); + return state; + } + + /** + * Tokenize input until we reach end-of-string + */ + + while (!eos()) { + value = advance(); + + if (value === '\u0000') { + continue; + } + + /** + * Escaped characters + */ + + if (value === '\\') { + const next = peek(); + + if (next === '/' && opts.bash !== true) { + continue; + } + + if (next === '.' || next === ';') { + continue; + } + + if (!next) { + value += '\\'; + push({ type: 'text', value }); + continue; + } + + // collapse slashes to reduce potential for exploits + const match = /^\\+/.exec(remaining()); + let slashes = 0; + + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += '\\'; + } + } + + if (opts.unescape === true) { + value = advance(); + } else { + value += advance(); + } + + if (state.brackets === 0) { + push({ type: 'text', value }); + continue; + } + } + + /** + * If we're inside a regex character class, continue + * until we reach the closing bracket. + */ + + if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { + if (opts.posix !== false && value === ':') { + const inner = prev.value.slice(1); + if (inner.includes('[')) { + prev.posix = true; + + if (inner.includes(':')) { + const idx = prev.value.lastIndexOf('['); + const pre = prev.value.slice(0, idx); + const rest = prev.value.slice(idx + 2); + const posix = POSIX_REGEX_SOURCE[rest]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + + if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { + value = `\\${value}`; + } + + if (value === ']' && (prev.value === '[' || prev.value === '[^')) { + value = `\\${value}`; + } + + if (opts.posix === true && value === '!' && prev.value === '[') { + value = '^'; + } + + prev.value += value; + append({ value }); + continue; + } + + /** + * If we're inside a quoted string, continue + * until we reach the closing double quote. + */ + + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({ value }); + continue; + } + + /** + * Double quotes + */ + + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({ type: 'text', value }); + } + continue; + } + + /** + * Parentheses + */ + + if (value === '(') { + increment('parens'); + push({ type: 'paren', value }); + continue; + } + + if (value === ')') { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '(')); + } + + const extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + + push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); + decrement('parens'); + continue; + } + + /** + * Square brackets + */ + + if (value === '[') { + if (opts.nobracket === true || !remaining().includes(']')) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('closing', ']')); + } + + value = `\\${value}`; + } else { + increment('brackets'); + } + + push({ type: 'bracket', value }); + continue; + } + + if (value === ']') { + if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { + push({ type: 'text', value, output: `\\${value}` }); + continue; + } + + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError('opening', '[')); + } + + push({ type: 'text', value, output: `\\${value}` }); + continue; + } + + decrement('brackets'); + + const prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { + value = `/${value}`; + } + + prev.value += value; + append({ value }); + + // when literal brackets are explicitly disabled + // assume we should match with a regex character class + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + + const escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + + // when literal brackets are explicitly enabled + // assume we should escape the brackets to match literal characters + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + + // when the user specifies nothing, try to match both + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + + /** + * Braces + */ + + if (value === '{' && opts.nobrace !== true) { + increment('braces'); + + const open = { + type: 'brace', + value, + output: '(', + outputIndex: state.output.length, + tokensIndex: state.tokens.length + }; + + braces.push(open); + push(open); + continue; + } + + if (value === '}') { + const brace = braces[braces.length - 1]; + + if (opts.nobrace === true || !brace) { + push({ type: 'text', value, output: value }); + continue; + } + + let output = ')'; + + if (brace.dots === true) { + const arr = tokens.slice(); + const range = []; + + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === 'brace') { + break; + } + if (arr[i].type !== 'dots') { + range.unshift(arr[i].value); + } + } + + output = expandRange(range, opts); + state.backtrack = true; + } + + if (brace.comma !== true && brace.dots !== true) { + const out = state.output.slice(0, brace.outputIndex); + const toks = state.tokens.slice(brace.tokensIndex); + brace.value = brace.output = '\\{'; + value = output = '\\}'; + state.output = out; + for (const t of toks) { + state.output += (t.output || t.value); + } + } + + push({ type: 'brace', value, output }); + decrement('braces'); + braces.pop(); + continue; + } + + /** + * Pipes + */ + + if (value === '|') { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({ type: 'text', value }); + continue; + } + + /** + * Commas + */ + + if (value === ',') { + let output = value; + + const brace = braces[braces.length - 1]; + if (brace && stack[stack.length - 1] === 'braces') { + brace.comma = true; + output = '|'; + } + + push({ type: 'comma', value, output }); + continue; + } + + /** + * Slashes + */ + + if (value === '/') { + // if the beginning of the glob is "./", advance the start + // to the current index, and don't add the "./" characters + // to the state. This greatly simplifies lookbehinds when + // checking for BOS characters like "!" and "." (not "./") + if (prev.type === 'dot' && state.index === state.start + 1) { + state.start = state.index + 1; + state.consumed = ''; + state.output = ''; + tokens.pop(); + prev = bos; // reset "prev" to the first token + continue; + } + + push({ type: 'slash', value, output: SLASH_LITERAL }); + continue; + } + + /** + * Dots + */ + + if (value === '.') { + if (state.braces > 0 && prev.type === 'dot') { + if (prev.value === '.') prev.output = DOT_LITERAL; + const brace = braces[braces.length - 1]; + prev.type = 'dots'; + prev.output += value; + prev.value += value; + brace.dots = true; + continue; + } + + if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { + push({ type: 'text', value, output: DOT_LITERAL }); + continue; + } + + push({ type: 'dot', value, output: DOT_LITERAL }); + continue; + } + + /** + * Question marks + */ + + if (value === '?') { + const isGroup = prev && prev.value === '('; + if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('qmark', value); + continue; + } + + if (prev && prev.type === 'paren') { + const next = peek(); + let output = value; + + if (next === '<' && !utils.supportsLookbehinds()) { + throw new Error('Node.js v10 or higher is required for regex lookbehinds'); + } + + if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { + output = `\\${value}`; + } + + push({ type: 'text', value, output }); + continue; + } + + if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { + push({ type: 'qmark', value, output: QMARK_NO_DOT }); + continue; + } + + push({ type: 'qmark', value, output: QMARK }); + continue; + } + + /** + * Exclamation + */ + + if (value === '!') { + if (opts.noextglob !== true && peek() === '(') { + if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { + extglobOpen('negate', value); + continue; + } + } + + if (opts.nonegate !== true && state.index === 0) { + negate(); + continue; + } + } + + /** + * Plus + */ + + if (value === '+') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + extglobOpen('plus', value); + continue; + } + + if ((prev && prev.value === '(') || opts.regex === false) { + push({ type: 'plus', value, output: PLUS_LITERAL }); + continue; + } + + if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { + push({ type: 'plus', value }); + continue; + } + + push({ type: 'plus', value: PLUS_LITERAL }); + continue; + } + + /** + * Plain text + */ + + if (value === '@') { + if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { + push({ type: 'at', extglob: true, value, output: '' }); + continue; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Plain text + */ + + if (value !== '*') { + if (value === '$' || value === '^') { + value = `\\${value}`; + } + + const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); + if (match) { + value += match[0]; + state.index += match[0].length; + } + + push({ type: 'text', value }); + continue; + } + + /** + * Stars + */ + + if (prev && (prev.type === 'globstar' || prev.star === true)) { + prev.type = 'star'; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.globstar = true; + consume(value); + continue; + } + + let rest = remaining(); + if (opts.noextglob !== true && /^\([^?]/.test(rest)) { + extglobOpen('star', value); + continue; + } + + if (prev.type === 'star') { + if (opts.noglobstar === true) { + consume(value); + continue; + } + + const prior = prev.prev; + const before = prior.prev; + const isStart = prior.type === 'slash' || prior.type === 'bos'; + const afterStar = before && (before.type === 'star' || before.type === 'globstar'); + + if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { + push({ type: 'star', value, output: '' }); + continue; + } + + const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); + const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); + if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { + push({ type: 'star', value, output: '' }); + continue; + } + + // strip consecutive `/**/` + while (rest.slice(0, 3) === '/**') { + const after = input[state.index + 4]; + if (after && after !== '/') { + break; + } + rest = rest.slice(3); + consume('/**', 3); + } + + if (prior.type === 'bos' && eos()) { + prev.type = 'globstar'; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.globstar = true; + consume(value); + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + + prev.type = 'globstar'; + prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); + prev.value += value; + state.globstar = true; + state.output += prior.output + prev.output; + consume(value); + continue; + } + + if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { + const end = rest[1] !== void 0 ? '|$' : ''; + + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + + prev.type = 'globstar'; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; + + state.output += prior.output + prev.output; + state.globstar = true; + + consume(value + advance()); + + push({ type: 'slash', value: '/', output: '' }); + continue; + } + + if (prior.type === 'bos' && rest[0] === '/') { + prev.type = 'globstar'; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.globstar = true; + consume(value + advance()); + push({ type: 'slash', value: '/', output: '' }); + continue; + } + + // remove single star from output + state.output = state.output.slice(0, -prev.output.length); + + // reset previous token to globstar + prev.type = 'globstar'; + prev.output = globstar(opts); + prev.value += value; + + // reset output with globstar + state.output += prev.output; + state.globstar = true; + consume(value); + continue; + } + + const token = { type: 'star', value, output: star }; + + if (opts.bash === true) { + token.output = '.*?'; + if (prev.type === 'bos' || prev.type === 'slash') { + token.output = nodot + token.output; + } + push(token); + continue; + } + + if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { + token.output = value; + push(token); + continue; + } + + if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { + if (prev.type === 'dot') { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + + } else { + state.output += nodot; + prev.output += nodot; + } + + if (peek() !== '*') { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + + push(token); + } + + while (state.brackets > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); + state.output = utils.escapeLast(state.output, '['); + decrement('brackets'); + } + + while (state.parens > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); + state.output = utils.escapeLast(state.output, '('); + decrement('parens'); + } + + while (state.braces > 0) { + if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); + state.output = utils.escapeLast(state.output, '{'); + decrement('braces'); + } + + if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { + push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); + } + + // rebuild the output if we had to backtrack at any point + if (state.backtrack === true) { + state.output = ''; + + for (const token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + + if (token.suffix) { + state.output += token.suffix; + } + } + } + + return state; +}; + +/** + * Fast paths for creating regular expressions for common glob patterns. + * This can significantly speed up processing and has very little downside + * impact when none of the fast paths match. + */ + +parse.fastpaths = (input, options) => { + const opts = { ...options }; + const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + const len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + + input = REPLACEMENTS[input] || input; + const win32 = utils.isWindows(options); + + // create constants based on platform, for windows or posix + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); + + const nodot = opts.dot ? NO_DOTS : NO_DOT; + const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + const capture = opts.capture ? '' : '?:'; + const state = { negated: false, prefix: '' }; + let star = opts.bash === true ? '.*?' : STAR; + + if (opts.capture) { + star = `(${star})`; + } + + const globstar = opts => { + if (opts.noglobstar === true) return star; + return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + + const create = str => { + switch (str) { + case '*': + return `${nodot}${ONE_CHAR}${star}`; + + case '.*': + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*.*': + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '*/*': + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + + case '**': + return nodot + globstar(opts); + + case '**/*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; + + case '**/*.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + + case '**/.*': + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; + + default: { + const match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) return; + + const source = create(match[1]); + if (!source) return; + + return source + DOT_LITERAL + match[2]; + } + } + }; + + const output = utils.removePrefix(input, state); + let source = create(output); + + if (source && opts.strictSlashes !== true) { + source += `${SLASH_LITERAL}?`; + } + + return source; +}; + +module.exports = parse; diff --git a/node_modules/picomatch/lib/picomatch.js b/node_modules/picomatch/lib/picomatch.js new file mode 100644 index 0000000..782d809 --- /dev/null +++ b/node_modules/picomatch/lib/picomatch.js @@ -0,0 +1,342 @@ +'use strict'; + +const path = require('path'); +const scan = require('./scan'); +const parse = require('./parse'); +const utils = require('./utils'); +const constants = require('./constants'); +const isObject = val => val && typeof val === 'object' && !Array.isArray(val); + +/** + * Creates a matcher function from one or more glob patterns. The + * returned function takes a string to match as its first argument, + * and returns true if the string is a match. The returned matcher + * function also takes a boolean as the second argument that, when true, + * returns an object with additional information. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch(glob[, options]); + * + * const isMatch = picomatch('*.!(*a)'); + * console.log(isMatch('a.a')); //=> false + * console.log(isMatch('a.b')); //=> true + * ``` + * @name picomatch + * @param {String|Array} `globs` One or more glob patterns. + * @param {Object=} `options` + * @return {Function=} Returns a matcher function. + * @api public + */ + +const picomatch = (glob, options, returnState = false) => { + if (Array.isArray(glob)) { + const fns = glob.map(input => picomatch(input, options, returnState)); + const arrayMatcher = str => { + for (const isMatch of fns) { + const state = isMatch(str); + if (state) return state; + } + return false; + }; + return arrayMatcher; + } + + const isState = isObject(glob) && glob.tokens && glob.input; + + if (glob === '' || (typeof glob !== 'string' && !isState)) { + throw new TypeError('Expected pattern to be a non-empty string'); + } + + const opts = options || {}; + const posix = utils.isWindows(options); + const regex = isState + ? picomatch.compileRe(glob, options) + : picomatch.makeRe(glob, options, false, true); + + const state = regex.state; + delete regex.state; + + let isIgnored = () => false; + if (opts.ignore) { + const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; + isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); + } + + const matcher = (input, returnObject = false) => { + const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); + const result = { glob, state, regex, posix, input, output, match, isMatch }; + + if (typeof opts.onResult === 'function') { + opts.onResult(result); + } + + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } + + if (isIgnored(input)) { + if (typeof opts.onIgnore === 'function') { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + + if (typeof opts.onMatch === 'function') { + opts.onMatch(result); + } + return returnObject ? result : true; + }; + + if (returnState) { + matcher.state = state; + } + + return matcher; +}; + +/** + * Test `input` with the given `regex`. This is used by the main + * `picomatch()` function to test the input string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.test(input, regex[, options]); + * + * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); + * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } + * ``` + * @param {String} `input` String to test. + * @param {RegExp} `regex` + * @return {Object} Returns an object with matching info. + * @api public + */ + +picomatch.test = (input, regex, options, { glob, posix } = {}) => { + if (typeof input !== 'string') { + throw new TypeError('Expected input to be a string'); + } + + if (input === '') { + return { isMatch: false, output: '' }; + } + + const opts = options || {}; + const format = opts.format || (posix ? utils.toPosixSlashes : null); + let match = input === glob; + let output = (match && format) ? format(input) : input; + + if (match === false) { + output = format ? format(input) : input; + match = output === glob; + } + + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch.matchBase(input, regex, options, posix); + } else { + match = regex.exec(output); + } + } + + return { isMatch: Boolean(match), match, output }; +}; + +/** + * Match the basename of a filepath. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.matchBase(input, glob[, options]); + * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true + * ``` + * @param {String} `input` String to test. + * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). + * @return {Boolean} + * @api public + */ + +picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { + const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); + return regex.test(path.basename(input)); +}; + +/** + * Returns true if **any** of the given glob `patterns` match the specified `string`. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.isMatch(string, patterns[, options]); + * + * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true + * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false + * ``` + * @param {String|Array} str The string to test. + * @param {String|Array} patterns One or more glob patterns to use for matching. + * @param {Object} [options] See available [options](#options). + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ + +picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + +/** + * Parse a glob pattern to create the source string for a regular + * expression. + * + * ```js + * const picomatch = require('picomatch'); + * const result = picomatch.parse(pattern[, options]); + * ``` + * @param {String} `pattern` + * @param {Object} `options` + * @return {Object} Returns an object with useful properties and output to be used as a regex source string. + * @api public + */ + +picomatch.parse = (pattern, options) => { + if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); + return parse(pattern, { ...options, fastpaths: false }); +}; + +/** + * Scan a glob pattern to separate the pattern into segments. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.scan(input[, options]); + * + * const result = picomatch.scan('!./foo/*.js'); + * console.log(result); + * { prefix: '!./', + * input: '!./foo/*.js', + * start: 3, + * base: 'foo', + * glob: '*.js', + * isBrace: false, + * isBracket: false, + * isGlob: true, + * isExtglob: false, + * isGlobstar: false, + * negated: true } + * ``` + * @param {String} `input` Glob pattern to scan. + * @param {Object} `options` + * @return {Object} Returns an object with + * @api public + */ + +picomatch.scan = (input, options) => scan(input, options); + +/** + * Compile a regular expression from the `state` object returned by the + * [parse()](#parse) method. + * + * @param {Object} `state` + * @param {Object} `options` + * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser. + * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging. + * @return {RegExp} + * @api public + */ + +picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { + if (returnOutput === true) { + return state.output; + } + + const opts = options || {}; + const prepend = opts.contains ? '' : '^'; + const append = opts.contains ? '' : '$'; + + let source = `${prepend}(?:${state.output})${append}`; + if (state && state.negated === true) { + source = `^(?!${source}).*$`; + } + + const regex = picomatch.toRegex(source, options); + if (returnState === true) { + regex.state = state; + } + + return regex; +}; + +/** + * Create a regular expression from a parsed glob pattern. + * + * ```js + * const picomatch = require('picomatch'); + * const state = picomatch.parse('*.js'); + * // picomatch.compileRe(state[, options]); + * + * console.log(picomatch.compileRe(state)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `state` The object returned from the `.parse` method. + * @param {Object} `options` + * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result. + * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression. + * @return {RegExp} Returns a regex created from the given pattern. + * @api public + */ + +picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { + if (!input || typeof input !== 'string') { + throw new TypeError('Expected a non-empty string'); + } + + let parsed = { negated: false, fastpaths: true }; + + if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { + parsed.output = parse.fastpaths(input, options); + } + + if (!parsed.output) { + parsed = parse(input, options); + } + + return picomatch.compileRe(parsed, options, returnOutput, returnState); +}; + +/** + * Create a regular expression from the given regex source string. + * + * ```js + * const picomatch = require('picomatch'); + * // picomatch.toRegex(source[, options]); + * + * const { output } = picomatch.parse('*.js'); + * console.log(picomatch.toRegex(output)); + * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ + * ``` + * @param {String} `source` Regular expression source string. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +picomatch.toRegex = (source, options) => { + try { + const opts = options || {}; + return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); + } catch (err) { + if (options && options.debug === true) throw err; + return /$^/; + } +}; + +/** + * Picomatch constants. + * @return {Object} + */ + +picomatch.constants = constants; + +/** + * Expose "picomatch" + */ + +module.exports = picomatch; diff --git a/node_modules/picomatch/lib/scan.js b/node_modules/picomatch/lib/scan.js new file mode 100644 index 0000000..e59cd7a --- /dev/null +++ b/node_modules/picomatch/lib/scan.js @@ -0,0 +1,391 @@ +'use strict'; + +const utils = require('./utils'); +const { + CHAR_ASTERISK, /* * */ + CHAR_AT, /* @ */ + CHAR_BACKWARD_SLASH, /* \ */ + CHAR_COMMA, /* , */ + CHAR_DOT, /* . */ + CHAR_EXCLAMATION_MARK, /* ! */ + CHAR_FORWARD_SLASH, /* / */ + CHAR_LEFT_CURLY_BRACE, /* { */ + CHAR_LEFT_PARENTHESES, /* ( */ + CHAR_LEFT_SQUARE_BRACKET, /* [ */ + CHAR_PLUS, /* + */ + CHAR_QUESTION_MARK, /* ? */ + CHAR_RIGHT_CURLY_BRACE, /* } */ + CHAR_RIGHT_PARENTHESES, /* ) */ + CHAR_RIGHT_SQUARE_BRACKET /* ] */ +} = require('./constants'); + +const isPathSeparator = code => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; +}; + +const depth = token => { + if (token.isPrefix !== true) { + token.depth = token.isGlobstar ? Infinity : 1; + } +}; + +/** + * Quickly scans a glob pattern and returns an object with a handful of + * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), + * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not + * with `!(`) and `negatedExtglob` (true if the path starts with `!(`). + * + * ```js + * const pm = require('picomatch'); + * console.log(pm.scan('foo/bar/*.js')); + * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an object with tokens and regex source string. + * @api public + */ + +const scan = (input, options) => { + const opts = options || {}; + + const length = input.length - 1; + const scanToEnd = opts.parts === true || opts.scanToEnd === true; + const slashes = []; + const tokens = []; + const parts = []; + + let str = input; + let index = -1; + let start = 0; + let lastIndex = 0; + let isBrace = false; + let isBracket = false; + let isGlob = false; + let isExtglob = false; + let isGlobstar = false; + let braceEscaped = false; + let backslashes = false; + let negated = false; + let negatedExtglob = false; + let finished = false; + let braces = 0; + let prev; + let code; + let token = { value: '', depth: 0, isGlob: false }; + + const eos = () => index >= length; + const peek = () => str.charCodeAt(index + 1); + const advance = () => { + prev = code; + return str.charCodeAt(++index); + }; + + while (index < length) { + code = advance(); + let next; + + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + + if (code === CHAR_LEFT_CURLY_BRACE) { + braceEscaped = true; + } + continue; + } + + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { + braces++; + + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + + if (code === CHAR_LEFT_CURLY_BRACE) { + braces++; + continue; + } + + if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (braceEscaped !== true && code === CHAR_COMMA) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (code === CHAR_RIGHT_CURLY_BRACE) { + braces--; + + if (braces === 0) { + braceEscaped = false; + isBrace = token.isBrace = true; + finished = true; + break; + } + } + } + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (code === CHAR_FORWARD_SLASH) { + slashes.push(index); + tokens.push(token); + token = { value: '', depth: 0, isGlob: false }; + + if (finished === true) continue; + if (prev === CHAR_DOT && index === (start + 1)) { + start += 2; + continue; + } + + lastIndex = index + 1; + continue; + } + + if (opts.noext !== true) { + const isExtglobChar = code === CHAR_PLUS + || code === CHAR_AT + || code === CHAR_ASTERISK + || code === CHAR_QUESTION_MARK + || code === CHAR_EXCLAMATION_MARK; + + if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + isExtglob = token.isExtglob = true; + finished = true; + if (code === CHAR_EXCLAMATION_MARK && index === start) { + negatedExtglob = true; + } + + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + + if (code === CHAR_RIGHT_PARENTHESES) { + isGlob = token.isGlob = true; + finished = true; + break; + } + } + continue; + } + break; + } + } + + if (code === CHAR_ASTERISK) { + if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + break; + } + + if (code === CHAR_QUESTION_MARK) { + isGlob = token.isGlob = true; + finished = true; + + if (scanToEnd === true) { + continue; + } + break; + } + + if (code === CHAR_LEFT_SQUARE_BRACKET) { + while (eos() !== true && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + isBracket = token.isBracket = true; + isGlob = token.isGlob = true; + finished = true; + break; + } + } + + if (scanToEnd === true) { + continue; + } + + break; + } + + if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { + negated = token.negated = true; + start++; + continue; + } + + if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_LEFT_PARENTHESES) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + + if (code === CHAR_RIGHT_PARENTHESES) { + finished = true; + break; + } + } + continue; + } + break; + } + + if (isGlob === true) { + finished = true; + + if (scanToEnd === true) { + continue; + } + + break; + } + } + + if (opts.noext === true) { + isExtglob = false; + isGlob = false; + } + + let base = str; + let prefix = ''; + let glob = ''; + + if (start > 0) { + prefix = str.slice(0, start); + str = str.slice(start); + lastIndex -= start; + } + + if (base && isGlob === true && lastIndex > 0) { + base = str.slice(0, lastIndex); + glob = str.slice(lastIndex); + } else if (isGlob === true) { + base = ''; + glob = str; + } else { + base = str; + } + + if (base && base !== '' && base !== '/' && base !== str) { + if (isPathSeparator(base.charCodeAt(base.length - 1))) { + base = base.slice(0, -1); + } + } + + if (opts.unescape === true) { + if (glob) glob = utils.removeBackslashes(glob); + + if (base && backslashes === true) { + base = utils.removeBackslashes(base); + } + } + + const state = { + prefix, + input, + start, + base, + glob, + isBrace, + isBracket, + isGlob, + isExtglob, + isGlobstar, + negated, + negatedExtglob + }; + + if (opts.tokens === true) { + state.maxDepth = 0; + if (!isPathSeparator(code)) { + tokens.push(token); + } + state.tokens = tokens; + } + + if (opts.parts === true || opts.tokens === true) { + let prevIndex; + + for (let idx = 0; idx < slashes.length; idx++) { + const n = prevIndex ? prevIndex + 1 : start; + const i = slashes[idx]; + const value = input.slice(n, i); + if (opts.tokens) { + if (idx === 0 && start !== 0) { + tokens[idx].isPrefix = true; + tokens[idx].value = prefix; + } else { + tokens[idx].value = value; + } + depth(tokens[idx]); + state.maxDepth += tokens[idx].depth; + } + if (idx !== 0 || value !== '') { + parts.push(value); + } + prevIndex = i; + } + + if (prevIndex && prevIndex + 1 < input.length) { + const value = input.slice(prevIndex + 1); + parts.push(value); + + if (opts.tokens) { + tokens[tokens.length - 1].value = value; + depth(tokens[tokens.length - 1]); + state.maxDepth += tokens[tokens.length - 1].depth; + } + } + + state.slashes = slashes; + state.parts = parts; + } + + return state; +}; + +module.exports = scan; diff --git a/node_modules/picomatch/lib/utils.js b/node_modules/picomatch/lib/utils.js new file mode 100644 index 0000000..c3ca766 --- /dev/null +++ b/node_modules/picomatch/lib/utils.js @@ -0,0 +1,64 @@ +'use strict'; + +const path = require('path'); +const win32 = process.platform === 'win32'; +const { + REGEX_BACKSLASH, + REGEX_REMOVE_BACKSLASH, + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL +} = require('./constants'); + +exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); +exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); +exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); +exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); +exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); + +exports.removeBackslashes = str => { + return str.replace(REGEX_REMOVE_BACKSLASH, match => { + return match === '\\' ? '' : match; + }); +}; + +exports.supportsLookbehinds = () => { + const segs = process.version.slice(1).split('.').map(Number); + if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { + return true; + } + return false; +}; + +exports.isWindows = options => { + if (options && typeof options.windows === 'boolean') { + return options.windows; + } + return win32 === true || path.sep === '\\'; +}; + +exports.escapeLast = (input, char, lastIdx) => { + const idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) return input; + if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); + return `${input.slice(0, idx)}\\${input.slice(idx)}`; +}; + +exports.removePrefix = (input, state = {}) => { + let output = input; + if (output.startsWith('./')) { + output = output.slice(2); + state.prefix = './'; + } + return output; +}; + +exports.wrapOutput = (input, state = {}, options = {}) => { + const prepend = options.contains ? '' : '^'; + const append = options.contains ? '' : '$'; + + let output = `${prepend}(?:${input})${append}`; + if (state.negated === true) { + output = `(?:^(?!${output}).*$)`; + } + return output; +}; diff --git a/node_modules/picomatch/package.json b/node_modules/picomatch/package.json new file mode 100644 index 0000000..3db22d4 --- /dev/null +++ b/node_modules/picomatch/package.json @@ -0,0 +1,81 @@ +{ + "name": "picomatch", + "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.", + "version": "2.3.1", + "homepage": "https://github.com/micromatch/picomatch", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "funding": "https://github.com/sponsors/jonschlinkert", + "repository": "micromatch/picomatch", + "bugs": { + "url": "https://github.com/micromatch/picomatch/issues" + }, + "license": "MIT", + "files": [ + "index.js", + "lib" + ], + "main": "index.js", + "engines": { + "node": ">=8.6" + }, + "scripts": { + "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .", + "mocha": "mocha --reporter dot", + "test": "npm run lint && npm run mocha", + "test:ci": "npm run test:cover", + "test:cover": "nyc npm run mocha" + }, + "devDependencies": { + "eslint": "^6.8.0", + "fill-range": "^7.0.1", + "gulp-format-md": "^2.0.0", + "mocha": "^6.2.2", + "nyc": "^15.0.0", + "time-require": "github:jonschlinkert/time-require" + }, + "keywords": [ + "glob", + "match", + "picomatch" + ], + "nyc": { + "reporter": [ + "html", + "lcov", + "text-summary" + ] + }, + "verb": { + "toc": { + "render": true, + "method": "preWrite", + "maxdepth": 3 + }, + "layout": "empty", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "related": { + "list": [ + "braces", + "micromatch" + ] + }, + "reflinks": [ + "braces", + "expand-brackets", + "extglob", + "fill-range", + "micromatch", + "minimatch", + "nanomatch", + "picomatch" + ] + } +} diff --git a/node_modules/pstree.remy/.travis.yml b/node_modules/pstree.remy/.travis.yml new file mode 100644 index 0000000..5bf093e --- /dev/null +++ b/node_modules/pstree.remy/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +cache: + directories: + - ~/.npm +notifications: + email: false +node_js: + - '8' diff --git a/node_modules/pstree.remy/LICENSE b/node_modules/pstree.remy/LICENSE new file mode 100644 index 0000000..e83bea6 --- /dev/null +++ b/node_modules/pstree.remy/LICENSE @@ -0,0 +1,7 @@ +The MIT License (MIT) +Copyright © 2019 Remy Sharp, https://remysharp.com +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/pstree.remy/README.md b/node_modules/pstree.remy/README.md new file mode 100644 index 0000000..5f44c62 --- /dev/null +++ b/node_modules/pstree.remy/README.md @@ -0,0 +1,26 @@ +# pstree.remy + +> Cross platform ps-tree (including unix flavours without ps) + +## Installation + +```shel +npm install pstree.remy +``` + +## Usage + +```js +const psTree = psTree require('pstree.remy'); + +psTree(PID, (err, pids) => { + if (err) { + console.error(err); + } + console.log(pids) +}); + +console.log(psTree.hasPS + ? "This platform has the ps shell command" + : "This platform does not have the ps shell command"); +``` diff --git a/node_modules/pstree.remy/lib/index.js b/node_modules/pstree.remy/lib/index.js new file mode 100644 index 0000000..743e997 --- /dev/null +++ b/node_modules/pstree.remy/lib/index.js @@ -0,0 +1,37 @@ +const exec = require('child_process').exec; +const tree = require('./tree'); +const utils = require('./utils'); +var hasPS = true; + +// discover if the OS has `ps`, and therefore can use psTree +exec('ps', (error) => { + module.exports.hasPS = hasPS = !error; +}); + +module.exports = function main(pid, callback) { + if (typeof pid === 'number') { + pid = pid.toString(); + } + + if (hasPS && !process.env.NO_PS) { + return tree(pid, callback); + } + + utils + .getStat() + .then(utils.tree) + .then((tree) => utils.pidsForTree(tree, pid)) + .then((res) => + callback( + null, + res.map((p) => p.PID) + ) + ) + .catch((error) => callback(error)); +}; + +if (!module.parent) { + module.exports(process.argv[2], (e, pids) => console.log(pids)); +} + +module.exports.hasPS = hasPS; diff --git a/node_modules/pstree.remy/lib/tree.js b/node_modules/pstree.remy/lib/tree.js new file mode 100644 index 0000000..bac7cce --- /dev/null +++ b/node_modules/pstree.remy/lib/tree.js @@ -0,0 +1,37 @@ +const spawn = require('child_process').spawn; + +module.exports = function (rootPid, callback) { + const pidsOfInterest = new Set([parseInt(rootPid, 10)]); + var output = ''; + + // *nix + const ps = spawn('ps', ['-A', '-o', 'ppid,pid']); + ps.stdout.on('data', (data) => { + output += data.toString('ascii'); + }); + + ps.on('close', () => { + try { + const res = output + .split('\n') + .slice(1) + .map((_) => _.trim()) + .reduce((acc, line) => { + const pids = line.split(/\s+/); + const ppid = parseInt(pids[0], 10); + + if (pidsOfInterest.has(ppid)) { + const pid = parseInt(pids[1], 10); + acc.push(pid); + pidsOfInterest.add(pid); + } + + return acc; + }, []); + + callback(null, res); + } catch (e) { + callback(e, null); + } + }); +}; diff --git a/node_modules/pstree.remy/lib/utils.js b/node_modules/pstree.remy/lib/utils.js new file mode 100644 index 0000000..8fa5719 --- /dev/null +++ b/node_modules/pstree.remy/lib/utils.js @@ -0,0 +1,53 @@ +const spawn = require('child_process').spawn; + +module.exports = { tree, pidsForTree, getStat }; + +function getStat() { + return new Promise((resolve) => { + const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`; + const spawned = spawn('sh', ['-c', command], { + stdio: ['pipe', 'pipe', 'pipe'], + }); + + var res = ''; + spawned.stdout.on('data', (data) => (res += data)); + spawned.on('close', () => resolve(res)); + }); +} + +function template(s) { + var stat = null; + // 'pid', 'comm', 'state', 'ppid', 'pgrp' + // %d (%s) %c %d %d + s.replace( + /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g, + (all, PID, COMMAND, STAT, PPID) => { + stat = { PID, COMMAND, PPID, STAT }; + } + ); + + return stat; +} + +function tree(stats) { + const processes = stats.split('\n').map(template).filter(Boolean); + + return processes; +} + +function pidsForTree(tree, pid) { + if (typeof pid === 'number') { + pid = pid.toString(); + } + const parents = [pid]; + const pids = []; + + tree.forEach((proc) => { + if (parents.indexOf(proc.PPID) !== -1) { + parents.push(proc.PID); + pids.push(proc); + } + }); + + return pids; +} diff --git a/node_modules/pstree.remy/package.json b/node_modules/pstree.remy/package.json new file mode 100644 index 0000000..35c7068 --- /dev/null +++ b/node_modules/pstree.remy/package.json @@ -0,0 +1,33 @@ +{ + "name": "pstree.remy", + "version": "1.1.8", + "main": "lib/index.js", + "prettier": { + "trailingComma": "es5", + "semi": true, + "singleQuote": true + }, + "scripts": { + "test": "tap tests/*.test.js", + "_prepublish": "npm test" + }, + "keywords": [ + "ps", + "pstree", + "ps tree" + ], + "author": "Remy Sharp", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/remy/pstree.git" + }, + "devDependencies": { + "tap": "^11.0.0" + }, + "directories": { + "test": "tests" + }, + "dependencies": {}, + "description": "Collects the full tree of processes from /proc" +} diff --git a/node_modules/pstree.remy/tests/fixtures/index.js b/node_modules/pstree.remy/tests/fixtures/index.js new file mode 100644 index 0000000..4cdbcb1 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/index.js @@ -0,0 +1,13 @@ +const spawn = require('child_process').spawn; +function run() { + spawn( + 'sh', + ['-c', 'node -e "setInterval(() => console.log(`running`), 200)"'], + { + stdio: 'pipe', + } + ); +} + +var runCallCount = process.argv[2] || 1; +for (var i = 0; i < runCallCount; i++) run(); diff --git a/node_modules/pstree.remy/tests/fixtures/out1 b/node_modules/pstree.remy/tests/fixtures/out1 new file mode 100644 index 0000000..abfe581 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/out1 @@ -0,0 +1,10 @@ +1 (npm) S 0 1 1 34816 1 4210944 11112 0 0 0 45 8 0 0 20 0 10 0 330296 1089871872 11809 18446744073709551615 4194304 29343848 140726436642896 0 0 0 0 4096 2072112895 0 0 0 17 0 0 0 0 0 0 31441000 31537208 37314560 140726436650815 140726436650847 140726436650847 140726436650986 0 +15 (sh) S 1 1 1 34816 1 4210688 115 0 0 0 0 0 0 0 20 0 1 0 330372 4399104 187 18446744073709551615 94374393548800 94374393655428 140722913272992 0 0 0 0 0 65538 0 0 0 17 0 0 0 0 0 0 94374395756424 94374395761184 94374404673536 140722913278928 140722913278959 140722913278959 140722913284080 0 +16 (node) S 15 1 1 34816 1 4210688 6930 103 0 0 32 2 0 0 20 0 10 0 330373 1068478464 8412 18446744073709551615 4194304 29343848 140727228046064 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 1 0 0 31441000 31537208 52584448 140727228050313 140727228050383 140727228050383 140727228055530 0 +27 (sh) S 16 1 1 34816 1 4210688 111 0 0 0 0 0 0 0 20 0 1 0 330410 4399104 193 18446744073709551615 94848235986944 94848236093572 140727019991184 0 0 0 0 0 65538 0 0 0 17 1 0 0 0 0 0 94848238194568 94848238199328 94848261660672 140727019998122 140727019998165 140727019998165 140727020003312 0 +28 (node) S 27 1 1 34816 1 4210688 3576 268 0 0 12 2 0 0 20 0 10 0 330411 930213888 6760 18446744073709551615 4194304 29343848 140726559664992 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 0 0 0 31441000 31537208 32591872 140726559669117 140726559669199 140726559669199 140726559674346 0 +39 (node) S 28 1 1 34816 1 4210688 47517 0 0 0 151 9 0 0 20 0 6 0 330427 985739264 31859 18446744073709551615 4194304 29343848 140737324503920 0 0 0 0 4096 134234626 0 0 0 17 0 0 0 0 0 0 31441000 31537208 51585024 140737324510060 140737324510159 140737324510159 140737324515306 0 +45 (bash) S 0 45 45 34817 50 4210944 752 256 0 0 2 0 0 0 20 0 1 0 331039 18628608 789 18446744073709551615 4194304 5242124 140724425887696 0 0 0 65536 3670020 1266777851 0 0 0 17 1 0 0 0 0 0 7341384 7388228 30310400 140724425891678 140724425891683 140724425891683 140724425891822 0 +cat: /proc/50/stat: No such file or directory +cat: /proc/51/stat: No such file or directory +52 (xargs) S 45 50 45 34817 50 4210688 179 661 0 0 0 0 0 0 20 0 1 0 331544 4608000 346 18446744073709551615 94587588550656 94587588614028 140735223856048 0 0 0 0 0 2560 0 0 0 17 1 0 0 0 0 0 94587590711464 94587590713504 94587603169280 140735223861006 140735223861035 140735223861035 140735223861225 0 diff --git a/node_modules/pstree.remy/tests/fixtures/out2 b/node_modules/pstree.remy/tests/fixtures/out2 new file mode 100644 index 0000000..3b31137 --- /dev/null +++ b/node_modules/pstree.remy/tests/fixtures/out2 @@ -0,0 +1,29 @@ +cat: /proc/4087/stat: No such file or directory +cat: /proc/4088/stat: No such file or directory +1 (init) S 0 1 1 0 -1 4210944 9227 55994 29 319 7 5 68 16 20 0 1 0 1286281 33660928 855 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 0 0 0 17 4 0 0 3 0 0 0 0 0 0 0 0 0 0 +1032 (ntpd) S 1 1032 1032 0 -1 4211008 178 0 1 0 0 0 0 0 20 0 1 0 1287033 25743360 1058 18446744073709551615 1 1 0 0 0 0 0 4096 27207 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +126 (irqbalance) S 1 126 126 0 -1 1077952832 1217 0 0 0 1 6 0 0 20 0 1 0 1286749 20189184 647 18446744073709551615 1 1 0 0 0 0 0 0 3 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +181 (mysqld) S 1 181 181 0 -1 4210944 6399 0 46 0 8 6 0 0 20 0 22 0 1286761 748453888 14476 18446744073709551615 1 1 0 0 0 0 552967 4096 26345 0 0 0 17 4 0 0 10 0 0 0 0 0 0 0 0 0 0 +194 (memcached) S 1 187 187 0 -1 4210944 252 0 4 0 0 0 0 0 20 0 6 0 1286766 333221888 648 18446744073709551615 1 1 0 0 0 0 0 4096 2 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +243 (dbus-daemon) S 1 243 243 0 -1 4211008 67 0 0 0 0 0 0 0 20 0 1 0 1286779 40087552 598 18446744073709551615 1 1 0 0 0 0 0 0 16385 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +254 (rsyslogd) S 1 254 254 0 -1 4211008 107 0 0 0 2 2 0 0 20 0 3 0 1286782 186601472 696 18446744073709551615 1 1 0 0 0 0 0 16781830 1133601 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +265 (systemd-logind) S 1 265 265 0 -1 4210944 276 0 2 0 0 0 0 0 20 0 1 0 1286786 35880960 720 18446744073709551615 1 1 0 0 0 0 0 0 0 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +333 (postgres) S 1 303 303 0 -1 4210688 3169 3466 15 18 0 1 1 1 20 0 1 0 1286817 156073984 5002 18446744073709551615 1 1 0 0 0 0 0 19935232 84487 0 0 0 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0 +359 (postgres) S 333 359 359 0 -1 4210752 90 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16805888 2567 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +360 (postgres) S 333 360 360 0 -1 4210752 119 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791554 16901 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +361 (postgres) S 333 361 361 0 -1 4210752 87 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791552 16903 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +362 (postgres) S 333 362 362 0 -1 4210752 292 0 3 0 0 0 0 0 20 0 1 0 1286822 156930048 1373 18446744073709551615 1 1 0 0 0 0 0 19927040 27271 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +363 (postgres) S 333 363 363 0 -1 4210752 82 0 0 0 0 0 0 0 20 0 1 0 1286822 115924992 887 18446744073709551615 1 1 0 0 0 0 0 16808450 5 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +4050 (npm) S 50 50 50 34817 50 4210688 5109 0 0 0 36 3 0 0 20 0 10 0 1292968 738025472 10051 18446744073709551615 4194304 33165900 140723623956256 0 0 0 0 4096 134300162 0 0 0 17 4 0 0 0 0 0 35263056 35370992 48369664 140723623964237 140723623964294 140723623964294 140723623968712 0 +4060 (sh) S 4050 50 50 34817 50 4210688 121 0 0 0 0 0 0 0 20 0 1 0 1293007 4579328 174 18446744073709551615 94347643936768 94347644049516 140735136055088 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347646148008 94347646153216 94347660038144 140735136063095 140735136063129 140735136063129 140735136071664 0 +4061 (node) S 4060 50 50 34817 50 4210688 6501 0 0 0 42 2 0 0 20 0 6 0 1293008 705769472 10211 18446744073709551615 4194304 33165900 140730532686288 0 0 0 0 4096 2072111671 0 0 0 17 5 0 0 0 0 0 35263056 35370992 45867008 140730532695579 140730532695657 140730532695657 140730532704200 0 +4067 (node) S 4061 50 50 34817 50 4210688 6746 221 0 0 38 3 0 0 20 0 10 0 1293051 738910208 10527 18446744073709551615 4194304 33165900 140724824971632 0 0 0 0 4096 2072111671 0 0 0 17 4 0 0 0 0 0 35263056 35370992 68595712 140724824980995 140724824981063 140724824981063 140724824989640 0 +4079 (sh) S 4067 50 50 34817 50 4210688 118 0 0 0 0 0 0 0 20 0 1 0 1293092 4579328 194 18446744073709551615 94573702131712 94573702244460 140724712357120 0 0 0 0 0 65538 1 0 0 17 4 0 0 0 0 0 94573704342952 94573704348160 94573718511616 140724712361487 140724712361583 140724712361583 140724712370160 0 +4080 (node) S 4079 50 50 34817 50 4210688 2428 0 0 0 8 1 0 0 20 0 6 0 1293093 693059584 7251 18446744073709551615 4194304 33165900 140726023392816 0 0 0 0 4096 134234626 0 0 0 17 5 0 0 0 0 0 35263056 35370992 55226368 140726023396847 140726023396935 140726023396935 140726023405512 0 +4086 (sh) S 4067 50 50 34817 50 4210688 131 244 0 0 0 0 0 0 20 0 1 0 1293143 4579328 200 18446744073709551615 94347550273536 94347550386284 140737219399136 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347552484776 94347552489984 94347554299904 140737219403308 140737219403375 140737219403375 140737219411952 0 +4089 (xargs) S 4086 50 50 34817 50 4210688 333 1924 0 0 0 0 0 0 20 0 1 0 1293143 17600512 477 18446744073709551615 4194304 4232732 140721633759248 0 0 0 0 0 0 1 0 0 17 5 0 0 0 0 0 6331920 6332980 32182272 140721633762891 140721633762920 140721633762920 140721633771497 0 +50 (bash) S 0 50 50 34817 50 4210944 43914 1032463 9 705 44 21 4213 818 20 0 1 0 1286336 42266624 3599 18446744073709551615 4194304 5173404 140732749083280 0 0 0 65536 4 1132560123 1 0 0 17 4 0 0 410 0 0 7273968 7310504 21196800 140732749086490 140732749086517 140732749086517 140732749086702 0 +79 (acpid) S 1 79 79 0 -1 4210752 46 0 0 0 0 0 0 0 20 0 1 0 1286717 4493312 407 18446744073709551615 1 1 0 0 0 0 0 4096 16391 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0 +83 (sshd) S 1 83 83 0 -1 4210944 354 0 27 0 0 0 0 0 20 0 1 0 1286718 62873600 1290 18446744073709551615 1 1 0 0 0 0 0 4096 81925 0 0 0 17 4 0 0 30 0 0 0 0 0 0 0 0 0 0 +94 (cron) S 1 94 94 0 -1 1077952576 103 449 0 1 0 0 0 0 20 0 1 0 1286743 24240128 559 18446744073709551615 1 1 0 0 0 0 0 0 65537 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 +95 (atd) S 1 95 95 0 -1 1077952576 28 0 0 0 0 0 0 0 20 0 1 0 1286743 19615744 41 18446744073709551615 1 1 0 0 0 0 0 0 81923 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/node_modules/pstree.remy/tests/index.test.js b/node_modules/pstree.remy/tests/index.test.js new file mode 100644 index 0000000..50096b9 --- /dev/null +++ b/node_modules/pstree.remy/tests/index.test.js @@ -0,0 +1,51 @@ +const tap = require('tap'); +const test = tap.test; +const readFile = require('fs').readFileSync; +const spawn = require('child_process').spawn; +const pstree = require('../'); +const { tree, pidsForTree, getStat } = require('../lib/utils'); + +if (process.platform !== 'darwin') { + test('reads from /proc', async (t) => { + const ps = await getStat(); + t.ok(ps.split('\n').length > 1); + }); +} + +test('tree for live env', async (t) => { + const pid = 4079; + const fixture = readFile(__dirname + '/fixtures/out2', 'utf8'); + const ps = await tree(fixture); + t.deepEqual( + pidsForTree(ps, pid).map((_) => _.PID), + ['4080'] + ); +}); + +function testTree(t, runCallCount) { + const sub = spawn('node', [`${__dirname}/fixtures/index.js`, runCallCount], { + stdio: 'pipe', + }); + setTimeout(() => { + const pid = sub.pid; + + pstree(pid, (error, pids) => { + pids.concat([pid]).forEach((p) => { + spawn('kill', ['-s', 'SIGTERM', p]); + }); + + // the fixture launches `sh` which launches node which is why we + // are looking for two processes. + // Important: IDKW but MacOS seems to skip the `sh` process. no idea. + t.equal(pids.length, runCallCount * 2); + t.end(); + }); + }, 1000); +} + +test('can read full process tree', (t) => { + testTree(t, 1); +}); +test('can read full process tree with multiple processes', (t) => { + testTree(t, 2); +}); diff --git a/node_modules/readdirp/LICENSE b/node_modules/readdirp/LICENSE new file mode 100644 index 0000000..037cbb4 --- /dev/null +++ b/node_modules/readdirp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/readdirp/README.md b/node_modules/readdirp/README.md new file mode 100644 index 0000000..465593c --- /dev/null +++ b/node_modules/readdirp/README.md @@ -0,0 +1,122 @@ +# readdirp [![Weekly downloads](https://img.shields.io/npm/dw/readdirp.svg)](https://github.com/paulmillr/readdirp) + +Recursive version of [fs.readdir](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback). Exposes a **stream API** and a **promise API**. + + +```sh +npm install readdirp +``` + +```javascript +const readdirp = require('readdirp'); + +// Use streams to achieve small RAM & CPU footprint. +// 1) Streams example with for-await. +for await (const entry of readdirp('.')) { + const {path} = entry; + console.log(`${JSON.stringify({path})}`); +} + +// 2) Streams example, non for-await. +// Print out all JS files along with their size within the current folder & subfolders. +readdirp('.', {fileFilter: '*.js', alwaysStat: true}) + .on('data', (entry) => { + const {path, stats: {size}} = entry; + console.log(`${JSON.stringify({path, size})}`); + }) + // Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted + .on('warn', error => console.error('non-fatal error', error)) + .on('error', error => console.error('fatal error', error)) + .on('end', () => console.log('done')); + +// 3) Promise example. More RAM and CPU than streams / for-await. +const files = await readdirp.promise('.'); +console.log(files.map(file => file.path)); + +// Other options. +readdirp('test', { + fileFilter: '*.js', + directoryFilter: ['!.git', '!*modules'] + // directoryFilter: (di) => di.basename.length === 9 + type: 'files_directories', + depth: 1 +}); +``` + +For more examples, check out `examples` directory. + +## API + +`const stream = readdirp(root[, options])` — **Stream API** + +- Reads given root recursively and returns a `stream` of [entry infos](#entryinfo) +- Optionally can be used like `for await (const entry of stream)` with node.js 10+ (`asyncIterator`). +- `on('data', (entry) => {})` [entry info](#entryinfo) for every file / dir. +- `on('warn', (error) => {})` non-fatal `Error` that prevents a file / dir from being processed. Example: inaccessible to the user. +- `on('error', (error) => {})` fatal `Error` which also ends the stream. Example: illegal options where passed. +- `on('end')` — we are done. Called when all entries were found and no more will be emitted. +- `on('close')` — stream is destroyed via `stream.destroy()`. + Could be useful if you want to manually abort even on a non fatal error. + At that point the stream is no longer `readable` and no more entries, warning or errors are emitted +- To learn more about streams, consult the very detailed [nodejs streams documentation](https://nodejs.org/api/stream.html) + or the [stream-handbook](https://github.com/substack/stream-handbook) + +`const entries = await readdirp.promise(root[, options])` — **Promise API**. Returns a list of [entry infos](#entryinfo). + +First argument is awalys `root`, path in which to start reading and recursing into subdirectories. + +### options + +- `fileFilter: ["*.js"]`: filter to include or exclude files. A `Function`, Glob string or Array of glob strings. + - **Function**: a function that takes an entry info as a parameter and returns true to include or false to exclude the entry + - **Glob string**: a string (e.g., `*.js`) which is matched using [picomatch](https://github.com/micromatch/picomatch), so go there for more + information. Globstars (`**`) are not supported since specifying a recursive pattern for an already recursive function doesn't make sense. Negated globs (as explained in the minimatch documentation) are allowed, e.g., `!*.txt` matches everything but text files. + - **Array of glob strings**: either need to be all inclusive or all exclusive (negated) patterns otherwise an error is thrown. + `['*.json', '*.js']` includes all JavaScript and Json files. + `['!.git', '!node_modules']` includes all directories except the '.git' and 'node_modules'. + - Directories that do not pass a filter will not be recursed into. +- `directoryFilter: ['!.git']`: filter to include/exclude directories found and to recurse into. Directories that do not pass a filter will not be recursed into. +- `depth: 5`: depth at which to stop recursing even if more subdirectories are found +- `type: 'files'`: determines if data events on the stream should be emitted for `'files'` (default), `'directories'`, `'files_directories'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes. +- `alwaysStat: false`: always return `stats` property for every file. Default is `false`, readdirp will return `Dirent` entries. Setting it to `true` can double readdir execution time - use it only when you need file `size`, `mtime` etc. Cannot be enabled on node <10.10.0. +- `lstat: false`: include symlink entries in the stream along with files. When `true`, `fs.lstat` would be used instead of `fs.stat` + +### `EntryInfo` + +Has the following properties: + +- `path: 'assets/javascripts/react.js'`: path to the file/directory (relative to given root) +- `fullPath: '/Users/dev/projects/app/assets/javascripts/react.js'`: full path to the file/directory found +- `basename: 'react.js'`: name of the file/directory +- `dirent: fs.Dirent`: built-in [dir entry object](https://nodejs.org/api/fs.html#fs_class_fs_dirent) - only with `alwaysStat: false` +- `stats: fs.Stats`: built in [stat object](https://nodejs.org/api/fs.html#fs_class_fs_stats) - only with `alwaysStat: true` + +## Changelog + +- 3.5 (Oct 13, 2020) disallows recursive directory-based symlinks. + Before, it could have entered infinite loop. +- 3.4 (Mar 19, 2020) adds support for directory-based symlinks. +- 3.3 (Dec 6, 2019) stabilizes RAM consumption and enables perf management with `highWaterMark` option. Fixes race conditions related to `for-await` looping. +- 3.2 (Oct 14, 2019) improves performance by 250% and makes streams implementation more idiomatic. +- 3.1 (Jul 7, 2019) brings `bigint` support to `stat` output on Windows. This is backwards-incompatible for some cases. Be careful. It you use it incorrectly, you'll see "TypeError: Cannot mix BigInt and other types, use explicit conversions". +- 3.0 brings huge performance improvements and stream backpressure support. +- Upgrading 2.x to 3.x: + - Signature changed from `readdirp(options)` to `readdirp(root, options)` + - Replaced callback API with promise API. + - Renamed `entryType` option to `type` + - Renamed `entryType: 'both'` to `'files_directories'` + - `EntryInfo` + - Renamed `stat` to `stats` + - Emitted only when `alwaysStat: true` + - `dirent` is emitted instead of `stats` by default with `alwaysStat: false` + - Renamed `name` to `basename` + - Removed `parentDir` and `fullParentDir` properties +- Supported node.js versions: + - 3.x: node 8+ + - 2.x: node 0.6+ + +## License + +Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller () + +MIT License, see [LICENSE](LICENSE) file. diff --git a/node_modules/readdirp/index.d.ts b/node_modules/readdirp/index.d.ts new file mode 100644 index 0000000..cbbd76c --- /dev/null +++ b/node_modules/readdirp/index.d.ts @@ -0,0 +1,43 @@ +// TypeScript Version: 3.2 + +/// + +import * as fs from 'fs'; +import { Readable } from 'stream'; + +declare namespace readdir { + interface EntryInfo { + path: string; + fullPath: string; + basename: string; + stats?: fs.Stats; + dirent?: fs.Dirent; + } + + interface ReaddirpOptions { + root?: string; + fileFilter?: string | string[] | ((entry: EntryInfo) => boolean); + directoryFilter?: string | string[] | ((entry: EntryInfo) => boolean); + type?: 'files' | 'directories' | 'files_directories' | 'all'; + lstat?: boolean; + depth?: number; + alwaysStat?: boolean; + } + + interface ReaddirpStream extends Readable, AsyncIterable { + read(): EntryInfo; + [Symbol.asyncIterator](): AsyncIterableIterator; + } + + function promise( + root: string, + options?: ReaddirpOptions + ): Promise; +} + +declare function readdir( + root: string, + options?: readdir.ReaddirpOptions +): readdir.ReaddirpStream; + +export = readdir; diff --git a/node_modules/readdirp/index.js b/node_modules/readdirp/index.js new file mode 100644 index 0000000..cf739b2 --- /dev/null +++ b/node_modules/readdirp/index.js @@ -0,0 +1,287 @@ +'use strict'; + +const fs = require('fs'); +const { Readable } = require('stream'); +const sysPath = require('path'); +const { promisify } = require('util'); +const picomatch = require('picomatch'); + +const readdir = promisify(fs.readdir); +const stat = promisify(fs.stat); +const lstat = promisify(fs.lstat); +const realpath = promisify(fs.realpath); + +/** + * @typedef {Object} EntryInfo + * @property {String} path + * @property {String} fullPath + * @property {fs.Stats=} stats + * @property {fs.Dirent=} dirent + * @property {String} basename + */ + +const BANG = '!'; +const RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR'; +const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]); +const FILE_TYPE = 'files'; +const DIR_TYPE = 'directories'; +const FILE_DIR_TYPE = 'files_directories'; +const EVERYTHING_TYPE = 'all'; +const ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE]; + +const isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code); +const [maj, min] = process.versions.node.split('.').slice(0, 2).map(n => Number.parseInt(n, 10)); +const wantBigintFsStats = process.platform === 'win32' && (maj > 10 || (maj === 10 && min >= 5)); + +const normalizeFilter = filter => { + if (filter === undefined) return; + if (typeof filter === 'function') return filter; + + if (typeof filter === 'string') { + const glob = picomatch(filter.trim()); + return entry => glob(entry.basename); + } + + if (Array.isArray(filter)) { + const positive = []; + const negative = []; + for (const item of filter) { + const trimmed = item.trim(); + if (trimmed.charAt(0) === BANG) { + negative.push(picomatch(trimmed.slice(1))); + } else { + positive.push(picomatch(trimmed)); + } + } + + if (negative.length > 0) { + if (positive.length > 0) { + return entry => + positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename)); + } + return entry => !negative.some(f => f(entry.basename)); + } + return entry => positive.some(f => f(entry.basename)); + } +}; + +class ReaddirpStream extends Readable { + static get defaultOptions() { + return { + root: '.', + /* eslint-disable no-unused-vars */ + fileFilter: (path) => true, + directoryFilter: (path) => true, + /* eslint-enable no-unused-vars */ + type: FILE_TYPE, + lstat: false, + depth: 2147483648, + alwaysStat: false + }; + } + + constructor(options = {}) { + super({ + objectMode: true, + autoDestroy: true, + highWaterMark: options.highWaterMark || 4096 + }); + const opts = { ...ReaddirpStream.defaultOptions, ...options }; + const { root, type } = opts; + + this._fileFilter = normalizeFilter(opts.fileFilter); + this._directoryFilter = normalizeFilter(opts.directoryFilter); + + const statMethod = opts.lstat ? lstat : stat; + // Use bigint stats if it's windows and stat() supports options (node 10+). + if (wantBigintFsStats) { + this._stat = path => statMethod(path, { bigint: true }); + } else { + this._stat = statMethod; + } + + this._maxDepth = opts.depth; + this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsEverything = type === EVERYTHING_TYPE; + this._root = sysPath.resolve(root); + this._isDirent = ('Dirent' in fs) && !opts.alwaysStat; + this._statsProp = this._isDirent ? 'dirent' : 'stats'; + this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent }; + + // Launch stream with one parent, the root dir. + this.parents = [this._exploreDir(root, 1)]; + this.reading = false; + this.parent = undefined; + } + + async _read(batch) { + if (this.reading) return; + this.reading = true; + + try { + while (!this.destroyed && batch > 0) { + const { path, depth, files = [] } = this.parent || {}; + + if (files.length > 0) { + const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path)); + for (const entry of await Promise.all(slice)) { + if (this.destroyed) return; + + const entryType = await this._getEntryType(entry); + if (entryType === 'directory' && this._directoryFilter(entry)) { + if (depth <= this._maxDepth) { + this.parents.push(this._exploreDir(entry.fullPath, depth + 1)); + } + + if (this._wantsDir) { + this.push(entry); + batch--; + } + } else if ((entryType === 'file' || this._includeAsFile(entry)) && this._fileFilter(entry)) { + if (this._wantsFile) { + this.push(entry); + batch--; + } + } + } + } else { + const parent = this.parents.pop(); + if (!parent) { + this.push(null); + break; + } + this.parent = await parent; + if (this.destroyed) return; + } + } + } catch (error) { + this.destroy(error); + } finally { + this.reading = false; + } + } + + async _exploreDir(path, depth) { + let files; + try { + files = await readdir(path, this._rdOptions); + } catch (error) { + this._onError(error); + } + return { files, depth, path }; + } + + async _formatEntry(dirent, path) { + let entry; + try { + const basename = this._isDirent ? dirent.name : dirent; + const fullPath = sysPath.resolve(sysPath.join(path, basename)); + entry = { path: sysPath.relative(this._root, fullPath), fullPath, basename }; + entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath); + } catch (err) { + this._onError(err); + } + return entry; + } + + _onError(err) { + if (isNormalFlowError(err) && !this.destroyed) { + this.emit('warn', err); + } else { + this.destroy(err); + } + } + + async _getEntryType(entry) { + // entry may be undefined, because a warning or an error were emitted + // and the statsProp is undefined + const stats = entry && entry[this._statsProp]; + if (!stats) { + return; + } + if (stats.isFile()) { + return 'file'; + } + if (stats.isDirectory()) { + return 'directory'; + } + if (stats && stats.isSymbolicLink()) { + const full = entry.fullPath; + try { + const entryRealPath = await realpath(full); + const entryRealPathStats = await lstat(entryRealPath); + if (entryRealPathStats.isFile()) { + return 'file'; + } + if (entryRealPathStats.isDirectory()) { + const len = entryRealPath.length; + if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) { + const recursiveError = new Error( + `Circular symlink detected: "${full}" points to "${entryRealPath}"` + ); + recursiveError.code = RECURSIVE_ERROR_CODE; + return this._onError(recursiveError); + } + return 'directory'; + } + } catch (error) { + this._onError(error); + } + } + } + + _includeAsFile(entry) { + const stats = entry && entry[this._statsProp]; + + return stats && this._wantsEverything && !stats.isDirectory(); + } +} + +/** + * @typedef {Object} ReaddirpArguments + * @property {Function=} fileFilter + * @property {Function=} directoryFilter + * @property {String=} type + * @property {Number=} depth + * @property {String=} root + * @property {Boolean=} lstat + * @property {Boolean=} bigint + */ + +/** + * Main function which ends up calling readdirRec and reads all files and directories in given root recursively. + * @param {String} root Root directory + * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth + */ +const readdirp = (root, options = {}) => { + let type = options.entryType || options.type; + if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility + if (type) options.type = type; + if (!root) { + throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)'); + } else if (typeof root !== 'string') { + throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)'); + } else if (type && !ALL_TYPES.includes(type)) { + throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`); + } + + options.root = root; + return new ReaddirpStream(options); +}; + +const readdirpPromise = (root, options = {}) => { + return new Promise((resolve, reject) => { + const files = []; + readdirp(root, options) + .on('data', entry => files.push(entry)) + .on('end', () => resolve(files)) + .on('error', error => reject(error)); + }); +}; + +readdirp.promise = readdirpPromise; +readdirp.ReaddirpStream = ReaddirpStream; +readdirp.default = readdirp; + +module.exports = readdirp; diff --git a/node_modules/readdirp/package.json b/node_modules/readdirp/package.json new file mode 100644 index 0000000..dba5388 --- /dev/null +++ b/node_modules/readdirp/package.json @@ -0,0 +1,122 @@ +{ + "name": "readdirp", + "description": "Recursive version of fs.readdir with streaming API.", + "version": "3.6.0", + "homepage": "https://github.com/paulmillr/readdirp", + "repository": { + "type": "git", + "url": "git://github.com/paulmillr/readdirp.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/paulmillr/readdirp/issues" + }, + "author": "Thorsten Lorenz (thlorenz.com)", + "contributors": [ + "Thorsten Lorenz (thlorenz.com)", + "Paul Miller (https://paulmillr.com)" + ], + "main": "index.js", + "engines": { + "node": ">=8.10.0" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "recursive", + "fs", + "stream", + "streams", + "readdir", + "filesystem", + "find", + "filter" + ], + "scripts": { + "dtslint": "dtslint", + "nyc": "nyc", + "mocha": "mocha --exit", + "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .", + "test": "npm run lint && nyc npm run mocha" + }, + "dependencies": { + "picomatch": "^2.2.1" + }, + "devDependencies": { + "@types/node": "^14", + "chai": "^4.2", + "chai-subset": "^1.6", + "dtslint": "^3.3.0", + "eslint": "^7.0.0", + "mocha": "^7.1.1", + "nyc": "^15.0.0", + "rimraf": "^3.0.0", + "typescript": "^4.0.3" + }, + "nyc": { + "reporter": [ + "html", + "text" + ] + }, + "eslintConfig": { + "root": true, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 9, + "sourceType": "script" + }, + "env": { + "node": true, + "es6": true + }, + "rules": { + "array-callback-return": "error", + "no-empty": [ + "error", + { + "allowEmptyCatch": true + } + ], + "no-else-return": [ + "error", + { + "allowElseIf": false + } + ], + "no-lonely-if": "error", + "no-var": "error", + "object-shorthand": "error", + "prefer-arrow-callback": [ + "error", + { + "allowNamedFunctions": true + } + ], + "prefer-const": [ + "error", + { + "ignoreReadBeforeAssign": true + } + ], + "prefer-destructuring": [ + "error", + { + "object": true, + "array": false + } + ], + "prefer-spread": "error", + "prefer-template": "error", + "radix": "error", + "semi": "error", + "strict": "error", + "quotes": [ + "error", + "single" + ] + } + } +} diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md new file mode 100644 index 0000000..673e9c3 --- /dev/null +++ b/node_modules/semver/README.md @@ -0,0 +1,654 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean(' =v1.2.3 ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +You can also just load the module for the function that you care about if +you'd like to minimize your footprint. + +```js +// load the whole API at once in a single object +const semver = require('semver') + +// or just load the bits you need +// all of them listed here, just pick and choose what you want + +// classes +const SemVer = require('semver/classes/semver') +const Comparator = require('semver/classes/comparator') +const Range = require('semver/classes/range') + +// functions for working with versions +const semverParse = require('semver/functions/parse') +const semverValid = require('semver/functions/valid') +const semverClean = require('semver/functions/clean') +const semverInc = require('semver/functions/inc') +const semverDiff = require('semver/functions/diff') +const semverMajor = require('semver/functions/major') +const semverMinor = require('semver/functions/minor') +const semverPatch = require('semver/functions/patch') +const semverPrerelease = require('semver/functions/prerelease') +const semverCompare = require('semver/functions/compare') +const semverRcompare = require('semver/functions/rcompare') +const semverCompareLoose = require('semver/functions/compare-loose') +const semverCompareBuild = require('semver/functions/compare-build') +const semverSort = require('semver/functions/sort') +const semverRsort = require('semver/functions/rsort') + +// low-level comparators between versions +const semverGt = require('semver/functions/gt') +const semverLt = require('semver/functions/lt') +const semverEq = require('semver/functions/eq') +const semverNeq = require('semver/functions/neq') +const semverGte = require('semver/functions/gte') +const semverLte = require('semver/functions/lte') +const semverCmp = require('semver/functions/cmp') +const semverCoerce = require('semver/functions/coerce') + +// working with ranges +const semverSatisfies = require('semver/functions/satisfies') +const semverMaxSatisfying = require('semver/ranges/max-satisfying') +const semverMinSatisfying = require('semver/ranges/min-satisfying') +const semverToComparators = require('semver/ranges/to-comparators') +const semverMinVersion = require('semver/ranges/min-version') +const semverValidRange = require('semver/ranges/valid') +const semverOutside = require('semver/ranges/outside') +const semverGtr = require('semver/ranges/gtr') +const semverLtr = require('semver/ranges/ltr') +const semverIntersects = require('semver/ranges/intersects') +const semverSimplifyRange = require('semver/ranges/simplify') +const semverRangeSubset = require('semver/ranges/subset') +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-n <0|1> + This is the base to be used for the prerelease identifier. + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +--rtl + Coerce version strings right to left + +--ltr + Coerce version strings left to right (default) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` that specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. The comparator `>1` is equivalent to `>=2.0.0` and +would match the versions `2.0.0` and `3.1.0`, but not the versions +`1.0.1` or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. +Version `3.4.5` *would* satisfy the range because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose of this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range-matching +semantics. + +Second, a user who has opted into using a prerelease version has +indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for range-matching) +by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +#### Prerelease Identifier Base + +The method `.inc` takes an optional parameter 'identifierBase' string +that will let you let your prerelease number as zero-based or one-based. +Set to `false` to omit the prerelease number altogether. +If you do not specify this parameter, it will default to zero-based. + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta', '1') +// '1.2.4-beta.1' +``` + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta', false) +// '1.2.4-beta' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta -n 1 +1.2.4-beta.1 +``` + +```bash +$ semver 1.2.3 -i prerelease --preid beta -n false +1.2.4-beta +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0-0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0-0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any non-prerelease version satisfies, unless + `includePrerelease` is specified, in which case any version at all + satisfies) +* `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0-0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0-0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0-0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0-0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0-0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0-0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0-0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0-0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0-0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero element in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0-0` +* `^0.2.3` := `>=0.2.3 <0.3.0-0` +* `^0.0.3` := `>=0.0.3 <0.0.4-0` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0-0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4-0` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0-0` +* `^0.0.x` := `>=0.0.0 <0.1.0-0` +* `^0.0` := `>=0.0.0 <0.1.0-0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0-0` +* `^0.x` := `>=0.0.0 <1.0.0-0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose`: Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease`: Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release, options, identifier, identifierBase)`: + Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, `prerelease` will work the + same as `prepatch`. It increments the patch version and then makes a + prerelease. If the input version is already a prerelease it simply + increments it. + * `identifier` can be used to prefix `premajor`, `preminor`, + `prepatch`, or `prerelease` version increments. `identifierBase` + is the base to be used for the `prerelease` identifier. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either + a `SemVer` object or `null`. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of `compare`. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions + are equal. Sorts in ascending order if passed to `Array.sort()`. +* `compareLoose(v1, v2)`: Short for ``compare(v1, v2, { loose: true })`. +* `diff(v1, v2)`: Returns the difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + +### Sorting + +* `sort(versions)`: Returns a sorted array of versions based on the `compareBuild` + function. +* `rsort(versions)`: The reverse of `sort`. Returns an array of versions based on + the `compareBuild` function in descending order. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `minVersion(range)`: Return the lowest version that can match + the given range. +* `gtr(version, range)`: Return `true` if the version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if the version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the range comparators intersect. +* `simplifyRange(versions, range)`: Return a "simplified" range that + matches the same items in the `versions` list as the range specified. Note + that it does *not* guarantee that it would match the same versions in all + cases, only for the set of versions provided. This is useful when + generating ranges by joining together multiple versions with `||` + programmatically, to provide the user with something a bit more + ergonomic. If the provided range is shorter in string-length than the + generated range, then that is returned. +* `subset(subRange, superRange)`: Return `true` if the `subRange` range is + entirely contained by the `superRange` range. + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version, options)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`). Only text which lacks digits will fail coercion (`version one` +is not valid). The maximum length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any +semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). + +If the `options.rtl` flag is set, then `coerce` will return the right-most +coercible tuple that does not share an ending index with a longer coercible +tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not +`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of +any other overlapping SemVer tuple. + +If the `options.includePrerelease` flag is set, then the `coerce` result will contain +prerelease and build parts of a version. For example, `1.2.3.4-rc.1+rev.2` +will preserve prerelease `rc.1` and build `rev.2` in the result. + +### Clean + +* `clean(version)`: Clean a string to be a valid semver if possible + +This will return a cleaned and trimmed semver version. If the provided +version is not valid a null will be returned. This does not work for +ranges. + +ex. +* `s.clean(' = v 2.1.5foo')`: `null` +* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean(' = v 2.1.5-foo')`: `null` +* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean('=v2.1.5')`: `'2.1.5'` +* `s.clean(' =v2.1.5')`: `'2.1.5'` +* `s.clean(' 2.1.5 ')`: `'2.1.5'` +* `s.clean('~1.0.0')`: `null` + +## Constants + +As a convenience, helper constants are exported to provide information about what `node-semver` supports: + +### `RELEASE_TYPES` + +- major +- premajor +- minor +- preminor +- patch +- prepatch +- prerelease + +``` +const semver = require('semver'); + +if (semver.RELEASE_TYPES.includes(arbitraryUserInput)) { + console.log('This is a valid release type!'); +} else { + console.warn('This is NOT a valid release type!'); +} +``` + +### `SEMVER_SPEC_VERSION` + +2.0.0 + +``` +const semver = require('semver'); + +console.log('We are currently using the semver specification version:', semver.SEMVER_SPEC_VERSION); +``` + +## Exported Modules + + + +You may pull in just the part of this semver utility that you need if you +are sensitive to packing and tree-shaking concerns. The main +`require('semver')` export uses getter functions to lazily load the parts +of the API that are used. + +The following modules are available: + +* `require('semver')` +* `require('semver/classes')` +* `require('semver/classes/comparator')` +* `require('semver/classes/range')` +* `require('semver/classes/semver')` +* `require('semver/functions/clean')` +* `require('semver/functions/cmp')` +* `require('semver/functions/coerce')` +* `require('semver/functions/compare')` +* `require('semver/functions/compare-build')` +* `require('semver/functions/compare-loose')` +* `require('semver/functions/diff')` +* `require('semver/functions/eq')` +* `require('semver/functions/gt')` +* `require('semver/functions/gte')` +* `require('semver/functions/inc')` +* `require('semver/functions/lt')` +* `require('semver/functions/lte')` +* `require('semver/functions/major')` +* `require('semver/functions/minor')` +* `require('semver/functions/neq')` +* `require('semver/functions/parse')` +* `require('semver/functions/patch')` +* `require('semver/functions/prerelease')` +* `require('semver/functions/rcompare')` +* `require('semver/functions/rsort')` +* `require('semver/functions/satisfies')` +* `require('semver/functions/sort')` +* `require('semver/functions/valid')` +* `require('semver/ranges/gtr')` +* `require('semver/ranges/intersects')` +* `require('semver/ranges/ltr')` +* `require('semver/ranges/max-satisfying')` +* `require('semver/ranges/min-satisfying')` +* `require('semver/ranges/min-version')` +* `require('semver/ranges/outside')` +* `require('semver/ranges/simplify')` +* `require('semver/ranges/subset')` +* `require('semver/ranges/to-comparators')` +* `require('semver/ranges/valid')` + diff --git a/node_modules/semver/bin/semver.js b/node_modules/semver/bin/semver.js new file mode 100755 index 0000000..f62b566 --- /dev/null +++ b/node_modules/semver/bin/semver.js @@ -0,0 +1,188 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +const argv = process.argv.slice(2) + +let versions = [] + +const range = [] + +let inc = null + +const version = require('../package.json').version + +let loose = false + +let includePrerelease = false + +let coerce = false + +let rtl = false + +let identifier + +let identifierBase + +const semver = require('../') +const parseOptions = require('../internal/parse-options') + +let reverse = false + +let options = {} + +const main = () => { + if (!argv.length) { + return help() + } + while (argv.length) { + let a = argv.shift() + const indexOfEqualSign = a.indexOf('=') + if (indexOfEqualSign !== -1) { + const value = a.slice(indexOfEqualSign + 1) + a = a.slice(0, indexOfEqualSign) + argv.unshift(value) + } + switch (a) { + case '-rv': case '-rev': case '--rev': case '--reverse': + reverse = true + break + case '-l': case '--loose': + loose = true + break + case '-p': case '--include-prerelease': + includePrerelease = true + break + case '-v': case '--version': + versions.push(argv.shift()) + break + case '-i': case '--inc': case '--increment': + switch (argv[0]) { + case 'major': case 'minor': case 'patch': case 'prerelease': + case 'premajor': case 'preminor': case 'prepatch': + inc = argv.shift() + break + default: + inc = 'patch' + break + } + break + case '--preid': + identifier = argv.shift() + break + case '-r': case '--range': + range.push(argv.shift()) + break + case '-n': + identifierBase = argv.shift() + if (identifierBase === 'false') { + identifierBase = false + } + break + case '-c': case '--coerce': + coerce = true + break + case '--rtl': + rtl = true + break + case '--ltr': + rtl = false + break + case '-h': case '--help': case '-?': + return help() + default: + versions.push(a) + break + } + } + + options = parseOptions({ loose, includePrerelease, rtl }) + + versions = versions.map((v) => { + return coerce ? (semver.coerce(v, options) || { version: v }).version : v + }).filter((v) => { + return semver.valid(v) + }) + if (!versions.length) { + return fail() + } + if (inc && (versions.length !== 1 || range.length)) { + return failInc() + } + + for (let i = 0, l = range.length; i < l; i++) { + versions = versions.filter((v) => { + return semver.satisfies(v, range[i], options) + }) + if (!versions.length) { + return fail() + } + } + versions + .sort((a, b) => semver[reverse ? 'rcompare' : 'compare'](a, b, options)) + .map(v => semver.clean(v, options)) + .map(v => inc ? semver.inc(v, inc, options, identifier, identifierBase) : v) + .forEach(v => console.log(v)) +} + +const failInc = () => { + console.error('--inc can only be used on a single version with no range') + fail() +} + +const fail = () => process.exit(1) + +const help = () => console.log( +`SemVer ${version} + +A JavaScript implementation of the https://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +--rtl + Coerce version strings right to left + +--ltr + Coerce version strings left to right (default) + +-n + Base number to be used for the prerelease identifier. + Can be either 0 or 1, or false to omit the number altogether. + Defaults to 0. + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them.`) + +main() diff --git a/node_modules/semver/classes/comparator.js b/node_modules/semver/classes/comparator.js new file mode 100644 index 0000000..3d39c0e --- /dev/null +++ b/node_modules/semver/classes/comparator.js @@ -0,0 +1,141 @@ +const ANY = Symbol('SemVer ANY') +// hoisted class for cyclic dependency +class Comparator { + static get ANY () { + return ANY + } + + constructor (comp, options) { + options = parseOptions(options) + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + comp = comp.trim().split(/\s+/).join(' ') + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) + } + + parse (comp) { + const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + const m = comp.match(r) + + if (!m) { + throw new TypeError(`Invalid comparator: ${comp}`) + } + + this.operator = m[1] !== undefined ? m[1] : '' + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } + } + + toString () { + return this.value + } + + test (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY || version === ANY) { + return true + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } + + return cmp(version, this.operator, this.semver, this.options) + } + + intersects (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (this.operator === '') { + if (this.value === '') { + return true + } + return new Range(comp.value, options).test(this.value) + } else if (comp.operator === '') { + if (comp.value === '') { + return true + } + return new Range(this.value, options).test(comp.semver) + } + + options = parseOptions(options) + + // Special cases where nothing can possibly be lower + if (options.includePrerelease && + (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) { + return false + } + if (!options.includePrerelease && + (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) { + return false + } + + // Same direction increasing (> or >=) + if (this.operator.startsWith('>') && comp.operator.startsWith('>')) { + return true + } + // Same direction decreasing (< or <=) + if (this.operator.startsWith('<') && comp.operator.startsWith('<')) { + return true + } + // same SemVer and both sides are inclusive (<= or >=) + if ( + (this.semver.version === comp.semver.version) && + this.operator.includes('=') && comp.operator.includes('=')) { + return true + } + // opposite directions less than + if (cmp(this.semver, '<', comp.semver, options) && + this.operator.startsWith('>') && comp.operator.startsWith('<')) { + return true + } + // opposite directions greater than + if (cmp(this.semver, '>', comp.semver, options) && + this.operator.startsWith('<') && comp.operator.startsWith('>')) { + return true + } + return false + } +} + +module.exports = Comparator + +const parseOptions = require('../internal/parse-options') +const { safeRe: re, t } = require('../internal/re') +const cmp = require('../functions/cmp') +const debug = require('../internal/debug') +const SemVer = require('./semver') +const Range = require('./range') diff --git a/node_modules/semver/classes/index.js b/node_modules/semver/classes/index.js new file mode 100644 index 0000000..5e3f5c9 --- /dev/null +++ b/node_modules/semver/classes/index.js @@ -0,0 +1,5 @@ +module.exports = { + SemVer: require('./semver.js'), + Range: require('./range.js'), + Comparator: require('./comparator.js'), +} diff --git a/node_modules/semver/classes/range.js b/node_modules/semver/classes/range.js new file mode 100644 index 0000000..117b45a --- /dev/null +++ b/node_modules/semver/classes/range.js @@ -0,0 +1,540 @@ +// hoisted class for cyclic dependency +class Range { + constructor (range, options) { + options = parseOptions(options) + + if (range instanceof Range) { + if ( + range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease + ) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + // just put it in the set and return + this.raw = range.value + this.set = [[range]] + this.format() + return this + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First reduce all whitespace as much as possible so we do not have to rely + // on potentially slow regexes like \s*. This is then stored and used for + // future error messages as well. + this.raw = range + .trim() + .split(/\s+/) + .join(' ') + + // First, split on || + this.set = this.raw + .split('||') + // map the range to a 2d array of comparators + .map(r => this.parseRange(r.trim())) + // throw out any comparator lists that are empty + // this generally means that it was not a valid range, which is allowed + // in loose mode, but will still throw if the WHOLE range is invalid. + .filter(c => c.length) + + if (!this.set.length) { + throw new TypeError(`Invalid SemVer Range: ${this.raw}`) + } + + // if we have any that are not the null set, throw out null sets. + if (this.set.length > 1) { + // keep the first one, in case they're all null sets + const first = this.set[0] + this.set = this.set.filter(c => !isNullSet(c[0])) + if (this.set.length === 0) { + this.set = [first] + } else if (this.set.length > 1) { + // if we have any that are *, then the range is just * + for (const c of this.set) { + if (c.length === 1 && isAny(c[0])) { + this.set = [c] + break + } + } + } + } + + this.format() + } + + format () { + this.range = this.set + .map((comps) => comps.join(' ').trim()) + .join('||') + .trim() + return this.range + } + + toString () { + return this.range + } + + parseRange (range) { + // memoize range parsing for performance. + // this is a very hot path, and fully deterministic. + const memoOpts = + (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | + (this.options.loose && FLAG_LOOSE) + const memoKey = memoOpts + ':' + range + const cached = cache.get(memoKey) + if (cached) { + return cached + } + + const loose = this.options.loose + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] + range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) + debug('hyphen replace', range) + + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[t.TILDETRIM], tildeTrimReplace) + debug('tilde trim', range) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[t.CARETTRIM], caretTrimReplace) + debug('caret trim', range) + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + let rangeList = range + .split(' ') + .map(comp => parseComparator(comp, this.options)) + .join(' ') + .split(/\s+/) + // >=0.0.0 is equivalent to * + .map(comp => replaceGTE0(comp, this.options)) + + if (loose) { + // in loose mode, throw out any that are not valid comparators + rangeList = rangeList.filter(comp => { + debug('loose invalid filter', comp, this.options) + return !!comp.match(re[t.COMPARATORLOOSE]) + }) + } + debug('range list', rangeList) + + // if any comparators are the null set, then replace with JUST null set + // if more than one comparator, remove any * comparators + // also, don't include the same comparator more than once + const rangeMap = new Map() + const comparators = rangeList.map(comp => new Comparator(comp, this.options)) + for (const comp of comparators) { + if (isNullSet(comp)) { + return [comp] + } + rangeMap.set(comp.value, comp) + } + if (rangeMap.size > 1 && rangeMap.has('')) { + rangeMap.delete('') + } + + const result = [...rangeMap.values()] + cache.set(memoKey, result) + return result + } + + intersects (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some((thisComparators) => { + return ( + isSatisfiable(thisComparators, options) && + range.set.some((rangeComparators) => { + return ( + isSatisfiable(rangeComparators, options) && + thisComparators.every((thisComparator) => { + return rangeComparators.every((rangeComparator) => { + return thisComparator.intersects(rangeComparator, options) + }) + }) + ) + }) + ) + }) + } + + // if ANY of the sets match ALL of its comparators, then pass + test (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } + + for (let i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false + } +} + +module.exports = Range + +const LRU = require('../internal/lrucache') +const cache = new LRU() + +const parseOptions = require('../internal/parse-options') +const Comparator = require('./comparator') +const debug = require('../internal/debug') +const SemVer = require('./semver') +const { + safeRe: re, + t, + comparatorTrimReplace, + tildeTrimReplace, + caretTrimReplace, +} = require('../internal/re') +const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants') + +const isNullSet = c => c.value === '<0.0.0-0' +const isAny = c => c.value === '' + +// take a set of comparators and determine whether there +// exists a version which can satisfy it +const isSatisfiable = (comparators, options) => { + let result = true + const remainingComparators = comparators.slice() + let testComparator = remainingComparators.pop() + + while (result && remainingComparators.length) { + result = remainingComparators.every((otherComparator) => { + return testComparator.intersects(otherComparator, options) + }) + + testComparator = remainingComparators.pop() + } + + return result +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +const parseComparator = (comp, options) => { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +const isX = id => !id || id.toLowerCase() === 'x' || id === '*' + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 +// ~0.0.1 --> >=0.0.1 <0.1.0-0 +const replaceTildes = (comp, options) => { + return comp + .trim() + .split(/\s+/) + .map((c) => replaceTilde(c, options)) + .join(' ') +} + +const replaceTilde = (comp, options) => { + const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + return comp.replace(r, (_, M, m, p, pr) => { + debug('tilde', comp, _, M, m, p, pr) + let ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = `>=${M}.0.0 <${+M + 1}.0.0-0` + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0-0 + ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` + } else if (pr) { + debug('replaceTilde pr', pr) + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${+m + 1}.0-0` + } else { + // ~1.2.3 == >=1.2.3 <1.3.0-0 + ret = `>=${M}.${m}.${p + } <${M}.${+m + 1}.0-0` + } + + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 +// ^1.2.3 --> >=1.2.3 <2.0.0-0 +// ^1.2.0 --> >=1.2.0 <2.0.0-0 +// ^0.0.1 --> >=0.0.1 <0.0.2-0 +// ^0.1.0 --> >=0.1.0 <0.2.0-0 +const replaceCarets = (comp, options) => { + return comp + .trim() + .split(/\s+/) + .map((c) => replaceCaret(c, options)) + .join(' ') +} + +const replaceCaret = (comp, options) => { + debug('caret', comp, options) + const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] + const z = options.includePrerelease ? '-0' : '' + return comp.replace(r, (_, M, m, p, pr) => { + debug('caret', comp, _, M, m, p, pr) + let ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` + } else if (isX(p)) { + if (M === '0') { + ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` + } else { + ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${m}.${+p + 1}-0` + } else { + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${+m + 1}.0-0` + } + } else { + ret = `>=${M}.${m}.${p}-${pr + } <${+M + 1}.0.0-0` + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = `>=${M}.${m}.${p + }${z} <${M}.${m}.${+p + 1}-0` + } else { + ret = `>=${M}.${m}.${p + }${z} <${M}.${+m + 1}.0-0` + } + } else { + ret = `>=${M}.${m}.${p + } <${+M + 1}.0.0-0` + } + } + + debug('caret return', ret) + return ret + }) +} + +const replaceXRanges = (comp, options) => { + debug('replaceXRanges', comp, options) + return comp + .split(/\s+/) + .map((c) => replaceXRange(c, options)) + .join(' ') +} + +const replaceXRange = (comp, options) => { + comp = comp.trim() + const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] + return comp.replace(r, (ret, gtlt, M, m, p, pr) => { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + const xM = isX(M) + const xm = xM || isX(m) + const xp = xm || isX(p) + const anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + // if we're including prereleases in the match, then we need + // to fix this to -0, the lowest possible prerelease value + pr = options.includePrerelease ? '-0' : '' + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0-0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } + + if (gtlt === '<') { + pr = '-0' + } + + ret = `${gtlt + M}.${m}.${p}${pr}` + } else if (xm) { + ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` + } else if (xp) { + ret = `>=${M}.${m}.0${pr + } <${M}.${+m + 1}.0-0` + } + + debug('xRange return', ret) + + return ret + }) +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +const replaceStars = (comp, options) => { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp + .trim() + .replace(re[t.STAR], '') +} + +const replaceGTE0 = (comp, options) => { + debug('replaceGTE0', comp, options) + return comp + .trim() + .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') +} + +// This function is passed to string.replace(re[t.HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 +// TODO build? +const hyphenReplace = incPr => ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr) => { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = `>=${fM}.0.0${incPr ? '-0' : ''}` + } else if (isX(fp)) { + from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` + } else if (fpr) { + from = `>=${from}` + } else { + from = `>=${from}${incPr ? '-0' : ''}` + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = `<${+tM + 1}.0.0-0` + } else if (isX(tp)) { + to = `<${tM}.${+tm + 1}.0-0` + } else if (tpr) { + to = `<=${tM}.${tm}.${tp}-${tpr}` + } else if (incPr) { + to = `<${tM}.${tm}.${+tp + 1}-0` + } else { + to = `<=${to}` + } + + return `${from} ${to}`.trim() +} + +const testSet = (set, version, options) => { + for (let i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (let i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === Comparator.ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + const allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true +} diff --git a/node_modules/semver/classes/semver.js b/node_modules/semver/classes/semver.js new file mode 100644 index 0000000..13e66ce --- /dev/null +++ b/node_modules/semver/classes/semver.js @@ -0,0 +1,302 @@ +const debug = require('../internal/debug') +const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants') +const { safeRe: re, t } = require('../internal/re') + +const parseOptions = require('../internal/parse-options') +const { compareIdentifiers } = require('../internal/identifiers') +class SemVer { + constructor (version, options) { + options = parseOptions(options) + + if (version instanceof SemVer) { + if (version.loose === !!options.loose && + version.includePrerelease === !!options.includePrerelease) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError( + `version is longer than ${MAX_LENGTH} characters` + ) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + // this isn't actually relevant for versions, but keep it so that we + // don't run into trouble passing this.options around. + this.includePrerelease = !!options.includePrerelease + + const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) + + if (!m) { + throw new TypeError(`Invalid Version: ${version}`) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map((id) => { + if (/^[0-9]+$/.test(id)) { + const num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() + } + + format () { + this.version = `${this.major}.${this.minor}.${this.patch}` + if (this.prerelease.length) { + this.version += `-${this.prerelease.join('.')}` + } + return this.version + } + + toString () { + return this.version + } + + compare (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + if (typeof other === 'string' && other === this.version) { + return 0 + } + other = new SemVer(other, this.options) + } + + if (other.version === this.version) { + return 0 + } + + return this.compareMain(other) || this.comparePre(other) + } + + compareMain (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return ( + compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) + ) + } + + comparePre (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + let i = 0 + do { + const a = this.prerelease[i] + const b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + } + + compareBuild (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + let i = 0 + do { + const a = this.build[i] + const b = other.build[i] + debug('build compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + } + + // preminor will bump the version up to the next minor release, and immediately + // down to pre-release. premajor and prepatch work the same way. + inc (release, identifier, identifierBase) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier, identifierBase) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier, identifierBase) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier, identifierBase) + this.inc('pre', identifier, identifierBase) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier, identifierBase) + } + this.inc('pre', identifier, identifierBase) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if ( + this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0 + ) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. + case 'pre': { + const base = Number(identifierBase) ? 1 : 0 + + if (!identifier && identifierBase === false) { + throw new Error('invalid increment argument: identifier is empty') + } + + if (this.prerelease.length === 0) { + this.prerelease = [base] + } else { + let i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + if (identifier === this.prerelease.join('.') && identifierBase === false) { + throw new Error('invalid increment argument: identifier already exists') + } + this.prerelease.push(base) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + let prerelease = [identifier, base] + if (identifierBase === false) { + prerelease = [identifier] + } + if (compareIdentifiers(this.prerelease[0], identifier) === 0) { + if (isNaN(this.prerelease[1])) { + this.prerelease = prerelease + } + } else { + this.prerelease = prerelease + } + } + break + } + default: + throw new Error(`invalid increment argument: ${release}`) + } + this.raw = this.format() + if (this.build.length) { + this.raw += `+${this.build.join('.')}` + } + return this + } +} + +module.exports = SemVer diff --git a/node_modules/semver/functions/clean.js b/node_modules/semver/functions/clean.js new file mode 100644 index 0000000..811fe6b --- /dev/null +++ b/node_modules/semver/functions/clean.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const clean = (version, options) => { + const s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} +module.exports = clean diff --git a/node_modules/semver/functions/cmp.js b/node_modules/semver/functions/cmp.js new file mode 100644 index 0000000..4011909 --- /dev/null +++ b/node_modules/semver/functions/cmp.js @@ -0,0 +1,52 @@ +const eq = require('./eq') +const neq = require('./neq') +const gt = require('./gt') +const gte = require('./gte') +const lt = require('./lt') +const lte = require('./lte') + +const cmp = (a, op, b, loose) => { + switch (op) { + case '===': + if (typeof a === 'object') { + a = a.version + } + if (typeof b === 'object') { + b = b.version + } + return a === b + + case '!==': + if (typeof a === 'object') { + a = a.version + } + if (typeof b === 'object') { + b = b.version + } + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError(`Invalid operator: ${op}`) + } +} +module.exports = cmp diff --git a/node_modules/semver/functions/coerce.js b/node_modules/semver/functions/coerce.js new file mode 100644 index 0000000..b378dce --- /dev/null +++ b/node_modules/semver/functions/coerce.js @@ -0,0 +1,60 @@ +const SemVer = require('../classes/semver') +const parse = require('./parse') +const { safeRe: re, t } = require('../internal/re') + +const coerce = (version, options) => { + if (version instanceof SemVer) { + return version + } + + if (typeof version === 'number') { + version = String(version) + } + + if (typeof version !== 'string') { + return null + } + + options = options || {} + + let match = null + if (!options.rtl) { + match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]) + } else { + // Find the right-most coercible string that does not share + // a terminus with a more left-ward coercible string. + // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' + // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4' + // + // Walk through the string checking with a /g regexp + // Manually set the index so as to pick up overlapping matches. + // Stop when we get a match that ends at the string end, since no + // coercible string can be more right-ward without the same terminus. + const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL] + let next + while ((next = coerceRtlRegex.exec(version)) && + (!match || match.index + match[0].length !== version.length) + ) { + if (!match || + next.index + next[0].length !== match.index + match[0].length) { + match = next + } + coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length + } + // leave it in a clean state + coerceRtlRegex.lastIndex = -1 + } + + if (match === null) { + return null + } + + const major = match[2] + const minor = match[3] || '0' + const patch = match[4] || '0' + const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '' + const build = options.includePrerelease && match[6] ? `+${match[6]}` : '' + + return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options) +} +module.exports = coerce diff --git a/node_modules/semver/functions/compare-build.js b/node_modules/semver/functions/compare-build.js new file mode 100644 index 0000000..9eb881b --- /dev/null +++ b/node_modules/semver/functions/compare-build.js @@ -0,0 +1,7 @@ +const SemVer = require('../classes/semver') +const compareBuild = (a, b, loose) => { + const versionA = new SemVer(a, loose) + const versionB = new SemVer(b, loose) + return versionA.compare(versionB) || versionA.compareBuild(versionB) +} +module.exports = compareBuild diff --git a/node_modules/semver/functions/compare-loose.js b/node_modules/semver/functions/compare-loose.js new file mode 100644 index 0000000..4881fbe --- /dev/null +++ b/node_modules/semver/functions/compare-loose.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const compareLoose = (a, b) => compare(a, b, true) +module.exports = compareLoose diff --git a/node_modules/semver/functions/compare.js b/node_modules/semver/functions/compare.js new file mode 100644 index 0000000..748b7af --- /dev/null +++ b/node_modules/semver/functions/compare.js @@ -0,0 +1,5 @@ +const SemVer = require('../classes/semver') +const compare = (a, b, loose) => + new SemVer(a, loose).compare(new SemVer(b, loose)) + +module.exports = compare diff --git a/node_modules/semver/functions/diff.js b/node_modules/semver/functions/diff.js new file mode 100644 index 0000000..fc224e3 --- /dev/null +++ b/node_modules/semver/functions/diff.js @@ -0,0 +1,65 @@ +const parse = require('./parse.js') + +const diff = (version1, version2) => { + const v1 = parse(version1, null, true) + const v2 = parse(version2, null, true) + const comparison = v1.compare(v2) + + if (comparison === 0) { + return null + } + + const v1Higher = comparison > 0 + const highVersion = v1Higher ? v1 : v2 + const lowVersion = v1Higher ? v2 : v1 + const highHasPre = !!highVersion.prerelease.length + const lowHasPre = !!lowVersion.prerelease.length + + if (lowHasPre && !highHasPre) { + // Going from prerelease -> no prerelease requires some special casing + + // If the low version has only a major, then it will always be a major + // Some examples: + // 1.0.0-1 -> 1.0.0 + // 1.0.0-1 -> 1.1.1 + // 1.0.0-1 -> 2.0.0 + if (!lowVersion.patch && !lowVersion.minor) { + return 'major' + } + + // Otherwise it can be determined by checking the high version + + if (highVersion.patch) { + // anything higher than a patch bump would result in the wrong version + return 'patch' + } + + if (highVersion.minor) { + // anything higher than a minor bump would result in the wrong version + return 'minor' + } + + // bumping major/minor/patch all have same result + return 'major' + } + + // add the `pre` prefix if we are going to a prerelease version + const prefix = highHasPre ? 'pre' : '' + + if (v1.major !== v2.major) { + return prefix + 'major' + } + + if (v1.minor !== v2.minor) { + return prefix + 'minor' + } + + if (v1.patch !== v2.patch) { + return prefix + 'patch' + } + + // high and low are preleases + return 'prerelease' +} + +module.exports = diff diff --git a/node_modules/semver/functions/eq.js b/node_modules/semver/functions/eq.js new file mode 100644 index 0000000..271fed9 --- /dev/null +++ b/node_modules/semver/functions/eq.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const eq = (a, b, loose) => compare(a, b, loose) === 0 +module.exports = eq diff --git a/node_modules/semver/functions/gt.js b/node_modules/semver/functions/gt.js new file mode 100644 index 0000000..d9b2156 --- /dev/null +++ b/node_modules/semver/functions/gt.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const gt = (a, b, loose) => compare(a, b, loose) > 0 +module.exports = gt diff --git a/node_modules/semver/functions/gte.js b/node_modules/semver/functions/gte.js new file mode 100644 index 0000000..5aeaa63 --- /dev/null +++ b/node_modules/semver/functions/gte.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const gte = (a, b, loose) => compare(a, b, loose) >= 0 +module.exports = gte diff --git a/node_modules/semver/functions/inc.js b/node_modules/semver/functions/inc.js new file mode 100644 index 0000000..7670b1b --- /dev/null +++ b/node_modules/semver/functions/inc.js @@ -0,0 +1,19 @@ +const SemVer = require('../classes/semver') + +const inc = (version, release, options, identifier, identifierBase) => { + if (typeof (options) === 'string') { + identifierBase = identifier + identifier = options + options = undefined + } + + try { + return new SemVer( + version instanceof SemVer ? version.version : version, + options + ).inc(release, identifier, identifierBase).version + } catch (er) { + return null + } +} +module.exports = inc diff --git a/node_modules/semver/functions/lt.js b/node_modules/semver/functions/lt.js new file mode 100644 index 0000000..b440ab7 --- /dev/null +++ b/node_modules/semver/functions/lt.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const lt = (a, b, loose) => compare(a, b, loose) < 0 +module.exports = lt diff --git a/node_modules/semver/functions/lte.js b/node_modules/semver/functions/lte.js new file mode 100644 index 0000000..6dcc956 --- /dev/null +++ b/node_modules/semver/functions/lte.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const lte = (a, b, loose) => compare(a, b, loose) <= 0 +module.exports = lte diff --git a/node_modules/semver/functions/major.js b/node_modules/semver/functions/major.js new file mode 100644 index 0000000..4283165 --- /dev/null +++ b/node_modules/semver/functions/major.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const major = (a, loose) => new SemVer(a, loose).major +module.exports = major diff --git a/node_modules/semver/functions/minor.js b/node_modules/semver/functions/minor.js new file mode 100644 index 0000000..57b3455 --- /dev/null +++ b/node_modules/semver/functions/minor.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const minor = (a, loose) => new SemVer(a, loose).minor +module.exports = minor diff --git a/node_modules/semver/functions/neq.js b/node_modules/semver/functions/neq.js new file mode 100644 index 0000000..f944c01 --- /dev/null +++ b/node_modules/semver/functions/neq.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const neq = (a, b, loose) => compare(a, b, loose) !== 0 +module.exports = neq diff --git a/node_modules/semver/functions/parse.js b/node_modules/semver/functions/parse.js new file mode 100644 index 0000000..459b3b1 --- /dev/null +++ b/node_modules/semver/functions/parse.js @@ -0,0 +1,16 @@ +const SemVer = require('../classes/semver') +const parse = (version, options, throwErrors = false) => { + if (version instanceof SemVer) { + return version + } + try { + return new SemVer(version, options) + } catch (er) { + if (!throwErrors) { + return null + } + throw er + } +} + +module.exports = parse diff --git a/node_modules/semver/functions/patch.js b/node_modules/semver/functions/patch.js new file mode 100644 index 0000000..63afca2 --- /dev/null +++ b/node_modules/semver/functions/patch.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const patch = (a, loose) => new SemVer(a, loose).patch +module.exports = patch diff --git a/node_modules/semver/functions/prerelease.js b/node_modules/semver/functions/prerelease.js new file mode 100644 index 0000000..06aa132 --- /dev/null +++ b/node_modules/semver/functions/prerelease.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const prerelease = (version, options) => { + const parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} +module.exports = prerelease diff --git a/node_modules/semver/functions/rcompare.js b/node_modules/semver/functions/rcompare.js new file mode 100644 index 0000000..0ac509e --- /dev/null +++ b/node_modules/semver/functions/rcompare.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const rcompare = (a, b, loose) => compare(b, a, loose) +module.exports = rcompare diff --git a/node_modules/semver/functions/rsort.js b/node_modules/semver/functions/rsort.js new file mode 100644 index 0000000..82404c5 --- /dev/null +++ b/node_modules/semver/functions/rsort.js @@ -0,0 +1,3 @@ +const compareBuild = require('./compare-build') +const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) +module.exports = rsort diff --git a/node_modules/semver/functions/satisfies.js b/node_modules/semver/functions/satisfies.js new file mode 100644 index 0000000..50af1c1 --- /dev/null +++ b/node_modules/semver/functions/satisfies.js @@ -0,0 +1,10 @@ +const Range = require('../classes/range') +const satisfies = (version, range, options) => { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} +module.exports = satisfies diff --git a/node_modules/semver/functions/sort.js b/node_modules/semver/functions/sort.js new file mode 100644 index 0000000..4d10917 --- /dev/null +++ b/node_modules/semver/functions/sort.js @@ -0,0 +1,3 @@ +const compareBuild = require('./compare-build') +const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) +module.exports = sort diff --git a/node_modules/semver/functions/valid.js b/node_modules/semver/functions/valid.js new file mode 100644 index 0000000..f27bae1 --- /dev/null +++ b/node_modules/semver/functions/valid.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const valid = (version, options) => { + const v = parse(version, options) + return v ? v.version : null +} +module.exports = valid diff --git a/node_modules/semver/index.js b/node_modules/semver/index.js new file mode 100644 index 0000000..86d42ac --- /dev/null +++ b/node_modules/semver/index.js @@ -0,0 +1,89 @@ +// just pre-load all the stuff that index.js lazily exports +const internalRe = require('./internal/re') +const constants = require('./internal/constants') +const SemVer = require('./classes/semver') +const identifiers = require('./internal/identifiers') +const parse = require('./functions/parse') +const valid = require('./functions/valid') +const clean = require('./functions/clean') +const inc = require('./functions/inc') +const diff = require('./functions/diff') +const major = require('./functions/major') +const minor = require('./functions/minor') +const patch = require('./functions/patch') +const prerelease = require('./functions/prerelease') +const compare = require('./functions/compare') +const rcompare = require('./functions/rcompare') +const compareLoose = require('./functions/compare-loose') +const compareBuild = require('./functions/compare-build') +const sort = require('./functions/sort') +const rsort = require('./functions/rsort') +const gt = require('./functions/gt') +const lt = require('./functions/lt') +const eq = require('./functions/eq') +const neq = require('./functions/neq') +const gte = require('./functions/gte') +const lte = require('./functions/lte') +const cmp = require('./functions/cmp') +const coerce = require('./functions/coerce') +const Comparator = require('./classes/comparator') +const Range = require('./classes/range') +const satisfies = require('./functions/satisfies') +const toComparators = require('./ranges/to-comparators') +const maxSatisfying = require('./ranges/max-satisfying') +const minSatisfying = require('./ranges/min-satisfying') +const minVersion = require('./ranges/min-version') +const validRange = require('./ranges/valid') +const outside = require('./ranges/outside') +const gtr = require('./ranges/gtr') +const ltr = require('./ranges/ltr') +const intersects = require('./ranges/intersects') +const simplifyRange = require('./ranges/simplify') +const subset = require('./ranges/subset') +module.exports = { + parse, + valid, + clean, + inc, + diff, + major, + minor, + patch, + prerelease, + compare, + rcompare, + compareLoose, + compareBuild, + sort, + rsort, + gt, + lt, + eq, + neq, + gte, + lte, + cmp, + coerce, + Comparator, + Range, + satisfies, + toComparators, + maxSatisfying, + minSatisfying, + minVersion, + validRange, + outside, + gtr, + ltr, + intersects, + simplifyRange, + subset, + SemVer, + re: internalRe.re, + src: internalRe.src, + tokens: internalRe.t, + SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, + RELEASE_TYPES: constants.RELEASE_TYPES, + compareIdentifiers: identifiers.compareIdentifiers, + rcompareIdentifiers: identifiers.rcompareIdentifiers, +} diff --git a/node_modules/semver/internal/constants.js b/node_modules/semver/internal/constants.js new file mode 100644 index 0000000..94be1c5 --- /dev/null +++ b/node_modules/semver/internal/constants.js @@ -0,0 +1,35 @@ +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +const SEMVER_SPEC_VERSION = '2.0.0' + +const MAX_LENGTH = 256 +const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || +/* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +const MAX_SAFE_COMPONENT_LENGTH = 16 + +// Max safe length for a build identifier. The max length minus 6 characters for +// the shortest version with a build 0.0.0+BUILD. +const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 + +const RELEASE_TYPES = [ + 'major', + 'premajor', + 'minor', + 'preminor', + 'patch', + 'prepatch', + 'prerelease', +] + +module.exports = { + MAX_LENGTH, + MAX_SAFE_COMPONENT_LENGTH, + MAX_SAFE_BUILD_LENGTH, + MAX_SAFE_INTEGER, + RELEASE_TYPES, + SEMVER_SPEC_VERSION, + FLAG_INCLUDE_PRERELEASE: 0b001, + FLAG_LOOSE: 0b010, +} diff --git a/node_modules/semver/internal/debug.js b/node_modules/semver/internal/debug.js new file mode 100644 index 0000000..1c00e13 --- /dev/null +++ b/node_modules/semver/internal/debug.js @@ -0,0 +1,9 @@ +const debug = ( + typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG) +) ? (...args) => console.error('SEMVER', ...args) + : () => {} + +module.exports = debug diff --git a/node_modules/semver/internal/identifiers.js b/node_modules/semver/internal/identifiers.js new file mode 100644 index 0000000..e612d0a --- /dev/null +++ b/node_modules/semver/internal/identifiers.js @@ -0,0 +1,23 @@ +const numeric = /^[0-9]+$/ +const compareIdentifiers = (a, b) => { + const anum = numeric.test(a) + const bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) + +module.exports = { + compareIdentifiers, + rcompareIdentifiers, +} diff --git a/node_modules/semver/internal/lrucache.js b/node_modules/semver/internal/lrucache.js new file mode 100644 index 0000000..6d89ec9 --- /dev/null +++ b/node_modules/semver/internal/lrucache.js @@ -0,0 +1,40 @@ +class LRUCache { + constructor () { + this.max = 1000 + this.map = new Map() + } + + get (key) { + const value = this.map.get(key) + if (value === undefined) { + return undefined + } else { + // Remove the key from the map and add it to the end + this.map.delete(key) + this.map.set(key, value) + return value + } + } + + delete (key) { + return this.map.delete(key) + } + + set (key, value) { + const deleted = this.delete(key) + + if (!deleted && value !== undefined) { + // If cache is full, delete the least recently used item + if (this.map.size >= this.max) { + const firstKey = this.map.keys().next().value + this.delete(firstKey) + } + + this.map.set(key, value) + } + + return this + } +} + +module.exports = LRUCache diff --git a/node_modules/semver/internal/parse-options.js b/node_modules/semver/internal/parse-options.js new file mode 100644 index 0000000..10d64ce --- /dev/null +++ b/node_modules/semver/internal/parse-options.js @@ -0,0 +1,15 @@ +// parse out just the options we care about +const looseOption = Object.freeze({ loose: true }) +const emptyOpts = Object.freeze({ }) +const parseOptions = options => { + if (!options) { + return emptyOpts + } + + if (typeof options !== 'object') { + return looseOption + } + + return options +} +module.exports = parseOptions diff --git a/node_modules/semver/internal/re.js b/node_modules/semver/internal/re.js new file mode 100644 index 0000000..fd8920e --- /dev/null +++ b/node_modules/semver/internal/re.js @@ -0,0 +1,217 @@ +const { + MAX_SAFE_COMPONENT_LENGTH, + MAX_SAFE_BUILD_LENGTH, + MAX_LENGTH, +} = require('./constants') +const debug = require('./debug') +exports = module.exports = {} + +// The actual regexps go on exports.re +const re = exports.re = [] +const safeRe = exports.safeRe = [] +const src = exports.src = [] +const t = exports.t = {} +let R = 0 + +const LETTERDASHNUMBER = '[a-zA-Z0-9-]' + +// Replace some greedy regex tokens to prevent regex dos issues. These regex are +// used internally via the safeRe object since all inputs in this library get +// normalized first to trim and collapse all extra whitespace. The original +// regexes are exported for userland consumption and lower level usage. A +// future breaking change could export the safer regex only with a note that +// all input should have extra whitespace removed. +const safeRegexReplacements = [ + ['\\s', 1], + ['\\d', MAX_LENGTH], + [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], +] + +const makeSafeRegex = (value) => { + for (const [token, max] of safeRegexReplacements) { + value = value + .split(`${token}*`).join(`${token}{0,${max}}`) + .split(`${token}+`).join(`${token}{1,${max}}`) + } + return value +} + +const createToken = (name, value, isGlobal) => { + const safe = makeSafeRegex(value) + const index = R++ + debug(name, index, value) + t[name] = index + src[index] = value + re[index] = new RegExp(value, isGlobal ? 'g' : undefined) + safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) +} + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') +createToken('NUMERICIDENTIFIERLOOSE', '\\d+') + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) + +// ## Main Version +// Three dot-separated numeric identifiers. + +createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})`) + +createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] +}|${src[t.NONNUMERICIDENTIFIER]})`) + +createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] +}|${src[t.NONNUMERICIDENTIFIER]})`) + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] +}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) + +createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] +}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] +}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +createToken('FULLPLAIN', `v?${src[t.MAINVERSION] +}${src[t.PRERELEASE]}?${ + src[t.BUILD]}?`) + +createToken('FULL', `^${src[t.FULLPLAIN]}$`) + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] +}${src[t.PRERELEASELOOSE]}?${ + src[t.BUILD]}?`) + +createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) + +createToken('GTLT', '((?:<|>)?=?)') + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) +createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) + +createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:${src[t.PRERELEASE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:${src[t.PRERELEASELOOSE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) +createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +createToken('COERCEPLAIN', `${'(^|[^\\d])' + + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) +createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) +createToken('COERCEFULL', src[t.COERCEPLAIN] + + `(?:${src[t.PRERELEASE]})?` + + `(?:${src[t.BUILD]})?` + + `(?:$|[^\\d])`) +createToken('COERCERTL', src[t.COERCE], true) +createToken('COERCERTLFULL', src[t.COERCEFULL], true) + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +createToken('LONETILDE', '(?:~>?)') + +createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) +exports.tildeTrimReplace = '$1~' + +createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) +createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +createToken('LONECARET', '(?:\\^)') + +createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) +exports.caretTrimReplace = '$1^' + +createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) +createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) +createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] +}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) +exports.comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAIN]})` + + `\\s*$`) + +createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAINLOOSE]})` + + `\\s*$`) + +// Star ranges basically just allow anything at all. +createToken('STAR', '(<|>)?=?\\s*\\*') +// >=0.0.0 is like a star +createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') +createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json new file mode 100644 index 0000000..cb8def4 --- /dev/null +++ b/node_modules/semver/package.json @@ -0,0 +1,77 @@ +{ + "name": "semver", + "version": "7.6.2", + "description": "The semantic version parser used by npm.", + "main": "index.js", + "scripts": { + "test": "tap", + "snap": "tap", + "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "postlint": "template-oss-check", + "lintfix": "npm run lint -- --fix", + "posttest": "npm run lint", + "template-oss-apply": "template-oss-apply --force" + }, + "devDependencies": { + "@npmcli/eslint-config": "^4.0.0", + "@npmcli/template-oss": "4.22.0", + "benchmark": "^2.1.4", + "tap": "^16.0.0" + }, + "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-semver.git" + }, + "bin": { + "semver": "bin/semver.js" + }, + "files": [ + "bin/", + "lib/", + "classes/", + "functions/", + "internal/", + "ranges/", + "index.js", + "preload.js", + "range.bnf" + ], + "tap": { + "timeout": 30, + "coverage-map": "map.js", + "nyc-arg": [ + "--exclude", + "tap-snapshots/**" + ] + }, + "engines": { + "node": ">=10" + }, + "author": "GitHub Inc.", + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "version": "4.22.0", + "engines": ">=10", + "distPaths": [ + "classes/", + "functions/", + "internal/", + "ranges/", + "index.js", + "preload.js", + "range.bnf" + ], + "allowPaths": [ + "/classes/", + "/functions/", + "/internal/", + "/ranges/", + "/index.js", + "/preload.js", + "/range.bnf", + "/benchmarks" + ], + "publish": "true" + } +} diff --git a/node_modules/semver/preload.js b/node_modules/semver/preload.js new file mode 100644 index 0000000..947cd4f --- /dev/null +++ b/node_modules/semver/preload.js @@ -0,0 +1,2 @@ +// XXX remove in v8 or beyond +module.exports = require('./index.js') diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf new file mode 100644 index 0000000..d4c6ae0 --- /dev/null +++ b/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | [1-9] ( [0-9] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/semver/ranges/gtr.js b/node_modules/semver/ranges/gtr.js new file mode 100644 index 0000000..db7e355 --- /dev/null +++ b/node_modules/semver/ranges/gtr.js @@ -0,0 +1,4 @@ +// Determine if version is greater than all the versions possible in the range. +const outside = require('./outside') +const gtr = (version, range, options) => outside(version, range, '>', options) +module.exports = gtr diff --git a/node_modules/semver/ranges/intersects.js b/node_modules/semver/ranges/intersects.js new file mode 100644 index 0000000..e0e9b7c --- /dev/null +++ b/node_modules/semver/ranges/intersects.js @@ -0,0 +1,7 @@ +const Range = require('../classes/range') +const intersects = (r1, r2, options) => { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2, options) +} +module.exports = intersects diff --git a/node_modules/semver/ranges/ltr.js b/node_modules/semver/ranges/ltr.js new file mode 100644 index 0000000..528a885 --- /dev/null +++ b/node_modules/semver/ranges/ltr.js @@ -0,0 +1,4 @@ +const outside = require('./outside') +// Determine if version is less than all the versions possible in the range +const ltr = (version, range, options) => outside(version, range, '<', options) +module.exports = ltr diff --git a/node_modules/semver/ranges/max-satisfying.js b/node_modules/semver/ranges/max-satisfying.js new file mode 100644 index 0000000..6e3d993 --- /dev/null +++ b/node_modules/semver/ranges/max-satisfying.js @@ -0,0 +1,25 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') + +const maxSatisfying = (versions, range, options) => { + let max = null + let maxSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} +module.exports = maxSatisfying diff --git a/node_modules/semver/ranges/min-satisfying.js b/node_modules/semver/ranges/min-satisfying.js new file mode 100644 index 0000000..9b60974 --- /dev/null +++ b/node_modules/semver/ranges/min-satisfying.js @@ -0,0 +1,24 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') +const minSatisfying = (versions, range, options) => { + let min = null + let minSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} +module.exports = minSatisfying diff --git a/node_modules/semver/ranges/min-version.js b/node_modules/semver/ranges/min-version.js new file mode 100644 index 0000000..350e1f7 --- /dev/null +++ b/node_modules/semver/ranges/min-version.js @@ -0,0 +1,61 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') +const gt = require('../functions/gt') + +const minVersion = (range, loose) => { + range = new Range(range, loose) + + let minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + + let setMin = null + comparators.forEach((comparator) => { + // Clone to avoid manipulating the comparator's semver object. + const compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!setMin || gt(compver, setMin)) { + setMin = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error(`Unexpected operation: ${comparator.operator}`) + } + }) + if (setMin && (!minver || gt(minver, setMin))) { + minver = setMin + } + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} +module.exports = minVersion diff --git a/node_modules/semver/ranges/outside.js b/node_modules/semver/ranges/outside.js new file mode 100644 index 0000000..ae99b10 --- /dev/null +++ b/node_modules/semver/ranges/outside.js @@ -0,0 +1,80 @@ +const SemVer = require('../classes/semver') +const Comparator = require('../classes/comparator') +const { ANY } = Comparator +const Range = require('../classes/range') +const satisfies = require('../functions/satisfies') +const gt = require('../functions/gt') +const lt = require('../functions/lt') +const lte = require('../functions/lte') +const gte = require('../functions/gte') + +const outside = (version, range, hilo, options) => { + version = new SemVer(version, options) + range = new Range(range, options) + + let gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisfies the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + + let high = null + let low = null + + comparators.forEach((comparator) => { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true +} + +module.exports = outside diff --git a/node_modules/semver/ranges/simplify.js b/node_modules/semver/ranges/simplify.js new file mode 100644 index 0000000..618d5b6 --- /dev/null +++ b/node_modules/semver/ranges/simplify.js @@ -0,0 +1,47 @@ +// given a set of versions and a range, create a "simplified" range +// that includes the same versions that the original range does +// If the original range is shorter than the simplified one, return that. +const satisfies = require('../functions/satisfies.js') +const compare = require('../functions/compare.js') +module.exports = (versions, range, options) => { + const set = [] + let first = null + let prev = null + const v = versions.sort((a, b) => compare(a, b, options)) + for (const version of v) { + const included = satisfies(version, range, options) + if (included) { + prev = version + if (!first) { + first = version + } + } else { + if (prev) { + set.push([first, prev]) + } + prev = null + first = null + } + } + if (first) { + set.push([first, null]) + } + + const ranges = [] + for (const [min, max] of set) { + if (min === max) { + ranges.push(min) + } else if (!max && min === v[0]) { + ranges.push('*') + } else if (!max) { + ranges.push(`>=${min}`) + } else if (min === v[0]) { + ranges.push(`<=${max}`) + } else { + ranges.push(`${min} - ${max}`) + } + } + const simplified = ranges.join(' || ') + const original = typeof range.raw === 'string' ? range.raw : String(range) + return simplified.length < original.length ? simplified : range +} diff --git a/node_modules/semver/ranges/subset.js b/node_modules/semver/ranges/subset.js new file mode 100644 index 0000000..1e5c268 --- /dev/null +++ b/node_modules/semver/ranges/subset.js @@ -0,0 +1,247 @@ +const Range = require('../classes/range.js') +const Comparator = require('../classes/comparator.js') +const { ANY } = Comparator +const satisfies = require('../functions/satisfies.js') +const compare = require('../functions/compare.js') + +// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff: +// - Every simple range `r1, r2, ...` is a null set, OR +// - Every simple range `r1, r2, ...` which is not a null set is a subset of +// some `R1, R2, ...` +// +// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff: +// - If c is only the ANY comparator +// - If C is only the ANY comparator, return true +// - Else if in prerelease mode, return false +// - else replace c with `[>=0.0.0]` +// - If C is only the ANY comparator +// - if in prerelease mode, return true +// - else replace C with `[>=0.0.0]` +// - Let EQ be the set of = comparators in c +// - If EQ is more than one, return true (null set) +// - Let GT be the highest > or >= comparator in c +// - Let LT be the lowest < or <= comparator in c +// - If GT and LT, and GT.semver > LT.semver, return true (null set) +// - If any C is a = range, and GT or LT are set, return false +// - If EQ +// - If GT, and EQ does not satisfy GT, return true (null set) +// - If LT, and EQ does not satisfy LT, return true (null set) +// - If EQ satisfies every C, return true +// - Else return false +// - If GT +// - If GT.semver is lower than any > or >= comp in C, return false +// - If GT is >=, and GT.semver does not satisfy every C, return false +// - If GT.semver has a prerelease, and not in prerelease mode +// - If no C has a prerelease and the GT.semver tuple, return false +// - If LT +// - If LT.semver is greater than any < or <= comp in C, return false +// - If LT is <=, and LT.semver does not satisfy every C, return false +// - If GT.semver has a prerelease, and not in prerelease mode +// - If no C has a prerelease and the LT.semver tuple, return false +// - Else return true + +const subset = (sub, dom, options = {}) => { + if (sub === dom) { + return true + } + + sub = new Range(sub, options) + dom = new Range(dom, options) + let sawNonNull = false + + OUTER: for (const simpleSub of sub.set) { + for (const simpleDom of dom.set) { + const isSub = simpleSubset(simpleSub, simpleDom, options) + sawNonNull = sawNonNull || isSub !== null + if (isSub) { + continue OUTER + } + } + // the null set is a subset of everything, but null simple ranges in + // a complex range should be ignored. so if we saw a non-null range, + // then we know this isn't a subset, but if EVERY simple range was null, + // then it is a subset. + if (sawNonNull) { + return false + } + } + return true +} + +const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')] +const minimumVersion = [new Comparator('>=0.0.0')] + +const simpleSubset = (sub, dom, options) => { + if (sub === dom) { + return true + } + + if (sub.length === 1 && sub[0].semver === ANY) { + if (dom.length === 1 && dom[0].semver === ANY) { + return true + } else if (options.includePrerelease) { + sub = minimumVersionWithPreRelease + } else { + sub = minimumVersion + } + } + + if (dom.length === 1 && dom[0].semver === ANY) { + if (options.includePrerelease) { + return true + } else { + dom = minimumVersion + } + } + + const eqSet = new Set() + let gt, lt + for (const c of sub) { + if (c.operator === '>' || c.operator === '>=') { + gt = higherGT(gt, c, options) + } else if (c.operator === '<' || c.operator === '<=') { + lt = lowerLT(lt, c, options) + } else { + eqSet.add(c.semver) + } + } + + if (eqSet.size > 1) { + return null + } + + let gtltComp + if (gt && lt) { + gtltComp = compare(gt.semver, lt.semver, options) + if (gtltComp > 0) { + return null + } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) { + return null + } + } + + // will iterate one or zero times + for (const eq of eqSet) { + if (gt && !satisfies(eq, String(gt), options)) { + return null + } + + if (lt && !satisfies(eq, String(lt), options)) { + return null + } + + for (const c of dom) { + if (!satisfies(eq, String(c), options)) { + return false + } + } + + return true + } + + let higher, lower + let hasDomLT, hasDomGT + // if the subset has a prerelease, we need a comparator in the superset + // with the same tuple and a prerelease, or it's not a subset + let needDomLTPre = lt && + !options.includePrerelease && + lt.semver.prerelease.length ? lt.semver : false + let needDomGTPre = gt && + !options.includePrerelease && + gt.semver.prerelease.length ? gt.semver : false + // exception: <1.2.3-0 is the same as <1.2.3 + if (needDomLTPre && needDomLTPre.prerelease.length === 1 && + lt.operator === '<' && needDomLTPre.prerelease[0] === 0) { + needDomLTPre = false + } + + for (const c of dom) { + hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=' + hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=' + if (gt) { + if (needDomGTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomGTPre.major && + c.semver.minor === needDomGTPre.minor && + c.semver.patch === needDomGTPre.patch) { + needDomGTPre = false + } + } + if (c.operator === '>' || c.operator === '>=') { + higher = higherGT(gt, c, options) + if (higher === c && higher !== gt) { + return false + } + } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) { + return false + } + } + if (lt) { + if (needDomLTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomLTPre.major && + c.semver.minor === needDomLTPre.minor && + c.semver.patch === needDomLTPre.patch) { + needDomLTPre = false + } + } + if (c.operator === '<' || c.operator === '<=') { + lower = lowerLT(lt, c, options) + if (lower === c && lower !== lt) { + return false + } + } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) { + return false + } + } + if (!c.operator && (lt || gt) && gtltComp !== 0) { + return false + } + } + + // if there was a < or >, and nothing in the dom, then must be false + // UNLESS it was limited by another range in the other direction. + // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0 + if (gt && hasDomLT && !lt && gtltComp !== 0) { + return false + } + + if (lt && hasDomGT && !gt && gtltComp !== 0) { + return false + } + + // we needed a prerelease range in a specific tuple, but didn't get one + // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0, + // because it includes prereleases in the 1.2.3 tuple + if (needDomGTPre || needDomLTPre) { + return false + } + + return true +} + +// >=1.2.3 is lower than >1.2.3 +const higherGT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options) + return comp > 0 ? a + : comp < 0 ? b + : b.operator === '>' && a.operator === '>=' ? b + : a +} + +// <=1.2.3 is higher than <1.2.3 +const lowerLT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options) + return comp < 0 ? a + : comp > 0 ? b + : b.operator === '<' && a.operator === '<=' ? b + : a +} + +module.exports = subset diff --git a/node_modules/semver/ranges/to-comparators.js b/node_modules/semver/ranges/to-comparators.js new file mode 100644 index 0000000..6c8bc7e --- /dev/null +++ b/node_modules/semver/ranges/to-comparators.js @@ -0,0 +1,8 @@ +const Range = require('../classes/range') + +// Mostly just for testing and legacy API reasons +const toComparators = (range, options) => + new Range(range, options).set + .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) + +module.exports = toComparators diff --git a/node_modules/semver/ranges/valid.js b/node_modules/semver/ranges/valid.js new file mode 100644 index 0000000..365f356 --- /dev/null +++ b/node_modules/semver/ranges/valid.js @@ -0,0 +1,11 @@ +const Range = require('../classes/range') +const validRange = (range, options) => { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} +module.exports = validRange diff --git a/node_modules/simple-update-notifier/LICENSE b/node_modules/simple-update-notifier/LICENSE new file mode 100644 index 0000000..1e0b0c1 --- /dev/null +++ b/node_modules/simple-update-notifier/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Alex Brazier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/simple-update-notifier/README.md b/node_modules/simple-update-notifier/README.md new file mode 100644 index 0000000..ec17794 --- /dev/null +++ b/node_modules/simple-update-notifier/README.md @@ -0,0 +1,82 @@ +# simple-update-notifier [![GitHub stars](https://img.shields.io/github/stars/alexbrazier/simple-update-notifier?label=Star%20Project&style=social)](https://github.com/alexbrazier/simple-update-notifier/stargazers) + +[![CI](https://github.com/alexbrazier/simple-update-notifier/workflows/Build%20and%20Deploy/badge.svg)](https://github.com/alexbrazier/simple-update-notifier/actions) +[![Dependencies](https://img.shields.io/librariesio/release/npm/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier?activeTab=dependencies) +[![npm](https://img.shields.io/npm/v/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier) +[![npm bundle size](https://img.shields.io/bundlephobia/min/simple-update-notifier)](https://bundlephobia.com/result?p=simple-update-notifier) +[![npm downloads](https://img.shields.io/npm/dw/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier) +[![License](https://img.shields.io/npm/l/simple-update-notifier)](./LICENSE) + +Simple update notifier to check for npm updates for cli applications. + +Demo in terminal showing an update is required + +Checks for updates for an npm module and outputs to the command line if there is one available. The result is cached for the specified time so it doesn't check every time the app runs. + +## Install + +```bash +npm install simple-update-notifier +OR +yarn add simple-update-notifier +``` + +## Usage + +```js +import updateNotifier from 'simple-update-notifier'; +import packageJson from './package.json' assert { type: 'json' }; + +updateNotifier({ pkg: packageJson }); +``` + +### Options + +#### pkg + +Type: `object` + +##### name + +_Required_\ +Type: `string` + +##### version + +_Required_\ +Type: `string` + +#### updateCheckInterval + +Type: `number`\ +Default: `1000 * 60 * 60 * 24` _(1 day)_ + +How often to check for updates. + +#### shouldNotifyInNpmScript + +Type: `boolean`\ +Default: `false` + +Allows notification to be shown when running as an npm script. + +#### distTag + +Type: `string`\ +Default: `'latest'` + +Which [dist-tag](https://docs.npmjs.com/adding-dist-tags-to-packages) to use to find the latest version. + +#### alwaysRun + +Type: `boolean`\ +Default: `false` + +When set, `updateCheckInterval` will not be respected and a check for an update will always be performed. + +#### debug + +Type: `boolean`\ +Default: `false` + +When set, logs explaining the decision will be output to `stderr` whenever the module opts to not print an update notification diff --git a/node_modules/simple-update-notifier/build/index.d.ts b/node_modules/simple-update-notifier/build/index.d.ts new file mode 100644 index 0000000..60f53e0 --- /dev/null +++ b/node_modules/simple-update-notifier/build/index.d.ts @@ -0,0 +1,13 @@ +interface IUpdate { + pkg: { + name: string; + version: string; + }; + updateCheckInterval?: number; + shouldNotifyInNpmScript?: boolean; + distTag?: string; + alwaysRun?: boolean; + debug?: boolean; +} +declare const simpleUpdateNotifier: (args: IUpdate) => Promise; +export { simpleUpdateNotifier as default }; diff --git a/node_modules/simple-update-notifier/build/index.js b/node_modules/simple-update-notifier/build/index.js new file mode 100644 index 0000000..d7c3cde --- /dev/null +++ b/node_modules/simple-update-notifier/build/index.js @@ -0,0 +1,210 @@ +'use strict'; + +var process$1 = require('process'); +var semver = require('semver'); +var os = require('os'); +var path = require('path'); +var fs = require('fs'); +var https = require('https'); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var packageJson = process$1.env.npm_package_json; +var userAgent = process$1.env.npm_config_user_agent; +var isNpm6 = Boolean(userAgent && userAgent.startsWith('npm')); +var isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json')); +var isNpm = isNpm6 || isNpm7; +var isYarn = Boolean(userAgent && userAgent.startsWith('yarn')); +var isNpmOrYarn = isNpm || isYarn; + +var homeDirectory = os.homedir(); +var configDir = process.env.XDG_CONFIG_HOME || + path.join(homeDirectory, '.config', 'simple-update-notifier'); +var getConfigFile = function (packageName) { + return path.join(configDir, "".concat(packageName.replace('@', '').replace('/', '__'), ".json")); +}; +var createConfigDir = function () { + if (!fs.existsSync(configDir)) { + fs.mkdirSync(configDir, { recursive: true }); + } +}; +var getLastUpdate = function (packageName) { + var configFile = getConfigFile(packageName); + try { + if (!fs.existsSync(configFile)) { + return undefined; + } + var file = JSON.parse(fs.readFileSync(configFile, 'utf8')); + return file.lastUpdateCheck; + } + catch (_a) { + return undefined; + } +}; +var saveLastUpdate = function (packageName) { + var configFile = getConfigFile(packageName); + fs.writeFileSync(configFile, JSON.stringify({ lastUpdateCheck: new Date().getTime() })); +}; + +var getDistVersion = function (packageName, distTag) { return __awaiter(void 0, void 0, void 0, function () { + var url; + return __generator(this, function (_a) { + url = "https://registry.npmjs.org/-/package/".concat(packageName, "/dist-tags"); + return [2 /*return*/, new Promise(function (resolve, reject) { + https + .get(url, function (res) { + var body = ''; + res.on('data', function (chunk) { return (body += chunk); }); + res.on('end', function () { + try { + var json = JSON.parse(body); + var version = json[distTag]; + if (!version) { + reject(new Error('Error getting version')); + } + resolve(version); + } + catch (_a) { + reject(new Error('Could not parse version response')); + } + }); + }) + .on('error', function (err) { return reject(err); }); + })]; + }); +}); }; + +var hasNewVersion = function (_a) { + var pkg = _a.pkg, _b = _a.updateCheckInterval, updateCheckInterval = _b === void 0 ? 1000 * 60 * 60 * 24 : _b, _c = _a.distTag, distTag = _c === void 0 ? 'latest' : _c, alwaysRun = _a.alwaysRun, debug = _a.debug; + return __awaiter(void 0, void 0, void 0, function () { + var lastUpdateCheck, latestVersion; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + createConfigDir(); + lastUpdateCheck = getLastUpdate(pkg.name); + if (!(alwaysRun || + !lastUpdateCheck || + lastUpdateCheck < new Date().getTime() - updateCheckInterval)) return [3 /*break*/, 2]; + return [4 /*yield*/, getDistVersion(pkg.name, distTag)]; + case 1: + latestVersion = _d.sent(); + saveLastUpdate(pkg.name); + if (semver.gt(latestVersion, pkg.version)) { + return [2 /*return*/, latestVersion]; + } + else if (debug) { + console.error("Latest version (".concat(latestVersion, ") not newer than current version (").concat(pkg.version, ")")); + } + return [3 /*break*/, 3]; + case 2: + if (debug) { + console.error("Too recent to check for a new update. simpleUpdateNotifier() interval set to ".concat(updateCheckInterval, "ms but only ").concat(new Date().getTime() - lastUpdateCheck, "ms since last check.")); + } + _d.label = 3; + case 3: return [2 /*return*/, false]; + } + }); + }); +}; + +var borderedText = function (text) { + var lines = text.split('\n'); + var width = Math.max.apply(Math, lines.map(function (l) { return l.length; })); + var res = ["\u250C".concat('─'.repeat(width + 2), "\u2510")]; + for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) { + var line = lines_1[_i]; + res.push("\u2502 ".concat(line.padEnd(width), " \u2502")); + } + res.push("\u2514".concat('─'.repeat(width + 2), "\u2518")); + return res.join('\n'); +}; + +var simpleUpdateNotifier = function (args) { return __awaiter(void 0, void 0, void 0, function () { + var latestVersion, err_1; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!args.alwaysRun && + (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))) { + if (args.debug) { + console.error('Opting out of running simpleUpdateNotifier()'); + } + return [2 /*return*/]; + } + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4 /*yield*/, hasNewVersion(args)]; + case 2: + latestVersion = _a.sent(); + if (latestVersion) { + console.error(borderedText("New version of ".concat(args.pkg.name, " available!\nCurrent Version: ").concat(args.pkg.version, "\nLatest Version: ").concat(latestVersion))); + } + return [3 /*break*/, 4]; + case 3: + err_1 = _a.sent(); + // Catch any network errors or cache writing errors so module doesn't cause a crash + if (args.debug && err_1 instanceof Error) { + console.error('Unexpected error in simpleUpdateNotifier():', err_1); + } + return [3 /*break*/, 4]; + case 4: return [2 /*return*/]; + } + }); +}); }; + +module.exports = simpleUpdateNotifier; diff --git a/node_modules/simple-update-notifier/package.json b/node_modules/simple-update-notifier/package.json new file mode 100644 index 0000000..4d710a7 --- /dev/null +++ b/node_modules/simple-update-notifier/package.json @@ -0,0 +1,100 @@ +{ + "name": "simple-update-notifier", + "version": "2.0.0", + "description": "Simple update notifier to check for npm updates for cli applications", + "main": "build/index.js", + "types": "build/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/alexbrazier/simple-update-notifier.git" + }, + "homepage": "https://github.com/alexbrazier/simple-update-notifier.git", + "author": "alexbrazier", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "jest src --noStackTrace", + "build": "rollup -c rollup.config.js --bundleConfigAsCjs", + "prettier:check": "prettier --check src/**/*.ts", + "prettier": "prettier --write src/**/*.ts", + "eslint": "eslint src/**/*.ts", + "lint": "yarn prettier:check && yarn eslint", + "prepare": "yarn lint && yarn build", + "release": "release-it" + }, + "dependencies": { + "semver": "^7.5.3" + }, + "devDependencies": { + "@babel/preset-env": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@release-it/conventional-changelog": "^5.1.1", + "@types/jest": "^29.5.2", + "@types/node": "^20.3.1", + "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/parser": "^5.60.0", + "eslint": "^8.43.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^29.5.0", + "prettier": "^2.8.8", + "release-it": "^15.11.0", + "rollup": "^3.25.2", + "rollup-plugin-ts": "^3.2.0", + "typescript": "^5.1.3" + }, + "resolutions": { + "semver": "^7.5.3" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "files": [ + "build", + "src" + ], + "release-it": { + "git": { + "commitMessage": "chore: release ${version}", + "tagName": "v${version}" + }, + "npm": { + "publish": true + }, + "github": { + "release": true + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "angular", + "infile": "CHANGELOG.md" + } + } + }, + "eslintConfig": { + "plugins": [ + "@typescript-eslint", + "prettier" + ], + "extends": [ + "prettier", + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "rules": { + "prettier/prettier": [ + "error", + { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false + } + ] + } + } +} diff --git a/node_modules/simple-update-notifier/src/borderedText.ts b/node_modules/simple-update-notifier/src/borderedText.ts new file mode 100644 index 0000000..7145ac2 --- /dev/null +++ b/node_modules/simple-update-notifier/src/borderedText.ts @@ -0,0 +1,12 @@ +const borderedText = (text: string) => { + const lines = text.split('\n'); + const width = Math.max(...lines.map((l) => l.length)); + const res = [`┌${'─'.repeat(width + 2)}┐`]; + for (const line of lines) { + res.push(`│ ${line.padEnd(width)} │`); + } + res.push(`└${'─'.repeat(width + 2)}┘`); + return res.join('\n'); +}; + +export default borderedText; diff --git a/node_modules/simple-update-notifier/src/cache.spec.ts b/node_modules/simple-update-notifier/src/cache.spec.ts new file mode 100644 index 0000000..49e1cb2 --- /dev/null +++ b/node_modules/simple-update-notifier/src/cache.spec.ts @@ -0,0 +1,17 @@ +import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache'; + +createConfigDir(); + +jest.useFakeTimers().setSystemTime(new Date('2022-01-01')); + +const fakeTime = new Date('2022-01-01').getTime(); + +test('can save update then get the update details', () => { + saveLastUpdate('test'); + expect(getLastUpdate('test')).toBe(fakeTime); +}); + +test('prefixed module can save update then get the update details', () => { + saveLastUpdate('@alexbrazier/test'); + expect(getLastUpdate('@alexbrazier/test')).toBe(fakeTime); +}); diff --git a/node_modules/simple-update-notifier/src/cache.ts b/node_modules/simple-update-notifier/src/cache.ts new file mode 100644 index 0000000..e11deba --- /dev/null +++ b/node_modules/simple-update-notifier/src/cache.ts @@ -0,0 +1,44 @@ +import os from 'os'; +import path from 'path'; +import fs from 'fs'; + +const homeDirectory = os.homedir(); +const configDir = + process.env.XDG_CONFIG_HOME || + path.join(homeDirectory, '.config', 'simple-update-notifier'); + +const getConfigFile = (packageName: string) => { + return path.join( + configDir, + `${packageName.replace('@', '').replace('/', '__')}.json` + ); +}; + +export const createConfigDir = () => { + if (!fs.existsSync(configDir)) { + fs.mkdirSync(configDir, { recursive: true }); + } +}; + +export const getLastUpdate = (packageName: string) => { + const configFile = getConfigFile(packageName); + + try { + if (!fs.existsSync(configFile)) { + return undefined; + } + const file = JSON.parse(fs.readFileSync(configFile, 'utf8')); + return file.lastUpdateCheck as number; + } catch { + return undefined; + } +}; + +export const saveLastUpdate = (packageName: string) => { + const configFile = getConfigFile(packageName); + + fs.writeFileSync( + configFile, + JSON.stringify({ lastUpdateCheck: new Date().getTime() }) + ); +}; diff --git a/node_modules/simple-update-notifier/src/getDistVersion.spec.ts b/node_modules/simple-update-notifier/src/getDistVersion.spec.ts new file mode 100644 index 0000000..b78a42e --- /dev/null +++ b/node_modules/simple-update-notifier/src/getDistVersion.spec.ts @@ -0,0 +1,35 @@ +import Stream from 'stream'; +import https from 'https'; +import getDistVersion from './getDistVersion'; + +jest.mock('https', () => ({ + get: jest.fn(), +})); + +test('Valid response returns version', async () => { + const st = new Stream(); + (https.get as jest.Mock).mockImplementation((url, cb) => { + cb(st); + + st.emit('data', '{"latest":"1.0.0"}'); + st.emit('end'); + }); + + const version = await getDistVersion('test', 'latest'); + + expect(version).toEqual('1.0.0'); +}); + +test('Invalid response throws error', async () => { + const st = new Stream(); + (https.get as jest.Mock).mockImplementation((url, cb) => { + cb(st); + + st.emit('data', 'some invalid json'); + st.emit('end'); + }); + + expect(getDistVersion('test', 'latest')).rejects.toThrow( + 'Could not parse version response' + ); +}); diff --git a/node_modules/simple-update-notifier/src/getDistVersion.ts b/node_modules/simple-update-notifier/src/getDistVersion.ts new file mode 100644 index 0000000..d474e1f --- /dev/null +++ b/node_modules/simple-update-notifier/src/getDistVersion.ts @@ -0,0 +1,29 @@ +import https from 'https'; + +const getDistVersion = async (packageName: string, distTag: string) => { + const url = `https://registry.npmjs.org/-/package/${packageName}/dist-tags`; + + return new Promise((resolve, reject) => { + https + .get(url, (res) => { + let body = ''; + + res.on('data', (chunk) => (body += chunk)); + res.on('end', () => { + try { + const json = JSON.parse(body); + const version = json[distTag]; + if (!version) { + reject(new Error('Error getting version')); + } + resolve(version); + } catch { + reject(new Error('Could not parse version response')); + } + }); + }) + .on('error', (err) => reject(err)); + }); +}; + +export default getDistVersion; diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts b/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts new file mode 100644 index 0000000..af7ab22 --- /dev/null +++ b/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts @@ -0,0 +1,82 @@ +import hasNewVersion from './hasNewVersion'; +import { getLastUpdate } from './cache'; +import getDistVersion from './getDistVersion'; + +jest.mock('./getDistVersion', () => jest.fn().mockReturnValue('1.0.0')); +jest.mock('./cache', () => ({ + getLastUpdate: jest.fn().mockReturnValue(undefined), + createConfigDir: jest.fn(), + saveLastUpdate: jest.fn(), +})); + +const pkg = { name: 'test', version: '1.0.0' }; + +afterEach(() => jest.clearAllMocks()); + +const defaultArgs = { + pkg, + shouldNotifyInNpmScript: true, + alwaysRun: true, +}; + +test('it should not trigger update for same version', async () => { + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe(false); +}); + +test('it should trigger update for patch version bump', async () => { + (getDistVersion as jest.Mock).mockReturnValue('1.0.1'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe('1.0.1'); +}); + +test('it should trigger update for minor version bump', async () => { + (getDistVersion as jest.Mock).mockReturnValue('1.1.0'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe('1.1.0'); +}); + +test('it should trigger update for major version bump', async () => { + (getDistVersion as jest.Mock).mockReturnValue('2.0.0'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe('2.0.0'); +}); + +test('it should not trigger update if version is lower', async () => { + (getDistVersion as jest.Mock).mockReturnValue('0.0.9'); + + const newVersion = await hasNewVersion(defaultArgs); + + expect(newVersion).toBe(false); +}); + +it('should trigger update check if last update older than config', async () => { + const TWO_WEEKS = new Date().getTime() - 1000 * 60 * 60 * 24 * 14; + (getLastUpdate as jest.Mock).mockReturnValue(TWO_WEEKS); + const newVersion = await hasNewVersion({ + pkg, + shouldNotifyInNpmScript: true, + }); + + expect(newVersion).toBe(false); + expect(getDistVersion).toHaveBeenCalled(); +}); + +it('should not trigger update check if last update is too recent', async () => { + const TWELVE_HOURS = new Date().getTime() - 1000 * 60 * 60 * 12; + (getLastUpdate as jest.Mock).mockReturnValue(TWELVE_HOURS); + const newVersion = await hasNewVersion({ + pkg, + shouldNotifyInNpmScript: true, + }); + + expect(newVersion).toBe(false); + expect(getDistVersion).not.toHaveBeenCalled(); +}); diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.ts b/node_modules/simple-update-notifier/src/hasNewVersion.ts new file mode 100644 index 0000000..31d5069 --- /dev/null +++ b/node_modules/simple-update-notifier/src/hasNewVersion.ts @@ -0,0 +1,40 @@ +import semver from 'semver'; +import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache'; +import getDistVersion from './getDistVersion'; +import { IUpdate } from './types'; + +const hasNewVersion = async ({ + pkg, + updateCheckInterval = 1000 * 60 * 60 * 24, + distTag = 'latest', + alwaysRun, + debug, +}: IUpdate) => { + createConfigDir(); + const lastUpdateCheck = getLastUpdate(pkg.name); + if ( + alwaysRun || + !lastUpdateCheck || + lastUpdateCheck < new Date().getTime() - updateCheckInterval + ) { + const latestVersion = await getDistVersion(pkg.name, distTag); + saveLastUpdate(pkg.name); + if (semver.gt(latestVersion, pkg.version)) { + return latestVersion; + } else if (debug) { + console.error( + `Latest version (${latestVersion}) not newer than current version (${pkg.version})` + ); + } + } else if (debug) { + console.error( + `Too recent to check for a new update. simpleUpdateNotifier() interval set to ${updateCheckInterval}ms but only ${ + new Date().getTime() - lastUpdateCheck + }ms since last check.` + ); + } + + return false; +}; + +export default hasNewVersion; diff --git a/node_modules/simple-update-notifier/src/index.spec.ts b/node_modules/simple-update-notifier/src/index.spec.ts new file mode 100644 index 0000000..98ffb5a --- /dev/null +++ b/node_modules/simple-update-notifier/src/index.spec.ts @@ -0,0 +1,27 @@ +import simpleUpdateNotifier from '.'; +import hasNewVersion from './hasNewVersion'; + +const consoleSpy = jest.spyOn(console, 'error'); + +jest.mock('./hasNewVersion', () => jest.fn().mockResolvedValue('2.0.0')); + +beforeEach(jest.clearAllMocks); + +test('it logs message if update is available', async () => { + await simpleUpdateNotifier({ + pkg: { name: 'test', version: '1.0.0' }, + alwaysRun: true, + }); + + expect(consoleSpy).toHaveBeenCalledTimes(1); +}); + +test('it does not log message if update is not available', async () => { + (hasNewVersion as jest.Mock).mockResolvedValue(false); + await simpleUpdateNotifier({ + pkg: { name: 'test', version: '2.0.0' }, + alwaysRun: true, + }); + + expect(consoleSpy).toHaveBeenCalledTimes(0); +}); diff --git a/node_modules/simple-update-notifier/src/index.ts b/node_modules/simple-update-notifier/src/index.ts new file mode 100644 index 0000000..2b0d2cf --- /dev/null +++ b/node_modules/simple-update-notifier/src/index.ts @@ -0,0 +1,34 @@ +import isNpmOrYarn from './isNpmOrYarn'; +import hasNewVersion from './hasNewVersion'; +import { IUpdate } from './types'; +import borderedText from './borderedText'; + +const simpleUpdateNotifier = async (args: IUpdate) => { + if ( + !args.alwaysRun && + (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript)) + ) { + if (args.debug) { + console.error('Opting out of running simpleUpdateNotifier()'); + } + return; + } + + try { + const latestVersion = await hasNewVersion(args); + if (latestVersion) { + console.error( + borderedText(`New version of ${args.pkg.name} available! +Current Version: ${args.pkg.version} +Latest Version: ${latestVersion}`) + ); + } + } catch (err) { + // Catch any network errors or cache writing errors so module doesn't cause a crash + if (args.debug && err instanceof Error) { + console.error('Unexpected error in simpleUpdateNotifier():', err); + } + } +}; + +export default simpleUpdateNotifier; diff --git a/node_modules/simple-update-notifier/src/isNpmOrYarn.ts b/node_modules/simple-update-notifier/src/isNpmOrYarn.ts new file mode 100644 index 0000000..ee4c837 --- /dev/null +++ b/node_modules/simple-update-notifier/src/isNpmOrYarn.ts @@ -0,0 +1,12 @@ +import process from 'process'; + +const packageJson = process.env.npm_package_json; +const userAgent = process.env.npm_config_user_agent; +const isNpm6 = Boolean(userAgent && userAgent.startsWith('npm')); +const isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json')); + +const isNpm = isNpm6 || isNpm7; +const isYarn = Boolean(userAgent && userAgent.startsWith('yarn')); +const isNpmOrYarn = isNpm || isYarn; + +export default isNpmOrYarn; diff --git a/node_modules/simple-update-notifier/src/types.ts b/node_modules/simple-update-notifier/src/types.ts new file mode 100644 index 0000000..c395eb0 --- /dev/null +++ b/node_modules/simple-update-notifier/src/types.ts @@ -0,0 +1,8 @@ +export interface IUpdate { + pkg: { name: string; version: string }; + updateCheckInterval?: number; + shouldNotifyInNpmScript?: boolean; + distTag?: string; + alwaysRun?: boolean; + debug?: boolean; +} diff --git a/node_modules/supports-color/browser.js b/node_modules/supports-color/browser.js new file mode 100644 index 0000000..62afa3a --- /dev/null +++ b/node_modules/supports-color/browser.js @@ -0,0 +1,5 @@ +'use strict'; +module.exports = { + stdout: false, + stderr: false +}; diff --git a/node_modules/supports-color/index.js b/node_modules/supports-color/index.js new file mode 100644 index 0000000..1704131 --- /dev/null +++ b/node_modules/supports-color/index.js @@ -0,0 +1,131 @@ +'use strict'; +const os = require('os'); +const hasFlag = require('has-flag'); + +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + + const min = forceColor ? 1 : 0; + + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + if (env.TERM === 'dumb') { + return min; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; diff --git a/node_modules/supports-color/license b/node_modules/supports-color/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/node_modules/supports-color/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/supports-color/package.json b/node_modules/supports-color/package.json new file mode 100644 index 0000000..ad199f5 --- /dev/null +++ b/node_modules/supports-color/package.json @@ -0,0 +1,53 @@ +{ + "name": "supports-color", + "version": "5.5.0", + "description": "Detect whether a terminal supports color", + "license": "MIT", + "repository": "chalk/supports-color", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js", + "browser.js" + ], + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "ansi", + "styles", + "tty", + "rgb", + "256", + "shell", + "xterm", + "command-line", + "support", + "supports", + "capability", + "detect", + "truecolor", + "16m" + ], + "dependencies": { + "has-flag": "^3.0.0" + }, + "devDependencies": { + "ava": "^0.25.0", + "import-fresh": "^2.0.0", + "xo": "^0.20.0" + }, + "browser": "browser.js" +} diff --git a/node_modules/supports-color/readme.md b/node_modules/supports-color/readme.md new file mode 100644 index 0000000..f6e4019 --- /dev/null +++ b/node_modules/supports-color/readme.md @@ -0,0 +1,66 @@ +# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color) + +> Detect whether a terminal supports color + + +## Install + +``` +$ npm install supports-color +``` + + +## Usage + +```js +const supportsColor = require('supports-color'); + +if (supportsColor.stdout) { + console.log('Terminal stdout supports color'); +} + +if (supportsColor.stdout.has256) { + console.log('Terminal stdout supports 256 colors'); +} + +if (supportsColor.stderr.has16m) { + console.log('Terminal stderr supports 16 million colors (truecolor)'); +} +``` + + +## API + +Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported. + +The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag: + +- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors) +- `.level = 2` and `.has256 = true`: 256 color support +- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors) + + +## Info + +It obeys the `--color` and `--no-color` CLI flags. + +Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks. + +Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively. + + +## Related + +- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module +- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right + + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [Josh Junon](https://github.com/qix-) + + +## License + +MIT diff --git a/node_modules/to-regex-range/LICENSE b/node_modules/to-regex-range/LICENSE new file mode 100644 index 0000000..7cccaf9 --- /dev/null +++ b/node_modules/to-regex-range/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/to-regex-range/README.md b/node_modules/to-regex-range/README.md new file mode 100644 index 0000000..38887da --- /dev/null +++ b/node_modules/to-regex-range/README.md @@ -0,0 +1,305 @@ +# to-regex-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/to-regex-range.svg?style=flat)](https://www.npmjs.com/package/to-regex-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![Linux Build Status](https://img.shields.io/travis/micromatch/to-regex-range.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/to-regex-range) + +> Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions. + +Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save to-regex-range +``` + +
    +What does this do? + +
    + +This libary generates the `source` string to be passed to `new RegExp()` for matching a range of numbers. + +**Example** + +```js +const toRegexRange = require('to-regex-range'); +const regex = new RegExp(toRegexRange('15', '95')); +``` + +A string is returned so that you can do whatever you need with it before passing it to `new RegExp()` (like adding `^` or `$` boundaries, defining flags, or combining it another string). + +
    + +
    + +
    +Why use this library? + +
    + +### Convenience + +Creating regular expressions for matching numbers gets deceptively complicated pretty fast. + +For example, let's say you need a validation regex for matching part of a user-id, postal code, social security number, tax id, etc: + +* regex for matching `1` => `/1/` (easy enough) +* regex for matching `1` through `5` => `/[1-5]/` (not bad...) +* regex for matching `1` or `5` => `/(1|5)/` (still easy...) +* regex for matching `1` through `50` => `/([1-9]|[1-4][0-9]|50)/` (uh-oh...) +* regex for matching `1` through `55` => `/([1-9]|[1-4][0-9]|5[0-5])/` (no prob, I can do this...) +* regex for matching `1` through `555` => `/([1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5])/` (maybe not...) +* regex for matching `0001` through `5555` => `/(0{3}[1-9]|0{2}[1-9][0-9]|0[1-9][0-9]{2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5])/` (okay, I get the point!) + +The numbers are contrived, but they're also really basic. In the real world you might need to generate a regex on-the-fly for validation. + +**Learn more** + +If you're interested in learning more about [character classes](http://www.regular-expressions.info/charclass.html) and other regex features, I personally have always found [regular-expressions.info](http://www.regular-expressions.info/charclass.html) to be pretty useful. + +### Heavily tested + +As of April 07, 2019, this library runs [>1m test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are correct. + +Tests run in ~280ms on my MacBook Pro, 2.5 GHz Intel Core i7. + +### Optimized + +Generated regular expressions are optimized: + +* duplicate sequences and character classes are reduced using quantifiers +* smart enough to use `?` conditionals when number(s) or range(s) can be positive or negative +* uses fragment caching to avoid processing the same exact string more than once + +
    + +
    + +## Usage + +Add this library to your javascript application with the following line of code + +```js +const toRegexRange = require('to-regex-range'); +``` + +The main export is a function that takes two integers: the `min` value and `max` value (formatted as strings or numbers). + +```js +const source = toRegexRange('15', '95'); +//=> 1[5-9]|[2-8][0-9]|9[0-5] + +const regex = new RegExp(`^${source}$`); +console.log(regex.test('14')); //=> false +console.log(regex.test('50')); //=> true +console.log(regex.test('94')); //=> true +console.log(regex.test('96')); //=> false +``` + +## Options + +### options.capture + +**Type**: `boolean` + +**Deafault**: `undefined` + +Wrap the returned value in parentheses when there is more than one regex condition. Useful when you're dynamically generating ranges. + +```js +console.log(toRegexRange('-10', '10')); +//=> -[1-9]|-?10|[0-9] + +console.log(toRegexRange('-10', '10', { capture: true })); +//=> (-[1-9]|-?10|[0-9]) +``` + +### options.shorthand + +**Type**: `boolean` + +**Deafault**: `undefined` + +Use the regex shorthand for `[0-9]`: + +```js +console.log(toRegexRange('0', '999999')); +//=> [0-9]|[1-9][0-9]{1,5} + +console.log(toRegexRange('0', '999999', { shorthand: true })); +//=> \d|[1-9]\d{1,5} +``` + +### options.relaxZeros + +**Type**: `boolean` + +**Default**: `true` + +This option relaxes matching for leading zeros when when ranges are zero-padded. + +```js +const source = toRegexRange('-0010', '0010'); +const regex = new RegExp(`^${source}$`); +console.log(regex.test('-10')); //=> true +console.log(regex.test('-010')); //=> true +console.log(regex.test('-0010')); //=> true +console.log(regex.test('10')); //=> true +console.log(regex.test('010')); //=> true +console.log(regex.test('0010')); //=> true +``` + +When `relaxZeros` is false, matching is strict: + +```js +const source = toRegexRange('-0010', '0010', { relaxZeros: false }); +const regex = new RegExp(`^${source}$`); +console.log(regex.test('-10')); //=> false +console.log(regex.test('-010')); //=> false +console.log(regex.test('-0010')); //=> true +console.log(regex.test('10')); //=> false +console.log(regex.test('010')); //=> false +console.log(regex.test('0010')); //=> true +``` + +## Examples + +| **Range** | **Result** | **Compile time** | +| --- | --- | --- | +| `toRegexRange(-10, 10)` | `-[1-9]\|-?10\|[0-9]` | _132μs_ | +| `toRegexRange(-100, -10)` | `-1[0-9]\|-[2-9][0-9]\|-100` | _50μs_ | +| `toRegexRange(-100, 100)` | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]` | _42μs_ | +| `toRegexRange(001, 100)` | `0{0,2}[1-9]\|0?[1-9][0-9]\|100` | _109μs_ | +| `toRegexRange(001, 555)` | `0{0,2}[1-9]\|0?[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _51μs_ | +| `toRegexRange(0010, 1000)` | `0{0,2}1[0-9]\|0{0,2}[2-9][0-9]\|0?[1-9][0-9]{2}\|1000` | _31μs_ | +| `toRegexRange(1, 50)` | `[1-9]\|[1-4][0-9]\|50` | _24μs_ | +| `toRegexRange(1, 55)` | `[1-9]\|[1-4][0-9]\|5[0-5]` | _23μs_ | +| `toRegexRange(1, 555)` | `[1-9]\|[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _30μs_ | +| `toRegexRange(1, 5555)` | `[1-9]\|[1-9][0-9]{1,2}\|[1-4][0-9]{3}\|5[0-4][0-9]{2}\|55[0-4][0-9]\|555[0-5]` | _43μs_ | +| `toRegexRange(111, 555)` | `11[1-9]\|1[2-9][0-9]\|[2-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]` | _38μs_ | +| `toRegexRange(29, 51)` | `29\|[34][0-9]\|5[01]` | _24μs_ | +| `toRegexRange(31, 877)` | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]` | _32μs_ | +| `toRegexRange(5, 5)` | `5` | _8μs_ | +| `toRegexRange(5, 6)` | `5\|6` | _11μs_ | +| `toRegexRange(1, 2)` | `1\|2` | _6μs_ | +| `toRegexRange(1, 5)` | `[1-5]` | _15μs_ | +| `toRegexRange(1, 10)` | `[1-9]\|10` | _22μs_ | +| `toRegexRange(1, 100)` | `[1-9]\|[1-9][0-9]\|100` | _25μs_ | +| `toRegexRange(1, 1000)` | `[1-9]\|[1-9][0-9]{1,2}\|1000` | _31μs_ | +| `toRegexRange(1, 10000)` | `[1-9]\|[1-9][0-9]{1,3}\|10000` | _34μs_ | +| `toRegexRange(1, 100000)` | `[1-9]\|[1-9][0-9]{1,4}\|100000` | _36μs_ | +| `toRegexRange(1, 1000000)` | `[1-9]\|[1-9][0-9]{1,5}\|1000000` | _42μs_ | +| `toRegexRange(1, 10000000)` | `[1-9]\|[1-9][0-9]{1,6}\|10000000` | _42μs_ | + +## Heads up! + +**Order of arguments** + +When the `min` is larger than the `max`, values will be flipped to create a valid range: + +```js +toRegexRange('51', '29'); +``` + +Is effectively flipped to: + +```js +toRegexRange('29', '51'); +//=> 29|[3-4][0-9]|5[0-1] +``` + +**Steps / increments** + +This library does not support steps (increments). A pr to add support would be welcome. + +## History + +### v2.0.0 - 2017-04-21 + +**New features** + +Adds support for zero-padding! + +### v1.0.0 + +**Optimizations** + +Repeating ranges are now grouped using quantifiers. rocessing time is roughly the same, but the generated regex is much smaller, which should result in faster matching. + +## Attribution + +Inspired by the python library [range-regex](https://github.com/dimka665/range-regex). + +## About + +
    +Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +
    + +
    +Running Tests + +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: + +```sh +$ npm install && npm test +``` + +
    + +
    +Building docs + +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: + +```sh +$ npm install -g verbose/verb#dev verb-generate-readme && verb +``` + +
    + +### Related projects + +You might also be interested in these projects: + +* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used… [more](https://github.com/jonschlinkert/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range "Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used by micromatch.") +* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/micromatch/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") +* [repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.") +* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.") + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 63 | [jonschlinkert](https://github.com/jonschlinkert) | +| 3 | [doowb](https://github.com/doowb) | +| 2 | [realityking](https://github.com/realityking) | + +### Author + +**Jon Schlinkert** + +* [GitHub Profile](https://github.com/jonschlinkert) +* [Twitter Profile](https://twitter.com/jonschlinkert) +* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) + +Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)! + + + + + +### License + +Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 07, 2019._ \ No newline at end of file diff --git a/node_modules/to-regex-range/index.js b/node_modules/to-regex-range/index.js new file mode 100644 index 0000000..77fbace --- /dev/null +++ b/node_modules/to-regex-range/index.js @@ -0,0 +1,288 @@ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ + +'use strict'; + +const isNumber = require('is-number'); + +const toRegexRange = (min, max, options) => { + if (isNumber(min) === false) { + throw new TypeError('toRegexRange: expected the first argument to be a number'); + } + + if (max === void 0 || min === max) { + return String(min); + } + + if (isNumber(max) === false) { + throw new TypeError('toRegexRange: expected the second argument to be a number.'); + } + + let opts = { relaxZeros: true, ...options }; + if (typeof opts.strictZeros === 'boolean') { + opts.relaxZeros = opts.strictZeros === false; + } + + let relax = String(opts.relaxZeros); + let shorthand = String(opts.shorthand); + let capture = String(opts.capture); + let wrap = String(opts.wrap); + let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap; + + if (toRegexRange.cache.hasOwnProperty(cacheKey)) { + return toRegexRange.cache[cacheKey].result; + } + + let a = Math.min(min, max); + let b = Math.max(min, max); + + if (Math.abs(a - b) === 1) { + let result = min + '|' + max; + if (opts.capture) { + return `(${result})`; + } + if (opts.wrap === false) { + return result; + } + return `(?:${result})`; + } + + let isPadded = hasPadding(min) || hasPadding(max); + let state = { min, max, a, b }; + let positives = []; + let negatives = []; + + if (isPadded) { + state.isPadded = isPadded; + state.maxLen = String(state.max).length; + } + + if (a < 0) { + let newMin = b < 0 ? Math.abs(b) : 1; + negatives = splitToPatterns(newMin, Math.abs(a), state, opts); + a = state.a = 0; + } + + if (b >= 0) { + positives = splitToPatterns(a, b, state, opts); + } + + state.negatives = negatives; + state.positives = positives; + state.result = collatePatterns(negatives, positives, opts); + + if (opts.capture === true) { + state.result = `(${state.result})`; + } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) { + state.result = `(?:${state.result})`; + } + + toRegexRange.cache[cacheKey] = state; + return state.result; +}; + +function collatePatterns(neg, pos, options) { + let onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; + let onlyPositive = filterPatterns(pos, neg, '', false, options) || []; + let intersected = filterPatterns(neg, pos, '-?', true, options) || []; + let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join('|'); +} + +function splitToRanges(min, max) { + let nines = 1; + let zeros = 1; + + let stop = countNines(min, nines); + let stops = new Set([max]); + + while (min <= stop && stop <= max) { + stops.add(stop); + nines += 1; + stop = countNines(min, nines); + } + + stop = countZeros(max + 1, zeros) - 1; + + while (min < stop && stop <= max) { + stops.add(stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } + + stops = [...stops]; + stops.sort(compare); + return stops; +} + +/** + * Convert a range to a regex pattern + * @param {Number} `start` + * @param {Number} `stop` + * @return {String} + */ + +function rangeToPattern(start, stop, options) { + if (start === stop) { + return { pattern: start, count: [], digits: 0 }; + } + + let zipped = zip(start, stop); + let digits = zipped.length; + let pattern = ''; + let count = 0; + + for (let i = 0; i < digits; i++) { + let [startDigit, stopDigit] = zipped[i]; + + if (startDigit === stopDigit) { + pattern += startDigit; + + } else if (startDigit !== '0' || stopDigit !== '9') { + pattern += toCharacterClass(startDigit, stopDigit, options); + + } else { + count++; + } + } + + if (count) { + pattern += options.shorthand === true ? '\\d' : '[0-9]'; + } + + return { pattern, count: [count], digits }; +} + +function splitToPatterns(min, max, tok, options) { + let ranges = splitToRanges(min, max); + let tokens = []; + let start = min; + let prev; + + for (let i = 0; i < ranges.length; i++) { + let max = ranges[i]; + let obj = rangeToPattern(String(start), String(max), options); + let zeros = ''; + + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.count.length > 1) { + prev.count.pop(); + } + + prev.count.push(obj.count[0]); + prev.string = prev.pattern + toQuantifier(prev.count); + start = max + 1; + continue; + } + + if (tok.isPadded) { + zeros = padZeros(max, tok, options); + } + + obj.string = zeros + obj.pattern + toQuantifier(obj.count); + tokens.push(obj); + start = max + 1; + prev = obj; + } + + return tokens; +} + +function filterPatterns(arr, comparison, prefix, intersection, options) { + let result = []; + + for (let ele of arr) { + let { string } = ele; + + // only push if _both_ are negative... + if (!intersection && !contains(comparison, 'string', string)) { + result.push(prefix + string); + } + + // or _both_ are positive + if (intersection && contains(comparison, 'string', string)) { + result.push(prefix + string); + } + } + return result; +} + +/** + * Zip strings + */ + +function zip(a, b) { + let arr = []; + for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]); + return arr; +} + +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} + +function contains(arr, key, val) { + return arr.some(ele => ele[key] === val); +} + +function countNines(min, len) { + return Number(String(min).slice(0, -len) + '9'.repeat(len)); +} + +function countZeros(integer, zeros) { + return integer - (integer % Math.pow(10, zeros)); +} + +function toQuantifier(digits) { + let [start = 0, stop = ''] = digits; + if (stop || start > 1) { + return `{${start + (stop ? ',' + stop : '')}}`; + } + return ''; +} + +function toCharacterClass(a, b, options) { + return `[${a}${(b - a === 1) ? '' : '-'}${b}]`; +} + +function hasPadding(str) { + return /^-?(0+)\d/.test(str); +} + +function padZeros(value, tok, options) { + if (!tok.isPadded) { + return value; + } + + let diff = Math.abs(tok.maxLen - String(value).length); + let relax = options.relaxZeros !== false; + + switch (diff) { + case 0: + return ''; + case 1: + return relax ? '0?' : '0'; + case 2: + return relax ? '0{0,2}' : '00'; + default: { + return relax ? `0{0,${diff}}` : `0{${diff}}`; + } + } +} + +/** + * Cache + */ + +toRegexRange.cache = {}; +toRegexRange.clearCache = () => (toRegexRange.cache = {}); + +/** + * Expose `toRegexRange` + */ + +module.exports = toRegexRange; diff --git a/node_modules/to-regex-range/package.json b/node_modules/to-regex-range/package.json new file mode 100644 index 0000000..4ef194f --- /dev/null +++ b/node_modules/to-regex-range/package.json @@ -0,0 +1,88 @@ +{ + "name": "to-regex-range", + "description": "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.", + "version": "5.0.1", + "homepage": "https://github.com/micromatch/to-regex-range", + "author": "Jon Schlinkert (https://github.com/jonschlinkert)", + "contributors": [ + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Rouven Weßling (www.rouvenwessling.de)" + ], + "repository": "micromatch/to-regex-range", + "bugs": { + "url": "https://github.com/micromatch/to-regex-range/issues" + }, + "license": "MIT", + "files": [ + "index.js" + ], + "main": "index.js", + "engines": { + "node": ">=8.0" + }, + "scripts": { + "test": "mocha" + }, + "dependencies": { + "is-number": "^7.0.0" + }, + "devDependencies": { + "fill-range": "^6.0.0", + "gulp-format-md": "^2.0.0", + "mocha": "^6.0.2", + "text-table": "^0.2.0", + "time-diff": "^0.3.1" + }, + "keywords": [ + "bash", + "date", + "expand", + "expansion", + "expression", + "glob", + "match", + "match date", + "match number", + "match numbers", + "match year", + "matches", + "matching", + "number", + "numbers", + "numerical", + "range", + "ranges", + "regex", + "regexp", + "regular", + "regular expression", + "sequence" + ], + "verb": { + "layout": "default", + "toc": false, + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "lint": { + "reflinks": true + }, + "helpers": { + "examples": { + "displayName": "examples" + } + }, + "related": { + "list": [ + "expand-range", + "fill-range", + "micromatch", + "repeat-element", + "repeat-string" + ] + } + } +} diff --git a/node_modules/touch/LICENSE b/node_modules/touch/LICENSE new file mode 100644 index 0000000..05eeeb8 --- /dev/null +++ b/node_modules/touch/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/touch/README.md b/node_modules/touch/README.md new file mode 100644 index 0000000..b5a361e --- /dev/null +++ b/node_modules/touch/README.md @@ -0,0 +1,52 @@ +# node-touch + +For all your node touching needs. + +## Installing + +```bash +npm install touch +``` + +## CLI Usage: + +See `man touch` + +This package exports a binary called `nodetouch` that works mostly +like the unix builtin `touch(1)`. + +## API Usage: + +```javascript +var touch = require("touch") +``` + +Gives you the following functions: + +* `touch(filename, options, cb)` +* `touch.sync(filename, options)` +* `touch.ftouch(fd, options, cb)` +* `touch.ftouchSync(fd, options)` + +All the `options` objects are optional. + +All the async functions return a Promise. If a callback function is +provided, then it's attached to the Promise. + +## Options + +* `force` like `touch -f` Boolean +* `time` like `touch -t ` Can be a Date object, or any parseable + Date string, or epoch ms number. +* `atime` like `touch -a` Can be either a Boolean, or a Date. +* `mtime` like `touch -m` Can be either a Boolean, or a Date. +* `ref` like `touch -r ` Must be path to a file. +* `nocreate` like `touch -c` Boolean + +If neither `atime` nor `mtime` are set, then both values are set. If +one of them is set, then the other is not. + +## cli + +This package creates a `nodetouch` command line executable that works +very much like the unix builtin `touch(1)` diff --git a/node_modules/touch/bin/nodetouch.js b/node_modules/touch/bin/nodetouch.js new file mode 100755 index 0000000..f78f082 --- /dev/null +++ b/node_modules/touch/bin/nodetouch.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node +const touch = require("../index.js") + +const usage = code => { + console[code ? 'error' : 'log']( + 'usage:\n' + + 'touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...' + ) + process.exit(code) +} + +const singleFlags = { + a: 'atime', + m: 'mtime', + c: 'nocreate', + f: 'force' +} + +const singleOpts = { + r: 'ref', + t: 'time' +} + +const files = [] +const args = process.argv.slice(2) +const options = {} +for (let i = 0; i < args.length; i++) { + const arg = args[i] + if (!arg.match(/^-/)) { + files.push(arg) + continue + } + + // expand shorthands + if (arg.charAt(1) !== '-') { + const expand = [] + for (let f = 1; f < arg.length; f++) { + const fc = arg.charAt(f) + const sf = singleFlags[fc] + const so = singleOpts[fc] + if (sf) + expand.push('--' + sf) + else if (so) { + const soslice = arg.slice(f + 1) + const soval = soslice.charAt(0) === '=' ? soslice : '=' + soslice + expand.push('--' + so + soval) + f = arg.length + } else if (arg !== '-' + fc) + expand.push('-' + fc) + } + if (expand.length) { + args.splice.apply(args, [i, 1].concat(expand)) + i-- + continue + } + } + + const argsplit = arg.split('=') + const key = argsplit.shift().replace(/^\-\-/, '') + const val = argsplit.length ? argsplit.join('=') : null + + switch (key) { + case 'time': + const timestr = val || args[++i] + // [-t [[CC]YY]MMDDhhmm[.SS]] + const parsedtime = timestr.match( + /^(([0-9]{2})?([0-9]{2}))?([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})(\.([0-9]{2}))?$/ + ) + if (!parsedtime) { + console.error('touch: out of range or illegal ' + + 'time specification: ' + + '[[CC]YY]MMDDhhmm[.SS]') + process.exit(1) + } else { + const y = +parsedtime[1] + const year = parsedtime[2] ? y + : y <= 68 ? 2000 + y + : 1900 + y + + const MM = +parsedtime[4] - 1 + const dd = +parsedtime[5] + const hh = +parsedtime[6] + const mm = +parsedtime[7] + const ss = +parsedtime[8] + + options.time = new Date(Date.UTC(year, MM, dd, hh, mm, ss)) + } + continue + + case 'ref': + options.ref = val || args[++i] + continue + + case 'mtime': + case 'nocreate': + case 'atime': + case 'force': + options[key] = true + continue + + default: + console.error('touch: illegal option -- ' + arg) + usage(1) + } +} + +if (!files.length) + usage() + +process.exitCode = 0 +Promise.all(files.map(f => touch(f, options))) + .catch(er => process.exitCode = 1) diff --git a/node_modules/touch/index.js b/node_modules/touch/index.js new file mode 100644 index 0000000..f942e42 --- /dev/null +++ b/node_modules/touch/index.js @@ -0,0 +1,224 @@ +'use strict' + +const EE = require('events').EventEmitter +const cons = require('constants') +const fs = require('fs') + +module.exports = (f, options, cb) => { + if (typeof options === 'function') + cb = options, options = {} + + const p = new Promise((res, rej) => { + new Touch(validOpts(options, f, null)) + .on('done', res).on('error', rej) + }) + + return cb ? p.then(res => cb(null, res), cb) : p +} + +module.exports.sync = module.exports.touchSync = (f, options) => + (new TouchSync(validOpts(options, f, null)), undefined) + +module.exports.ftouch = (fd, options, cb) => { + if (typeof options === 'function') + cb = options, options = {} + + const p = new Promise((res, rej) => { + new Touch(validOpts(options, null, fd)) + .on('done', res).on('error', rej) + }) + + return cb ? p.then(res => cb(null, res), cb) : p +} + +module.exports.ftouchSync = (fd, opt) => + (new TouchSync(validOpts(opt, null, fd)), undefined) + +const validOpts = (options, path, fd) => { + options = Object.create(options || {}) + options.fd = fd + options.path = path + + // {mtime: true}, {ctime: true} + // If set to something else, then treat as epoch ms value + const now = parseInt(new Date(options.time || Date.now()).getTime() / 1000) + if (!options.atime && !options.mtime) + options.atime = options.mtime = now + else { + if (true === options.atime) + options.atime = now + + if (true === options.mtime) + options.mtime = now + } + + let oflags = 0 + if (!options.force) + oflags = oflags | cons.O_RDWR + + if (!options.nocreate) + oflags = oflags | cons.O_CREAT + + options.oflags = oflags + return options +} + +class Touch extends EE { + constructor (options) { + super(options) + this.fd = options.fd + this.path = options.path + this.atime = options.atime + this.mtime = options.mtime + this.ref = options.ref + this.nocreate = !!options.nocreate + this.force = !!options.force + this.closeAfter = options.closeAfter + this.oflags = options.oflags + this.options = options + + if (typeof this.fd !== 'number') { + this.closeAfter = true + this.open() + } else + this.onopen(null, this.fd) + } + + emit (ev, data) { + // we only emit when either done or erroring + // in both cases, need to close + this.close() + return super.emit(ev, data) + } + + close () { + if (typeof this.fd === 'number' && this.closeAfter) + fs.close(this.fd, () => {}) + } + + open () { + fs.open(this.path, this.oflags, (er, fd) => this.onopen(er, fd)) + } + + onopen (er, fd) { + if (er) { + if (er.code === 'EISDIR') + this.onopen(null, null) + else if (er.code === 'ENOENT' && this.nocreate) + this.emit('done') + else + this.emit('error', er) + } else { + this.fd = fd + if (this.ref) + this.statref() + else if (!this.atime || !this.mtime) + this.fstat() + else + this.futimes() + } + } + + statref () { + fs.stat(this.ref, (er, st) => { + if (er) + this.emit('error', er) + else + this.onstatref(st) + }) + } + + onstatref (st) { + this.atime = this.atime && parseInt(st.atime.getTime()/1000, 10) + this.mtime = this.mtime && parseInt(st.mtime.getTime()/1000, 10) + if (!this.atime || !this.mtime) + this.fstat() + else + this.futimes() + } + + fstat () { + const stat = this.fd ? 'fstat' : 'stat' + const target = this.fd || this.path + fs[stat](target, (er, st) => { + if (er) + this.emit('error', er) + else + this.onfstat(st) + }) + } + + onfstat (st) { + if (typeof this.atime !== 'number') + this.atime = parseInt(st.atime.getTime()/1000, 10) + + if (typeof this.mtime !== 'number') + this.mtime = parseInt(st.mtime.getTime()/1000, 10) + + this.futimes() + } + + futimes () { + const utimes = this.fd ? 'futimes' : 'utimes' + const target = this.fd || this.path + fs[utimes](target, ''+this.atime, ''+this.mtime, er => { + if (er) + this.emit('error', er) + else + this.emit('done') + }) + } +} + +class TouchSync extends Touch { + open () { + try { + this.onopen(null, fs.openSync(this.path, this.oflags)) + } catch (er) { + this.onopen(er) + } + } + + statref () { + let threw = true + try { + this.onstatref(fs.statSync(this.ref)) + threw = false + } finally { + if (threw) + this.close() + } + } + + fstat () { + let threw = true + const stat = this.fd ? 'fstatSync' : 'statSync' + const target = this.fd || this.path + try { + this.onfstat(fs[stat](target)) + threw = false + } finally { + if (threw) + this.close() + } + } + + futimes () { + let threw = true + const utimes = this.fd ? 'futimesSync' : 'utimesSync' + const target = this.fd || this.path + try { + fs[utimes](target, this.atime, this.mtime) + threw = false + } finally { + if (threw) + this.close() + } + this.emit('done') + } + + close () { + if (typeof this.fd === 'number' && this.closeAfter) + try { fs.closeSync(this.fd) } catch (er) {} + } +} diff --git a/node_modules/touch/package.json b/node_modules/touch/package.json new file mode 100644 index 0000000..05608de --- /dev/null +++ b/node_modules/touch/package.json @@ -0,0 +1,28 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "touch", + "description": "like touch(1) in node", + "version": "3.1.0", + "repository": "git://github.com/isaacs/node-touch.git", + "bin": { + "nodetouch": "./bin/nodetouch.js" + }, + "dependencies": { + "nopt": "~1.0.10" + }, + "license": "ISC", + "scripts": { + "test": "tap test/*.js --100 -J", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "devDependencies": { + "mutate-fs": "^1.1.0", + "tap": "^10.7.0" + }, + "files": [ + "index.js", + "bin/nodetouch.js" + ] +} diff --git a/node_modules/undefsafe/.github/workflows/release.yml b/node_modules/undefsafe/.github/workflows/release.yml new file mode 100644 index 0000000..e6ee886 --- /dev/null +++ b/node_modules/undefsafe/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release +on: + push: + branches: + - master +jobs: + release: + name: Release + runs-on: ubuntu-18.04 + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Setup Node.js + uses: actions/setup-node@v1 + with: + node-version: 16 + - name: Install dependencies + run: npm ci + - name: Test + run: npm run test + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: npx semantic-release diff --git a/node_modules/undefsafe/.jscsrc b/node_modules/undefsafe/.jscsrc new file mode 100644 index 0000000..9e01c9b --- /dev/null +++ b/node_modules/undefsafe/.jscsrc @@ -0,0 +1,13 @@ +{ + "preset": "node-style-guide", + "requireCapitalizedComments": null, + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningCurlyBrace": true, + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "excludeFiles": ["node_modules/**"], + "disallowSpacesInFunction": null +} diff --git a/node_modules/undefsafe/.jshintrc b/node_modules/undefsafe/.jshintrc new file mode 100644 index 0000000..b47f672 --- /dev/null +++ b/node_modules/undefsafe/.jshintrc @@ -0,0 +1,16 @@ +{ + "browser": false, + "camelcase": true, + "curly": true, + "devel": true, + "eqeqeq": true, + "forin": true, + "indent": 2, + "noarg": true, + "node": true, + "quotmark": "single", + "undef": true, + "strict": false, + "unused": true +} + diff --git a/node_modules/undefsafe/.travis.yml b/node_modules/undefsafe/.travis.yml new file mode 100644 index 0000000..a1ace24 --- /dev/null +++ b/node_modules/undefsafe/.travis.yml @@ -0,0 +1,18 @@ +sudo: false +language: node_js +cache: + directories: + - node_modules +notifications: + email: false +node_js: + - '4' +before_install: + - npm i -g npm@^2.0.0 +before_script: + - npm prune +after_success: + - npm run semantic-release +branches: + except: + - "/^v\\d+\\.\\d+\\.\\d+$/" diff --git a/node_modules/undefsafe/LICENSE b/node_modules/undefsafe/LICENSE new file mode 100644 index 0000000..caaf03a --- /dev/null +++ b/node_modules/undefsafe/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright © 2016 Remy Sharp, http://remysharp.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/undefsafe/README.md b/node_modules/undefsafe/README.md new file mode 100644 index 0000000..46a706b --- /dev/null +++ b/node_modules/undefsafe/README.md @@ -0,0 +1,63 @@ +# undefsafe + +Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined" + +Can also be used to safely set deep values. + +## Usage + +```js +var object = { + a: { + b: { + c: 1, + d: [1,2,3], + e: 'remy' + } + } +}; + +console.log(undefsafe(object, 'a.b.e')); // "remy" +console.log(undefsafe(object, 'a.b.not.found')); // undefined +``` + +Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console) + +## Setting + +```js +var object = { + a: { + b: [1,2,3] + } +}; + +// modified object +var res = undefsafe(object, 'a.b.0', 10); + +console.log(object); // { a: { b: [10, 2, 3] } } +console.log(res); // 1 - previous value +``` + +## Star rules in paths + +As of 1.2.0, `undefsafe` supports a `*` in the path if you want to search all of the properties (or array elements) for a particular element. + +The function will only return a single result, either the 3rd argument validation value, or the first positive match. For example, the following github data: + +```js +const githubData = { + commits: [{ + modified: [ + "one", + "two" + ] + }, /* ... */ ] + }; + +// first modified file found in the first commit +console.log(undefsafe(githubData, 'commits.*.modified.0')); + +// returns `two` or undefined if not found +console.log(undefsafe(githubData, 'commits.*.modified.*', 'two')); +``` diff --git a/node_modules/undefsafe/example.js b/node_modules/undefsafe/example.js new file mode 100644 index 0000000..ed93c23 --- /dev/null +++ b/node_modules/undefsafe/example.js @@ -0,0 +1,14 @@ +var undefsafe = require('undefsafe'); + +var object = { + a: { + b: { + c: 1, + d: [1, 2, 3], + e: 'remy' + } + } +}; + +console.log(undefsafe(object, 'a.b.e')); // "remy" +console.log(undefsafe(object, 'a.b.not.found')); // undefined diff --git a/node_modules/undefsafe/lib/undefsafe.js b/node_modules/undefsafe/lib/undefsafe.js new file mode 100644 index 0000000..7446878 --- /dev/null +++ b/node_modules/undefsafe/lib/undefsafe.js @@ -0,0 +1,125 @@ +'use strict'; + +function undefsafe(obj, path, value, __res) { + // I'm not super keen on this private function, but it's because + // it'll also be use in the browser and I wont *one* function exposed + function split(path) { + var res = []; + var level = 0; + var key = ''; + + for (var i = 0; i < path.length; i++) { + var c = path.substr(i, 1); + + if (level === 0 && (c === '.' || c === '[')) { + if (c === '[') { + level++; + i++; + c = path.substr(i, 1); + } + + if (key) { + // the first value could be a string + res.push(key); + } + key = ''; + continue; + } + + if (c === ']') { + level--; + key = key.slice(0, -1); + continue; + } + + key += c; + } + + res.push(key); + + return res; + } + + // bail if there's nothing + if (obj === undefined || obj === null) { + return undefined; + } + + var parts = split(path); + var key = null; + var type = typeof obj; + var root = obj; + var parent = obj; + + var star = + parts.filter(function(_) { + return _ === '*'; + }).length > 0; + + // we're dealing with a primitive + if (type !== 'object' && type !== 'function') { + return obj; + } else if (path.trim() === '') { + return obj; + } + + key = parts[0]; + var i = 0; + for (; i < parts.length; i++) { + key = parts[i]; + parent = obj; + + if (key === '*') { + // loop through each property + var prop = ''; + var res = __res || []; + + for (prop in parent) { + var shallowObj = undefsafe( + obj[prop], + parts.slice(i + 1).join('.'), + value, + res + ); + if (shallowObj && shallowObj !== res) { + if ((value && shallowObj === value) || value === undefined) { + if (value !== undefined) { + return shallowObj; + } + + res.push(shallowObj); + } + } + } + + if (res.length === 0) { + return undefined; + } + + return res; + } + + if (Object.getOwnPropertyNames(obj).indexOf(key) == -1) { + return undefined; + } + + obj = obj[key]; + if (obj === undefined || obj === null) { + break; + } + } + + // if we have a null object, make sure it's the one the user was after, + // if it's not (i.e. parts has a length) then give undefined back. + if (obj === null && i !== parts.length - 1) { + obj = undefined; + } else if (!star && value) { + key = path.split('.').pop(); + parent[key] = value; + } + return obj; +} + +if (typeof module !== 'undefined') { + module.exports = undefsafe; +} diff --git a/node_modules/undefsafe/package.json b/node_modules/undefsafe/package.json new file mode 100644 index 0000000..a454233 --- /dev/null +++ b/node_modules/undefsafe/package.json @@ -0,0 +1,34 @@ +{ + "name": "undefsafe", + "description": "Undefined safe way of extracting object properties", + "main": "lib/undefsafe.js", + "tonicExampleFilename": "example.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/**/*.test.js -R spec", + "cover": "tap test/*.test.js --cov --coverage-report=lcov", + "semantic-release": "semantic-release" + }, + "prettier": { + "trailingComma": "none", + "singleQuote": true + }, + "repository": { + "type": "git", + "url": "https://github.com/remy/undefsafe.git" + }, + "keywords": [ + "undefined" + ], + "author": "Remy Sharp", + "license": "MIT", + "devDependencies": { + "semantic-release": "^18.0.0", + "tap": "^5.7.1", + "tap-only": "0.0.5" + }, + "dependencies": {}, + "version": "2.0.5" +} diff --git a/package-lock.json b/package-lock.json index f124a76..b8ace19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "^41.3.1", "express": "^4.19.2", - "nodemailer": "^6.9.13" + "nodemailer": "^6.9.13", + "nodemon": "^3.1.0" } }, "node_modules/@ckeditor/ckeditor5-adapter-ckfinder": { @@ -329,6 +330,11 @@ "lodash-es": "4.17.21" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -341,11 +347,39 @@ "node": ">= 0.6" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/blurhash": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", @@ -374,6 +408,26 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -400,6 +454,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/ckeditor5": { "version": "41.3.1", "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-41.3.1.tgz", @@ -444,6 +521,11 @@ "color-name": "^1.0.0" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -603,6 +685,17 @@ "node": ">= 0.10.0" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -636,6 +729,19 @@ "node": ">= 0.6" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -662,6 +768,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -673,6 +790,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -743,6 +868,11 @@ "node": ">=0.10.0" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -756,6 +886,44 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", @@ -812,6 +980,17 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -833,6 +1012,76 @@ "node": ">=6.0.0" } }, + "node_modules/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -865,6 +1114,17 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -877,6 +1137,11 @@ "node": ">= 0.10" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -913,6 +1178,17 @@ "node": ">= 0.8" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -937,6 +1213,17 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -1017,6 +1304,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1025,6 +1323,28 @@ "node": ">= 0.8" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1033,6 +1353,17 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1045,6 +1376,11 @@ "node": ">= 0.6" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 3012978..4a079e9 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "lib": "lib" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" +"start": "nodemon app.js" }, "keywords": [], "author": "", @@ -15,6 +15,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "^41.3.1", "express": "^4.19.2", - "nodemailer": "^6.9.13" + "nodemailer": "^6.9.13", + "nodemon": "^3.1.0" } } From 2bb17a3ea2950605f30a380bfddfba92463f048b Mon Sep 17 00:00:00 2001 From: Mohammed Shahnawaz <97173613+imshn@users.noreply.github.com> Date: Sun, 12 May 2024 16:16:00 +0000 Subject: [PATCH 6/6] commit --- public/about.html => about.html | 0 {public/assets => assets}/css/default.css | 0 {public/assets => assets}/css/responsive.css | 0 {public/assets => assets}/css/style.css | 0 .../assets => assets}/fonts/flaticon/flaticon.css | 0 .../assets => assets}/fonts/flaticon/flaticon.eot | Bin .../assets => assets}/fonts/flaticon/flaticon.html | 0 .../assets => assets}/fonts/flaticon/flaticon.scss | 0 .../assets => assets}/fonts/flaticon/flaticon.svg | 0 .../assets => assets}/fonts/flaticon/flaticon.ttf | Bin .../assets => assets}/fonts/flaticon/flaticon.woff | Bin .../assets => assets}/fonts/flaticon/flaticon.woff2 | Bin .../fonts/fontawesome/css/all.min.css | 0 .../fonts/fontawesome/webfonts/fa-brands-400.eot | Bin .../fonts/fontawesome/webfonts/fa-brands-400.ttf | Bin .../fonts/fontawesome/webfonts/fa-brands-400.woff | Bin .../fonts/fontawesome/webfonts/fa-brands-400.woff2 | Bin .../fonts/fontawesome/webfonts/fa-light-300.eot | Bin .../fonts/fontawesome/webfonts/fa-light-300.ttf | Bin .../fonts/fontawesome/webfonts/fa-light-300.woff | Bin .../fonts/fontawesome/webfonts/fa-light-300.woff2 | Bin .../fonts/fontawesome/webfonts/fa-regular-400.eot | Bin .../fonts/fontawesome/webfonts/fa-regular-400.ttf | Bin .../fonts/fontawesome/webfonts/fa-regular-400.woff | Bin .../fonts/fontawesome/webfonts/fa-regular-400.woff2 | Bin .../fonts/fontawesome/webfonts/fa-solid-900.eot | Bin .../fonts/fontawesome/webfonts/fa-solid-900.ttf | Bin .../fonts/fontawesome/webfonts/fa-solid-900.woff | Bin .../fonts/fontawesome/webfonts/fa-solid-900.woff2 | Bin .../assets => assets}/images/about/2 persons.png | Bin .../assets => assets}/images/about/3 persons.png | Bin {public/assets => assets}/images/about/about-1.jpg | Bin {public/assets => assets}/images/about/about-2.png | Bin {public/assets => assets}/images/about/about-3.jpg | Bin {public/assets => assets}/images/about/about-4.png | Bin {public/assets => assets}/images/about/growth.png | Bin {public/assets => assets}/images/about/hands.png | Bin .../images/about/illustration 4.png | Bin {public/assets => assets}/images/about/img-4.jpg | Bin {public/assets => assets}/images/about/img-5.png | Bin {public/assets => assets}/images/about/img-6.png | Bin {public/assets => assets}/images/agri.png | Bin {public/assets => assets}/images/bar.png | Bin {public/assets => assets}/images/blog/author-1.jpg | Bin {public/assets => assets}/images/blog/blog-bg-1.jpg | Bin .../assets => assets}/images/blog/blog-single-1.jpg | Bin .../assets => assets}/images/blog/blog-single-2.jpg | Bin {public/assets => assets}/images/blog/comment-1.jpg | Bin {public/assets => assets}/images/blog/comment-2.jpg | Bin {public/assets => assets}/images/blog/comment-3.jpg | Bin {public/assets => assets}/images/blog/img-1.jpg | Bin {public/assets => assets}/images/blog/img-2.jpg | Bin {public/assets => assets}/images/blog/img-3.jpg | Bin .../assets => assets}/images/blog/standard-1.jpg | Bin .../assets => assets}/images/blog/standard-2.jpg | Bin .../assets => assets}/images/blog/standard-3.jpg | Bin .../assets => assets}/images/blog/standard-4.jpg | Bin {public/assets => assets}/images/border-1.png | Bin {public/assets => assets}/images/border-2.png | Bin .../images/breadcrumb/3 personssss.png | Bin .../assets => assets}/images/breadcrumb/img-1.jpg | Bin .../assets => assets}/images/breadcrumb/img-2.jpg | Bin .../assets => assets}/images/breadcrumb/img-3.jpg | Bin .../images/breadcrumb/laptopppp.png | Bin .../images/contact/conatct man.png | Bin .../assets => assets}/images/contact/contact-1.jpg | Bin {public/assets => assets}/images/cta/3......png | Bin {public/assets => assets}/images/cta/img-1.jpg | Bin {public/assets => assets}/images/cta/img-2.png | Bin {public/assets => assets}/images/dot.png | Bin {public/assets => assets}/images/favicon.ico | Bin .../images/footer/footer-page-bg-1.png | Bin .../images/footer/footer-page-bg-2.png | Bin .../assets => assets}/images/hero/dot-pattern.png | Bin .../images/hero/hereeeeeeeeeeeeeeeeeeeee.png | Bin {public/assets => assets}/images/hero/hero-.jpeg | Bin .../images/hero/hero-one-img-1.jpg | Bin .../images/hero/hero-one-img-2.jpg | Bin .../assets => assets}/images/hero/hero-one-img.jpg | Bin .../assets => assets}/images/hero/hero-pattern.png | Bin .../images/hero/hero-three-img-1-1.png | Bin .../images/hero/hero-two-img-1.png | Bin .../images/hero/hero-two-shape-1.png | Bin .../images/hero/hero-two-shape-2.png | Bin .../images/hero/hero-two-shape-3.png | Bin {public/assets => assets}/images/hero/shape-1.png | Bin {public/assets => assets}/images/hero/shape-2.png | Bin {public/assets => assets}/images/icon/icon-1.png | Bin {public/assets => assets}/images/icon/icon-10.png | Bin {public/assets => assets}/images/icon/icon-11.png | Bin {public/assets => assets}/images/icon/icon-12.png | Bin {public/assets => assets}/images/icon/icon-13.png | Bin {public/assets => assets}/images/icon/icon-14.png | Bin {public/assets => assets}/images/icon/icon-15.png | Bin {public/assets => assets}/images/icon/icon-16.png | Bin {public/assets => assets}/images/icon/icon-17.png | Bin {public/assets => assets}/images/icon/icon-18.png | Bin {public/assets => assets}/images/icon/icon-19.png | Bin {public/assets => assets}/images/icon/icon-2.png | Bin {public/assets => assets}/images/icon/icon-20.png | Bin {public/assets => assets}/images/icon/icon-21.png | Bin {public/assets => assets}/images/icon/icon-22.png | Bin {public/assets => assets}/images/icon/icon-3.png | Bin {public/assets => assets}/images/icon/icon-4.png | Bin {public/assets => assets}/images/icon/icon-5.png | Bin {public/assets => assets}/images/icon/icon-6.png | Bin {public/assets => assets}/images/icon/icon-7.png | Bin {public/assets => assets}/images/icon/icon-8.png | Bin {public/assets => assets}/images/icon/icon-9.png | Bin {public/assets => assets}/images/line.png | Bin .../images/logo/Heading-removebg-preview.png | Bin .../logo/Untitled_design-removebg-preview.png | Bin .../assets => assets}/images/logo/footer-logo-1.png | Bin .../assets => assets}/images/logo/footer-logo-2.png | Bin {public/assets => assets}/images/logo/logo-1.png | Bin {public/assets => assets}/images/map.png | Bin {public/assets => assets}/images/partners/img-1.png | Bin .../assets => assets}/images/partners/img-10.png | Bin .../assets => assets}/images/partners/img-11.png | Bin .../assets => assets}/images/partners/img-12.png | Bin .../assets => assets}/images/partners/img-13.png | Bin .../assets => assets}/images/partners/img-14.png | Bin .../assets => assets}/images/partners/img-15.png | Bin .../assets => assets}/images/partners/img-16.png | Bin {public/assets => assets}/images/partners/img-2.png | Bin {public/assets => assets}/images/partners/img-3.png | Bin {public/assets => assets}/images/partners/img-4.png | Bin {public/assets => assets}/images/partners/img-5.png | Bin {public/assets => assets}/images/partners/img-6.png | Bin {public/assets => assets}/images/partners/img-7.png | Bin {public/assets => assets}/images/partners/img-8.png | Bin {public/assets => assets}/images/partners/img-9.png | Bin {public/assets => assets}/images/portfolio/agri.png | Bin {public/assets => assets}/images/portfolio/atoz.png | Bin .../assets => assets}/images/portfolio/humbee.png | Bin .../assets => assets}/images/portfolio/icon-1.png | Bin .../assets => assets}/images/portfolio/img-1.jpg | Bin .../assets => assets}/images/portfolio/img-10.jpg | Bin .../assets => assets}/images/portfolio/img-11.jpg | Bin .../assets => assets}/images/portfolio/img-12.jpg | Bin .../assets => assets}/images/portfolio/img-13.jpg | Bin .../assets => assets}/images/portfolio/img-14.jpg | Bin .../assets => assets}/images/portfolio/img-15.jpg | Bin .../assets => assets}/images/portfolio/img-16.jpg | Bin .../assets => assets}/images/portfolio/img-17.jpg | Bin .../assets => assets}/images/portfolio/img-18.jpg | Bin .../assets => assets}/images/portfolio/img-19.jpg | Bin .../assets => assets}/images/portfolio/img-2.jpg | Bin .../assets => assets}/images/portfolio/img-20.jpg | Bin .../assets => assets}/images/portfolio/img-3.jpg | Bin .../assets => assets}/images/portfolio/img-4.jpg | Bin .../assets => assets}/images/portfolio/img-5.jpg | Bin .../assets => assets}/images/portfolio/img-6.jpg | Bin .../assets => assets}/images/portfolio/img-7.jpg | Bin .../assets => assets}/images/portfolio/img-8.jpg | Bin .../assets => assets}/images/portfolio/img-9.jpg | Bin .../assets => assets}/images/portfolio/luxiee.png | Bin .../assets => assets}/images/portfolio/panind.png | Bin .../images/portfolio/single-img-1.jpg | Bin .../assets => assets}/images/portfolio/thumb-1.jpg | Bin .../assets => assets}/images/portfolio/thumb-2.jpg | Bin .../images/portfolio/videostar.png | Bin .../assets => assets}/images/shape/bg-shape-1.png | Bin .../assets => assets}/images/shape/bg-shape-2.png | Bin .../images/shape/circle-logo-1.png | Bin .../images/shape/circle-logo-2.png | Bin {public/assets => assets}/images/shape/line-2.png | Bin {public/assets => assets}/images/shape/line-3.png | Bin {public/assets => assets}/images/shape/line.png | Bin .../images/shape/pattern-shape-1.png | Bin .../images/shape/pattern-shape-2.png | Bin {public/assets => assets}/images/shape/shape-1.png | Bin {public/assets => assets}/images/shape/shape-10.png | Bin {public/assets => assets}/images/shape/shape-11.png | Bin {public/assets => assets}/images/shape/shape-12.png | Bin {public/assets => assets}/images/shape/shape-13.png | Bin {public/assets => assets}/images/shape/shape-14.png | Bin {public/assets => assets}/images/shape/shape-15.png | Bin {public/assets => assets}/images/shape/shape-16.png | Bin {public/assets => assets}/images/shape/shape-17.png | Bin {public/assets => assets}/images/shape/shape-18.png | Bin {public/assets => assets}/images/shape/shape-19.png | Bin {public/assets => assets}/images/shape/shape-2.png | Bin {public/assets => assets}/images/shape/shape-20.png | Bin {public/assets => assets}/images/shape/shape-3.png | Bin {public/assets => assets}/images/shape/shape-4.png | Bin {public/assets => assets}/images/shape/shape-5.png | Bin {public/assets => assets}/images/shape/shape-6.png | Bin {public/assets => assets}/images/shape/shape-7.png | Bin {public/assets => assets}/images/shape/shape-8.png | Bin {public/assets => assets}/images/shape/shape-9.png | Bin {public/assets => assets}/images/skill/img-1.jpg | Bin {public/assets => assets}/images/skill/img-2.jpg | Bin {public/assets => assets}/images/team/img-1.jpg | Bin {public/assets => assets}/images/team/img-10.jpg | Bin {public/assets => assets}/images/team/img-11.jpg | Bin {public/assets => assets}/images/team/img-2.jpg | Bin {public/assets => assets}/images/team/img-3.jpg | Bin {public/assets => assets}/images/team/img-4.jpg | Bin {public/assets => assets}/images/team/img-5.jpg | Bin {public/assets => assets}/images/team/img-6.jpg | Bin {public/assets => assets}/images/team/img-7.jpg | Bin {public/assets => assets}/images/team/img-8.jpg | Bin {public/assets => assets}/images/team/img-9.jpg | Bin .../assets => assets}/images/team/single-img-1.jpg | Bin {public/assets => assets}/images/team/team-img.png | Bin .../images/testimonial/happy girl.png | Bin .../assets => assets}/images/testimonial/img-1.jpg | Bin .../assets => assets}/images/testimonial/img-2.jpg | Bin .../assets => assets}/images/testimonial/img-3.jpg | Bin .../assets => assets}/images/testimonial/img-4.png | Bin .../images/testimonial/thumb-1.jpg | Bin .../images/testimonial/thumb-2.jpg | Bin .../images/testimonial/working mann.png | Bin {public/assets => assets}/images/video/img-1.jpg | Bin .../assets => assets}/images/widget/contact-1.jpg | Bin .../assets => assets}/images/widget/contact-2.png | Bin {public/assets => assets}/images/widget/news-1.jpg | Bin {public/assets => assets}/images/widget/news-2.jpg | Bin {public/assets => assets}/images/widget/news-3.jpg | Bin {public/assets => assets}/js/theme.js | 0 {public/assets => assets}/vendor/animate.css | 0 .../vendor/bootstrap/css/bootstrap.min.css | 0 .../vendor/bootstrap/js/bootstrap.min.js | 0 .../assets => assets}/vendor/imagesloaded.min.js | 0 {public/assets => assets}/vendor/isotope.min.js | 0 .../assets => assets}/vendor/jquery-3.6.0.min.js | 0 .../vendor/jquery.counterup.min.js | 0 .../assets => assets}/vendor/jquery.waypoints.js | 0 .../dist/jquery.magnific-popup.min.js | 0 .../vendor/magnific-popup/dist/magnific-popup.css | 0 .../vendor/nice-select/css/nice-select.css | 0 .../vendor/nice-select/js/jquery.nice-select.min.js | 0 {public/assets => assets}/vendor/parallax.min.js | 0 .../assets => assets}/vendor/popper/popper.min.js | 0 {public/assets => assets}/vendor/slick/slick.css | 0 {public/assets => assets}/vendor/slick/slick.min.js | 0 {public/assets => assets}/vendor/wow.min.js | 0 public/blog-details.html => blog-details.html | 0 public/blogs.html => blogs.html | 0 public/contact.html => contact.html | 0 {public/css => css}/bootstrap.min.css | 0 {public/css => css}/style.css | 0 {public/img => img}/Agri Fiance.png | Bin {public/img => img}/AtoZ (2).png | Bin {public/img => img}/Atoz.png | Bin {public/img => img}/Atoz1.png | Bin {public/img => img}/PAN.png | Bin {public/img => img}/Videostar.png | Bin {public/img => img}/WEBBB (1) (1).png | Bin {public/img => img}/about-us illustration.jpeg | Bin {public/img => img}/about.png | Bin {public/img => img}/bg-bottom.png | Bin {public/img => img}/bg-top.png | Bin {public/img => img}/blob-bottom-left.png | Bin {public/img => img}/blob-bottom-right.png | Bin {public/img => img}/blob-center.png | Bin {public/img => img}/blob-primary.png | Bin {public/img => img}/blob-secondary.png | Bin {public/img => img}/blob-top-left.png | Bin {public/img => img}/blob-top-right.png | Bin {public/img => img}/blob-white.png | Bin {public/img => img}/card1.png | Bin {public/img => img}/hero.png | Bin {public/img => img}/logo-for.jpeg | Bin {public/img => img}/logoNS.png | Bin {public/img => img}/map.png | Bin {public/img => img}/portfolio-1.jpg | Bin {public/img => img}/portfolio-2.jpg | Bin {public/img => img}/portfolio-3.jpg | Bin {public/img => img}/portfolio-4.jpg | Bin {public/img => img}/portfolio-5.jpg | Bin {public/img => img}/portfolio-6.jpg | Bin {public/img => img}/sand.png | Bin {public/img => img}/service-1.png | Bin {public/img => img}/service-2.png | Bin {public/img => img}/service-3.png | Bin {public/img => img}/service-4.png | Bin {public/img => img}/team-1.jpg | Bin {public/img => img}/team-2.jpg | Bin {public/img => img}/team-3.jpg | Bin {public/img => img}/testimonial-1.jpg | Bin {public/img => img}/testimonial-2.jpg | Bin {public/img => img}/testimonial-3.jpg | Bin {public/img => img}/testimonial-4.jpg | Bin {public/img => img}/user.png | Bin .../img => img}/webGenixIcon-removebg-preview.ico | Bin .../img => img}/webGenixLogo-removebg-preview.ico | Bin public/index.html => index.html | 0 {public/js => js}/main.js | 0 {public/lib => lib}/animate/animate.css | 0 {public/lib => lib}/animate/animate.min.css | 0 {public/lib => lib}/counterup/counterup.min.js | 0 {public/lib => lib}/easing/easing.js | 0 {public/lib => lib}/easing/easing.min.js | 0 {public/lib => lib}/isotope/isotope.pkgd.js | 0 {public/lib => lib}/isotope/isotope.pkgd.min.js | 0 {public/lib => lib}/lightbox/css/lightbox.css | 0 {public/lib => lib}/lightbox/css/lightbox.min.css | 0 {public/lib => lib}/lightbox/images/close.png | Bin {public/lib => lib}/lightbox/images/loading.gif | Bin {public/lib => lib}/lightbox/images/next.png | Bin {public/lib => lib}/lightbox/images/prev.png | Bin {public/lib => lib}/lightbox/js/lightbox.js | 0 {public/lib => lib}/lightbox/js/lightbox.min.js | 0 {public/lib => lib}/lightbox/links.php | 0 {public/lib => lib}/owlcarousel/LICENSE | 0 .../lib => lib}/owlcarousel/assets/ajax-loader.gif | Bin .../lib => lib}/owlcarousel/assets/owl.carousel.css | 0 .../owlcarousel/assets/owl.carousel.min.css | 0 .../owlcarousel/assets/owl.theme.default.css | 0 .../owlcarousel/assets/owl.theme.default.min.css | 0 .../owlcarousel/assets/owl.theme.green.css | 0 .../owlcarousel/assets/owl.theme.green.min.css | 0 .../owlcarousel/assets/owl.video.play.png | Bin {public/lib => lib}/owlcarousel/owl.carousel.js | 0 {public/lib => lib}/owlcarousel/owl.carousel.min.js | 0 {public/lib => lib}/waypoints/links.php | 0 {public/lib => lib}/waypoints/waypoints.min.js | 0 {public/lib => lib}/wow/wow.js | 0 {public/lib => lib}/wow/wow.min.js | 0 public/projects.html => projects.html | 0 {public/scss => scss}/bootstrap.scss | 0 .../scss => scss}/bootstrap/scss/_accordion.scss | 0 {public/scss => scss}/bootstrap/scss/_alert.scss | 0 {public/scss => scss}/bootstrap/scss/_badge.scss | 0 .../scss => scss}/bootstrap/scss/_breadcrumb.scss | 0 .../scss => scss}/bootstrap/scss/_button-group.scss | 0 {public/scss => scss}/bootstrap/scss/_buttons.scss | 0 {public/scss => scss}/bootstrap/scss/_card.scss | 0 {public/scss => scss}/bootstrap/scss/_carousel.scss | 0 {public/scss => scss}/bootstrap/scss/_close.scss | 0 .../scss => scss}/bootstrap/scss/_containers.scss | 0 {public/scss => scss}/bootstrap/scss/_dropdown.scss | 0 {public/scss => scss}/bootstrap/scss/_forms.scss | 0 .../scss => scss}/bootstrap/scss/_functions.scss | 0 {public/scss => scss}/bootstrap/scss/_grid.scss | 0 {public/scss => scss}/bootstrap/scss/_helpers.scss | 0 {public/scss => scss}/bootstrap/scss/_images.scss | 0 .../scss => scss}/bootstrap/scss/_list-group.scss | 0 {public/scss => scss}/bootstrap/scss/_mixins.scss | 0 {public/scss => scss}/bootstrap/scss/_modal.scss | 0 {public/scss => scss}/bootstrap/scss/_nav.scss | 0 {public/scss => scss}/bootstrap/scss/_navbar.scss | 0 .../scss => scss}/bootstrap/scss/_offcanvas.scss | 0 .../scss => scss}/bootstrap/scss/_pagination.scss | 0 {public/scss => scss}/bootstrap/scss/_popover.scss | 0 {public/scss => scss}/bootstrap/scss/_progress.scss | 0 {public/scss => scss}/bootstrap/scss/_reboot.scss | 0 {public/scss => scss}/bootstrap/scss/_root.scss | 0 {public/scss => scss}/bootstrap/scss/_spinners.scss | 0 {public/scss => scss}/bootstrap/scss/_tables.scss | 0 {public/scss => scss}/bootstrap/scss/_toasts.scss | 0 {public/scss => scss}/bootstrap/scss/_tooltip.scss | 0 .../scss => scss}/bootstrap/scss/_transitions.scss | 0 {public/scss => scss}/bootstrap/scss/_type.scss | 0 .../scss => scss}/bootstrap/scss/_utilities.scss | 0 .../scss => scss}/bootstrap/scss/_variables.scss | 0 .../bootstrap/scss/bootstrap-grid.scss | 0 .../bootstrap/scss/bootstrap-reboot.scss | 0 .../bootstrap/scss/bootstrap-utilities.scss | 0 {public/scss => scss}/bootstrap/scss/bootstrap.scss | 0 .../bootstrap/scss/forms/_floating-labels.scss | 0 .../bootstrap/scss/forms/_form-check.scss | 0 .../bootstrap/scss/forms/_form-control.scss | 0 .../bootstrap/scss/forms/_form-range.scss | 0 .../bootstrap/scss/forms/_form-select.scss | 0 .../bootstrap/scss/forms/_form-text.scss | 0 .../bootstrap/scss/forms/_input-group.scss | 0 .../scss => scss}/bootstrap/scss/forms/_labels.scss | 0 .../bootstrap/scss/forms/_validation.scss | 0 .../bootstrap/scss/helpers/_clearfix.scss | 0 .../bootstrap/scss/helpers/_colored-links.scss | 0 .../bootstrap/scss/helpers/_position.scss | 0 .../bootstrap/scss/helpers/_ratio.scss | 0 .../bootstrap/scss/helpers/_stretched-link.scss | 0 .../bootstrap/scss/helpers/_text-truncation.scss | 0 .../bootstrap/scss/helpers/_visually-hidden.scss | 0 .../scss => scss}/bootstrap/scss/mixins/_alert.scss | 0 .../bootstrap/scss/mixins/_border-radius.scss | 0 .../bootstrap/scss/mixins/_box-shadow.scss | 0 .../bootstrap/scss/mixins/_breakpoints.scss | 0 .../bootstrap/scss/mixins/_buttons.scss | 0 .../scss => scss}/bootstrap/scss/mixins/_caret.scss | 0 .../bootstrap/scss/mixins/_clearfix.scss | 0 .../bootstrap/scss/mixins/_color-scheme.scss | 0 .../bootstrap/scss/mixins/_container.scss | 0 .../bootstrap/scss/mixins/_deprecate.scss | 0 .../scss => scss}/bootstrap/scss/mixins/_forms.scss | 0 .../bootstrap/scss/mixins/_gradients.scss | 0 .../scss => scss}/bootstrap/scss/mixins/_grid.scss | 0 .../scss => scss}/bootstrap/scss/mixins/_image.scss | 0 .../bootstrap/scss/mixins/_list-group.scss | 0 .../scss => scss}/bootstrap/scss/mixins/_lists.scss | 0 .../bootstrap/scss/mixins/_pagination.scss | 0 .../bootstrap/scss/mixins/_reset-text.scss | 0 .../bootstrap/scss/mixins/_resize.scss | 0 .../bootstrap/scss/mixins/_table-variants.scss | 0 .../bootstrap/scss/mixins/_text-truncate.scss | 0 .../bootstrap/scss/mixins/_transition.scss | 0 .../bootstrap/scss/mixins/_utilities.scss | 0 .../bootstrap/scss/mixins/_visually-hidden.scss | 0 .../bootstrap/scss/utilities/_api.scss | 0 .../scss => scss}/bootstrap/scss/vendor/_rfs.scss | 0 public/service-details.html => service-details.html | 0 public/team.html => team.html | 0 406 files changed, 0 insertions(+), 0 deletions(-) rename public/about.html => about.html (100%) rename {public/assets => assets}/css/default.css (100%) rename {public/assets => assets}/css/responsive.css (100%) rename {public/assets => assets}/css/style.css (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.css (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.eot (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.html (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.scss (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.svg (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.ttf (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.woff (100%) rename {public/assets => assets}/fonts/flaticon/flaticon.woff2 (100%) rename {public/assets => assets}/fonts/fontawesome/css/all.min.css (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-brands-400.eot (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-brands-400.ttf (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-brands-400.woff (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-brands-400.woff2 (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-light-300.eot (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-light-300.ttf (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-light-300.woff (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-light-300.woff2 (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-regular-400.eot (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-regular-400.ttf (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-regular-400.woff (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-regular-400.woff2 (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-solid-900.eot (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-solid-900.ttf (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-solid-900.woff (100%) rename {public/assets => assets}/fonts/fontawesome/webfonts/fa-solid-900.woff2 (100%) rename {public/assets => assets}/images/about/2 persons.png (100%) rename {public/assets => assets}/images/about/3 persons.png (100%) rename {public/assets => assets}/images/about/about-1.jpg (100%) rename {public/assets => assets}/images/about/about-2.png (100%) rename {public/assets => assets}/images/about/about-3.jpg (100%) rename {public/assets => assets}/images/about/about-4.png (100%) rename {public/assets => assets}/images/about/growth.png (100%) rename {public/assets => assets}/images/about/hands.png (100%) rename {public/assets => assets}/images/about/illustration 4.png (100%) rename {public/assets => assets}/images/about/img-4.jpg (100%) rename {public/assets => assets}/images/about/img-5.png (100%) rename {public/assets => assets}/images/about/img-6.png (100%) rename {public/assets => assets}/images/agri.png (100%) rename {public/assets => assets}/images/bar.png (100%) rename {public/assets => assets}/images/blog/author-1.jpg (100%) rename {public/assets => assets}/images/blog/blog-bg-1.jpg (100%) rename {public/assets => assets}/images/blog/blog-single-1.jpg (100%) rename {public/assets => assets}/images/blog/blog-single-2.jpg (100%) rename {public/assets => assets}/images/blog/comment-1.jpg (100%) rename {public/assets => assets}/images/blog/comment-2.jpg (100%) rename {public/assets => assets}/images/blog/comment-3.jpg (100%) rename {public/assets => assets}/images/blog/img-1.jpg (100%) rename {public/assets => assets}/images/blog/img-2.jpg (100%) rename {public/assets => assets}/images/blog/img-3.jpg (100%) rename {public/assets => assets}/images/blog/standard-1.jpg (100%) rename {public/assets => assets}/images/blog/standard-2.jpg (100%) rename {public/assets => assets}/images/blog/standard-3.jpg (100%) rename {public/assets => assets}/images/blog/standard-4.jpg (100%) rename {public/assets => assets}/images/border-1.png (100%) rename {public/assets => assets}/images/border-2.png (100%) rename {public/assets => assets}/images/breadcrumb/3 personssss.png (100%) rename {public/assets => assets}/images/breadcrumb/img-1.jpg (100%) rename {public/assets => assets}/images/breadcrumb/img-2.jpg (100%) rename {public/assets => assets}/images/breadcrumb/img-3.jpg (100%) rename {public/assets => assets}/images/breadcrumb/laptopppp.png (100%) rename {public/assets => assets}/images/contact/conatct man.png (100%) rename {public/assets => assets}/images/contact/contact-1.jpg (100%) rename {public/assets => assets}/images/cta/3......png (100%) rename {public/assets => assets}/images/cta/img-1.jpg (100%) rename {public/assets => assets}/images/cta/img-2.png (100%) rename {public/assets => assets}/images/dot.png (100%) rename {public/assets => assets}/images/favicon.ico (100%) rename {public/assets => assets}/images/footer/footer-page-bg-1.png (100%) rename {public/assets => assets}/images/footer/footer-page-bg-2.png (100%) rename {public/assets => assets}/images/hero/dot-pattern.png (100%) rename {public/assets => assets}/images/hero/hereeeeeeeeeeeeeeeeeeeee.png (100%) rename {public/assets => assets}/images/hero/hero-.jpeg (100%) rename {public/assets => assets}/images/hero/hero-one-img-1.jpg (100%) rename {public/assets => assets}/images/hero/hero-one-img-2.jpg (100%) rename {public/assets => assets}/images/hero/hero-one-img.jpg (100%) rename {public/assets => assets}/images/hero/hero-pattern.png (100%) rename {public/assets => assets}/images/hero/hero-three-img-1-1.png (100%) rename {public/assets => assets}/images/hero/hero-two-img-1.png (100%) rename {public/assets => assets}/images/hero/hero-two-shape-1.png (100%) rename {public/assets => assets}/images/hero/hero-two-shape-2.png (100%) rename {public/assets => assets}/images/hero/hero-two-shape-3.png (100%) rename {public/assets => assets}/images/hero/shape-1.png (100%) rename {public/assets => assets}/images/hero/shape-2.png (100%) rename {public/assets => assets}/images/icon/icon-1.png (100%) rename {public/assets => assets}/images/icon/icon-10.png (100%) rename {public/assets => assets}/images/icon/icon-11.png (100%) rename {public/assets => assets}/images/icon/icon-12.png (100%) rename {public/assets => assets}/images/icon/icon-13.png (100%) rename {public/assets => assets}/images/icon/icon-14.png (100%) rename {public/assets => assets}/images/icon/icon-15.png (100%) rename {public/assets => assets}/images/icon/icon-16.png (100%) rename {public/assets => assets}/images/icon/icon-17.png (100%) rename {public/assets => assets}/images/icon/icon-18.png (100%) rename {public/assets => assets}/images/icon/icon-19.png (100%) rename {public/assets => assets}/images/icon/icon-2.png (100%) rename {public/assets => assets}/images/icon/icon-20.png (100%) rename {public/assets => assets}/images/icon/icon-21.png (100%) rename {public/assets => assets}/images/icon/icon-22.png (100%) rename {public/assets => assets}/images/icon/icon-3.png (100%) rename {public/assets => assets}/images/icon/icon-4.png (100%) rename {public/assets => assets}/images/icon/icon-5.png (100%) rename {public/assets => assets}/images/icon/icon-6.png (100%) rename {public/assets => assets}/images/icon/icon-7.png (100%) rename {public/assets => assets}/images/icon/icon-8.png (100%) rename {public/assets => assets}/images/icon/icon-9.png (100%) rename {public/assets => assets}/images/line.png (100%) rename {public/assets => assets}/images/logo/Heading-removebg-preview.png (100%) rename {public/assets => assets}/images/logo/Untitled_design-removebg-preview.png (100%) rename {public/assets => assets}/images/logo/footer-logo-1.png (100%) rename {public/assets => assets}/images/logo/footer-logo-2.png (100%) rename {public/assets => assets}/images/logo/logo-1.png (100%) rename {public/assets => assets}/images/map.png (100%) rename {public/assets => assets}/images/partners/img-1.png (100%) rename {public/assets => assets}/images/partners/img-10.png (100%) rename {public/assets => assets}/images/partners/img-11.png (100%) rename {public/assets => assets}/images/partners/img-12.png (100%) rename {public/assets => assets}/images/partners/img-13.png (100%) rename {public/assets => assets}/images/partners/img-14.png (100%) rename {public/assets => assets}/images/partners/img-15.png (100%) rename {public/assets => assets}/images/partners/img-16.png (100%) rename {public/assets => assets}/images/partners/img-2.png (100%) rename {public/assets => assets}/images/partners/img-3.png (100%) rename {public/assets => assets}/images/partners/img-4.png (100%) rename {public/assets => assets}/images/partners/img-5.png (100%) rename {public/assets => assets}/images/partners/img-6.png (100%) rename {public/assets => assets}/images/partners/img-7.png (100%) rename {public/assets => assets}/images/partners/img-8.png (100%) rename {public/assets => assets}/images/partners/img-9.png (100%) rename {public/assets => assets}/images/portfolio/agri.png (100%) rename {public/assets => assets}/images/portfolio/atoz.png (100%) rename {public/assets => assets}/images/portfolio/humbee.png (100%) rename {public/assets => assets}/images/portfolio/icon-1.png (100%) rename {public/assets => assets}/images/portfolio/img-1.jpg (100%) rename {public/assets => assets}/images/portfolio/img-10.jpg (100%) rename {public/assets => assets}/images/portfolio/img-11.jpg (100%) rename {public/assets => assets}/images/portfolio/img-12.jpg (100%) rename {public/assets => assets}/images/portfolio/img-13.jpg (100%) rename {public/assets => assets}/images/portfolio/img-14.jpg (100%) rename {public/assets => assets}/images/portfolio/img-15.jpg (100%) rename {public/assets => assets}/images/portfolio/img-16.jpg (100%) rename {public/assets => assets}/images/portfolio/img-17.jpg (100%) rename {public/assets => assets}/images/portfolio/img-18.jpg (100%) rename {public/assets => assets}/images/portfolio/img-19.jpg (100%) rename {public/assets => assets}/images/portfolio/img-2.jpg (100%) rename {public/assets => assets}/images/portfolio/img-20.jpg (100%) rename {public/assets => assets}/images/portfolio/img-3.jpg (100%) rename {public/assets => assets}/images/portfolio/img-4.jpg (100%) rename {public/assets => assets}/images/portfolio/img-5.jpg (100%) rename {public/assets => assets}/images/portfolio/img-6.jpg (100%) rename {public/assets => assets}/images/portfolio/img-7.jpg (100%) rename {public/assets => assets}/images/portfolio/img-8.jpg (100%) rename {public/assets => assets}/images/portfolio/img-9.jpg (100%) rename {public/assets => assets}/images/portfolio/luxiee.png (100%) rename {public/assets => assets}/images/portfolio/panind.png (100%) rename {public/assets => assets}/images/portfolio/single-img-1.jpg (100%) rename {public/assets => assets}/images/portfolio/thumb-1.jpg (100%) rename {public/assets => assets}/images/portfolio/thumb-2.jpg (100%) rename {public/assets => assets}/images/portfolio/videostar.png (100%) rename {public/assets => assets}/images/shape/bg-shape-1.png (100%) rename {public/assets => assets}/images/shape/bg-shape-2.png (100%) rename {public/assets => assets}/images/shape/circle-logo-1.png (100%) rename {public/assets => assets}/images/shape/circle-logo-2.png (100%) rename {public/assets => assets}/images/shape/line-2.png (100%) rename {public/assets => assets}/images/shape/line-3.png (100%) rename {public/assets => assets}/images/shape/line.png (100%) rename {public/assets => assets}/images/shape/pattern-shape-1.png (100%) rename {public/assets => assets}/images/shape/pattern-shape-2.png (100%) rename {public/assets => assets}/images/shape/shape-1.png (100%) rename {public/assets => assets}/images/shape/shape-10.png (100%) rename {public/assets => assets}/images/shape/shape-11.png (100%) rename {public/assets => assets}/images/shape/shape-12.png (100%) rename {public/assets => assets}/images/shape/shape-13.png (100%) rename {public/assets => assets}/images/shape/shape-14.png (100%) rename {public/assets => assets}/images/shape/shape-15.png (100%) rename {public/assets => assets}/images/shape/shape-16.png (100%) rename {public/assets => assets}/images/shape/shape-17.png (100%) rename {public/assets => assets}/images/shape/shape-18.png (100%) rename {public/assets => assets}/images/shape/shape-19.png (100%) rename {public/assets => assets}/images/shape/shape-2.png (100%) rename {public/assets => assets}/images/shape/shape-20.png (100%) rename {public/assets => assets}/images/shape/shape-3.png (100%) rename {public/assets => assets}/images/shape/shape-4.png (100%) rename {public/assets => assets}/images/shape/shape-5.png (100%) rename {public/assets => assets}/images/shape/shape-6.png (100%) rename {public/assets => assets}/images/shape/shape-7.png (100%) rename {public/assets => assets}/images/shape/shape-8.png (100%) rename {public/assets => assets}/images/shape/shape-9.png (100%) rename {public/assets => assets}/images/skill/img-1.jpg (100%) rename {public/assets => assets}/images/skill/img-2.jpg (100%) rename {public/assets => assets}/images/team/img-1.jpg (100%) rename {public/assets => assets}/images/team/img-10.jpg (100%) rename {public/assets => assets}/images/team/img-11.jpg (100%) rename {public/assets => assets}/images/team/img-2.jpg (100%) rename {public/assets => assets}/images/team/img-3.jpg (100%) rename {public/assets => assets}/images/team/img-4.jpg (100%) rename {public/assets => assets}/images/team/img-5.jpg (100%) rename {public/assets => assets}/images/team/img-6.jpg (100%) rename {public/assets => assets}/images/team/img-7.jpg (100%) rename {public/assets => assets}/images/team/img-8.jpg (100%) rename {public/assets => assets}/images/team/img-9.jpg (100%) rename {public/assets => assets}/images/team/single-img-1.jpg (100%) rename {public/assets => assets}/images/team/team-img.png (100%) rename {public/assets => assets}/images/testimonial/happy girl.png (100%) rename {public/assets => assets}/images/testimonial/img-1.jpg (100%) rename {public/assets => assets}/images/testimonial/img-2.jpg (100%) rename {public/assets => assets}/images/testimonial/img-3.jpg (100%) rename {public/assets => assets}/images/testimonial/img-4.png (100%) rename {public/assets => assets}/images/testimonial/thumb-1.jpg (100%) rename {public/assets => assets}/images/testimonial/thumb-2.jpg (100%) rename {public/assets => assets}/images/testimonial/working mann.png (100%) rename {public/assets => assets}/images/video/img-1.jpg (100%) rename {public/assets => assets}/images/widget/contact-1.jpg (100%) rename {public/assets => assets}/images/widget/contact-2.png (100%) rename {public/assets => assets}/images/widget/news-1.jpg (100%) rename {public/assets => assets}/images/widget/news-2.jpg (100%) rename {public/assets => assets}/images/widget/news-3.jpg (100%) rename {public/assets => assets}/js/theme.js (100%) rename {public/assets => assets}/vendor/animate.css (100%) rename {public/assets => assets}/vendor/bootstrap/css/bootstrap.min.css (100%) rename {public/assets => assets}/vendor/bootstrap/js/bootstrap.min.js (100%) rename {public/assets => assets}/vendor/imagesloaded.min.js (100%) rename {public/assets => assets}/vendor/isotope.min.js (100%) rename {public/assets => assets}/vendor/jquery-3.6.0.min.js (100%) rename {public/assets => assets}/vendor/jquery.counterup.min.js (100%) rename {public/assets => assets}/vendor/jquery.waypoints.js (100%) rename {public/assets => assets}/vendor/magnific-popup/dist/jquery.magnific-popup.min.js (100%) rename {public/assets => assets}/vendor/magnific-popup/dist/magnific-popup.css (100%) rename {public/assets => assets}/vendor/nice-select/css/nice-select.css (100%) rename {public/assets => assets}/vendor/nice-select/js/jquery.nice-select.min.js (100%) rename {public/assets => assets}/vendor/parallax.min.js (100%) rename {public/assets => assets}/vendor/popper/popper.min.js (100%) rename {public/assets => assets}/vendor/slick/slick.css (100%) rename {public/assets => assets}/vendor/slick/slick.min.js (100%) rename {public/assets => assets}/vendor/wow.min.js (100%) rename public/blog-details.html => blog-details.html (100%) rename public/blogs.html => blogs.html (100%) rename public/contact.html => contact.html (100%) rename {public/css => css}/bootstrap.min.css (100%) rename {public/css => css}/style.css (100%) rename {public/img => img}/Agri Fiance.png (100%) rename {public/img => img}/AtoZ (2).png (100%) rename {public/img => img}/Atoz.png (100%) rename {public/img => img}/Atoz1.png (100%) rename {public/img => img}/PAN.png (100%) rename {public/img => img}/Videostar.png (100%) rename {public/img => img}/WEBBB (1) (1).png (100%) rename {public/img => img}/about-us illustration.jpeg (100%) rename {public/img => img}/about.png (100%) rename {public/img => img}/bg-bottom.png (100%) rename {public/img => img}/bg-top.png (100%) rename {public/img => img}/blob-bottom-left.png (100%) rename {public/img => img}/blob-bottom-right.png (100%) rename {public/img => img}/blob-center.png (100%) rename {public/img => img}/blob-primary.png (100%) rename {public/img => img}/blob-secondary.png (100%) rename {public/img => img}/blob-top-left.png (100%) rename {public/img => img}/blob-top-right.png (100%) rename {public/img => img}/blob-white.png (100%) rename {public/img => img}/card1.png (100%) rename {public/img => img}/hero.png (100%) rename {public/img => img}/logo-for.jpeg (100%) rename {public/img => img}/logoNS.png (100%) rename {public/img => img}/map.png (100%) rename {public/img => img}/portfolio-1.jpg (100%) rename {public/img => img}/portfolio-2.jpg (100%) rename {public/img => img}/portfolio-3.jpg (100%) rename {public/img => img}/portfolio-4.jpg (100%) rename {public/img => img}/portfolio-5.jpg (100%) rename {public/img => img}/portfolio-6.jpg (100%) rename {public/img => img}/sand.png (100%) rename {public/img => img}/service-1.png (100%) rename {public/img => img}/service-2.png (100%) rename {public/img => img}/service-3.png (100%) rename {public/img => img}/service-4.png (100%) rename {public/img => img}/team-1.jpg (100%) rename {public/img => img}/team-2.jpg (100%) rename {public/img => img}/team-3.jpg (100%) rename {public/img => img}/testimonial-1.jpg (100%) rename {public/img => img}/testimonial-2.jpg (100%) rename {public/img => img}/testimonial-3.jpg (100%) rename {public/img => img}/testimonial-4.jpg (100%) rename {public/img => img}/user.png (100%) rename {public/img => img}/webGenixIcon-removebg-preview.ico (100%) rename {public/img => img}/webGenixLogo-removebg-preview.ico (100%) rename public/index.html => index.html (100%) rename {public/js => js}/main.js (100%) rename {public/lib => lib}/animate/animate.css (100%) rename {public/lib => lib}/animate/animate.min.css (100%) rename {public/lib => lib}/counterup/counterup.min.js (100%) rename {public/lib => lib}/easing/easing.js (100%) rename {public/lib => lib}/easing/easing.min.js (100%) rename {public/lib => lib}/isotope/isotope.pkgd.js (100%) rename {public/lib => lib}/isotope/isotope.pkgd.min.js (100%) rename {public/lib => lib}/lightbox/css/lightbox.css (100%) rename {public/lib => lib}/lightbox/css/lightbox.min.css (100%) rename {public/lib => lib}/lightbox/images/close.png (100%) rename {public/lib => lib}/lightbox/images/loading.gif (100%) rename {public/lib => lib}/lightbox/images/next.png (100%) rename {public/lib => lib}/lightbox/images/prev.png (100%) rename {public/lib => lib}/lightbox/js/lightbox.js (100%) rename {public/lib => lib}/lightbox/js/lightbox.min.js (100%) rename {public/lib => lib}/lightbox/links.php (100%) rename {public/lib => lib}/owlcarousel/LICENSE (100%) rename {public/lib => lib}/owlcarousel/assets/ajax-loader.gif (100%) rename {public/lib => lib}/owlcarousel/assets/owl.carousel.css (100%) rename {public/lib => lib}/owlcarousel/assets/owl.carousel.min.css (100%) rename {public/lib => lib}/owlcarousel/assets/owl.theme.default.css (100%) rename {public/lib => lib}/owlcarousel/assets/owl.theme.default.min.css (100%) rename {public/lib => lib}/owlcarousel/assets/owl.theme.green.css (100%) rename {public/lib => lib}/owlcarousel/assets/owl.theme.green.min.css (100%) rename {public/lib => lib}/owlcarousel/assets/owl.video.play.png (100%) rename {public/lib => lib}/owlcarousel/owl.carousel.js (100%) rename {public/lib => lib}/owlcarousel/owl.carousel.min.js (100%) rename {public/lib => lib}/waypoints/links.php (100%) rename {public/lib => lib}/waypoints/waypoints.min.js (100%) rename {public/lib => lib}/wow/wow.js (100%) rename {public/lib => lib}/wow/wow.min.js (100%) rename public/projects.html => projects.html (100%) rename {public/scss => scss}/bootstrap.scss (100%) rename {public/scss => scss}/bootstrap/scss/_accordion.scss (100%) rename {public/scss => scss}/bootstrap/scss/_alert.scss (100%) rename {public/scss => scss}/bootstrap/scss/_badge.scss (100%) rename {public/scss => scss}/bootstrap/scss/_breadcrumb.scss (100%) rename {public/scss => scss}/bootstrap/scss/_button-group.scss (100%) rename {public/scss => scss}/bootstrap/scss/_buttons.scss (100%) rename {public/scss => scss}/bootstrap/scss/_card.scss (100%) rename {public/scss => scss}/bootstrap/scss/_carousel.scss (100%) rename {public/scss => scss}/bootstrap/scss/_close.scss (100%) rename {public/scss => scss}/bootstrap/scss/_containers.scss (100%) rename {public/scss => scss}/bootstrap/scss/_dropdown.scss (100%) rename {public/scss => scss}/bootstrap/scss/_forms.scss (100%) rename {public/scss => scss}/bootstrap/scss/_functions.scss (100%) rename {public/scss => scss}/bootstrap/scss/_grid.scss (100%) rename {public/scss => scss}/bootstrap/scss/_helpers.scss (100%) rename {public/scss => scss}/bootstrap/scss/_images.scss (100%) rename {public/scss => scss}/bootstrap/scss/_list-group.scss (100%) rename {public/scss => scss}/bootstrap/scss/_mixins.scss (100%) rename {public/scss => scss}/bootstrap/scss/_modal.scss (100%) rename {public/scss => scss}/bootstrap/scss/_nav.scss (100%) rename {public/scss => scss}/bootstrap/scss/_navbar.scss (100%) rename {public/scss => scss}/bootstrap/scss/_offcanvas.scss (100%) rename {public/scss => scss}/bootstrap/scss/_pagination.scss (100%) rename {public/scss => scss}/bootstrap/scss/_popover.scss (100%) rename {public/scss => scss}/bootstrap/scss/_progress.scss (100%) rename {public/scss => scss}/bootstrap/scss/_reboot.scss (100%) rename {public/scss => scss}/bootstrap/scss/_root.scss (100%) rename {public/scss => scss}/bootstrap/scss/_spinners.scss (100%) rename {public/scss => scss}/bootstrap/scss/_tables.scss (100%) rename {public/scss => scss}/bootstrap/scss/_toasts.scss (100%) rename {public/scss => scss}/bootstrap/scss/_tooltip.scss (100%) rename {public/scss => scss}/bootstrap/scss/_transitions.scss (100%) rename {public/scss => scss}/bootstrap/scss/_type.scss (100%) rename {public/scss => scss}/bootstrap/scss/_utilities.scss (100%) rename {public/scss => scss}/bootstrap/scss/_variables.scss (100%) rename {public/scss => scss}/bootstrap/scss/bootstrap-grid.scss (100%) rename {public/scss => scss}/bootstrap/scss/bootstrap-reboot.scss (100%) rename {public/scss => scss}/bootstrap/scss/bootstrap-utilities.scss (100%) rename {public/scss => scss}/bootstrap/scss/bootstrap.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_floating-labels.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_form-check.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_form-control.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_form-range.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_form-select.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_form-text.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_input-group.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_labels.scss (100%) rename {public/scss => scss}/bootstrap/scss/forms/_validation.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_clearfix.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_colored-links.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_position.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_ratio.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_stretched-link.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_text-truncation.scss (100%) rename {public/scss => scss}/bootstrap/scss/helpers/_visually-hidden.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_alert.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_border-radius.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_box-shadow.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_breakpoints.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_buttons.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_caret.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_clearfix.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_color-scheme.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_container.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_deprecate.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_forms.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_gradients.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_grid.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_image.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_list-group.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_lists.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_pagination.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_reset-text.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_resize.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_table-variants.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_text-truncate.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_transition.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_utilities.scss (100%) rename {public/scss => scss}/bootstrap/scss/mixins/_visually-hidden.scss (100%) rename {public/scss => scss}/bootstrap/scss/utilities/_api.scss (100%) rename {public/scss => scss}/bootstrap/scss/vendor/_rfs.scss (100%) rename public/service-details.html => service-details.html (100%) rename public/team.html => team.html (100%) diff --git a/public/about.html b/about.html similarity index 100% rename from public/about.html rename to about.html diff --git a/public/assets/css/default.css b/assets/css/default.css similarity index 100% rename from public/assets/css/default.css rename to assets/css/default.css diff --git a/public/assets/css/responsive.css b/assets/css/responsive.css similarity index 100% rename from public/assets/css/responsive.css rename to assets/css/responsive.css diff --git a/public/assets/css/style.css b/assets/css/style.css similarity index 100% rename from public/assets/css/style.css rename to assets/css/style.css diff --git a/public/assets/fonts/flaticon/flaticon.css b/assets/fonts/flaticon/flaticon.css similarity index 100% rename from public/assets/fonts/flaticon/flaticon.css rename to assets/fonts/flaticon/flaticon.css diff --git a/public/assets/fonts/flaticon/flaticon.eot b/assets/fonts/flaticon/flaticon.eot similarity index 100% rename from public/assets/fonts/flaticon/flaticon.eot rename to assets/fonts/flaticon/flaticon.eot diff --git a/public/assets/fonts/flaticon/flaticon.html b/assets/fonts/flaticon/flaticon.html similarity index 100% rename from public/assets/fonts/flaticon/flaticon.html rename to assets/fonts/flaticon/flaticon.html diff --git a/public/assets/fonts/flaticon/flaticon.scss b/assets/fonts/flaticon/flaticon.scss similarity index 100% rename from public/assets/fonts/flaticon/flaticon.scss rename to assets/fonts/flaticon/flaticon.scss diff --git a/public/assets/fonts/flaticon/flaticon.svg b/assets/fonts/flaticon/flaticon.svg similarity index 100% rename from public/assets/fonts/flaticon/flaticon.svg rename to assets/fonts/flaticon/flaticon.svg diff --git a/public/assets/fonts/flaticon/flaticon.ttf b/assets/fonts/flaticon/flaticon.ttf similarity index 100% rename from public/assets/fonts/flaticon/flaticon.ttf rename to assets/fonts/flaticon/flaticon.ttf diff --git a/public/assets/fonts/flaticon/flaticon.woff b/assets/fonts/flaticon/flaticon.woff similarity index 100% rename from public/assets/fonts/flaticon/flaticon.woff rename to assets/fonts/flaticon/flaticon.woff diff --git a/public/assets/fonts/flaticon/flaticon.woff2 b/assets/fonts/flaticon/flaticon.woff2 similarity index 100% rename from public/assets/fonts/flaticon/flaticon.woff2 rename to assets/fonts/flaticon/flaticon.woff2 diff --git a/public/assets/fonts/fontawesome/css/all.min.css b/assets/fonts/fontawesome/css/all.min.css similarity index 100% rename from public/assets/fonts/fontawesome/css/all.min.css rename to assets/fonts/fontawesome/css/all.min.css diff --git a/public/assets/fonts/fontawesome/webfonts/fa-brands-400.eot b/assets/fonts/fontawesome/webfonts/fa-brands-400.eot similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-brands-400.eot rename to assets/fonts/fontawesome/webfonts/fa-brands-400.eot diff --git a/public/assets/fonts/fontawesome/webfonts/fa-brands-400.ttf b/assets/fonts/fontawesome/webfonts/fa-brands-400.ttf similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-brands-400.ttf rename to assets/fonts/fontawesome/webfonts/fa-brands-400.ttf diff --git a/public/assets/fonts/fontawesome/webfonts/fa-brands-400.woff b/assets/fonts/fontawesome/webfonts/fa-brands-400.woff similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-brands-400.woff rename to assets/fonts/fontawesome/webfonts/fa-brands-400.woff diff --git a/public/assets/fonts/fontawesome/webfonts/fa-brands-400.woff2 b/assets/fonts/fontawesome/webfonts/fa-brands-400.woff2 similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-brands-400.woff2 rename to assets/fonts/fontawesome/webfonts/fa-brands-400.woff2 diff --git a/public/assets/fonts/fontawesome/webfonts/fa-light-300.eot b/assets/fonts/fontawesome/webfonts/fa-light-300.eot similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-light-300.eot rename to assets/fonts/fontawesome/webfonts/fa-light-300.eot diff --git a/public/assets/fonts/fontawesome/webfonts/fa-light-300.ttf b/assets/fonts/fontawesome/webfonts/fa-light-300.ttf similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-light-300.ttf rename to assets/fonts/fontawesome/webfonts/fa-light-300.ttf diff --git a/public/assets/fonts/fontawesome/webfonts/fa-light-300.woff b/assets/fonts/fontawesome/webfonts/fa-light-300.woff similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-light-300.woff rename to assets/fonts/fontawesome/webfonts/fa-light-300.woff diff --git a/public/assets/fonts/fontawesome/webfonts/fa-light-300.woff2 b/assets/fonts/fontawesome/webfonts/fa-light-300.woff2 similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-light-300.woff2 rename to assets/fonts/fontawesome/webfonts/fa-light-300.woff2 diff --git a/public/assets/fonts/fontawesome/webfonts/fa-regular-400.eot b/assets/fonts/fontawesome/webfonts/fa-regular-400.eot similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-regular-400.eot rename to assets/fonts/fontawesome/webfonts/fa-regular-400.eot diff --git a/public/assets/fonts/fontawesome/webfonts/fa-regular-400.ttf b/assets/fonts/fontawesome/webfonts/fa-regular-400.ttf similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-regular-400.ttf rename to assets/fonts/fontawesome/webfonts/fa-regular-400.ttf diff --git a/public/assets/fonts/fontawesome/webfonts/fa-regular-400.woff b/assets/fonts/fontawesome/webfonts/fa-regular-400.woff similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-regular-400.woff rename to assets/fonts/fontawesome/webfonts/fa-regular-400.woff diff --git a/public/assets/fonts/fontawesome/webfonts/fa-regular-400.woff2 b/assets/fonts/fontawesome/webfonts/fa-regular-400.woff2 similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-regular-400.woff2 rename to assets/fonts/fontawesome/webfonts/fa-regular-400.woff2 diff --git a/public/assets/fonts/fontawesome/webfonts/fa-solid-900.eot b/assets/fonts/fontawesome/webfonts/fa-solid-900.eot similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-solid-900.eot rename to assets/fonts/fontawesome/webfonts/fa-solid-900.eot diff --git a/public/assets/fonts/fontawesome/webfonts/fa-solid-900.ttf b/assets/fonts/fontawesome/webfonts/fa-solid-900.ttf similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-solid-900.ttf rename to assets/fonts/fontawesome/webfonts/fa-solid-900.ttf diff --git a/public/assets/fonts/fontawesome/webfonts/fa-solid-900.woff b/assets/fonts/fontawesome/webfonts/fa-solid-900.woff similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-solid-900.woff rename to assets/fonts/fontawesome/webfonts/fa-solid-900.woff diff --git a/public/assets/fonts/fontawesome/webfonts/fa-solid-900.woff2 b/assets/fonts/fontawesome/webfonts/fa-solid-900.woff2 similarity index 100% rename from public/assets/fonts/fontawesome/webfonts/fa-solid-900.woff2 rename to assets/fonts/fontawesome/webfonts/fa-solid-900.woff2 diff --git a/public/assets/images/about/2 persons.png b/assets/images/about/2 persons.png similarity index 100% rename from public/assets/images/about/2 persons.png rename to assets/images/about/2 persons.png diff --git a/public/assets/images/about/3 persons.png b/assets/images/about/3 persons.png similarity index 100% rename from public/assets/images/about/3 persons.png rename to assets/images/about/3 persons.png diff --git a/public/assets/images/about/about-1.jpg b/assets/images/about/about-1.jpg similarity index 100% rename from public/assets/images/about/about-1.jpg rename to assets/images/about/about-1.jpg diff --git a/public/assets/images/about/about-2.png b/assets/images/about/about-2.png similarity index 100% rename from public/assets/images/about/about-2.png rename to assets/images/about/about-2.png diff --git a/public/assets/images/about/about-3.jpg b/assets/images/about/about-3.jpg similarity index 100% rename from public/assets/images/about/about-3.jpg rename to assets/images/about/about-3.jpg diff --git a/public/assets/images/about/about-4.png b/assets/images/about/about-4.png similarity index 100% rename from public/assets/images/about/about-4.png rename to assets/images/about/about-4.png diff --git a/public/assets/images/about/growth.png b/assets/images/about/growth.png similarity index 100% rename from public/assets/images/about/growth.png rename to assets/images/about/growth.png diff --git a/public/assets/images/about/hands.png b/assets/images/about/hands.png similarity index 100% rename from public/assets/images/about/hands.png rename to assets/images/about/hands.png diff --git a/public/assets/images/about/illustration 4.png b/assets/images/about/illustration 4.png similarity index 100% rename from public/assets/images/about/illustration 4.png rename to assets/images/about/illustration 4.png diff --git a/public/assets/images/about/img-4.jpg b/assets/images/about/img-4.jpg similarity index 100% rename from public/assets/images/about/img-4.jpg rename to assets/images/about/img-4.jpg diff --git a/public/assets/images/about/img-5.png b/assets/images/about/img-5.png similarity index 100% rename from public/assets/images/about/img-5.png rename to assets/images/about/img-5.png diff --git a/public/assets/images/about/img-6.png b/assets/images/about/img-6.png similarity index 100% rename from public/assets/images/about/img-6.png rename to assets/images/about/img-6.png diff --git a/public/assets/images/agri.png b/assets/images/agri.png similarity index 100% rename from public/assets/images/agri.png rename to assets/images/agri.png diff --git a/public/assets/images/bar.png b/assets/images/bar.png similarity index 100% rename from public/assets/images/bar.png rename to assets/images/bar.png diff --git a/public/assets/images/blog/author-1.jpg b/assets/images/blog/author-1.jpg similarity index 100% rename from public/assets/images/blog/author-1.jpg rename to assets/images/blog/author-1.jpg diff --git a/public/assets/images/blog/blog-bg-1.jpg b/assets/images/blog/blog-bg-1.jpg similarity index 100% rename from public/assets/images/blog/blog-bg-1.jpg rename to assets/images/blog/blog-bg-1.jpg diff --git a/public/assets/images/blog/blog-single-1.jpg b/assets/images/blog/blog-single-1.jpg similarity index 100% rename from public/assets/images/blog/blog-single-1.jpg rename to assets/images/blog/blog-single-1.jpg diff --git a/public/assets/images/blog/blog-single-2.jpg b/assets/images/blog/blog-single-2.jpg similarity index 100% rename from public/assets/images/blog/blog-single-2.jpg rename to assets/images/blog/blog-single-2.jpg diff --git a/public/assets/images/blog/comment-1.jpg b/assets/images/blog/comment-1.jpg similarity index 100% rename from public/assets/images/blog/comment-1.jpg rename to assets/images/blog/comment-1.jpg diff --git a/public/assets/images/blog/comment-2.jpg b/assets/images/blog/comment-2.jpg similarity index 100% rename from public/assets/images/blog/comment-2.jpg rename to assets/images/blog/comment-2.jpg diff --git a/public/assets/images/blog/comment-3.jpg b/assets/images/blog/comment-3.jpg similarity index 100% rename from public/assets/images/blog/comment-3.jpg rename to assets/images/blog/comment-3.jpg diff --git a/public/assets/images/blog/img-1.jpg b/assets/images/blog/img-1.jpg similarity index 100% rename from public/assets/images/blog/img-1.jpg rename to assets/images/blog/img-1.jpg diff --git a/public/assets/images/blog/img-2.jpg b/assets/images/blog/img-2.jpg similarity index 100% rename from public/assets/images/blog/img-2.jpg rename to assets/images/blog/img-2.jpg diff --git a/public/assets/images/blog/img-3.jpg b/assets/images/blog/img-3.jpg similarity index 100% rename from public/assets/images/blog/img-3.jpg rename to assets/images/blog/img-3.jpg diff --git a/public/assets/images/blog/standard-1.jpg b/assets/images/blog/standard-1.jpg similarity index 100% rename from public/assets/images/blog/standard-1.jpg rename to assets/images/blog/standard-1.jpg diff --git a/public/assets/images/blog/standard-2.jpg b/assets/images/blog/standard-2.jpg similarity index 100% rename from public/assets/images/blog/standard-2.jpg rename to assets/images/blog/standard-2.jpg diff --git a/public/assets/images/blog/standard-3.jpg b/assets/images/blog/standard-3.jpg similarity index 100% rename from public/assets/images/blog/standard-3.jpg rename to assets/images/blog/standard-3.jpg diff --git a/public/assets/images/blog/standard-4.jpg b/assets/images/blog/standard-4.jpg similarity index 100% rename from public/assets/images/blog/standard-4.jpg rename to assets/images/blog/standard-4.jpg diff --git a/public/assets/images/border-1.png b/assets/images/border-1.png similarity index 100% rename from public/assets/images/border-1.png rename to assets/images/border-1.png diff --git a/public/assets/images/border-2.png b/assets/images/border-2.png similarity index 100% rename from public/assets/images/border-2.png rename to assets/images/border-2.png diff --git a/public/assets/images/breadcrumb/3 personssss.png b/assets/images/breadcrumb/3 personssss.png similarity index 100% rename from public/assets/images/breadcrumb/3 personssss.png rename to assets/images/breadcrumb/3 personssss.png diff --git a/public/assets/images/breadcrumb/img-1.jpg b/assets/images/breadcrumb/img-1.jpg similarity index 100% rename from public/assets/images/breadcrumb/img-1.jpg rename to assets/images/breadcrumb/img-1.jpg diff --git a/public/assets/images/breadcrumb/img-2.jpg b/assets/images/breadcrumb/img-2.jpg similarity index 100% rename from public/assets/images/breadcrumb/img-2.jpg rename to assets/images/breadcrumb/img-2.jpg diff --git a/public/assets/images/breadcrumb/img-3.jpg b/assets/images/breadcrumb/img-3.jpg similarity index 100% rename from public/assets/images/breadcrumb/img-3.jpg rename to assets/images/breadcrumb/img-3.jpg diff --git a/public/assets/images/breadcrumb/laptopppp.png b/assets/images/breadcrumb/laptopppp.png similarity index 100% rename from public/assets/images/breadcrumb/laptopppp.png rename to assets/images/breadcrumb/laptopppp.png diff --git a/public/assets/images/contact/conatct man.png b/assets/images/contact/conatct man.png similarity index 100% rename from public/assets/images/contact/conatct man.png rename to assets/images/contact/conatct man.png diff --git a/public/assets/images/contact/contact-1.jpg b/assets/images/contact/contact-1.jpg similarity index 100% rename from public/assets/images/contact/contact-1.jpg rename to assets/images/contact/contact-1.jpg diff --git a/public/assets/images/cta/3......png b/assets/images/cta/3......png similarity index 100% rename from public/assets/images/cta/3......png rename to assets/images/cta/3......png diff --git a/public/assets/images/cta/img-1.jpg b/assets/images/cta/img-1.jpg similarity index 100% rename from public/assets/images/cta/img-1.jpg rename to assets/images/cta/img-1.jpg diff --git a/public/assets/images/cta/img-2.png b/assets/images/cta/img-2.png similarity index 100% rename from public/assets/images/cta/img-2.png rename to assets/images/cta/img-2.png diff --git a/public/assets/images/dot.png b/assets/images/dot.png similarity index 100% rename from public/assets/images/dot.png rename to assets/images/dot.png diff --git a/public/assets/images/favicon.ico b/assets/images/favicon.ico similarity index 100% rename from public/assets/images/favicon.ico rename to assets/images/favicon.ico diff --git a/public/assets/images/footer/footer-page-bg-1.png b/assets/images/footer/footer-page-bg-1.png similarity index 100% rename from public/assets/images/footer/footer-page-bg-1.png rename to assets/images/footer/footer-page-bg-1.png diff --git a/public/assets/images/footer/footer-page-bg-2.png b/assets/images/footer/footer-page-bg-2.png similarity index 100% rename from public/assets/images/footer/footer-page-bg-2.png rename to assets/images/footer/footer-page-bg-2.png diff --git a/public/assets/images/hero/dot-pattern.png b/assets/images/hero/dot-pattern.png similarity index 100% rename from public/assets/images/hero/dot-pattern.png rename to assets/images/hero/dot-pattern.png diff --git a/public/assets/images/hero/hereeeeeeeeeeeeeeeeeeeee.png b/assets/images/hero/hereeeeeeeeeeeeeeeeeeeee.png similarity index 100% rename from public/assets/images/hero/hereeeeeeeeeeeeeeeeeeeee.png rename to assets/images/hero/hereeeeeeeeeeeeeeeeeeeee.png diff --git a/public/assets/images/hero/hero-.jpeg b/assets/images/hero/hero-.jpeg similarity index 100% rename from public/assets/images/hero/hero-.jpeg rename to assets/images/hero/hero-.jpeg diff --git a/public/assets/images/hero/hero-one-img-1.jpg b/assets/images/hero/hero-one-img-1.jpg similarity index 100% rename from public/assets/images/hero/hero-one-img-1.jpg rename to assets/images/hero/hero-one-img-1.jpg diff --git a/public/assets/images/hero/hero-one-img-2.jpg b/assets/images/hero/hero-one-img-2.jpg similarity index 100% rename from public/assets/images/hero/hero-one-img-2.jpg rename to assets/images/hero/hero-one-img-2.jpg diff --git a/public/assets/images/hero/hero-one-img.jpg b/assets/images/hero/hero-one-img.jpg similarity index 100% rename from public/assets/images/hero/hero-one-img.jpg rename to assets/images/hero/hero-one-img.jpg diff --git a/public/assets/images/hero/hero-pattern.png b/assets/images/hero/hero-pattern.png similarity index 100% rename from public/assets/images/hero/hero-pattern.png rename to assets/images/hero/hero-pattern.png diff --git a/public/assets/images/hero/hero-three-img-1-1.png b/assets/images/hero/hero-three-img-1-1.png similarity index 100% rename from public/assets/images/hero/hero-three-img-1-1.png rename to assets/images/hero/hero-three-img-1-1.png diff --git a/public/assets/images/hero/hero-two-img-1.png b/assets/images/hero/hero-two-img-1.png similarity index 100% rename from public/assets/images/hero/hero-two-img-1.png rename to assets/images/hero/hero-two-img-1.png diff --git a/public/assets/images/hero/hero-two-shape-1.png b/assets/images/hero/hero-two-shape-1.png similarity index 100% rename from public/assets/images/hero/hero-two-shape-1.png rename to assets/images/hero/hero-two-shape-1.png diff --git a/public/assets/images/hero/hero-two-shape-2.png b/assets/images/hero/hero-two-shape-2.png similarity index 100% rename from public/assets/images/hero/hero-two-shape-2.png rename to assets/images/hero/hero-two-shape-2.png diff --git a/public/assets/images/hero/hero-two-shape-3.png b/assets/images/hero/hero-two-shape-3.png similarity index 100% rename from public/assets/images/hero/hero-two-shape-3.png rename to assets/images/hero/hero-two-shape-3.png diff --git a/public/assets/images/hero/shape-1.png b/assets/images/hero/shape-1.png similarity index 100% rename from public/assets/images/hero/shape-1.png rename to assets/images/hero/shape-1.png diff --git a/public/assets/images/hero/shape-2.png b/assets/images/hero/shape-2.png similarity index 100% rename from public/assets/images/hero/shape-2.png rename to assets/images/hero/shape-2.png diff --git a/public/assets/images/icon/icon-1.png b/assets/images/icon/icon-1.png similarity index 100% rename from public/assets/images/icon/icon-1.png rename to assets/images/icon/icon-1.png diff --git a/public/assets/images/icon/icon-10.png b/assets/images/icon/icon-10.png similarity index 100% rename from public/assets/images/icon/icon-10.png rename to assets/images/icon/icon-10.png diff --git a/public/assets/images/icon/icon-11.png b/assets/images/icon/icon-11.png similarity index 100% rename from public/assets/images/icon/icon-11.png rename to assets/images/icon/icon-11.png diff --git a/public/assets/images/icon/icon-12.png b/assets/images/icon/icon-12.png similarity index 100% rename from public/assets/images/icon/icon-12.png rename to assets/images/icon/icon-12.png diff --git a/public/assets/images/icon/icon-13.png b/assets/images/icon/icon-13.png similarity index 100% rename from public/assets/images/icon/icon-13.png rename to assets/images/icon/icon-13.png diff --git a/public/assets/images/icon/icon-14.png b/assets/images/icon/icon-14.png similarity index 100% rename from public/assets/images/icon/icon-14.png rename to assets/images/icon/icon-14.png diff --git a/public/assets/images/icon/icon-15.png b/assets/images/icon/icon-15.png similarity index 100% rename from public/assets/images/icon/icon-15.png rename to assets/images/icon/icon-15.png diff --git a/public/assets/images/icon/icon-16.png b/assets/images/icon/icon-16.png similarity index 100% rename from public/assets/images/icon/icon-16.png rename to assets/images/icon/icon-16.png diff --git a/public/assets/images/icon/icon-17.png b/assets/images/icon/icon-17.png similarity index 100% rename from public/assets/images/icon/icon-17.png rename to assets/images/icon/icon-17.png diff --git a/public/assets/images/icon/icon-18.png b/assets/images/icon/icon-18.png similarity index 100% rename from public/assets/images/icon/icon-18.png rename to assets/images/icon/icon-18.png diff --git a/public/assets/images/icon/icon-19.png b/assets/images/icon/icon-19.png similarity index 100% rename from public/assets/images/icon/icon-19.png rename to assets/images/icon/icon-19.png diff --git a/public/assets/images/icon/icon-2.png b/assets/images/icon/icon-2.png similarity index 100% rename from public/assets/images/icon/icon-2.png rename to assets/images/icon/icon-2.png diff --git a/public/assets/images/icon/icon-20.png b/assets/images/icon/icon-20.png similarity index 100% rename from public/assets/images/icon/icon-20.png rename to assets/images/icon/icon-20.png diff --git a/public/assets/images/icon/icon-21.png b/assets/images/icon/icon-21.png similarity index 100% rename from public/assets/images/icon/icon-21.png rename to assets/images/icon/icon-21.png diff --git a/public/assets/images/icon/icon-22.png b/assets/images/icon/icon-22.png similarity index 100% rename from public/assets/images/icon/icon-22.png rename to assets/images/icon/icon-22.png diff --git a/public/assets/images/icon/icon-3.png b/assets/images/icon/icon-3.png similarity index 100% rename from public/assets/images/icon/icon-3.png rename to assets/images/icon/icon-3.png diff --git a/public/assets/images/icon/icon-4.png b/assets/images/icon/icon-4.png similarity index 100% rename from public/assets/images/icon/icon-4.png rename to assets/images/icon/icon-4.png diff --git a/public/assets/images/icon/icon-5.png b/assets/images/icon/icon-5.png similarity index 100% rename from public/assets/images/icon/icon-5.png rename to assets/images/icon/icon-5.png diff --git a/public/assets/images/icon/icon-6.png b/assets/images/icon/icon-6.png similarity index 100% rename from public/assets/images/icon/icon-6.png rename to assets/images/icon/icon-6.png diff --git a/public/assets/images/icon/icon-7.png b/assets/images/icon/icon-7.png similarity index 100% rename from public/assets/images/icon/icon-7.png rename to assets/images/icon/icon-7.png diff --git a/public/assets/images/icon/icon-8.png b/assets/images/icon/icon-8.png similarity index 100% rename from public/assets/images/icon/icon-8.png rename to assets/images/icon/icon-8.png diff --git a/public/assets/images/icon/icon-9.png b/assets/images/icon/icon-9.png similarity index 100% rename from public/assets/images/icon/icon-9.png rename to assets/images/icon/icon-9.png diff --git a/public/assets/images/line.png b/assets/images/line.png similarity index 100% rename from public/assets/images/line.png rename to assets/images/line.png diff --git a/public/assets/images/logo/Heading-removebg-preview.png b/assets/images/logo/Heading-removebg-preview.png similarity index 100% rename from public/assets/images/logo/Heading-removebg-preview.png rename to assets/images/logo/Heading-removebg-preview.png diff --git a/public/assets/images/logo/Untitled_design-removebg-preview.png b/assets/images/logo/Untitled_design-removebg-preview.png similarity index 100% rename from public/assets/images/logo/Untitled_design-removebg-preview.png rename to assets/images/logo/Untitled_design-removebg-preview.png diff --git a/public/assets/images/logo/footer-logo-1.png b/assets/images/logo/footer-logo-1.png similarity index 100% rename from public/assets/images/logo/footer-logo-1.png rename to assets/images/logo/footer-logo-1.png diff --git a/public/assets/images/logo/footer-logo-2.png b/assets/images/logo/footer-logo-2.png similarity index 100% rename from public/assets/images/logo/footer-logo-2.png rename to assets/images/logo/footer-logo-2.png diff --git a/public/assets/images/logo/logo-1.png b/assets/images/logo/logo-1.png similarity index 100% rename from public/assets/images/logo/logo-1.png rename to assets/images/logo/logo-1.png diff --git a/public/assets/images/map.png b/assets/images/map.png similarity index 100% rename from public/assets/images/map.png rename to assets/images/map.png diff --git a/public/assets/images/partners/img-1.png b/assets/images/partners/img-1.png similarity index 100% rename from public/assets/images/partners/img-1.png rename to assets/images/partners/img-1.png diff --git a/public/assets/images/partners/img-10.png b/assets/images/partners/img-10.png similarity index 100% rename from public/assets/images/partners/img-10.png rename to assets/images/partners/img-10.png diff --git a/public/assets/images/partners/img-11.png b/assets/images/partners/img-11.png similarity index 100% rename from public/assets/images/partners/img-11.png rename to assets/images/partners/img-11.png diff --git a/public/assets/images/partners/img-12.png b/assets/images/partners/img-12.png similarity index 100% rename from public/assets/images/partners/img-12.png rename to assets/images/partners/img-12.png diff --git a/public/assets/images/partners/img-13.png b/assets/images/partners/img-13.png similarity index 100% rename from public/assets/images/partners/img-13.png rename to assets/images/partners/img-13.png diff --git a/public/assets/images/partners/img-14.png b/assets/images/partners/img-14.png similarity index 100% rename from public/assets/images/partners/img-14.png rename to assets/images/partners/img-14.png diff --git a/public/assets/images/partners/img-15.png b/assets/images/partners/img-15.png similarity index 100% rename from public/assets/images/partners/img-15.png rename to assets/images/partners/img-15.png diff --git a/public/assets/images/partners/img-16.png b/assets/images/partners/img-16.png similarity index 100% rename from public/assets/images/partners/img-16.png rename to assets/images/partners/img-16.png diff --git a/public/assets/images/partners/img-2.png b/assets/images/partners/img-2.png similarity index 100% rename from public/assets/images/partners/img-2.png rename to assets/images/partners/img-2.png diff --git a/public/assets/images/partners/img-3.png b/assets/images/partners/img-3.png similarity index 100% rename from public/assets/images/partners/img-3.png rename to assets/images/partners/img-3.png diff --git a/public/assets/images/partners/img-4.png b/assets/images/partners/img-4.png similarity index 100% rename from public/assets/images/partners/img-4.png rename to assets/images/partners/img-4.png diff --git a/public/assets/images/partners/img-5.png b/assets/images/partners/img-5.png similarity index 100% rename from public/assets/images/partners/img-5.png rename to assets/images/partners/img-5.png diff --git a/public/assets/images/partners/img-6.png b/assets/images/partners/img-6.png similarity index 100% rename from public/assets/images/partners/img-6.png rename to assets/images/partners/img-6.png diff --git a/public/assets/images/partners/img-7.png b/assets/images/partners/img-7.png similarity index 100% rename from public/assets/images/partners/img-7.png rename to assets/images/partners/img-7.png diff --git a/public/assets/images/partners/img-8.png b/assets/images/partners/img-8.png similarity index 100% rename from public/assets/images/partners/img-8.png rename to assets/images/partners/img-8.png diff --git a/public/assets/images/partners/img-9.png b/assets/images/partners/img-9.png similarity index 100% rename from public/assets/images/partners/img-9.png rename to assets/images/partners/img-9.png diff --git a/public/assets/images/portfolio/agri.png b/assets/images/portfolio/agri.png similarity index 100% rename from public/assets/images/portfolio/agri.png rename to assets/images/portfolio/agri.png diff --git a/public/assets/images/portfolio/atoz.png b/assets/images/portfolio/atoz.png similarity index 100% rename from public/assets/images/portfolio/atoz.png rename to assets/images/portfolio/atoz.png diff --git a/public/assets/images/portfolio/humbee.png b/assets/images/portfolio/humbee.png similarity index 100% rename from public/assets/images/portfolio/humbee.png rename to assets/images/portfolio/humbee.png diff --git a/public/assets/images/portfolio/icon-1.png b/assets/images/portfolio/icon-1.png similarity index 100% rename from public/assets/images/portfolio/icon-1.png rename to assets/images/portfolio/icon-1.png diff --git a/public/assets/images/portfolio/img-1.jpg b/assets/images/portfolio/img-1.jpg similarity index 100% rename from public/assets/images/portfolio/img-1.jpg rename to assets/images/portfolio/img-1.jpg diff --git a/public/assets/images/portfolio/img-10.jpg b/assets/images/portfolio/img-10.jpg similarity index 100% rename from public/assets/images/portfolio/img-10.jpg rename to assets/images/portfolio/img-10.jpg diff --git a/public/assets/images/portfolio/img-11.jpg b/assets/images/portfolio/img-11.jpg similarity index 100% rename from public/assets/images/portfolio/img-11.jpg rename to assets/images/portfolio/img-11.jpg diff --git a/public/assets/images/portfolio/img-12.jpg b/assets/images/portfolio/img-12.jpg similarity index 100% rename from public/assets/images/portfolio/img-12.jpg rename to assets/images/portfolio/img-12.jpg diff --git a/public/assets/images/portfolio/img-13.jpg b/assets/images/portfolio/img-13.jpg similarity index 100% rename from public/assets/images/portfolio/img-13.jpg rename to assets/images/portfolio/img-13.jpg diff --git a/public/assets/images/portfolio/img-14.jpg b/assets/images/portfolio/img-14.jpg similarity index 100% rename from public/assets/images/portfolio/img-14.jpg rename to assets/images/portfolio/img-14.jpg diff --git a/public/assets/images/portfolio/img-15.jpg b/assets/images/portfolio/img-15.jpg similarity index 100% rename from public/assets/images/portfolio/img-15.jpg rename to assets/images/portfolio/img-15.jpg diff --git a/public/assets/images/portfolio/img-16.jpg b/assets/images/portfolio/img-16.jpg similarity index 100% rename from public/assets/images/portfolio/img-16.jpg rename to assets/images/portfolio/img-16.jpg diff --git a/public/assets/images/portfolio/img-17.jpg b/assets/images/portfolio/img-17.jpg similarity index 100% rename from public/assets/images/portfolio/img-17.jpg rename to assets/images/portfolio/img-17.jpg diff --git a/public/assets/images/portfolio/img-18.jpg b/assets/images/portfolio/img-18.jpg similarity index 100% rename from public/assets/images/portfolio/img-18.jpg rename to assets/images/portfolio/img-18.jpg diff --git a/public/assets/images/portfolio/img-19.jpg b/assets/images/portfolio/img-19.jpg similarity index 100% rename from public/assets/images/portfolio/img-19.jpg rename to assets/images/portfolio/img-19.jpg diff --git a/public/assets/images/portfolio/img-2.jpg b/assets/images/portfolio/img-2.jpg similarity index 100% rename from public/assets/images/portfolio/img-2.jpg rename to assets/images/portfolio/img-2.jpg diff --git a/public/assets/images/portfolio/img-20.jpg b/assets/images/portfolio/img-20.jpg similarity index 100% rename from public/assets/images/portfolio/img-20.jpg rename to assets/images/portfolio/img-20.jpg diff --git a/public/assets/images/portfolio/img-3.jpg b/assets/images/portfolio/img-3.jpg similarity index 100% rename from public/assets/images/portfolio/img-3.jpg rename to assets/images/portfolio/img-3.jpg diff --git a/public/assets/images/portfolio/img-4.jpg b/assets/images/portfolio/img-4.jpg similarity index 100% rename from public/assets/images/portfolio/img-4.jpg rename to assets/images/portfolio/img-4.jpg diff --git a/public/assets/images/portfolio/img-5.jpg b/assets/images/portfolio/img-5.jpg similarity index 100% rename from public/assets/images/portfolio/img-5.jpg rename to assets/images/portfolio/img-5.jpg diff --git a/public/assets/images/portfolio/img-6.jpg b/assets/images/portfolio/img-6.jpg similarity index 100% rename from public/assets/images/portfolio/img-6.jpg rename to assets/images/portfolio/img-6.jpg diff --git a/public/assets/images/portfolio/img-7.jpg b/assets/images/portfolio/img-7.jpg similarity index 100% rename from public/assets/images/portfolio/img-7.jpg rename to assets/images/portfolio/img-7.jpg diff --git a/public/assets/images/portfolio/img-8.jpg b/assets/images/portfolio/img-8.jpg similarity index 100% rename from public/assets/images/portfolio/img-8.jpg rename to assets/images/portfolio/img-8.jpg diff --git a/public/assets/images/portfolio/img-9.jpg b/assets/images/portfolio/img-9.jpg similarity index 100% rename from public/assets/images/portfolio/img-9.jpg rename to assets/images/portfolio/img-9.jpg diff --git a/public/assets/images/portfolio/luxiee.png b/assets/images/portfolio/luxiee.png similarity index 100% rename from public/assets/images/portfolio/luxiee.png rename to assets/images/portfolio/luxiee.png diff --git a/public/assets/images/portfolio/panind.png b/assets/images/portfolio/panind.png similarity index 100% rename from public/assets/images/portfolio/panind.png rename to assets/images/portfolio/panind.png diff --git a/public/assets/images/portfolio/single-img-1.jpg b/assets/images/portfolio/single-img-1.jpg similarity index 100% rename from public/assets/images/portfolio/single-img-1.jpg rename to assets/images/portfolio/single-img-1.jpg diff --git a/public/assets/images/portfolio/thumb-1.jpg b/assets/images/portfolio/thumb-1.jpg similarity index 100% rename from public/assets/images/portfolio/thumb-1.jpg rename to assets/images/portfolio/thumb-1.jpg diff --git a/public/assets/images/portfolio/thumb-2.jpg b/assets/images/portfolio/thumb-2.jpg similarity index 100% rename from public/assets/images/portfolio/thumb-2.jpg rename to assets/images/portfolio/thumb-2.jpg diff --git a/public/assets/images/portfolio/videostar.png b/assets/images/portfolio/videostar.png similarity index 100% rename from public/assets/images/portfolio/videostar.png rename to assets/images/portfolio/videostar.png diff --git a/public/assets/images/shape/bg-shape-1.png b/assets/images/shape/bg-shape-1.png similarity index 100% rename from public/assets/images/shape/bg-shape-1.png rename to assets/images/shape/bg-shape-1.png diff --git a/public/assets/images/shape/bg-shape-2.png b/assets/images/shape/bg-shape-2.png similarity index 100% rename from public/assets/images/shape/bg-shape-2.png rename to assets/images/shape/bg-shape-2.png diff --git a/public/assets/images/shape/circle-logo-1.png b/assets/images/shape/circle-logo-1.png similarity index 100% rename from public/assets/images/shape/circle-logo-1.png rename to assets/images/shape/circle-logo-1.png diff --git a/public/assets/images/shape/circle-logo-2.png b/assets/images/shape/circle-logo-2.png similarity index 100% rename from public/assets/images/shape/circle-logo-2.png rename to assets/images/shape/circle-logo-2.png diff --git a/public/assets/images/shape/line-2.png b/assets/images/shape/line-2.png similarity index 100% rename from public/assets/images/shape/line-2.png rename to assets/images/shape/line-2.png diff --git a/public/assets/images/shape/line-3.png b/assets/images/shape/line-3.png similarity index 100% rename from public/assets/images/shape/line-3.png rename to assets/images/shape/line-3.png diff --git a/public/assets/images/shape/line.png b/assets/images/shape/line.png similarity index 100% rename from public/assets/images/shape/line.png rename to assets/images/shape/line.png diff --git a/public/assets/images/shape/pattern-shape-1.png b/assets/images/shape/pattern-shape-1.png similarity index 100% rename from public/assets/images/shape/pattern-shape-1.png rename to assets/images/shape/pattern-shape-1.png diff --git a/public/assets/images/shape/pattern-shape-2.png b/assets/images/shape/pattern-shape-2.png similarity index 100% rename from public/assets/images/shape/pattern-shape-2.png rename to assets/images/shape/pattern-shape-2.png diff --git a/public/assets/images/shape/shape-1.png b/assets/images/shape/shape-1.png similarity index 100% rename from public/assets/images/shape/shape-1.png rename to assets/images/shape/shape-1.png diff --git a/public/assets/images/shape/shape-10.png b/assets/images/shape/shape-10.png similarity index 100% rename from public/assets/images/shape/shape-10.png rename to assets/images/shape/shape-10.png diff --git a/public/assets/images/shape/shape-11.png b/assets/images/shape/shape-11.png similarity index 100% rename from public/assets/images/shape/shape-11.png rename to assets/images/shape/shape-11.png diff --git a/public/assets/images/shape/shape-12.png b/assets/images/shape/shape-12.png similarity index 100% rename from public/assets/images/shape/shape-12.png rename to assets/images/shape/shape-12.png diff --git a/public/assets/images/shape/shape-13.png b/assets/images/shape/shape-13.png similarity index 100% rename from public/assets/images/shape/shape-13.png rename to assets/images/shape/shape-13.png diff --git a/public/assets/images/shape/shape-14.png b/assets/images/shape/shape-14.png similarity index 100% rename from public/assets/images/shape/shape-14.png rename to assets/images/shape/shape-14.png diff --git a/public/assets/images/shape/shape-15.png b/assets/images/shape/shape-15.png similarity index 100% rename from public/assets/images/shape/shape-15.png rename to assets/images/shape/shape-15.png diff --git a/public/assets/images/shape/shape-16.png b/assets/images/shape/shape-16.png similarity index 100% rename from public/assets/images/shape/shape-16.png rename to assets/images/shape/shape-16.png diff --git a/public/assets/images/shape/shape-17.png b/assets/images/shape/shape-17.png similarity index 100% rename from public/assets/images/shape/shape-17.png rename to assets/images/shape/shape-17.png diff --git a/public/assets/images/shape/shape-18.png b/assets/images/shape/shape-18.png similarity index 100% rename from public/assets/images/shape/shape-18.png rename to assets/images/shape/shape-18.png diff --git a/public/assets/images/shape/shape-19.png b/assets/images/shape/shape-19.png similarity index 100% rename from public/assets/images/shape/shape-19.png rename to assets/images/shape/shape-19.png diff --git a/public/assets/images/shape/shape-2.png b/assets/images/shape/shape-2.png similarity index 100% rename from public/assets/images/shape/shape-2.png rename to assets/images/shape/shape-2.png diff --git a/public/assets/images/shape/shape-20.png b/assets/images/shape/shape-20.png similarity index 100% rename from public/assets/images/shape/shape-20.png rename to assets/images/shape/shape-20.png diff --git a/public/assets/images/shape/shape-3.png b/assets/images/shape/shape-3.png similarity index 100% rename from public/assets/images/shape/shape-3.png rename to assets/images/shape/shape-3.png diff --git a/public/assets/images/shape/shape-4.png b/assets/images/shape/shape-4.png similarity index 100% rename from public/assets/images/shape/shape-4.png rename to assets/images/shape/shape-4.png diff --git a/public/assets/images/shape/shape-5.png b/assets/images/shape/shape-5.png similarity index 100% rename from public/assets/images/shape/shape-5.png rename to assets/images/shape/shape-5.png diff --git a/public/assets/images/shape/shape-6.png b/assets/images/shape/shape-6.png similarity index 100% rename from public/assets/images/shape/shape-6.png rename to assets/images/shape/shape-6.png diff --git a/public/assets/images/shape/shape-7.png b/assets/images/shape/shape-7.png similarity index 100% rename from public/assets/images/shape/shape-7.png rename to assets/images/shape/shape-7.png diff --git a/public/assets/images/shape/shape-8.png b/assets/images/shape/shape-8.png similarity index 100% rename from public/assets/images/shape/shape-8.png rename to assets/images/shape/shape-8.png diff --git a/public/assets/images/shape/shape-9.png b/assets/images/shape/shape-9.png similarity index 100% rename from public/assets/images/shape/shape-9.png rename to assets/images/shape/shape-9.png diff --git a/public/assets/images/skill/img-1.jpg b/assets/images/skill/img-1.jpg similarity index 100% rename from public/assets/images/skill/img-1.jpg rename to assets/images/skill/img-1.jpg diff --git a/public/assets/images/skill/img-2.jpg b/assets/images/skill/img-2.jpg similarity index 100% rename from public/assets/images/skill/img-2.jpg rename to assets/images/skill/img-2.jpg diff --git a/public/assets/images/team/img-1.jpg b/assets/images/team/img-1.jpg similarity index 100% rename from public/assets/images/team/img-1.jpg rename to assets/images/team/img-1.jpg diff --git a/public/assets/images/team/img-10.jpg b/assets/images/team/img-10.jpg similarity index 100% rename from public/assets/images/team/img-10.jpg rename to assets/images/team/img-10.jpg diff --git a/public/assets/images/team/img-11.jpg b/assets/images/team/img-11.jpg similarity index 100% rename from public/assets/images/team/img-11.jpg rename to assets/images/team/img-11.jpg diff --git a/public/assets/images/team/img-2.jpg b/assets/images/team/img-2.jpg similarity index 100% rename from public/assets/images/team/img-2.jpg rename to assets/images/team/img-2.jpg diff --git a/public/assets/images/team/img-3.jpg b/assets/images/team/img-3.jpg similarity index 100% rename from public/assets/images/team/img-3.jpg rename to assets/images/team/img-3.jpg diff --git a/public/assets/images/team/img-4.jpg b/assets/images/team/img-4.jpg similarity index 100% rename from public/assets/images/team/img-4.jpg rename to assets/images/team/img-4.jpg diff --git a/public/assets/images/team/img-5.jpg b/assets/images/team/img-5.jpg similarity index 100% rename from public/assets/images/team/img-5.jpg rename to assets/images/team/img-5.jpg diff --git a/public/assets/images/team/img-6.jpg b/assets/images/team/img-6.jpg similarity index 100% rename from public/assets/images/team/img-6.jpg rename to assets/images/team/img-6.jpg diff --git a/public/assets/images/team/img-7.jpg b/assets/images/team/img-7.jpg similarity index 100% rename from public/assets/images/team/img-7.jpg rename to assets/images/team/img-7.jpg diff --git a/public/assets/images/team/img-8.jpg b/assets/images/team/img-8.jpg similarity index 100% rename from public/assets/images/team/img-8.jpg rename to assets/images/team/img-8.jpg diff --git a/public/assets/images/team/img-9.jpg b/assets/images/team/img-9.jpg similarity index 100% rename from public/assets/images/team/img-9.jpg rename to assets/images/team/img-9.jpg diff --git a/public/assets/images/team/single-img-1.jpg b/assets/images/team/single-img-1.jpg similarity index 100% rename from public/assets/images/team/single-img-1.jpg rename to assets/images/team/single-img-1.jpg diff --git a/public/assets/images/team/team-img.png b/assets/images/team/team-img.png similarity index 100% rename from public/assets/images/team/team-img.png rename to assets/images/team/team-img.png diff --git a/public/assets/images/testimonial/happy girl.png b/assets/images/testimonial/happy girl.png similarity index 100% rename from public/assets/images/testimonial/happy girl.png rename to assets/images/testimonial/happy girl.png diff --git a/public/assets/images/testimonial/img-1.jpg b/assets/images/testimonial/img-1.jpg similarity index 100% rename from public/assets/images/testimonial/img-1.jpg rename to assets/images/testimonial/img-1.jpg diff --git a/public/assets/images/testimonial/img-2.jpg b/assets/images/testimonial/img-2.jpg similarity index 100% rename from public/assets/images/testimonial/img-2.jpg rename to assets/images/testimonial/img-2.jpg diff --git a/public/assets/images/testimonial/img-3.jpg b/assets/images/testimonial/img-3.jpg similarity index 100% rename from public/assets/images/testimonial/img-3.jpg rename to assets/images/testimonial/img-3.jpg diff --git a/public/assets/images/testimonial/img-4.png b/assets/images/testimonial/img-4.png similarity index 100% rename from public/assets/images/testimonial/img-4.png rename to assets/images/testimonial/img-4.png diff --git a/public/assets/images/testimonial/thumb-1.jpg b/assets/images/testimonial/thumb-1.jpg similarity index 100% rename from public/assets/images/testimonial/thumb-1.jpg rename to assets/images/testimonial/thumb-1.jpg diff --git a/public/assets/images/testimonial/thumb-2.jpg b/assets/images/testimonial/thumb-2.jpg similarity index 100% rename from public/assets/images/testimonial/thumb-2.jpg rename to assets/images/testimonial/thumb-2.jpg diff --git a/public/assets/images/testimonial/working mann.png b/assets/images/testimonial/working mann.png similarity index 100% rename from public/assets/images/testimonial/working mann.png rename to assets/images/testimonial/working mann.png diff --git a/public/assets/images/video/img-1.jpg b/assets/images/video/img-1.jpg similarity index 100% rename from public/assets/images/video/img-1.jpg rename to assets/images/video/img-1.jpg diff --git a/public/assets/images/widget/contact-1.jpg b/assets/images/widget/contact-1.jpg similarity index 100% rename from public/assets/images/widget/contact-1.jpg rename to assets/images/widget/contact-1.jpg diff --git a/public/assets/images/widget/contact-2.png b/assets/images/widget/contact-2.png similarity index 100% rename from public/assets/images/widget/contact-2.png rename to assets/images/widget/contact-2.png diff --git a/public/assets/images/widget/news-1.jpg b/assets/images/widget/news-1.jpg similarity index 100% rename from public/assets/images/widget/news-1.jpg rename to assets/images/widget/news-1.jpg diff --git a/public/assets/images/widget/news-2.jpg b/assets/images/widget/news-2.jpg similarity index 100% rename from public/assets/images/widget/news-2.jpg rename to assets/images/widget/news-2.jpg diff --git a/public/assets/images/widget/news-3.jpg b/assets/images/widget/news-3.jpg similarity index 100% rename from public/assets/images/widget/news-3.jpg rename to assets/images/widget/news-3.jpg diff --git a/public/assets/js/theme.js b/assets/js/theme.js similarity index 100% rename from public/assets/js/theme.js rename to assets/js/theme.js diff --git a/public/assets/vendor/animate.css b/assets/vendor/animate.css similarity index 100% rename from public/assets/vendor/animate.css rename to assets/vendor/animate.css diff --git a/public/assets/vendor/bootstrap/css/bootstrap.min.css b/assets/vendor/bootstrap/css/bootstrap.min.css similarity index 100% rename from public/assets/vendor/bootstrap/css/bootstrap.min.css rename to assets/vendor/bootstrap/css/bootstrap.min.css diff --git a/public/assets/vendor/bootstrap/js/bootstrap.min.js b/assets/vendor/bootstrap/js/bootstrap.min.js similarity index 100% rename from public/assets/vendor/bootstrap/js/bootstrap.min.js rename to assets/vendor/bootstrap/js/bootstrap.min.js diff --git a/public/assets/vendor/imagesloaded.min.js b/assets/vendor/imagesloaded.min.js similarity index 100% rename from public/assets/vendor/imagesloaded.min.js rename to assets/vendor/imagesloaded.min.js diff --git a/public/assets/vendor/isotope.min.js b/assets/vendor/isotope.min.js similarity index 100% rename from public/assets/vendor/isotope.min.js rename to assets/vendor/isotope.min.js diff --git a/public/assets/vendor/jquery-3.6.0.min.js b/assets/vendor/jquery-3.6.0.min.js similarity index 100% rename from public/assets/vendor/jquery-3.6.0.min.js rename to assets/vendor/jquery-3.6.0.min.js diff --git a/public/assets/vendor/jquery.counterup.min.js b/assets/vendor/jquery.counterup.min.js similarity index 100% rename from public/assets/vendor/jquery.counterup.min.js rename to assets/vendor/jquery.counterup.min.js diff --git a/public/assets/vendor/jquery.waypoints.js b/assets/vendor/jquery.waypoints.js similarity index 100% rename from public/assets/vendor/jquery.waypoints.js rename to assets/vendor/jquery.waypoints.js diff --git a/public/assets/vendor/magnific-popup/dist/jquery.magnific-popup.min.js b/assets/vendor/magnific-popup/dist/jquery.magnific-popup.min.js similarity index 100% rename from public/assets/vendor/magnific-popup/dist/jquery.magnific-popup.min.js rename to assets/vendor/magnific-popup/dist/jquery.magnific-popup.min.js diff --git a/public/assets/vendor/magnific-popup/dist/magnific-popup.css b/assets/vendor/magnific-popup/dist/magnific-popup.css similarity index 100% rename from public/assets/vendor/magnific-popup/dist/magnific-popup.css rename to assets/vendor/magnific-popup/dist/magnific-popup.css diff --git a/public/assets/vendor/nice-select/css/nice-select.css b/assets/vendor/nice-select/css/nice-select.css similarity index 100% rename from public/assets/vendor/nice-select/css/nice-select.css rename to assets/vendor/nice-select/css/nice-select.css diff --git a/public/assets/vendor/nice-select/js/jquery.nice-select.min.js b/assets/vendor/nice-select/js/jquery.nice-select.min.js similarity index 100% rename from public/assets/vendor/nice-select/js/jquery.nice-select.min.js rename to assets/vendor/nice-select/js/jquery.nice-select.min.js diff --git a/public/assets/vendor/parallax.min.js b/assets/vendor/parallax.min.js similarity index 100% rename from public/assets/vendor/parallax.min.js rename to assets/vendor/parallax.min.js diff --git a/public/assets/vendor/popper/popper.min.js b/assets/vendor/popper/popper.min.js similarity index 100% rename from public/assets/vendor/popper/popper.min.js rename to assets/vendor/popper/popper.min.js diff --git a/public/assets/vendor/slick/slick.css b/assets/vendor/slick/slick.css similarity index 100% rename from public/assets/vendor/slick/slick.css rename to assets/vendor/slick/slick.css diff --git a/public/assets/vendor/slick/slick.min.js b/assets/vendor/slick/slick.min.js similarity index 100% rename from public/assets/vendor/slick/slick.min.js rename to assets/vendor/slick/slick.min.js diff --git a/public/assets/vendor/wow.min.js b/assets/vendor/wow.min.js similarity index 100% rename from public/assets/vendor/wow.min.js rename to assets/vendor/wow.min.js diff --git a/public/blog-details.html b/blog-details.html similarity index 100% rename from public/blog-details.html rename to blog-details.html diff --git a/public/blogs.html b/blogs.html similarity index 100% rename from public/blogs.html rename to blogs.html diff --git a/public/contact.html b/contact.html similarity index 100% rename from public/contact.html rename to contact.html diff --git a/public/css/bootstrap.min.css b/css/bootstrap.min.css similarity index 100% rename from public/css/bootstrap.min.css rename to css/bootstrap.min.css diff --git a/public/css/style.css b/css/style.css similarity index 100% rename from public/css/style.css rename to css/style.css diff --git a/public/img/Agri Fiance.png b/img/Agri Fiance.png similarity index 100% rename from public/img/Agri Fiance.png rename to img/Agri Fiance.png diff --git a/public/img/AtoZ (2).png b/img/AtoZ (2).png similarity index 100% rename from public/img/AtoZ (2).png rename to img/AtoZ (2).png diff --git a/public/img/Atoz.png b/img/Atoz.png similarity index 100% rename from public/img/Atoz.png rename to img/Atoz.png diff --git a/public/img/Atoz1.png b/img/Atoz1.png similarity index 100% rename from public/img/Atoz1.png rename to img/Atoz1.png diff --git a/public/img/PAN.png b/img/PAN.png similarity index 100% rename from public/img/PAN.png rename to img/PAN.png diff --git a/public/img/Videostar.png b/img/Videostar.png similarity index 100% rename from public/img/Videostar.png rename to img/Videostar.png diff --git a/public/img/WEBBB (1) (1).png b/img/WEBBB (1) (1).png similarity index 100% rename from public/img/WEBBB (1) (1).png rename to img/WEBBB (1) (1).png diff --git a/public/img/about-us illustration.jpeg b/img/about-us illustration.jpeg similarity index 100% rename from public/img/about-us illustration.jpeg rename to img/about-us illustration.jpeg diff --git a/public/img/about.png b/img/about.png similarity index 100% rename from public/img/about.png rename to img/about.png diff --git a/public/img/bg-bottom.png b/img/bg-bottom.png similarity index 100% rename from public/img/bg-bottom.png rename to img/bg-bottom.png diff --git a/public/img/bg-top.png b/img/bg-top.png similarity index 100% rename from public/img/bg-top.png rename to img/bg-top.png diff --git a/public/img/blob-bottom-left.png b/img/blob-bottom-left.png similarity index 100% rename from public/img/blob-bottom-left.png rename to img/blob-bottom-left.png diff --git a/public/img/blob-bottom-right.png b/img/blob-bottom-right.png similarity index 100% rename from public/img/blob-bottom-right.png rename to img/blob-bottom-right.png diff --git a/public/img/blob-center.png b/img/blob-center.png similarity index 100% rename from public/img/blob-center.png rename to img/blob-center.png diff --git a/public/img/blob-primary.png b/img/blob-primary.png similarity index 100% rename from public/img/blob-primary.png rename to img/blob-primary.png diff --git a/public/img/blob-secondary.png b/img/blob-secondary.png similarity index 100% rename from public/img/blob-secondary.png rename to img/blob-secondary.png diff --git a/public/img/blob-top-left.png b/img/blob-top-left.png similarity index 100% rename from public/img/blob-top-left.png rename to img/blob-top-left.png diff --git a/public/img/blob-top-right.png b/img/blob-top-right.png similarity index 100% rename from public/img/blob-top-right.png rename to img/blob-top-right.png diff --git a/public/img/blob-white.png b/img/blob-white.png similarity index 100% rename from public/img/blob-white.png rename to img/blob-white.png diff --git a/public/img/card1.png b/img/card1.png similarity index 100% rename from public/img/card1.png rename to img/card1.png diff --git a/public/img/hero.png b/img/hero.png similarity index 100% rename from public/img/hero.png rename to img/hero.png diff --git a/public/img/logo-for.jpeg b/img/logo-for.jpeg similarity index 100% rename from public/img/logo-for.jpeg rename to img/logo-for.jpeg diff --git a/public/img/logoNS.png b/img/logoNS.png similarity index 100% rename from public/img/logoNS.png rename to img/logoNS.png diff --git a/public/img/map.png b/img/map.png similarity index 100% rename from public/img/map.png rename to img/map.png diff --git a/public/img/portfolio-1.jpg b/img/portfolio-1.jpg similarity index 100% rename from public/img/portfolio-1.jpg rename to img/portfolio-1.jpg diff --git a/public/img/portfolio-2.jpg b/img/portfolio-2.jpg similarity index 100% rename from public/img/portfolio-2.jpg rename to img/portfolio-2.jpg diff --git a/public/img/portfolio-3.jpg b/img/portfolio-3.jpg similarity index 100% rename from public/img/portfolio-3.jpg rename to img/portfolio-3.jpg diff --git a/public/img/portfolio-4.jpg b/img/portfolio-4.jpg similarity index 100% rename from public/img/portfolio-4.jpg rename to img/portfolio-4.jpg diff --git a/public/img/portfolio-5.jpg b/img/portfolio-5.jpg similarity index 100% rename from public/img/portfolio-5.jpg rename to img/portfolio-5.jpg diff --git a/public/img/portfolio-6.jpg b/img/portfolio-6.jpg similarity index 100% rename from public/img/portfolio-6.jpg rename to img/portfolio-6.jpg diff --git a/public/img/sand.png b/img/sand.png similarity index 100% rename from public/img/sand.png rename to img/sand.png diff --git a/public/img/service-1.png b/img/service-1.png similarity index 100% rename from public/img/service-1.png rename to img/service-1.png diff --git a/public/img/service-2.png b/img/service-2.png similarity index 100% rename from public/img/service-2.png rename to img/service-2.png diff --git a/public/img/service-3.png b/img/service-3.png similarity index 100% rename from public/img/service-3.png rename to img/service-3.png diff --git a/public/img/service-4.png b/img/service-4.png similarity index 100% rename from public/img/service-4.png rename to img/service-4.png diff --git a/public/img/team-1.jpg b/img/team-1.jpg similarity index 100% rename from public/img/team-1.jpg rename to img/team-1.jpg diff --git a/public/img/team-2.jpg b/img/team-2.jpg similarity index 100% rename from public/img/team-2.jpg rename to img/team-2.jpg diff --git a/public/img/team-3.jpg b/img/team-3.jpg similarity index 100% rename from public/img/team-3.jpg rename to img/team-3.jpg diff --git a/public/img/testimonial-1.jpg b/img/testimonial-1.jpg similarity index 100% rename from public/img/testimonial-1.jpg rename to img/testimonial-1.jpg diff --git a/public/img/testimonial-2.jpg b/img/testimonial-2.jpg similarity index 100% rename from public/img/testimonial-2.jpg rename to img/testimonial-2.jpg diff --git a/public/img/testimonial-3.jpg b/img/testimonial-3.jpg similarity index 100% rename from public/img/testimonial-3.jpg rename to img/testimonial-3.jpg diff --git a/public/img/testimonial-4.jpg b/img/testimonial-4.jpg similarity index 100% rename from public/img/testimonial-4.jpg rename to img/testimonial-4.jpg diff --git a/public/img/user.png b/img/user.png similarity index 100% rename from public/img/user.png rename to img/user.png diff --git a/public/img/webGenixIcon-removebg-preview.ico b/img/webGenixIcon-removebg-preview.ico similarity index 100% rename from public/img/webGenixIcon-removebg-preview.ico rename to img/webGenixIcon-removebg-preview.ico diff --git a/public/img/webGenixLogo-removebg-preview.ico b/img/webGenixLogo-removebg-preview.ico similarity index 100% rename from public/img/webGenixLogo-removebg-preview.ico rename to img/webGenixLogo-removebg-preview.ico diff --git a/public/index.html b/index.html similarity index 100% rename from public/index.html rename to index.html diff --git a/public/js/main.js b/js/main.js similarity index 100% rename from public/js/main.js rename to js/main.js diff --git a/public/lib/animate/animate.css b/lib/animate/animate.css similarity index 100% rename from public/lib/animate/animate.css rename to lib/animate/animate.css diff --git a/public/lib/animate/animate.min.css b/lib/animate/animate.min.css similarity index 100% rename from public/lib/animate/animate.min.css rename to lib/animate/animate.min.css diff --git a/public/lib/counterup/counterup.min.js b/lib/counterup/counterup.min.js similarity index 100% rename from public/lib/counterup/counterup.min.js rename to lib/counterup/counterup.min.js diff --git a/public/lib/easing/easing.js b/lib/easing/easing.js similarity index 100% rename from public/lib/easing/easing.js rename to lib/easing/easing.js diff --git a/public/lib/easing/easing.min.js b/lib/easing/easing.min.js similarity index 100% rename from public/lib/easing/easing.min.js rename to lib/easing/easing.min.js diff --git a/public/lib/isotope/isotope.pkgd.js b/lib/isotope/isotope.pkgd.js similarity index 100% rename from public/lib/isotope/isotope.pkgd.js rename to lib/isotope/isotope.pkgd.js diff --git a/public/lib/isotope/isotope.pkgd.min.js b/lib/isotope/isotope.pkgd.min.js similarity index 100% rename from public/lib/isotope/isotope.pkgd.min.js rename to lib/isotope/isotope.pkgd.min.js diff --git a/public/lib/lightbox/css/lightbox.css b/lib/lightbox/css/lightbox.css similarity index 100% rename from public/lib/lightbox/css/lightbox.css rename to lib/lightbox/css/lightbox.css diff --git a/public/lib/lightbox/css/lightbox.min.css b/lib/lightbox/css/lightbox.min.css similarity index 100% rename from public/lib/lightbox/css/lightbox.min.css rename to lib/lightbox/css/lightbox.min.css diff --git a/public/lib/lightbox/images/close.png b/lib/lightbox/images/close.png similarity index 100% rename from public/lib/lightbox/images/close.png rename to lib/lightbox/images/close.png diff --git a/public/lib/lightbox/images/loading.gif b/lib/lightbox/images/loading.gif similarity index 100% rename from public/lib/lightbox/images/loading.gif rename to lib/lightbox/images/loading.gif diff --git a/public/lib/lightbox/images/next.png b/lib/lightbox/images/next.png similarity index 100% rename from public/lib/lightbox/images/next.png rename to lib/lightbox/images/next.png diff --git a/public/lib/lightbox/images/prev.png b/lib/lightbox/images/prev.png similarity index 100% rename from public/lib/lightbox/images/prev.png rename to lib/lightbox/images/prev.png diff --git a/public/lib/lightbox/js/lightbox.js b/lib/lightbox/js/lightbox.js similarity index 100% rename from public/lib/lightbox/js/lightbox.js rename to lib/lightbox/js/lightbox.js diff --git a/public/lib/lightbox/js/lightbox.min.js b/lib/lightbox/js/lightbox.min.js similarity index 100% rename from public/lib/lightbox/js/lightbox.min.js rename to lib/lightbox/js/lightbox.min.js diff --git a/public/lib/lightbox/links.php b/lib/lightbox/links.php similarity index 100% rename from public/lib/lightbox/links.php rename to lib/lightbox/links.php diff --git a/public/lib/owlcarousel/LICENSE b/lib/owlcarousel/LICENSE similarity index 100% rename from public/lib/owlcarousel/LICENSE rename to lib/owlcarousel/LICENSE diff --git a/public/lib/owlcarousel/assets/ajax-loader.gif b/lib/owlcarousel/assets/ajax-loader.gif similarity index 100% rename from public/lib/owlcarousel/assets/ajax-loader.gif rename to lib/owlcarousel/assets/ajax-loader.gif diff --git a/public/lib/owlcarousel/assets/owl.carousel.css b/lib/owlcarousel/assets/owl.carousel.css similarity index 100% rename from public/lib/owlcarousel/assets/owl.carousel.css rename to lib/owlcarousel/assets/owl.carousel.css diff --git a/public/lib/owlcarousel/assets/owl.carousel.min.css b/lib/owlcarousel/assets/owl.carousel.min.css similarity index 100% rename from public/lib/owlcarousel/assets/owl.carousel.min.css rename to lib/owlcarousel/assets/owl.carousel.min.css diff --git a/public/lib/owlcarousel/assets/owl.theme.default.css b/lib/owlcarousel/assets/owl.theme.default.css similarity index 100% rename from public/lib/owlcarousel/assets/owl.theme.default.css rename to lib/owlcarousel/assets/owl.theme.default.css diff --git a/public/lib/owlcarousel/assets/owl.theme.default.min.css b/lib/owlcarousel/assets/owl.theme.default.min.css similarity index 100% rename from public/lib/owlcarousel/assets/owl.theme.default.min.css rename to lib/owlcarousel/assets/owl.theme.default.min.css diff --git a/public/lib/owlcarousel/assets/owl.theme.green.css b/lib/owlcarousel/assets/owl.theme.green.css similarity index 100% rename from public/lib/owlcarousel/assets/owl.theme.green.css rename to lib/owlcarousel/assets/owl.theme.green.css diff --git a/public/lib/owlcarousel/assets/owl.theme.green.min.css b/lib/owlcarousel/assets/owl.theme.green.min.css similarity index 100% rename from public/lib/owlcarousel/assets/owl.theme.green.min.css rename to lib/owlcarousel/assets/owl.theme.green.min.css diff --git a/public/lib/owlcarousel/assets/owl.video.play.png b/lib/owlcarousel/assets/owl.video.play.png similarity index 100% rename from public/lib/owlcarousel/assets/owl.video.play.png rename to lib/owlcarousel/assets/owl.video.play.png diff --git a/public/lib/owlcarousel/owl.carousel.js b/lib/owlcarousel/owl.carousel.js similarity index 100% rename from public/lib/owlcarousel/owl.carousel.js rename to lib/owlcarousel/owl.carousel.js diff --git a/public/lib/owlcarousel/owl.carousel.min.js b/lib/owlcarousel/owl.carousel.min.js similarity index 100% rename from public/lib/owlcarousel/owl.carousel.min.js rename to lib/owlcarousel/owl.carousel.min.js diff --git a/public/lib/waypoints/links.php b/lib/waypoints/links.php similarity index 100% rename from public/lib/waypoints/links.php rename to lib/waypoints/links.php diff --git a/public/lib/waypoints/waypoints.min.js b/lib/waypoints/waypoints.min.js similarity index 100% rename from public/lib/waypoints/waypoints.min.js rename to lib/waypoints/waypoints.min.js diff --git a/public/lib/wow/wow.js b/lib/wow/wow.js similarity index 100% rename from public/lib/wow/wow.js rename to lib/wow/wow.js diff --git a/public/lib/wow/wow.min.js b/lib/wow/wow.min.js similarity index 100% rename from public/lib/wow/wow.min.js rename to lib/wow/wow.min.js diff --git a/public/projects.html b/projects.html similarity index 100% rename from public/projects.html rename to projects.html diff --git a/public/scss/bootstrap.scss b/scss/bootstrap.scss similarity index 100% rename from public/scss/bootstrap.scss rename to scss/bootstrap.scss diff --git a/public/scss/bootstrap/scss/_accordion.scss b/scss/bootstrap/scss/_accordion.scss similarity index 100% rename from public/scss/bootstrap/scss/_accordion.scss rename to scss/bootstrap/scss/_accordion.scss diff --git a/public/scss/bootstrap/scss/_alert.scss b/scss/bootstrap/scss/_alert.scss similarity index 100% rename from public/scss/bootstrap/scss/_alert.scss rename to scss/bootstrap/scss/_alert.scss diff --git a/public/scss/bootstrap/scss/_badge.scss b/scss/bootstrap/scss/_badge.scss similarity index 100% rename from public/scss/bootstrap/scss/_badge.scss rename to scss/bootstrap/scss/_badge.scss diff --git a/public/scss/bootstrap/scss/_breadcrumb.scss b/scss/bootstrap/scss/_breadcrumb.scss similarity index 100% rename from public/scss/bootstrap/scss/_breadcrumb.scss rename to scss/bootstrap/scss/_breadcrumb.scss diff --git a/public/scss/bootstrap/scss/_button-group.scss b/scss/bootstrap/scss/_button-group.scss similarity index 100% rename from public/scss/bootstrap/scss/_button-group.scss rename to scss/bootstrap/scss/_button-group.scss diff --git a/public/scss/bootstrap/scss/_buttons.scss b/scss/bootstrap/scss/_buttons.scss similarity index 100% rename from public/scss/bootstrap/scss/_buttons.scss rename to scss/bootstrap/scss/_buttons.scss diff --git a/public/scss/bootstrap/scss/_card.scss b/scss/bootstrap/scss/_card.scss similarity index 100% rename from public/scss/bootstrap/scss/_card.scss rename to scss/bootstrap/scss/_card.scss diff --git a/public/scss/bootstrap/scss/_carousel.scss b/scss/bootstrap/scss/_carousel.scss similarity index 100% rename from public/scss/bootstrap/scss/_carousel.scss rename to scss/bootstrap/scss/_carousel.scss diff --git a/public/scss/bootstrap/scss/_close.scss b/scss/bootstrap/scss/_close.scss similarity index 100% rename from public/scss/bootstrap/scss/_close.scss rename to scss/bootstrap/scss/_close.scss diff --git a/public/scss/bootstrap/scss/_containers.scss b/scss/bootstrap/scss/_containers.scss similarity index 100% rename from public/scss/bootstrap/scss/_containers.scss rename to scss/bootstrap/scss/_containers.scss diff --git a/public/scss/bootstrap/scss/_dropdown.scss b/scss/bootstrap/scss/_dropdown.scss similarity index 100% rename from public/scss/bootstrap/scss/_dropdown.scss rename to scss/bootstrap/scss/_dropdown.scss diff --git a/public/scss/bootstrap/scss/_forms.scss b/scss/bootstrap/scss/_forms.scss similarity index 100% rename from public/scss/bootstrap/scss/_forms.scss rename to scss/bootstrap/scss/_forms.scss diff --git a/public/scss/bootstrap/scss/_functions.scss b/scss/bootstrap/scss/_functions.scss similarity index 100% rename from public/scss/bootstrap/scss/_functions.scss rename to scss/bootstrap/scss/_functions.scss diff --git a/public/scss/bootstrap/scss/_grid.scss b/scss/bootstrap/scss/_grid.scss similarity index 100% rename from public/scss/bootstrap/scss/_grid.scss rename to scss/bootstrap/scss/_grid.scss diff --git a/public/scss/bootstrap/scss/_helpers.scss b/scss/bootstrap/scss/_helpers.scss similarity index 100% rename from public/scss/bootstrap/scss/_helpers.scss rename to scss/bootstrap/scss/_helpers.scss diff --git a/public/scss/bootstrap/scss/_images.scss b/scss/bootstrap/scss/_images.scss similarity index 100% rename from public/scss/bootstrap/scss/_images.scss rename to scss/bootstrap/scss/_images.scss diff --git a/public/scss/bootstrap/scss/_list-group.scss b/scss/bootstrap/scss/_list-group.scss similarity index 100% rename from public/scss/bootstrap/scss/_list-group.scss rename to scss/bootstrap/scss/_list-group.scss diff --git a/public/scss/bootstrap/scss/_mixins.scss b/scss/bootstrap/scss/_mixins.scss similarity index 100% rename from public/scss/bootstrap/scss/_mixins.scss rename to scss/bootstrap/scss/_mixins.scss diff --git a/public/scss/bootstrap/scss/_modal.scss b/scss/bootstrap/scss/_modal.scss similarity index 100% rename from public/scss/bootstrap/scss/_modal.scss rename to scss/bootstrap/scss/_modal.scss diff --git a/public/scss/bootstrap/scss/_nav.scss b/scss/bootstrap/scss/_nav.scss similarity index 100% rename from public/scss/bootstrap/scss/_nav.scss rename to scss/bootstrap/scss/_nav.scss diff --git a/public/scss/bootstrap/scss/_navbar.scss b/scss/bootstrap/scss/_navbar.scss similarity index 100% rename from public/scss/bootstrap/scss/_navbar.scss rename to scss/bootstrap/scss/_navbar.scss diff --git a/public/scss/bootstrap/scss/_offcanvas.scss b/scss/bootstrap/scss/_offcanvas.scss similarity index 100% rename from public/scss/bootstrap/scss/_offcanvas.scss rename to scss/bootstrap/scss/_offcanvas.scss diff --git a/public/scss/bootstrap/scss/_pagination.scss b/scss/bootstrap/scss/_pagination.scss similarity index 100% rename from public/scss/bootstrap/scss/_pagination.scss rename to scss/bootstrap/scss/_pagination.scss diff --git a/public/scss/bootstrap/scss/_popover.scss b/scss/bootstrap/scss/_popover.scss similarity index 100% rename from public/scss/bootstrap/scss/_popover.scss rename to scss/bootstrap/scss/_popover.scss diff --git a/public/scss/bootstrap/scss/_progress.scss b/scss/bootstrap/scss/_progress.scss similarity index 100% rename from public/scss/bootstrap/scss/_progress.scss rename to scss/bootstrap/scss/_progress.scss diff --git a/public/scss/bootstrap/scss/_reboot.scss b/scss/bootstrap/scss/_reboot.scss similarity index 100% rename from public/scss/bootstrap/scss/_reboot.scss rename to scss/bootstrap/scss/_reboot.scss diff --git a/public/scss/bootstrap/scss/_root.scss b/scss/bootstrap/scss/_root.scss similarity index 100% rename from public/scss/bootstrap/scss/_root.scss rename to scss/bootstrap/scss/_root.scss diff --git a/public/scss/bootstrap/scss/_spinners.scss b/scss/bootstrap/scss/_spinners.scss similarity index 100% rename from public/scss/bootstrap/scss/_spinners.scss rename to scss/bootstrap/scss/_spinners.scss diff --git a/public/scss/bootstrap/scss/_tables.scss b/scss/bootstrap/scss/_tables.scss similarity index 100% rename from public/scss/bootstrap/scss/_tables.scss rename to scss/bootstrap/scss/_tables.scss diff --git a/public/scss/bootstrap/scss/_toasts.scss b/scss/bootstrap/scss/_toasts.scss similarity index 100% rename from public/scss/bootstrap/scss/_toasts.scss rename to scss/bootstrap/scss/_toasts.scss diff --git a/public/scss/bootstrap/scss/_tooltip.scss b/scss/bootstrap/scss/_tooltip.scss similarity index 100% rename from public/scss/bootstrap/scss/_tooltip.scss rename to scss/bootstrap/scss/_tooltip.scss diff --git a/public/scss/bootstrap/scss/_transitions.scss b/scss/bootstrap/scss/_transitions.scss similarity index 100% rename from public/scss/bootstrap/scss/_transitions.scss rename to scss/bootstrap/scss/_transitions.scss diff --git a/public/scss/bootstrap/scss/_type.scss b/scss/bootstrap/scss/_type.scss similarity index 100% rename from public/scss/bootstrap/scss/_type.scss rename to scss/bootstrap/scss/_type.scss diff --git a/public/scss/bootstrap/scss/_utilities.scss b/scss/bootstrap/scss/_utilities.scss similarity index 100% rename from public/scss/bootstrap/scss/_utilities.scss rename to scss/bootstrap/scss/_utilities.scss diff --git a/public/scss/bootstrap/scss/_variables.scss b/scss/bootstrap/scss/_variables.scss similarity index 100% rename from public/scss/bootstrap/scss/_variables.scss rename to scss/bootstrap/scss/_variables.scss diff --git a/public/scss/bootstrap/scss/bootstrap-grid.scss b/scss/bootstrap/scss/bootstrap-grid.scss similarity index 100% rename from public/scss/bootstrap/scss/bootstrap-grid.scss rename to scss/bootstrap/scss/bootstrap-grid.scss diff --git a/public/scss/bootstrap/scss/bootstrap-reboot.scss b/scss/bootstrap/scss/bootstrap-reboot.scss similarity index 100% rename from public/scss/bootstrap/scss/bootstrap-reboot.scss rename to scss/bootstrap/scss/bootstrap-reboot.scss diff --git a/public/scss/bootstrap/scss/bootstrap-utilities.scss b/scss/bootstrap/scss/bootstrap-utilities.scss similarity index 100% rename from public/scss/bootstrap/scss/bootstrap-utilities.scss rename to scss/bootstrap/scss/bootstrap-utilities.scss diff --git a/public/scss/bootstrap/scss/bootstrap.scss b/scss/bootstrap/scss/bootstrap.scss similarity index 100% rename from public/scss/bootstrap/scss/bootstrap.scss rename to scss/bootstrap/scss/bootstrap.scss diff --git a/public/scss/bootstrap/scss/forms/_floating-labels.scss b/scss/bootstrap/scss/forms/_floating-labels.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_floating-labels.scss rename to scss/bootstrap/scss/forms/_floating-labels.scss diff --git a/public/scss/bootstrap/scss/forms/_form-check.scss b/scss/bootstrap/scss/forms/_form-check.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_form-check.scss rename to scss/bootstrap/scss/forms/_form-check.scss diff --git a/public/scss/bootstrap/scss/forms/_form-control.scss b/scss/bootstrap/scss/forms/_form-control.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_form-control.scss rename to scss/bootstrap/scss/forms/_form-control.scss diff --git a/public/scss/bootstrap/scss/forms/_form-range.scss b/scss/bootstrap/scss/forms/_form-range.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_form-range.scss rename to scss/bootstrap/scss/forms/_form-range.scss diff --git a/public/scss/bootstrap/scss/forms/_form-select.scss b/scss/bootstrap/scss/forms/_form-select.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_form-select.scss rename to scss/bootstrap/scss/forms/_form-select.scss diff --git a/public/scss/bootstrap/scss/forms/_form-text.scss b/scss/bootstrap/scss/forms/_form-text.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_form-text.scss rename to scss/bootstrap/scss/forms/_form-text.scss diff --git a/public/scss/bootstrap/scss/forms/_input-group.scss b/scss/bootstrap/scss/forms/_input-group.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_input-group.scss rename to scss/bootstrap/scss/forms/_input-group.scss diff --git a/public/scss/bootstrap/scss/forms/_labels.scss b/scss/bootstrap/scss/forms/_labels.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_labels.scss rename to scss/bootstrap/scss/forms/_labels.scss diff --git a/public/scss/bootstrap/scss/forms/_validation.scss b/scss/bootstrap/scss/forms/_validation.scss similarity index 100% rename from public/scss/bootstrap/scss/forms/_validation.scss rename to scss/bootstrap/scss/forms/_validation.scss diff --git a/public/scss/bootstrap/scss/helpers/_clearfix.scss b/scss/bootstrap/scss/helpers/_clearfix.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_clearfix.scss rename to scss/bootstrap/scss/helpers/_clearfix.scss diff --git a/public/scss/bootstrap/scss/helpers/_colored-links.scss b/scss/bootstrap/scss/helpers/_colored-links.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_colored-links.scss rename to scss/bootstrap/scss/helpers/_colored-links.scss diff --git a/public/scss/bootstrap/scss/helpers/_position.scss b/scss/bootstrap/scss/helpers/_position.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_position.scss rename to scss/bootstrap/scss/helpers/_position.scss diff --git a/public/scss/bootstrap/scss/helpers/_ratio.scss b/scss/bootstrap/scss/helpers/_ratio.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_ratio.scss rename to scss/bootstrap/scss/helpers/_ratio.scss diff --git a/public/scss/bootstrap/scss/helpers/_stretched-link.scss b/scss/bootstrap/scss/helpers/_stretched-link.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_stretched-link.scss rename to scss/bootstrap/scss/helpers/_stretched-link.scss diff --git a/public/scss/bootstrap/scss/helpers/_text-truncation.scss b/scss/bootstrap/scss/helpers/_text-truncation.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_text-truncation.scss rename to scss/bootstrap/scss/helpers/_text-truncation.scss diff --git a/public/scss/bootstrap/scss/helpers/_visually-hidden.scss b/scss/bootstrap/scss/helpers/_visually-hidden.scss similarity index 100% rename from public/scss/bootstrap/scss/helpers/_visually-hidden.scss rename to scss/bootstrap/scss/helpers/_visually-hidden.scss diff --git a/public/scss/bootstrap/scss/mixins/_alert.scss b/scss/bootstrap/scss/mixins/_alert.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_alert.scss rename to scss/bootstrap/scss/mixins/_alert.scss diff --git a/public/scss/bootstrap/scss/mixins/_border-radius.scss b/scss/bootstrap/scss/mixins/_border-radius.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_border-radius.scss rename to scss/bootstrap/scss/mixins/_border-radius.scss diff --git a/public/scss/bootstrap/scss/mixins/_box-shadow.scss b/scss/bootstrap/scss/mixins/_box-shadow.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_box-shadow.scss rename to scss/bootstrap/scss/mixins/_box-shadow.scss diff --git a/public/scss/bootstrap/scss/mixins/_breakpoints.scss b/scss/bootstrap/scss/mixins/_breakpoints.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_breakpoints.scss rename to scss/bootstrap/scss/mixins/_breakpoints.scss diff --git a/public/scss/bootstrap/scss/mixins/_buttons.scss b/scss/bootstrap/scss/mixins/_buttons.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_buttons.scss rename to scss/bootstrap/scss/mixins/_buttons.scss diff --git a/public/scss/bootstrap/scss/mixins/_caret.scss b/scss/bootstrap/scss/mixins/_caret.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_caret.scss rename to scss/bootstrap/scss/mixins/_caret.scss diff --git a/public/scss/bootstrap/scss/mixins/_clearfix.scss b/scss/bootstrap/scss/mixins/_clearfix.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_clearfix.scss rename to scss/bootstrap/scss/mixins/_clearfix.scss diff --git a/public/scss/bootstrap/scss/mixins/_color-scheme.scss b/scss/bootstrap/scss/mixins/_color-scheme.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_color-scheme.scss rename to scss/bootstrap/scss/mixins/_color-scheme.scss diff --git a/public/scss/bootstrap/scss/mixins/_container.scss b/scss/bootstrap/scss/mixins/_container.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_container.scss rename to scss/bootstrap/scss/mixins/_container.scss diff --git a/public/scss/bootstrap/scss/mixins/_deprecate.scss b/scss/bootstrap/scss/mixins/_deprecate.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_deprecate.scss rename to scss/bootstrap/scss/mixins/_deprecate.scss diff --git a/public/scss/bootstrap/scss/mixins/_forms.scss b/scss/bootstrap/scss/mixins/_forms.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_forms.scss rename to scss/bootstrap/scss/mixins/_forms.scss diff --git a/public/scss/bootstrap/scss/mixins/_gradients.scss b/scss/bootstrap/scss/mixins/_gradients.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_gradients.scss rename to scss/bootstrap/scss/mixins/_gradients.scss diff --git a/public/scss/bootstrap/scss/mixins/_grid.scss b/scss/bootstrap/scss/mixins/_grid.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_grid.scss rename to scss/bootstrap/scss/mixins/_grid.scss diff --git a/public/scss/bootstrap/scss/mixins/_image.scss b/scss/bootstrap/scss/mixins/_image.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_image.scss rename to scss/bootstrap/scss/mixins/_image.scss diff --git a/public/scss/bootstrap/scss/mixins/_list-group.scss b/scss/bootstrap/scss/mixins/_list-group.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_list-group.scss rename to scss/bootstrap/scss/mixins/_list-group.scss diff --git a/public/scss/bootstrap/scss/mixins/_lists.scss b/scss/bootstrap/scss/mixins/_lists.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_lists.scss rename to scss/bootstrap/scss/mixins/_lists.scss diff --git a/public/scss/bootstrap/scss/mixins/_pagination.scss b/scss/bootstrap/scss/mixins/_pagination.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_pagination.scss rename to scss/bootstrap/scss/mixins/_pagination.scss diff --git a/public/scss/bootstrap/scss/mixins/_reset-text.scss b/scss/bootstrap/scss/mixins/_reset-text.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_reset-text.scss rename to scss/bootstrap/scss/mixins/_reset-text.scss diff --git a/public/scss/bootstrap/scss/mixins/_resize.scss b/scss/bootstrap/scss/mixins/_resize.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_resize.scss rename to scss/bootstrap/scss/mixins/_resize.scss diff --git a/public/scss/bootstrap/scss/mixins/_table-variants.scss b/scss/bootstrap/scss/mixins/_table-variants.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_table-variants.scss rename to scss/bootstrap/scss/mixins/_table-variants.scss diff --git a/public/scss/bootstrap/scss/mixins/_text-truncate.scss b/scss/bootstrap/scss/mixins/_text-truncate.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_text-truncate.scss rename to scss/bootstrap/scss/mixins/_text-truncate.scss diff --git a/public/scss/bootstrap/scss/mixins/_transition.scss b/scss/bootstrap/scss/mixins/_transition.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_transition.scss rename to scss/bootstrap/scss/mixins/_transition.scss diff --git a/public/scss/bootstrap/scss/mixins/_utilities.scss b/scss/bootstrap/scss/mixins/_utilities.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_utilities.scss rename to scss/bootstrap/scss/mixins/_utilities.scss diff --git a/public/scss/bootstrap/scss/mixins/_visually-hidden.scss b/scss/bootstrap/scss/mixins/_visually-hidden.scss similarity index 100% rename from public/scss/bootstrap/scss/mixins/_visually-hidden.scss rename to scss/bootstrap/scss/mixins/_visually-hidden.scss diff --git a/public/scss/bootstrap/scss/utilities/_api.scss b/scss/bootstrap/scss/utilities/_api.scss similarity index 100% rename from public/scss/bootstrap/scss/utilities/_api.scss rename to scss/bootstrap/scss/utilities/_api.scss diff --git a/public/scss/bootstrap/scss/vendor/_rfs.scss b/scss/bootstrap/scss/vendor/_rfs.scss similarity index 100% rename from public/scss/bootstrap/scss/vendor/_rfs.scss rename to scss/bootstrap/scss/vendor/_rfs.scss diff --git a/public/service-details.html b/service-details.html similarity index 100% rename from public/service-details.html rename to service-details.html diff --git a/public/team.html b/team.html similarity index 100% rename from public/team.html rename to team.html