@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,11 +1,11 @@
1
1
  import { r as t } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
- import { a as e } from "./AttrRegistry-D-przlzb.mjs";
3
- import { p as n, b as i } from "./Document-CI3iCwEP.mjs";
2
+ import { a as e } from "./AttrRegistry-I-VdmRnN.mjs";
3
+ import { p as n, e as i } from "./Document-CuwE73FF.mjs";
4
4
  import { c as s } from "./NodeSpec-NZVvcCuH.mjs";
5
- import { i as r, a as l, c } from "./Selection-D5ZjXoB7.mjs";
6
- import { n as o, b as a } from "./TypeBrands-C09nE2qO.mjs";
7
- const d = { bulletList: "Bullet List", numberedList: "Numbered List", checklist: "Checklist" }, h = { en: d, de: { bulletList: "Aufzählung", numberedList: "Nummerierte Liste", checklist: "Checkliste" }, es: { bulletList: "Lista con viñetas", numberedList: "Lista numerada", checklist: "Lista de verificación" }, fr: { bulletList: "Liste à puces", numberedList: "Liste numérotée", checklist: "Liste de contrôle" }, zh: { bulletList: "无序列表", numberedList: "有序列表", checklist: "清单" }, ru: { bulletList: "Маркированный список", numberedList: "Нумерованный список", checklist: "Чек-лист" }, ar: { bulletList: "قائمة نقطية", numberedList: "قائمة مرقمة", checklist: "قائمة تحقق" }, hi: { bulletList: "बुलेट सूची", numberedList: "क्रमांकित सूची", checklist: "चेकलिस्ट" } }, u = { types: ["bullet", "ordered", "checklist"], maxIndent: 4 }, p = [{ type: "bullet", label: "Bullet List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></svg>', inputPattern: /^[-*] $/, inputPrefix: "- " }, { type: "ordered", label: "Numbered List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></svg>', inputPattern: /^\d+\. $/, inputPrefix: "1. " }, { type: "checklist", label: "Checklist", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z"/></svg>', inputPattern: /^\[[ x]] $/, inputPrefix: "[ ] " }];
8
- class m {
5
+ import { i as l, a as c, b as r, c as o } from "./Selection-DmFDwiPJ.mjs";
6
+ import { n as a, b as d } from "./TypeBrands-C09nE2qO.mjs";
7
+ const h = { bulletList: "Bullet List", numberedList: "Numbered List", checklist: "Checklist" }, u = { en: h, de: { bulletList: "Aufzählung", numberedList: "Nummerierte Liste", checklist: "Checkliste" }, es: { bulletList: "Lista con viñetas", numberedList: "Lista numerada", checklist: "Lista de verificación" }, fr: { bulletList: "Liste à puces", numberedList: "Liste numérotée", checklist: "Liste de contrôle" }, zh: { bulletList: "无序列表", numberedList: "有序列表", checklist: "清单" }, ru: { bulletList: "Маркированный список", numberedList: "Нумерованный список", checklist: "Чек-лист" }, ar: { bulletList: "قائمة نقطية", numberedList: "قائمة مرقمة", checklist: "قائمة تحقق" }, hi: { bulletList: "बुलेट सूची", numberedList: "क्रमांकित सूची", checklist: "चेकलिस्ट" } }, p = { types: ["bullet", "ordered", "checklist"], maxIndent: 4 }, m = [{ type: "bullet", label: "Bullet List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z"/></svg>', inputPattern: /^[-*] $/, inputPrefix: "- " }, { type: "ordered", label: "Numbered List", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z"/></svg>', inputPattern: /^\d+\. $/, inputPrefix: "1. " }, { type: "checklist", label: "Checklist", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z"/></svg>', inputPattern: /^\[[ x]] $/, inputPrefix: "[ ] " }];
8
+ class g {
9
9
  id = "list";
10
10
  name = "List";
11
11
  priority = 35;
@@ -14,10 +14,10 @@ class m {
14
14
  context = null;
15
15
  checkboxClickHandler = null;
16
16
  constructor(t2) {
17
- this.config = { ...u, ...t2 };
17
+ this.config = { ...p, ...t2 };
18
18
  }
19
19
  init(e2) {
20
- this.context = e2, this.locale = t(h, e2, this.config.locale), e2.registerStyleSheet(`
20
+ this.context = e2, this.locale = t(u, e2, this.config.locale), e2.registerStyleSheet(`
21
21
  /* List Wrappers — suppress native markers, we use ::before pseudo-elements */
22
22
  .notectl-list {
23
23
  list-style: none;
@@ -87,8 +87,8 @@ class m {
87
87
  }
88
88
  registerNodeSpec(t2) {
89
89
  t2.registerNodeSpec({ type: "list_item", group: "block", content: { allow: ["text"] }, attrs: { listType: { default: "bullet" }, indent: { default: 0 }, checked: { default: false } }, toDOM(t3) {
90
- const e2 = t3.attrs?.listType ?? "bullet", n2 = t3.attrs?.indent ?? 0, i2 = t3.attrs?.checked ?? false, r2 = s("li", t3.id);
91
- return r2.setAttribute("role", "listitem"), r2.setAttribute("data-list-type", e2), r2.setAttribute("data-indent", String(n2)), r2.className = `notectl-list-item notectl-list-item--${e2}`, n2 > 0 && (r2.style.marginLeft = 24 * n2 + "px"), "checklist" === e2 && (r2.setAttribute("data-checked", String(i2)), r2.setAttribute("aria-checked", String(i2))), r2.setAttribute("aria-level", String(n2 + 1)), r2;
90
+ const e2 = t3.attrs?.listType ?? "bullet", n2 = t3.attrs?.indent ?? 0, i2 = t3.attrs?.checked ?? false, l2 = s("li", t3.id);
91
+ return l2.setAttribute("role", "listitem"), l2.setAttribute("data-list-type", e2), l2.setAttribute("data-indent", String(n2)), l2.className = `notectl-list-item notectl-list-item--${e2}`, n2 > 0 && (l2.style.marginLeft = 24 * n2 + "px"), "checklist" === e2 && (l2.setAttribute("data-checked", String(i2)), l2.setAttribute("aria-checked", String(i2))), l2.setAttribute("aria-level", String(n2 + 1)), l2;
92
92
  }, wrapper(t3) {
93
93
  const e2 = t3.attrs?.listType ?? "bullet";
94
94
  return { tag: "ordered" === e2 ? "ol" : "ul", key: `list-${e2}`, className: `notectl-list notectl-list--${e2}`, attrs: { role: "list" } };
@@ -105,13 +105,13 @@ class m {
105
105
  registerInputRules(t2) {
106
106
  const e2 = this.getEnabledTypes();
107
107
  for (const n2 of e2) t2.registerInputRule({ pattern: n2.inputPattern, handler: (t3, e3, i2, s2) => {
108
- const a2 = t3.selection;
109
- if (r(a2)) return null;
110
- if (!l(a2)) return null;
111
- const d2 = t3.getBlock(a2.anchor.blockId);
112
- if (!d2 || "paragraph" !== d2.type) return null;
113
- const h2 = e3[0] ?? "", u2 = h2.length, p2 = { listType: n2.type, indent: 0 };
114
- return "checklist" === n2.type && (p2.checked = h2.includes("[x]")), t3.transaction("input").deleteTextAt(a2.anchor.blockId, i2, i2 + u2).setBlockType(a2.anchor.blockId, o("list_item"), p2).setSelection(c(a2.anchor.blockId, 0)).build();
108
+ const d2 = t3.selection;
109
+ if (l(d2) || c(d2)) return null;
110
+ if (!r(d2)) return null;
111
+ const h2 = t3.getBlock(d2.anchor.blockId);
112
+ if (!h2 || "paragraph" !== h2.type) return null;
113
+ const u2 = e3[0] ?? "", p2 = u2.length, m2 = { listType: n2.type, indent: 0 };
114
+ return "checklist" === n2.type && (m2.checked = u2.includes("[x]")), t3.transaction("input").deleteTextAt(d2.anchor.blockId, i2, i2 + p2).setBlockType(d2.anchor.blockId, a("list_item"), m2).setSelection(o(d2.anchor.blockId, 0)).build();
115
115
  } });
116
116
  }
117
117
  getListLabel(t2) {
@@ -123,71 +123,71 @@ class m {
123
123
  }
124
124
  toggleList(t2, n2) {
125
125
  const i2 = t2.getState(), s2 = i2.selection;
126
- if (r(s2)) return false;
127
- const l2 = i2.getBlock(s2.anchor.blockId);
128
- if (!l2) return false;
129
- if ("list_item" === l2.type && l2.attrs?.listType === n2) {
130
- const e2 = i2.transaction("command").setBlockType(s2.anchor.blockId, o("paragraph")).setSelection(s2).build();
126
+ if (l(s2) || c(s2)) return false;
127
+ const r2 = i2.getBlock(s2.anchor.blockId);
128
+ if (!r2) return false;
129
+ if ("list_item" === r2.type && r2.attrs?.listType === n2) {
130
+ const e2 = i2.transaction("command").setBlockType(s2.anchor.blockId, a("paragraph")).setSelection(s2).build();
131
131
  return t2.dispatch(e2), true;
132
132
  }
133
- const c2 = { listType: n2, indent: e(l2, "list_item") ? l2.attrs.indent : 0 };
134
- "checklist" === n2 && (c2.checked = false);
135
- const a2 = i2.transaction("command").setBlockType(s2.anchor.blockId, o("list_item"), c2).setSelection(s2).build();
136
- return t2.dispatch(a2), true;
133
+ const o2 = { listType: n2, indent: e(r2, "list_item") ? r2.attrs.indent : 0 };
134
+ "checklist" === n2 && (o2.checked = false);
135
+ const d2 = i2.transaction("command").setBlockType(s2.anchor.blockId, a("list_item"), o2).setSelection(s2).build();
136
+ return t2.dispatch(d2), true;
137
137
  }
138
138
  indent(t2) {
139
139
  const n2 = t2.getState();
140
- if (r(n2.selection)) return false;
140
+ if (l(n2.selection) || c(n2.selection)) return false;
141
141
  const i2 = n2.getBlock(n2.selection.anchor.blockId);
142
142
  return !(!i2 || !e(i2, "list_item")) && !(i2.attrs.indent >= this.config.maxIndent) && this.setIndent(t2, n2, i2.attrs.indent + 1);
143
143
  }
144
144
  outdent(t2) {
145
145
  const n2 = t2.getState();
146
- if (r(n2.selection)) return false;
146
+ if (l(n2.selection) || c(n2.selection)) return false;
147
147
  const i2 = n2.getBlock(n2.selection.anchor.blockId);
148
148
  return !(!i2 || !e(i2, "list_item")) && !(i2.attrs.indent <= 0) && this.setIndent(t2, n2, i2.attrs.indent - 1);
149
149
  }
150
150
  setIndent(t2, e2, n2) {
151
151
  const i2 = e2.selection;
152
- if (r(i2)) return false;
152
+ if (l(i2) || c(i2)) return false;
153
153
  const s2 = e2.getBlock(i2.anchor.blockId);
154
154
  if (!s2) return false;
155
- const l2 = { ...s2.attrs, indent: n2 }, c2 = e2.transaction("command").setBlockType(i2.anchor.blockId, o("list_item"), l2).setSelection(i2).build();
156
- return t2.dispatch(c2), true;
155
+ const r2 = { ...s2.attrs, indent: n2 }, o2 = e2.transaction("command").setBlockType(i2.anchor.blockId, a("list_item"), r2).setSelection(i2).build();
156
+ return t2.dispatch(o2), true;
157
157
  }
158
158
  toggleChecked(t2, e2) {
159
159
  if (t2.isReadOnly() && !this.config.interactiveCheckboxes) return false;
160
- const n2 = t2.getState(), i2 = e2 ?? (r(n2.selection) ? null : n2.selection.anchor.blockId);
160
+ const n2 = t2.getState(), i2 = e2 ?? (l(n2.selection) || c(n2.selection) ? null : n2.selection.anchor.blockId);
161
161
  if (!i2) return false;
162
162
  const s2 = n2.getBlock(i2);
163
163
  if (!s2 || "list_item" !== s2.type || "checklist" !== s2.attrs?.listType) return false;
164
- const l2 = !s2.attrs?.checked, c2 = { ...s2.attrs, checked: l2 }, a2 = n2.transaction("command").setBlockType(i2, o("list_item"), c2).setSelection(n2.selection).build();
165
- return t2.dispatch(a2), true;
164
+ const r2 = !s2.attrs?.checked, o2 = { ...s2.attrs, checked: r2 }, d2 = n2.transaction("command").setBlockType(i2, a("list_item"), o2).setSelection(n2.selection).build();
165
+ return t2.dispatch(d2), true;
166
166
  }
167
167
  handleBackspace(t2) {
168
168
  const e2 = t2.getState(), n2 = e2.selection;
169
- if (r(n2)) return false;
170
- if (!l(n2)) return false;
169
+ if (l(n2) || c(n2)) return false;
170
+ if (!r(n2)) return false;
171
171
  const i2 = e2.getBlock(n2.anchor.blockId);
172
172
  if (!i2 || "list_item" !== i2.type) return false;
173
173
  if (0 !== n2.anchor.offset) return false;
174
- const s2 = e2.transaction("input").setBlockType(n2.anchor.blockId, o("paragraph")).setSelection(n2).build();
174
+ const s2 = e2.transaction("input").setBlockType(n2.anchor.blockId, a("paragraph")).setSelection(n2).build();
175
175
  return t2.dispatch(s2), true;
176
176
  }
177
177
  handleEnter(t2) {
178
- const s2 = t2.getState(), a2 = s2.selection;
179
- if (r(a2)) return false;
180
- if (!l(a2)) return false;
181
- const d2 = s2.getBlock(a2.anchor.blockId);
182
- if (!d2 || "list_item" !== d2.type) return false;
183
- if ("" === n(d2)) {
184
- const e2 = s2.transaction("input").setBlockType(a2.anchor.blockId, o("paragraph")).setSelection(a2).build();
178
+ const s2 = t2.getState(), d2 = s2.selection;
179
+ if (l(d2) || c(d2)) return false;
180
+ if (!r(d2)) return false;
181
+ const h2 = s2.getBlock(d2.anchor.blockId);
182
+ if (!h2 || "list_item" !== h2.type) return false;
183
+ if ("" === n(h2)) {
184
+ const e2 = s2.transaction("input").setBlockType(d2.anchor.blockId, a("paragraph")).setSelection(d2).build();
185
185
  return t2.dispatch(e2), true;
186
186
  }
187
- const h2 = i(), u2 = { listType: e(d2, "list_item") ? d2.attrs.listType : "bullet", indent: e(d2, "list_item") ? d2.attrs.indent : 0 };
188
- "checklist" === u2.listType && (u2.checked = false);
189
- const p2 = s2.transaction("input").splitBlock(a2.anchor.blockId, a2.anchor.offset, h2).setBlockType(h2, o("list_item"), u2).setSelection(c(h2, 0)).build();
190
- return t2.dispatch(p2), true;
187
+ const u2 = i(), p2 = { listType: e(h2, "list_item") ? h2.attrs.listType : "bullet", indent: e(h2, "list_item") ? h2.attrs.indent : 0 };
188
+ "checklist" === p2.listType && (p2.checked = false);
189
+ const m2 = s2.transaction("input").splitBlock(d2.anchor.blockId, d2.anchor.offset, u2).setBlockType(u2, a("list_item"), p2).setSelection(o(u2, 0)).build();
190
+ return t2.dispatch(m2), true;
191
191
  }
192
192
  registerCheckboxClickHandler(t2) {
193
193
  this.config.types.includes("checklist") && (this.checkboxClickHandler = (e2) => {
@@ -199,22 +199,22 @@ class m {
199
199
  const s2 = i2.getBoundingClientRect();
200
200
  if (e2.clientX - s2.left >= 24) return;
201
201
  e2.preventDefault();
202
- const r2 = i2.getAttribute("data-block-id");
203
- r2 && this.toggleChecked(t2, a(r2));
202
+ const l2 = i2.getAttribute("data-block-id");
203
+ l2 && this.toggleChecked(t2, d(l2));
204
204
  }, t2.getContainer().addEventListener("mousedown", this.checkboxClickHandler));
205
205
  }
206
206
  isListActive(t2, e2) {
207
- if (r(t2.selection)) return false;
207
+ if (l(t2.selection) || c(t2.selection)) return false;
208
208
  const n2 = t2.getBlock(t2.selection.anchor.blockId);
209
209
  return "list_item" === n2?.type && n2.attrs?.listType === e2;
210
210
  }
211
211
  getEnabledTypes() {
212
- return p.filter((t2) => this.config.types.includes(t2.type));
212
+ return m.filter((t2) => this.config.types.includes(t2.type));
213
213
  }
214
214
  }
215
215
  export {
216
- h as L,
217
- d as a,
218
- m as b
216
+ g as L,
217
+ u as a,
218
+ h as b
219
219
  };
220
- //# sourceMappingURL=index-DA8TG2S8.mjs.map
220
+ //# sourceMappingURL=index-D0s0Q8Wc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D0s0Q8Wc.mjs","sources":["../../src/editor/styles/list.ts","../../src/plugins/list/ListLocale.ts","../../src/plugins/list/ListPlugin.ts"],"sourcesContent":["/** Width of the list marker / checkbox area in pixels. */\nexport const LIST_MARKER_WIDTH = 24;\n\n/** List styles — bullet, ordered, checklist items. */\nexport const LIST_CSS = `\n/* List Wrappers — suppress native markers, we use ::before pseudo-elements */\n.notectl-list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/* Ordered List — each <ol> wrapper resets the counter */\n.notectl-list--ordered {\n\tcounter-reset: notectl-ordered;\n}\n\n/* List Items */\n.notectl-list-item {\n\tmargin: 0;\n\tpadding: 2px 0 2px ${LIST_MARKER_WIDTH}px;\n\tmin-height: 1.6em;\n\tposition: relative;\n}\n\n.notectl-list-item::before {\n\tposition: absolute;\n\tleft: 0;\n\tdisplay: inline-block;\n\twidth: ${LIST_MARKER_WIDTH}px;\n\ttext-align: center;\n}\n\n/* Bullet List */\n.notectl-list-item--bullet::before {\n\tcontent: '\\\\2022';\n\tcolor: var(--notectl-fg);\n}\n\n/* Ordered List — counter increment per item */\n.notectl-list-item--ordered {\n\tcounter-increment: notectl-ordered;\n}\n\n.notectl-list-item--ordered::before {\n\tcontent: counter(notectl-ordered) '.';\n\tcolor: var(--notectl-fg);\n\tfont-size: 14px;\n}\n\n/* Checklist */\n.notectl-list-item--checklist::before {\n\tcontent: '\\\\2610';\n\tfont-size: 16px;\n\tcolor: var(--notectl-fg-muted);\n\tcursor: pointer;\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"]::before {\n\tcontent: '\\\\2611';\n\tcolor: var(--notectl-success);\n}\n\n.notectl-list-item--checklist[data-checked=\"true\"] {\n\tcolor: var(--notectl-fg-muted);\n\ttext-decoration: line-through;\n}\n`;\n","/**\n * Locale interface and default English locale for the ListPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface ListLocale {\n\treadonly bulletList: string;\n\treadonly numberedList: string;\n\treadonly checklist: string;\n}\n\n// --- Default English Locale ---\n\nexport const LIST_LOCALE_EN: ListLocale = {\n\tbulletList: 'Bullet List',\n\tnumberedList: 'Numbered List',\n\tchecklist: 'Checklist',\n};\n\n// --- German Locale ---\n\nexport const LIST_LOCALE_DE: ListLocale = {\n\tbulletList: 'Aufzählung',\n\tnumberedList: 'Nummerierte Liste',\n\tchecklist: 'Checkliste',\n};\n\n// --- Spanish Locale ---\n\nexport const LIST_LOCALE_ES: ListLocale = {\n\tbulletList: 'Lista con viñetas',\n\tnumberedList: 'Lista numerada',\n\tchecklist: 'Lista de verificación',\n};\n\n// --- French Locale ---\n\nexport const LIST_LOCALE_FR: ListLocale = {\n\tbulletList: 'Liste à puces',\n\tnumberedList: 'Liste numérotée',\n\tchecklist: 'Liste de contrôle',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const LIST_LOCALE_ZH: ListLocale = {\n\tbulletList: '无序列表',\n\tnumberedList: '有序列表',\n\tchecklist: '清单',\n};\n\n// --- Russian Locale ---\n\nexport const LIST_LOCALE_RU: ListLocale = {\n\tbulletList: 'Маркированный список',\n\tnumberedList: 'Нумерованный список',\n\tchecklist: 'Чек-лист',\n};\n\n// --- Arabic Locale ---\n\nexport const LIST_LOCALE_AR: ListLocale = {\n\tbulletList: 'قائمة نقطية',\n\tnumberedList: 'قائمة مرقمة',\n\tchecklist: 'قائمة تحقق',\n};\n\n// --- Hindi Locale ---\n\nexport const LIST_LOCALE_HI: ListLocale = {\n\tbulletList: 'बुलेट सूची',\n\tnumberedList: 'क्रमांकित सूची',\n\tchecklist: 'चेकलिस्ट',\n};\n\n// --- Locale Map ---\n\nexport const LIST_LOCALES: Record<string, ListLocale> = {\n\ten: LIST_LOCALE_EN,\n\tde: LIST_LOCALE_DE,\n\tes: LIST_LOCALE_ES,\n\tfr: LIST_LOCALE_FR,\n\tzh: LIST_LOCALE_ZH,\n\tru: LIST_LOCALE_RU,\n\tar: LIST_LOCALE_AR,\n\thi: LIST_LOCALE_HI,\n};\n","/**\n * ListPlugin: registers ordered, unordered, and checklist block types\n * with NodeSpecs, toggle commands, indent/outdent (Tab/Shift-Tab),\n * input rules, and toolbar buttons.\n *\n * List items are modeled as flat blocks with a `listType` and `indent` attribute,\n * allowing simple nesting representation without deep tree structures.\n */\n\nimport { LIST_CSS, LIST_MARKER_WIDTH } from '../../editor/styles/list.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { isNodeOfType } from '../../model/AttrRegistry.js';\nimport { generateBlockId, getBlockText } from '../../model/Document.js';\nimport { createBlockElement } from '../../model/NodeSpec.js';\nimport {\n\tcreateCollapsedSelection,\n\tisCollapsed,\n\tisGapCursor,\n\tisNodeSelection,\n} from '../../model/Selection.js';\nimport { type BlockId, blockId, nodeType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { LIST_LOCALES, type ListLocale } from './ListLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\nexport type ListType = 'bullet' | 'ordered' | 'checklist';\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface NodeAttrRegistry {\n\t\tlist_item: { listType: ListType; indent: number; checked: boolean };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface ListConfig {\n\t/** Which list types to enable. Defaults to all. */\n\treadonly types: readonly ListType[];\n\t/** Maximum indent depth. Defaults to 4. */\n\treadonly maxIndent: number;\n\t/** When true, a separator is rendered after the last list toolbar item. */\n\treadonly separatorAfter?: boolean;\n\t/**\n\t * When true, checklist checkboxes remain interactive even in read-only mode.\n\t * Defaults to false (checkboxes are fully read-only).\n\t */\n\treadonly interactiveCheckboxes?: boolean;\n\treadonly locale?: ListLocale;\n}\n\nconst DEFAULT_CONFIG: ListConfig = {\n\ttypes: ['bullet', 'ordered', 'checklist'],\n\tmaxIndent: 4,\n};\n\n// --- List Type Metadata ---\n\ninterface ListTypeDefinition {\n\treadonly type: ListType;\n\treadonly label: string;\n\treadonly icon: string;\n\treadonly inputPattern: RegExp;\n\treadonly inputPrefix: string;\n}\n\nconst BULLET_LIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 10.5c-.83 0-1.5.67-1.5 1.5s.67 1.5 1.5 1.5 1.5-.67 1.5-1.5-.67-1.5-1.5-1.5zm0-6c-.83 0-1.5.67-1.5 1.5S3.17 7.5 4 7.5 5.5 6.83 5.5 6 4.83 4.5 4 4.5zm0 12c-.83 0-1.5.68-1.5 1.5s.68 1.5 1.5 1.5 1.5-.68 1.5-1.5-.67-1.5-1.5-1.5zM7 19h14v-2H7v2zm0-6h14v-2H7v2zm0-8v2h14V5H7z\"/></svg>';\nconst NUMBERED_LIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z\"/></svg>';\nconst CHECKLIST_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M22 7h-9v2h9V7zm0 8h-9v2h9v-2zM5.54 11L2 7.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 11zm0 8L2 15.46l1.41-1.41 2.12 2.12 4.24-4.24 1.41 1.41L5.54 19z\"/></svg>';\n\nconst LIST_TYPE_DEFINITIONS: readonly ListTypeDefinition[] = [\n\t{\n\t\ttype: 'bullet',\n\t\tlabel: 'Bullet List',\n\t\ticon: BULLET_LIST_ICON,\n\t\tinputPattern: /^[-*] $/,\n\t\tinputPrefix: '- ',\n\t},\n\t{\n\t\ttype: 'ordered',\n\t\tlabel: 'Numbered List',\n\t\ticon: NUMBERED_LIST_ICON,\n\t\tinputPattern: /^\\d+\\. $/,\n\t\tinputPrefix: '1. ',\n\t},\n\t{\n\t\ttype: 'checklist',\n\t\tlabel: 'Checklist',\n\t\ticon: CHECKLIST_ICON,\n\t\tinputPattern: /^\\[[ x]] $/,\n\t\tinputPrefix: '[ ] ',\n\t},\n];\n\n// --- Plugin ---\n\nexport class ListPlugin implements Plugin {\n\treadonly id = 'list';\n\treadonly name = 'List';\n\treadonly priority = 35;\n\n\tprivate readonly config: ListConfig;\n\tprivate locale!: ListLocale;\n\tprivate context: PluginContext | null = null;\n\tprivate checkboxClickHandler: ((e: MouseEvent) => void) | null = null;\n\n\tconstructor(config?: Partial<ListConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.context = context;\n\t\tthis.locale = resolvePluginLocale(LIST_LOCALES, context, this.config.locale);\n\t\tcontext.registerStyleSheet(LIST_CSS);\n\t\tthis.registerNodeSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymaps(context);\n\t\tthis.registerInputRules(context);\n\t\tthis.registerToolbarItems(context);\n\t\tthis.registerCheckboxClickHandler(context);\n\t}\n\n\tdestroy(): void {\n\t\tif (this.checkboxClickHandler && this.context) {\n\t\t\tconst container: HTMLElement = this.context.getContainer();\n\t\t\tcontainer.removeEventListener('mousedown', this.checkboxClickHandler);\n\t\t}\n\t\tthis.checkboxClickHandler = null;\n\t\tthis.context = null;\n\t}\n\n\tprivate registerNodeSpec(context: PluginContext): void {\n\t\tcontext.registerNodeSpec({\n\t\t\ttype: 'list_item',\n\t\t\tgroup: 'block',\n\t\t\tcontent: { allow: ['text'] },\n\t\t\tattrs: {\n\t\t\t\tlistType: { default: 'bullet' },\n\t\t\t\tindent: { default: 0 },\n\t\t\t\tchecked: { default: false },\n\t\t\t},\n\t\t\ttoDOM(node) {\n\t\t\t\tconst listType = node.attrs?.listType ?? 'bullet';\n\t\t\t\tconst indent = node.attrs?.indent ?? 0;\n\t\t\t\tconst checked = node.attrs?.checked ?? false;\n\n\t\t\t\tconst li = createBlockElement('li', node.id);\n\t\t\t\tli.setAttribute('role', 'listitem');\n\t\t\t\tli.setAttribute('data-list-type', listType);\n\t\t\t\tli.setAttribute('data-indent', String(indent));\n\t\t\t\tli.className = `notectl-list-item notectl-list-item--${listType}`;\n\n\t\t\t\tif (indent > 0) {\n\t\t\t\t\tli.style.marginLeft = `${indent * LIST_MARKER_WIDTH}px`;\n\t\t\t\t}\n\n\t\t\t\tif (listType === 'checklist') {\n\t\t\t\t\tli.setAttribute('data-checked', String(checked));\n\t\t\t\t\tli.setAttribute('aria-checked', String(checked));\n\t\t\t\t}\n\t\t\t\tli.setAttribute('aria-level', String(indent + 1));\n\n\t\t\t\treturn li;\n\t\t\t},\n\t\t\twrapper(node) {\n\t\t\t\tconst listType = node.attrs?.listType ?? 'bullet';\n\t\t\t\tconst tag = listType === 'ordered' ? 'ol' : 'ul';\n\t\t\t\treturn {\n\t\t\t\t\ttag,\n\t\t\t\t\tkey: `list-${listType}`,\n\t\t\t\t\tclassName: `notectl-list notectl-list--${listType}`,\n\t\t\t\t\tattrs: { role: 'list' },\n\t\t\t\t};\n\t\t\t},\n\t\t\ttoHTML(_node, content) {\n\t\t\t\treturn `<li>${content || '<br>'}</li>`;\n\t\t\t},\n\t\t\tparseHTML: [{ tag: 'li' }],\n\t\t\tsanitize: { tags: ['ul', 'ol', 'li'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tconst enabledTypes = this.getEnabledTypes();\n\n\t\tfor (const def of enabledTypes) {\n\t\t\tcontext.registerCommand(`toggleList:${def.type}`, () => {\n\t\t\t\treturn this.toggleList(context, def.type);\n\t\t\t});\n\t\t}\n\n\t\tcontext.registerCommand('indentListItem', () => {\n\t\t\treturn this.indent(context);\n\t\t});\n\n\t\tcontext.registerCommand('outdentListItem', () => {\n\t\t\treturn this.outdent(context);\n\t\t});\n\n\t\tif (this.config.types.includes('checklist')) {\n\t\t\tcontext.registerCommand('toggleChecklistItem', () => this.toggleChecked(context), {\n\t\t\t\treadonlyAllowed: true,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\tEnter: () => this.handleEnter(context),\n\t\t\tBackspace: () => this.handleBackspace(context),\n\t\t\tTab: () => this.indent(context),\n\t\t\t'Shift-Tab': () => this.outdent(context),\n\t\t});\n\t}\n\n\tprivate registerInputRules(context: PluginContext): void {\n\t\tconst enabledTypes = this.getEnabledTypes();\n\n\t\tfor (const def of enabledTypes) {\n\t\t\tcontext.registerInputRule({\n\t\t\t\tpattern: def.inputPattern,\n\t\t\t\thandler: (state, match, start, _end) => {\n\t\t\t\t\tconst sel = state.selection;\n\t\t\t\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return null;\n\t\t\t\t\tif (!isCollapsed(sel)) return null;\n\n\t\t\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\t\t\tif (!block || block.type !== 'paragraph') return null;\n\n\t\t\t\t\tconst matchStr = match[0] ?? '';\n\t\t\t\t\tconst matchLen = matchStr.length;\n\t\t\t\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\t\t\t\tlistType: def.type,\n\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t};\n\t\t\t\t\tif (def.type === 'checklist') {\n\t\t\t\t\t\tattrs.checked = matchStr.includes('[x]');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn state\n\t\t\t\t\t\t.transaction('input')\n\t\t\t\t\t\t.deleteTextAt(sel.anchor.blockId, start, start + matchLen)\n\t\t\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t\t\t\t.setSelection(createCollapsedSelection(sel.anchor.blockId, 0))\n\t\t\t\t\t\t.build();\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate getListLabel(type: ListType): string {\n\t\tconst labels: Record<ListType, string> = {\n\t\t\tbullet: this.locale.bulletList,\n\t\t\tordered: this.locale.numberedList,\n\t\t\tchecklist: this.locale.checklist,\n\t\t};\n\t\treturn labels[type];\n\t}\n\n\tprivate registerToolbarItems(context: PluginContext): void {\n\t\tconst enabledTypes = this.getEnabledTypes();\n\t\tconst lastType = enabledTypes.at(-1);\n\n\t\tfor (const def of enabledTypes) {\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: `list-${def.type}`,\n\t\t\t\tgroup: 'block',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel: this.getListLabel(def.type),\n\t\t\t\tcommand: `toggleList:${def.type}`,\n\t\t\t\tpriority: def.type === 'bullet' ? 70 : def.type === 'ordered' ? 71 : 72,\n\t\t\t\tseparatorAfter: this.config.separatorAfter && def === lastType,\n\t\t\t\tisActive: (state) => this.isListActive(state, def.type),\n\t\t\t});\n\t\t}\n\t}\n\n\t// --- Command Implementations ---\n\n\tprivate toggleList(context: PluginContext, listType: ListType): boolean {\n\t\tconst state = context.getState();\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\t// If already this list type, convert back to paragraph\n\t\tif (block.type === 'list_item' && block.attrs?.listType === listType) {\n\t\t\tconst tr = state\n\t\t\t\t.transaction('command')\n\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(sel)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Convert to list item\n\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\tlistType,\n\t\t\tindent: isNodeOfType(block, 'list_item') ? block.attrs.indent : 0,\n\t\t};\n\t\tif (listType === 'checklist') {\n\t\t\tattrs.checked = false;\n\t\t}\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tprivate indent(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tif (isNodeSelection(state.selection) || isGapCursor(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\tif (!block || !isNodeOfType(block, 'list_item')) return false;\n\n\t\tif (block.attrs.indent >= this.config.maxIndent) return false;\n\n\t\treturn this.setIndent(context, state, block.attrs.indent + 1);\n\t}\n\n\tprivate outdent(context: PluginContext): boolean {\n\t\tconst state = context.getState();\n\t\tif (isNodeSelection(state.selection) || isGapCursor(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\tif (!block || !isNodeOfType(block, 'list_item')) return false;\n\n\t\tif (block.attrs.indent <= 0) return false;\n\n\t\treturn this.setIndent(context, state, block.attrs.indent - 1);\n\t}\n\n\tprivate setIndent(context: PluginContext, state: EditorState, indent: number): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel) || isGapCursor(sel)) return false;\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\n\t\tconst attrs = { ...block.attrs, indent } as Record<string, string | number | boolean>;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tprivate toggleChecked(context: PluginContext, targetId?: BlockId): boolean {\n\t\tif (context.isReadOnly() && !this.config.interactiveCheckboxes) return false;\n\n\t\tconst state = context.getState();\n\t\tconst bid: BlockId | null =\n\t\t\ttargetId ??\n\t\t\t(isNodeSelection(state.selection) || isGapCursor(state.selection)\n\t\t\t\t? null\n\t\t\t\t: state.selection.anchor.blockId);\n\t\tif (!bid) return false;\n\n\t\tconst block = state.getBlock(bid);\n\t\tif (!block || block.type !== 'list_item' || block.attrs?.listType !== 'checklist') {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst checked: boolean = !block.attrs?.checked;\n\t\tconst attrs = { ...block.attrs, checked } as Record<string, string | number | boolean>;\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setBlockType(bid, nodeType('list_item'), attrs)\n\t\t\t.setSelection(state.selection)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Handles Backspace at the start of a list item.\n\t * Converts the list item back to a paragraph, preserving text.\n\t */\n\tprivate handleBackspace(context: PluginContext): boolean {\n\t\tconst state = context.getState();\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 block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block || block.type !== 'list_item') return false;\n\t\tif (sel.anchor.offset !== 0) return false;\n\n\t\tconst tr = state\n\t\t\t.transaction('input')\n\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Handles Enter inside a list item.\n\t * Empty item → exit list (convert to paragraph).\n\t * Non-empty item → split and create a new list item with the same type.\n\t */\n\tprivate handleEnter(context: PluginContext): boolean {\n\t\tconst state = context.getState();\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 block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block || block.type !== 'list_item') return false;\n\n\t\tconst text = getBlockText(block);\n\n\t\tif (text === '') {\n\t\t\t// Empty list item → convert to paragraph (exit list)\n\t\t\tconst tr = state\n\t\t\t\t.transaction('input')\n\t\t\t\t.setBlockType(sel.anchor.blockId, nodeType('paragraph'))\n\t\t\t\t.setSelection(sel)\n\t\t\t\t.build();\n\t\t\tcontext.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\n\t\t// Non-empty → split block and set new block to same list type\n\t\tconst newBlockId = generateBlockId();\n\t\tconst attrs: Record<string, string | number | boolean> = {\n\t\t\tlistType: isNodeOfType(block, 'list_item') ? block.attrs.listType : 'bullet',\n\t\t\tindent: isNodeOfType(block, 'list_item') ? block.attrs.indent : 0,\n\t\t};\n\t\tif (attrs.listType === 'checklist') {\n\t\t\tattrs.checked = false;\n\t\t}\n\n\t\tconst tr = state\n\t\t\t.transaction('input')\n\t\t\t.splitBlock(sel.anchor.blockId, sel.anchor.offset, newBlockId)\n\t\t\t.setBlockType(newBlockId, nodeType('list_item'), attrs)\n\t\t\t.setSelection(createCollapsedSelection(newBlockId, 0))\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\t// --- Checkbox Click Handling ---\n\n\tprivate registerCheckboxClickHandler(context: PluginContext): void {\n\t\tif (!this.config.types.includes('checklist')) return;\n\n\t\tthis.checkboxClickHandler = (e: MouseEvent) => {\n\t\t\tif (context.isReadOnly() && !this.config.interactiveCheckboxes) return;\n\n\t\t\tconst target: EventTarget | null = e.target;\n\t\t\tif (!(target instanceof HTMLElement)) return;\n\n\t\t\tconst li: HTMLElement | null = target.closest('.notectl-list-item--checklist');\n\t\t\tif (!li) return;\n\n\t\t\tconst rect: DOMRect = li.getBoundingClientRect();\n\t\t\tif (e.clientX - rect.left >= LIST_MARKER_WIDTH) return;\n\n\t\t\te.preventDefault();\n\n\t\t\tconst bid: string | null = li.getAttribute('data-block-id');\n\t\t\tif (!bid) return;\n\n\t\t\tthis.toggleChecked(context, blockId(bid));\n\t\t};\n\n\t\tconst container: HTMLElement = context.getContainer();\n\t\tcontainer.addEventListener('mousedown', this.checkboxClickHandler);\n\t}\n\n\t// --- Helpers ---\n\n\tprivate isListActive(state: EditorState, listType: ListType): boolean {\n\t\tif (isNodeSelection(state.selection) || isGapCursor(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\n\t\treturn block?.type === 'list_item' && block.attrs?.listType === listType;\n\t}\n\n\tprivate getEnabledTypes(): readonly ListTypeDefinition[] {\n\t\treturn LIST_TYPE_DEFINITIONS.filter((def) => this.config.types.includes(def.type));\n\t}\n}\n"],"names":["LIST_LOCALE_EN","bulletList","numberedList","checklist","LIST_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","types","maxIndent","LIST_TYPE_DEFINITIONS","type","label","icon","inputPattern","inputPrefix","ListPlugin","id","name","priority","config","locale","context","checkboxClickHandler","this","resolvePluginLocale","registerStyleSheet","registerNodeSpec","registerCommands","registerKeymaps","registerInputRules","registerToolbarItems","registerCheckboxClickHandler","destroy","getContainer","removeEventListener","group","content","allow","attrs","listType","default","indent","checked","node","li","createBlockElement","setAttribute","String","className","style","marginLeft","tag","key","role","toHTML","_node","parseHTML","sanitize","tags","enabledTypes","getEnabledTypes","def","registerCommand","toggleList","outdent","includes","toggleChecked","readonlyAllowed","registerKeymap","Enter","handleEnter","Backspace","handleBackspace","Tab","registerInputRule","pattern","handler","state","match","start","_end","sel","selection","isNodeSelection","isGapCursor","isCollapsed","block","getBlock","anchor","blockId","matchStr","matchLen","length","transaction","deleteTextAt","setBlockType","nodeType","setSelection","createCollapsedSelection","build","bullet","ordered","lastType","at","registerToolbarItem","getListLabel","command","separatorAfter","isActive","isListActive","getState","tr","dispatch","isNodeOfType","setIndent","targetId","isReadOnly","interactiveCheckboxes","bid","offset","getBlockText","newBlockId","generateBlockId","splitBlock","e","target","HTMLElement","closest","rect","getBoundingClientRect","clientX","left","preventDefault","getAttribute","addEventListener","filter"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { A as e, t } from "./Commands-CSpSwGXv.mjs";
2
- import { r as i } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
- import { m as a } from "./TypeBrands-C09nE2qO.mjs";
4
- import { f as r } from "./ToolbarItem-ugDymuXi.mjs";
1
+ import { r as e } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
+ import { m as t } from "./TypeBrands-C09nE2qO.mjs";
3
+ import { f as i } from "./ToolbarItem-BpZggUGo.mjs";
4
+ import { e as a, b as r } from "./MarkCommands-CC37WA7Z.mjs";
5
5
  const o = { boldLabel: "Bold", italicLabel: "Italic", underlineLabel: "Underline" }, n = { en: o, de: { boldLabel: "Fett", italicLabel: "Kursiv", underlineLabel: "Unterstrichen" }, es: { boldLabel: "Negrita", italicLabel: "Cursiva", underlineLabel: "Subrayado" }, fr: { boldLabel: "Gras", italicLabel: "Italique", underlineLabel: "Souligné" }, zh: { boldLabel: "粗体", italicLabel: "斜体", underlineLabel: "下划线" }, ru: { boldLabel: "Жирный", italicLabel: "Курсив", underlineLabel: "Подчёркнутый" }, ar: { boldLabel: "غامق", italicLabel: "مائل", underlineLabel: "تحته خط" }, hi: { boldLabel: "बोल्ड", italicLabel: "इटैलिक", underlineLabel: "अंडरलाइन" } }, s = { bold: true, italic: true, underline: true }, l = [{ type: "bold", configKey: "bold", rank: 0, tag: "strong", label: "Bold", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z"/></svg>', keyBinding: "Mod-B", toHTMLString: (e2) => `<strong>${e2}</strong>`, parseHTML: [{ tag: "strong" }, { tag: "b", getAttrs: (e2) => {
6
6
  const t2 = e2.style.fontWeight;
7
7
  return "normal" !== t2 && "400" !== t2 && {};
@@ -21,23 +21,23 @@ class g {
21
21
  constructor(e2) {
22
22
  this.config = { ...s, ...e2 };
23
23
  }
24
- init(e2) {
25
- this.locale = i(n, e2, this.config.locale);
26
- const t2 = l.filter((e3) => this.config[e3.configKey]), a2 = t2.filter((e3) => this.isToolbarVisible(e3.configKey)).at(-1);
27
- for (const i2 of t2) {
28
- const t3 = this.config.separatorAfter && i2 === a2;
29
- this.registerMark(e2, i2, t3);
24
+ init(t2) {
25
+ this.locale = e(n, t2, this.config.locale);
26
+ const i2 = l.filter((e2) => this.config[e2.configKey]), a2 = i2.filter((e2) => this.isToolbarVisible(e2.configKey)).at(-1);
27
+ for (const e2 of i2) {
28
+ const i3 = this.config.separatorAfter && e2 === a2;
29
+ this.registerMark(t2, e2, i3);
30
30
  }
31
- this.registerKeymaps(e2, t2), this.registerDisabledToolbarItems(e2);
31
+ this.registerKeymaps(t2, i2), this.registerDisabledToolbarItems(t2);
32
32
  }
33
- registerMark(i2, o2, n2) {
33
+ registerMark(e2, o2, n2) {
34
34
  const s2 = c(o2.type), l2 = this.isToolbarVisible(o2.configKey);
35
- if (i2.registerMarkSpec({ type: o2.type, rank: o2.rank, toDOM: () => document.createElement(o2.tag), toHTMLString: (e2, t2) => o2.toHTMLString(t2), parseHTML: o2.parseHTML, sanitize: o2.sanitize }), i2.registerCommand(s2, () => {
36
- const t2 = e(i2.getState(), a(o2.type));
37
- return !!t2 && (i2.dispatch(t2), true);
35
+ if (e2.registerMarkSpec({ type: o2.type, rank: o2.rank, toDOM: () => document.createElement(o2.tag), toHTMLString: (e3, t2) => o2.toHTMLString(t2), parseHTML: o2.parseHTML, sanitize: o2.sanitize }), e2.registerCommand(s2, () => {
36
+ const i2 = a(e2.getState(), t(o2.type));
37
+ return !!i2 && (e2.dispatch(i2), true);
38
38
  }), l2) {
39
- const e2 = this.getMarkLabel(o2.type);
40
- i2.registerToolbarItem({ id: o2.type, group: "format", icon: o2.icon, label: e2, tooltip: `${e2} (${r(o2.keyBinding)})`, command: s2, priority: 10 * o2.rank + 10, separatorAfter: n2, isActive: (e3) => t(e3, a(o2.type)) });
39
+ const a2 = this.getMarkLabel(o2.type);
40
+ e2.registerToolbarItem({ id: o2.type, group: "format", icon: o2.icon, label: a2, tooltip: `${a2} (${i(o2.keyBinding)})`, command: s2, priority: 10 * o2.rank + 10, separatorAfter: n2, isActive: (e3) => r(e3, t(o2.type)) });
41
41
  }
42
42
  }
43
43
  registerKeymaps(e2, t2) {
@@ -70,4 +70,4 @@ export {
70
70
  n as a,
71
71
  o as b
72
72
  };
73
- //# sourceMappingURL=index-BIL37LSL.mjs.map
73
+ //# sourceMappingURL=index-D8tbbW97.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BIL37LSL.mjs","sources":["../../src/plugins/text-formatting/TextFormattingLocale.ts","../../src/plugins/text-formatting/TextFormattingPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the TextFormattingPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface TextFormattingLocale {\n\treadonly boldLabel: string;\n\treadonly italicLabel: string;\n\treadonly underlineLabel: string;\n}\n\n// --- Default English Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_EN: TextFormattingLocale = {\n\tboldLabel: 'Bold',\n\titalicLabel: 'Italic',\n\tunderlineLabel: 'Underline',\n};\n\n// --- German Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_DE: TextFormattingLocale = {\n\tboldLabel: 'Fett',\n\titalicLabel: 'Kursiv',\n\tunderlineLabel: 'Unterstrichen',\n};\n\n// --- Spanish Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_ES: TextFormattingLocale = {\n\tboldLabel: 'Negrita',\n\titalicLabel: 'Cursiva',\n\tunderlineLabel: 'Subrayado',\n};\n\n// --- French Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_FR: TextFormattingLocale = {\n\tboldLabel: 'Gras',\n\titalicLabel: 'Italique',\n\tunderlineLabel: 'Souligné',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_ZH: TextFormattingLocale = {\n\tboldLabel: '粗体',\n\titalicLabel: '斜体',\n\tunderlineLabel: '下划线',\n};\n\n// --- Russian Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_RU: TextFormattingLocale = {\n\tboldLabel: 'Жирный',\n\titalicLabel: 'Курсив',\n\tunderlineLabel: 'Подчёркнутый',\n};\n\n// --- Arabic Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_AR: TextFormattingLocale = {\n\tboldLabel: 'غامق',\n\titalicLabel: 'مائل',\n\tunderlineLabel: 'تحته خط',\n};\n\n// --- Hindi Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_HI: TextFormattingLocale = {\n\tboldLabel: 'बोल्ड',\n\titalicLabel: 'इटैलिक',\n\tunderlineLabel: 'अंडरलाइन',\n};\n\n// --- Locale Map ---\n\nexport const TEXT_FORMATTING_LOCALES: Record<string, TextFormattingLocale> = {\n\ten: TEXT_FORMATTING_LOCALE_EN,\n\tde: TEXT_FORMATTING_LOCALE_DE,\n\tes: TEXT_FORMATTING_LOCALE_ES,\n\tfr: TEXT_FORMATTING_LOCALE_FR,\n\tzh: TEXT_FORMATTING_LOCALE_ZH,\n\tru: TEXT_FORMATTING_LOCALE_RU,\n\tar: TEXT_FORMATTING_LOCALE_AR,\n\thi: TEXT_FORMATTING_LOCALE_HI,\n};\n","/**\n * TextFormattingPlugin: registers inline marks (bold, italic, underline)\n * with their MarkSpecs, toggle commands, keyboard shortcuts, and toolbar items.\n *\n * This plugin is data-driven — each mark type is defined declaratively and\n * all registrations (MarkSpec, command, keymap, toolbar item) are derived\n * from the same definition.\n *\n * Supports two separate config dimensions:\n * - Feature config (bold/italic/underline): controls whether the mark is\n * registered in the schema. When disabled, the keyboard shortcut does nothing.\n * - Toolbar config: controls whether the toolbar button is visible.\n * When a feature is disabled but toolbar is enabled, the button renders as disabled.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport type { ParseRule } from '../../model/ParseRule.js';\nimport type { SanitizeConfig } from '../../model/SanitizeConfig.js';\nimport { markType as mkType } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\nimport { TEXT_FORMATTING_LOCALES, type TextFormattingLocale } from './TextFormattingLocale.js';\n\n// --- Configuration ---\n\n/** Controls toolbar button visibility per mark. */\nexport interface TextFormattingToolbarConfig {\n\treadonly bold?: boolean;\n\treadonly italic?: boolean;\n\treadonly underline?: boolean;\n}\n\n/** Controls which inline marks are enabled and which toolbar buttons are shown. */\nexport interface TextFormattingConfig {\n\treadonly bold: boolean;\n\treadonly italic: boolean;\n\treadonly underline: boolean;\n\treadonly toolbar?: TextFormattingToolbarConfig;\n\t/** When true, a separator is rendered after the last text-formatting toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: TextFormattingLocale;\n}\n\nconst DEFAULT_CONFIG: TextFormattingConfig = {\n\tbold: true,\n\titalic: true,\n\tunderline: true,\n};\n\n// --- Mark Definitions ---\n\ninterface MarkDefinition {\n\treadonly type: string;\n\treadonly configKey: keyof Omit<TextFormattingConfig, 'toolbar' | 'separatorAfter' | 'locale'>;\n\treadonly rank: number;\n\treadonly tag: string;\n\treadonly label: string;\n\treadonly icon: string;\n\treadonly keyBinding: string;\n\treadonly toHTMLString: (content: string) => string;\n\treadonly parseHTML: readonly ParseRule[];\n\treadonly sanitize: SanitizeConfig;\n}\n\nconst BOLD_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>';\nconst ITALIC_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>';\nconst UNDERLINE_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>';\n\nconst MARK_DEFINITIONS: readonly MarkDefinition[] = [\n\t{\n\t\ttype: 'bold',\n\t\tconfigKey: 'bold',\n\t\trank: 0,\n\t\ttag: 'strong',\n\t\tlabel: 'Bold',\n\t\ticon: BOLD_ICON,\n\t\tkeyBinding: 'Mod-B',\n\t\ttoHTMLString: (content) => `<strong>${content}</strong>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'strong' },\n\t\t\t{\n\t\t\t\ttag: 'b',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst fw: string = el.style.fontWeight;\n\t\t\t\t\treturn fw === 'normal' || fw === '400' ? false : {};\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst fw: string = el.style.fontWeight;\n\t\t\t\t\tif (!fw) return false;\n\t\t\t\t\tif (fw === 'bold') return {};\n\t\t\t\t\tconst numeric: number = Number.parseInt(fw, 10);\n\t\t\t\t\treturn !Number.isNaN(numeric) && numeric >= 700 ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['strong', 'b'] },\n\t},\n\t{\n\t\ttype: 'italic',\n\t\tconfigKey: 'italic',\n\t\trank: 1,\n\t\ttag: 'em',\n\t\tlabel: 'Italic',\n\t\ticon: ITALIC_ICON,\n\t\tkeyBinding: 'Mod-I',\n\t\ttoHTMLString: (content) => `<em>${content}</em>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'em' },\n\t\t\t{ tag: 'i' },\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\treturn el.style.fontStyle === 'italic' ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['em', 'i'] },\n\t},\n\t{\n\t\ttype: 'underline',\n\t\tconfigKey: 'underline',\n\t\trank: 2,\n\t\ttag: 'u',\n\t\tlabel: 'Underline',\n\t\ticon: UNDERLINE_ICON,\n\t\tkeyBinding: 'Mod-U',\n\t\ttoHTMLString: (content) => `<u>${content}</u>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'u' },\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\treturn el.style.textDecoration.includes('underline') ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['u'] },\n\t},\n];\n\n// --- Plugin ---\n\nexport class TextFormattingPlugin implements Plugin {\n\treadonly id = 'text-formatting';\n\treadonly name = 'Text Formatting';\n\treadonly priority = 20;\n\n\tprivate readonly config: TextFormattingConfig;\n\tprivate locale!: TextFormattingLocale;\n\n\tconstructor(config?: Partial<TextFormattingConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(TEXT_FORMATTING_LOCALES, context, this.config.locale);\n\n\t\tconst enabledMarks = MARK_DEFINITIONS.filter((def) => this.config[def.configKey]);\n\n\t\t// Determine which marks will have visible toolbar items\n\t\tconst visibleToolbarMarks = enabledMarks.filter((def) => this.isToolbarVisible(def.configKey));\n\t\tconst lastVisibleMark = visibleToolbarMarks.at(-1);\n\n\t\tfor (const def of enabledMarks) {\n\t\t\tconst isSeparatorTarget = this.config.separatorAfter && def === lastVisibleMark;\n\t\t\tthis.registerMark(context, def, isSeparatorTarget);\n\t\t}\n\n\t\tthis.registerKeymaps(context, enabledMarks);\n\n\t\t// Register disabled placeholder buttons for marks that are disabled\n\t\t// as features but explicitly requested in the toolbar config\n\t\tthis.registerDisabledToolbarItems(context);\n\t}\n\n\tprivate registerMark(\n\t\tcontext: PluginContext,\n\t\tdef: MarkDefinition,\n\t\tseparatorAfter?: boolean,\n\t): void {\n\t\tconst commandName = toCommandName(def.type);\n\t\tconst toolbarVisible = this.isToolbarVisible(def.configKey);\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: def.type,\n\t\t\trank: def.rank,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement(def.tag);\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => def.toHTMLString(content),\n\t\t\tparseHTML: def.parseHTML,\n\t\t\tsanitize: def.sanitize,\n\t\t});\n\n\t\tcontext.registerCommand(commandName, () => {\n\t\t\tconst tr = toggleMark(context.getState(), mkType(def.type));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (toolbarVisible) {\n\t\t\tconst label: string = this.getMarkLabel(def.type);\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: def.type,\n\t\t\t\tgroup: 'format',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel,\n\t\t\t\ttooltip: `${label} (${formatShortcut(def.keyBinding)})`,\n\t\t\t\tcommand: commandName,\n\t\t\t\tpriority: def.rank * 10 + 10,\n\t\t\t\tseparatorAfter,\n\t\t\t\tisActive: (state) => isMarkActive(state, mkType(def.type)),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext, marks: readonly MarkDefinition[]): void {\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const def of marks) {\n\t\t\tconst commandName = toCommandName(def.type);\n\t\t\tkeymap[def.keyBinding] = () => context.executeCommand(commandName);\n\t\t}\n\t\tif (Object.keys(keymap).length > 0) {\n\t\t\tcontext.registerKeymap(keymap);\n\t\t}\n\t}\n\n\t/**\n\t * Registers disabled toolbar buttons for marks whose feature is disabled\n\t * but whose toolbar button is explicitly requested.\n\t */\n\tprivate registerDisabledToolbarItems(context: PluginContext): void {\n\t\tif (!this.config.toolbar) return;\n\n\t\tfor (const def of MARK_DEFINITIONS) {\n\t\t\tconst featureEnabled = this.config[def.configKey];\n\t\t\tconst toolbarVisible = this.config.toolbar[def.configKey] ?? true;\n\n\t\t\tif (!featureEnabled && toolbarVisible) {\n\t\t\t\tcontext.registerToolbarItem({\n\t\t\t\t\tid: def.type,\n\t\t\t\t\tgroup: 'format',\n\t\t\t\t\ticon: def.icon,\n\t\t\t\t\tlabel: this.getMarkLabel(def.type),\n\t\t\t\t\tcommand: toCommandName(def.type),\n\t\t\t\t\tpriority: def.rank * 10 + 10,\n\t\t\t\t\tisEnabled: () => false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getMarkLabel(type: string): string {\n\t\tconst key = `${type}Label` as keyof TextFormattingLocale;\n\t\treturn this.locale[key] as string;\n\t}\n\n\t/** Checks if a toolbar button should be visible for a given mark. */\n\tprivate isToolbarVisible(\n\t\tconfigKey: keyof Omit<TextFormattingConfig, 'toolbar' | 'separatorAfter' | 'locale'>,\n\t): boolean {\n\t\tif (!this.config.toolbar) return true;\n\t\treturn this.config.toolbar[configKey] ?? true;\n\t}\n}\n\n/** Converts a mark type to its toggle command name (e.g. 'bold' → 'toggleBold'). */\nfunction toCommandName(markType: string): string {\n\treturn `toggle${markType.charAt(0).toUpperCase()}${markType.slice(1)}`;\n}\n"],"names":["TEXT_FORMATTING_LOCALE_EN","boldLabel","italicLabel","underlineLabel","TEXT_FORMATTING_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","bold","italic","underline","MARK_DEFINITIONS","type","configKey","rank","tag","label","icon","keyBinding","toHTMLString","content","parseHTML","getAttrs","el","fw","style","fontWeight","numeric","Number","parseInt","isNaN","sanitize","tags","fontStyle","textDecoration","includes","TextFormattingPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","enabledMarks","filter","def","lastVisibleMark","isToolbarVisible","at","isSeparatorTarget","separatorAfter","registerMark","registerKeymaps","registerDisabledToolbarItems","commandName","toCommandName","toolbarVisible","registerMarkSpec","toDOM","document","createElement","_mark","registerCommand","tr","toggleMark","getState","mkType","dispatch","getMarkLabel","registerToolbarItem","group","tooltip","formatShortcut","command","isActive","state","isMarkActive","marks","keymap","executeCommand","Object","keys","length","registerKeymap","toolbar","featureEnabled","isEnabled","key","markType","charAt","toUpperCase","slice"],"mappings":";;;;AAcO,MAAMA,IAAkD,EAC9DC,WAAW,QACXC,aAAa,UACbC,gBAAgB,YAAA,GA6DJC,IAAgE,EAC5EC,IAAIL,GACJM,IA1D8D,EAC9DL,WAAW,QACXC,aAAa,UACbC,gBAAgB,gBAAA,GAwDhBI,IAnD8D,EAC9DN,WAAW,WACXC,aAAa,WACbC,gBAAgB,YAAA,GAiDhBK,IA5C8D,EAC9DP,WAAW,QACXC,aAAa,YACbC,gBAAgB,WAAA,GA0ChBM,IArC8D,EAC9DR,WAAW,MACXC,aAAa,MACbC,gBAAgB,MAAA,GAmChBO,IA9B8D,EAC9DT,WAAW,UACXC,aAAa,UACbC,gBAAgB,eAAA,GA4BhBQ,IAvB8D,EAC9DV,WAAW,QACXC,aAAa,QACbC,gBAAgB,UAAA,GAqBhBS,IAhB8D,EAC9DX,WAAW,SACXC,aAAa,UACbC,gBAAgB,WAAA,EAAA,GC7BXU,IAAuC,EAC5CC,MAAAA,MACAC,QAAAA,MACAC,gBAAW,GAyBNC,IAA8C,CACnD,EACCC,MAAM,QACNC,WAAW,QACXC,MAAM,GACNC,KAAK,UACLC,OAAO,QACPC,MAbD,uTAcCC,YAAY,SACZC,cAAeC,CAAAA,OAAY,WAAWA,EAAAA,aACtCC,WAAW,CACV,EAAEN,KAAK,YACP,EACCA,KAAK,KACLO,UAAWC,CAAAA,OAAAA;AACV,QAAMC,KAAaD,GAAGE,MAAMC;AAC5B,SAAc,aAAPF,MAA0B,UAAPA,MAAuB,CAAA;AAAA,EAAA,GAGnD,EACCT,KAAK,QACLO,UAAWC,CAAAA,OAAAA;AACV,QAAMC,KAAaD,GAAGE,MAAMC;AAC5B,MAAA,CAAKF,GAAI,QAAA;AACT,MAAW,WAAPA,GAAe,QAAO,CAAA;AAC1B,QAAMG,KAAkBC,OAAOC,SAASL,IAAI,EAAA;AAC5C,UAAQI,OAAOE,MAAMH,EAAAA,KAAYA,MAAW,OAAM,CAAA;AAAA,EAAA,CAAA,GAIrDI,UAAU,EAAEC,MAAM,CAAC,UAAU,GAAA,EAAA,EAAA,GAE9B,EACCpB,MAAM,UACNC,WAAW,UACXC,MAAM,GACNC,KAAK,MACLC,OAAO,UACPC,MA1CD,kIA2CCC,YAAY,SACZC,cAAeC,CAAAA,OAAY,OAAOA,EAAAA,SAClCC,WAAW,CACV,EAAEN,KAAK,KAAA,GACP,EAAEA,KAAK,IAAA,GACP,EACCA,KAAK,QACLO,UAAWC,CAAAA,OACoB,aAAvBA,GAAGE,MAAMQ,aAAyB,CAAA,EAAA,CAAA,GAI5CF,UAAU,EAAEC,MAAM,CAAC,MAAM,GAAA,EAAA,EAAA,GAE1B,EACCpB,MAAM,aACNC,WAAW,aACXC,MAAM,GACNC,KAAK,KACLC,OAAO,aACPC,MA7DD,qMA8DCC,YAAY,SACZC,cAAeC,CAAAA,OAAY,MAAMA,EAAAA,QACjCC,WAAW,CACV,EAAEN,KAAK,IAAA,GACP,EACCA,KAAK,QACLO,UAAWC,CAAAA,OAAAA,CAAAA,CACHA,GAAGE,MAAMS,eAAeC,SAAS,WAAA,KAAe,CAAA,EAAA,CAAA,GAI1DJ,UAAU,EAAEC,MAAM,CAAC;AAMd,MAAMI,EAAAA;AAAAA,EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACTC;AAAAA,EAER,YAAYD,IAAAA;AACXE,SAAKF,SAAS,EAAA,GAAKjC,GAAAA,GAAmBiC;EACvC;AAAA,EAEA,KAAKG,IAAAA;AACJD,SAAKD,SAASG,EAAoB9C,GAAyB6C,IAASD,KAAKF,OAAOC,MAAAA;AAEhF,UAAMI,KAAelC,EAAiBmC,OAAQC,CAAAA,OAAQL,KAAKF,OAAOO,GAAIlC,SAAAA,CAAAA,GAIhEmC,KADsBH,GAAaC,OAAQC,CAAAA,OAAQL,KAAKO,iBAAiBF,GAAIlC,SAAAA,CAAAA,EACvCqC,GAAAA;AAE5C,eAAWH,MAAOF,IAAc;AAC/B,YAAMM,KAAoBT,KAAKF,OAAOY,kBAAkBL,OAAQC;AAChEN,WAAKW,aAAaV,IAASI,IAAKI,EAAAA;AAAAA,IACjC;AAEAT,SAAKY,gBAAgBX,IAASE,KAI9BH,KAAKa,6BAA6BZ,EAAAA;AAAAA,EACnC;AAAA,EAEQ,aACPA,IACAI,IACAK;AAEA,UAAMI,KAAcC,EAAcV,GAAInC,IAAAA,GAChC8C,KAAiBhB,KAAKO,iBAAiBF,GAAIlC,SAAAA;AAsBjD,QApBA8B,GAAQgB,iBAAiB,EACxB/C,MAAMmC,GAAInC,MACVE,MAAMiC,GAAIjC,MACV8C,OAAA,MACQC,SAASC,cAAcf,GAAIhC,GAAAA,GAEnCI,cAAc,CAAC4C,IAAO3C,OAAY2B,GAAI5B,aAAaC,EAAAA,GACnDC,WAAW0B,GAAI1B,WACfU,UAAUgB,GAAIhB,SAAAA,CAAAA,GAGfY,GAAQqB,gBAAgBR,IAAa,MAAA;AACpC,YAAMS,KAAKC,EAAWvB,GAAQwB,SAAAA,GAAYC,EAAOrB,GAAInC,IAAAA,CAAAA;AACrD,aAAA,CAAA,CAAIqD,OACHtB,GAAQ0B,SAASJ,EAAAA,GAAAA;AAAAA,IACV,CAAA,GAKLP,IAAgB;AACnB,YAAM1C,KAAgB0B,KAAK4B,aAAavB,GAAInC,IAAAA;AAC5C+B,MAAAA,GAAQ4B,oBAAoB,EAC3BlC,IAAIU,GAAInC,MACR4D,OAAO,UACPvD,MAAM8B,GAAI9B,MACVD,OAAAA,IACAyD,SAAS,GAAGzD,OAAU0D,EAAe3B,GAAI7B,UAAAA,CAAAA,KACzCyD,SAASnB,IACTjB,UAAqB,KAAXQ,GAAIjC,OAAY,IAC1BsC,gBAAAA,IACAwB,UAAWC,CAAAA,OAAUC,EAAaD,IAAOT,EAAOrB,GAAInC,IAAAA,CAAAA,EAAAA,CAAAA;AAAAA,IAEtD;AAAA,EACD;AAAA,EAEQ,gBAAgB+B,IAAwBoC,IAAAA;AAC/C,UAAMC,KAAwC,CAAA;AAC9C,eAAWjC,MAAOgC,IAAO;AACxB,YAAMvB,KAAcC,EAAcV,GAAInC,IAAAA;AACtCoE,MAAAA,GAAOjC,GAAI7B,UAAAA,IAAc,MAAMyB,GAAQsC,eAAezB,EAAAA;AAAAA,IACvD;AACI0B,WAAOC,KAAKH,EAAAA,EAAQI,SAAS,KAChCzC,GAAQ0C,eAAeL,EAAAA;AAAAA,EAEzB;AAAA,EAMQ,6BAA6BrC,IAAAA;AACpC,QAAKD,KAAKF,OAAO8C,QAEjB,YAAWvC,MAAOpC,GAAkB;AACnC,YAAM4E,KAAiB7C,KAAKF,OAAOO,GAAIlC,SAAAA,GACjC6C,KAAiBhB,KAAKF,OAAO8C,QAAQvC,GAAIlC,SAAAA,KAAAA;OAE1C0E,MAAkB7B,MACtBf,GAAQ4B,oBAAoB,EAC3BlC,IAAIU,GAAInC,MACR4D,OAAO,UACPvD,MAAM8B,GAAI9B,MACVD,OAAO0B,KAAK4B,aAAavB,GAAInC,IAAAA,GAC7B+D,SAASlB,EAAcV,GAAInC,IAAAA,GAC3B2B,UAAqB,KAAXQ,GAAIjC,OAAY,IAC1B0E,WAAW,MAAA,MAAM,CAAA;AAAA,IAGpB;AAAA,EACD;AAAA,EAEQ,aAAa5E;AACpB,UAAM6E,KAAM,GAAG7E,EAAAA;AACf,WAAO8B,KAAKD,OAAOgD,EAAAA;AAAAA,EACpB;AAAA,EAGQ,iBACP5E,IAAAA;AAEA,WAAA,CAAK6B,KAAKF,OAAO8C,YACV5C,KAAKF,OAAO8C,QAAQzE,EAAAA,KAAAA;AAAAA,EAC5B;AAAA;AAID,SAAS4C,EAAciC,IAAAA;AACtB,SAAO,SAASA,GAASC,OAAO,CAAA,EAAGC,YAAAA,CAAAA,GAAgBF,GAASG,MAAM,CAAA,CAAA;AACnE;"}
1
+ {"version":3,"file":"index-D8tbbW97.mjs","sources":["../../src/plugins/text-formatting/TextFormattingLocale.ts","../../src/plugins/text-formatting/TextFormattingPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the TextFormattingPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface TextFormattingLocale {\n\treadonly boldLabel: string;\n\treadonly italicLabel: string;\n\treadonly underlineLabel: string;\n}\n\n// --- Default English Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_EN: TextFormattingLocale = {\n\tboldLabel: 'Bold',\n\titalicLabel: 'Italic',\n\tunderlineLabel: 'Underline',\n};\n\n// --- German Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_DE: TextFormattingLocale = {\n\tboldLabel: 'Fett',\n\titalicLabel: 'Kursiv',\n\tunderlineLabel: 'Unterstrichen',\n};\n\n// --- Spanish Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_ES: TextFormattingLocale = {\n\tboldLabel: 'Negrita',\n\titalicLabel: 'Cursiva',\n\tunderlineLabel: 'Subrayado',\n};\n\n// --- French Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_FR: TextFormattingLocale = {\n\tboldLabel: 'Gras',\n\titalicLabel: 'Italique',\n\tunderlineLabel: 'Souligné',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_ZH: TextFormattingLocale = {\n\tboldLabel: '粗体',\n\titalicLabel: '斜体',\n\tunderlineLabel: '下划线',\n};\n\n// --- Russian Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_RU: TextFormattingLocale = {\n\tboldLabel: 'Жирный',\n\titalicLabel: 'Курсив',\n\tunderlineLabel: 'Подчёркнутый',\n};\n\n// --- Arabic Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_AR: TextFormattingLocale = {\n\tboldLabel: 'غامق',\n\titalicLabel: 'مائل',\n\tunderlineLabel: 'تحته خط',\n};\n\n// --- Hindi Locale ---\n\nexport const TEXT_FORMATTING_LOCALE_HI: TextFormattingLocale = {\n\tboldLabel: 'बोल्ड',\n\titalicLabel: 'इटैलिक',\n\tunderlineLabel: 'अंडरलाइन',\n};\n\n// --- Locale Map ---\n\nexport const TEXT_FORMATTING_LOCALES: Record<string, TextFormattingLocale> = {\n\ten: TEXT_FORMATTING_LOCALE_EN,\n\tde: TEXT_FORMATTING_LOCALE_DE,\n\tes: TEXT_FORMATTING_LOCALE_ES,\n\tfr: TEXT_FORMATTING_LOCALE_FR,\n\tzh: TEXT_FORMATTING_LOCALE_ZH,\n\tru: TEXT_FORMATTING_LOCALE_RU,\n\tar: TEXT_FORMATTING_LOCALE_AR,\n\thi: TEXT_FORMATTING_LOCALE_HI,\n};\n","/**\n * TextFormattingPlugin: registers inline marks (bold, italic, underline)\n * with their MarkSpecs, toggle commands, keyboard shortcuts, and toolbar items.\n *\n * This plugin is data-driven — each mark type is defined declaratively and\n * all registrations (MarkSpec, command, keymap, toolbar item) are derived\n * from the same definition.\n *\n * Supports two separate config dimensions:\n * - Feature config (bold/italic/underline): controls whether the mark is\n * registered in the schema. When disabled, the keyboard shortcut does nothing.\n * - Toolbar config: controls whether the toolbar button is visible.\n * When a feature is disabled but toolbar is enabled, the button renders as disabled.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport type { ParseRule } from '../../model/ParseRule.js';\nimport type { SanitizeConfig } from '../../model/SanitizeConfig.js';\nimport { markType as mkType } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\nimport { TEXT_FORMATTING_LOCALES, type TextFormattingLocale } from './TextFormattingLocale.js';\n\n// --- Configuration ---\n\n/** Controls toolbar button visibility per mark. */\nexport interface TextFormattingToolbarConfig {\n\treadonly bold?: boolean;\n\treadonly italic?: boolean;\n\treadonly underline?: boolean;\n}\n\n/** Controls which inline marks are enabled and which toolbar buttons are shown. */\nexport interface TextFormattingConfig {\n\treadonly bold: boolean;\n\treadonly italic: boolean;\n\treadonly underline: boolean;\n\treadonly toolbar?: TextFormattingToolbarConfig;\n\t/** When true, a separator is rendered after the last text-formatting toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: TextFormattingLocale;\n}\n\nconst DEFAULT_CONFIG: TextFormattingConfig = {\n\tbold: true,\n\titalic: true,\n\tunderline: true,\n};\n\n// --- Mark Definitions ---\n\ninterface MarkDefinition {\n\treadonly type: string;\n\treadonly configKey: keyof Omit<TextFormattingConfig, 'toolbar' | 'separatorAfter' | 'locale'>;\n\treadonly rank: number;\n\treadonly tag: string;\n\treadonly label: string;\n\treadonly icon: string;\n\treadonly keyBinding: string;\n\treadonly toHTMLString: (content: string) => string;\n\treadonly parseHTML: readonly ParseRule[];\n\treadonly sanitize: SanitizeConfig;\n}\n\nconst BOLD_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>';\nconst ITALIC_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>';\nconst UNDERLINE_ICON =\n\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>';\n\nconst MARK_DEFINITIONS: readonly MarkDefinition[] = [\n\t{\n\t\ttype: 'bold',\n\t\tconfigKey: 'bold',\n\t\trank: 0,\n\t\ttag: 'strong',\n\t\tlabel: 'Bold',\n\t\ticon: BOLD_ICON,\n\t\tkeyBinding: 'Mod-B',\n\t\ttoHTMLString: (content) => `<strong>${content}</strong>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'strong' },\n\t\t\t{\n\t\t\t\ttag: 'b',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst fw: string = el.style.fontWeight;\n\t\t\t\t\treturn fw === 'normal' || fw === '400' ? false : {};\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\tconst fw: string = el.style.fontWeight;\n\t\t\t\t\tif (!fw) return false;\n\t\t\t\t\tif (fw === 'bold') return {};\n\t\t\t\t\tconst numeric: number = Number.parseInt(fw, 10);\n\t\t\t\t\treturn !Number.isNaN(numeric) && numeric >= 700 ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['strong', 'b'] },\n\t},\n\t{\n\t\ttype: 'italic',\n\t\tconfigKey: 'italic',\n\t\trank: 1,\n\t\ttag: 'em',\n\t\tlabel: 'Italic',\n\t\ticon: ITALIC_ICON,\n\t\tkeyBinding: 'Mod-I',\n\t\ttoHTMLString: (content) => `<em>${content}</em>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'em' },\n\t\t\t{ tag: 'i' },\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\treturn el.style.fontStyle === 'italic' ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['em', 'i'] },\n\t},\n\t{\n\t\ttype: 'underline',\n\t\tconfigKey: 'underline',\n\t\trank: 2,\n\t\ttag: 'u',\n\t\tlabel: 'Underline',\n\t\ticon: UNDERLINE_ICON,\n\t\tkeyBinding: 'Mod-U',\n\t\ttoHTMLString: (content) => `<u>${content}</u>`,\n\t\tparseHTML: [\n\t\t\t{ tag: 'u' },\n\t\t\t{\n\t\t\t\ttag: 'span',\n\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\treturn el.style.textDecoration.includes('underline') ? {} : false;\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tsanitize: { tags: ['u'] },\n\t},\n];\n\n// --- Plugin ---\n\nexport class TextFormattingPlugin implements Plugin {\n\treadonly id = 'text-formatting';\n\treadonly name = 'Text Formatting';\n\treadonly priority = 20;\n\n\tprivate readonly config: TextFormattingConfig;\n\tprivate locale!: TextFormattingLocale;\n\n\tconstructor(config?: Partial<TextFormattingConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(TEXT_FORMATTING_LOCALES, context, this.config.locale);\n\n\t\tconst enabledMarks = MARK_DEFINITIONS.filter((def) => this.config[def.configKey]);\n\n\t\t// Determine which marks will have visible toolbar items\n\t\tconst visibleToolbarMarks = enabledMarks.filter((def) => this.isToolbarVisible(def.configKey));\n\t\tconst lastVisibleMark = visibleToolbarMarks.at(-1);\n\n\t\tfor (const def of enabledMarks) {\n\t\t\tconst isSeparatorTarget = this.config.separatorAfter && def === lastVisibleMark;\n\t\t\tthis.registerMark(context, def, isSeparatorTarget);\n\t\t}\n\n\t\tthis.registerKeymaps(context, enabledMarks);\n\n\t\t// Register disabled placeholder buttons for marks that are disabled\n\t\t// as features but explicitly requested in the toolbar config\n\t\tthis.registerDisabledToolbarItems(context);\n\t}\n\n\tprivate registerMark(\n\t\tcontext: PluginContext,\n\t\tdef: MarkDefinition,\n\t\tseparatorAfter?: boolean,\n\t): void {\n\t\tconst commandName = toCommandName(def.type);\n\t\tconst toolbarVisible = this.isToolbarVisible(def.configKey);\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: def.type,\n\t\t\trank: def.rank,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement(def.tag);\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => def.toHTMLString(content),\n\t\t\tparseHTML: def.parseHTML,\n\t\t\tsanitize: def.sanitize,\n\t\t});\n\n\t\tcontext.registerCommand(commandName, () => {\n\t\t\tconst tr = toggleMark(context.getState(), mkType(def.type));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (toolbarVisible) {\n\t\t\tconst label: string = this.getMarkLabel(def.type);\n\t\t\tcontext.registerToolbarItem({\n\t\t\t\tid: def.type,\n\t\t\t\tgroup: 'format',\n\t\t\t\ticon: def.icon,\n\t\t\t\tlabel,\n\t\t\t\ttooltip: `${label} (${formatShortcut(def.keyBinding)})`,\n\t\t\t\tcommand: commandName,\n\t\t\t\tpriority: def.rank * 10 + 10,\n\t\t\t\tseparatorAfter,\n\t\t\t\tisActive: (state) => isMarkActive(state, mkType(def.type)),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate registerKeymaps(context: PluginContext, marks: readonly MarkDefinition[]): void {\n\t\tconst keymap: Record<string, () => boolean> = {};\n\t\tfor (const def of marks) {\n\t\t\tconst commandName = toCommandName(def.type);\n\t\t\tkeymap[def.keyBinding] = () => context.executeCommand(commandName);\n\t\t}\n\t\tif (Object.keys(keymap).length > 0) {\n\t\t\tcontext.registerKeymap(keymap);\n\t\t}\n\t}\n\n\t/**\n\t * Registers disabled toolbar buttons for marks whose feature is disabled\n\t * but whose toolbar button is explicitly requested.\n\t */\n\tprivate registerDisabledToolbarItems(context: PluginContext): void {\n\t\tif (!this.config.toolbar) return;\n\n\t\tfor (const def of MARK_DEFINITIONS) {\n\t\t\tconst featureEnabled = this.config[def.configKey];\n\t\t\tconst toolbarVisible = this.config.toolbar[def.configKey] ?? true;\n\n\t\t\tif (!featureEnabled && toolbarVisible) {\n\t\t\t\tcontext.registerToolbarItem({\n\t\t\t\t\tid: def.type,\n\t\t\t\t\tgroup: 'format',\n\t\t\t\t\ticon: def.icon,\n\t\t\t\t\tlabel: this.getMarkLabel(def.type),\n\t\t\t\t\tcommand: toCommandName(def.type),\n\t\t\t\t\tpriority: def.rank * 10 + 10,\n\t\t\t\t\tisEnabled: () => false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getMarkLabel(type: string): string {\n\t\tconst key = `${type}Label` as keyof TextFormattingLocale;\n\t\treturn this.locale[key] as string;\n\t}\n\n\t/** Checks if a toolbar button should be visible for a given mark. */\n\tprivate isToolbarVisible(\n\t\tconfigKey: keyof Omit<TextFormattingConfig, 'toolbar' | 'separatorAfter' | 'locale'>,\n\t): boolean {\n\t\tif (!this.config.toolbar) return true;\n\t\treturn this.config.toolbar[configKey] ?? true;\n\t}\n}\n\n/** Converts a mark type to its toggle command name (e.g. 'bold' → 'toggleBold'). */\nfunction toCommandName(markType: string): string {\n\treturn `toggle${markType.charAt(0).toUpperCase()}${markType.slice(1)}`;\n}\n"],"names":["TEXT_FORMATTING_LOCALE_EN","boldLabel","italicLabel","underlineLabel","TEXT_FORMATTING_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","bold","italic","underline","MARK_DEFINITIONS","type","configKey","rank","tag","label","icon","keyBinding","toHTMLString","content","parseHTML","getAttrs","el","fw","style","fontWeight","numeric","Number","parseInt","isNaN","sanitize","tags","fontStyle","textDecoration","includes","TextFormattingPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","enabledMarks","filter","def","lastVisibleMark","isToolbarVisible","at","isSeparatorTarget","separatorAfter","registerMark","registerKeymaps","registerDisabledToolbarItems","commandName","toCommandName","toolbarVisible","registerMarkSpec","toDOM","document","createElement","_mark","registerCommand","tr","toggleMark","getState","mkType","dispatch","getMarkLabel","registerToolbarItem","group","tooltip","formatShortcut","command","isActive","state","isMarkActive","marks","keymap","executeCommand","Object","keys","length","registerKeymap","toolbar","featureEnabled","isEnabled","key","markType","charAt","toUpperCase","slice"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { A as t, t as e } from "./Commands-CSpSwGXv.mjs";
2
- import { r } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
- import { m as o } from "./TypeBrands-C09nE2qO.mjs";
4
- import { f as i } from "./ToolbarItem-ugDymuXi.mjs";
5
- const s = { label: "Strikethrough", tooltip: (t2) => `Strikethrough (${t2})` }, a = { en: s, de: { label: "Durchgestrichen", tooltip: (t2) => `Durchgestrichen (${t2})` }, es: { label: "Tachado", tooltip: (t2) => `Tachado (${t2})` }, fr: { label: "Barré", tooltip: (t2) => `Barré (${t2})` }, zh: { label: "删除线", tooltip: (t2) => `删除线 (${t2})` }, ru: { label: "Зачёркнутый", tooltip: (t2) => `Зачёркнутый (${t2})` }, ar: { label: "يتوسطه خط", tooltip: (t2) => `يتوسطه خط (${t2})` }, hi: { label: "स्ट्राइकथ्रू", tooltip: (t2) => `स्ट्राइकथ्रू (${t2})` } }, l = {};
1
+ import { r as t } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
+ import { m as e } from "./TypeBrands-C09nE2qO.mjs";
3
+ import { f as r } from "./ToolbarItem-BpZggUGo.mjs";
4
+ import { e as o, b as i } from "./MarkCommands-CC37WA7Z.mjs";
5
+ const a = { label: "Strikethrough", tooltip: (t2) => `Strikethrough (${t2})` }, s = { en: a, de: { label: "Durchgestrichen", tooltip: (t2) => `Durchgestrichen (${t2})` }, es: { label: "Tachado", tooltip: (t2) => `Tachado (${t2})` }, fr: { label: "Barré", tooltip: (t2) => `Barré (${t2})` }, zh: { label: "删除线", tooltip: (t2) => `删除线 (${t2})` }, ru: { label: "Зачёркнутый", tooltip: (t2) => `Зачёркнутый (${t2})` }, ar: { label: "يتوسطه خط", tooltip: (t2) => `يتوسطه خط (${t2})` }, hi: { label: "स्ट्राइकथ्रू", tooltip: (t2) => `स्ट्राइकथ्रू (${t2})` } }, l = {};
6
6
  class h {
7
7
  id = "strikethrough";
8
8
  name = "Strikethrough";
@@ -12,28 +12,28 @@ class h {
12
12
  constructor(t2) {
13
13
  this.config = { ...l, ...t2 };
14
14
  }
15
- init(t2) {
16
- this.locale = r(a, t2, this.config.locale), this.registerMarkSpec(t2), this.registerCommand(t2), this.registerKeymap(t2), this.registerToolbarItem(t2);
15
+ init(e2) {
16
+ this.locale = t(s, e2, this.config.locale), this.registerMarkSpec(e2), this.registerCommand(e2), this.registerKeymap(e2), this.registerToolbarItem(e2);
17
17
  }
18
18
  registerMarkSpec(t2) {
19
19
  t2.registerMarkSpec({ type: "strikethrough", rank: 3, toDOM: () => document.createElement("s"), toHTMLString: (t3, e2) => `<s>${e2}</s>`, parseHTML: [{ tag: "s" }, { tag: "strike" }, { tag: "del" }, { tag: "span", getAttrs: (t3) => !!t3.style.textDecoration.includes("line-through") && {} }], sanitize: { tags: ["s"] } });
20
20
  }
21
- registerCommand(e2) {
22
- e2.registerCommand("toggleStrikethrough", () => {
23
- const r2 = t(e2.getState(), o("strikethrough"));
24
- return !!r2 && (e2.dispatch(r2), true);
21
+ registerCommand(t2) {
22
+ t2.registerCommand("toggleStrikethrough", () => {
23
+ const r2 = o(t2.getState(), e("strikethrough"));
24
+ return !!r2 && (t2.dispatch(r2), true);
25
25
  });
26
26
  }
27
27
  registerKeymap(t2) {
28
28
  t2.registerKeymap({ "Mod-Shift-X": () => t2.executeCommand("toggleStrikethrough") });
29
29
  }
30
30
  registerToolbarItem(t2) {
31
- t2.registerToolbarItem({ id: "strikethrough", group: "format", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z"/></svg>', label: this.locale.label, tooltip: this.locale.tooltip(i("Mod-Shift-X")), command: "toggleStrikethrough", priority: 40, separatorAfter: this.config.separatorAfter, isActive: (t3) => e(t3, o("strikethrough")) });
31
+ t2.registerToolbarItem({ id: "strikethrough", group: "format", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z"/></svg>', label: this.locale.label, tooltip: this.locale.tooltip(r("Mod-Shift-X")), command: "toggleStrikethrough", priority: 40, separatorAfter: this.config.separatorAfter, isActive: (t3) => i(t3, e("strikethrough")) });
32
32
  }
33
33
  }
34
34
  export {
35
- a as S,
35
+ h as S,
36
36
  s as a,
37
- h as b
37
+ a as b
38
38
  };
39
- //# sourceMappingURL=index-DfO_fKw6.mjs.map
39
+ //# sourceMappingURL=index-DMt3ojrY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DfO_fKw6.mjs","sources":["../../src/plugins/strikethrough/StrikethroughLocale.ts","../../src/plugins/strikethrough/StrikethroughPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the StrikethroughPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface StrikethroughLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const STRIKETHROUGH_LOCALE_EN: StrikethroughLocale = {\n\tlabel: 'Strikethrough',\n\ttooltip: (shortcut: string) => `Strikethrough (${shortcut})`,\n};\n\n// --- German Locale ---\n\nexport const STRIKETHROUGH_LOCALE_DE: StrikethroughLocale = {\n\tlabel: 'Durchgestrichen',\n\ttooltip: (shortcut: string) => `Durchgestrichen (${shortcut})`,\n};\n\n// --- Spanish Locale ---\n\nexport const STRIKETHROUGH_LOCALE_ES: StrikethroughLocale = {\n\tlabel: 'Tachado',\n\ttooltip: (shortcut: string) => `Tachado (${shortcut})`,\n};\n\n// --- French Locale ---\n\nexport const STRIKETHROUGH_LOCALE_FR: StrikethroughLocale = {\n\tlabel: 'Barré',\n\ttooltip: (shortcut: string) => `Barré (${shortcut})`,\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const STRIKETHROUGH_LOCALE_ZH: StrikethroughLocale = {\n\tlabel: '删除线',\n\ttooltip: (shortcut: string) => `删除线 (${shortcut})`,\n};\n\n// --- Russian Locale ---\n\nexport const STRIKETHROUGH_LOCALE_RU: StrikethroughLocale = {\n\tlabel: 'Зачёркнутый',\n\ttooltip: (shortcut: string) => `Зачёркнутый (${shortcut})`,\n};\n\n// --- Arabic Locale ---\n\nexport const STRIKETHROUGH_LOCALE_AR: StrikethroughLocale = {\n\tlabel: 'يتوسطه خط',\n\ttooltip: (shortcut: string) => `يتوسطه خط (${shortcut})`,\n};\n\n// --- Hindi Locale ---\n\nexport const STRIKETHROUGH_LOCALE_HI: StrikethroughLocale = {\n\tlabel: 'स्ट्राइकथ्रू',\n\ttooltip: (shortcut: string) => `स्ट्राइकथ्रू (${shortcut})`,\n};\n\n// --- Locale Map ---\n\nexport const STRIKETHROUGH_LOCALES: Record<string, StrikethroughLocale> = {\n\ten: STRIKETHROUGH_LOCALE_EN,\n\tde: STRIKETHROUGH_LOCALE_DE,\n\tes: STRIKETHROUGH_LOCALE_ES,\n\tfr: STRIKETHROUGH_LOCALE_FR,\n\tzh: STRIKETHROUGH_LOCALE_ZH,\n\tru: STRIKETHROUGH_LOCALE_RU,\n\tar: STRIKETHROUGH_LOCALE_AR,\n\thi: STRIKETHROUGH_LOCALE_HI,\n};\n","/**\n * StrikethroughPlugin: registers a strikethrough inline mark with MarkSpec,\n * toggle command, keyboard shortcut (Mod-Shift-X), and a toolbar button.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\nimport { STRIKETHROUGH_LOCALES, type StrikethroughLocale } from './StrikethroughLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tstrikethrough: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface StrikethroughConfig {\n\t/** When true, a separator is rendered after the strikethrough toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: StrikethroughLocale;\n}\n\nconst DEFAULT_CONFIG: StrikethroughConfig = {};\n\n// --- Plugin ---\n\nexport class StrikethroughPlugin implements Plugin {\n\treadonly id = 'strikethrough';\n\treadonly name = 'Strikethrough';\n\treadonly priority = 22;\n\n\tprivate readonly config: StrikethroughConfig;\n\tprivate locale!: StrikethroughLocale;\n\n\tconstructor(config?: Partial<StrikethroughConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(STRIKETHROUGH_LOCALES, context, this.config.locale);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommand(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'strikethrough',\n\t\t\trank: 3,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement('s');\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => `<s>${content}</s>`,\n\t\t\tparseHTML: [\n\t\t\t\t{ tag: 's' },\n\t\t\t\t{ tag: 'strike' },\n\t\t\t\t{ tag: 'del' },\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\t\treturn el.style.textDecoration.includes('line-through') ? {} : false;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['s'] },\n\t\t});\n\t}\n\n\tprivate registerCommand(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleStrikethrough', () => {\n\t\t\tconst tr = toggleMark(context.getState(), markType('strikethrough'));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-X': () => context.executeCommand('toggleStrikethrough'),\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=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'strikethrough',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-Shift-X')),\n\t\t\tcommand: 'toggleStrikethrough',\n\t\t\tpriority: 40,\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\tisActive: (state) => isMarkActive(state, markType('strikethrough')),\n\t\t});\n\t}\n}\n"],"names":["STRIKETHROUGH_LOCALE_EN","label","tooltip","shortcut","STRIKETHROUGH_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","StrikethroughPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","registerMarkSpec","registerCommand","registerKeymap","registerToolbarItem","type","rank","toDOM","document","createElement","toHTMLString","_mark","content","parseHTML","tag","getAttrs","el","style","textDecoration","includes","sanitize","tags","tr","toggleMark","getState","markType","dispatch","executeCommand","group","icon","formatShortcut","command","separatorAfter","isActive","state","isMarkActive"],"mappings":";;;;AAaO,MAAMA,IAA+C,EAC3DC,OAAO,iBACPC,SAAUC,CAAAA,OAAqB,kBAAkBA,EAAAA,IAAAA,GAsDrCC,IAA6D,EACzEC,IAAIL,GACJM,IAnD2D,EAC3DL,OAAO,mBACPC,SAAUC,CAAAA,OAAqB,oBAAoBA,EAAAA,IAAAA,GAkDnDI,IA7C2D,EAC3DN,OAAO,WACPC,SAAUC,CAAAA,OAAqB,YAAYA,EAAAA,IAAAA,GA4C3CK,IAvC2D,EAC3DP,OAAO,SACPC,SAAUC,CAAAA,OAAqB,UAAUA,EAAAA,IAAAA,GAsCzCM,IAjC2D,EAC3DR,OAAO,OACPC,SAAUC,CAAAA,OAAqB,QAAQA,EAAAA,IAAAA,GAgCvCO,IA3B2D,EAC3DT,OAAO,eACPC,SAAUC,CAAAA,OAAqB,gBAAgBA,SA0B/CQ,IArB2D,EAC3DV,OAAO,aACPC,SAAUC,CAAAA,OAAqB,cAAcA,EAAAA,IAAAA,GAoB7CS,IAf2D,EAC3DX,OAAO,gBACPC,SAAUC,CAAAA,OAAqB,iBAAiBA,EAAAA,IAAAA,EAAAA,GCpC3CU,IAAsC,CAAA;AAIrC,MAAMC,EAAAA;AAAAA,EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACTC;AAAAA,EAER,YAAYD,IAAAA;AACXE,SAAKF,SAAS,EAAA,GAAKL,GAAAA,GAAmBK,GAAAA;AAAAA,EACvC;AAAA,EAEA,KAAKG,IAAAA;AACJD,SAAKD,SAASG,EAAoBlB,GAAuBiB,IAASD,KAAKF,OAAOC,MAAAA,GAC9EC,KAAKG,iBAAiBF,EAAAA,GACtBD,KAAKI,gBAAgBH,EAAAA,GACrBD,KAAKK,eAAeJ,EAAAA,GACpBD,KAAKM,oBAAoBL,EAAAA;AAAAA,EAC1B;AAAA,EAEQ,iBAAiBA,IAAAA;AACxBA,IAAAA,GAAQE,iBAAiB,EACxBI,MAAM,iBACNC,MAAM,GACNC,OAAA,MACQC,SAASC,cAAc,GAAA,GAE/BC,cAAc,CAACC,IAAOC,OAAY,MAAMA,EAAAA,QACxCC,WAAW,CACV,EAAEC,KAAK,IAAA,GACP,EAAEA,KAAK,SAAA,GACP,EAAEA,KAAK,MAAA,GACP,EACCA,KAAK,QACLC,UAAWC,CAAAA,OAAAA,CAAAA,CACHA,GAAGC,MAAMC,eAAeC,SAAS,cAAA,KAAkB,CAAA,EAAA,CAAA,GAI7DC,UAAU,EAAEC,MAAM,CAAC,GAAA,EAAA,EAAA,CAAA;AAAA,EAErB;AAAA,EAEQ,gBAAgBtB,IAAAA;AACvBA,IAAAA,GAAQG,gBAAgB,uBAAuB,MAAA;AAC9C,YAAMoB,KAAKC,EAAWxB,GAAQyB,YAAYC,EAAS,eAAA,CAAA;AACnD,aAAA,CAAA,CAAIH,OACHvB,GAAQ2B,SAASJ,EAAAA,GAAAA;AAAAA,IACV,CAAA;AAAA,EAIV;AAAA,EAEQ,eAAevB,IAAAA;AACtBA,IAAAA,GAAQI,eAAe,EACtB,eAAe,MAAMJ,GAAQ4B,eAAe,qBAAA,EAAA,CAAA;AAAA,EAE9C;AAAA,EAEQ,oBAAoB5B,IAAAA;AAI3BA,IAAAA,GAAQK,oBAAoB,EAC3BX,IAAI,iBACJmC,OAAO,UACPC,MALA,wIAMAlD,OAAOmB,KAAKD,OAAOlB,OACnBC,SAASkB,KAAKD,OAAOjB,QAAQkD,EAAe,aAAA,CAAA,GAC5CC,SAAS,uBACTpC,UAAU,IACVqC,gBAAgBlC,KAAKF,OAAOoC,gBAC5BC,UAAWC,CAAAA,OAAUC,EAAaD,IAAOT,EAAS,eAAA,CAAA,EAAA,CAAA;AAAA,EAEpD;AAAA;"}
1
+ {"version":3,"file":"index-DMt3ojrY.mjs","sources":["../../src/plugins/strikethrough/StrikethroughLocale.ts","../../src/plugins/strikethrough/StrikethroughPlugin.ts"],"sourcesContent":["/**\n * Locale interface and default English locale for the StrikethroughPlugin.\n */\n\n// --- Locale Interface ---\n\nexport interface StrikethroughLocale {\n\treadonly label: string;\n\treadonly tooltip: (shortcut: string) => string;\n}\n\n// --- Default English Locale ---\n\nexport const STRIKETHROUGH_LOCALE_EN: StrikethroughLocale = {\n\tlabel: 'Strikethrough',\n\ttooltip: (shortcut: string) => `Strikethrough (${shortcut})`,\n};\n\n// --- German Locale ---\n\nexport const STRIKETHROUGH_LOCALE_DE: StrikethroughLocale = {\n\tlabel: 'Durchgestrichen',\n\ttooltip: (shortcut: string) => `Durchgestrichen (${shortcut})`,\n};\n\n// --- Spanish Locale ---\n\nexport const STRIKETHROUGH_LOCALE_ES: StrikethroughLocale = {\n\tlabel: 'Tachado',\n\ttooltip: (shortcut: string) => `Tachado (${shortcut})`,\n};\n\n// --- French Locale ---\n\nexport const STRIKETHROUGH_LOCALE_FR: StrikethroughLocale = {\n\tlabel: 'Barré',\n\ttooltip: (shortcut: string) => `Barré (${shortcut})`,\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const STRIKETHROUGH_LOCALE_ZH: StrikethroughLocale = {\n\tlabel: '删除线',\n\ttooltip: (shortcut: string) => `删除线 (${shortcut})`,\n};\n\n// --- Russian Locale ---\n\nexport const STRIKETHROUGH_LOCALE_RU: StrikethroughLocale = {\n\tlabel: 'Зачёркнутый',\n\ttooltip: (shortcut: string) => `Зачёркнутый (${shortcut})`,\n};\n\n// --- Arabic Locale ---\n\nexport const STRIKETHROUGH_LOCALE_AR: StrikethroughLocale = {\n\tlabel: 'يتوسطه خط',\n\ttooltip: (shortcut: string) => `يتوسطه خط (${shortcut})`,\n};\n\n// --- Hindi Locale ---\n\nexport const STRIKETHROUGH_LOCALE_HI: StrikethroughLocale = {\n\tlabel: 'स्ट्राइकथ्रू',\n\ttooltip: (shortcut: string) => `स्ट्राइकथ्रू (${shortcut})`,\n};\n\n// --- Locale Map ---\n\nexport const STRIKETHROUGH_LOCALES: Record<string, StrikethroughLocale> = {\n\ten: STRIKETHROUGH_LOCALE_EN,\n\tde: STRIKETHROUGH_LOCALE_DE,\n\tes: STRIKETHROUGH_LOCALE_ES,\n\tfr: STRIKETHROUGH_LOCALE_FR,\n\tzh: STRIKETHROUGH_LOCALE_ZH,\n\tru: STRIKETHROUGH_LOCALE_RU,\n\tar: STRIKETHROUGH_LOCALE_AR,\n\thi: STRIKETHROUGH_LOCALE_HI,\n};\n","/**\n * StrikethroughPlugin: registers a strikethrough inline mark with MarkSpec,\n * toggle command, keyboard shortcut (Mod-Shift-X), and a toolbar button.\n */\n\nimport { isMarkActive, toggleMark } from '../../commands/Commands.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\nimport { STRIKETHROUGH_LOCALES, type StrikethroughLocale } from './StrikethroughLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tstrikethrough: Record<string, never>;\n\t}\n}\n\n// --- Configuration ---\n\nexport interface StrikethroughConfig {\n\t/** When true, a separator is rendered after the strikethrough toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: StrikethroughLocale;\n}\n\nconst DEFAULT_CONFIG: StrikethroughConfig = {};\n\n// --- Plugin ---\n\nexport class StrikethroughPlugin implements Plugin {\n\treadonly id = 'strikethrough';\n\treadonly name = 'Strikethrough';\n\treadonly priority = 22;\n\n\tprivate readonly config: StrikethroughConfig;\n\tprivate locale!: StrikethroughLocale;\n\n\tconstructor(config?: Partial<StrikethroughConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(STRIKETHROUGH_LOCALES, context, this.config.locale);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommand(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'strikethrough',\n\t\t\trank: 3,\n\t\t\ttoDOM() {\n\t\t\t\treturn document.createElement('s');\n\t\t\t},\n\t\t\ttoHTMLString: (_mark, content) => `<s>${content}</s>`,\n\t\t\tparseHTML: [\n\t\t\t\t{ tag: 's' },\n\t\t\t\t{ tag: 'strike' },\n\t\t\t\t{ tag: 'del' },\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el: HTMLElement) => {\n\t\t\t\t\t\treturn el.style.textDecoration.includes('line-through') ? {} : false;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['s'] },\n\t\t});\n\t}\n\n\tprivate registerCommand(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleStrikethrough', () => {\n\t\t\tconst tr = toggleMark(context.getState(), markType('strikethrough'));\n\t\t\tif (tr) {\n\t\t\t\tcontext.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-Shift-X': () => context.executeCommand('toggleStrikethrough'),\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=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'strikethrough',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip(formatShortcut('Mod-Shift-X')),\n\t\t\tcommand: 'toggleStrikethrough',\n\t\t\tpriority: 40,\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\tisActive: (state) => isMarkActive(state, markType('strikethrough')),\n\t\t});\n\t}\n}\n"],"names":["STRIKETHROUGH_LOCALE_EN","label","tooltip","shortcut","STRIKETHROUGH_LOCALES","en","de","es","fr","zh","ru","ar","hi","DEFAULT_CONFIG","StrikethroughPlugin","id","name","priority","config","locale","this","context","resolvePluginLocale","registerMarkSpec","registerCommand","registerKeymap","registerToolbarItem","type","rank","toDOM","document","createElement","toHTMLString","_mark","content","parseHTML","tag","getAttrs","el","style","textDecoration","includes","sanitize","tags","tr","toggleMark","getState","markType","dispatch","executeCommand","group","icon","formatShortcut","command","separatorAfter","isActive","state","isMarkActive"],"mappings":";;;;AAaO,MAAMA,IAA+C,EAC3DC,OAAO,iBACPC,SAAUC,CAAAA,OAAqB,kBAAkBA,EAAAA,IAAAA,GAsDrCC,IAA6D,EACzEC,IAAIL,GACJM,IAnD2D,EAC3DL,OAAO,mBACPC,SAAUC,CAAAA,OAAqB,oBAAoBA,EAAAA,IAAAA,GAkDnDI,IA7C2D,EAC3DN,OAAO,WACPC,SAAUC,CAAAA,OAAqB,YAAYA,EAAAA,IAAAA,GA4C3CK,IAvC2D,EAC3DP,OAAO,SACPC,SAAUC,CAAAA,OAAqB,UAAUA,EAAAA,IAAAA,GAsCzCM,IAjC2D,EAC3DR,OAAO,OACPC,SAAUC,CAAAA,OAAqB,QAAQA,EAAAA,IAAAA,GAgCvCO,IA3B2D,EAC3DT,OAAO,eACPC,SAAUC,CAAAA,OAAqB,gBAAgBA,SA0B/CQ,IArB2D,EAC3DV,OAAO,aACPC,SAAUC,CAAAA,OAAqB,cAAcA,EAAAA,IAAAA,GAoB7CS,IAf2D,EAC3DX,OAAO,gBACPC,SAAUC,CAAAA,OAAqB,iBAAiBA,EAAAA,IAAAA,EAAAA,GCpC3CU,IAAsC,CAAA;AAIrC,MAAMC,EAAAA;AAAAA,EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACTC;AAAAA,EAER,YAAYD,IAAAA;AACXE,SAAKF,SAAS,EAAA,GAAKL,GAAAA,GAAmBK,GAAAA;AAAAA,EACvC;AAAA,EAEA,KAAKG,IAAAA;AACJD,SAAKD,SAASG,EAAoBlB,GAAuBiB,IAASD,KAAKF,OAAOC,MAAAA,GAC9EC,KAAKG,iBAAiBF,EAAAA,GACtBD,KAAKI,gBAAgBH,EAAAA,GACrBD,KAAKK,eAAeJ,EAAAA,GACpBD,KAAKM,oBAAoBL,EAAAA;AAAAA,EAC1B;AAAA,EAEQ,iBAAiBA,IAAAA;AACxBA,IAAAA,GAAQE,iBAAiB,EACxBI,MAAM,iBACNC,MAAM,GACNC,OAAA,MACQC,SAASC,cAAc,GAAA,GAE/BC,cAAc,CAACC,IAAOC,OAAY,MAAMA,EAAAA,QACxCC,WAAW,CACV,EAAEC,KAAK,IAAA,GACP,EAAEA,KAAK,SAAA,GACP,EAAEA,KAAK,MAAA,GACP,EACCA,KAAK,QACLC,UAAWC,CAAAA,OAAAA,CAAAA,CACHA,GAAGC,MAAMC,eAAeC,SAAS,cAAA,KAAkB,CAAA,EAAA,CAAA,GAI7DC,UAAU,EAAEC,MAAM,CAAC,GAAA,EAAA,EAAA,CAAA;AAAA,EAErB;AAAA,EAEQ,gBAAgBtB,IAAAA;AACvBA,IAAAA,GAAQG,gBAAgB,uBAAuB,MAAA;AAC9C,YAAMoB,KAAKC,EAAWxB,GAAQyB,YAAYC,EAAS,eAAA,CAAA;AACnD,aAAA,CAAA,CAAIH,OACHvB,GAAQ2B,SAASJ,EAAAA,GAAAA;AAAAA,IACV,CAAA;AAAA,EAIV;AAAA,EAEQ,eAAevB,IAAAA;AACtBA,IAAAA,GAAQI,eAAe,EACtB,eAAe,MAAMJ,GAAQ4B,eAAe,qBAAA,EAAA,CAAA;AAAA,EAE9C;AAAA,EAEQ,oBAAoB5B,IAAAA;AAI3BA,IAAAA,GAAQK,oBAAoB,EAC3BX,IAAI,iBACJmC,OAAO,UACPC,MALA,wIAMAlD,OAAOmB,KAAKD,OAAOlB,OACnBC,SAASkB,KAAKD,OAAOjB,QAAQkD,EAAe,aAAA,CAAA,GAC5CC,SAAS,uBACTpC,UAAU,IACVqC,gBAAgBlC,KAAKF,OAAOoC,gBAC5BC,UAAWC,CAAAA,OAAUC,EAAaD,IAAOT,EAAS,eAAA,CAAA,EAAA,CAAA;AAAA,EAEpD;AAAA;"}