@notectl/core 1.0.5 → 1.0.8

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 (250) hide show
  1. package/README.md +78 -55
  2. package/custom-elements.json +344 -0
  3. package/dist/chunks/{AttrRegistry-DTsHyDVA.mjs → AttrRegistry-D-przlzb.mjs} +4 -4
  4. package/dist/chunks/{AttrRegistry-DTsHyDVA.mjs.map → AttrRegistry-D-przlzb.mjs.map} +1 -1
  5. package/dist/chunks/ColorNames-iaWsSZx1.mjs +35 -0
  6. package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +1 -0
  7. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +140 -0
  8. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +1 -0
  9. package/dist/chunks/{Commands-DLP85Mp5.mjs → Commands-CSpSwGXv.mjs} +13 -13
  10. package/dist/chunks/{Commands-DLP85Mp5.mjs.map → Commands-CSpSwGXv.mjs.map} +1 -1
  11. package/dist/chunks/ToolbarKeyboardNav-B32OMv8r.mjs +46 -0
  12. package/dist/chunks/ToolbarKeyboardNav-B32OMv8r.mjs.map +1 -0
  13. package/dist/chunks/{ToolbarPlugin-D5VqeBPT.mjs → ToolbarPlugin-DY2xaJiu.mjs} +63 -93
  14. package/dist/chunks/ToolbarPlugin-DY2xaJiu.mjs.map +1 -0
  15. package/dist/chunks/index-BAk1EG1x.mjs +541 -0
  16. package/dist/chunks/index-BAk1EG1x.mjs.map +1 -0
  17. package/dist/chunks/index-BRYzYOYC.mjs +63 -0
  18. package/dist/chunks/index-BRYzYOYC.mjs.map +1 -0
  19. package/dist/chunks/index-BSFLNveF.mjs +953 -0
  20. package/dist/chunks/index-BSFLNveF.mjs.map +1 -0
  21. package/dist/chunks/index-BYgspns5.mjs +209 -0
  22. package/dist/chunks/index-BYgspns5.mjs.map +1 -0
  23. package/dist/chunks/index-B_3qDrUN.mjs +64 -0
  24. package/dist/chunks/index-B_3qDrUN.mjs.map +1 -0
  25. package/dist/chunks/index-Bsp4LC5t.mjs +130 -0
  26. package/dist/chunks/index-Bsp4LC5t.mjs.map +1 -0
  27. package/dist/chunks/index-C-YWHOcC.mjs +100 -0
  28. package/dist/chunks/index-C-YWHOcC.mjs.map +1 -0
  29. package/dist/chunks/index-C2GQoHot.mjs +92 -0
  30. package/dist/chunks/index-C2GQoHot.mjs.map +1 -0
  31. package/dist/chunks/index-CT3HGdQt.mjs +39 -0
  32. package/dist/chunks/index-CT3HGdQt.mjs.map +1 -0
  33. package/dist/chunks/index-Ct0ivLhO.mjs +407 -0
  34. package/dist/chunks/index-Ct0ivLhO.mjs.map +1 -0
  35. package/dist/chunks/index-CxiWyUho.mjs +191 -0
  36. package/dist/chunks/index-CxiWyUho.mjs.map +1 -0
  37. package/dist/chunks/index-D3CQWJiw.mjs +200 -0
  38. package/dist/chunks/index-D3CQWJiw.mjs.map +1 -0
  39. package/dist/chunks/index-DC1EK22F.mjs +41 -0
  40. package/dist/chunks/index-DC1EK22F.mjs.map +1 -0
  41. package/dist/chunks/index-Dh76rR13.mjs +196 -0
  42. package/dist/chunks/index-Dh76rR13.mjs.map +1 -0
  43. package/dist/chunks/index-o6hDR07y.mjs +41 -0
  44. package/dist/chunks/index-o6hDR07y.mjs.map +1 -0
  45. package/dist/chunks/index-uTnc9y7M.mjs +62 -0
  46. package/dist/chunks/index-uTnc9y7M.mjs.map +1 -0
  47. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs +34 -0
  48. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -0
  49. package/dist/editor/EditorDOM.d.ts.map +1 -1
  50. package/dist/editor/NotectlEditor.d.ts +15 -1
  51. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  52. package/dist/editor/PaperLayoutController.d.ts +27 -0
  53. package/dist/editor/PaperLayoutController.d.ts.map +1 -0
  54. package/dist/editor/PaperSize.d.ts +35 -0
  55. package/dist/editor/PaperSize.d.ts.map +1 -0
  56. package/dist/editor/styles/color-picker.d.ts +1 -1
  57. package/dist/editor/styles/color-picker.d.ts.map +1 -1
  58. package/dist/editor/styles/paper.d.ts +3 -0
  59. package/dist/editor/styles/paper.d.ts.map +1 -0
  60. package/dist/editor/styles/table.d.ts +1 -1
  61. package/dist/editor/styles/table.d.ts.map +1 -1
  62. package/dist/editor/styles/toolbar.d.ts +1 -1
  63. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  64. package/dist/editor/styles.d.ts.map +1 -1
  65. package/dist/i18n/Locale.d.ts +17 -0
  66. package/dist/i18n/Locale.d.ts.map +1 -0
  67. package/dist/i18n/LocaleService.d.ts +8 -0
  68. package/dist/i18n/LocaleService.d.ts.map +1 -0
  69. package/dist/i18n/index.d.ts +4 -0
  70. package/dist/i18n/index.d.ts.map +1 -0
  71. package/dist/i18n/resolvePluginLocale.d.ts +3 -0
  72. package/dist/i18n/resolvePluginLocale.d.ts.map +1 -0
  73. package/dist/index.d.ts +44 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  76. package/dist/input/InputHandler.d.ts.map +1 -1
  77. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  78. package/dist/input/PasteHandler.d.ts.map +1 -1
  79. package/dist/notectl-core.mjs +1145 -837
  80. package/dist/notectl-core.mjs.map +1 -1
  81. package/dist/notectl-core.umd.js +2368 -1826
  82. package/dist/notectl-core.umd.js.map +1 -1
  83. package/dist/plugins/PluginManager.d.ts +8 -1
  84. package/dist/plugins/PluginManager.d.ts.map +1 -1
  85. package/dist/plugins/alignment/AlignmentLocale.d.ts +19 -0
  86. package/dist/plugins/alignment/AlignmentLocale.d.ts.map +1 -0
  87. package/dist/plugins/alignment/AlignmentPlugin.d.ts +4 -0
  88. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  89. package/dist/plugins/alignment.mjs +3 -89
  90. package/dist/plugins/alignment.mjs.map +1 -1
  91. package/dist/plugins/blockquote/BlockquoteLocale.d.ts +17 -0
  92. package/dist/plugins/blockquote/BlockquoteLocale.d.ts.map +1 -0
  93. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +3 -0
  94. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  95. package/dist/plugins/blockquote.mjs +2 -55
  96. package/dist/plugins/blockquote.mjs.map +1 -1
  97. package/dist/plugins/code-block/CodeBlockCommands.d.ts +5 -0
  98. package/dist/plugins/code-block/CodeBlockCommands.d.ts.map +1 -0
  99. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts +10 -0
  100. package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -0
  101. package/dist/plugins/code-block/CodeBlockLocale.d.ts +17 -0
  102. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -0
  103. package/dist/plugins/code-block/CodeBlockNodeView.d.ts +1 -1
  104. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
  105. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +4 -111
  106. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  107. package/dist/plugins/code-block/CodeBlockService.d.ts +5 -0
  108. package/dist/plugins/code-block/CodeBlockService.d.ts.map +1 -0
  109. package/dist/plugins/code-block/CodeBlockTypes.d.ts +71 -0
  110. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -0
  111. package/dist/plugins/code-block.mjs +3 -3
  112. package/dist/plugins/font/FontLocale.d.ts +15 -0
  113. package/dist/plugins/font/FontLocale.d.ts.map +1 -0
  114. package/dist/plugins/font/FontPlugin.d.ts +3 -0
  115. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  116. package/dist/plugins/font-size/FontSizeLocale.d.ts +17 -0
  117. package/dist/plugins/font-size/FontSizeLocale.d.ts.map +1 -0
  118. package/dist/plugins/font-size/FontSizeOperations.d.ts +22 -0
  119. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -0
  120. package/dist/plugins/font-size/FontSizePlugin.d.ts +4 -10
  121. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  122. package/dist/plugins/font-size/FontSizePopup.d.ts +11 -0
  123. package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -0
  124. package/dist/plugins/font-size.mjs +2 -217
  125. package/dist/plugins/font-size.mjs.map +1 -1
  126. package/dist/plugins/font.mjs +2 -183
  127. package/dist/plugins/font.mjs.map +1 -1
  128. package/dist/plugins/hard-break.mjs +1 -1
  129. package/dist/plugins/heading/HeadingLocale.d.ts +26 -0
  130. package/dist/plugins/heading/HeadingLocale.d.ts.map +1 -0
  131. package/dist/plugins/heading/HeadingPlugin.d.ts +4 -0
  132. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  133. package/dist/plugins/heading.mjs +1 -184
  134. package/dist/plugins/heading.mjs.map +1 -1
  135. package/dist/plugins/highlight/HighlightLocale.d.ts +17 -0
  136. package/dist/plugins/highlight/HighlightLocale.d.ts.map +1 -0
  137. package/dist/plugins/highlight/HighlightPlugin.d.ts +3 -5
  138. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  139. package/dist/plugins/highlight.mjs +2 -123
  140. package/dist/plugins/highlight.mjs.map +1 -1
  141. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts +15 -0
  142. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts.map +1 -0
  143. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +4 -0
  144. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  145. package/dist/plugins/horizontal-rule.mjs +2 -56
  146. package/dist/plugins/horizontal-rule.mjs.map +1 -1
  147. package/dist/plugins/image/ImageLocale.d.ts +25 -0
  148. package/dist/plugins/image/ImageLocale.d.ts.map +1 -0
  149. package/dist/plugins/image/ImageNodeView.d.ts.map +1 -1
  150. package/dist/plugins/image/ImagePlugin.d.ts +1 -0
  151. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  152. package/dist/plugins/image/ImageUpload.d.ts +3 -0
  153. package/dist/plugins/image/ImageUpload.d.ts.map +1 -1
  154. package/dist/plugins/image.mjs +4 -378
  155. package/dist/plugins/image.mjs.map +1 -1
  156. package/dist/plugins/link/LinkLocale.d.ts +23 -0
  157. package/dist/plugins/link/LinkLocale.d.ts.map +1 -0
  158. package/dist/plugins/link/LinkPlugin.d.ts +3 -0
  159. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  160. package/dist/plugins/link.mjs +2 -124
  161. package/dist/plugins/link.mjs.map +1 -1
  162. package/dist/plugins/list/ListLocale.d.ts +18 -0
  163. package/dist/plugins/list/ListLocale.d.ts.map +1 -0
  164. package/dist/plugins/list/ListPlugin.d.ts +4 -0
  165. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  166. package/dist/plugins/list.mjs +2 -190
  167. package/dist/plugins/list.mjs.map +1 -1
  168. package/dist/plugins/print/PrintContentPreparer.d.ts +12 -0
  169. package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -0
  170. package/dist/plugins/print/PrintLocale.d.ts +16 -0
  171. package/dist/plugins/print/PrintLocale.d.ts.map +1 -0
  172. package/dist/plugins/print/PrintPlugin.d.ts +13 -0
  173. package/dist/plugins/print/PrintPlugin.d.ts.map +1 -0
  174. package/dist/plugins/print/PrintServiceImpl.d.ts +7 -0
  175. package/dist/plugins/print/PrintServiceImpl.d.ts.map +1 -0
  176. package/dist/plugins/print/PrintStyleCollector.d.ts +17 -0
  177. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -0
  178. package/dist/plugins/print/PrintTypes.d.ts +61 -0
  179. package/dist/plugins/print/PrintTypes.d.ts.map +1 -0
  180. package/dist/plugins/shared/ColorMarkOperations.d.ts +28 -0
  181. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -0
  182. package/dist/plugins/shared/ColorNames.d.ts +22 -0
  183. package/dist/plugins/shared/ColorNames.d.ts.map +1 -0
  184. package/dist/plugins/shared/ColorPickerPopup.d.ts +31 -0
  185. package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -0
  186. package/dist/plugins/shared/ColorValidation.d.ts +14 -0
  187. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -0
  188. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts +17 -0
  189. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts.map +1 -0
  190. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +3 -0
  191. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  192. package/dist/plugins/strikethrough.mjs +2 -32
  193. package/dist/plugins/strikethrough.mjs.map +1 -1
  194. package/dist/plugins/super-sub/SuperSubLocale.d.ts +19 -0
  195. package/dist/plugins/super-sub/SuperSubLocale.d.ts.map +1 -0
  196. package/dist/plugins/super-sub/SuperSubPlugin.d.ts +3 -0
  197. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  198. package/dist/plugins/super-sub.mjs +2 -78
  199. package/dist/plugins/super-sub.mjs.map +1 -1
  200. package/dist/plugins/table/TableBorderColor.d.ts +24 -0
  201. package/dist/plugins/table/TableBorderColor.d.ts.map +1 -0
  202. package/dist/plugins/table/TableCommands.d.ts +9 -8
  203. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  204. package/dist/plugins/table/TableContextMenu.d.ts +14 -0
  205. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -0
  206. package/dist/plugins/table/TableControls.d.ts +3 -1
  207. package/dist/plugins/table/TableControls.d.ts.map +1 -1
  208. package/dist/plugins/table/TableControlsDOM.d.ts +13 -1
  209. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -1
  210. package/dist/plugins/table/TableLocale.d.ts +48 -0
  211. package/dist/plugins/table/TableLocale.d.ts.map +1 -0
  212. package/dist/plugins/table/TableNavigation.d.ts +2 -1
  213. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  214. package/dist/plugins/table/TableNodeViews.d.ts +3 -1
  215. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -1
  216. package/dist/plugins/table/TablePlugin.d.ts +7 -1
  217. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  218. package/dist/plugins/table/index.d.ts +3 -0
  219. package/dist/plugins/table/index.d.ts.map +1 -1
  220. package/dist/plugins/table.mjs +18 -660
  221. package/dist/plugins/table.mjs.map +1 -1
  222. package/dist/plugins/text-color/TextColorLocale.d.ts +17 -0
  223. package/dist/plugins/text-color/TextColorLocale.d.ts.map +1 -0
  224. package/dist/plugins/text-color/TextColorPlugin.d.ts +3 -5
  225. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  226. package/dist/plugins/text-color.mjs +2 -123
  227. package/dist/plugins/text-color.mjs.map +1 -1
  228. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts +18 -0
  229. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts.map +1 -0
  230. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +4 -0
  231. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  232. package/dist/plugins/text-formatting.mjs +2 -49
  233. package/dist/plugins/text-formatting.mjs.map +1 -1
  234. package/dist/plugins/toolbar/ToolbarLocale.d.ts +14 -0
  235. package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -0
  236. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +1 -0
  237. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  238. package/dist/plugins/toolbar.mjs +1 -1
  239. package/dist/state/EditorState.d.ts +4 -1
  240. package/dist/state/EditorState.d.ts.map +1 -1
  241. package/dist/view/EditorView.d.ts.map +1 -1
  242. package/dist/view/Reconciler.d.ts.map +1 -1
  243. package/package.json +3 -2
  244. package/dist/chunks/Plugin-B9OZ6Y4c.mjs +0 -15
  245. package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +0 -1
  246. package/dist/chunks/ToolbarPlugin-D5VqeBPT.mjs.map +0 -1
  247. package/dist/chunks/color-picker-Csf0wx5a.mjs +0 -5
  248. package/dist/chunks/color-picker-Csf0wx5a.mjs.map +0 -1
  249. package/dist/chunks/index-CPPb-Jah.mjs +0 -569
  250. package/dist/chunks/index-CPPb-Jah.mjs.map +0 -1
