@notectl/core 1.0.9 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/dist/chunks/{AttrRegistry-D-przlzb.mjs → AttrRegistry-I-VdmRnN.mjs} +2 -2
  2. package/dist/chunks/{AttrRegistry-D-przlzb.mjs.map → AttrRegistry-I-VdmRnN.mjs.map} +1 -1
  3. package/dist/chunks/CaretNavigation-CAJXoaae.mjs +311 -0
  4. package/dist/chunks/CaretNavigation-CAJXoaae.mjs.map +1 -0
  5. package/dist/chunks/ColorNames-BdsHwA2f.mjs +59 -0
  6. package/dist/chunks/ColorNames-BdsHwA2f.mjs.map +1 -0
  7. package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs +125 -0
  8. package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs.map +1 -0
  9. package/dist/chunks/Commands-CicwYoTQ.mjs +286 -0
  10. package/dist/chunks/Commands-CicwYoTQ.mjs.map +1 -0
  11. package/dist/chunks/{Document-CI3iCwEP.mjs → Document-CuwE73FF.mjs} +35 -22
  12. package/dist/chunks/{Document-CI3iCwEP.mjs.map → Document-CuwE73FF.mjs.map} +1 -1
  13. package/dist/chunks/HTMLUtils-DTqQzcKR.mjs +35 -0
  14. package/dist/chunks/HTMLUtils-DTqQzcKR.mjs.map +1 -0
  15. package/dist/chunks/MarkCommands-CC37WA7Z.mjs +94 -0
  16. package/dist/chunks/MarkCommands-CC37WA7Z.mjs.map +1 -0
  17. package/dist/chunks/NavigationUtils-CyW0Vo8A.mjs +47 -0
  18. package/dist/chunks/NavigationUtils-CyW0Vo8A.mjs.map +1 -0
  19. package/dist/chunks/{NodeResolver-D68ZLXti.mjs → NodeResolver-B-wzthAQ.mjs} +2 -2
  20. package/dist/chunks/{NodeResolver-D68ZLXti.mjs.map → NodeResolver-B-wzthAQ.mjs.map} +1 -1
  21. package/dist/chunks/Platform-S_xqIqcM.mjs +26 -0
  22. package/dist/chunks/Platform-S_xqIqcM.mjs.map +1 -0
  23. package/dist/chunks/Selection-DmFDwiPJ.mjs +52 -0
  24. package/dist/chunks/Selection-DmFDwiPJ.mjs.map +1 -0
  25. package/dist/chunks/ToolbarItem-BpZggUGo.mjs +8 -0
  26. package/dist/chunks/ToolbarItem-BpZggUGo.mjs.map +1 -0
  27. package/dist/chunks/{ToolbarPlugin-DFkl1uYO.mjs → ToolbarPlugin-B6JETWaw.mjs} +3 -3
  28. package/dist/chunks/{ToolbarPlugin-DFkl1uYO.mjs.map → ToolbarPlugin-B6JETWaw.mjs.map} +1 -1
  29. package/dist/chunks/index--z_Txzej.mjs +467 -0
  30. package/dist/chunks/index--z_Txzej.mjs.map +1 -0
  31. package/dist/chunks/{index-uTnc9y7M.mjs → index-B-NSeaM4.mjs} +28 -28
  32. package/dist/chunks/index-B-NSeaM4.mjs.map +1 -0
  33. package/dist/chunks/{index-BTJfyJlJ.mjs → index-B9GkDVsx.mjs} +104 -104
  34. package/dist/chunks/index-B9GkDVsx.mjs.map +1 -0
  35. package/dist/chunks/{index-BRYzYOYC.mjs → index-C0cEs7Jc.mjs} +29 -29
  36. package/dist/chunks/index-C0cEs7Jc.mjs.map +1 -0
  37. package/dist/chunks/{index-BFsYGsBR.mjs → index-C9gc3Bws.mjs} +42 -42
  38. package/dist/chunks/{index-BFsYGsBR.mjs.map → index-C9gc3Bws.mjs.map} +1 -1
  39. package/dist/chunks/{index-DGrRWMlW.mjs → index-CAV2N-fF.mjs} +105 -105
  40. package/dist/chunks/index-CAV2N-fF.mjs.map +1 -0
  41. package/dist/chunks/{index-BQ8iIYLn.mjs → index-CKPrAOr6.mjs} +54 -54
  42. package/dist/chunks/index-CKPrAOr6.mjs.map +1 -0
  43. package/dist/chunks/{index-Bsp4LC5t.mjs → index-CNs4QQ8l.mjs} +36 -36
  44. package/dist/chunks/index-CNs4QQ8l.mjs.map +1 -0
  45. package/dist/chunks/{index-DC1EK22F.mjs → index-CflvcXSd.mjs} +24 -19
  46. package/dist/chunks/index-CflvcXSd.mjs.map +1 -0
  47. package/dist/chunks/{index-o6hDR07y.mjs → index-CoeD4T9-.mjs} +25 -20
  48. package/dist/chunks/index-CoeD4T9-.mjs.map +1 -0
  49. package/dist/chunks/{index-DA8TG2S8.mjs → index-D0s0Q8Wc.mjs} +56 -56
  50. package/dist/chunks/index-D0s0Q8Wc.mjs.map +1 -0
  51. package/dist/chunks/{index-BIL37LSL.mjs → index-D8tbbW97.mjs} +18 -18
  52. package/dist/chunks/{index-BIL37LSL.mjs.map → index-D8tbbW97.mjs.map} +1 -1
  53. package/dist/chunks/{index-DfO_fKw6.mjs → index-DMt3ojrY.mjs} +15 -15
  54. package/dist/chunks/{index-DfO_fKw6.mjs.map → index-DMt3ojrY.mjs.map} +1 -1
  55. package/dist/chunks/{index-BCvuDpVr.mjs → index-DfzCof6H.mjs} +31 -31
  56. package/dist/chunks/index-DfzCof6H.mjs.map +1 -0
  57. package/dist/chunks/{index-BL56fbXt.mjs → index-DyIwN_67.mjs} +89 -87
  58. package/dist/chunks/index-DyIwN_67.mjs.map +1 -0
  59. package/dist/chunks/{index-BSFLNveF.mjs → index-FlTg80Pk.mjs} +352 -341
  60. package/dist/chunks/index-FlTg80Pk.mjs.map +1 -0
  61. package/dist/chunks/{index-DAFCISBN.mjs → index-pxbbDHVH.mjs} +8 -8
  62. package/dist/chunks/{index-DAFCISBN.mjs.map → index-pxbbDHVH.mjs.map} +1 -1
  63. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -1
  64. package/dist/commands/Commands.d.ts +13 -45
  65. package/dist/commands/Commands.d.ts.map +1 -1
  66. package/dist/commands/DeleteCommands.d.ts +15 -0
  67. package/dist/commands/DeleteCommands.d.ts.map +1 -0
  68. package/dist/commands/GapCursorCommands.d.ts +24 -0
  69. package/dist/commands/GapCursorCommands.d.ts.map +1 -0
  70. package/dist/commands/MarkCommands.d.ts +19 -0
  71. package/dist/commands/MarkCommands.d.ts.map +1 -0
  72. package/dist/commands/MovementCommands.d.ts +27 -0
  73. package/dist/commands/MovementCommands.d.ts.map +1 -0
  74. package/dist/commands/NodeSelectionCommands.d.ts +24 -0
  75. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -0
  76. package/dist/commands/PasteCommand.d.ts.map +1 -1
  77. package/dist/commands/WordBoundary.d.ts +12 -0
  78. package/dist/commands/WordBoundary.d.ts.map +1 -0
  79. package/dist/editor/DocumentSerializer.d.ts.map +1 -1
  80. package/dist/editor/NotectlEditor.d.ts +7 -1
  81. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  82. package/dist/index.d.ts +28 -7
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  85. package/dist/input/CompositionTracker.d.ts +14 -0
  86. package/dist/input/CompositionTracker.d.ts.map +1 -0
  87. package/dist/input/FileHandlerRegistry.d.ts +16 -0
  88. package/dist/input/FileHandlerRegistry.d.ts.map +1 -0
  89. package/dist/input/InputHandler.d.ts +6 -4
  90. package/dist/input/InputHandler.d.ts.map +1 -1
  91. package/dist/input/InputRuleRegistry.d.ts +9 -0
  92. package/dist/input/InputRuleRegistry.d.ts.map +1 -0
  93. package/dist/input/KeyboardHandler.d.ts +20 -5
  94. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  95. package/dist/input/Keymap.d.ts +11 -0
  96. package/dist/input/Keymap.d.ts.map +1 -1
  97. package/dist/input/KeymapRegistry.d.ts +19 -0
  98. package/dist/input/KeymapRegistry.d.ts.map +1 -0
  99. package/dist/input/PasteHandler.d.ts +3 -0
  100. package/dist/input/PasteHandler.d.ts.map +1 -1
  101. package/dist/model/Document.d.ts +8 -0
  102. package/dist/model/Document.d.ts.map +1 -1
  103. package/dist/model/GraphemeUtils.d.ts +20 -0
  104. package/dist/model/GraphemeUtils.d.ts.map +1 -0
  105. package/dist/model/HTMLUtils.d.ts +6 -1
  106. package/dist/model/HTMLUtils.d.ts.map +1 -1
  107. package/dist/model/NavigationUtils.d.ts +16 -0
  108. package/dist/model/NavigationUtils.d.ts.map +1 -0
  109. package/dist/model/SchemaRegistry.d.ts +0 -39
  110. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  111. package/dist/model/Selection.d.ts +14 -3
  112. package/dist/model/Selection.d.ts.map +1 -1
  113. package/dist/notectl-core.mjs +2797 -2515
  114. package/dist/notectl-core.mjs.map +1 -1
  115. package/dist/notectl-core.umd.js +5869 -4844
  116. package/dist/notectl-core.umd.js.map +1 -1
  117. package/dist/plugins/Plugin.d.ts +17 -3
  118. package/dist/plugins/Plugin.d.ts.map +1 -1
  119. package/dist/plugins/PluginManager.d.ts +14 -0
  120. package/dist/plugins/PluginManager.d.ts.map +1 -1
  121. package/dist/plugins/alignment.mjs +3 -3
  122. package/dist/plugins/blockquote.mjs +2 -2
  123. package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts +35 -0
  124. package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts.map +1 -0
  125. package/dist/plugins/caret-navigation/index.d.ts +2 -0
  126. package/dist/plugins/caret-navigation/index.d.ts.map +1 -0
  127. package/dist/plugins/caret-navigation.mjs +5 -0
  128. package/dist/plugins/caret-navigation.mjs.map +1 -0
  129. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
  130. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  131. package/dist/plugins/code-block.mjs +3 -3
  132. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  133. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
  134. package/dist/plugins/font-size.mjs +2 -2
  135. package/dist/plugins/font.mjs +2 -2
  136. package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts +15 -0
  137. package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts.map +1 -0
  138. package/dist/plugins/gap-cursor/index.d.ts +2 -0
  139. package/dist/plugins/gap-cursor/index.d.ts.map +1 -0
  140. package/dist/plugins/gap-cursor.mjs +65 -0
  141. package/dist/plugins/gap-cursor.mjs.map +1 -0
  142. package/dist/plugins/hard-break.mjs +1 -1
  143. package/dist/plugins/heading/BlockTypePickerRegistry.d.ts +9 -0
  144. package/dist/plugins/heading/BlockTypePickerRegistry.d.ts.map +1 -0
  145. package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -1
  146. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -1
  147. package/dist/plugins/heading.mjs +2 -2
  148. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  149. package/dist/plugins/highlight.mjs +2 -2
  150. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  151. package/dist/plugins/horizontal-rule.mjs +2 -2
  152. package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
  153. package/dist/plugins/image.mjs +3 -3
  154. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  155. package/dist/plugins/link.mjs +2 -2
  156. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  157. package/dist/plugins/list.mjs +2 -2
  158. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
  159. package/dist/plugins/print/PrintTypes.d.ts +5 -1
  160. package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
  161. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -1
  162. package/dist/plugins/shared/ColorValidation.d.ts +7 -0
  163. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -1
  164. package/dist/plugins/strikethrough.mjs +2 -2
  165. package/dist/plugins/super-sub.mjs +2 -2
  166. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  167. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  168. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  169. package/dist/plugins/table.mjs +10 -10
  170. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  171. package/dist/plugins/text-color.mjs +2 -2
  172. package/dist/plugins/text-formatting.mjs +1 -1
  173. package/dist/plugins/toolbar/ToolbarItem.d.ts.map +1 -1
  174. package/dist/plugins/toolbar/ToolbarRegistry.d.ts +12 -0
  175. package/dist/plugins/toolbar/ToolbarRegistry.d.ts.map +1 -0
  176. package/dist/plugins/toolbar.mjs +2 -2
  177. package/dist/presets/FullPreset.d.ts +16 -0
  178. package/dist/presets/FullPreset.d.ts.map +1 -0
  179. package/dist/presets/MinimalPreset.d.ts +7 -0
  180. package/dist/presets/MinimalPreset.d.ts.map +1 -0
  181. package/dist/presets/PresetTypes.d.ts +50 -0
  182. package/dist/presets/PresetTypes.d.ts.map +1 -0
  183. package/dist/state/EditorState.d.ts.map +1 -1
  184. package/dist/state/History.d.ts.map +1 -1
  185. package/dist/state/SelectionTransactions.d.ts +10 -0
  186. package/dist/state/SelectionTransactions.d.ts.map +1 -0
  187. package/dist/test/TestUtils.d.ts +23 -0
  188. package/dist/test/TestUtils.d.ts.map +1 -1
  189. package/dist/view/CaretNavigation.d.ts +48 -0
  190. package/dist/view/CaretNavigation.d.ts.map +1 -0
  191. package/dist/view/CursorWrapper.d.ts +19 -0
  192. package/dist/view/CursorWrapper.d.ts.map +1 -0
  193. package/dist/view/DomPointUtils.d.ts +20 -0
  194. package/dist/view/DomPointUtils.d.ts.map +1 -0
  195. package/dist/view/EditorView.d.ts +43 -0
  196. package/dist/view/EditorView.d.ts.map +1 -1
  197. package/dist/view/MarkRendering.d.ts +7 -0
  198. package/dist/view/MarkRendering.d.ts.map +1 -0
  199. package/dist/view/NodeViewRegistry.d.ts +9 -0
  200. package/dist/view/NodeViewRegistry.d.ts.map +1 -0
  201. package/dist/view/Platform.d.ts +29 -0
  202. package/dist/view/Platform.d.ts.map +1 -0
  203. package/dist/view/Reconciler.d.ts +4 -0
  204. package/dist/view/Reconciler.d.ts.map +1 -1
  205. package/dist/view/SelectionSync.d.ts +2 -0
  206. package/dist/view/SelectionSync.d.ts.map +1 -1
  207. package/dist/view/ViewMovementCommands.d.ts +40 -0
  208. package/dist/view/ViewMovementCommands.d.ts.map +1 -0
  209. package/package.json +10 -2
  210. package/dist/chunks/ColorNames-iaWsSZx1.mjs +0 -35
  211. package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +0 -1
  212. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +0 -140
  213. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +0 -1
  214. package/dist/chunks/Commands-CSpSwGXv.mjs +0 -461
  215. package/dist/chunks/Commands-CSpSwGXv.mjs.map +0 -1
  216. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs +0 -7
  217. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs.map +0 -1
  218. package/dist/chunks/Selection-D5ZjXoB7.mjs +0 -44
  219. package/dist/chunks/Selection-D5ZjXoB7.mjs.map +0 -1
  220. package/dist/chunks/ToolbarItem-ugDymuXi.mjs +0 -7
  221. package/dist/chunks/ToolbarItem-ugDymuXi.mjs.map +0 -1
  222. package/dist/chunks/index-BCvuDpVr.mjs.map +0 -1
  223. package/dist/chunks/index-BL56fbXt.mjs.map +0 -1
  224. package/dist/chunks/index-BQ8iIYLn.mjs.map +0 -1
  225. package/dist/chunks/index-BRYzYOYC.mjs.map +0 -1
  226. package/dist/chunks/index-BSFLNveF.mjs.map +0 -1
  227. package/dist/chunks/index-BTJfyJlJ.mjs.map +0 -1
  228. package/dist/chunks/index-Bsp4LC5t.mjs.map +0 -1
  229. package/dist/chunks/index-DA8TG2S8.mjs.map +0 -1
  230. package/dist/chunks/index-DC1EK22F.mjs.map +0 -1
  231. package/dist/chunks/index-DGrRWMlW.mjs.map +0 -1
  232. package/dist/chunks/index-o6hDR07y.mjs.map +0 -1
  233. package/dist/chunks/index-uTnc9y7M.mjs.map +0 -1
