@notectl/core 1.0.6 → 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 (233) 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-sJTiZr-S.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/NotectlEditor.d.ts +10 -0
  50. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  51. package/dist/editor/PaperLayoutController.d.ts +27 -0
  52. package/dist/editor/PaperLayoutController.d.ts.map +1 -0
  53. package/dist/editor/PaperSize.d.ts +35 -0
  54. package/dist/editor/PaperSize.d.ts.map +1 -0
  55. package/dist/editor/styles/color-picker.d.ts +1 -1
  56. package/dist/editor/styles/color-picker.d.ts.map +1 -1
  57. package/dist/editor/styles/paper.d.ts +3 -0
  58. package/dist/editor/styles/paper.d.ts.map +1 -0
  59. package/dist/editor/styles/table.d.ts +1 -1
  60. package/dist/editor/styles/table.d.ts.map +1 -1
  61. package/dist/editor/styles/toolbar.d.ts +1 -1
  62. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  63. package/dist/editor/styles.d.ts.map +1 -1
  64. package/dist/i18n/Locale.d.ts +17 -0
  65. package/dist/i18n/Locale.d.ts.map +1 -0
  66. package/dist/i18n/LocaleService.d.ts +8 -0
  67. package/dist/i18n/LocaleService.d.ts.map +1 -0
  68. package/dist/i18n/index.d.ts +4 -0
  69. package/dist/i18n/index.d.ts.map +1 -0
  70. package/dist/i18n/resolvePluginLocale.d.ts +3 -0
  71. package/dist/i18n/resolvePluginLocale.d.ts.map +1 -0
  72. package/dist/index.d.ts +42 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  75. package/dist/input/InputHandler.d.ts.map +1 -1
  76. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  77. package/dist/input/PasteHandler.d.ts.map +1 -1
  78. package/dist/notectl-core.mjs +2126 -1952
  79. package/dist/notectl-core.mjs.map +1 -1
  80. package/dist/notectl-core.umd.js +2002 -1544
  81. package/dist/notectl-core.umd.js.map +1 -1
  82. package/dist/plugins/PluginManager.d.ts +5 -0
  83. package/dist/plugins/PluginManager.d.ts.map +1 -1
  84. package/dist/plugins/alignment/AlignmentLocale.d.ts +19 -0
  85. package/dist/plugins/alignment/AlignmentLocale.d.ts.map +1 -0
  86. package/dist/plugins/alignment/AlignmentPlugin.d.ts +4 -0
  87. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  88. package/dist/plugins/alignment.mjs +3 -89
  89. package/dist/plugins/alignment.mjs.map +1 -1
  90. package/dist/plugins/blockquote/BlockquoteLocale.d.ts +17 -0
  91. package/dist/plugins/blockquote/BlockquoteLocale.d.ts.map +1 -0
  92. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +3 -0
  93. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  94. package/dist/plugins/blockquote.mjs +2 -55
  95. package/dist/plugins/blockquote.mjs.map +1 -1
  96. package/dist/plugins/code-block/CodeBlockLocale.d.ts +17 -0
  97. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -0
  98. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +1 -0
  99. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  100. package/dist/plugins/code-block/CodeBlockTypes.d.ts +2 -0
  101. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  102. package/dist/plugins/code-block.mjs +3 -3
  103. package/dist/plugins/font/FontLocale.d.ts +15 -0
  104. package/dist/plugins/font/FontLocale.d.ts.map +1 -0
  105. package/dist/plugins/font/FontPlugin.d.ts +3 -0
  106. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  107. package/dist/plugins/font-size/FontSizeLocale.d.ts +17 -0
  108. package/dist/plugins/font-size/FontSizeLocale.d.ts.map +1 -0
  109. package/dist/plugins/font-size/FontSizePlugin.d.ts +3 -0
  110. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  111. package/dist/plugins/font-size/FontSizePopup.d.ts +2 -0
  112. package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -1
  113. package/dist/plugins/font-size.mjs +2 -201
  114. package/dist/plugins/font-size.mjs.map +1 -1
  115. package/dist/plugins/font.mjs +2 -183
  116. package/dist/plugins/font.mjs.map +1 -1
  117. package/dist/plugins/hard-break.mjs +1 -1
  118. package/dist/plugins/heading/HeadingLocale.d.ts +26 -0
  119. package/dist/plugins/heading/HeadingLocale.d.ts.map +1 -0
  120. package/dist/plugins/heading/HeadingPlugin.d.ts +4 -0
  121. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  122. package/dist/plugins/heading.mjs +1 -184
  123. package/dist/plugins/heading.mjs.map +1 -1
  124. package/dist/plugins/highlight/HighlightLocale.d.ts +17 -0
  125. package/dist/plugins/highlight/HighlightLocale.d.ts.map +1 -0
  126. package/dist/plugins/highlight/HighlightPlugin.d.ts +3 -5
  127. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  128. package/dist/plugins/highlight.mjs +2 -123
  129. package/dist/plugins/highlight.mjs.map +1 -1
  130. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts +15 -0
  131. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts.map +1 -0
  132. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +4 -0
  133. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  134. package/dist/plugins/horizontal-rule.mjs +2 -56
  135. package/dist/plugins/horizontal-rule.mjs.map +1 -1
  136. package/dist/plugins/image/ImageLocale.d.ts +25 -0
  137. package/dist/plugins/image/ImageLocale.d.ts.map +1 -0
  138. package/dist/plugins/image/ImagePlugin.d.ts +1 -0
  139. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  140. package/dist/plugins/image/ImageUpload.d.ts +3 -0
  141. package/dist/plugins/image/ImageUpload.d.ts.map +1 -1
  142. package/dist/plugins/image.mjs +4 -378
  143. package/dist/plugins/image.mjs.map +1 -1
  144. package/dist/plugins/link/LinkLocale.d.ts +23 -0
  145. package/dist/plugins/link/LinkLocale.d.ts.map +1 -0
  146. package/dist/plugins/link/LinkPlugin.d.ts +3 -0
  147. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  148. package/dist/plugins/link.mjs +2 -124
  149. package/dist/plugins/link.mjs.map +1 -1
  150. package/dist/plugins/list/ListLocale.d.ts +18 -0
  151. package/dist/plugins/list/ListLocale.d.ts.map +1 -0
  152. package/dist/plugins/list/ListPlugin.d.ts +4 -0
  153. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  154. package/dist/plugins/list.mjs +2 -190
  155. package/dist/plugins/list.mjs.map +1 -1
  156. package/dist/plugins/print/PrintLocale.d.ts +16 -0
  157. package/dist/plugins/print/PrintLocale.d.ts.map +1 -0
  158. package/dist/plugins/print/PrintPlugin.d.ts +1 -0
  159. package/dist/plugins/print/PrintPlugin.d.ts.map +1 -1
  160. package/dist/plugins/print/PrintStyleCollector.d.ts +7 -0
  161. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
  162. package/dist/plugins/print/PrintTypes.d.ts +5 -0
  163. package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
  164. package/dist/plugins/shared/ColorMarkOperations.d.ts +28 -0
  165. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -0
  166. package/dist/plugins/shared/ColorNames.d.ts +22 -0
  167. package/dist/plugins/shared/ColorNames.d.ts.map +1 -0
  168. package/dist/plugins/shared/ColorPickerPopup.d.ts +31 -0
  169. package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -0
  170. package/dist/plugins/shared/ColorValidation.d.ts +14 -0
  171. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -0
  172. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts +17 -0
  173. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts.map +1 -0
  174. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +3 -0
  175. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  176. package/dist/plugins/strikethrough.mjs +2 -32
  177. package/dist/plugins/strikethrough.mjs.map +1 -1
  178. package/dist/plugins/super-sub/SuperSubLocale.d.ts +19 -0
  179. package/dist/plugins/super-sub/SuperSubLocale.d.ts.map +1 -0
  180. package/dist/plugins/super-sub/SuperSubPlugin.d.ts +3 -0
  181. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  182. package/dist/plugins/super-sub.mjs +2 -78
  183. package/dist/plugins/super-sub.mjs.map +1 -1
  184. package/dist/plugins/table/TableBorderColor.d.ts +24 -0
  185. package/dist/plugins/table/TableBorderColor.d.ts.map +1 -0
  186. package/dist/plugins/table/TableCommands.d.ts +9 -8
  187. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  188. package/dist/plugins/table/TableContextMenu.d.ts +14 -0
  189. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -0
  190. package/dist/plugins/table/TableControls.d.ts +3 -1
  191. package/dist/plugins/table/TableControls.d.ts.map +1 -1
  192. package/dist/plugins/table/TableControlsDOM.d.ts +13 -1
  193. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -1
  194. package/dist/plugins/table/TableLocale.d.ts +48 -0
  195. package/dist/plugins/table/TableLocale.d.ts.map +1 -0
  196. package/dist/plugins/table/TableNavigation.d.ts +2 -1
  197. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  198. package/dist/plugins/table/TableNodeViews.d.ts +3 -1
  199. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -1
  200. package/dist/plugins/table/TablePlugin.d.ts +7 -1
  201. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  202. package/dist/plugins/table/index.d.ts +3 -0
  203. package/dist/plugins/table/index.d.ts.map +1 -1
  204. package/dist/plugins/table.mjs +18 -660
  205. package/dist/plugins/table.mjs.map +1 -1
  206. package/dist/plugins/text-color/TextColorLocale.d.ts +17 -0
  207. package/dist/plugins/text-color/TextColorLocale.d.ts.map +1 -0
  208. package/dist/plugins/text-color/TextColorPlugin.d.ts +3 -5
  209. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  210. package/dist/plugins/text-color.mjs +2 -123
  211. package/dist/plugins/text-color.mjs.map +1 -1
  212. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts +18 -0
  213. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts.map +1 -0
  214. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +4 -0
  215. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  216. package/dist/plugins/text-formatting.mjs +2 -49
  217. package/dist/plugins/text-formatting.mjs.map +1 -1
  218. package/dist/plugins/toolbar/ToolbarLocale.d.ts +14 -0
  219. package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -0
  220. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +1 -0
  221. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  222. package/dist/plugins/toolbar.mjs +1 -1
  223. package/dist/state/EditorState.d.ts +4 -1
  224. package/dist/state/EditorState.d.ts.map +1 -1
  225. package/dist/view/EditorView.d.ts.map +1 -1
  226. package/package.json +3 -2
  227. package/dist/chunks/Plugin-B9OZ6Y4c.mjs +0 -15
  228. package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +0 -1
  229. package/dist/chunks/ToolbarPlugin-sJTiZr-S.mjs.map +0 -1
  230. package/dist/chunks/color-picker-Csf0wx5a.mjs +0 -5
  231. package/dist/chunks/color-picker-Csf0wx5a.mjs.map +0 -1
  232. package/dist/chunks/index-QvKiO9_4.mjs +0 -538
  233. package/dist/chunks/index-QvKiO9_4.mjs.map +0 -1