@@ -0,0 +1,200 @@
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";
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 } from "./TypeBrands-C09nE2qO.mjs";
7
+ const a = { bulletList: "Bullet List", numberedList: "Numbered List", checklist: "Checklist" }, d = { en: a, 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: "चेकलिस्ट" } }, h = { types: ["bullet", "ordered", "checklist"], maxIndent: 4 }, u = [{ 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 p {
9
+ id = "list";
10
+ name = "List";
11
+ priority = 35;
12
+ config;
13
+ locale;
14
+ constructor(t2) {
15
+ this.config = { ...h, ...t2 };
16
+ }
17
+ init(e2) {
18
+ this.locale = t(d, e2, this.config.locale), e2.registerStyleSheet(`
19
+ /* List Wrappers — suppress native markers, we use ::before pseudo-elements */
20
+ .notectl-list {
21
+ list-style: none;
22
+ margin: 0;
23
+ padding: 0;
24
+ }
25
+
26
+ /* Ordered List — each <ol> wrapper resets the counter */
27
+ .notectl-list--ordered {
28
+ counter-reset: notectl-ordered;
29
+ }
30
+
31
+ /* List Items */
32
+ .notectl-list-item {
33
+ margin: 0;
34
+ padding: 2px 0 2px 24px;
35
+ min-height: 1.6em;
36
+ position: relative;
37
+ }
38
+
39
+ .notectl-list-item::before {
40
+ position: absolute;
41
+ left: 0;
42
+ display: inline-block;
43
+ width: 24px;
44
+ text-align: center;
45
+ }
46
+
47
+ /* Bullet List */
48
+ .notectl-list-item--bullet::before {
49
+ content: '\\2022';
50
+ color: var(--notectl-fg);
51
+ }
52
+
53
+ /* Ordered List — counter increment per item */
54
+ .notectl-list-item--ordered {
55
+ counter-increment: notectl-ordered;
56
+ }
57
+
58
+ .notectl-list-item--ordered::before {
59
+ content: counter(notectl-ordered) '.';
60
+ color: var(--notectl-fg);
61
+ font-size: 14px;
62
+ }
63
+
64
+ /* Checklist */
65
+ .notectl-list-item--checklist::before {
66
+ content: '\\2610';
67
+ font-size: 16px;
68
+ color: var(--notectl-fg-muted);
69
+ cursor: pointer;
70
+ }
71
+
72
+ .notectl-list-item--checklist[data-checked="true"]::before {
73
+ content: '\\2611';
74
+ color: var(--notectl-success);
75
+ }
76
+
77
+ .notectl-list-item--checklist[data-checked="true"] {
78
+ color: var(--notectl-fg-muted);
79
+ text-decoration: line-through;
80
+ }
81
+ `), this.registerNodeSpec(e2), this.registerCommands(e2), this.registerKeymaps(e2), this.registerInputRules(e2), this.registerToolbarItems(e2);
82
+ }
83
+ registerNodeSpec(t2) {
84
+ t2.registerNodeSpec({ type: "list_item", group: "block", content: { allow: ["text"] }, attrs: { listType: { default: "bullet" }, indent: { default: 0 }, checked: { default: false } }, toDOM(t3) {
85
+ const e2 = t3.attrs?.listType ?? "bullet", n2 = t3.attrs?.indent ?? 0, i2 = t3.attrs?.checked ?? false, r2 = s("li", t3.id);
86
+ 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;
87
+ }, wrapper(t3) {
88
+ const e2 = t3.attrs?.listType ?? "bullet";
89
+ return { tag: "ordered" === e2 ? "ol" : "ul", key: `list-${e2}`, className: `notectl-list notectl-list--${e2}`, attrs: { role: "list" } };
90
+ }, toHTML: (t3, e2) => `<li>${e2 || "<br>"}</li>`, parseHTML: [{ tag: "li" }], sanitize: { tags: ["ul", "ol", "li"] } });
91
+ }
92
+ registerCommands(t2) {
93
+ const e2 = this.getEnabledTypes();
94
+ for (const n2 of e2) t2.registerCommand(`toggleList:${n2.type}`, () => this.toggleList(t2, n2.type));
95
+ t2.registerCommand("indentListItem", () => this.indent(t2)), t2.registerCommand("outdentListItem", () => this.outdent(t2)), this.config.types.includes("checklist") && t2.registerCommand("toggleChecklistItem", () => this.toggleChecked(t2));
96
+ }
97
+ registerKeymaps(t2) {
98
+ t2.registerKeymap({ Enter: () => this.handleEnter(t2), Backspace: () => this.handleBackspace(t2), Tab: () => this.indent(t2), "Shift-Tab": () => this.outdent(t2) });
99
+ }
100
+ registerInputRules(t2) {
101
+ const e2 = this.getEnabledTypes();
102
+ for (const n2 of e2) t2.registerInputRule({ pattern: n2.inputPattern, handler: (t3, e3, i2, s2) => {
103
+ const a2 = t3.selection;
104
+ if (r(a2)) return null;
105
+ if (!l(a2)) return null;
106
+ const d2 = t3.getBlock(a2.anchor.blockId);
107
+ if (!d2 || "paragraph" !== d2.type) return null;
108
+ const h2 = e3[0] ?? "", u2 = h2.length, p2 = { listType: n2.type, indent: 0 };
109
+ 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();
110
+ } });
111
+ }
112
+ getListLabel(t2) {
113
+ return { bullet: this.locale.bulletList, ordered: this.locale.numberedList, checklist: this.locale.checklist }[t2];
114
+ }
115
+ registerToolbarItems(t2) {
116
+ const e2 = this.getEnabledTypes(), n2 = e2.at(-1);
117
+ for (const i2 of e2) t2.registerToolbarItem({ id: `list-${i2.type}`, group: "block", icon: i2.icon, label: this.getListLabel(i2.type), command: `toggleList:${i2.type}`, priority: "bullet" === i2.type ? 70 : "ordered" === i2.type ? 71 : 72, separatorAfter: this.config.separatorAfter && i2 === n2, isActive: (t3) => this.isListActive(t3, i2.type) });
118
+ }
119
+ toggleList(t2, n2) {
120
+ const i2 = t2.getState(), s2 = i2.selection;
121
+ if (r(s2)) return false;
122
+ const l2 = i2.getBlock(s2.anchor.blockId);
123
+ if (!l2) return false;
124
+ if ("list_item" === l2.type && l2.attrs?.listType === n2) {
125
+ const e2 = i2.transaction("command").setBlockType(s2.anchor.blockId, o("paragraph")).setSelection(s2).build();
126
+ return t2.dispatch(e2), true;
127
+ }
128
+ const c2 = { listType: n2, indent: e(l2, "list_item") ? l2.attrs.indent : 0 };
129
+ "checklist" === n2 && (c2.checked = false);
130
+ const a2 = i2.transaction("command").setBlockType(s2.anchor.blockId, o("list_item"), c2).setSelection(s2).build();
131
+ return t2.dispatch(a2), true;
132
+ }
133
+ indent(t2) {
134
+ const n2 = t2.getState();
135
+ if (r(n2.selection)) return false;
136
+ const i2 = n2.getBlock(n2.selection.anchor.blockId);
137
+ return !(!i2 || !e(i2, "list_item")) && !(i2.attrs.indent >= this.config.maxIndent) && this.setIndent(t2, n2, i2.attrs.indent + 1);
138
+ }
139
+ outdent(t2) {
140
+ const n2 = t2.getState();
141
+ if (r(n2.selection)) return false;
142
+ const i2 = n2.getBlock(n2.selection.anchor.blockId);
143
+ return !(!i2 || !e(i2, "list_item")) && !(i2.attrs.indent <= 0) && this.setIndent(t2, n2, i2.attrs.indent - 1);
144
+ }
145
+ setIndent(t2, e2, n2) {
146
+ const i2 = e2.selection;
147
+ if (r(i2)) return false;
148
+ const s2 = e2.getBlock(i2.anchor.blockId);
149
+ if (!s2) return false;
150
+ const l2 = { ...s2.attrs, indent: n2 }, c2 = e2.transaction("command").setBlockType(i2.anchor.blockId, o("list_item"), l2).setSelection(i2).build();
151
+ return t2.dispatch(c2), true;
152
+ }
153
+ toggleChecked(t2) {
154
+ const e2 = t2.getState();
155
+ if (r(e2.selection)) return false;
156
+ const n2 = e2.getBlock(e2.selection.anchor.blockId);
157
+ if (!n2 || "list_item" !== n2.type || "checklist" !== n2.attrs?.listType) return false;
158
+ const i2 = !n2.attrs?.checked, s2 = { ...n2.attrs, checked: i2 }, l2 = e2.transaction("command").setBlockType(e2.selection.anchor.blockId, o("list_item"), s2).setSelection(e2.selection).build();
159
+ return t2.dispatch(l2), true;
160
+ }
161
+ handleBackspace(t2) {
162
+ const e2 = t2.getState(), n2 = e2.selection;
163
+ if (r(n2)) return false;
164
+ if (!l(n2)) return false;
165
+ const i2 = e2.getBlock(n2.anchor.blockId);
166
+ if (!i2 || "list_item" !== i2.type) return false;
167
+ if (0 !== n2.anchor.offset) return false;
168
+ const s2 = e2.transaction("input").setBlockType(n2.anchor.blockId, o("paragraph")).setSelection(n2).build();
169
+ return t2.dispatch(s2), true;
170
+ }
171
+ handleEnter(t2) {
172
+ const s2 = t2.getState(), a2 = s2.selection;
173
+ if (r(a2)) return false;
174
+ if (!l(a2)) return false;
175
+ const d2 = s2.getBlock(a2.anchor.blockId);
176
+ if (!d2 || "list_item" !== d2.type) return false;
177
+ if ("" === n(d2)) {
178
+ const e2 = s2.transaction("input").setBlockType(a2.anchor.blockId, o("paragraph")).setSelection(a2).build();
179
+ return t2.dispatch(e2), true;
180
+ }
181
+ const h2 = i(), u2 = { listType: e(d2, "list_item") ? d2.attrs.listType : "bullet", indent: e(d2, "list_item") ? d2.attrs.indent : 0 };
182
+ "checklist" === u2.listType && (u2.checked = false);
183
+ const p2 = s2.transaction("input").splitBlock(a2.anchor.blockId, a2.anchor.offset, h2).setBlockType(h2, o("list_item"), u2).setSelection(c(h2, 0)).build();
184
+ return t2.dispatch(p2), true;
185
+ }
186
+ isListActive(t2, e2) {
187
+ if (r(t2.selection)) return false;
188
+ const n2 = t2.getBlock(t2.selection.anchor.blockId);
189
+ return "list_item" === n2?.type && n2.attrs?.listType === e2;
190
+ }
191
+ getEnabledTypes() {
192
+ return u.filter((t2) => this.config.types.includes(t2.type));
193
+ }
194
+ }
195
+ export {
196
+ d as L,
197
+ a,
198
+ p as b
199
+ };
200
+ //# sourceMappingURL=index-D3CQWJiw.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D3CQWJiw.mjs","sources":["../../src/editor/styles/list.ts","../../src/plugins/list/ListLocale.ts","../../src/plugins/list/ListPlugin.ts"],"sourcesContent":["/** 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 24px;\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: 24px;\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 } 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 { createCollapsedSelection, isCollapsed, isNodeSelection } from '../../model/Selection.js';\nimport { 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\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\n\tconstructor(config?: Partial<ListConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\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}\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 * 24}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', () => {\n\t\t\t\treturn this.toggleChecked(context);\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)) 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)) 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)) 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)) 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)) 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): boolean {\n\t\tconst state = context.getState();\n\t\tif (isNodeSelection(state.selection)) return false;\n\t\tconst block = state.getBlock(state.selection.anchor.blockId);\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 = !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(state.selection.anchor.blockId, 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)) 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)) 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// --- Helpers ---\n\n\tprivate isListActive(state: EditorState, listType: ListType): boolean {\n\t\tif (isNodeSelection(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","this","context","resolvePluginLocale","registerStyleSheet","registerNodeSpec","registerCommands","registerKeymaps","registerInputRules","registerToolbarItems","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","registerKeymap","Enter","handleEnter","Backspace","handleBackspace","Tab","registerInputRule","pattern","handler","state","match","start","_end","sel","selection","isNodeSelection","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","offset","getBlockText","newBlockId","generateBlockId","splitBlock","filter"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { r as e, C as t, a as o, i as r, b as a } from "./ColorValidation-Dyy4Bye8.mjs";
2
+ import { r as l } from "./resolvePluginLocale-B4w1OkPy.mjs";
3
+ const i = { label: "Text Color", tooltip: "Text Color", resetLabel: "Default", ariaLabelPrefix: "Text color" }, s = { en: i, de: { label: "Textfarbe", tooltip: "Textfarbe", resetLabel: "Standard", ariaLabelPrefix: "Textfarbe" }, es: { label: "Color de texto", tooltip: "Color de texto", resetLabel: "Predeterminado", ariaLabelPrefix: "Color de texto" }, fr: { label: "Couleur du texte", tooltip: "Couleur du texte", resetLabel: "Par défaut", ariaLabelPrefix: "Couleur du texte" }, zh: { label: "文字颜色", tooltip: "文字颜色", resetLabel: "默认", ariaLabelPrefix: "文字颜色" }, ru: { label: "Цвет текста", tooltip: "Цвет текста", resetLabel: "По умолчанию", ariaLabelPrefix: "Цвет текста" }, ar: { label: "لون النص", tooltip: "لون النص", resetLabel: "افتراضي", ariaLabelPrefix: "لون النص" }, hi: { label: "टेक्स्ट रंग", tooltip: "टेक्स्ट रंग", resetLabel: "डिफ़ॉल्ट", ariaLabelPrefix: "टेक्स्ट रंग" } }, f = ["#000000", "#434343", "#666666", "#999999", "#b7b7b7", "#cccccc", "#d9d9d9", "#efefef", "#f3f3f3", "#ffffff", "#980000", "#ff0000", "#ff9900", "#ffff00", "#00ff00", "#00ffff", "#4a86e8", "#0000ff", "#9900ff", "#ff00ff", "#e6b8af", "#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#c9daf8", "#cfe2f3", "#d9d2e9", "#ead1dc", "#dd7e6b", "#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#a4c2f4", "#9fc5e8", "#b4a7d6", "#d5a6bd", "#cc4125", "#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6d9eeb", "#6fa8dc", "#8e7cc3", "#c27ba0", "#a61c00", "#cc0000", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3c78d8", "#3d85c6", "#674ea7", "#a64d79", "#85200c", "#990000", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#1155cc", "#0b5394", "#351c75", "#741b47"];
4
+ class c {
5
+ id = "textColor";
6
+ name = "Text Color";
7
+ priority = 23;
8
+ config;
9
+ colors;
10
+ locale;
11
+ constructor(t2) {
12
+ this.config = { ...t2 }, this.colors = e(t2?.colors, f, "TextColorPlugin");
13
+ }
14
+ init(e2) {
15
+ this.locale = l(s, e2, this.config.locale), e2.registerStyleSheet(t), this.registerMarkSpec(e2), this.registerCommands(e2), this.registerToolbarItem(e2);
16
+ }
17
+ registerMarkSpec(e2) {
18
+ e2.registerMarkSpec({ type: "textColor", rank: 5, attrs: { color: { default: "" } }, toDOM(e3) {
19
+ const t2 = document.createElement("span"), o2 = e3.attrs?.color ?? "";
20
+ return t2.style.color = o2, t2;
21
+ }, toHTMLString: (e3, t2) => `<span style="color: ${String(e3.attrs?.color ?? "")}">${t2}</span>`, parseHTML: [{ tag: "span", getAttrs: (e3) => {
22
+ const t2 = e3.style.color;
23
+ return !!t2 && { color: t2 };
24
+ } }], sanitize: { tags: ["span"] } });
25
+ }
26
+ registerCommands(e2) {
27
+ e2.registerCommand("removeTextColor", () => o(e2, e2.getState(), "textColor"));
28
+ }
29
+ registerToolbarItem(e2) {
30
+ const t2 = ['<svg xmlns="http://www.w3.org/2000/svg"', ' viewBox="0 0 24 24">', '<path d="M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2zm-1.38 9L12 5.67 14.38 12H9.62z"/>', '<rect x="3" y="19.5" width="18" height="3"', ' rx="0.5" fill="#e53935"/>', "</svg>"].join("");
31
+ e2.registerToolbarItem({ id: "textColor", group: "format", icon: t2, label: this.locale.label, tooltip: this.locale.tooltip, command: "removeTextColor", priority: 45, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, t3, o2) => {
32
+ a(e3, t3, { markType: "textColor", colors: this.colors, columns: 10, resetLabel: this.locale.resetLabel, resetCommand: "removeTextColor", ariaLabelPrefix: this.locale.ariaLabelPrefix, onClose: o2 });
33
+ }, isActive: (e3) => r(e3, "textColor") });
34
+ }
35
+ }
36
+ export {
37
+ s as T,
38
+ i as a,
39
+ c as b
40
+ };
41
+ //# sourceMappingURL=index-DC1EK22F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DC1EK22F.mjs","sources":["../../src/plugins/text-color/TextColorLocale.ts","../../src/plugins/text-color/TextColorPlugin.ts"],"sourcesContent":["/** Locale interface and default English locale for the TextColorPlugin. */\n\n// --- Locale Interface ---\n\nexport interface TextColorLocale {\n\treadonly label: string;\n\treadonly tooltip: string;\n\treadonly resetLabel: string;\n\treadonly ariaLabelPrefix: string;\n}\n\n// --- Default English Locale ---\n\nexport const TEXT_COLOR_LOCALE_EN: TextColorLocale = {\n\tlabel: 'Text Color',\n\ttooltip: 'Text Color',\n\tresetLabel: 'Default',\n\tariaLabelPrefix: 'Text color',\n};\n\n// --- German Locale ---\n\nexport const TEXT_COLOR_LOCALE_DE: TextColorLocale = {\n\tlabel: 'Textfarbe',\n\ttooltip: 'Textfarbe',\n\tresetLabel: 'Standard',\n\tariaLabelPrefix: 'Textfarbe',\n};\n\n// --- Spanish Locale ---\n\nexport const TEXT_COLOR_LOCALE_ES: TextColorLocale = {\n\tlabel: 'Color de texto',\n\ttooltip: 'Color de texto',\n\tresetLabel: 'Predeterminado',\n\tariaLabelPrefix: 'Color de texto',\n};\n\n// --- French Locale ---\n\nexport const TEXT_COLOR_LOCALE_FR: TextColorLocale = {\n\tlabel: 'Couleur du texte',\n\ttooltip: 'Couleur du texte',\n\tresetLabel: 'Par défaut',\n\tariaLabelPrefix: 'Couleur du texte',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const TEXT_COLOR_LOCALE_ZH: TextColorLocale = {\n\tlabel: '文字颜色',\n\ttooltip: '文字颜色',\n\tresetLabel: '默认',\n\tariaLabelPrefix: '文字颜色',\n};\n\n// --- Russian Locale ---\n\nexport const TEXT_COLOR_LOCALE_RU: TextColorLocale = {\n\tlabel: 'Цвет текста',\n\ttooltip: 'Цвет текста',\n\tresetLabel: 'По умолчанию',\n\tariaLabelPrefix: 'Цвет текста',\n};\n\n// --- Arabic Locale ---\n\nexport const TEXT_COLOR_LOCALE_AR: TextColorLocale = {\n\tlabel: 'لون النص',\n\ttooltip: 'لون النص',\n\tresetLabel: 'افتراضي',\n\tariaLabelPrefix: 'لون النص',\n};\n\n// --- Hindi Locale ---\n\nexport const TEXT_COLOR_LOCALE_HI: TextColorLocale = {\n\tlabel: 'टेक्स्ट रंग',\n\ttooltip: 'टेक्स्ट रंग',\n\tresetLabel: 'डिफ़ॉल्ट',\n\tariaLabelPrefix: 'टेक्स्ट रंग',\n};\n\n// --- Locale Map ---\n\nexport const TEXT_COLOR_LOCALES: Record<string, TextColorLocale> = {\n\ten: TEXT_COLOR_LOCALE_EN,\n\tde: TEXT_COLOR_LOCALE_DE,\n\tes: TEXT_COLOR_LOCALE_ES,\n\tfr: TEXT_COLOR_LOCALE_FR,\n\tzh: TEXT_COLOR_LOCALE_ZH,\n\tru: TEXT_COLOR_LOCALE_RU,\n\tar: TEXT_COLOR_LOCALE_AR,\n\thi: TEXT_COLOR_LOCALE_HI,\n};\n","/**\n * TextColorPlugin: registers a text color mark with attrs,\n * toolbar button with a color picker popup, and removeTextColor command.\n */\n\nimport { COLOR_PICKER_CSS } from '../../editor/styles/color-picker.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { isColorMarkActive, removeColorMark } from '../shared/ColorMarkOperations.js';\nimport { renderColorPickerPopup } from '../shared/ColorPickerPopup.js';\nimport { resolveColors } from '../shared/ColorValidation.js';\nimport { TEXT_COLOR_LOCALES, type TextColorLocale } from './TextColorLocale.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\ttextColor: { color: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface TextColorConfig {\n\t/**\n\t * Restricts the color picker to a specific set of hex colors.\n\t * Each value must be a valid hex color code (`#RGB` or `#RRGGBB`).\n\t * Duplicates are removed automatically (case-insensitive).\n\t * When omitted, the full default palette is shown.\n\t */\n\treadonly colors?: readonly string[];\n\t/** When true, a separator is rendered after the textColor toolbar item. */\n\treadonly separatorAfter?: boolean;\n\treadonly locale?: TextColorLocale;\n}\n\n// --- Color Palette (Google Docs style: 10 columns x 7 rows) ---\n\nconst COLOR_PALETTE: readonly string[] = [\n\t// Row 1 — dark\n\t'#000000',\n\t'#434343',\n\t'#666666',\n\t'#999999',\n\t'#b7b7b7',\n\t'#cccccc',\n\t'#d9d9d9',\n\t'#efefef',\n\t'#f3f3f3',\n\t'#ffffff',\n\t// Row 2 — vivid\n\t'#980000',\n\t'#ff0000',\n\t'#ff9900',\n\t'#ffff00',\n\t'#00ff00',\n\t'#00ffff',\n\t'#4a86e8',\n\t'#0000ff',\n\t'#9900ff',\n\t'#ff00ff',\n\t// Row 3 — light 3\n\t'#e6b8af',\n\t'#f4cccc',\n\t'#fce5cd',\n\t'#fff2cc',\n\t'#d9ead3',\n\t'#d0e0e3',\n\t'#c9daf8',\n\t'#cfe2f3',\n\t'#d9d2e9',\n\t'#ead1dc',\n\t// Row 4 — light 2\n\t'#dd7e6b',\n\t'#ea9999',\n\t'#f9cb9c',\n\t'#ffe599',\n\t'#b6d7a8',\n\t'#a2c4c9',\n\t'#a4c2f4',\n\t'#9fc5e8',\n\t'#b4a7d6',\n\t'#d5a6bd',\n\t// Row 5 — light 1\n\t'#cc4125',\n\t'#e06666',\n\t'#f6b26b',\n\t'#ffd966',\n\t'#93c47d',\n\t'#76a5af',\n\t'#6d9eeb',\n\t'#6fa8dc',\n\t'#8e7cc3',\n\t'#c27ba0',\n\t// Row 6 — dark 1\n\t'#a61c00',\n\t'#cc0000',\n\t'#e69138',\n\t'#f1c232',\n\t'#6aa84f',\n\t'#45818e',\n\t'#3c78d8',\n\t'#3d85c6',\n\t'#674ea7',\n\t'#a64d79',\n\t// Row 7 — dark 2\n\t'#85200c',\n\t'#990000',\n\t'#b45f06',\n\t'#bf9000',\n\t'#38761d',\n\t'#134f5c',\n\t'#1155cc',\n\t'#0b5394',\n\t'#351c75',\n\t'#741b47',\n];\n\n// --- Plugin ---\n\nexport class TextColorPlugin implements Plugin {\n\treadonly id = 'textColor';\n\treadonly name = 'Text Color';\n\treadonly priority = 23;\n\n\tprivate readonly config: TextColorConfig;\n\tprivate readonly colors: readonly string[];\n\tprivate locale!: TextColorLocale;\n\n\tconstructor(config?: Partial<TextColorConfig>) {\n\t\tthis.config = { ...config };\n\t\tthis.colors = resolveColors(config?.colors, COLOR_PALETTE, 'TextColorPlugin');\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(TEXT_COLOR_LOCALES, context, this.config.locale);\n\n\t\tcontext.registerStyleSheet(COLOR_PICKER_CSS);\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'textColor',\n\t\t\trank: 5,\n\t\t\tattrs: {\n\t\t\t\tcolor: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tconst color = mark.attrs?.color ?? '';\n\t\t\t\tspan.style.color = color;\n\t\t\t\treturn span;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content) => {\n\t\t\t\tconst color: string = String(mark.attrs?.color ?? '');\n\t\t\t\treturn `<span style=\"color: ${color}\">${content}</span>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'span',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst color: string = el.style.color;\n\t\t\t\t\t\tif (!color) return false;\n\t\t\t\t\t\treturn { color };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['span'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('removeTextColor', () => {\n\t\t\treturn removeColorMark(context, context.getState(), 'textColor');\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst pathD =\n\t\t\t'M11 3L5.5 17h2.25l1.12-3h6.25l1.12 3h2.25L13 3h-2z' + 'm-1.38 9L12 5.67 14.38 12H9.62z';\n\t\tconst icon: string = [\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\"',\n\t\t\t' viewBox=\"0 0 24 24\">',\n\t\t\t`<path d=\"${pathD}\"/>`,\n\t\t\t'<rect x=\"3\" y=\"19.5\" width=\"18\" height=\"3\"',\n\t\t\t' rx=\"0.5\" fill=\"#e53935\"/>',\n\t\t\t'</svg>',\n\t\t].join('');\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'textColor',\n\t\t\tgroup: 'format',\n\t\t\ticon,\n\t\t\tlabel: this.locale.label,\n\t\t\ttooltip: this.locale.tooltip,\n\t\t\tcommand: 'removeTextColor',\n\t\t\tpriority: 45,\n\t\t\tpopupType: 'custom',\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\trenderPopup: (container, ctx, onClose) => {\n\t\t\t\trenderColorPickerPopup(container, ctx, {\n\t\t\t\t\tmarkType: 'textColor',\n\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\tcolumns: 10,\n\t\t\t\t\tresetLabel: this.locale.resetLabel,\n\t\t\t\t\tresetCommand: 'removeTextColor',\n\t\t\t\t\tariaLabelPrefix: this.locale.ariaLabelPrefix,\n\t\t\t\t\tonClose,\n\t\t\t\t});\n\t\t\t},\n\t\t\tisActive: (state: EditorState) => isColorMarkActive(state, 'textColor'),\n\t\t});\n\t}\n}\n"],"names":["TEXT_COLOR_LOCALE_EN","label","tooltip","resetLabel","ariaLabelPrefix","TEXT_COLOR_LOCALES","en","de","es","fr","zh","ru","ar","hi","COLOR_PALETTE","TextColorPlugin","id","name","priority","config","colors","locale","this","resolveColors","context","resolvePluginLocale","registerStyleSheet","COLOR_PICKER_CSS","registerMarkSpec","registerCommands","registerToolbarItem","type","rank","attrs","color","default","mark","span","document","createElement","style","toHTMLString","content","String","parseHTML","tag","getAttrs","el","sanitize","tags","registerCommand","removeColorMark","getState","icon","join","group","command","popupType","separatorAfter","renderPopup","container","ctx","onClose","renderColorPickerPopup","markType","columns","resetCommand","isActive","state","isColorMarkActive"],"mappings":";;AAaO,MAAMA,IAAwC,EACpDC,OAAO,cACPC,SAAS,cACTC,YAAY,WACZC,iBAAiB,aAAA,GAoELC,IAAsD,EAClEC,IAAIN,GACJO,IAjEoD,EACpDN,OAAO,aACPC,SAAS,aACTC,YAAY,YACZC,iBAAiB,YAAA,GA8DjBI,IAzDoD,EACpDP,OAAO,kBACPC,SAAS,kBACTC,YAAY,kBACZC,iBAAiB,oBAsDjBK,IAjDoD,EACpDR,OAAO,oBACPC,SAAS,oBACTC,YAAY,cACZC,iBAAiB,mBAAA,GA8CjBM,IAzCoD,EACpDT,OAAO,QACPC,SAAS,QACTC,YAAY,MACZC,iBAAiB,UAsCjBO,IAjCoD,EACpDV,OAAO,eACPC,SAAS,eACTC,YAAY,gBACZC,iBAAiB,cAAA,GA8BjBQ,IAzBoD,EACpDX,OAAO,YACPC,SAAS,YACTC,YAAY,WACZC,iBAAiB,WAAA,GAsBjBS,IAjBoD,EACpDZ,OAAO,eACPC,SAAS,eACTC,YAAY,YACZC,iBAAiB,cAAA,EAAA,GCzCZU,IAAmC,CAExC,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WAEA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,SAAA;AAKM,MAAMC,EAAAA;AAAAA,EACHC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,WAAW;AAAA,EAEHC;AAAAA,EACAC;AAAAA,EACTC;AAAAA,EAER,YAAYF,IAAAA;AACXG,SAAKH,SAAS,EAAA,GAAKA,GAAAA,GACnBG,KAAKF,SAASG,EAAcJ,IAAQC,QAAQN,GAAe,iBAAA;AAAA,EAC5D;AAAA,EAEA,KAAKU,IAAAA;AACJF,SAAKD,SAASI,EAAoBpB,GAAoBmB,IAASF,KAAKH,OAAOE,MAAAA,GAE3EG,GAAQE,mBAAmBC,CAAAA,GAC3BL,KAAKM,iBAAiBJ,EAAAA,GACtBF,KAAKO,iBAAiBL,EAAAA,GACtBF,KAAKQ,oBAAoBN,EAAAA;AAAAA,EAC1B;AAAA,EAEQ,iBAAiBA;AACxBA,IAAAA,GAAQI,iBAAiB,EACxBG,MAAM,aACNC,MAAM,GACNC,OAAO,EACNC,OAAO,EAAEC,SAAS,GAAA,EAAA,GAEnB,MAAMC,IAAAA;AACL,YAAMC,KAAOC,SAASC,cAAc,MAAA,GAC9BL,KAAQE,GAAKH,OAAOC,SAAS;AAEnC,aADAG,GAAKG,MAAMN,QAAQA,IACZG;AAAAA,IACR,GACAI,cAAc,CAACL,IAAMM,OAEb,uBADeC,OAAOP,GAAKH,OAAOC,SAAS,EAAA,CAAA,KACVQ,aAEzCE,WAAW,CACV,EACCC,KAAK,QACLC,UAAWC,CAAAA,OAAAA;AACV,YAAMb,KAAgBa,GAAGP,MAAMN;AAC/B,aAAA,CAAA,CAAKA,MACE,EAAEA,OAAAA,GAAAA;AAAAA,IAAAA,EAAAA,CAAAA,GAIZc,UAAU,EAAEC,MAAM,CAAC,MAAA,EAAA,EAAA,CAAA;AAAA,EAErB;AAAA,EAEQ,iBAAiBzB,IAAAA;AACxBA,IAAAA,GAAQ0B,gBAAgB,mBAAmB,MACnCC,EAAgB3B,IAASA,GAAQ4B,SAAAA,GAAY,WAAA,CAAA;AAAA,EAEtD;AAAA,EAEQ,oBAAoB5B;AAC3B,UAEM6B,KAAe,CACpB,2CACA,yBACA,iGACA,8CACA,8BACA,UACCC,KAAK,EAAA;AAEP9B,IAAAA,GAAQM,oBAAoB,EAC3Bd,IAAI,aACJuC,OAAO,UACPF,MAAAA,IACApD,OAAOqB,KAAKD,OAAOpB,OACnBC,SAASoB,KAAKD,OAAOnB,SACrBsD,SAAS,mBACTtC,UAAU,IACVuC,WAAW,UACXC,gBAAgBpC,KAAKH,OAAOuC,gBAC5BC,aAAa,CAACC,IAAWC,IAAKC,OAAAA;AAC7BC,QAAuBH,IAAWC,IAAK,EACtCG,UAAU,aACV5C,QAAQE,KAAKF,QACb6C,SAAS,IACT9D,YAAYmB,KAAKD,OAAOlB,YACxB+D,cAAc,mBACd9D,iBAAiBkB,KAAKD,OAAOjB,iBAC7B0D,SAAAA,GAAAA,CAAAA;AAAAA,IAAAA,GAGFK,UAAWC,CAAAA,OAAuBC,EAAkBD,IAAO,WAAA,EAAA,CAAA;AAAA,EAE7D;AAAA;"}
@@ -0,0 +1,196 @@
1
+ import { r as e } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
+ import { p as t, g as n, b as i, j as a, k as o } from "./Document-CI3iCwEP.mjs";
3
+ import { c as r } from "./NodeSpec-NZVvcCuH.mjs";
4
+ import { i as l, a as s, c } from "./Selection-D5ZjXoB7.mjs";
5
+ import { n as g } from "./TypeBrands-C09nE2qO.mjs";
6
+ import { a as d } from "./ToolbarPlugin-DY2xaJiu.mjs";
7
+ const h = { paragraph: "Paragraph", title: "Title", subtitle: "Subtitle", heading1: "Heading 1", heading2: "Heading 2", heading3: "Heading 3", heading4: "Heading 4", heading5: "Heading 5", heading6: "Heading 6", blockTypeLabel: "Block Type", blockTypesAria: "Block types" }, p = { en: h, de: { paragraph: "Absatz", title: "Titel", subtitle: "Untertitel", heading1: "Überschrift 1", heading2: "Überschrift 2", heading3: "Überschrift 3", heading4: "Überschrift 4", heading5: "Überschrift 5", heading6: "Überschrift 6", blockTypeLabel: "Blocktyp", blockTypesAria: "Blocktypen" }, es: { paragraph: "Párrafo", title: "Título", subtitle: "Subtítulo", heading1: "Encabezado 1", heading2: "Encabezado 2", heading3: "Encabezado 3", heading4: "Encabezado 4", heading5: "Encabezado 5", heading6: "Encabezado 6", blockTypeLabel: "Tipo de bloque", blockTypesAria: "Tipos de bloque" }, fr: { paragraph: "Paragraphe", title: "Titre", subtitle: "Sous-titre", heading1: "Titre 1", heading2: "Titre 2", heading3: "Titre 3", heading4: "Titre 4", heading5: "Titre 5", heading6: "Titre 6", blockTypeLabel: "Type de bloc", blockTypesAria: "Types de bloc" }, zh: { paragraph: "正文", title: "标题", subtitle: "副标题", heading1: "一级标题", heading2: "二级标题", heading3: "三级标题", heading4: "四级标题", heading5: "五级标题", heading6: "六级标题", blockTypeLabel: "块类型", blockTypesAria: "块类型列表" }, ru: { paragraph: "Абзац", title: "Заголовок", subtitle: "Подзаголовок", heading1: "Заголовок 1", heading2: "Заголовок 2", heading3: "Заголовок 3", heading4: "Заголовок 4", heading5: "Заголовок 5", heading6: "Заголовок 6", blockTypeLabel: "Тип блока", blockTypesAria: "Типы блоков" }, ar: { paragraph: "فقرة", title: "عنوان", subtitle: "عنوان فرعي", heading1: "عنوان 1", heading2: "عنوان 2", heading3: "عنوان 3", heading4: "عنوان 4", heading5: "عنوان 5", heading6: "عنوان 6", blockTypeLabel: "نوع الكتلة", blockTypesAria: "أنواع الكتل" }, hi: { paragraph: "अनुच्छेद", title: "शीर्षक", subtitle: "उपशीर्षक", heading1: "शीर्षक 1", heading2: "शीर्षक 2", heading3: "शीर्षक 3", heading4: "शीर्षक 4", heading5: "शीर्षक 5", heading6: "शीर्षक 6", blockTypeLabel: "ब्लॉक प्रकार", blockTypesAria: "ब्लॉक प्रकार सूची" } }, b = { levels: [1, 2, 3, 4, 5, 6] }, u = { 1: "h1", 2: "h2", 3: "h3", 4: "h4", 5: "h5", 6: "h6" };
8
+ class k {
9
+ id = "heading";
10
+ name = "Heading";
11
+ priority = 30;
12
+ config;
13
+ locale;
14
+ context = null;
15
+ comboLabel = null;
16
+ constructor(e2) {
17
+ this.config = { ...b, ...e2 };
18
+ }
19
+ init(t2) {
20
+ this.locale = e(p, t2, this.config.locale), t2.registerStyleSheet("\n/* Heading Select — Combobox-style toolbar button */\n.notectl-toolbar-btn--heading {\n width: auto;\n min-width: 100px;\n max-width: 160px;\n padding: 0 8px;\n gap: 4px;\n border: 1px solid var(--notectl-border);\n border-radius: 4px;\n background: var(--notectl-bg);\n}\n\n.notectl-toolbar-btn--heading:hover {\n background: var(--notectl-hover-bg);\n border-color: var(--notectl-fg-muted);\n}\n\n.notectl-toolbar-btn--heading.notectl-toolbar-btn--active {\n background: var(--notectl-bg);\n border-color: var(--notectl-primary-muted);\n}\n\n.notectl-toolbar-btn--heading .notectl-toolbar-btn__icon {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 100%;\n overflow: hidden;\n}\n\n.notectl-toolbar-btn--heading .notectl-toolbar-btn__icon svg {\n display: none;\n}\n\n.notectl-heading-select__label {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--notectl-fg);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n text-align: left;\n line-height: 30px;\n}\n\n.notectl-heading-select__arrow {\n flex-shrink: 0;\n font-size: 11px;\n color: var(--notectl-fg-muted);\n line-height: 30px;\n}\n\n/* Heading Picker Popup */\n.notectl-heading-picker {\n min-width: 200px;\n max-height: 320px;\n overflow-y: auto;\n}\n\n.notectl-heading-picker__list {\n padding: 4px 0;\n}\n\n.notectl-heading-picker__item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 12px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 14px;\n color: var(--notectl-fg);\n text-align: left;\n white-space: nowrap;\n font-family: inherit;\n transition: background 0.1s;\n}\n\n.notectl-heading-picker__item:hover {\n background: var(--notectl-hover-bg);\n}\n\n.notectl-heading-picker__item--active {\n background: var(--notectl-active-bg);\n color: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__item--active:hover {\n background: var(--notectl-active-bg);\n}\n\n.notectl-heading-picker__check {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n flex-shrink: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--notectl-primary-fg);\n}\n\n.notectl-heading-picker__label {\n flex: 1;\n}\n"), this.context = t2, this.registerNodeSpecs(t2), this.registerCommands(t2), this.registerKeymaps(t2), this.registerInputRules(t2), this.registerPickerEntries(t2), this.registerToolbarItem(t2);
21
+ }
22
+ destroy() {
23
+ this.context = null, this.comboLabel = null;
24
+ }
25
+ onStateChange(e2, t2, n2) {
26
+ this.updateComboLabel(t2);
27
+ }
28
+ registerNodeSpecs(e2) {
29
+ e2.registerNodeSpec({ type: "title", group: "block", content: { allow: ["text"] }, excludeMarks: ["fontSize"], toDOM(e3) {
30
+ const t2 = r("h1", e3.id);
31
+ return t2.classList.add("notectl-title"), t2;
32
+ }, toHTML: (e3, t2) => `<h1>${t2 || "<br>"}</h1>`, sanitize: { tags: ["h1"] } }), e2.registerNodeSpec({ type: "subtitle", group: "block", content: { allow: ["text"] }, excludeMarks: ["fontSize"], toDOM(e3) {
33
+ const t2 = r("h2", e3.id);
34
+ return t2.classList.add("notectl-subtitle"), t2;
35
+ }, toHTML: (e3, t2) => `<h2>${t2 || "<br>"}</h2>`, sanitize: { tags: ["h2"] } }), e2.registerNodeSpec({ type: "heading", group: "block", content: { allow: ["text"] }, excludeMarks: ["fontSize"], attrs: { level: { default: 1 } }, toDOM(e3) {
36
+ const t2 = e3.attrs?.level ?? 1;
37
+ return r(u[t2] ?? "h1", e3.id);
38
+ }, toHTML(e3, t2) {
39
+ const n2 = e3.attrs?.level ?? 1, i2 = u[n2] ?? "h1";
40
+ return `<${i2}>${t2 || "<br>"}</${i2}>`;
41
+ }, parseHTML: [{ tag: "h1", getAttrs: () => ({ level: 1 }) }, { tag: "h2", getAttrs: () => ({ level: 2 }) }, { tag: "h3", getAttrs: () => ({ level: 3 }) }, { tag: "h4", getAttrs: () => ({ level: 4 }) }, { tag: "h5", getAttrs: () => ({ level: 5 }) }, { tag: "h6", getAttrs: () => ({ level: 6 }) }], sanitize: { tags: ["h1", "h2", "h3", "h4", "h5", "h6"] } });
42
+ }
43
+ registerCommands(e2) {
44
+ e2.registerCommand("setTitle", () => this.toggleSpecialBlock(e2, "title")), e2.registerCommand("setSubtitle", () => this.toggleSpecialBlock(e2, "subtitle"));
45
+ for (const t2 of this.config.levels) e2.registerCommand(`setHeading${t2}`, () => this.toggleHeading(e2, t2));
46
+ e2.registerCommand("toggleHeading", () => this.toggleHeading(e2, 1)), e2.registerCommand("setParagraph", () => this.setBlockType(e2, g("paragraph")));
47
+ }
48
+ registerKeymaps(e2) {
49
+ const t2 = { Enter: () => this.handleEnter(e2) };
50
+ for (const n2 of this.config.levels) n2 <= 6 && (t2[`Mod-Shift-${n2}`] = () => e2.executeCommand(`setHeading${n2}`));
51
+ e2.registerKeymap(t2);
52
+ }
53
+ registerInputRules(e2) {
54
+ for (const t2 of this.config.levels) {
55
+ const n2 = "#".repeat(t2), i2 = new RegExp(`^${n2} $`);
56
+ e2.registerInputRule({ pattern: i2, handler(e3, n3, i3, a2) {
57
+ const o2 = e3.selection;
58
+ if (l(o2)) return null;
59
+ if (!s(o2)) return null;
60
+ const r2 = e3.getBlock(o2.anchor.blockId);
61
+ return r2 && "paragraph" === r2.type ? e3.transaction("input").deleteTextAt(o2.anchor.blockId, i3, i3 + t2 + 1).setBlockType(o2.anchor.blockId, g("heading"), { level: t2 }).setSelection(c(o2.anchor.blockId, 0)).build() : null;
62
+ } });
63
+ }
64
+ }
65
+ registerPickerEntries(e2) {
66
+ e2.registerBlockTypePickerEntry({ id: "paragraph", label: this.locale.paragraph, command: "setParagraph", priority: 10, isActive: (e3) => {
67
+ if (l(e3.selection)) return false;
68
+ const t2 = e3.getBlock(e3.selection.anchor.blockId);
69
+ return "paragraph" === t2?.type;
70
+ } }), e2.registerBlockTypePickerEntry({ id: "title", label: this.locale.title, command: "setTitle", priority: 20, style: { fontSize: "1.6em", fontWeight: "700" }, isActive: (e3) => {
71
+ if (l(e3.selection)) return false;
72
+ const t2 = e3.getBlock(e3.selection.anchor.blockId);
73
+ return "title" === t2?.type;
74
+ } }), e2.registerBlockTypePickerEntry({ id: "subtitle", label: this.locale.subtitle, command: "setSubtitle", priority: 30, style: { fontSize: "1.3em", fontWeight: "500" }, isActive: (e3) => {
75
+ if (l(e3.selection)) return false;
76
+ const t2 = e3.getBlock(e3.selection.anchor.blockId);
77
+ return "subtitle" === t2?.type;
78
+ } });
79
+ for (const t2 of this.config.levels) e2.registerBlockTypePickerEntry({ id: `heading-${t2}`, label: this.getHeadingLabel(t2), command: `setHeading${t2}`, priority: 100 + t2, style: { fontSize: 1.4 - 0.1 * t2 + "em", fontWeight: "600" }, isActive: (e3) => {
80
+ if (l(e3.selection)) return false;
81
+ const n2 = e3.getBlock(e3.selection.anchor.blockId);
82
+ return "heading" === n2?.type && n2.attrs?.level === t2;
83
+ } });
84
+ }
85
+ registerToolbarItem(e2) {
86
+ const t2 = `<span class="notectl-heading-select__label" data-heading-label>${this.locale.paragraph}</span><span class="notectl-heading-select__arrow">▾</span>`;
87
+ e2.registerToolbarItem({ id: "heading", group: "block", icon: t2, label: this.locale.blockTypeLabel, tooltip: this.locale.blockTypeLabel, command: "setParagraph", priority: 50, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (e3, t3) => {
88
+ this.renderHeadingPopup(e3, t3);
89
+ }, isActive: (t3) => e2.getSchemaRegistry().getBlockTypePickerEntries().some((e3) => "paragraph" !== e3.id && e3.isActive(t3)) });
90
+ }
91
+ getHeadingLabel(e2) {
92
+ const t2 = `heading${e2}`;
93
+ return this.locale[t2];
94
+ }
95
+ updateComboLabel(e2) {
96
+ if (!this.comboLabel) {
97
+ const e3 = this.context?.getPluginContainer("top");
98
+ if (!e3) return;
99
+ if (this.comboLabel = e3.querySelector("[data-heading-label]") ?? null, !this.comboLabel) return;
100
+ }
101
+ this.comboLabel.textContent = this.getActiveLabel(e2);
102
+ }
103
+ getActiveLabel(e2) {
104
+ if (l(e2.selection)) return this.locale.paragraph;
105
+ const t2 = this.context?.getSchemaRegistry().getBlockTypePickerEntries() ?? [];
106
+ for (const n2 of t2) if (n2.isActive(e2)) return n2.label;
107
+ return this.locale.paragraph;
108
+ }
109
+ dismissPopup() {
110
+ const e2 = this.context?.getService(d);
111
+ e2?.closePopup();
112
+ }
113
+ renderHeadingPopup(e2, t2) {
114
+ e2.classList.add("notectl-heading-picker");
115
+ const n2 = t2.getState();
116
+ if (l(n2.selection)) return;
117
+ const i2 = document.createElement("div");
118
+ i2.className = "notectl-heading-picker__list", i2.setAttribute("role", "listbox"), i2.setAttribute("aria-label", this.locale.blockTypesAria);
119
+ const a2 = t2.getSchemaRegistry().getBlockTypePickerEntries();
120
+ for (const e3 of a2) {
121
+ const a3 = e3.isActive(n2);
122
+ i2.appendChild(this.createPickerItem(e3.label, a3, (n3) => {
123
+ n3.preventDefault(), n3.stopPropagation(), t2.executeCommand(e3.command), this.dismissPopup();
124
+ }, e3.style));
125
+ }
126
+ e2.appendChild(i2);
127
+ }
128
+ createPickerItem(e2, t2, n2, i2) {
129
+ const a2 = document.createElement("button");
130
+ a2.type = "button", a2.className = "notectl-heading-picker__item", a2.setAttribute("role", "option"), a2.setAttribute("aria-selected", String(t2)), t2 && a2.classList.add("notectl-heading-picker__item--active");
131
+ const o2 = document.createElement("span");
132
+ o2.className = "notectl-heading-picker__check", o2.textContent = t2 ? "✓" : "", a2.appendChild(o2);
133
+ const r2 = document.createElement("span");
134
+ return r2.className = "notectl-heading-picker__label", r2.textContent = e2, i2 && (r2.style.fontSize = i2.fontSize, r2.style.fontWeight = i2.fontWeight), a2.appendChild(r2), a2.addEventListener("mousedown", n2), a2;
135
+ }
136
+ static HEADING_TYPES = /* @__PURE__ */ new Set(["heading", "title", "subtitle"]);
137
+ handleEnter(e2) {
138
+ const a2 = e2.getState(), o2 = a2.selection;
139
+ if (l(o2)) return false;
140
+ if (!s(o2)) return false;
141
+ const r2 = a2.getBlock(o2.anchor.blockId);
142
+ if (!r2 || !k.HEADING_TYPES.has(r2.type)) return false;
143
+ if ("" === t(r2)) {
144
+ const t2 = a2.transaction("input").setBlockType(o2.anchor.blockId, g("paragraph")).setSelection(o2).build();
145
+ return e2.dispatch(t2), true;
146
+ }
147
+ const d2 = n(r2);
148
+ if (o2.anchor.offset >= d2) {
149
+ const t2 = i(), n2 = a2.transaction("input").splitBlock(o2.anchor.blockId, o2.anchor.offset, t2).setBlockType(t2, g("paragraph")).setSelection(c(t2, 0)).build();
150
+ return e2.dispatch(n2), true;
151
+ }
152
+ return false;
153
+ }
154
+ toggleSpecialBlock(e2, t2) {
155
+ const n2 = e2.getState();
156
+ if (l(n2.selection)) return false;
157
+ const i2 = n2.getBlock(n2.selection.anchor.blockId);
158
+ return !!i2 && (i2.type === t2 ? this.setBlockType(e2, g("paragraph")) : this.setBlockType(e2, g(t2)));
159
+ }
160
+ toggleHeading(e2, t2) {
161
+ const n2 = e2.getState(), i2 = n2.selection;
162
+ if (l(i2)) return false;
163
+ const a2 = n2.getBlock(i2.anchor.blockId);
164
+ return !!a2 && ("heading" === a2.type && a2.attrs?.level === t2 ? this.setBlockType(e2, g("paragraph")) : this.setBlockType(e2, g("heading"), { level: t2 }));
165
+ }
166
+ setBlockType(e2, t2, n2) {
167
+ const i2 = e2.getState(), a2 = i2.selection;
168
+ if (l(a2)) return false;
169
+ const o2 = i2.getBlock(a2.anchor.blockId);
170
+ if (!o2) return false;
171
+ const r2 = i2.transaction("command"), s2 = e2.getSchemaRegistry().getNodeSpec(t2);
172
+ s2?.excludeMarks && s2.excludeMarks.length > 0 && (this.stripExcludedMarks(r2, o2, s2.excludeMarks), this.clearExcludedStoredMarks(r2, i2, s2.excludeMarks));
173
+ const c2 = r2.setBlockType(a2.anchor.blockId, t2, n2).setSelection(a2).build();
174
+ return e2.dispatch(c2), true;
175
+ }
176
+ stripExcludedMarks(e2, t2, i2) {
177
+ if (0 === n(t2)) return;
178
+ const r2 = new Set(i2), l2 = a(t2);
179
+ let s2 = 0;
180
+ for (const n2 of l2) if (o(n2)) {
181
+ if (n2.text.length > 0) for (const i3 of n2.marks) r2.has(i3.type) && e2.removeMark(t2.id, s2, s2 + n2.text.length, i3);
182
+ s2 += n2.text.length;
183
+ } else s2 += 1;
184
+ }
185
+ clearExcludedStoredMarks(e2, t2, n2) {
186
+ if (!t2.storedMarks) return;
187
+ const i2 = new Set(n2), a2 = t2.storedMarks.filter((e3) => !i2.has(e3.type));
188
+ a2.length !== t2.storedMarks.length && e2.setStoredMarks(a2.length > 0 ? a2 : null, t2.storedMarks);
189
+ }
190
+ }
191
+ export {
192
+ p as H,
193
+ h as a,
194
+ k as b
195
+ };
196
+ //# sourceMappingURL=index-Dh76rR13.mjs.map