@@ -1,22 +1,22 @@
1
- import { f as e } from "./Commands-CSpSwGXv.mjs";
1
+ import { f as e } from "./Commands-CicwYoTQ.mjs";
2
2
  import { r as t } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
- import { e as r, h as i } from "./Document-CI3iCwEP.mjs";
4
- import { e as n } from "./HTMLUtils-0wvCRvJc.mjs";
5
- import { a as o, i as a, s as l } from "./Selection-D5ZjXoB7.mjs";
6
- import { m as s } from "./TypeBrands-C09nE2qO.mjs";
7
- import { f as p } from "./ToolbarItem-ugDymuXi.mjs";
8
- const c = { label: "Link", tooltip: (e2) => `Insert Link (${e2})`, removeLink: "Remove Link", removeLinkAria: "Remove link", urlPlaceholder: "https://...", urlAria: "Link URL", apply: "Apply", applyAria: "Apply link" }, m = { en: c, de: { label: "Link", tooltip: (e2) => `Link einfügen (${e2})`, removeLink: "Link entfernen", removeLinkAria: "Link entfernen", urlPlaceholder: "https://...", urlAria: "Link-URL", apply: "Anwenden", applyAria: "Link anwenden" }, es: { label: "Enlace", tooltip: (e2) => `Insertar enlace (${e2})`, removeLink: "Eliminar enlace", removeLinkAria: "Eliminar enlace", urlPlaceholder: "https://...", urlAria: "URL del enlace", apply: "Aplicar", applyAria: "Aplicar enlace" }, fr: { label: "Lien", tooltip: (e2) => `Insérer un lien (${e2})`, removeLink: "Supprimer le lien", removeLinkAria: "Supprimer le lien", urlPlaceholder: "https://...", urlAria: "URL du lien", apply: "Appliquer", applyAria: "Appliquer le lien" }, zh: { label: "链接", tooltip: (e2) => `插入链接 (${e2})`, removeLink: "移除链接", removeLinkAria: "移除链接", urlPlaceholder: "https://...", urlAria: "链接地址", apply: "应用", applyAria: "应用链接" }, ru: { label: "Ссылка", tooltip: (e2) => `Вставить ссылку (${e2})`, removeLink: "Удалить ссылку", removeLinkAria: "Удалить ссылку", urlPlaceholder: "https://...", urlAria: "URL ссылки", apply: "Применить", applyAria: "Применить ссылку" }, ar: { label: "رابط", tooltip: (e2) => `إدراج رابط (${e2})`, removeLink: "إزالة الرابط", removeLinkAria: "إزالة الرابط", urlPlaceholder: "https://...", urlAria: "عنوان الرابط", apply: "تطبيق", applyAria: "تطبيق الرابط" }, hi: { label: "लिंक", tooltip: (e2) => `लिंक डालें (${e2})`, removeLink: "लिंक हटाएँ", removeLinkAria: "लिंक हटाएँ", urlPlaceholder: "https://...", urlAria: "लिंक URL", apply: "लागू करें", applyAria: "लिंक लागू करें" } }, d = { openInNewTab: true };
9
- class h {
3
+ import { g as r, h as i } from "./Document-CuwE73FF.mjs";
4
+ import { e as n } from "./HTMLUtils-DTqQzcKR.mjs";
5
+ import { b as o, i as a, a as l, s } from "./Selection-DmFDwiPJ.mjs";
6
+ import { m as p } from "./TypeBrands-C09nE2qO.mjs";
7
+ import { f as c } from "./ToolbarItem-BpZggUGo.mjs";
8
+ const m = { label: "Link", tooltip: (e2) => `Insert Link (${e2})`, removeLink: "Remove Link", removeLinkAria: "Remove link", urlPlaceholder: "https://...", urlAria: "Link URL", apply: "Apply", applyAria: "Apply link" }, d = { en: m, de: { label: "Link", tooltip: (e2) => `Link einfügen (${e2})`, removeLink: "Link entfernen", removeLinkAria: "Link entfernen", urlPlaceholder: "https://...", urlAria: "Link-URL", apply: "Anwenden", applyAria: "Link anwenden" }, es: { label: "Enlace", tooltip: (e2) => `Insertar enlace (${e2})`, removeLink: "Eliminar enlace", removeLinkAria: "Eliminar enlace", urlPlaceholder: "https://...", urlAria: "URL del enlace", apply: "Aplicar", applyAria: "Aplicar enlace" }, fr: { label: "Lien", tooltip: (e2) => `Insérer un lien (${e2})`, removeLink: "Supprimer le lien", removeLinkAria: "Supprimer le lien", urlPlaceholder: "https://...", urlAria: "URL du lien", apply: "Appliquer", applyAria: "Appliquer le lien" }, zh: { label: "链接", tooltip: (e2) => `插入链接 (${e2})`, removeLink: "移除链接", removeLinkAria: "移除链接", urlPlaceholder: "https://...", urlAria: "链接地址", apply: "应用", applyAria: "应用链接" }, ru: { label: "Ссылка", tooltip: (e2) => `Вставить ссылку (${e2})`, removeLink: "Удалить ссылку", removeLinkAria: "Удалить ссылку", urlPlaceholder: "https://...", urlAria: "URL ссылки", apply: "Применить", applyAria: "Применить ссылку" }, ar: { label: "رابط", tooltip: (e2) => `إدراج رابط (${e2})`, removeLink: "إزالة الرابط", removeLinkAria: "إزالة الرابط", urlPlaceholder: "https://...", urlAria: "عنوان الرابط", apply: "تطبيق", applyAria: "تطبيق الرابط" }, hi: { label: "लिंक", tooltip: (e2) => `लिंक डालें (${e2})`, removeLink: "लिंक हटाएँ", removeLinkAria: "लिंक हटाएँ", urlPlaceholder: "https://...", urlAria: "लिंक URL", apply: "लागू करें", applyAria: "लिंक लागू करें" } }, h = { openInNewTab: true };
9
+ class u {
10
10
  id = "link";
11
11
  name = "Link";
12
12
  priority = 25;
13
13
  config;
14
14
  locale;
15
15
  constructor(e2) {
16
- this.config = { ...d, ...e2 };
16
+ this.config = { ...h, ...e2 };
17
17
  }
18
18
  init(e2) {
19
- this.locale = t(m, e2, this.config.locale), this.registerMarkSpec(e2), this.registerCommands(e2), this.registerKeymap(e2), this.registerToolbarItem(e2);
19
+ this.locale = t(d, e2, this.config.locale), this.registerMarkSpec(e2), this.registerCommands(e2), this.registerKeymap(e2), this.registerToolbarItem(e2);
20
20
  }
21
21
  registerMarkSpec(e2) {
22
22
  const t2 = this.config.openInNewTab;
@@ -38,40 +38,40 @@ class h {
38
38
  e2.registerKeymap({ "Mod-K": () => e2.executeCommand("toggleLink") });
39
39
  }
40
40
  registerToolbarItem(e2) {
41
- e2.registerToolbarItem({ id: "link", group: "insert", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>', label: this.locale.label, tooltip: this.locale.tooltip(p("Mod-K")), command: "toggleLink", priority: 60, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, t2, r2) => {
41
+ e2.registerToolbarItem({ id: "link", group: "insert", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>', label: this.locale.label, tooltip: this.locale.tooltip(c("Mod-K")), command: "toggleLink", priority: 60, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, t2, r2) => {
42
42
  this.renderLinkPopup(e3, t2, r2);
43
43
  }, isActive: (e3) => this.isLinkActive(e3), isEnabled: (e3) => !o(e3.selection) });
44
44
  }
45
45
  isLinkActive(e2) {
46
46
  const t2 = e2.selection;
47
- if (a(t2)) return false;
47
+ if (a(t2) || l(t2)) return false;
48
48
  if (o(t2)) {
49
49
  const n3 = e2.getBlock(t2.anchor.blockId);
50
50
  if (!n3) return false;
51
51
  const o2 = r(n3, t2.anchor.offset);
52
- return i(o2, s("link"));
52
+ return i(o2, p("link"));
53
53
  }
54
54
  const n2 = e2.getBlock(t2.anchor.blockId);
55
55
  if (!n2) return false;
56
- const l2 = r(n2, t2.anchor.offset);
57
- return i(l2, s("link"));
56
+ const s2 = r(n2, t2.anchor.offset);
57
+ return i(s2, p("link"));
58
58
  }
59
59
  toggleLink(e2, t2) {
60
60
  return !!this.isLinkActive(t2) && this.removeLink(e2, t2);
61
61
  }
62
62
  addLink(t2, r2, i2) {
63
63
  const n2 = r2.selection;
64
- if (a(n2)) return false;
64
+ if (a(n2) || l(n2)) return false;
65
65
  if (o(n2)) return false;
66
- const p2 = l(n2, r2.getBlockOrder()), c2 = r2.transaction("command"), m2 = { type: s("link"), attrs: { href: i2 } };
67
- return e(r2, p2, (e2, t3, r3) => {
68
- c2.addMark(e2, t3, r3, m2);
69
- }), c2.setSelection(n2), t2.dispatch(c2.build()), true;
66
+ const c2 = s(n2, r2.getBlockOrder()), m2 = r2.transaction("command"), d2 = { type: p("link"), attrs: { href: i2 } };
67
+ return e(r2, c2, (e2, t3, r3) => {
68
+ m2.addMark(e2, t3, r3, d2);
69
+ }), m2.setSelection(n2), t2.dispatch(m2.build()), true;
70
70
  }
71
71
  removeLink(t2, r2) {
72
72
  const n2 = r2.selection;
73
- if (a(n2)) return false;
74
- const p2 = r2.getBlockOrder(), c2 = o(n2) ? { from: n2.anchor, to: n2.anchor } : l(n2, p2), m2 = r2.transaction("command");
73
+ if (a(n2) || l(n2)) return false;
74
+ const c2 = r2.getBlockOrder(), m2 = o(n2) ? { from: n2.anchor, to: n2.anchor } : s(n2, c2), d2 = r2.transaction("command");
75
75
  if (o(n2)) {
76
76
  const e2 = r2.getBlock(n2.anchor.blockId);
77
77
  if (!e2) return false;
@@ -80,22 +80,22 @@ class h {
80
80
  for (const r3 of e2.children) {
81
81
  if (!("text" in r3)) continue;
82
82
  const e3 = o2 + r3.text.length;
83
- t3.push({ pos: o2, end: e3, hasLink: i(r3.marks, s("link")) }), o2 = e3;
83
+ t3.push({ pos: o2, end: e3, hasLink: i(r3.marks, p("link")) }), o2 = e3;
84
84
  }
85
85
  const a2 = t3.findIndex((e3) => n2.anchor.offset >= e3.pos && n2.anchor.offset <= e3.end), l2 = a2 >= 0 ? t3[a2] : void 0;
86
86
  if (-1 === a2 || !l2?.hasLink) return false;
87
- let p3 = a2;
88
- for (; p3 > 0 && t3[p3 - 1]?.hasLink; ) p3--;
87
+ let s2 = a2;
88
+ for (; s2 > 0 && t3[s2 - 1]?.hasLink; ) s2--;
89
89
  let c3 = a2;
90
90
  for (; c3 < t3.length - 1 && t3[c3 + 1]?.hasLink; ) c3++;
91
- const d2 = t3[p3], h2 = t3[c3];
92
- if (!d2 || !h2) return false;
93
- const u = d2.pos, k = h2.end;
94
- m2.removeMark(n2.anchor.blockId, u, k, { type: s("link") });
95
- } else e(r2, c2, (e2, t3, r3) => {
96
- m2.removeMark(e2, t3, r3, { type: s("link") });
91
+ const m3 = t3[s2], h2 = t3[c3];
92
+ if (!m3 || !h2) return false;
93
+ const u2 = m3.pos, k = h2.end;
94
+ d2.removeMark(n2.anchor.blockId, u2, k, { type: p("link") });
95
+ } else e(r2, m2, (e2, t3, r3) => {
96
+ d2.removeMark(e2, t3, r3, { type: p("link") });
97
97
  });
98
- return m2.setSelection(n2), t2.dispatch(m2.build()), true;
98
+ return d2.setSelection(n2), t2.dispatch(d2.build()), true;
99
99
  }
100
100
  renderLinkPopup(e2, t2, r2) {
101
101
  e2.style.padding = "8px", e2.style.minWidth = "200px";
@@ -123,8 +123,8 @@ class h {
123
123
  }
124
124
  }
125
125
  export {
126
- m as L,
127
- c as a,
128
- h as b
126
+ u as L,
127
+ d as a,
128
+ m as b
129
129
  };
130
- //# sourceMappingURL=index-Bsp4LC5t.mjs.map
130
+ //# sourceMappingURL=index-CNs4QQ8l.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CNs4QQ8l.mjs","sources":["../../src/plugins/link/LinkLocale.ts","../../src/plugins/link/LinkPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the LinkPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface LinkLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n\treadonly removeLink: string;\n\treadonly removeLinkAria: string;\n\treadonly urlPlaceholder: string;\n\treadonly urlAria: string;\n\treadonly apply: string;\n\treadonly applyAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const LINK_LOCALE_EN: LinkLocale = {\n\tlabel: 'Link',\n\ttooltip: (shortcut: string) => `Insert Link (${shortcut})`,\n\tremoveLink: 'Remove Link',\n\tremoveLinkAria: 'Remove link',\n\turlPlaceholder: 'https://...',\n\turlAria: 'Link URL',\n\tapply: 'Apply',\n\tapplyAria: 'Apply link',\n};\n\n// --- German Locale ---\n\nexport const LINK_LOCALE_DE: LinkLocale = {\n\tlabel: 'Link',\n\ttooltip: (shortcut: string) => `Link einfügen (${shortcut})`,\n\tremoveLink: 'Link entfernen',\n\tremoveLinkAria: 'Link entfernen',\n\turlPlaceholder: 'https://...',\n\turlAria: 'Link-URL',\n\tapply: 'Anwenden',\n\tapplyAria: 'Link anwenden',\n};\n\n// --- Spanish Locale ---\n\nexport const LINK_LOCALE_ES: LinkLocale = {\n\tlabel: 'Enlace',\n\ttooltip: (shortcut: string) => `Insertar enlace (${shortcut})`,\n\tremoveLink: 'Eliminar enlace',\n\tremoveLinkAria: 'Eliminar enlace',\n\turlPlaceholder: 'https://...',\n\turlAria: 'URL del enlace',\n\tapply: 'Aplicar',\n\tapplyAria: 'Aplicar enlace',\n};\n\n// --- French Locale ---\n\nexport const LINK_LOCALE_FR: LinkLocale = {\n\tlabel: 'Lien',\n\ttooltip: (shortcut: string) => `Insérer un lien (${shortcut})`,\n\tremoveLink: 'Supprimer le lien',\n\tremoveLinkAria: 'Supprimer le lien',\n\turlPlaceholder: 'https://...',\n\turlAria: 'URL du lien',\n\tapply: 'Appliquer',\n\tapplyAria: 'Appliquer le lien',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const LINK_LOCALE_ZH: LinkLocale = {\n\tlabel: '链接',\n\ttooltip: (shortcut: string) => `插入链接 (${shortcut})`,\n\tremoveLink: '移除链接',\n\tremoveLinkAria: '移除链接',\n\turlPlaceholder: 'https://...',\n\turlAria: '链接地址',\n\tapply: '应用',\n\tapplyAria: '应用链接',\n};\n\n// --- Russian Locale ---\n\nexport const LINK_LOCALE_RU: LinkLocale = {\n\tlabel: 'Ссылка',\n\ttooltip: (shortcut: string) => `Вставить ссылку (${shortcut})`,\n\tremoveLink: 'Удалить ссылку',\n\tremoveLinkAria: 'Удалить ссылку',\n\turlPlaceholder: 'https://...',\n\turlAria: 'URL ссылки',\n\tapply: 'Применить',\n\tapplyAria: 'Применить ссылку',\n};\n\n// --- Arabic Locale ---\n\nexport const LINK_LOCALE_AR: LinkLocale = {\n\tlabel: 'رابط',\n\ttooltip: (shortcut: string) => `إدراج رابط (${shortcut})`,\n\tremoveLink: 'إزالة الرابط',\n\tremoveLinkAria: 'إزالة الرابط',\n\turlPlaceholder: 'https://...',\n\turlAria: 'عنوان الرابط',\n\tapply: 'تطبيق',\n\tapplyAria: 'تطبيق الرابط',\n};\n\n// --- Hindi Locale ---\n\nexport const LINK_LOCALE_HI: LinkLocale = {\n\tlabel: 'लिंक',\n\ttooltip: (shortcut: string) => `लिंक डालें (${shortcut})`,\n\tremoveLink: 'लिंक हटाएँ',\n\tremoveLinkAria: 'लिंक हटाएँ',\n\turlPlaceholder: 'https://...',\n\turlAria: 'लिंक URL',\n\tapply: 'लागू करें',\n\tapplyAria: 'लिंक लागू करें',\n};\n\n// --- Locale Map ---\n\nexport const LINK_LOCALES: Record<string, LinkLocale> = {\n\ten: LINK_LOCALE_EN,\n\tde: LINK_LOCALE_DE,\n\tes: LINK_LOCALE_ES,\n\tfr: LINK_LOCALE_FR,\n\tzh: LINK_LOCALE_ZH,\n\tru: LINK_LOCALE_RU,\n\tar: LINK_LOCALE_AR,\n\thi: LINK_LOCALE_HI,\n};\n","/**\n * LinkPlugin: registers a link mark type with href attribute,\n * toggle command, keyboard shortcut (Mod-K), and toolbar button\n * with a URL input popup.\n */\n\nimport { forEachBlockInRange } from '../../commands/Commands.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { getBlockMarksAtOffset, hasMark } from '../../model/Document.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport {\n\tisCollapsed,\n\tisGapCursor,\n\tisNodeSelection,\n\tselectionRange,\n} from '../../model/Selection.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\nimport { LINK_LOCALES, type LinkLocale } from './LinkLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tlink: { href: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface LinkConfig {\n\t/** Whether to add rel=\"noopener noreferrer\" and target=\"_blank\" by default. */\n\treadonly openInNewTab: boolean;\n\t/** When true, a separator is rendered after the link toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: LinkLocale;\n}\n\nconst DEFAULT_CONFIG: LinkConfig = {\n\topenInNewTab: true,\n};\n\n// --- Plugin ---\n\nexport class LinkPlugin implements Plugin {\n\treadonly id = 'link';\n\treadonly name = 'Link';\n\treadonly priority = 25;\n\n\tprivate readonly config: LinkConfig;\n\tprivate locale!: LinkLocale;\n\n\tconstructor(config?: Partial<LinkConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(LINK_LOCALES, context, this.config.locale);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tconst openInNewTab = this.config.openInNewTab;\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'link',\n\t\t\trank: 10,\n\t\t\tattrs: {\n\t\t\t\thref: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst a = document.createElement('a');\n\t\t\t\tconst href = mark.attrs?.href ?? '';\n\t\t\t\ta.setAttribute('href', href);\n\t\t\t\tif (openInNewTab) {\n\t\t\t\t\ta.setAttribute('target', '_blank');\n\t\t\t\t\ta.setAttribute('rel', 'noopener noreferrer');\n\t\t\t\t}\n\t\t\t\treturn a;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content) => {\n\t\t\t\tconst href: string = escapeHTML(String(mark.attrs?.href ?? ''));\n\t\t\t\treturn `<a href=\"${href}\">${content}</a>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'a',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst href: string = el.getAttribute('href') ?? '';\n\t\t\t\t\t\treturn { href };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['a'], attrs: ['href', 'target', 'rel'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleLink', () => {\n\t\t\tconst state = context.getState();\n\t\t\treturn this.toggleLink(context, state);\n\t\t});\n\n\t\tcontext.registerCommand('setLink', () => {\n\t\t\t// setLink is called by the popup after URL input\n\t\t\t// The actual URL is set via the popup's custom render\n\t\t\treturn false;\n\t\t});\n\n\t\tcontext.registerCommand('removeLink', () => {\n\t\t\tconst state = context.getState();\n\t\t\treturn this.removeLink(context, state);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-K': () => context.executeCommand('toggleLink'),\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'link',\n\t\t\tgroup: 'insert',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-K')),\n\t\t\tcommand: 'toggleLink',\n\t\t\tpriority: 60,\n\t\t\tpopupType: 'custom',\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\tthis.renderLinkPopup(container, ctx, onClose);\n\t\t\t},\n\t\t\tisActive: (state) => this.isLinkActive(state),\n\t\t\tisEnabled: (state) => !isCollapsed(state.selection),\n\t\t});\n\t}\n\n\tprivate isLinkActive(state: EditorState): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tif (isCollapsed(sel)) {\n\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\tif (!block) return false;\n\t\t\tconst marks = getBlockMarksAtOffset(block, sel.anchor.offset);\n\t\t\treturn hasMark(marks, markType('link'));\n\t\t}\n\n\t\t// Check if link is active anywhere in selection\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\t\tconst marks = getBlockMarksAtOffset(block, sel.anchor.offset);\n\t\treturn hasMark(marks, markType('link'));\n\t}\n\n\tprivate toggleLink(context: PluginContext, state: EditorState): boolean {\n\t\tif (this.isLinkActive(state)) {\n\t\t\treturn this.removeLink(context, state);\n\t\t}\n\t\t// Adding links requires the toolbar popup for URL input\n\t\treturn false;\n\t}\n\n\tprivate addLink(context: PluginContext, state: EditorState, href: string): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tif (isCollapsed(sel)) return false;\n\n\t\tconst range = selectionRange(sel, state.getBlockOrder());\n\t\tconst builder = state.transaction('command');\n\t\tconst mark = { type: markType('link'), attrs: { href } };\n\n\t\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\t\tbuilder.addMark(blockId, from, to, mark);\n\t\t});\n\n\t\tbuilder.setSelection(sel);\n\t\tcontext.dispatch(builder.build());\n\t\treturn true;\n\t}\n\n\tprivate removeLink(context: PluginContext, state: EditorState): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tconst blockOrder = state.getBlockOrder();\n\t\tconst range = isCollapsed(sel)\n\t\t\t? { from: sel.anchor, to: sel.anchor }\n\t\t\t: selectionRange(sel, blockOrder);\n\n\t\tconst builder = state.transaction('command');\n\n\t\tif (isCollapsed(sel)) {\n\t\t\t// Remove link from entire link span around cursor\n\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\tif (!block) return false;\n\n\t\t\t// Find the extent of the link mark around the cursor.\n\t\t\t// Build a list of text children with their positions first,\n\t\t\t// then scan backward and forward from the cursor node.\n\t\t\tconst textChildren: { pos: number; end: number; hasLink: boolean }[] = [];\n\t\t\tlet pos = 0;\n\t\t\tfor (const child of block.children) {\n\t\t\t\tif (!('text' in child)) continue;\n\t\t\t\tconst end = pos + child.text.length;\n\t\t\t\ttextChildren.push({ pos, end, hasLink: hasMark(child.marks, markType('link')) });\n\t\t\t\tpos = end;\n\t\t\t}\n\n\t\t\t// Find the text child containing the cursor\n\t\t\tconst cursorIdx = textChildren.findIndex(\n\t\t\t\t(c) => sel.anchor.offset >= c.pos && sel.anchor.offset <= c.end,\n\t\t\t);\n\t\t\tconst cursorEntry = cursorIdx >= 0 ? textChildren[cursorIdx] : undefined;\n\t\t\tif (cursorIdx === -1 || !cursorEntry?.hasLink) return false;\n\n\t\t\t// Scan backward from cursor node to find link start\n\t\t\tlet startIdx = cursorIdx;\n\t\t\twhile (startIdx > 0 && textChildren[startIdx - 1]?.hasLink) {\n\t\t\t\tstartIdx--;\n\t\t\t}\n\n\t\t\t// Scan forward from cursor node to find link end\n\t\t\tlet endIdx = cursorIdx;\n\t\t\twhile (endIdx < textChildren.length - 1 && textChildren[endIdx + 1]?.hasLink) {\n\t\t\t\tendIdx++;\n\t\t\t}\n\n\t\t\tconst startEntry = textChildren[startIdx];\n\t\t\tconst endEntry = textChildren[endIdx];\n\t\t\tif (!startEntry || !endEntry) return false;\n\n\t\t\tconst linkStart = startEntry.pos;\n\t\t\tconst linkEnd = endEntry.end;\n\n\t\t\tbuilder.removeMark(sel.anchor.blockId, linkStart, linkEnd, { type: markType('link') });\n\t\t} else {\n\t\t\t// Remove link from selection range\n\t\t\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\t\t\tbuilder.removeMark(blockId, from, to, { type: markType('link') });\n\t\t\t});\n\t\t}\n\n\t\tbuilder.setSelection(sel);\n\t\tcontext.dispatch(builder.build());\n\t\treturn true;\n\t}\n\n\tprivate renderLinkPopup(\n\t\tcontainer: HTMLElement,\n\t\tcontext: PluginContext,\n\t\tonClose: () => void,\n\t): void {\n\t\tcontainer.style.padding = '8px';\n\t\tcontainer.style.minWidth = '200px';\n\n\t\tconst state = context.getState();\n\t\tconst isActive = this.isLinkActive(state);\n\n\t\tif (isActive) {\n\t\t\t// Show remove link button\n\t\t\tconst removeBtn = document.createElement('button');\n\t\t\tremoveBtn.type = 'button';\n\t\t\tremoveBtn.textContent = this.locale.removeLink;\n\t\t\tremoveBtn.setAttribute('aria-label', this.locale.removeLinkAria);\n\t\t\tremoveBtn.style.cssText = 'width:100%;padding:6px 12px;cursor:pointer;';\n\t\t\tremoveBtn.addEventListener('mousedown', (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tcontext.executeCommand('removeLink');\n\t\t\t\tonClose();\n\t\t\t\tcontext.getContainer().focus();\n\t\t\t});\n\t\t\tcontainer.appendChild(removeBtn);\n\t\t} else {\n\t\t\t// Show URL input\n\t\t\tconst input = document.createElement('input');\n\t\t\tinput.type = 'url';\n\t\t\tinput.placeholder = this.locale.urlPlaceholder;\n\t\t\tinput.setAttribute('aria-label', this.locale.urlAria);\n\t\t\tinput.style.cssText = 'width:100%;padding:4px;box-sizing:border-box;';\n\n\t\t\tconst applyBtn = document.createElement('button');\n\t\t\tapplyBtn.type = 'button';\n\t\t\tapplyBtn.textContent = this.locale.apply;\n\t\t\tapplyBtn.setAttribute('aria-label', this.locale.applyAria);\n\t\t\tapplyBtn.style.cssText = 'width:100%;padding:6px 12px;margin-top:4px;cursor:pointer;';\n\n\t\t\tconst applyLink = (): void => {\n\t\t\t\tconst href = input.value.trim();\n\t\t\t\tif (href) {\n\t\t\t\t\tthis.addLink(context, context.getState(), href);\n\t\t\t\t\tonClose();\n\t\t\t\t\tcontext.getContainer().focus();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tapplyBtn.addEventListener('mousedown', (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tapplyLink();\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tapplyLink();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontainer.appendChild(input);\n\t\t\tcontainer.appendChild(applyBtn);\n\n\t\t\t// Auto-focus input\n\t\t\trequestAnimationFrame(() => input.focus());\n\t\t}\n\t}\n}\n"],"names":["LINK_LOCALE_EN","label","tooltip","shortcut","removeLink","removeLinkAria","urlPlaceholder","urlAria","apply","applyAria","LINK_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","openInNewTab","LinkPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","registerMarkSpec","registerCommands","registerKeymap","registerToolbarItem","type","rank","attrs","href","default","mark","a","document","createElement","setAttribute","toHTMLString","content","escapeHTML","String","parseHTML","tag","getAttrs","el","getAttribute","sanitize","tags","registerCommand","state","getState","toggleLink","executeCommand","group","icon","formatShortcut","command","popupType","separatorAfter","renderPopup","container","ctx","onClose","renderLinkPopup","isActive","isLinkActive","isEnabled","isCollapsed","selection","sel","isNodeSelection","isGapCursor","block","getBlock","anchor","blockId","marks","getBlockMarksAtOffset","offset","hasMark","markType","range","selectionRange","getBlockOrder","builder","transaction","forEachBlockInRange","from","to","addMark","setSelection","dispatch","build","blockOrder","textChildren","pos","child","children","end","text","length","push","hasLink","cursorIdx","findIndex","c","cursorEntry","startIdx","endIdx","startEntry","endEntry","linkStart","linkEnd","removeMark","style","padding","minWidth","removeBtn","textContent","cssText","addEventListener","e","preventDefault","stopPropagation","getContainer","focus","appendChild","input","placeholder","applyBtn","applyLink","value","trim","addLink","key","requestAnimationFrame"],"mappings":"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"}
@@ -1,41 +1,46 @@
1
- import { r as e, C as t, a as o, i as r, b as a } from "./ColorValidation-Dyy4Bye8.mjs";
2
- import { r as l } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
- const i = { label: "Text Color", tooltip: "Text Color", resetLabel: "Default", ariaLabelPrefix: "Text color" }, s = { en: i, de: { label: "Textfarbe", tooltip: "Textfarbe", resetLabel: "Standard", ariaLabelPrefix: "Textfarbe" }, es: { label: "Color de texto", tooltip: "Color de texto", resetLabel: "Predeterminado", ariaLabelPrefix: "Color de texto" }, fr: { label: "Couleur du texte", tooltip: "Couleur du texte", resetLabel: "Par défaut", ariaLabelPrefix: "Couleur du texte" }, zh: { label: "文字颜色", tooltip: "文字颜色", resetLabel: "默认", ariaLabelPrefix: "文字颜色" }, ru: { label: "Цвет текста", tooltip: "Цвет текста", resetLabel: "По умолчанию", ariaLabelPrefix: "Цвет текста" }, ar: { label: "لون النص", tooltip: "لون النص", resetLabel: "افتراضي", ariaLabelPrefix: "لون النص" }, hi: { label: "टेक्स्ट रंग", tooltip: "टेक्स्ट रंग", resetLabel: "डिफ़ॉल्ट", ariaLabelPrefix: "टेक्स्ट रंग" } }, f = ["#000000", "#434343", "#666666", "#999999", "#b7b7b7", "#cccccc", "#d9d9d9", "#efefef", "#f3f3f3", "#ffffff", "#980000", "#ff0000", "#ff9900", "#ffff00", "#00ff00", "#00ffff", "#4a86e8", "#0000ff", "#9900ff", "#ff00ff", "#e6b8af", "#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#c9daf8", "#cfe2f3", "#d9d2e9", "#ead1dc", "#dd7e6b", "#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#a4c2f4", "#9fc5e8", "#b4a7d6", "#d5a6bd", "#cc4125", "#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6d9eeb", "#6fa8dc", "#8e7cc3", "#c27ba0", "#a61c00", "#cc0000", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3c78d8", "#3d85c6", "#674ea7", "#a64d79", "#85200c", "#990000", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#1155cc", "#0b5394", "#351c75", "#741b47"];
4
- class c {
1
+ import { C as e, r as t, i as r, a as o } from "./ColorPickerPopup-xL8ZUfpB.mjs";
2
+ import { r as a } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
+ import { e as l } from "./HTMLUtils-DTqQzcKR.mjs";
4
+ import { r as s, i } from "./ColorNames-BdsHwA2f.mjs";
5
+ const f = { label: "Text Color", tooltip: "Text Color", resetLabel: "Default", ariaLabelPrefix: "Text color" }, c = { en: f, de: { label: "Textfarbe", tooltip: "Textfarbe", resetLabel: "Standard", ariaLabelPrefix: "Textfarbe" }, es: { label: "Color de texto", tooltip: "Color de texto", resetLabel: "Predeterminado", ariaLabelPrefix: "Color de texto" }, fr: { label: "Couleur du texte", tooltip: "Couleur du texte", resetLabel: "Par défaut", ariaLabelPrefix: "Couleur du texte" }, zh: { label: "文字颜色", tooltip: "文字颜色", resetLabel: "默认", ariaLabelPrefix: "文字颜色" }, ru: { label: "Цвет текста", tooltip: "Цвет текста", resetLabel: "По умолчанию", ariaLabelPrefix: "Цвет текста" }, ar: { label: "لون النص", tooltip: "لون النص", resetLabel: "افتراضي", ariaLabelPrefix: "لون النص" }, hi: { label: "टेक्स्ट रंग", tooltip: "टेक्स्ट रंग", resetLabel: "डिफ़ॉल्ट", ariaLabelPrefix: "टेक्स्ट रंग" } }, b = ["#000000", "#434343", "#666666", "#999999", "#b7b7b7", "#cccccc", "#d9d9d9", "#efefef", "#f3f3f3", "#ffffff", "#980000", "#ff0000", "#ff9900", "#ffff00", "#00ff00", "#00ffff", "#4a86e8", "#0000ff", "#9900ff", "#ff00ff", "#e6b8af", "#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#c9daf8", "#cfe2f3", "#d9d2e9", "#ead1dc", "#dd7e6b", "#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#a4c2f4", "#9fc5e8", "#b4a7d6", "#d5a6bd", "#cc4125", "#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6d9eeb", "#6fa8dc", "#8e7cc3", "#c27ba0", "#a61c00", "#cc0000", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3c78d8", "#3d85c6", "#674ea7", "#a64d79", "#85200c", "#990000", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#1155cc", "#0b5394", "#351c75", "#741b47"];
6
+ class d {
5
7
  id = "textColor";
6
8
  name = "Text Color";
7
9
  priority = 23;
8
10
  config;
9
11
  colors;
10
12
  locale;
11
- constructor(t2) {
12
- this.config = { ...t2 }, this.colors = e(t2?.colors, f, "TextColorPlugin");
13
+ constructor(e2) {
14
+ this.config = { ...e2 }, this.colors = s(e2?.colors, b, "TextColorPlugin");
13
15
  }
14
- init(e2) {
15
- this.locale = l(s, e2, this.config.locale), e2.registerStyleSheet(t), this.registerMarkSpec(e2), this.registerCommands(e2), this.registerToolbarItem(e2);
16
+ init(t2) {
17
+ this.locale = a(c, t2, this.config.locale), t2.registerStyleSheet(e), this.registerMarkSpec(t2), this.registerCommands(t2), this.registerToolbarItem(t2);
16
18
  }
17
19
  registerMarkSpec(e2) {
18
20
  e2.registerMarkSpec({ type: "textColor", rank: 5, attrs: { color: { default: "" } }, toDOM(e3) {
19
- const t2 = document.createElement("span"), o2 = e3.attrs?.color ?? "";
20
- return t2.style.color = o2, t2;
21
- }, toHTMLString: (e3, t2) => `<span style="color: ${String(e3.attrs?.color ?? "")}">${t2}</span>`, parseHTML: [{ tag: "span", getAttrs: (e3) => {
21
+ const t2 = document.createElement("span"), r2 = e3.attrs?.color ?? "";
22
+ return t2.style.color = r2, t2;
23
+ }, toHTMLString: (e3, t2) => {
24
+ const r2 = String(e3.attrs?.color ?? "");
25
+ return r2 && i(r2) ? `<span style="color: ${l(r2)}">${t2}</span>` : t2;
26
+ }, parseHTML: [{ tag: "span", getAttrs: (e3) => {
22
27
  const t2 = e3.style.color;
23
- return !!t2 && { color: t2 };
28
+ return !(!t2 || !i(t2)) && { color: t2 };
24
29
  } }], sanitize: { tags: ["span"] } });
25
30
  }
26
31
  registerCommands(e2) {
27
- e2.registerCommand("removeTextColor", () => o(e2, e2.getState(), "textColor"));
32
+ e2.registerCommand("removeTextColor", () => t(e2, e2.getState(), "textColor"));
28
33
  }
29
34
  registerToolbarItem(e2) {
30
35
  const t2 = ['<svg xmlns="http://www.w3.org/2000/svg"', ' viewBox="0 0 24 24">', '<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>', '<rect x="3" y="19.5" width="18" height="3"', ' rx="0.5" fill="#e53935"/>', "</svg>"].join("");
31
- e2.registerToolbarItem({ id: "textColor", group: "format", icon: t2, label: this.locale.label, tooltip: this.locale.tooltip, command: "removeTextColor", priority: 45, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, t3, o2) => {
32
- a(e3, t3, { markType: "textColor", colors: this.colors, columns: 10, resetLabel: this.locale.resetLabel, resetCommand: "removeTextColor", ariaLabelPrefix: this.locale.ariaLabelPrefix, onClose: o2 });
36
+ e2.registerToolbarItem({ id: "textColor", group: "format", icon: t2, label: this.locale.label, tooltip: this.locale.tooltip, command: "removeTextColor", priority: 45, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, t3, r2) => {
37
+ o(e3, t3, { markType: "textColor", colors: this.colors, columns: 10, resetLabel: this.locale.resetLabel, resetCommand: "removeTextColor", ariaLabelPrefix: this.locale.ariaLabelPrefix, onClose: r2 });
33
38
  }, isActive: (e3) => r(e3, "textColor") });
34
39
  }
35
40
  }
36
41
  export {
37
- s as T,
38
- i as a,
39
- c as b
42
+ d as T,
43
+ c as a,
44
+ f as b
40
45
  };
41
- //# sourceMappingURL=index-DC1EK22F.mjs.map
46
+ //# sourceMappingURL=index-CflvcXSd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CflvcXSd.mjs","sources":["../../src/plugins/text-color/TextColorLocale.ts","../../src/plugins/text-color/TextColorPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the TextColorPlugin. */\n\n// --- Locale Interface ---\n\nexport interface TextColorLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const TEXT_COLOR_LOCALE_EN: TextColorLocale = {\n\tlabel: 'Text Color',\n\ttooltip: 'Text Color',\n\tresetLabel: 'Default',\n\tariaLabelPrefix: 'Text color',\n};\n\n// --- German Locale ---\n\nexport const TEXT_COLOR_LOCALE_DE: TextColorLocale = {\n\tlabel: 'Textfarbe',\n\ttooltip: 'Textfarbe',\n\tresetLabel: 'Standard',\n\tariaLabelPrefix: 'Textfarbe',\n};\n\n// --- Spanish Locale ---\n\nexport const TEXT_COLOR_LOCALE_ES: TextColorLocale = {\n\tlabel: 'Color de texto',\n\ttooltip: 'Color de texto',\n\tresetLabel: 'Predeterminado',\n\tariaLabelPrefix: 'Color de texto',\n};\n\n// --- French Locale ---\n\nexport const TEXT_COLOR_LOCALE_FR: TextColorLocale = {\n\tlabel: 'Couleur du texte',\n\ttooltip: 'Couleur du texte',\n\tresetLabel: 'Par défaut',\n\tariaLabelPrefix: 'Couleur du texte',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const TEXT_COLOR_LOCALE_ZH: TextColorLocale = {\n\tlabel: '文字颜色',\n\ttooltip: '文字颜色',\n\tresetLabel: '默认',\n\tariaLabelPrefix: '文字颜色',\n};\n\n// --- Russian Locale ---\n\nexport const TEXT_COLOR_LOCALE_RU: TextColorLocale = {\n\tlabel: 'Цвет текста',\n\ttooltip: 'Цвет текста',\n\tresetLabel: 'По умолчанию',\n\tariaLabelPrefix: 'Цвет текста',\n};\n\n// --- Arabic Locale ---\n\nexport const TEXT_COLOR_LOCALE_AR: TextColorLocale = {\n\tlabel: 'لون النص',\n\ttooltip: 'لون النص',\n\tresetLabel: 'افتراضي',\n\tariaLabelPrefix: 'لون النص',\n};\n\n// --- Hindi Locale ---\n\nexport const TEXT_COLOR_LOCALE_HI: TextColorLocale = {\n\tlabel: 'टेक्स्ट रंग',\n\ttooltip: 'टेक्स्ट रंग',\n\tresetLabel: 'डिफ़ॉल्ट',\n\tariaLabelPrefix: 'टेक्स्ट रंग',\n};\n\n// --- Locale Map ---\n\nexport const TEXT_COLOR_LOCALES: Record<string, TextColorLocale> = {\n\ten: TEXT_COLOR_LOCALE_EN,\n\tde: TEXT_COLOR_LOCALE_DE,\n\tes: TEXT_COLOR_LOCALE_ES,\n\tfr: TEXT_COLOR_LOCALE_FR,\n\tzh: TEXT_COLOR_LOCALE_ZH,\n\tru: TEXT_COLOR_LOCALE_RU,\n\tar: TEXT_COLOR_LOCALE_AR,\n\thi: TEXT_COLOR_LOCALE_HI,\n};\n","/**\n * TextColorPlugin: registers a text color mark with attrs,\n * toolbar button with a color picker popup, and removeTextColor command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { TEXT_COLOR_LOCALES, type TextColorLocale } from './TextColorLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\ttextColor: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface TextColorConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\t/** When true, a separator is rendered after the textColor toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: TextColorLocale;\n}\n\n// --- Color Palette (Google Docs style: 10 columns x 7 rows) ---\n\nconst COLOR_PALETTE: readonly string[] = [\n\t// Row 1 — dark\n\t'#000000',\n\t'#434343',\n\t'#666666',\n\t'#999999',\n\t'#b7b7b7',\n\t'#cccccc',\n\t'#d9d9d9',\n\t'#efefef',\n\t'#f3f3f3',\n\t'#ffffff',\n\t// Row 2 — vivid\n\t'#980000',\n\t'#ff0000',\n\t'#ff9900',\n\t'#ffff00',\n\t'#00ff00',\n\t'#00ffff',\n\t'#4a86e8',\n\t'#0000ff',\n\t'#9900ff',\n\t'#ff00ff',\n\t// Row 3 — light 3\n\t'#e6b8af',\n\t'#f4cccc',\n\t'#fce5cd',\n\t'#fff2cc',\n\t'#d9ead3',\n\t'#d0e0e3',\n\t'#c9daf8',\n\t'#cfe2f3',\n\t'#d9d2e9',\n\t'#ead1dc',\n\t// Row 4 — light 2\n\t'#dd7e6b',\n\t'#ea9999',\n\t'#f9cb9c',\n\t'#ffe599',\n\t'#b6d7a8',\n\t'#a2c4c9',\n\t'#a4c2f4',\n\t'#9fc5e8',\n\t'#b4a7d6',\n\t'#d5a6bd',\n\t// Row 5 — light 1\n\t'#cc4125',\n\t'#e06666',\n\t'#f6b26b',\n\t'#ffd966',\n\t'#93c47d',\n\t'#76a5af',\n\t'#6d9eeb',\n\t'#6fa8dc',\n\t'#8e7cc3',\n\t'#c27ba0',\n\t// Row 6 — dark 1\n\t'#a61c00',\n\t'#cc0000',\n\t'#e69138',\n\t'#f1c232',\n\t'#6aa84f',\n\t'#45818e',\n\t'#3c78d8',\n\t'#3d85c6',\n\t'#674ea7',\n\t'#a64d79',\n\t// Row 7 — dark 2\n\t'#85200c',\n\t'#990000',\n\t'#b45f06',\n\t'#bf9000',\n\t'#38761d',\n\t'#134f5c',\n\t'#1155cc',\n\t'#0b5394',\n\t'#351c75',\n\t'#741b47',\n];\n\n// --- Plugin ---\n\nexport class TextColorPlugin implements Plugin {\n\treadonly id = 'textColor';\n\treadonly name = 'Text Color';\n\treadonly priority = 23;\n\n\tprivate readonly config: TextColorConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: TextColorLocale;\n\n\tconstructor(config?: Partial<TextColorConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, COLOR_PALETTE, 'TextColorPlugin');\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(TEXT_COLOR_LOCALES, context, this.config.locale);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'textColor',\n\t\t\trank: 5,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tspan.style.color = color;\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return content;\n\t\t\t\treturn `<span style=\"color: ${escapeHTML(color)}\">${content}</span>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.color;\n\t\t\t\t\t\tif (!color || !isValidCSSColor(color)) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeTextColor', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'textColor');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"19.5\" width=\"18\" height=\"3\"',\n\t\t\t' rx=\"0.5\" fill=\"#e53935\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'textColor',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeTextColor',\n\t\t\tpriority: 45,\n\t\t\tpopupType: 'custom',\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'textColor',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeTextColor',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'textColor'),\n\t\t});\n\t}\n}\n"],"names":["TEXT_COLOR_LOCALE_EN","label","tooltip","resetLabel","ariaLabelPrefix","TEXT_COLOR_LOCALES","en","de","es","fr","zh","ru","ar","hi","COLOR_PALETTE","TextColorPlugin","id","name","priority","config","colors","locale","this","resolveColors","context","resolvePluginLocale","registerStyleSheet","COLOR_PICKER_CSS","registerMarkSpec","registerCommands","registerToolbarItem","type","rank","attrs","color","default","mark","span","document","createElement","style","toHTMLString","content","String","isValidCSSColor","escapeHTML","parseHTML","tag","getAttrs","el","sanitize","tags","registerCommand","removeColorMark","getState","icon","join","group","command","popupType","separatorAfter","renderPopup","container","ctx","onClose","renderColorPickerPopup","markType","columns","resetCommand","isActive","state","isColorMarkActive"],"mappings":"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"}
@@ -1,41 +1,46 @@
1
- import { r as e, C as a, a as r, i as t, b as l } from "./ColorValidation-Dyy4Bye8.mjs";
1
+ import { C as e, r, i as a, a as t } from "./ColorPickerPopup-xL8ZUfpB.mjs";
2
2
  import { r as o } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
- const i = { label: "Highlight", tooltip: "Highlight Color", resetLabel: "None", ariaLabelPrefix: "Highlight color" }, s = { en: i, de: { label: "Hervorhebung", tooltip: "Hervorhebungsfarbe", resetLabel: "Keine", ariaLabelPrefix: "Hervorhebungsfarbe" }, es: { label: "Resaltado", tooltip: "Color de resaltado", resetLabel: "Ninguno", ariaLabelPrefix: "Color de resaltado" }, fr: { label: "Surlignage", tooltip: "Couleur de surlignage", resetLabel: "Aucun", ariaLabelPrefix: "Couleur de surlignage" }, zh: { label: "高亮", tooltip: "高亮颜色", resetLabel: "无", ariaLabelPrefix: "高亮颜色" }, ru: { label: "Выделение", tooltip: "Цвет выделения", resetLabel: "Нет", ariaLabelPrefix: "Цвет выделения" }, ar: { label: "تمييز", tooltip: "لون التمييز", resetLabel: "بدون", ariaLabelPrefix: "لون التمييز" }, hi: { label: "हाइलाइट", tooltip: "हाइलाइट रंग", resetLabel: "कोई नहीं", ariaLabelPrefix: "हाइलाइट रंग" } }, f = ["#fff176", "#aed581", "#4dd0e1", "#64b5f6", "#ce93d8", "#f48fb1", "#ffab91", "#ff8a65", "#e6ee9c", "#80cbc4", "#fff9c4", "#dcedc8", "#e0f7fa", "#e3f2fd", "#f3e5f5", "#fce4ec", "#fff3e0", "#fbe9e7", "#f9fbe7", "#e0f2f1", "#fff59d", "#c5e1a5", "#80deea", "#90caf9", "#e1bee7", "#f8bbd0", "#ffcc80", "#ffab91", "#e6ee9c", "#a5d6a7", "#ffee58", "#9ccc65", "#26c6da", "#42a5f5", "#ab47bc", "#ec407a", "#ffa726", "#ff7043", "#d4e157", "#66bb6a", "#ffffff", "#fafafa", "#f5f5f5", "#eeeeee", "#e0e0e0", "#bdbdbd", "#e8eaf6", "#efebe9", "#eceff1", "#fafafa"];
4
- class g {
3
+ import { e as l } from "./HTMLUtils-DTqQzcKR.mjs";
4
+ import { r as i, i as s } from "./ColorNames-BdsHwA2f.mjs";
5
+ const f = { label: "Highlight", tooltip: "Highlight Color", resetLabel: "None", ariaLabelPrefix: "Highlight color" }, g = { en: f, de: { label: "Hervorhebung", tooltip: "Hervorhebungsfarbe", resetLabel: "Keine", ariaLabelPrefix: "Hervorhebungsfarbe" }, es: { label: "Resaltado", tooltip: "Color de resaltado", resetLabel: "Ninguno", ariaLabelPrefix: "Color de resaltado" }, fr: { label: "Surlignage", tooltip: "Couleur de surlignage", resetLabel: "Aucun", ariaLabelPrefix: "Couleur de surlignage" }, zh: { label: "高亮", tooltip: "高亮颜色", resetLabel: "无", ariaLabelPrefix: "高亮颜色" }, ru: { label: "Выделение", tooltip: "Цвет выделения", resetLabel: "Нет", ariaLabelPrefix: "Цвет выделения" }, ar: { label: "تمييز", tooltip: "لون التمييز", resetLabel: "بدون", ariaLabelPrefix: "لون التمييز" }, hi: { label: "हाइलाइट", tooltip: "हाइलाइट रंग", resetLabel: "कोई नहीं", ariaLabelPrefix: "हाइलाइट रंग" } }, c = ["#fff176", "#aed581", "#4dd0e1", "#64b5f6", "#ce93d8", "#f48fb1", "#ffab91", "#ff8a65", "#e6ee9c", "#80cbc4", "#fff9c4", "#dcedc8", "#e0f7fa", "#e3f2fd", "#f3e5f5", "#fce4ec", "#fff3e0", "#fbe9e7", "#f9fbe7", "#e0f2f1", "#fff59d", "#c5e1a5", "#80deea", "#90caf9", "#e1bee7", "#f8bbd0", "#ffcc80", "#ffab91", "#e6ee9c", "#a5d6a7", "#ffee58", "#9ccc65", "#26c6da", "#42a5f5", "#ab47bc", "#ec407a", "#ffa726", "#ff7043", "#d4e157", "#66bb6a", "#ffffff", "#fafafa", "#f5f5f5", "#eeeeee", "#e0e0e0", "#bdbdbd", "#e8eaf6", "#efebe9", "#eceff1", "#fafafa"];
6
+ class h {
5
7
  id = "highlight";
6
8
  name = "Highlight";
7
9
  priority = 24;
8
10
  config;
9
11
  colors;
10
12
  locale;
11
- constructor(a2) {
12
- this.config = { ...a2 }, this.colors = e(a2?.colors, f, "HighlightPlugin");
13
+ constructor(e2) {
14
+ this.config = { ...e2 }, this.colors = i(e2?.colors, c, "HighlightPlugin");
13
15
  }
14
- init(e2) {
15
- this.locale = o(s, e2, this.config.locale), e2.registerStyleSheet(a), this.registerMarkSpec(e2), this.registerCommands(e2), this.registerToolbarItem(e2);
16
+ init(r2) {
17
+ this.locale = o(g, r2, this.config.locale), r2.registerStyleSheet(e), this.registerMarkSpec(r2), this.registerCommands(r2), this.registerToolbarItem(r2);
16
18
  }
17
19
  registerMarkSpec(e2) {
18
20
  e2.registerMarkSpec({ type: "highlight", rank: 4, attrs: { color: { default: "" } }, toDOM(e3) {
19
- const a2 = document.createElement("span"), r2 = e3.attrs?.color ?? "";
20
- return a2.style.backgroundColor = r2, a2;
21
- }, toHTMLString: (e3, a2) => `<span style="background-color: ${String(e3.attrs?.color ?? "")}">${a2}</span>`, parseHTML: [{ tag: "span", getAttrs: (e3) => {
22
- const a2 = e3.style.backgroundColor;
23
- return !!a2 && { color: a2 };
21
+ const r2 = document.createElement("span"), a2 = e3.attrs?.color ?? "";
22
+ return r2.style.backgroundColor = a2, r2;
23
+ }, toHTMLString: (e3, r2) => {
24
+ const a2 = String(e3.attrs?.color ?? "");
25
+ return a2 && s(a2) ? `<span style="background-color: ${l(a2)}">${r2}</span>` : r2;
26
+ }, parseHTML: [{ tag: "span", getAttrs: (e3) => {
27
+ const r2 = e3.style.backgroundColor;
28
+ return !(!r2 || !s(r2)) && { color: r2 };
24
29
  } }], sanitize: { tags: ["span"] } });
25
30
  }
26
31
  registerCommands(e2) {
27
32
  e2.registerCommand("removeHighlight", () => r(e2, e2.getState(), "highlight"));
28
33
  }
29
34
  registerToolbarItem(e2) {
30
- const a2 = ['<svg xmlns="http://www.w3.org/2000/svg"', ' viewBox="0 0 24 24">', '<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>', '<rect x="3" y="17" width="18" height="6"', ' rx="0.5" fill="#fff176"/>', "</svg>"].join("");
31
- e2.registerToolbarItem({ id: "highlight", group: "format", icon: a2, label: this.locale.label, tooltip: this.locale.tooltip, command: "removeHighlight", priority: 46, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, a3, r2) => {
32
- l(e3, a3, { markType: "highlight", colors: this.colors, columns: 10, resetLabel: this.locale.resetLabel, resetCommand: "removeHighlight", ariaLabelPrefix: this.locale.ariaLabelPrefix, onClose: r2 });
33
- }, isActive: (e3) => t(e3, "highlight") });
35
+ const r2 = ['<svg xmlns="http://www.w3.org/2000/svg"', ' viewBox="0 0 24 24">', '<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>', '<rect x="3" y="17" width="18" height="6"', ' rx="0.5" fill="#fff176"/>', "</svg>"].join("");
36
+ e2.registerToolbarItem({ id: "highlight", group: "format", icon: r2, label: this.locale.label, tooltip: this.locale.tooltip, command: "removeHighlight", priority: 46, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, r3, a2) => {
37
+ t(e3, r3, { markType: "highlight", colors: this.colors, columns: 10, resetLabel: this.locale.resetLabel, resetCommand: "removeHighlight", ariaLabelPrefix: this.locale.ariaLabelPrefix, onClose: a2 });
38
+ }, isActive: (e3) => a(e3, "highlight") });
34
39
  }
35
40
  }
36
41
  export {
37
- s as H,
38
- i as a,
39
- g as b
42
+ h as H,
43
+ g as a,
44
+ f as b
40
45
  };
41
- //# sourceMappingURL=index-o6hDR07y.mjs.map
46
+ //# sourceMappingURL=index-CoeD4T9-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CoeD4T9-.mjs","sources":["../../src/plugins/highlight/HighlightLocale.ts","../../src/plugins/highlight/HighlightPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the HighlightPlugin. */\n\n// --- Locale Interface ---\n\nexport interface HighlightLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const HIGHLIGHT_LOCALE_EN: HighlightLocale = {\n\tlabel: 'Highlight',\n\ttooltip: 'Highlight Color',\n\tresetLabel: 'None',\n\tariaLabelPrefix: 'Highlight color',\n};\n\n// --- German Locale ---\n\nexport const HIGHLIGHT_LOCALE_DE: HighlightLocale = {\n\tlabel: 'Hervorhebung',\n\ttooltip: 'Hervorhebungsfarbe',\n\tresetLabel: 'Keine',\n\tariaLabelPrefix: 'Hervorhebungsfarbe',\n};\n\n// --- Spanish Locale ---\n\nexport const HIGHLIGHT_LOCALE_ES: HighlightLocale = {\n\tlabel: 'Resaltado',\n\ttooltip: 'Color de resaltado',\n\tresetLabel: 'Ninguno',\n\tariaLabelPrefix: 'Color de resaltado',\n};\n\n// --- French Locale ---\n\nexport const HIGHLIGHT_LOCALE_FR: HighlightLocale = {\n\tlabel: 'Surlignage',\n\ttooltip: 'Couleur de surlignage',\n\tresetLabel: 'Aucun',\n\tariaLabelPrefix: 'Couleur de surlignage',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const HIGHLIGHT_LOCALE_ZH: HighlightLocale = {\n\tlabel: '高亮',\n\ttooltip: '高亮颜色',\n\tresetLabel: '无',\n\tariaLabelPrefix: '高亮颜色',\n};\n\n// --- Russian Locale ---\n\nexport const HIGHLIGHT_LOCALE_RU: HighlightLocale = {\n\tlabel: 'Выделение',\n\ttooltip: 'Цвет выделения',\n\tresetLabel: 'Нет',\n\tariaLabelPrefix: 'Цвет выделения',\n};\n\n// --- Arabic Locale ---\n\nexport const HIGHLIGHT_LOCALE_AR: HighlightLocale = {\n\tlabel: 'تمييز',\n\ttooltip: 'لون التمييز',\n\tresetLabel: 'بدون',\n\tariaLabelPrefix: 'لون التمييز',\n};\n\n// --- Hindi Locale ---\n\nexport const HIGHLIGHT_LOCALE_HI: HighlightLocale = {\n\tlabel: 'हाइलाइट',\n\ttooltip: 'हाइलाइट रंग',\n\tresetLabel: 'कोई नहीं',\n\tariaLabelPrefix: 'हाइलाइट रंग',\n};\n\n// --- Locale Map ---\n\nexport const HIGHLIGHT_LOCALES: Record<string, HighlightLocale> = {\n\ten: HIGHLIGHT_LOCALE_EN,\n\tde: HIGHLIGHT_LOCALE_DE,\n\tes: HIGHLIGHT_LOCALE_ES,\n\tfr: HIGHLIGHT_LOCALE_FR,\n\tzh: HIGHLIGHT_LOCALE_ZH,\n\tru: HIGHLIGHT_LOCALE_RU,\n\tar: HIGHLIGHT_LOCALE_AR,\n\thi: HIGHLIGHT_LOCALE_HI,\n};\n","/**\n * HighlightPlugin: registers a highlight (background-color) mark with attrs,\n * toolbar button with a color picker popup, and removeHighlight command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { isValidCSSColor, resolveColors } from '../shared/ColorValidation.js';\nimport { HIGHLIGHT_LOCALES, type HighlightLocale } from './HighlightLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\thighlight: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface HighlightConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\t/** When true, a separator is rendered after the highlight toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: HighlightLocale;\n}\n\n// --- Color Palette (Highlight-optimized: 10 columns x 5 rows) ---\n\nconst HIGHLIGHT_PALETTE: readonly string[] = [\n\t// Row 1 — Classic highlighter colors (bright, vivid)\n\t'#fff176',\n\t'#aed581',\n\t'#4dd0e1',\n\t'#64b5f6',\n\t'#ce93d8',\n\t'#f48fb1',\n\t'#ffab91',\n\t'#ff8a65',\n\t'#e6ee9c',\n\t'#80cbc4',\n\t// Row 2 — Light pastels\n\t'#fff9c4',\n\t'#dcedc8',\n\t'#e0f7fa',\n\t'#e3f2fd',\n\t'#f3e5f5',\n\t'#fce4ec',\n\t'#fff3e0',\n\t'#fbe9e7',\n\t'#f9fbe7',\n\t'#e0f2f1',\n\t// Row 3 — Medium pastels\n\t'#fff59d',\n\t'#c5e1a5',\n\t'#80deea',\n\t'#90caf9',\n\t'#e1bee7',\n\t'#f8bbd0',\n\t'#ffcc80',\n\t'#ffab91',\n\t'#e6ee9c',\n\t'#a5d6a7',\n\t// Row 4 — Bold pastels\n\t'#ffee58',\n\t'#9ccc65',\n\t'#26c6da',\n\t'#42a5f5',\n\t'#ab47bc',\n\t'#ec407a',\n\t'#ffa726',\n\t'#ff7043',\n\t'#d4e157',\n\t'#66bb6a',\n\t// Row 5 — Grays and neutral highlights\n\t'#ffffff',\n\t'#fafafa',\n\t'#f5f5f5',\n\t'#eeeeee',\n\t'#e0e0e0',\n\t'#bdbdbd',\n\t'#e8eaf6',\n\t'#efebe9',\n\t'#eceff1',\n\t'#fafafa',\n];\n\n// --- Plugin ---\n\nexport class HighlightPlugin implements Plugin {\n\treadonly id = 'highlight';\n\treadonly name = 'Highlight';\n\treadonly priority = 24;\n\n\tprivate readonly config: HighlightConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: HighlightLocale;\n\n\tconstructor(config?: Partial<HighlightConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, HIGHLIGHT_PALETTE, 'HighlightPlugin');\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(HIGHLIGHT_LOCALES, context, this.config.locale);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'highlight',\n\t\t\trank: 4,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tspan.style.backgroundColor = color;\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\tif (!color || !isValidCSSColor(color)) return content;\n\t\t\t\treturn `<span style=\"background-color: ${escapeHTML(color)}\">${content}</span>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.backgroundColor;\n\t\t\t\t\t\tif (!color || !isValidCSSColor(color)) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeHighlight', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'highlight');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"17\" width=\"18\" height=\"6\"',\n\t\t\t' rx=\"0.5\" fill=\"#fff176\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'highlight',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeHighlight',\n\t\t\tpriority: 46,\n\t\t\tpopupType: 'custom',\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'highlight',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeHighlight',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'highlight'),\n\t\t});\n\t}\n}\n"],"names":["HIGHLIGHT_LOCALE_EN","label","tooltip","resetLabel","ariaLabelPrefix","HIGHLIGHT_LOCALES","en","de","es","fr","zh","ru","ar","hi","HIGHLIGHT_PALETTE","HighlightPlugin","id","name","priority","config","colors","locale","this","resolveColors","context","resolvePluginLocale","registerStyleSheet","COLOR_PICKER_CSS","registerMarkSpec","registerCommands","registerToolbarItem","type","rank","attrs","color","default","mark","span","document","createElement","style","backgroundColor","toHTMLString","content","String","isValidCSSColor","escapeHTML","parseHTML","tag","getAttrs","el","sanitize","tags","registerCommand","removeColorMark","getState","icon","join","group","command","popupType","separatorAfter","renderPopup","container","ctx","onClose","renderColorPickerPopup","markType","columns","resetCommand","isActive","state","isColorMarkActive"],"mappings":";;;;AAaO,MAAMA,IAAuC,EACnDC,OAAO,aACPC,SAAS,mBACTC,YAAY,QACZC,iBAAiB,kBAAA,GAoELC,IAAqD,EACjEC,IAAIN,GACJO,IAjEmD,EACnDN,OAAO,gBACPC,SAAS,sBACTC,YAAY,SACZC,iBAAiB,wBA8DjBI,IAzDmD,EACnDP,OAAO,aACPC,SAAS,sBACTC,YAAY,WACZC,iBAAiB,qBAAA,GAsDjBK,IAjDmD,EACnDR,OAAO,cACPC,SAAS,yBACTC,YAAY,SACZC,iBAAiB,2BA8CjBM,IAzCmD,EACnDT,OAAO,MACPC,SAAS,QACTC,YAAY,KACZC,iBAAiB,OAAA,GAsCjBO,IAjCmD,EACnDV,OAAO,aACPC,SAAS,kBACTC,YAAY,OACZC,iBAAiB,oBA8BjBQ,IAzBmD,EACnDX,OAAO,SACPC,SAAS,eACTC,YAAY,QACZC,iBAAiB,cAAA,GAsBjBS,IAjBmD,EACnDZ,OAAO,WACPC,SAAS,eACTC,YAAY,YACZC,iBAAiB,mBCxCZU,IAAuC,CAE5C,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA;AAKM,MAAMC,EAAAA;AAAAA,EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACAC;AAAAA,EACTC;AAAAA,EAER,YAAYF;AACXG,SAAKH,SAAS,KAAKA,GAAAA,GACnBG,KAAKF,SAASG,EAAcJ,IAAQC,QAAQN,GAAmB,iBAAA;AAAA,EAChE;AAAA,EAEA,KAAKU;AACJF,SAAKD,SAASI,EAAoBpB,GAAmBmB,IAASF,KAAKH,OAAOE,SAE1EG,GAAQE,mBAAmBC,IAC3BL,KAAKM,iBAAiBJ,KACtBF,KAAKO,iBAAiBL,KACtBF,KAAKQ,oBAAoBN;EAC1B;AAAA,EAEQ,iBAAiBA,IAAAA;AACxBA,IAAAA,GAAQI,iBAAiB,EACxBG,MAAM,aACNC,MAAM,GACNC,OAAO,EACNC,OAAO,EAAEC,SAAS,QAEnB,MAAMC;AACL,YAAMC,KAAOC,SAASC,cAAc,MAAA,GAC9BL,KAAQE,GAAKH,OAAOC,SAAS;AAEnC,aADAG,GAAKG,MAAMC,kBAAkBP,IACtBG;AAAAA,IACR,GACAK,cAAc,CAACN,IAAMO,OAAAA;AACpB,YAAMT,KAAgBU,OAAOR,GAAKH,OAAOC,SAAS,EAAA;AAClD,aAAKA,MAAUW,EAAgBX,MACxB,kCAAkCY,EAAWZ,EAAAA,CAAAA,KAAWS,EAAAA,YADjBA;AAAAA,OAG/CI,WAAW,CACV,EACCC,KAAK,QACLC,UAAWC,CAAAA,OAAAA;AACV,YAAMhB,KAAgBgB,GAAGV,MAAMC;AAC/B,aAAA,EAAA,CAAKP,MAAAA,CAAUW,EAAgBX,EAAAA,MACxB,EAAEA;UAIZiB,UAAU,EAAEC,MAAM,CAAC;EAErB;AAAA,EAEQ,iBAAiB5B,IAAAA;AACxBA,IAAAA,GAAQ6B,gBAAgB,mBAAmB,MACnCC,EAAgB9B,IAASA,GAAQ+B,YAAY,WAAA,CAAA;AAAA,EAEtD;AAAA,EAEQ,oBAAoB/B,IAAAA;AAC3B,UAEMgC,KAAe,CACpB,2CACA,yBACA,iGACA,4CACA,8BACA,UACCC,KAAK,EAAA;AAEPjC,IAAAA,GAAQM,oBAAoB,EAC3Bd,IAAI,aACJ0C,OAAO,UACPF,MAAAA,IACAvD,OAAOqB,KAAKD,OAAOpB,OACnBC,SAASoB,KAAKD,OAAOnB,SACrByD,SAAS,mBACTzC,UAAU,IACV0C,WAAW,UACXC,gBAAgBvC,KAAKH,OAAO0C,gBAC5BC,aAAa,CAACC,IAAWC,IAAKC,OAAAA;AAC7BC,QAAuBH,IAAWC,IAAK,EACtCG,UAAU,aACV/C,QAAQE,KAAKF,QACbgD,SAAS,IACTjE,YAAYmB,KAAKD,OAAOlB,YACxBkE,cAAc,mBACdjE,iBAAiBkB,KAAKD,OAAOjB,iBAC7B6D,SAAAA,GAAAA,CAAAA;AAAAA,IAAAA,GAGFK,UAAWC,CAAAA,OAAuBC,EAAkBD,IAAO,WAAA,EAAA,CAAA;AAAA,EAE7D;AAAA;"}