@@ -0,0 +1,407 @@
1
+ import { S as t, r as e } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
+ import { e as n } from "./HTMLUtils-0wvCRvJc.mjs";
3
+ import { c as i } from "./NodeSpec-NZVvcCuH.mjs";
4
+ import { i as r, c as o, b as a } from "./Selection-D5ZjXoB7.mjs";
5
+ import { f as s } from "./ToolbarItem-ugDymuXi.mjs";
6
+ import { a as l, c, u as d } from "./Document-CI3iCwEP.mjs";
7
+ import { n as g } from "./TypeBrands-C09nE2qO.mjs";
8
+ function u(t2, e2) {
9
+ const n2 = t2.getState(), i2 = n2.selection, o2 = { src: e2.src, alt: e2.alt ?? "", align: e2.align ?? "center", ...void 0 !== e2.width ? { width: e2.width } : {}, ...void 0 !== e2.height ? { height: e2.height } : {} }, s2 = r(i2) ? i2.nodeId : i2.anchor.blockId, u2 = (function(t3, e3) {
10
+ const n3 = t3.getBlock(e3);
11
+ if ("table_cell" === n3?.type) return e3;
12
+ const i3 = t3.getNodePath(e3);
13
+ if (i3) for (const e4 of i3) {
14
+ const n4 = t3.getBlock(e4);
15
+ if ("table_cell" === n4?.type) return e4;
16
+ }
17
+ })(n2, s2);
18
+ return u2 ? (function(t3, e3, n3, i3) {
19
+ const r2 = t3.getNodePath(n3);
20
+ if (!r2) return false;
21
+ const o3 = c(g("image"), [], void 0, i3), s3 = t3.getBlock(n3);
22
+ if (!s3) return false;
23
+ const u3 = t3.transaction("command"), m2 = d(s3);
24
+ for (let t4 = m2.length - 1; t4 >= 0; t4--) {
25
+ const e4 = s3.children.findIndex((e5) => l(e5) && e5.id === m2[t4]?.id);
26
+ -1 !== e4 && u3.removeNode(r2, e4);
27
+ }
28
+ return u3.insertNode(r2, 0, o3), u3.setSelection(a(o3.id, [...r2, o3.id])), e3.dispatch(u3.build()), true;
29
+ })(n2, t2, u2, o2) : (function(t3, e3, n3, i3) {
30
+ const r2 = t3.doc.children.findIndex((t4) => t4.id === n3);
31
+ if (-1 === r2) return false;
32
+ const o3 = c(g("image"), [], void 0, i3), s3 = c(g("paragraph")), l2 = t3.transaction("command").insertNode([], r2 + 1, o3).insertNode([], r2 + 2, s3).setSelection(a(o3.id, [])).build();
33
+ return e3.dispatch(l2), true;
34
+ })(n2, t2, s2, o2);
35
+ }
36
+ function m(t2, e2, n2) {
37
+ const i2 = t2.getState(), o2 = i2.selection;
38
+ if (!r(o2)) return false;
39
+ const a2 = i2.getBlock(o2.nodeId);
40
+ if (!a2 || "image" !== a2.type) return false;
41
+ const s2 = a2.attrs?.width, l2 = a2.attrs?.height;
42
+ if (void 0 === s2 || void 0 === l2) return false;
43
+ const c2 = l2 > 0 ? s2 / l2 : 1, d2 = Math.max(50, Math.min(n2, s2 + e2)), g2 = Math.round(d2 / c2);
44
+ return (d2 !== s2 || g2 !== l2) && (function(t3, e3) {
45
+ const n3 = t3.getState(), i3 = n3.selection;
46
+ if (!r(i3)) return false;
47
+ const o3 = n3.getBlock(i3.nodeId);
48
+ if (!o3 || "image" !== o3.type) return false;
49
+ const a3 = n3.getNodePath(i3.nodeId);
50
+ if (!a3) return false;
51
+ const s3 = { ...o3.attrs ?? {}, ...e3 }, l3 = n3.transaction("command").setNodeAttr(a3, s3).build();
52
+ return t3.dispatch(l3), true;
53
+ })(t2, { width: d2, height: g2 });
54
+ }
55
+ const p = { insertImage: "Insert Image", insertImageTooltip: "Insert Image", uploadFromComputer: "Upload from computer", uploadAria: "Upload image from computer", separator: "or", urlPlaceholder: "https://...", urlAria: "Image URL", insertButton: "Insert", insertAria: "Insert image", imageAria: (t2, e2, n2) => {
56
+ const i2 = [t2 || "Image"];
57
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} by ${n2} pixels`), i2.join(", ");
58
+ }, resetToNaturalSize: "Image reset to natural size.", uploadFailed: "Image upload failed." }, h = { en: p, de: { insertImage: "Bild einfügen", insertImageTooltip: "Bild einfügen", uploadFromComputer: "Vom Computer hochladen", uploadAria: "Bild vom Computer hochladen", separator: "oder", urlPlaceholder: "https://...", urlAria: "Bild-URL", insertButton: "Einfügen", insertAria: "Bild einfügen", imageAria: (t2, e2, n2) => {
59
+ const i2 = [t2 || "Bild"];
60
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} mal ${n2} Pixel`), i2.join(", ");
61
+ }, resetToNaturalSize: "Bild auf Originalgröße zurückgesetzt.", uploadFailed: "Bild-Upload fehlgeschlagen." }, es: { insertImage: "Insertar imagen", insertImageTooltip: "Insertar imagen", uploadFromComputer: "Subir desde el ordenador", uploadAria: "Subir imagen desde el ordenador", separator: "o", urlPlaceholder: "https://...", urlAria: "URL de la imagen", insertButton: "Insertar", insertAria: "Insertar imagen", imageAria: (t2, e2, n2) => {
62
+ const i2 = [t2 || "Imagen"];
63
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} por ${n2} píxeles`), i2.join(", ");
64
+ }, resetToNaturalSize: "Imagen restablecida a tamaño natural.", uploadFailed: "Error al subir la imagen." }, fr: { insertImage: "Insérer une image", insertImageTooltip: "Insérer une image", uploadFromComputer: "Télécharger depuis l’ordinateur", uploadAria: "Télécharger une image depuis l’ordinateur", separator: "ou", urlPlaceholder: "https://...", urlAria: "URL de l’image", insertButton: "Insérer", insertAria: "Insérer une image", imageAria: (t2, e2, n2) => {
65
+ const i2 = [t2 || "Image"];
66
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} par ${n2} pixels`), i2.join(", ");
67
+ }, resetToNaturalSize: "Image rétablie à sa taille d’origine.", uploadFailed: "Échec du téléchargement de l’image." }, zh: { insertImage: "插入图片", insertImageTooltip: "插入图片", uploadFromComputer: "从电脑上传", uploadAria: "从电脑上传图片", separator: "或", urlPlaceholder: "https://...", urlAria: "图片链接", insertButton: "插入", insertAria: "插入图片", imageAria: (t2, e2, n2) => {
68
+ const i2 = [t2 || "图片"];
69
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} x ${n2} 像素`), i2.join(",");
70
+ }, resetToNaturalSize: "图片已恢复原始大小。", uploadFailed: "图片上传失败。" }, ru: { insertImage: "Вставить изображение", insertImageTooltip: "Вставить изображение", uploadFromComputer: "Загрузить с компьютера", uploadAria: "Загрузить изображение с компьютера", separator: "или", urlPlaceholder: "https://...", urlAria: "URL изображения", insertButton: "Вставить", insertAria: "Вставить изображение", imageAria: (t2, e2, n2) => {
71
+ const i2 = [t2 || "Изображение"];
72
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} на ${n2} пикселей`), i2.join(", ");
73
+ }, resetToNaturalSize: "Изображение сброшено до исходного размера.", uploadFailed: "Ошибка загрузки изображения." }, ar: { insertImage: "إدراج صورة", insertImageTooltip: "إدراج صورة", uploadFromComputer: "رفع من الحاسوب", uploadAria: "رفع صورة من الحاسوب", separator: "أو", urlPlaceholder: "https://...", urlAria: "رابط الصورة", insertButton: "إدراج", insertAria: "إدراج صورة", imageAria: (t2, e2, n2) => {
74
+ const i2 = [t2 || "صورة"];
75
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} × ${n2} بكسل`), i2.join("، ");
76
+ }, resetToNaturalSize: "تمت إعادة الصورة إلى حجمها الطبيعي.", uploadFailed: "فشل رفع الصورة." }, hi: { insertImage: "चित्र डालें", insertImageTooltip: "चित्र डालें", uploadFromComputer: "कंप्यूटर से अपलोड करें", uploadAria: "कंप्यूटर से चित्र अपलोड करें", separator: "या", urlPlaceholder: "https://...", urlAria: "चित्र URL", insertButton: "डालें", insertAria: "चित्र डालें", imageAria: (t2, e2, n2) => {
77
+ const i2 = [t2 || "चित्र"];
78
+ return void 0 !== e2 && void 0 !== n2 && i2.push(`${e2} x ${n2} पिक्सेल`), i2.join(", ");
79
+ }, resetToNaturalSize: "चित्र मूल आकार में पुनर्स्थापित।", uploadFailed: "चित्र अपलोड विफल।" } }, f = { left: "notectl-image--left", center: "notectl-image--center", right: "notectl-image--right" }, b = { nw: "nwse-resize", ne: "nesw-resize", sw: "nesw-resize", se: "nwse-resize" }, v = { nw: -1, ne: 1, sw: -1, se: 1 }, x = { nw: "Resize top-left", ne: "Resize top-right", sw: "Resize bottom-left", se: "Resize bottom-right" };
80
+ let y = null;
81
+ function I() {
82
+ y && (y.remove(), y = null);
83
+ }
84
+ function z(t2, e2, n2) {
85
+ return (i2, r2, o2) => {
86
+ const a2 = document.createElement("figure");
87
+ a2.className = "notectl-image", a2.setAttribute("data-block-id", i2.id), a2.setAttribute("data-void", "true"), a2.setAttribute("data-selectable", "true");
88
+ const l2 = document.createElement("div");
89
+ l2.className = "notectl-image__container";
90
+ const c2 = document.createElement("img");
91
+ c2.className = "notectl-image__img", c2.draggable = false;
92
+ const d2 = document.createElement("div");
93
+ d2.className = "notectl-image__overlay", l2.appendChild(c2), l2.appendChild(d2), a2.appendChild(l2);
94
+ let g2 = i2.id, u2 = null;
95
+ function m2(t3) {
96
+ const n3 = t3.attrs?.src ?? "", i3 = t3.attrs?.alt ?? "", r3 = t3.attrs?.width, o3 = t3.attrs?.height, s2 = t3.attrs?.align ?? "center";
97
+ c2.src !== n3 && (c2.src = n3), c2.alt = i3, c2.style.width = void 0 !== r3 ? `${r3}px` : "", c2.style.height = void 0 !== o3 ? `${o3}px` : "";
98
+ for (const t4 of Object.values(f)) a2.classList.remove(t4);
99
+ const l3 = f[s2];
100
+ l3 && a2.classList.add(l3);
101
+ const g3 = e2.get(t3.id) ?? "idle", u3 = "uploading" === g3;
102
+ d2.classList.toggle("notectl-image__overlay--uploading", u3), d2.classList.toggle("notectl-image__overlay--error", "error" === g3), d2.textContent = u3 ? "Uploading..." : "error" === g3 ? "Upload failed" : "", u3 ? a2.setAttribute("aria-busy", "true") : a2.removeAttribute("aria-busy"), (function(t4) {
103
+ const e3 = t4.attrs?.alt ?? "", n4 = t4.attrs?.width, i4 = t4.attrs?.height, r4 = [];
104
+ e3 ? r4.push(e3) : r4.push("Image"), void 0 !== n4 && void 0 !== i4 && r4.push(`${n4} by ${i4} pixels`), a2.setAttribute("aria-label", r4.join(", "));
105
+ })(t3);
106
+ }
107
+ m2(i2);
108
+ let p2 = false;
109
+ function h2(e3, n3, i3, s2) {
110
+ let l3 = 0, d3 = 0, g3 = 1;
111
+ const u3 = (e4) => {
112
+ const i4 = e4.clientX - l3, r3 = (o3 = d3 + i4 * v[n3], Math.max(50, Math.min(t2.maxWidth, o3)));
113
+ var o3;
114
+ const a3 = Math.round(r3 / g3);
115
+ c2.style.width = `${r3}px`, c2.style.height = `${a3}px`, s2.textContent = `${Math.round(r3)} × ${a3}`;
116
+ }, m3 = (t3) => {
117
+ document.removeEventListener("pointermove", u3), document.removeEventListener("pointerup", m3), a2.classList.remove("notectl-image--resizing"), s2.classList.remove("notectl-image__size-indicator--visible"), I();
118
+ const e4 = Math.round(c2.getBoundingClientRect().width), n4 = Math.round(e4 / g3);
119
+ !(function(t4, e5, n5) {
120
+ const i4 = r2(), a3 = i4.getBlock(t4);
121
+ if (!a3) return;
122
+ const s3 = a3.attrs?.width, l4 = a3.attrs?.height;
123
+ if (s3 === e5 && l4 === n5) return;
124
+ const c3 = i4.getNodePath(t4);
125
+ if (!c3) return;
126
+ const d4 = { ...a3.attrs ?? {}, width: e5, height: n5 }, g4 = i4.transaction("command").setNodeAttr(c3, d4).build();
127
+ o2(g4);
128
+ })(i3, e4, n4), t3.target?.releasePointerCapture?.(t3.pointerId);
129
+ };
130
+ e3.addEventListener("pointerdown", (t3) => {
131
+ t3.preventDefault(), t3.stopPropagation(), l3 = t3.clientX, d3 = c2.getBoundingClientRect().width;
132
+ const e4 = c2.getBoundingClientRect().height;
133
+ var i4;
134
+ g3 = e4 > 0 ? d3 / e4 : 1, a2.classList.add("notectl-image--resizing"), s2.textContent = `${Math.round(d3)} × ${Math.round(e4)}`, s2.classList.add("notectl-image__size-indicator--visible"), i4 = b[n3], I(), y = document.createElement("style"), y.textContent = `*{cursor:${i4}!important;user-select:none!important}`, document.head.appendChild(y), t3.target.setPointerCapture(t3.pointerId), document.addEventListener("pointermove", u3), document.addEventListener("pointerup", m3);
135
+ });
136
+ }
137
+ function z2() {
138
+ I(), u2 && (u2.remove(), u2 = null);
139
+ }
140
+ return c2.addEventListener("load", () => {
141
+ if (p2) return;
142
+ const e3 = r2(), n3 = e3.getBlock(g2);
143
+ if (!n3 || "image" !== n3.type) return;
144
+ const i3 = void 0 !== n3.attrs?.width, a3 = void 0 !== n3.attrs?.height;
145
+ if (i3 && a3) return void (p2 = true);
146
+ const s2 = c2.naturalWidth, l3 = c2.naturalHeight;
147
+ if (0 === s2 || 0 === l3) return;
148
+ const d3 = Math.min(s2, t2.maxWidth), u3 = s2 > 0 ? l3 / s2 : 1, m3 = Math.round(d3 * u3), h3 = e3.getNodePath(g2);
149
+ if (!h3) return;
150
+ const f2 = { ...n3.attrs ?? {}, width: d3, height: m3 }, b2 = e3.transaction("command").setNodeAttr(h3, f2).build();
151
+ o2(b2), p2 = true;
152
+ }), { dom: a2, contentDOM: null, update: (t3) => "image" === t3.type && (g2 = t3.id, a2.setAttribute("data-block-id", t3.id), m2(t3), true), selectNode() {
153
+ a2.classList.add("notectl-image--selected"), (function(e3) {
154
+ if (!t2.resizable || u2) return;
155
+ u2 = document.createElement("div"), u2.className = "notectl-image__resize-overlay", u2.setAttribute("data-notectl-no-print", "");
156
+ const i3 = document.createElement("div");
157
+ i3.className = "notectl-image__size-indicator", u2.appendChild(i3);
158
+ const r3 = ["nw", "ne", "sw", "se"];
159
+ for (const t3 of r3) {
160
+ const n3 = document.createElement("div");
161
+ n3.className = `notectl-image__resize-handle notectl-image__resize-handle--${t3}`, n3.setAttribute("role", "separator"), n3.setAttribute("aria-label", x[t3]), h2(n3, t3, e3, i3), u2.appendChild(n3);
162
+ }
163
+ if (n2) {
164
+ const t3 = (function(t4) {
165
+ const e4 = t4.shrinkWidth ?? null, n3 = t4.growWidth ?? null;
166
+ return e4 && n3 ? `${s(e4)} / ${s(n3)} to resize` : "";
167
+ })(n2);
168
+ if (t3) {
169
+ const e4 = document.createElement("div");
170
+ e4.className = "notectl-image__keyboard-hint", e4.setAttribute("aria-hidden", "true"), e4.textContent = t3, u2.appendChild(e4);
171
+ }
172
+ }
173
+ l2.appendChild(u2);
174
+ })(g2);
175
+ }, deselectNode() {
176
+ a2.classList.remove("notectl-image--selected"), z2();
177
+ }, destroy() {
178
+ z2();
179
+ } };
180
+ };
181
+ }
182
+ const w = new t("image:upload"), A = { growWidth: "Mod-Shift-ArrowRight", shrinkWidth: "Mod-Shift-ArrowLeft", growWidthLarge: "Mod-Shift-Alt-ArrowRight", shrinkWidthLarge: "Mod-Shift-Alt-ArrowLeft", resetSize: "Mod-Shift-0" }, _ = { maxWidth: 800, maxFileSize: 10485760, acceptedTypes: ["image/png", "image/jpeg", "image/gif", "image/webp", "image/svg+xml"], resizable: true, resizeStep: 10, resizeStepLarge: 50 };
183
+ class S {
184
+ id = "image";
185
+ name = "Image";
186
+ priority = 45;
187
+ config;
188
+ resolvedKeymap;
189
+ uploadStates = /* @__PURE__ */ new Map();
190
+ blobUrls = /* @__PURE__ */ new Set();
191
+ context = null;
192
+ locale;
193
+ constructor(t2) {
194
+ this.config = { ..._, ...t2 }, this.resolvedKeymap = { ...A, ...t2?.keymap };
195
+ }
196
+ init(t2) {
197
+ this.locale = e(h, t2, this.config.locale), t2.registerStyleSheet("\n/* Image */\n.notectl-image {\n margin: 8px 0;\n user-select: none;\n line-height: 0;\n}\n\n.notectl-image--center {\n text-align: center;\n}\n\n.notectl-image--left {\n text-align: left;\n}\n\n.notectl-image--right {\n text-align: right;\n}\n\n.notectl-image__container {\n display: inline-block;\n position: relative;\n line-height: 0;\n}\n\n.notectl-image__img {\n display: block;\n max-width: 100%;\n border-radius: 4px;\n}\n\n.notectl-image--selected .notectl-image__container {\n outline: 2px solid var(--notectl-primary);\n outline-offset: 2px;\n border-radius: 6px;\n}\n\n/* Alignment toolbar (appears on image selection) */\n.notectl-image__align-toolbar {\n display: flex;\n gap: 2px;\n position: absolute;\n top: -36px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--notectl-surface-overlay);\n border: 1px solid var(--notectl-border);\n border-radius: 6px;\n padding: 2px;\n box-shadow: 0 2px 8px var(--notectl-shadow);\n z-index: 10;\n}\n\n.notectl-image__align-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: var(--notectl-fg);\n}\n\n.notectl-image__align-btn:hover {\n background: var(--notectl-hover-bg);\n}\n\n.notectl-image__align-btn--active {\n background: var(--notectl-active-bg);\n color: var(--notectl-primary-fg);\n}\n\n.notectl-image__align-btn svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n}\n\n/* Upload overlay */\n.notectl-image__overlay {\n position: absolute;\n inset: 0;\n display: none;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.8);\n border-radius: 4px;\n font-size: 13px;\n color: var(--notectl-fg-muted);\n}\n\n.notectl-image__overlay--uploading {\n display: flex;\n}\n\n.notectl-image__overlay--error {\n display: flex;\n background: var(--notectl-danger-muted);\n color: var(--notectl-danger);\n}\n\n/* Resize overlay + handles */\n.notectl-image__resize-overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n.notectl-image__resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: var(--notectl-bg);\n border: 2px solid var(--notectl-primary);\n border-radius: 50%;\n pointer-events: all;\n z-index: 2;\n transition: transform 0.1s, background 0.1s;\n}\n\n.notectl-image__resize-handle:hover {\n background: var(--notectl-primary);\n transform: scale(1.3);\n}\n\n.notectl-image--resizing .notectl-image__resize-handle {\n background: var(--notectl-primary);\n}\n\n.notectl-image__resize-handle--nw {\n top: -5px;\n left: -5px;\n cursor: nwse-resize;\n}\n\n.notectl-image__resize-handle--ne {\n top: -5px;\n right: -5px;\n cursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--sw {\n bottom: -5px;\n left: -5px;\n cursor: nesw-resize;\n}\n\n.notectl-image__resize-handle--se {\n bottom: -5px;\n right: -5px;\n cursor: nwse-resize;\n}\n\n/* Size indicator tooltip */\n.notectl-image__size-indicator {\n position: absolute;\n bottom: -28px;\n left: 50%;\n transform: translateX(-50%);\n padding: 2px 8px;\n background: var(--notectl-tooltip-bg);\n color: var(--notectl-tooltip-fg);\n font-size: 11px;\n font-weight: 500;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s;\n z-index: 3;\n}\n\n.notectl-image__size-indicator--visible {\n opacity: 1;\n}\n\n/* Keyboard resize hint (shown on selection, hidden during drag) */\n.notectl-image__keyboard-hint {\n display: none;\n position: absolute;\n bottom: -28px;\n left: 50%;\n transform: translateX(-50%);\n padding: 2px 8px;\n font-size: 11px;\n color: var(--notectl-fg-muted);\n white-space: nowrap;\n pointer-events: none;\n z-index: 3;\n}\n\n.notectl-image--selected .notectl-image__keyboard-hint {\n display: block;\n}\n\n.notectl-image--resizing .notectl-image__keyboard-hint {\n display: none;\n}\n\n/* Resizing feedback */\n.notectl-image--resizing .notectl-image__img {\n opacity: 0.85;\n}\n"), this.context = t2, this.registerNodeSpec(t2), this.registerNodeView(t2), (function(t3) {
198
+ t3.registerCommand("insertImage", () => u(t3, { src: "" })), t3.registerCommand("removeImage", () => (function(t4) {
199
+ const e2 = t4.getState(), n2 = e2.selection;
200
+ if (!r(n2)) return false;
201
+ const i2 = e2.getBlock(n2.nodeId);
202
+ if (!i2 || "image" !== i2.type) return false;
203
+ const a2 = e2.getNodePath(n2.nodeId);
204
+ if (!a2 || 0 === a2.length) return false;
205
+ const s2 = a2.slice(0, -1);
206
+ let c2;
207
+ if (0 === s2.length) c2 = e2.doc;
208
+ else {
209
+ const t5 = s2[s2.length - 1];
210
+ c2 = t5 ? e2.getBlock(t5) : void 0;
211
+ }
212
+ if (!c2) return false;
213
+ const d2 = c2.children.findIndex((t5) => l(t5) && t5.id === n2.nodeId);
214
+ if (-1 === d2) return false;
215
+ const g2 = (function(t5, e3, n3) {
216
+ if (0 === e3.length) {
217
+ const e4 = t5.doc.children, i3 = e4.findIndex((t6) => t6.id === n3), r2 = e4[i3 + 1] ?? e4[i3 - 1];
218
+ return r2?.id;
219
+ }
220
+ return e3[e3.length - 1];
221
+ })(e2, s2, n2.nodeId);
222
+ if (!g2) return false;
223
+ const u2 = e2.transaction("command").removeNode(s2, d2).setSelection(o(g2, 0)).build();
224
+ return t4.dispatch(u2), true;
225
+ })(t3));
226
+ })(t2), this.registerResizeCommands(t2), this.registerResizeKeymaps(t2), this.registerFileHandler(t2), this.registerToolbarItem(t2);
227
+ }
228
+ destroy() {
229
+ for (const t2 of this.blobUrls) URL.revokeObjectURL(t2);
230
+ this.blobUrls.clear(), this.uploadStates.clear(), this.context = null;
231
+ }
232
+ onStateChange(t2, e2, n2) {
233
+ if (!this.context) return;
234
+ for (const t3 of this.uploadStates.keys()) e2.getBlock(t3) || this.uploadStates.delete(t3);
235
+ const i2 = this.isImageSelected(t2), r2 = this.isImageSelected(e2);
236
+ !i2 && r2 && this.announceImageSelection(e2);
237
+ }
238
+ registerNodeSpec(t2) {
239
+ const e2 = this.locale;
240
+ t2.registerNodeSpec({ type: "image", group: "block", isVoid: true, selectable: true, attrs: { src: { default: "" }, alt: { default: "" }, align: { default: "center" } }, toDOM(t3) {
241
+ const n2 = i("figure", t3.id);
242
+ n2.className = "notectl-image", n2.setAttribute("data-void", "true"), n2.setAttribute("data-selectable", "true");
243
+ const r2 = document.createElement("div");
244
+ r2.className = "notectl-image__container";
245
+ const o2 = t3.attrs?.alt ?? "", a2 = t3.attrs?.width, s2 = t3.attrs?.height, l2 = document.createElement("img");
246
+ l2.className = "notectl-image__img", l2.src = t3.attrs?.src ?? "", l2.alt = o2, l2.draggable = false, void 0 !== a2 && (l2.style.width = `${a2}px`), void 0 !== s2 && (l2.style.height = `${s2}px`);
247
+ const c2 = { left: "notectl-image--left", center: "notectl-image--center", right: "notectl-image--right" }[t3.attrs?.align ?? "center"];
248
+ return c2 && n2.classList.add(c2), n2.setAttribute("aria-label", e2.imageAria(o2, a2, s2)), r2.appendChild(l2), n2.appendChild(r2), n2;
249
+ }, toHTML(t3) {
250
+ const e3 = n(t3.attrs?.src ?? ""), i2 = n(t3.attrs?.alt ?? ""), r2 = t3.attrs?.width, o2 = t3.attrs?.height, a2 = t3.attrs?.align ?? "center", s2 = (void 0 !== r2 ? ` width="${r2}"` : "") + (void 0 !== o2 ? ` height="${o2}"` : "");
251
+ return `<figure class="notectl-image notectl-image--${n(a2)}"><img src="${e3}" alt="${i2}"${s2}></figure>`;
252
+ }, parseHTML: [{ tag: "figure", getAttrs(t3) {
253
+ const e3 = t3.querySelector("img");
254
+ if (!e3) return false;
255
+ const n2 = { src: e3.getAttribute("src") ?? "", alt: e3.getAttribute("alt") ?? "", align: "center" }, i2 = e3.getAttribute("width"), r2 = e3.getAttribute("height");
256
+ return i2 && (n2.width = Number.parseInt(i2, 10)), r2 && (n2.height = Number.parseInt(r2, 10)), t3.classList.contains("notectl-image--left") && (n2.align = "left"), t3.classList.contains("notectl-image--right") && (n2.align = "right"), n2;
257
+ } }, { tag: "img", getAttrs(t3) {
258
+ const e3 = { src: t3.getAttribute("src") ?? "", alt: t3.getAttribute("alt") ?? "", align: "center" }, n2 = t3.getAttribute("width"), i2 = t3.getAttribute("height");
259
+ return n2 && (e3.width = Number.parseInt(n2, 10)), i2 && (e3.height = Number.parseInt(i2, 10)), e3;
260
+ } }], sanitize: { tags: ["figure", "img"], attrs: ["src", "alt", "width", "height", "class"] } });
261
+ }
262
+ registerNodeView(t2) {
263
+ t2.registerNodeView("image", z(this.config, this.uploadStates, this.resolvedKeymap));
264
+ }
265
+ registerResizeCommands(t2) {
266
+ const e2 = this.config.resizeStep ?? 10, n2 = this.config.resizeStepLarge ?? 50, i2 = this.config.maxWidth;
267
+ t2.registerCommand("resizeImageGrow", () => {
268
+ const n3 = m(t2, e2, i2);
269
+ return n3 && this.announceCurrentSize(t2), n3;
270
+ }), t2.registerCommand("resizeImageShrink", () => {
271
+ const n3 = m(t2, -e2, i2);
272
+ return n3 && this.announceCurrentSize(t2), n3;
273
+ }), t2.registerCommand("resizeImageGrowLarge", () => {
274
+ const e3 = m(t2, n2, i2);
275
+ return e3 && this.announceCurrentSize(t2), e3;
276
+ }), t2.registerCommand("resizeImageShrinkLarge", () => {
277
+ const e3 = m(t2, -n2, i2);
278
+ return e3 && this.announceCurrentSize(t2), e3;
279
+ }), t2.registerCommand("resetImageSize", () => {
280
+ const e3 = (function(t3) {
281
+ const e4 = t3.getState(), n3 = e4.selection;
282
+ if (!r(n3)) return false;
283
+ const i3 = e4.getBlock(n3.nodeId);
284
+ if (!i3 || "image" !== i3.type) return false;
285
+ const o2 = e4.getNodePath(n3.nodeId);
286
+ if (!o2) return false;
287
+ const a2 = { ...i3.attrs ?? {} }, s2 = Object.fromEntries(Object.entries(a2).filter(([t4]) => "width" !== t4 && "height" !== t4)), l2 = e4.transaction("command").setNodeAttr(o2, s2).build();
288
+ return t3.dispatch(l2), true;
289
+ })(t2);
290
+ return e3 && t2.announce(this.locale.resetToNaturalSize), e3;
291
+ });
292
+ }
293
+ registerResizeKeymaps(t2) {
294
+ const e2 = {}, n2 = { growWidth: "resizeImageGrow", shrinkWidth: "resizeImageShrink", growWidthLarge: "resizeImageGrowLarge", shrinkWidthLarge: "resizeImageShrinkLarge", resetSize: "resetImageSize" };
295
+ for (const [i2, r2] of Object.entries(n2)) {
296
+ const n3 = this.resolvedKeymap[i2] ?? null;
297
+ n3 && (e2[n3] = () => t2.executeCommand(r2));
298
+ }
299
+ Object.keys(e2).length > 0 && t2.registerKeymap(e2);
300
+ }
301
+ registerFileHandler(t2) {
302
+ t2.registerFileHandler("image/*", async (e2, n2) => {
303
+ const i2 = e2.filter((t3) => this.isAcceptedType(t3.type));
304
+ if (0 === i2.length) return false;
305
+ for (const e3 of i2) this.handleFileInsert(t2, e3);
306
+ return true;
307
+ });
308
+ }
309
+ handleFileInsert(t2, e2) {
310
+ if (e2.size > this.config.maxFileSize) return;
311
+ const n2 = URL.createObjectURL(e2);
312
+ if (this.blobUrls.add(n2), !u(t2, { src: n2 })) return URL.revokeObjectURL(n2), void this.blobUrls.delete(n2);
313
+ const i2 = t2.getState().selection;
314
+ if (!r(i2)) return;
315
+ const o2 = i2.nodeId;
316
+ this.uploadStates.set(o2, "uploading"), t2.getService(w) ? this.uploadFile(t2, e2, o2, n2) : this.uploadStates.set(o2, "complete");
317
+ }
318
+ async uploadFile(t2, e2, n2, i2) {
319
+ const r2 = t2.getService(w);
320
+ if (r2) try {
321
+ const o2 = await r2.upload(e2);
322
+ this.uploadStates.set(n2, "complete");
323
+ const a2 = t2.getState(), s2 = a2.getBlock(n2);
324
+ if (!s2) return;
325
+ const l2 = a2.getNodePath(n2);
326
+ if (!l2) return;
327
+ const c2 = { ...s2.attrs ?? {}, src: o2.url, ...void 0 !== o2.width ? { width: o2.width } : {}, ...void 0 !== o2.height ? { height: o2.height } : {} }, d2 = a2.transaction("command").setNodeAttr(l2, c2).build();
328
+ t2.dispatch(d2), URL.revokeObjectURL(i2), this.blobUrls.delete(i2);
329
+ } catch {
330
+ this.uploadStates.set(n2, "error"), t2.announce(this.locale.uploadFailed);
331
+ }
332
+ }
333
+ registerToolbarItem(t2) {
334
+ t2.registerToolbarItem({ id: "image", group: "insert", icon: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"/></svg>', label: this.locale.insertImage, tooltip: this.locale.insertImageTooltip, command: "insertImage", priority: 50, popupType: "custom", separatorAfter: this.config.separatorAfter, renderPopup: (t3, e2, n2) => {
335
+ this.renderImagePopup(t3, e2, n2);
336
+ } });
337
+ }
338
+ renderImagePopup(t2, e2, n2) {
339
+ t2.style.padding = "8px", t2.style.minWidth = "240px";
340
+ const i2 = document.createElement("input");
341
+ i2.type = "file", i2.accept = this.config.acceptedTypes.join(","), i2.style.cssText = "position:absolute;width:0;height:0;overflow:hidden;opacity:0;";
342
+ const r2 = document.createElement("button");
343
+ r2.type = "button", r2.textContent = this.locale.uploadFromComputer, r2.setAttribute("aria-label", this.locale.uploadAria), r2.style.cssText = "display:block;width:100%;padding:8px 12px;cursor:pointer;text-align:center;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);", r2.addEventListener("mousedown", (t3) => {
344
+ t3.preventDefault(), t3.stopPropagation(), i2.click();
345
+ }), i2.addEventListener("change", () => {
346
+ const t3 = i2.files?.[0];
347
+ t3 && (this.handleFileInsert(e2, t3), n2(), e2.getContainer().focus());
348
+ }), t2.appendChild(i2), t2.appendChild(r2);
349
+ const o2 = document.createElement("div");
350
+ o2.style.cssText = "display:flex;align-items:center;margin:8px 0;color:var(--notectl-fg-muted);font-size:12px;";
351
+ const a2 = document.createElement("span");
352
+ a2.style.cssText = "flex:1;height:1px;background:var(--notectl-border);";
353
+ const s2 = document.createElement("span");
354
+ s2.textContent = this.locale.separator, s2.style.cssText = "padding:0 8px;";
355
+ const l2 = document.createElement("span");
356
+ l2.style.cssText = "flex:1;height:1px;background:var(--notectl-border);", o2.appendChild(a2), o2.appendChild(s2), o2.appendChild(l2), t2.appendChild(o2);
357
+ const c2 = document.createElement("input");
358
+ c2.type = "url", c2.placeholder = this.locale.urlPlaceholder, c2.setAttribute("aria-label", this.locale.urlAria), c2.style.cssText = "width:100%;padding:6px 8px;box-sizing:border-box;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-bg);color:var(--notectl-fg);";
359
+ const d2 = document.createElement("button");
360
+ d2.type = "button", d2.textContent = this.locale.insertButton, d2.setAttribute("aria-label", this.locale.insertAria), d2.style.cssText = "width:100%;padding:8px 12px;margin-top:4px;cursor:pointer;border:1px solid var(--notectl-border);border-radius:4px;background:var(--notectl-surface-raised);color:var(--notectl-fg);";
361
+ const g2 = () => {
362
+ const t3 = c2.value.trim();
363
+ t3 && (u(e2, { src: t3 }), n2(), e2.getContainer().focus());
364
+ };
365
+ d2.addEventListener("mousedown", (t3) => {
366
+ t3.preventDefault(), t3.stopPropagation(), g2();
367
+ }), c2.addEventListener("keydown", (t3) => {
368
+ "Enter" === t3.key && (t3.preventDefault(), g2());
369
+ }), t2.appendChild(c2), t2.appendChild(d2), requestAnimationFrame(() => c2.focus());
370
+ }
371
+ isAcceptedType(t2) {
372
+ return this.config.acceptedTypes.some((e2) => e2 === t2 || e2.endsWith("/*") && t2.startsWith(e2.slice(0, -1)));
373
+ }
374
+ isImageSelected(t2) {
375
+ const e2 = t2.selection;
376
+ if (!r(e2)) return false;
377
+ const n2 = t2.getBlock(e2.nodeId);
378
+ return "image" === n2?.type;
379
+ }
380
+ announceImageSelection(t2) {
381
+ if (!this.context) return;
382
+ const e2 = t2.selection;
383
+ if (!r(e2)) return;
384
+ const n2 = t2.getBlock(e2.nodeId);
385
+ if (!n2 || "image" !== n2.type) return;
386
+ const i2 = n2.attrs?.alt ?? "", o2 = n2.attrs?.width, a2 = n2.attrs?.height, l2 = ["Image selected."];
387
+ i2 && l2.push(`Alt text: ${i2}.`), void 0 !== o2 && void 0 !== a2 && l2.push(`Size: ${o2} by ${a2} pixels.`);
388
+ const c2 = this.resolvedKeymap.shrinkWidth ?? null, d2 = this.resolvedKeymap.growWidth ?? null;
389
+ c2 && d2 && l2.push(`${s(c2)} / ${s(d2)} to resize.`), this.context.announce(l2.join(" "));
390
+ }
391
+ announceCurrentSize(t2) {
392
+ const e2 = t2.getState(), n2 = e2.selection;
393
+ if (!r(n2)) return;
394
+ const i2 = e2.getBlock(n2.nodeId);
395
+ if (!i2 || "image" !== i2.type) return;
396
+ const o2 = i2.attrs?.width, a2 = i2.attrs?.height;
397
+ void 0 !== o2 && void 0 !== a2 && t2.announce(`Image resized to ${o2} by ${a2} pixels.`);
398
+ }
399
+ }
400
+ export {
401
+ A as D,
402
+ h as I,
403
+ p as a,
404
+ w as b,
405
+ S as c
406
+ };
407
+ //# sourceMappingURL=index-Ct0ivLhO.mjs.map