@notectl/core 1.0.6 → 1.0.9

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 (268) hide show
  1. package/README.md +78 -56
  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-DFkl1uYO.mjs +818 -0
  14. package/dist/chunks/ToolbarPlugin-DFkl1uYO.mjs.map +1 -0
  15. package/dist/chunks/index-BCvuDpVr.mjs +191 -0
  16. package/dist/chunks/index-BCvuDpVr.mjs.map +1 -0
  17. package/dist/chunks/index-BFsYGsBR.mjs +92 -0
  18. package/dist/chunks/index-BFsYGsBR.mjs.map +1 -0
  19. package/dist/chunks/index-BIL37LSL.mjs +73 -0
  20. package/dist/chunks/index-BIL37LSL.mjs.map +1 -0
  21. package/dist/chunks/index-BL56fbXt.mjs +402 -0
  22. package/dist/chunks/index-BL56fbXt.mjs.map +1 -0
  23. package/dist/chunks/index-BQ8iIYLn.mjs +209 -0
  24. package/dist/chunks/index-BQ8iIYLn.mjs.map +1 -0
  25. package/dist/chunks/index-BRYzYOYC.mjs +63 -0
  26. package/dist/chunks/index-BRYzYOYC.mjs.map +1 -0
  27. package/dist/chunks/index-BSFLNveF.mjs +953 -0
  28. package/dist/chunks/index-BSFLNveF.mjs.map +1 -0
  29. package/dist/chunks/index-BTJfyJlJ.mjs +187 -0
  30. package/dist/chunks/index-BTJfyJlJ.mjs.map +1 -0
  31. package/dist/chunks/index-Bsp4LC5t.mjs +130 -0
  32. package/dist/chunks/index-Bsp4LC5t.mjs.map +1 -0
  33. package/dist/chunks/index-DA8TG2S8.mjs +220 -0
  34. package/dist/chunks/index-DA8TG2S8.mjs.map +1 -0
  35. package/dist/chunks/index-DAFCISBN.mjs +100 -0
  36. package/dist/chunks/index-DAFCISBN.mjs.map +1 -0
  37. package/dist/chunks/index-DC1EK22F.mjs +41 -0
  38. package/dist/chunks/index-DC1EK22F.mjs.map +1 -0
  39. package/dist/chunks/index-DGrRWMlW.mjs +541 -0
  40. package/dist/chunks/index-DGrRWMlW.mjs.map +1 -0
  41. package/dist/chunks/index-DfO_fKw6.mjs +39 -0
  42. package/dist/chunks/index-DfO_fKw6.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/DocumentSerializer.d.ts.map +1 -1
  50. package/dist/editor/NotectlEditor.d.ts +37 -5
  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/list.d.ts +2 -0
  59. package/dist/editor/styles/list.d.ts.map +1 -1
  60. package/dist/editor/styles/paper.d.ts +3 -0
  61. package/dist/editor/styles/paper.d.ts.map +1 -0
  62. package/dist/editor/styles/table.d.ts +1 -1
  63. package/dist/editor/styles/table.d.ts.map +1 -1
  64. package/dist/editor/styles/toolbar.d.ts +1 -1
  65. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  66. package/dist/editor/styles.d.ts.map +1 -1
  67. package/dist/i18n/Locale.d.ts +17 -0
  68. package/dist/i18n/Locale.d.ts.map +1 -0
  69. package/dist/i18n/LocaleService.d.ts +8 -0
  70. package/dist/i18n/LocaleService.d.ts.map +1 -0
  71. package/dist/i18n/index.d.ts +4 -0
  72. package/dist/i18n/index.d.ts.map +1 -0
  73. package/dist/i18n/resolvePluginLocale.d.ts +3 -0
  74. package/dist/i18n/resolvePluginLocale.d.ts.map +1 -0
  75. package/dist/index.d.ts +48 -3
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/input/ClipboardHandler.d.ts +2 -0
  78. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  79. package/dist/input/InputHandler.d.ts +2 -0
  80. package/dist/input/InputHandler.d.ts.map +1 -1
  81. package/dist/input/KeyboardHandler.d.ts +2 -0
  82. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  83. package/dist/input/LegacyHTMLNormalizer.d.ts +18 -0
  84. package/dist/input/LegacyHTMLNormalizer.d.ts.map +1 -0
  85. package/dist/input/PasteHandler.d.ts +4 -0
  86. package/dist/input/PasteHandler.d.ts.map +1 -1
  87. package/dist/model/HTMLParser.d.ts +13 -0
  88. package/dist/model/HTMLParser.d.ts.map +1 -1
  89. package/dist/model/SchemaRegistry.d.ts +2 -2
  90. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  91. package/dist/notectl-core.mjs +2297 -1971
  92. package/dist/notectl-core.mjs.map +1 -1
  93. package/dist/notectl-core.umd.js +2894 -1825
  94. package/dist/notectl-core.umd.js.map +1 -1
  95. package/dist/plugins/Plugin.d.ts +17 -2
  96. package/dist/plugins/Plugin.d.ts.map +1 -1
  97. package/dist/plugins/PluginManager.d.ts +22 -1
  98. package/dist/plugins/PluginManager.d.ts.map +1 -1
  99. package/dist/plugins/alignment/AlignmentLocale.d.ts +19 -0
  100. package/dist/plugins/alignment/AlignmentLocale.d.ts.map +1 -0
  101. package/dist/plugins/alignment/AlignmentPlugin.d.ts +4 -0
  102. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  103. package/dist/plugins/alignment.mjs +3 -89
  104. package/dist/plugins/alignment.mjs.map +1 -1
  105. package/dist/plugins/blockquote/BlockquoteLocale.d.ts +17 -0
  106. package/dist/plugins/blockquote/BlockquoteLocale.d.ts.map +1 -0
  107. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +3 -0
  108. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  109. package/dist/plugins/blockquote.mjs +2 -55
  110. package/dist/plugins/blockquote.mjs.map +1 -1
  111. package/dist/plugins/code-block/CodeBlockLocale.d.ts +17 -0
  112. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -0
  113. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +1 -0
  114. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  115. package/dist/plugins/code-block/CodeBlockTypes.d.ts +2 -0
  116. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  117. package/dist/plugins/code-block.mjs +3 -3
  118. package/dist/plugins/font/FontLocale.d.ts +15 -0
  119. package/dist/plugins/font/FontLocale.d.ts.map +1 -0
  120. package/dist/plugins/font/FontPlugin.d.ts +3 -0
  121. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  122. package/dist/plugins/font-size/FontSizeLocale.d.ts +17 -0
  123. package/dist/plugins/font-size/FontSizeLocale.d.ts.map +1 -0
  124. package/dist/plugins/font-size/FontSizePlugin.d.ts +3 -0
  125. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  126. package/dist/plugins/font-size/FontSizePopup.d.ts +2 -0
  127. package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -1
  128. package/dist/plugins/font-size.mjs +2 -201
  129. package/dist/plugins/font-size.mjs.map +1 -1
  130. package/dist/plugins/font.mjs +2 -183
  131. package/dist/plugins/font.mjs.map +1 -1
  132. package/dist/plugins/hard-break.mjs +1 -1
  133. package/dist/plugins/heading/HeadingBlockTypePicker.d.ts +14 -0
  134. package/dist/plugins/heading/HeadingBlockTypePicker.d.ts.map +1 -0
  135. package/dist/plugins/heading/HeadingCommands.d.ts +5 -0
  136. package/dist/plugins/heading/HeadingCommands.d.ts.map +1 -0
  137. package/dist/plugins/heading/HeadingInputRules.d.ts +5 -0
  138. package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -0
  139. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts +5 -0
  140. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -0
  141. package/dist/plugins/heading/HeadingLocale.d.ts +26 -0
  142. package/dist/plugins/heading/HeadingLocale.d.ts.map +1 -0
  143. package/dist/plugins/heading/HeadingPlugin.d.ts +4 -40
  144. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  145. package/dist/plugins/heading.mjs +1 -184
  146. package/dist/plugins/heading.mjs.map +1 -1
  147. package/dist/plugins/highlight/HighlightLocale.d.ts +17 -0
  148. package/dist/plugins/highlight/HighlightLocale.d.ts.map +1 -0
  149. package/dist/plugins/highlight/HighlightPlugin.d.ts +3 -5
  150. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  151. package/dist/plugins/highlight.mjs +2 -123
  152. package/dist/plugins/highlight.mjs.map +1 -1
  153. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts +15 -0
  154. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts.map +1 -0
  155. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +4 -0
  156. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  157. package/dist/plugins/horizontal-rule.mjs +2 -56
  158. package/dist/plugins/horizontal-rule.mjs.map +1 -1
  159. package/dist/plugins/image/ImageLocale.d.ts +25 -0
  160. package/dist/plugins/image/ImageLocale.d.ts.map +1 -0
  161. package/dist/plugins/image/ImagePlugin.d.ts +1 -0
  162. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  163. package/dist/plugins/image/ImageUpload.d.ts +3 -0
  164. package/dist/plugins/image/ImageUpload.d.ts.map +1 -1
  165. package/dist/plugins/image.mjs +4 -378
  166. package/dist/plugins/image.mjs.map +1 -1
  167. package/dist/plugins/link/LinkLocale.d.ts +23 -0
  168. package/dist/plugins/link/LinkLocale.d.ts.map +1 -0
  169. package/dist/plugins/link/LinkPlugin.d.ts +3 -0
  170. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  171. package/dist/plugins/link.mjs +2 -124
  172. package/dist/plugins/link.mjs.map +1 -1
  173. package/dist/plugins/list/ListLocale.d.ts +18 -0
  174. package/dist/plugins/list/ListLocale.d.ts.map +1 -0
  175. package/dist/plugins/list/ListPlugin.d.ts +13 -0
  176. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  177. package/dist/plugins/list.mjs +2 -190
  178. package/dist/plugins/list.mjs.map +1 -1
  179. package/dist/plugins/print/PrintLocale.d.ts +16 -0
  180. package/dist/plugins/print/PrintLocale.d.ts.map +1 -0
  181. package/dist/plugins/print/PrintPlugin.d.ts +1 -0
  182. package/dist/plugins/print/PrintPlugin.d.ts.map +1 -1
  183. package/dist/plugins/print/PrintStyleCollector.d.ts +7 -0
  184. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
  185. package/dist/plugins/print/PrintTypes.d.ts +5 -0
  186. package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
  187. package/dist/plugins/shared/ColorMarkOperations.d.ts +28 -0
  188. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -0
  189. package/dist/plugins/shared/ColorNames.d.ts +22 -0
  190. package/dist/plugins/shared/ColorNames.d.ts.map +1 -0
  191. package/dist/plugins/shared/ColorPickerPopup.d.ts +31 -0
  192. package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -0
  193. package/dist/plugins/shared/ColorValidation.d.ts +14 -0
  194. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -0
  195. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts +17 -0
  196. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts.map +1 -0
  197. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +3 -0
  198. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  199. package/dist/plugins/strikethrough.mjs +2 -32
  200. package/dist/plugins/strikethrough.mjs.map +1 -1
  201. package/dist/plugins/super-sub/SuperSubLocale.d.ts +19 -0
  202. package/dist/plugins/super-sub/SuperSubLocale.d.ts.map +1 -0
  203. package/dist/plugins/super-sub/SuperSubPlugin.d.ts +3 -0
  204. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  205. package/dist/plugins/super-sub.mjs +2 -78
  206. package/dist/plugins/super-sub.mjs.map +1 -1
  207. package/dist/plugins/table/TableBorderColor.d.ts +24 -0
  208. package/dist/plugins/table/TableBorderColor.d.ts.map +1 -0
  209. package/dist/plugins/table/TableCommands.d.ts +9 -8
  210. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  211. package/dist/plugins/table/TableContextMenu.d.ts +14 -0
  212. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -0
  213. package/dist/plugins/table/TableControls.d.ts +3 -1
  214. package/dist/plugins/table/TableControls.d.ts.map +1 -1
  215. package/dist/plugins/table/TableControlsDOM.d.ts +13 -1
  216. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -1
  217. package/dist/plugins/table/TableLocale.d.ts +48 -0
  218. package/dist/plugins/table/TableLocale.d.ts.map +1 -0
  219. package/dist/plugins/table/TableNavigation.d.ts +2 -1
  220. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  221. package/dist/plugins/table/TableNodeViews.d.ts +3 -1
  222. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -1
  223. package/dist/plugins/table/TablePlugin.d.ts +7 -1
  224. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  225. package/dist/plugins/table/index.d.ts +3 -0
  226. package/dist/plugins/table/index.d.ts.map +1 -1
  227. package/dist/plugins/table.mjs +18 -660
  228. package/dist/plugins/table.mjs.map +1 -1
  229. package/dist/plugins/text-color/TextColorLocale.d.ts +17 -0
  230. package/dist/plugins/text-color/TextColorLocale.d.ts.map +1 -0
  231. package/dist/plugins/text-color/TextColorPlugin.d.ts +3 -5
  232. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  233. package/dist/plugins/text-color.mjs +2 -123
  234. package/dist/plugins/text-color.mjs.map +1 -1
  235. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts +18 -0
  236. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts.map +1 -0
  237. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +4 -0
  238. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  239. package/dist/plugins/text-formatting.mjs +2 -49
  240. package/dist/plugins/text-formatting.mjs.map +1 -1
  241. package/dist/plugins/toolbar/ToolbarLocale.d.ts +15 -0
  242. package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -0
  243. package/dist/plugins/toolbar/ToolbarOverflowBehavior.d.ts +23 -0
  244. package/dist/plugins/toolbar/ToolbarOverflowBehavior.d.ts.map +1 -0
  245. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +56 -0
  246. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -0
  247. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +18 -0
  248. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  249. package/dist/plugins/toolbar.mjs +1 -1
  250. package/dist/state/EditorState.d.ts +4 -1
  251. package/dist/state/EditorState.d.ts.map +1 -1
  252. package/dist/state/ReadonlyGuard.d.ts +6 -0
  253. package/dist/state/ReadonlyGuard.d.ts.map +1 -0
  254. package/dist/state/Transaction.d.ts +4 -0
  255. package/dist/state/Transaction.d.ts.map +1 -1
  256. package/dist/view/EditorView.d.ts +2 -0
  257. package/dist/view/EditorView.d.ts.map +1 -1
  258. package/package.json +3 -2
  259. package/dist/chunks/Plugin-B9OZ6Y4c.mjs +0 -15
  260. package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +0 -1
  261. package/dist/chunks/ToolbarPlugin-sJTiZr-S.mjs +0 -398
  262. package/dist/chunks/ToolbarPlugin-sJTiZr-S.mjs.map +0 -1
  263. package/dist/chunks/color-picker-Csf0wx5a.mjs +0 -5
  264. package/dist/chunks/color-picker-Csf0wx5a.mjs.map +0 -1
  265. package/dist/chunks/index-QvKiO9_4.mjs +0 -538
  266. package/dist/chunks/index-QvKiO9_4.mjs.map +0 -1
  267. package/dist/input/SourceNormalizer.d.ts +0 -7
  268. package/dist/input/SourceNormalizer.d.ts.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { Plugin, PluginContext } from '../Plugin.js';
2
+ import { LinkLocale } from './LinkLocale.js';
2
3
  declare module '../../model/AttrRegistry.js' {
3
4
  interface MarkAttrRegistry {
4
5
  link: {
@@ -11,12 +12,14 @@ export interface LinkConfig {
11
12
  readonly openInNewTab: boolean;
12
13
  /** When true, a separator is rendered after the link toolbar item. */
13
14
  readonly separatorAfter?: boolean;
15
+ readonly locale?: LinkLocale;
14
16
  }
15
17
  export declare class LinkPlugin implements Plugin {
16
18
  readonly id = "link";
17
19
  readonly name = "Link";
18
20
  readonly priority = 25;
19
21
  private readonly config;
22
+ private locale;
20
23
  constructor(config?: Partial<LinkConfig>);
21
24
  init(context: PluginContext): void;
22
25
  private registerMarkSpec;
@@ -1 +1 @@
1
- {"version":3,"file":"LinkPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/link/LinkPlugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAK1D,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACvB;CACD;AAID,MAAM,WAAW,UAAU;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CAClC;AAQD,qBAAa,UAAW,YAAW,MAAM;IACxC,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAIxC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOlC,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,UAAU;IAkElB,OAAO,CAAC,eAAe;CA4DvB"}
1
+ {"version":3,"file":"LinkPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/link/LinkPlugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACvB;CACD;AAID,MAAM,WAAW,UAAU;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;CAC7B;AAQD,qBAAa,UAAW,YAAW,MAAM;IACxC,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAIxC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAQlC,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,UAAU;IAkElB,OAAO,CAAC,eAAe;CAqEvB"}
@@ -1,127 +1,5 @@
1
- import { t } from "../chunks/Commands-DLP85Mp5.mjs";
2
- import { e, h as n } from "../chunks/Document-CI3iCwEP.mjs";
3
- import { e as r } from "../chunks/HTMLUtils-0wvCRvJc.mjs";
4
- import { a as o, i, s } from "../chunks/Selection-D5ZjXoB7.mjs";
5
- import { m as a } from "../chunks/TypeBrands-C09nE2qO.mjs";
6
- import { f as c } from "../chunks/ToolbarItem-ugDymuXi.mjs";
7
- const l = { openInNewTab: true };
8
- class p {
9
- id = "link";
10
- name = "Link";
11
- priority = 25;
12
- config;
13
- constructor(t2) {
14
- this.config = { ...l, ...t2 };
15
- }
16
- init(t2) {
17
- this.registerMarkSpec(t2), this.registerCommands(t2), this.registerKeymap(t2), this.registerToolbarItem(t2);
18
- }
19
- registerMarkSpec(t2) {
20
- const e2 = this.config.openInNewTab;
21
- t2.registerMarkSpec({ type: "link", rank: 10, attrs: { href: { default: "" } }, toDOM(t3) {
22
- const n2 = document.createElement("a"), r2 = t3.attrs?.href ?? "";
23
- return n2.setAttribute("href", r2), e2 && (n2.setAttribute("target", "_blank"), n2.setAttribute("rel", "noopener noreferrer")), n2;
24
- }, toHTMLString: (t3, e3) => `<a href="${r(String(t3.attrs?.href ?? ""))}">${e3}</a>`, parseHTML: [{ tag: "a", getAttrs: (t3) => ({ href: t3.getAttribute("href") ?? "" }) }], sanitize: { tags: ["a"], attrs: ["href", "target", "rel"] } });
25
- }
26
- registerCommands(t2) {
27
- t2.registerCommand("toggleLink", () => {
28
- const e2 = t2.getState();
29
- return this.toggleLink(t2, e2);
30
- }), t2.registerCommand("setLink", () => false), t2.registerCommand("removeLink", () => {
31
- const e2 = t2.getState();
32
- return this.removeLink(t2, e2);
33
- });
34
- }
35
- registerKeymap(t2) {
36
- t2.registerKeymap({ "Mod-K": () => t2.executeCommand("toggleLink") });
37
- }
38
- registerToolbarItem(t2) {
39
- t2.registerToolbarItem({ id: "link", group: "insert", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>', label: "Link", tooltip: `Insert Link (${c("Mod-K")})`, command: "toggleLink", priority: 60, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (t3, e2) => {
40
- this.renderLinkPopup(t3, e2);
41
- }, isActive: (t3) => this.isLinkActive(t3), isEnabled: (t3) => !o(t3.selection) });
42
- }
43
- isLinkActive(t2) {
44
- const r2 = t2.selection;
45
- if (i(r2)) return false;
46
- if (o(r2)) {
47
- const o2 = t2.getBlock(r2.anchor.blockId);
48
- if (!o2) return false;
49
- const i2 = e(o2, r2.anchor.offset);
50
- return n(i2, a("link"));
51
- }
52
- const s2 = t2.getBlock(r2.anchor.blockId);
53
- if (!s2) return false;
54
- const c2 = e(s2, r2.anchor.offset);
55
- return n(c2, a("link"));
56
- }
57
- toggleLink(t2, e2) {
58
- return !!this.isLinkActive(e2) && this.removeLink(t2, e2);
59
- }
60
- addLink(e2, n2, r2) {
61
- const c2 = n2.selection;
62
- if (i(c2)) return false;
63
- if (o(c2)) return false;
64
- const l2 = s(c2, n2.getBlockOrder()), p2 = n2.transaction("command"), d = { type: a("link"), attrs: { href: r2 } };
65
- return t(n2, l2, (t2, e3, n3) => {
66
- p2.addMark(t2, e3, n3, d);
67
- }), p2.setSelection(c2), e2.dispatch(p2.build()), true;
68
- }
69
- removeLink(e2, r2) {
70
- const c2 = r2.selection;
71
- if (i(c2)) return false;
72
- const l2 = r2.getBlockOrder(), p2 = o(c2) ? { from: c2.anchor, to: c2.anchor } : s(c2, l2), d = r2.transaction("command");
73
- if (o(c2)) {
74
- const t2 = r2.getBlock(c2.anchor.blockId);
75
- if (!t2) return false;
76
- const e3 = [];
77
- let o2 = 0;
78
- for (const r3 of t2.children) {
79
- if (!("text" in r3)) continue;
80
- const t3 = o2 + r3.text.length;
81
- e3.push({ pos: o2, end: t3, hasLink: n(r3.marks, a("link")) }), o2 = t3;
82
- }
83
- const i2 = e3.findIndex((t3) => c2.anchor.offset >= t3.pos && c2.anchor.offset <= t3.end), s2 = i2 >= 0 ? e3[i2] : void 0;
84
- if (-1 === i2 || !s2?.hasLink) return false;
85
- let l3 = i2;
86
- for (; l3 > 0 && e3[l3 - 1]?.hasLink; ) l3--;
87
- let p3 = i2;
88
- for (; p3 < e3.length - 1 && e3[p3 + 1]?.hasLink; ) p3++;
89
- const m = e3[l3], h = e3[p3];
90
- if (!m || !h) return false;
91
- const u = m.pos, k = h.end;
92
- d.removeMark(c2.anchor.blockId, u, k, { type: a("link") });
93
- } else t(r2, p2, (t2, e3, n2) => {
94
- d.removeMark(t2, e3, n2, { type: a("link") });
95
- });
96
- return d.setSelection(c2), e2.dispatch(d.build()), true;
97
- }
98
- renderLinkPopup(t2, e2) {
99
- t2.style.padding = "8px", t2.style.minWidth = "200px";
100
- const n2 = e2.getState();
101
- if (this.isLinkActive(n2)) {
102
- const n3 = document.createElement("button");
103
- n3.type = "button", n3.textContent = "Remove Link", n3.setAttribute("aria-label", "Remove link"), n3.style.cssText = "width:100%;padding:6px 12px;cursor:pointer;", n3.addEventListener("mousedown", (t3) => {
104
- t3.preventDefault(), t3.stopPropagation(), e2.executeCommand("removeLink");
105
- }), t2.appendChild(n3);
106
- } else {
107
- const n3 = document.createElement("input");
108
- n3.type = "url", n3.placeholder = "https://...", n3.setAttribute("aria-label", "URL"), n3.style.cssText = "width:100%;padding:4px;box-sizing:border-box;";
109
- const r2 = document.createElement("button");
110
- r2.type = "button", r2.textContent = "Apply", r2.setAttribute("aria-label", "Apply link"), r2.style.cssText = "width:100%;padding:6px 12px;margin-top:4px;cursor:pointer;", r2.addEventListener("mousedown", (t3) => {
111
- t3.preventDefault(), t3.stopPropagation();
112
- const r3 = n3.value.trim();
113
- r3 && this.addLink(e2, e2.getState(), r3);
114
- }), n3.addEventListener("keydown", (t3) => {
115
- if ("Enter" === t3.key) {
116
- t3.preventDefault();
117
- const r3 = n3.value.trim();
118
- r3 && this.addLink(e2, e2.getState(), r3);
119
- }
120
- }), t2.appendChild(n3), t2.appendChild(r2), requestAnimationFrame(() => n3.focus());
121
- }
122
- }
123
- }
1
+ import { b } from "../chunks/index-Bsp4LC5t.mjs";
124
2
  export {
125
- p as LinkPlugin
3
+ b as LinkPlugin
126
4
  };
127
5
  //# sourceMappingURL=link.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.mjs","sources":["../../src/plugins/link/LinkPlugin.ts"],"sourcesContent":["/**\n * LinkPlugin: registers a link mark type with href attribute,\n * toggle command, keyboard shortcut (Mod-K), and toolbar button\n * with a URL input popup.\n */\n\nimport { forEachBlockInRange } from '../../commands/Commands.js';\nimport { getBlockMarksAtOffset, hasMark } from '../../model/Document.js';\nimport { escapeHTML } from '../../model/HTMLUtils.js';\nimport { isCollapsed, isNodeSelection, selectionRange } from '../../model/Selection.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Plugin, PluginContext } from '../Plugin.js';\nimport { formatShortcut } from '../toolbar/ToolbarItem.js';\n\n// --- Attribute Registry Augmentation ---\n\ndeclare module '../../model/AttrRegistry.js' {\n\tinterface MarkAttrRegistry {\n\t\tlink: { href: string };\n\t}\n}\n\n// --- Configuration ---\n\nexport interface LinkConfig {\n\t/** Whether to add rel=\"noopener noreferrer\" and target=\"_blank\" by default. */\n\treadonly openInNewTab: boolean;\n\t/** When true, a separator is rendered after the link toolbar item. */\n\treadonly separatorAfter?: boolean;\n}\n\nconst DEFAULT_CONFIG: LinkConfig = {\n\topenInNewTab: true,\n};\n\n// --- Plugin ---\n\nexport class LinkPlugin implements Plugin {\n\treadonly id = 'link';\n\treadonly name = 'Link';\n\treadonly priority = 25;\n\n\tprivate readonly config: LinkConfig;\n\n\tconstructor(config?: Partial<LinkConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.registerMarkSpec(context);\n\t\tthis.registerCommands(context);\n\t\tthis.registerKeymap(context);\n\t\tthis.registerToolbarItem(context);\n\t}\n\n\tprivate registerMarkSpec(context: PluginContext): void {\n\t\tconst openInNewTab = this.config.openInNewTab;\n\n\t\tcontext.registerMarkSpec({\n\t\t\ttype: 'link',\n\t\t\trank: 10,\n\t\t\tattrs: {\n\t\t\t\thref: { default: '' },\n\t\t\t},\n\t\t\ttoDOM(mark) {\n\t\t\t\tconst a = document.createElement('a');\n\t\t\t\tconst href = mark.attrs?.href ?? '';\n\t\t\t\ta.setAttribute('href', href);\n\t\t\t\tif (openInNewTab) {\n\t\t\t\t\ta.setAttribute('target', '_blank');\n\t\t\t\t\ta.setAttribute('rel', 'noopener noreferrer');\n\t\t\t\t}\n\t\t\t\treturn a;\n\t\t\t},\n\t\t\ttoHTMLString: (mark, content) => {\n\t\t\t\tconst href: string = escapeHTML(String(mark.attrs?.href ?? ''));\n\t\t\t\treturn `<a href=\"${href}\">${content}</a>`;\n\t\t\t},\n\t\t\tparseHTML: [\n\t\t\t\t{\n\t\t\t\t\ttag: 'a',\n\t\t\t\t\tgetAttrs: (el) => {\n\t\t\t\t\t\tconst href: string = el.getAttribute('href') ?? '';\n\t\t\t\t\t\treturn { href };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tsanitize: { tags: ['a'], attrs: ['href', 'target', 'rel'] },\n\t\t});\n\t}\n\n\tprivate registerCommands(context: PluginContext): void {\n\t\tcontext.registerCommand('toggleLink', () => {\n\t\t\tconst state = context.getState();\n\t\t\treturn this.toggleLink(context, state);\n\t\t});\n\n\t\tcontext.registerCommand('setLink', () => {\n\t\t\t// setLink is called by the popup after URL input\n\t\t\t// The actual URL is set via the popup's custom render\n\t\t\treturn false;\n\t\t});\n\n\t\tcontext.registerCommand('removeLink', () => {\n\t\t\tconst state = context.getState();\n\t\t\treturn this.removeLink(context, state);\n\t\t});\n\t}\n\n\tprivate registerKeymap(context: PluginContext): void {\n\t\tcontext.registerKeymap({\n\t\t\t'Mod-K': () => context.executeCommand('toggleLink'),\n\t\t});\n\t}\n\n\tprivate registerToolbarItem(context: PluginContext): void {\n\t\tconst icon =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z\"/></svg>';\n\n\t\tcontext.registerToolbarItem({\n\t\t\tid: 'link',\n\t\t\tgroup: 'insert',\n\t\t\ticon,\n\t\t\tlabel: 'Link',\n\t\t\ttooltip: `Insert Link (${formatShortcut('Mod-K')})`,\n\t\t\tcommand: 'toggleLink',\n\t\t\tpriority: 60,\n\t\t\tpopupType: 'custom',\n\t\t\tseparatorAfter: this.config.separatorAfter,\n\t\t\trenderPopup: (container, ctx) => {\n\t\t\t\tthis.renderLinkPopup(container, ctx);\n\t\t\t},\n\t\t\tisActive: (state) => this.isLinkActive(state),\n\t\t\tisEnabled: (state) => !isCollapsed(state.selection),\n\t\t});\n\t}\n\n\tprivate isLinkActive(state: EditorState): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel)) return false;\n\t\tif (isCollapsed(sel)) {\n\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\tif (!block) return false;\n\t\t\tconst marks = getBlockMarksAtOffset(block, sel.anchor.offset);\n\t\t\treturn hasMark(marks, markType('link'));\n\t\t}\n\n\t\t// Check if link is active anywhere in selection\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return false;\n\t\tconst marks = getBlockMarksAtOffset(block, sel.anchor.offset);\n\t\treturn hasMark(marks, markType('link'));\n\t}\n\n\tprivate toggleLink(context: PluginContext, state: EditorState): boolean {\n\t\tif (this.isLinkActive(state)) {\n\t\t\treturn this.removeLink(context, state);\n\t\t}\n\t\t// Adding links requires the toolbar popup for URL input\n\t\treturn false;\n\t}\n\n\tprivate addLink(context: PluginContext, state: EditorState, href: string): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel)) return false;\n\t\tif (isCollapsed(sel)) return false;\n\n\t\tconst range = selectionRange(sel, state.getBlockOrder());\n\t\tconst builder = state.transaction('command');\n\t\tconst mark = { type: markType('link'), attrs: { href } };\n\n\t\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\t\tbuilder.addMark(blockId, from, to, mark);\n\t\t});\n\n\t\tbuilder.setSelection(sel);\n\t\tcontext.dispatch(builder.build());\n\t\treturn true;\n\t}\n\n\tprivate removeLink(context: PluginContext, state: EditorState): boolean {\n\t\tconst sel = state.selection;\n\t\tif (isNodeSelection(sel)) return false;\n\t\tconst blockOrder = state.getBlockOrder();\n\t\tconst range = isCollapsed(sel)\n\t\t\t? { from: sel.anchor, to: sel.anchor }\n\t\t\t: selectionRange(sel, blockOrder);\n\n\t\tconst builder = state.transaction('command');\n\n\t\tif (isCollapsed(sel)) {\n\t\t\t// Remove link from entire link span around cursor\n\t\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\t\tif (!block) return false;\n\n\t\t\t// Find the extent of the link mark around the cursor.\n\t\t\t// Build a list of text children with their positions first,\n\t\t\t// then scan backward and forward from the cursor node.\n\t\t\tconst textChildren: { pos: number; end: number; hasLink: boolean }[] = [];\n\t\t\tlet pos = 0;\n\t\t\tfor (const child of block.children) {\n\t\t\t\tif (!('text' in child)) continue;\n\t\t\t\tconst end = pos + child.text.length;\n\t\t\t\ttextChildren.push({ pos, end, hasLink: hasMark(child.marks, markType('link')) });\n\t\t\t\tpos = end;\n\t\t\t}\n\n\t\t\t// Find the text child containing the cursor\n\t\t\tconst cursorIdx = textChildren.findIndex(\n\t\t\t\t(c) => sel.anchor.offset >= c.pos && sel.anchor.offset <= c.end,\n\t\t\t);\n\t\t\tconst cursorEntry = cursorIdx >= 0 ? textChildren[cursorIdx] : undefined;\n\t\t\tif (cursorIdx === -1 || !cursorEntry?.hasLink) return false;\n\n\t\t\t// Scan backward from cursor node to find link start\n\t\t\tlet startIdx = cursorIdx;\n\t\t\twhile (startIdx > 0 && textChildren[startIdx - 1]?.hasLink) {\n\t\t\t\tstartIdx--;\n\t\t\t}\n\n\t\t\t// Scan forward from cursor node to find link end\n\t\t\tlet endIdx = cursorIdx;\n\t\t\twhile (endIdx < textChildren.length - 1 && textChildren[endIdx + 1]?.hasLink) {\n\t\t\t\tendIdx++;\n\t\t\t}\n\n\t\t\tconst startEntry = textChildren[startIdx];\n\t\t\tconst endEntry = textChildren[endIdx];\n\t\t\tif (!startEntry || !endEntry) return false;\n\n\t\t\tconst linkStart = startEntry.pos;\n\t\t\tconst linkEnd = endEntry.end;\n\n\t\t\tbuilder.removeMark(sel.anchor.blockId, linkStart, linkEnd, { type: markType('link') });\n\t\t} else {\n\t\t\t// Remove link from selection range\n\t\t\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\t\t\tbuilder.removeMark(blockId, from, to, { type: markType('link') });\n\t\t\t});\n\t\t}\n\n\t\tbuilder.setSelection(sel);\n\t\tcontext.dispatch(builder.build());\n\t\treturn true;\n\t}\n\n\tprivate renderLinkPopup(container: HTMLElement, context: PluginContext): void {\n\t\tcontainer.style.padding = '8px';\n\t\tcontainer.style.minWidth = '200px';\n\n\t\tconst state = context.getState();\n\t\tconst isActive = this.isLinkActive(state);\n\n\t\tif (isActive) {\n\t\t\t// Show remove link button\n\t\t\tconst removeBtn = document.createElement('button');\n\t\t\tremoveBtn.type = 'button';\n\t\t\tremoveBtn.textContent = 'Remove Link';\n\t\t\tremoveBtn.setAttribute('aria-label', 'Remove link');\n\t\t\tremoveBtn.style.cssText = 'width:100%;padding:6px 12px;cursor:pointer;';\n\t\t\tremoveBtn.addEventListener('mousedown', (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tcontext.executeCommand('removeLink');\n\t\t\t});\n\t\t\tcontainer.appendChild(removeBtn);\n\t\t} else {\n\t\t\t// Show URL input\n\t\t\tconst input = document.createElement('input');\n\t\t\tinput.type = 'url';\n\t\t\tinput.placeholder = 'https://...';\n\t\t\tinput.setAttribute('aria-label', 'URL');\n\t\t\tinput.style.cssText = 'width:100%;padding:4px;box-sizing:border-box;';\n\n\t\t\tconst applyBtn = document.createElement('button');\n\t\t\tapplyBtn.type = 'button';\n\t\t\tapplyBtn.textContent = 'Apply';\n\t\t\tapplyBtn.setAttribute('aria-label', 'Apply link');\n\t\t\tapplyBtn.style.cssText = 'width:100%;padding:6px 12px;margin-top:4px;cursor:pointer;';\n\n\t\t\tapplyBtn.addEventListener('mousedown', (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tconst href = input.value.trim();\n\t\t\t\tif (href) {\n\t\t\t\t\tthis.addLink(context, context.getState(), href);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst href = input.value.trim();\n\t\t\t\t\tif (href) {\n\t\t\t\t\t\tthis.addLink(context, context.getState(), href);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontainer.appendChild(input);\n\t\t\tcontainer.appendChild(applyBtn);\n\n\t\t\t// Auto-focus input\n\t\t\trequestAnimationFrame(() => input.focus());\n\t\t}\n\t}\n}\n"],"names":["DEFAULT_CONFIG","openInNewTab","LinkPlugin","id","name","priority","config","this","context","registerMarkSpec","registerCommands","registerKeymap","registerToolbarItem","type","rank","attrs","href","default","mark","a","document","createElement","setAttribute","toHTMLString","content","escapeHTML","String","parseHTML","tag","getAttrs","el","getAttribute","sanitize","tags","registerCommand","state","getState","toggleLink","removeLink","executeCommand","group","icon","label","tooltip","formatShortcut","command","popupType","separatorAfter","renderPopup","container","ctx","renderLinkPopup","isActive","isLinkActive","isEnabled","isCollapsed","selection","sel","isNodeSelection","block","getBlock","anchor","blockId","marks","getBlockMarksAtOffset","offset","hasMark","markType","range","selectionRange","getBlockOrder","builder","transaction","forEachBlockInRange","from","to","addMark","setSelection","dispatch","build","blockOrder","textChildren","pos","child","children","end","text","length","push","hasLink","cursorIdx","findIndex","c","cursorEntry","startIdx","endIdx","startEntry","endEntry","linkStart","linkEnd","removeMark","style","padding","minWidth","removeBtn","textContent","cssText","addEventListener","e","preventDefault","stopPropagation","appendChild","input","placeholder","applyBtn","value","trim","addLink","key","requestAnimationFrame","focus"],"mappings":"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"}
1
+ {"version":3,"file":"link.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Locale interface and default English locale for the ListPlugin.
3
+ */
4
+ export interface ListLocale {
5
+ readonly bulletList: string;
6
+ readonly numberedList: string;
7
+ readonly checklist: string;
8
+ }
9
+ export declare const LIST_LOCALE_EN: ListLocale;
10
+ export declare const LIST_LOCALE_DE: ListLocale;
11
+ export declare const LIST_LOCALE_ES: ListLocale;
12
+ export declare const LIST_LOCALE_FR: ListLocale;
13
+ export declare const LIST_LOCALE_ZH: ListLocale;
14
+ export declare const LIST_LOCALE_RU: ListLocale;
15
+ export declare const LIST_LOCALE_AR: ListLocale;
16
+ export declare const LIST_LOCALE_HI: ListLocale;
17
+ export declare const LIST_LOCALES: Record<string, ListLocale>;
18
+ //# sourceMappingURL=ListLocale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListLocale.d.ts","sourceRoot":"","sources":["../../../src/plugins/list/ListLocale.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAID,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CASnD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Plugin, PluginContext } from '../Plugin.js';
2
+ import { ListLocale } from './ListLocale.js';
2
3
  export type ListType = 'bullet' | 'ordered' | 'checklist';
3
4
  declare module '../../model/AttrRegistry.js' {
4
5
  interface NodeAttrRegistry {
@@ -16,18 +17,29 @@ export interface ListConfig {
16
17
  readonly maxIndent: number;
17
18
  /** When true, a separator is rendered after the last list toolbar item. */
18
19
  readonly separatorAfter?: boolean;
20
+ /**
21
+ * When true, checklist checkboxes remain interactive even in read-only mode.
22
+ * Defaults to false (checkboxes are fully read-only).
23
+ */
24
+ readonly interactiveCheckboxes?: boolean;
25
+ readonly locale?: ListLocale;
19
26
  }
20
27
  export declare class ListPlugin implements Plugin {
21
28
  readonly id = "list";
22
29
  readonly name = "List";
23
30
  readonly priority = 35;
24
31
  private readonly config;
32
+ private locale;
33
+ private context;
34
+ private checkboxClickHandler;
25
35
  constructor(config?: Partial<ListConfig>);
26
36
  init(context: PluginContext): void;
37
+ destroy(): void;
27
38
  private registerNodeSpec;
28
39
  private registerCommands;
29
40
  private registerKeymaps;
30
41
  private registerInputRules;
42
+ private getListLabel;
31
43
  private registerToolbarItems;
32
44
  private toggleList;
33
45
  private indent;
@@ -45,6 +57,7 @@ export declare class ListPlugin implements Plugin {
45
57
  * Non-empty item → split and create a new list item with the same type.
46
58
  */
47
59
  private handleEnter;
60
+ private registerCheckboxClickHandler;
48
61
  private isListActive;
49
62
  private getEnabledTypes;
50
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ListPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/list/ListPlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI1D,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE1D,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,SAAS,EAAE;YAAE,QAAQ,EAAE,QAAQ,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC;KACpE;CACD;AAID,MAAM,WAAW,UAAU;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CAClC;AAkDD,qBAAa,UAAW,YAAW,MAAM;IACxC,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAIxC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IASlC,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,UAAU;IAoClB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,aAAa;IAoBrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAmBvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,eAAe;CAGvB"}
1
+ {"version":3,"file":"ListPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/list/ListPlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIhE,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE1D,OAAO,QAAQ,6BAA6B,CAAC;IAC5C,UAAU,gBAAgB;QACzB,SAAS,EAAE;YAAE,QAAQ,EAAE,QAAQ,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC;KACpE;CACD;AAID,MAAM,WAAW,UAAU;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;CAC7B;AAkDD,qBAAa,UAAW,YAAW,MAAM;IACxC,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,oBAAoB,CAA0C;gBAE1D,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAIxC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAYlC,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,gBAAgB;IAmDxB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,UAAU;IAoClB,OAAO,CAAC,MAAM;IAWd,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,aAAa;IAyBrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAmBvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,4BAA4B;IA6BpC,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,eAAe;CAGvB"}
@@ -1,193 +1,5 @@
1
- import { i as t } from "../chunks/AttrRegistry-DTsHyDVA.mjs";
2
- import { p as e, b as n } from "../chunks/Document-CI3iCwEP.mjs";
3
- import { c as i } from "../chunks/NodeSpec-NZVvcCuH.mjs";
4
- import { i as s, a as r, c as o } from "../chunks/Selection-D5ZjXoB7.mjs";
5
- import { n as c } from "../chunks/TypeBrands-C09nE2qO.mjs";
6
- const l = { types: ["bullet", "ordered", "checklist"], maxIndent: 4 }, a = [{ 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: "[ ] " }];
7
- class d {
8
- id = "list";
9
- name = "List";
10
- priority = 35;
11
- config;
12
- constructor(t2) {
13
- this.config = { ...l, ...t2 };
14
- }
15
- init(t2) {
16
- t2.registerStyleSheet(`
17
- /* List Wrappers — suppress native markers, we use ::before pseudo-elements */
18
- .notectl-list {
19
- list-style: none;
20
- margin: 0;
21
- padding: 0;
22
- }
23
-
24
- /* Ordered List — each <ol> wrapper resets the counter */
25
- .notectl-list--ordered {
26
- counter-reset: notectl-ordered;
27
- }
28
-
29
- /* List Items */
30
- .notectl-list-item {
31
- margin: 0;
32
- padding: 2px 0 2px 24px;
33
- min-height: 1.6em;
34
- position: relative;
35
- }
36
-
37
- .notectl-list-item::before {
38
- position: absolute;
39
- left: 0;
40
- display: inline-block;
41
- width: 24px;
42
- text-align: center;
43
- }
44
-
45
- /* Bullet List */
46
- .notectl-list-item--bullet::before {
47
- content: '\\2022';
48
- color: var(--notectl-fg);
49
- }
50
-
51
- /* Ordered List — counter increment per item */
52
- .notectl-list-item--ordered {
53
- counter-increment: notectl-ordered;
54
- }
55
-
56
- .notectl-list-item--ordered::before {
57
- content: counter(notectl-ordered) '.';
58
- color: var(--notectl-fg);
59
- font-size: 14px;
60
- }
61
-
62
- /* Checklist */
63
- .notectl-list-item--checklist::before {
64
- content: '\\2610';
65
- font-size: 16px;
66
- color: var(--notectl-fg-muted);
67
- cursor: pointer;
68
- }
69
-
70
- .notectl-list-item--checklist[data-checked="true"]::before {
71
- content: '\\2611';
72
- color: var(--notectl-success);
73
- }
74
-
75
- .notectl-list-item--checklist[data-checked="true"] {
76
- color: var(--notectl-fg-muted);
77
- text-decoration: line-through;
78
- }
79
- `), this.registerNodeSpec(t2), this.registerCommands(t2), this.registerKeymaps(t2), this.registerInputRules(t2), this.registerToolbarItems(t2);
80
- }
81
- registerNodeSpec(t2) {
82
- t2.registerNodeSpec({ type: "list_item", group: "block", content: { allow: ["text"] }, attrs: { listType: { default: "bullet" }, indent: { default: 0 }, checked: { default: false } }, toDOM(t3) {
83
- const e2 = t3.attrs?.listType ?? "bullet", n2 = t3.attrs?.indent ?? 0, s2 = t3.attrs?.checked ?? false, r2 = i("li", t3.id);
84
- 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(s2)), r2.setAttribute("aria-checked", String(s2))), r2.setAttribute("aria-level", String(n2 + 1)), r2;
85
- }, wrapper(t3) {
86
- const e2 = t3.attrs?.listType ?? "bullet";
87
- return { tag: "ordered" === e2 ? "ol" : "ul", key: `list-${e2}`, className: `notectl-list notectl-list--${e2}`, attrs: { role: "list" } };
88
- }, toHTML: (t3, e2) => `<li>${e2 || "<br>"}</li>`, parseHTML: [{ tag: "li" }], sanitize: { tags: ["ul", "ol", "li"] } });
89
- }
90
- registerCommands(t2) {
91
- const e2 = this.getEnabledTypes();
92
- for (const n2 of e2) t2.registerCommand(`toggleList:${n2.type}`, () => this.toggleList(t2, n2.type));
93
- t2.registerCommand("indentListItem", () => this.indent(t2)), t2.registerCommand("outdentListItem", () => this.outdent(t2)), this.config.types.includes("checklist") && t2.registerCommand("toggleChecklistItem", () => this.toggleChecked(t2));
94
- }
95
- registerKeymaps(t2) {
96
- t2.registerKeymap({ Enter: () => this.handleEnter(t2), Backspace: () => this.handleBackspace(t2), Tab: () => this.indent(t2), "Shift-Tab": () => this.outdent(t2) });
97
- }
98
- registerInputRules(t2) {
99
- const e2 = this.getEnabledTypes();
100
- for (const n2 of e2) t2.registerInputRule({ pattern: n2.inputPattern, handler: (t3, e3, i2, l2) => {
101
- const a2 = t3.selection;
102
- if (s(a2)) return null;
103
- if (!r(a2)) return null;
104
- const d2 = t3.getBlock(a2.anchor.blockId);
105
- if (!d2 || "paragraph" !== d2.type) return null;
106
- const p = e3[0] ?? "", h = p.length, u = { listType: n2.type, indent: 0 };
107
- return "checklist" === n2.type && (u.checked = p.includes("[x]")), t3.transaction("input").deleteTextAt(a2.anchor.blockId, i2, i2 + h).setBlockType(a2.anchor.blockId, c("list_item"), u).setSelection(o(a2.anchor.blockId, 0)).build();
108
- } });
109
- }
110
- registerToolbarItems(t2) {
111
- const e2 = this.getEnabledTypes(), n2 = e2.at(-1);
112
- for (const i2 of e2) t2.registerToolbarItem({ id: `list-${i2.type}`, group: "block", icon: i2.icon, label: i2.label, 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) });
113
- }
114
- toggleList(e2, n2) {
115
- const i2 = e2.getState(), r2 = i2.selection;
116
- if (s(r2)) return false;
117
- const o2 = i2.getBlock(r2.anchor.blockId);
118
- if (!o2) return false;
119
- if ("list_item" === o2.type && o2.attrs?.listType === n2) {
120
- const t2 = i2.transaction("command").setBlockType(r2.anchor.blockId, c("paragraph")).setSelection(r2).build();
121
- return e2.dispatch(t2), true;
122
- }
123
- const l2 = { listType: n2, indent: t(o2, "list_item") ? o2.attrs.indent : 0 };
124
- "checklist" === n2 && (l2.checked = false);
125
- const a2 = i2.transaction("command").setBlockType(r2.anchor.blockId, c("list_item"), l2).setSelection(r2).build();
126
- return e2.dispatch(a2), true;
127
- }
128
- indent(e2) {
129
- const n2 = e2.getState();
130
- if (s(n2.selection)) return false;
131
- const i2 = n2.getBlock(n2.selection.anchor.blockId);
132
- return !(!i2 || !t(i2, "list_item")) && !(i2.attrs.indent >= this.config.maxIndent) && this.setIndent(e2, n2, i2.attrs.indent + 1);
133
- }
134
- outdent(e2) {
135
- const n2 = e2.getState();
136
- if (s(n2.selection)) return false;
137
- const i2 = n2.getBlock(n2.selection.anchor.blockId);
138
- return !(!i2 || !t(i2, "list_item")) && !(i2.attrs.indent <= 0) && this.setIndent(e2, n2, i2.attrs.indent - 1);
139
- }
140
- setIndent(t2, e2, n2) {
141
- const i2 = e2.selection;
142
- if (s(i2)) return false;
143
- const r2 = e2.getBlock(i2.anchor.blockId);
144
- if (!r2) return false;
145
- const o2 = { ...r2.attrs, indent: n2 }, l2 = e2.transaction("command").setBlockType(i2.anchor.blockId, c("list_item"), o2).setSelection(i2).build();
146
- return t2.dispatch(l2), true;
147
- }
148
- toggleChecked(t2) {
149
- const e2 = t2.getState();
150
- if (s(e2.selection)) return false;
151
- const n2 = e2.getBlock(e2.selection.anchor.blockId);
152
- if (!n2 || "list_item" !== n2.type || "checklist" !== n2.attrs?.listType) return false;
153
- const i2 = !n2.attrs?.checked, r2 = { ...n2.attrs, checked: i2 }, o2 = e2.transaction("command").setBlockType(e2.selection.anchor.blockId, c("list_item"), r2).setSelection(e2.selection).build();
154
- return t2.dispatch(o2), true;
155
- }
156
- handleBackspace(t2) {
157
- const e2 = t2.getState(), n2 = e2.selection;
158
- if (s(n2)) return false;
159
- if (!r(n2)) return false;
160
- const i2 = e2.getBlock(n2.anchor.blockId);
161
- if (!i2 || "list_item" !== i2.type) return false;
162
- if (0 !== n2.anchor.offset) return false;
163
- const o2 = e2.transaction("input").setBlockType(n2.anchor.blockId, c("paragraph")).setSelection(n2).build();
164
- return t2.dispatch(o2), true;
165
- }
166
- handleEnter(i2) {
167
- const l2 = i2.getState(), a2 = l2.selection;
168
- if (s(a2)) return false;
169
- if (!r(a2)) return false;
170
- const d2 = l2.getBlock(a2.anchor.blockId);
171
- if (!d2 || "list_item" !== d2.type) return false;
172
- if ("" === e(d2)) {
173
- const t2 = l2.transaction("input").setBlockType(a2.anchor.blockId, c("paragraph")).setSelection(a2).build();
174
- return i2.dispatch(t2), true;
175
- }
176
- const p = n(), h = { listType: t(d2, "list_item") ? d2.attrs.listType : "bullet", indent: t(d2, "list_item") ? d2.attrs.indent : 0 };
177
- "checklist" === h.listType && (h.checked = false);
178
- const u = l2.transaction("input").splitBlock(a2.anchor.blockId, a2.anchor.offset, p).setBlockType(p, c("list_item"), h).setSelection(o(p, 0)).build();
179
- return i2.dispatch(u), true;
180
- }
181
- isListActive(t2, e2) {
182
- if (s(t2.selection)) return false;
183
- const n2 = t2.getBlock(t2.selection.anchor.blockId);
184
- return "list_item" === n2?.type && n2.attrs?.listType === e2;
185
- }
186
- getEnabledTypes() {
187
- return a.filter((t2) => this.config.types.includes(t2.type));
188
- }
189
- }
1
+ import { b } from "../chunks/index-DA8TG2S8.mjs";
190
2
  export {
191
- d as ListPlugin
3
+ b as ListPlugin
192
4
  };
193
5
  //# sourceMappingURL=list.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.mjs","sources":["../../src/editor/styles/list.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 * 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 { 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';\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}\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\n\tconstructor(config?: Partial<ListConfig>) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\tinit(context: PluginContext): void {\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 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: def.label,\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":["DEFAULT_CONFIG","types","maxIndent","LIST_TYPE_DEFINITIONS","type","label","icon","inputPattern","inputPrefix","ListPlugin","id","name","priority","config","this","context","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","lastType","at","registerToolbarItem","command","separatorAfter","isActive","isListActive","getState","tr","dispatch","isNodeOfType","setIndent","offset","getBlockText","newBlockId","generateBlockId","splitBlock","filter"],"mappings":"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"}
1
+ {"version":3,"file":"list.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,16 @@
1
+ /** Locale interface and default English locale for the PrintPlugin. */
2
+ export interface PrintLocale {
3
+ readonly label: string;
4
+ readonly tooltip: (shortcut: string) => string;
5
+ readonly printingAnnouncement: string;
6
+ }
7
+ export declare const PRINT_LOCALE_EN: PrintLocale;
8
+ export declare const PRINT_LOCALE_DE: PrintLocale;
9
+ export declare const PRINT_LOCALE_ES: PrintLocale;
10
+ export declare const PRINT_LOCALE_FR: PrintLocale;
11
+ export declare const PRINT_LOCALE_ZH: PrintLocale;
12
+ export declare const PRINT_LOCALE_RU: PrintLocale;
13
+ export declare const PRINT_LOCALE_AR: PrintLocale;
14
+ export declare const PRINT_LOCALE_HI: PrintLocale;
15
+ export declare const PRINT_LOCALES: Record<string, PrintLocale>;
16
+ //# sourceMappingURL=PrintLocale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrintLocale.d.ts","sourceRoot":"","sources":["../../../src/plugins/print/PrintLocale.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAIvE,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACtC;AAID,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC;AAIF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CASrD,CAAC"}
@@ -5,6 +5,7 @@ export declare class PrintPlugin implements Plugin {
5
5
  readonly name = "Print";
6
6
  private readonly config;
7
7
  private service;
8
+ private locale;
8
9
  constructor(config?: PrintPluginConfig);
9
10
  init(context: PluginContext): void;
10
11
  destroy(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"PrintPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/print/PrintPlugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,KAAK,EAAgB,iBAAiB,EAAgB,MAAM,iBAAiB,CAAC;AAiBrF,qBAAa,WAAY,YAAW,MAAM;IACzC,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,OAAO,CAA6B;gBAEhC,MAAM,CAAC,EAAE,iBAAiB;IAItC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IA6ClC,OAAO,IAAI,IAAI;CAGf"}
1
+ {"version":3,"file":"PrintPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/print/PrintPlugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI1D,OAAO,KAAK,EAAgB,iBAAiB,EAAgB,MAAM,iBAAiB,CAAC;AAiBrF,qBAAa,WAAY,YAAW,MAAM;IACzC,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,CAAC,EAAE,iBAAiB;IAItC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IA+ClC,OAAO,IAAI,IAAI;CAGf"}
@@ -3,6 +3,13 @@ import { PrintOptions } from './PrintTypes.js';
3
3
  export declare function extractAdoptedStyles(shadowRoot: ShadowRoot): string;
4
4
  /** Snapshots --notectl-* CSS custom properties from the host element into a :root block. */
5
5
  export declare function snapshotThemeTokens(host: HTMLElement): string;
6
+ /**
7
+ * Snapshots computed typography from the host element into a `body` rule.
8
+ * In the editor, typography is inherited from `:host` (shadow DOM).
9
+ * The print iframe is a regular document where `:host` doesn't match,
10
+ * so we must apply the same font/line-height explicitly.
11
+ */
12
+ export declare function snapshotTypography(host: HTMLElement): string;
6
13
  /** Generates print-specific CSS rules based on PrintOptions. */
7
14
  export declare function generatePrintCSS(options: PrintOptions): string;
8
15
  /** Collects all CSS needed for print: adopted styles, theme tokens, print CSS, and custom CSS. */
@@ -1 +1 @@
1
- {"version":3,"file":"PrintStyleCollector.d.ts","sourceRoot":"","sources":["../../../src/plugins/print/PrintStyleCollector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAQnE;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgB7D;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA4C9D;AAED,kGAAkG;AAClG,wBAAgB,UAAU,CACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,YAAY,GACnB,MAAM,CAiBR"}
1
+ {"version":3,"file":"PrintStyleCollector.d.ts","sourceRoot":"","sources":["../../../src/plugins/print/PrintStyleCollector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAQnE;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgB7D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAmB5D;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA4D9D;AAED,kGAAkG;AAClG,wBAAgB,UAAU,CACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,YAAY,GACnB,MAAM,CAwBR"}
@@ -1,3 +1,4 @@
1
+ import { PaperSize } from '../../editor/PaperSize.js';
1
2
  import { NodeTypeName } from '../../model/TypeBrands.js';
2
3
  import { EventKey, ServiceKey } from '../Plugin.js';
3
4
  export interface PrintOptions {
@@ -25,6 +26,8 @@ export interface PrintOptions {
25
26
  readonly printBackground?: boolean;
26
27
  /** Page orientation. */
27
28
  readonly orientation?: 'portrait' | 'landscape';
29
+ /** Paper size for @page CSS rule. When set, overrides the default A4 page size. */
30
+ readonly paperSize?: PaperSize;
28
31
  }
29
32
  export interface PrintPluginConfig {
30
33
  /** Default options applied to every print() call. */
@@ -33,6 +36,8 @@ export interface PrintPluginConfig {
33
36
  readonly keyBinding?: string;
34
37
  /** Show toolbar button (default: true). */
35
38
  readonly showToolbarItem?: boolean;
39
+ /** Locale override for user-facing strings. */
40
+ readonly locale?: import('./PrintLocale.js').PrintLocale;
36
41
  }
37
42
  export interface PrintService {
38
43
  /** Prints the editor content with optional configuration. */