@notectl/core 1.7.0 → 1.7.2

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 (218) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/{AttrRegistry-I-VdmRnN.mjs → AttrRegistry-D9Jx_RVb.mjs} +2 -2
  3. package/dist/chunks/{AttrRegistry-I-VdmRnN.mjs.map → AttrRegistry-D9Jx_RVb.mjs.map} +1 -1
  4. package/dist/chunks/AttributedMarkCommands-BtLea72z.mjs +80 -0
  5. package/dist/chunks/AttributedMarkCommands-BtLea72z.mjs.map +1 -0
  6. package/dist/chunks/{CaretNavigation-CAJXoaae.mjs → CaretNavigation-7JYpIKbs.mjs} +56 -56
  7. package/dist/chunks/{CaretNavigation-CAJXoaae.mjs.map → CaretNavigation-7JYpIKbs.mjs.map} +1 -1
  8. package/dist/chunks/ColorGrid-Dneqb8if.mjs +81 -0
  9. package/dist/chunks/ColorGrid-Dneqb8if.mjs.map +1 -0
  10. package/dist/chunks/ColorPickerPopup-CiCLBbe9.mjs +37 -0
  11. package/dist/chunks/ColorPickerPopup-CiCLBbe9.mjs.map +1 -0
  12. package/dist/chunks/ColorValidation-CV4f1wu6.mjs +39 -0
  13. package/dist/chunks/ColorValidation-CV4f1wu6.mjs.map +1 -0
  14. package/dist/chunks/{Document-CuwE73FF.mjs → Document-Brtw2jL1.mjs} +18 -18
  15. package/dist/chunks/{Document-CuwE73FF.mjs.map → Document-Brtw2jL1.mjs.map} +1 -1
  16. package/dist/chunks/MarkCommands-6RUJ4L3r.mjs +94 -0
  17. package/dist/chunks/MarkCommands-6RUJ4L3r.mjs.map +1 -0
  18. package/dist/chunks/{NavigationUtils-CyW0Vo8A.mjs → NavigationUtils-Cspt2ZrK.mjs} +3 -3
  19. package/dist/chunks/{NavigationUtils-CyW0Vo8A.mjs.map → NavigationUtils-Cspt2ZrK.mjs.map} +1 -1
  20. package/dist/chunks/{NodeResolver-B-wzthAQ.mjs → NodeResolver-C2XYkeOi.mjs} +2 -2
  21. package/dist/chunks/{NodeResolver-B-wzthAQ.mjs.map → NodeResolver-C2XYkeOi.mjs.map} +1 -1
  22. package/dist/chunks/PopupPositioning-BTT-_pQ3.mjs +32 -0
  23. package/dist/chunks/PopupPositioning-BTT-_pQ3.mjs.map +1 -0
  24. package/dist/chunks/RangeIterator-Bh4Vl_6D.mjs +16 -0
  25. package/dist/chunks/RangeIterator-Bh4Vl_6D.mjs.map +1 -0
  26. package/dist/chunks/{Selection-DmFDwiPJ.mjs → Selection-BRTab5hO.mjs} +7 -7
  27. package/dist/chunks/{Selection-DmFDwiPJ.mjs.map → Selection-BRTab5hO.mjs.map} +1 -1
  28. package/dist/chunks/StyleRuntime-ChRjVQwL.mjs +239 -0
  29. package/dist/chunks/StyleRuntime-ChRjVQwL.mjs.map +1 -0
  30. package/dist/chunks/ToolbarItem-BpZggUGo.mjs.map +1 -1
  31. package/dist/chunks/{ToolbarKeyboardNav-B32OMv8r.mjs → ToolbarKeyboardNav-DhpL8zNV.mjs} +3 -3
  32. package/dist/chunks/{ToolbarKeyboardNav-B32OMv8r.mjs.map → ToolbarKeyboardNav-DhpL8zNV.mjs.map} +1 -1
  33. package/dist/chunks/{ToolbarPlugin-B6JETWaw.mjs → ToolbarPlugin-DpLVJ71w.mjs} +348 -135
  34. package/dist/chunks/ToolbarPlugin-DpLVJ71w.mjs.map +1 -0
  35. package/dist/chunks/index--n1RGpq-.mjs +171 -0
  36. package/dist/chunks/index--n1RGpq-.mjs.map +1 -0
  37. package/dist/chunks/index-4or5UzNO.mjs +168 -0
  38. package/dist/chunks/index-4or5UzNO.mjs.map +1 -0
  39. package/dist/chunks/{index-pxbbDHVH.mjs → index-ABlTDvEX.mjs} +20 -19
  40. package/dist/chunks/index-ABlTDvEX.mjs.map +1 -0
  41. package/dist/chunks/{index--z_Txzej.mjs → index-BAke7kNL.mjs} +45 -45
  42. package/dist/chunks/{index--z_Txzej.mjs.map → index-BAke7kNL.mjs.map} +1 -1
  43. package/dist/chunks/{index-DMt3ojrY.mjs → index-BXtw5PNN.mjs} +2 -2
  44. package/dist/chunks/{index-DMt3ojrY.mjs.map → index-BXtw5PNN.mjs.map} +1 -1
  45. package/dist/chunks/{index-FlTg80Pk.mjs → index-BhDXjueu.mjs} +285 -325
  46. package/dist/chunks/index-BhDXjueu.mjs.map +1 -0
  47. package/dist/chunks/{index-D0s0Q8Wc.mjs → index-BqNUfq-y.mjs} +43 -35
  48. package/dist/chunks/index-BqNUfq-y.mjs.map +1 -0
  49. package/dist/chunks/{index-CflvcXSd.mjs → index-BvqkuEY1.mjs} +21 -17
  50. package/dist/chunks/index-BvqkuEY1.mjs.map +1 -0
  51. package/dist/chunks/{index-C9gc3Bws.mjs → index-C1opJocO.mjs} +32 -32
  52. package/dist/chunks/{index-C9gc3Bws.mjs.map → index-C1opJocO.mjs.map} +1 -1
  53. package/dist/chunks/index-CWltg1wK.mjs +124 -0
  54. package/dist/chunks/index-CWltg1wK.mjs.map +1 -0
  55. package/dist/chunks/{index-D8tbbW97.mjs → index-Cd3uJLP3.mjs} +2 -2
  56. package/dist/chunks/{index-D8tbbW97.mjs.map → index-Cd3uJLP3.mjs.map} +1 -1
  57. package/dist/chunks/{index-C0cEs7Jc.mjs → index-CluzpB2b.mjs} +10 -10
  58. package/dist/chunks/{index-C0cEs7Jc.mjs.map → index-CluzpB2b.mjs.map} +1 -1
  59. package/dist/chunks/{index-CoeD4T9-.mjs → index-D3NlpmT1.mjs} +15 -11
  60. package/dist/chunks/index-D3NlpmT1.mjs.map +1 -0
  61. package/dist/chunks/{index-CAV2N-fF.mjs → index-D515iymW.mjs} +75 -74
  62. package/dist/chunks/{index-CAV2N-fF.mjs.map → index-D515iymW.mjs.map} +1 -1
  63. package/dist/chunks/{index-B-NSeaM4.mjs → index-Dk49P9N4.mjs} +2 -2
  64. package/dist/chunks/{index-B-NSeaM4.mjs.map → index-Dk49P9N4.mjs.map} +1 -1
  65. package/dist/chunks/index-DyzigvbZ.mjs +410 -0
  66. package/dist/chunks/index-DyzigvbZ.mjs.map +1 -0
  67. package/dist/chunks/index-ErZ5_a1o.mjs +296 -0
  68. package/dist/chunks/index-ErZ5_a1o.mjs.map +1 -0
  69. package/dist/chunks/{index-CNs4QQ8l.mjs → index-fsVJLutn.mjs} +52 -64
  70. package/dist/chunks/index-fsVJLutn.mjs.map +1 -0
  71. package/dist/commands/AttributedMarkCommands.d.ts +46 -0
  72. package/dist/commands/AttributedMarkCommands.d.ts.map +1 -0
  73. package/dist/commands/CommandHelpers.d.ts +21 -0
  74. package/dist/commands/CommandHelpers.d.ts.map +1 -0
  75. package/dist/commands/Commands.d.ts +2 -8
  76. package/dist/commands/Commands.d.ts.map +1 -1
  77. package/dist/commands/DeleteCommands.d.ts.map +1 -1
  78. package/dist/commands/GapCursorCommands.d.ts.map +1 -1
  79. package/dist/commands/NodeSelectionCommands.d.ts.map +1 -1
  80. package/dist/commands/PasteCommand.d.ts.map +1 -1
  81. package/dist/commands/RangeIterator.d.ts +10 -0
  82. package/dist/commands/RangeIterator.d.ts.map +1 -0
  83. package/dist/editor/DocumentParser.d.ts.map +1 -1
  84. package/dist/editor/DocumentSerializer.d.ts +2 -0
  85. package/dist/editor/DocumentSerializer.d.ts.map +1 -1
  86. package/dist/editor/EditorThemeController.d.ts +3 -0
  87. package/dist/editor/EditorThemeController.d.ts.map +1 -1
  88. package/dist/editor/MarkSerializer.d.ts +11 -0
  89. package/dist/editor/MarkSerializer.d.ts.map +1 -0
  90. package/dist/editor/NotectlEditor.d.ts +19 -3
  91. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  92. package/dist/editor/PaperLayoutController.d.ts +2 -0
  93. package/dist/editor/PaperLayoutController.d.ts.map +1 -1
  94. package/dist/editor/styles/font-select.d.ts +1 -1
  95. package/dist/editor/styles/font-select.d.ts.map +1 -1
  96. package/dist/editor/styles/font-size-select.d.ts +1 -1
  97. package/dist/editor/styles/font-size-select.d.ts.map +1 -1
  98. package/dist/editor/styles/heading-select.d.ts +1 -1
  99. package/dist/editor/styles/heading-select.d.ts.map +1 -1
  100. package/dist/editor/styles/toolbar.d.ts +1 -1
  101. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  102. package/dist/index.d.ts +9 -2
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/input/ClipboardHandler.d.ts +0 -2
  105. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  106. package/dist/input/LegacyHTMLNormalizer.d.ts.map +1 -1
  107. package/dist/model/MarkSpec.d.ts +6 -0
  108. package/dist/model/MarkSpec.d.ts.map +1 -1
  109. package/dist/notectl-core.mjs +2244 -2095
  110. package/dist/notectl-core.mjs.map +1 -1
  111. package/dist/notectl-core.umd.js +2862 -2415
  112. package/dist/notectl-core.umd.js.map +1 -1
  113. package/dist/plugins/PluginManager.d.ts +2 -0
  114. package/dist/plugins/PluginManager.d.ts.map +1 -1
  115. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  116. package/dist/plugins/alignment.mjs +1 -1
  117. package/dist/plugins/blockquote.mjs +1 -1
  118. package/dist/plugins/caret-navigation.mjs +1 -1
  119. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
  120. package/dist/plugins/code-block.mjs +1 -1
  121. package/dist/plugins/font/FontPlugin.d.ts +0 -6
  122. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  123. package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
  124. package/dist/plugins/font-size/FontSizePlugin.d.ts +0 -5
  125. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  126. package/dist/plugins/font-size.mjs +1 -1
  127. package/dist/plugins/font.mjs +1 -1
  128. package/dist/plugins/gap-cursor.mjs +2 -2
  129. package/dist/plugins/hard-break.mjs +2 -25
  130. package/dist/plugins/hard-break.mjs.map +1 -1
  131. package/dist/plugins/heading/HeadingBlockTypePicker.d.ts +1 -7
  132. package/dist/plugins/heading/HeadingBlockTypePicker.d.ts.map +1 -1
  133. package/dist/plugins/heading/HeadingPlugin.d.ts +0 -6
  134. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  135. package/dist/plugins/heading.mjs +1 -1
  136. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  137. package/dist/plugins/highlight.mjs +1 -1
  138. package/dist/plugins/horizontal-rule.mjs +1 -1
  139. package/dist/plugins/image/ImageNodeView.d.ts.map +1 -1
  140. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  141. package/dist/plugins/image.mjs +1 -1
  142. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  143. package/dist/plugins/link.mjs +1 -1
  144. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  145. package/dist/plugins/list.mjs +1 -1
  146. package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -1
  147. package/dist/plugins/shared/ColorGrid.d.ts +25 -0
  148. package/dist/plugins/shared/ColorGrid.d.ts.map +1 -0
  149. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -1
  150. package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -1
  151. package/dist/plugins/shared/ColorValidation.d.ts +13 -2
  152. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -1
  153. package/dist/plugins/shared/PopupKeyboardPatterns.d.ts +43 -0
  154. package/dist/plugins/shared/PopupKeyboardPatterns.d.ts.map +1 -0
  155. package/dist/plugins/shared/PopupManager.d.ts +45 -0
  156. package/dist/plugins/shared/PopupManager.d.ts.map +1 -0
  157. package/dist/plugins/shared/PopupPositioning.d.ts +21 -0
  158. package/dist/plugins/shared/PopupPositioning.d.ts.map +1 -0
  159. package/dist/plugins/strikethrough.mjs +1 -1
  160. package/dist/plugins/super-sub.mjs +1 -1
  161. package/dist/plugins/table/TableBorderColor.d.ts.map +1 -1
  162. package/dist/plugins/table/TableContextMenu.d.ts +2 -1
  163. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -1
  164. package/dist/plugins/table/TableControls.d.ts.map +1 -1
  165. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -1
  166. package/dist/plugins/table/TableControlsLayout.d.ts.map +1 -1
  167. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -1
  168. package/dist/plugins/table.mjs +1 -1
  169. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  170. package/dist/plugins/text-color.mjs +1 -1
  171. package/dist/plugins/text-formatting.mjs +1 -1
  172. package/dist/plugins/toolbar/ToolbarItem.d.ts +11 -2
  173. package/dist/plugins/toolbar/ToolbarItem.d.ts.map +1 -1
  174. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +5 -1
  175. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -1
  176. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +1 -0
  177. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  178. package/dist/plugins/toolbar/ToolbarPopupController.d.ts +9 -1
  179. package/dist/plugins/toolbar/ToolbarPopupController.d.ts.map +1 -1
  180. package/dist/plugins/toolbar/ToolbarRenderers.d.ts.map +1 -1
  181. package/dist/plugins/toolbar/ToolbarTooltip.d.ts.map +1 -1
  182. package/dist/plugins/toolbar/index.d.ts +1 -1
  183. package/dist/plugins/toolbar/index.d.ts.map +1 -1
  184. package/dist/plugins/toolbar.mjs +1 -1
  185. package/dist/state/BlockTreeOps.d.ts +21 -0
  186. package/dist/state/BlockTreeOps.d.ts.map +1 -0
  187. package/dist/state/InlineContentOps.d.ts +37 -0
  188. package/dist/state/InlineContentOps.d.ts.map +1 -0
  189. package/dist/state/StepApplication.d.ts.map +1 -1
  190. package/dist/style/StyleRuntime.d.ts +38 -0
  191. package/dist/style/StyleRuntime.d.ts.map +1 -0
  192. package/dist/test/PluginTestUtils.d.ts +4 -0
  193. package/dist/test/PluginTestUtils.d.ts.map +1 -1
  194. package/dist/view/Reconciler.d.ts.map +1 -1
  195. package/package.json +2 -2
  196. package/dist/chunks/ColorNames-BdsHwA2f.mjs +0 -59
  197. package/dist/chunks/ColorNames-BdsHwA2f.mjs.map +0 -1
  198. package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs +0 -125
  199. package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs.map +0 -1
  200. package/dist/chunks/Commands-CicwYoTQ.mjs +0 -286
  201. package/dist/chunks/Commands-CicwYoTQ.mjs.map +0 -1
  202. package/dist/chunks/MarkCommands-CC37WA7Z.mjs +0 -94
  203. package/dist/chunks/MarkCommands-CC37WA7Z.mjs.map +0 -1
  204. package/dist/chunks/ToolbarPlugin-B6JETWaw.mjs.map +0 -1
  205. package/dist/chunks/index-B9GkDVsx.mjs +0 -187
  206. package/dist/chunks/index-B9GkDVsx.mjs.map +0 -1
  207. package/dist/chunks/index-CKPrAOr6.mjs +0 -209
  208. package/dist/chunks/index-CKPrAOr6.mjs.map +0 -1
  209. package/dist/chunks/index-CNs4QQ8l.mjs.map +0 -1
  210. package/dist/chunks/index-CflvcXSd.mjs.map +0 -1
  211. package/dist/chunks/index-CoeD4T9-.mjs.map +0 -1
  212. package/dist/chunks/index-D0s0Q8Wc.mjs.map +0 -1
  213. package/dist/chunks/index-DfzCof6H.mjs +0 -191
  214. package/dist/chunks/index-DfzCof6H.mjs.map +0 -1
  215. package/dist/chunks/index-DyIwN_67.mjs +0 -404
  216. package/dist/chunks/index-DyIwN_67.mjs.map +0 -1
  217. package/dist/chunks/index-FlTg80Pk.mjs.map +0 -1
  218. package/dist/chunks/index-pxbbDHVH.mjs.map +0 -1
@@ -1,404 +0,0 @@
1
- import { S as e, r as t } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
- import { e as n } from "./HTMLUtils-DTqQzcKR.mjs";
3
- import { c as i } from "./NodeSpec-NZVvcCuH.mjs";
4
- import { i as r, a as o, c as a, e as s } from "./Selection-DmFDwiPJ.mjs";
5
- import { f as l } from "./ToolbarItem-BpZggUGo.mjs";
6
- import { a as c, f as d, u as g } from "./Document-CuwE73FF.mjs";
7
- import { n as u } from "./TypeBrands-C09nE2qO.mjs";
8
- function m(e2, t2) {
9
- const n2 = e2.getState(), i2 = n2.selection, a2 = { src: t2.src, alt: t2.alt ?? "", align: t2.align ?? "center", ...void 0 !== t2.width ? { width: t2.width } : {}, ...void 0 !== t2.height ? { height: t2.height } : {} };
10
- if (o(i2)) return false;
11
- const l2 = r(i2) ? i2.nodeId : i2.anchor.blockId, m2 = (function(e3, t3) {
12
- const n3 = e3.getBlock(t3);
13
- if ("table_cell" === n3?.type) return t3;
14
- const i3 = e3.getNodePath(t3);
15
- if (i3) for (const t4 of i3) {
16
- const n4 = e3.getBlock(t4);
17
- if ("table_cell" === n4?.type) return t4;
18
- }
19
- })(n2, l2);
20
- return m2 ? (function(e3, t3, n3, i3) {
21
- const r2 = e3.getNodePath(n3);
22
- if (!r2) return false;
23
- const o2 = d(u("image"), [], void 0, i3), a3 = e3.getBlock(n3);
24
- if (!a3) return false;
25
- const l3 = e3.transaction("command"), m3 = g(a3);
26
- for (let e4 = m3.length - 1; e4 >= 0; e4--) {
27
- const t4 = a3.children.findIndex((t5) => c(t5) && t5.id === m3[e4]?.id);
28
- -1 !== t4 && l3.removeNode(r2, t4);
29
- }
30
- return l3.insertNode(r2, 0, o2), l3.setSelection(s(o2.id, [...r2, o2.id])), t3.dispatch(l3.build()), true;
31
- })(n2, e2, m2, a2) : (function(e3, t3, n3, i3) {
32
- const r2 = e3.doc.children.findIndex((e4) => e4.id === n3);
33
- if (-1 === r2) return false;
34
- const o2 = d(u("image"), [], void 0, i3), a3 = d(u("paragraph")), l3 = e3.transaction("command").insertNode([], r2 + 1, o2).insertNode([], r2 + 2, a3).setSelection(s(o2.id, [])).build();
35
- return t3.dispatch(l3), true;
36
- })(n2, e2, l2, a2);
37
- }
38
- function p(e2, t2, n2) {
39
- const i2 = e2.getState(), o2 = i2.selection;
40
- if (!r(o2)) return false;
41
- const a2 = i2.getBlock(o2.nodeId);
42
- if (!a2 || "image" !== a2.type) return false;
43
- const s2 = a2.attrs?.width, l2 = a2.attrs?.height;
44
- if (void 0 === s2 || void 0 === l2) return false;
45
- const c2 = l2 > 0 ? s2 / l2 : 1, d2 = Math.max(50, Math.min(n2, s2 + t2)), g2 = Math.round(d2 / c2);
46
- return (d2 !== s2 || g2 !== l2) && (function(e3, t3) {
47
- const n3 = e3.getState(), i3 = n3.selection;
48
- if (!r(i3)) return false;
49
- const o3 = n3.getBlock(i3.nodeId);
50
- if (!o3 || "image" !== o3.type) return false;
51
- const a3 = n3.getNodePath(i3.nodeId);
52
- if (!a3) return false;
53
- const s3 = { ...o3.attrs ?? {}, ...t3 }, l3 = n3.transaction("command").setNodeAttr(a3, s3).build();
54
- return e3.dispatch(l3), true;
55
- })(e2, { width: d2, height: g2 });
56
- }
57
- const h = { 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: (e2, t2, n2) => {
58
- const i2 = [e2 || "Image"];
59
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} by ${n2} pixels`), i2.join(", ");
60
- }, resetToNaturalSize: "Image reset to natural size.", uploadFailed: "Image upload failed." }, f = { en: h, 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: (e2, t2, n2) => {
61
- const i2 = [e2 || "Bild"];
62
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} mal ${n2} Pixel`), i2.join(", ");
63
- }, 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: (e2, t2, n2) => {
64
- const i2 = [e2 || "Imagen"];
65
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} por ${n2} píxeles`), i2.join(", ");
66
- }, 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: (e2, t2, n2) => {
67
- const i2 = [e2 || "Image"];
68
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} par ${n2} pixels`), i2.join(", ");
69
- }, 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: (e2, t2, n2) => {
70
- const i2 = [e2 || "图片"];
71
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} x ${n2} 像素`), i2.join(",");
72
- }, resetToNaturalSize: "图片已恢复原始大小。", uploadFailed: "图片上传失败。" }, ru: { insertImage: "Вставить изображение", insertImageTooltip: "Вставить изображение", uploadFromComputer: "Загрузить с компьютера", uploadAria: "Загрузить изображение с компьютера", separator: "или", urlPlaceholder: "https://...", urlAria: "URL изображения", insertButton: "Вставить", insertAria: "Вставить изображение", imageAria: (e2, t2, n2) => {
73
- const i2 = [e2 || "Изображение"];
74
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} на ${n2} пикселей`), i2.join(", ");
75
- }, resetToNaturalSize: "Изображение сброшено до исходного размера.", uploadFailed: "Ошибка загрузки изображения." }, ar: { insertImage: "إدراج صورة", insertImageTooltip: "إدراج صورة", uploadFromComputer: "رفع من الحاسوب", uploadAria: "رفع صورة من الحاسوب", separator: "أو", urlPlaceholder: "https://...", urlAria: "رابط الصورة", insertButton: "إدراج", insertAria: "إدراج صورة", imageAria: (e2, t2, n2) => {
76
- const i2 = [e2 || "صورة"];
77
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} × ${n2} بكسل`), i2.join("، ");
78
- }, resetToNaturalSize: "تمت إعادة الصورة إلى حجمها الطبيعي.", uploadFailed: "فشل رفع الصورة." }, hi: { insertImage: "चित्र डालें", insertImageTooltip: "चित्र डालें", uploadFromComputer: "कंप्यूटर से अपलोड करें", uploadAria: "कंप्यूटर से चित्र अपलोड करें", separator: "या", urlPlaceholder: "https://...", urlAria: "चित्र URL", insertButton: "डालें", insertAria: "चित्र डालें", imageAria: (e2, t2, n2) => {
79
- const i2 = [e2 || "चित्र"];
80
- return void 0 !== t2 && void 0 !== n2 && i2.push(`${t2} x ${n2} पिक्सेल`), i2.join(", ");
81
- }, resetToNaturalSize: "चित्र मूल आकार में पुनर्स्थापित।", uploadFailed: "चित्र अपलोड विफल।" } }, b = { left: "notectl-image--left", center: "notectl-image--center", right: "notectl-image--right" }, v = { nw: "nwse-resize", ne: "nesw-resize", sw: "nesw-resize", se: "nwse-resize" }, x = { nw: -1, ne: 1, sw: -1, se: 1 }, y = { nw: "Resize top-left", ne: "Resize top-right", sw: "Resize bottom-left", se: "Resize bottom-right" };
82
- let I = null;
83
- function z() {
84
- I && (I.remove(), I = null);
85
- }
86
- function w(e2, t2, n2) {
87
- return (i2, r2, o2) => {
88
- const a2 = document.createElement("figure");
89
- a2.className = "notectl-image", a2.setAttribute("data-block-id", i2.id), a2.setAttribute("data-void", "true"), a2.setAttribute("data-selectable", "true");
90
- const s2 = document.createElement("div");
91
- s2.className = "notectl-image__container";
92
- const c2 = document.createElement("img");
93
- c2.className = "notectl-image__img", c2.draggable = false;
94
- const d2 = document.createElement("div");
95
- d2.className = "notectl-image__overlay", s2.appendChild(c2), s2.appendChild(d2), a2.appendChild(s2);
96
- let g2 = i2.id, u2 = null;
97
- function m2(e3) {
98
- const n3 = e3.attrs?.src ?? "", i3 = e3.attrs?.alt ?? "", r3 = e3.attrs?.width, o3 = e3.attrs?.height, s3 = e3.attrs?.align ?? "center";
99
- 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` : "";
100
- for (const e4 of Object.values(b)) a2.classList.remove(e4);
101
- const l2 = b[s3];
102
- l2 && a2.classList.add(l2);
103
- const g3 = t2.get(e3.id) ?? "idle", u3 = "uploading" === g3;
104
- 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(e4) {
105
- const t3 = e4.attrs?.alt ?? "", n4 = e4.attrs?.width, i4 = e4.attrs?.height, r4 = [];
106
- t3 ? r4.push(t3) : r4.push("Image"), void 0 !== n4 && void 0 !== i4 && r4.push(`${n4} by ${i4} pixels`), a2.setAttribute("aria-label", r4.join(", "));
107
- })(e3);
108
- }
109
- m2(i2);
110
- let p2 = false;
111
- function h2(t3, n3, i3, s3) {
112
- let l2 = 0, d3 = 0, g3 = 1;
113
- const u3 = (t4) => {
114
- const i4 = t4.clientX - l2, r3 = (o3 = d3 + i4 * x[n3], Math.max(50, Math.min(e2.maxWidth, o3)));
115
- var o3;
116
- const a3 = Math.round(r3 / g3);
117
- c2.style.width = `${r3}px`, c2.style.height = `${a3}px`, s3.textContent = `${Math.round(r3)} × ${a3}`;
118
- }, m3 = (e3) => {
119
- document.removeEventListener("pointermove", u3), document.removeEventListener("pointerup", m3), a2.classList.remove("notectl-image--resizing"), s3.classList.remove("notectl-image__size-indicator--visible"), z();
120
- const t4 = Math.round(c2.getBoundingClientRect().width), n4 = Math.round(t4 / g3);
121
- !(function(e4, t5, n5) {
122
- const i4 = r2(), a3 = i4.getBlock(e4);
123
- if (!a3) return;
124
- const s4 = a3.attrs?.width, l3 = a3.attrs?.height;
125
- if (s4 === t5 && l3 === n5) return;
126
- const c3 = i4.getNodePath(e4);
127
- if (!c3) return;
128
- const d4 = { ...a3.attrs ?? {}, width: t5, height: n5 }, g4 = i4.transaction("command").setNodeAttr(c3, d4).build();
129
- o2(g4);
130
- })(i3, t4, n4), e3.target?.releasePointerCapture?.(e3.pointerId);
131
- };
132
- t3.addEventListener("pointerdown", (e3) => {
133
- e3.preventDefault(), e3.stopPropagation(), l2 = e3.clientX, d3 = c2.getBoundingClientRect().width;
134
- const t4 = c2.getBoundingClientRect().height;
135
- var i4;
136
- g3 = t4 > 0 ? d3 / t4 : 1, a2.classList.add("notectl-image--resizing"), s3.textContent = `${Math.round(d3)} × ${Math.round(t4)}`, s3.classList.add("notectl-image__size-indicator--visible"), i4 = v[n3], z(), I = document.createElement("style"), I.textContent = `*{cursor:${i4}!important;user-select:none!important}`, document.head.appendChild(I), e3.target.setPointerCapture(e3.pointerId), document.addEventListener("pointermove", u3), document.addEventListener("pointerup", m3);
137
- });
138
- }
139
- function f2() {
140
- z(), u2 && (u2.remove(), u2 = null);
141
- }
142
- return c2.addEventListener("load", () => {
143
- if (p2) return;
144
- const t3 = r2(), n3 = t3.getBlock(g2);
145
- if (!n3 || "image" !== n3.type) return;
146
- const i3 = void 0 !== n3.attrs?.width, a3 = void 0 !== n3.attrs?.height;
147
- if (i3 && a3) return void (p2 = true);
148
- const s3 = c2.naturalWidth, l2 = c2.naturalHeight;
149
- if (0 === s3 || 0 === l2) return;
150
- const d3 = Math.min(s3, e2.maxWidth), u3 = s3 > 0 ? l2 / s3 : 1, m3 = Math.round(d3 * u3), h3 = t3.getNodePath(g2);
151
- if (!h3) return;
152
- const f3 = { ...n3.attrs ?? {}, width: d3, height: m3 }, b2 = t3.transaction("command").setNodeAttr(h3, f3).build();
153
- o2(b2), p2 = true;
154
- }), { dom: a2, contentDOM: null, update: (e3) => "image" === e3.type && (g2 = e3.id, a2.setAttribute("data-block-id", e3.id), m2(e3), true), selectNode() {
155
- a2.classList.add("notectl-image--selected"), (function(t3) {
156
- if (!e2.resizable || u2) return;
157
- u2 = document.createElement("div"), u2.className = "notectl-image__resize-overlay", u2.setAttribute("data-notectl-no-print", "");
158
- const i3 = document.createElement("div");
159
- i3.className = "notectl-image__size-indicator", u2.appendChild(i3);
160
- const r3 = ["nw", "ne", "sw", "se"];
161
- for (const e3 of r3) {
162
- const n3 = document.createElement("div");
163
- n3.className = `notectl-image__resize-handle notectl-image__resize-handle--${e3}`, n3.setAttribute("role", "separator"), n3.setAttribute("aria-label", y[e3]), h2(n3, e3, t3, i3), u2.appendChild(n3);
164
- }
165
- if (n2) {
166
- const e3 = (function(e4) {
167
- const t4 = e4.shrinkWidth ?? null, n3 = e4.growWidth ?? null;
168
- return t4 && n3 ? `${l(t4)} / ${l(n3)} to resize` : "";
169
- })(n2);
170
- if (e3) {
171
- const t4 = document.createElement("div");
172
- t4.className = "notectl-image__keyboard-hint", t4.setAttribute("aria-hidden", "true"), t4.textContent = e3, u2.appendChild(t4);
173
- }
174
- }
175
- s2.appendChild(u2);
176
- })(g2);
177
- }, deselectNode() {
178
- a2.classList.remove("notectl-image--selected"), f2();
179
- }, destroy() {
180
- f2();
181
- } };
182
- };
183
- }
184
- const A = new e("image:upload"), _ = { growWidth: "Mod-Shift-ArrowRight", shrinkWidth: "Mod-Shift-ArrowLeft", growWidthLarge: "Mod-Shift-Alt-ArrowRight", shrinkWidthLarge: "Mod-Shift-Alt-ArrowLeft", resetSize: "Mod-Shift-0" }, S = { maxWidth: 800, maxFileSize: 10485760, acceptedTypes: ["image/png", "image/jpeg", "image/gif", "image/webp", "image/svg+xml"], resizable: true, resizeStep: 10, resizeStepLarge: 50 };
185
- class k {
186
- id = "image";
187
- name = "Image";
188
- priority = 45;
189
- config;
190
- resolvedKeymap;
191
- uploadStates = /* @__PURE__ */ new Map();
192
- blobUrls = /* @__PURE__ */ new Set();
193
- context = null;
194
- locale;
195
- constructor(e2) {
196
- this.config = { ...S, ...e2 }, this.resolvedKeymap = { ..._, ...e2?.keymap };
197
- }
198
- init(e2) {
199
- this.locale = t(f, e2, this.config.locale), e2.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 = e2, this.registerNodeSpec(e2), this.registerNodeView(e2), (function(e3) {
200
- e3.registerCommand("insertImage", () => m(e3, { src: "" })), e3.registerCommand("removeImage", () => (function(e4) {
201
- const t2 = e4.getState(), n2 = t2.selection;
202
- if (!r(n2)) return false;
203
- const i2 = t2.getBlock(n2.nodeId);
204
- if (!i2 || "image" !== i2.type) return false;
205
- const o2 = t2.getNodePath(n2.nodeId);
206
- if (!o2 || 0 === o2.length) return false;
207
- const s2 = o2.slice(0, -1);
208
- let l2;
209
- if (0 === s2.length) l2 = t2.doc;
210
- else {
211
- const e5 = s2[s2.length - 1];
212
- l2 = e5 ? t2.getBlock(e5) : void 0;
213
- }
214
- if (!l2) return false;
215
- const d2 = l2.children.findIndex((e5) => c(e5) && e5.id === n2.nodeId);
216
- if (-1 === d2) return false;
217
- const g2 = (function(e5, t3, n3) {
218
- if (0 === t3.length) {
219
- const t4 = e5.doc.children, i3 = t4.findIndex((e6) => e6.id === n3), r2 = t4[i3 + 1] ?? t4[i3 - 1];
220
- return r2?.id;
221
- }
222
- return t3[t3.length - 1];
223
- })(t2, s2, n2.nodeId);
224
- if (!g2) return false;
225
- const u2 = t2.transaction("command").removeNode(s2, d2).setSelection(a(g2, 0)).build();
226
- return e4.dispatch(u2), true;
227
- })(e3));
228
- })(e2), this.registerResizeCommands(e2), this.registerResizeKeymaps(e2), this.registerFileHandler(e2), this.registerToolbarItem(e2);
229
- }
230
- destroy() {
231
- for (const e2 of this.blobUrls) URL.revokeObjectURL(e2);
232
- this.blobUrls.clear(), this.uploadStates.clear(), this.context = null;
233
- }
234
- onStateChange(e2, t2, n2) {
235
- if (!this.context) return;
236
- for (const e3 of this.uploadStates.keys()) t2.getBlock(e3) || this.uploadStates.delete(e3);
237
- const i2 = this.isImageSelected(e2), r2 = this.isImageSelected(t2);
238
- !i2 && r2 && this.announceImageSelection(t2);
239
- }
240
- registerNodeSpec(e2) {
241
- const t2 = this.locale;
242
- e2.registerNodeSpec({ type: "image", group: "block", isVoid: true, selectable: true, attrs: { src: { default: "" }, alt: { default: "" }, align: { default: "center" } }, toDOM(e3) {
243
- const n2 = i("figure", e3.id);
244
- n2.className = "notectl-image", n2.setAttribute("data-void", "true"), n2.setAttribute("data-selectable", "true");
245
- const r2 = document.createElement("div");
246
- r2.className = "notectl-image__container";
247
- const o2 = e3.attrs?.alt ?? "", a2 = e3.attrs?.width, s2 = e3.attrs?.height, l2 = document.createElement("img");
248
- l2.className = "notectl-image__img", l2.src = e3.attrs?.src ?? "", l2.alt = o2, l2.draggable = false, void 0 !== a2 && (l2.style.width = `${a2}px`), void 0 !== s2 && (l2.style.height = `${s2}px`);
249
- const c2 = { left: "notectl-image--left", center: "notectl-image--center", right: "notectl-image--right" }[e3.attrs?.align ?? "center"];
250
- return c2 && n2.classList.add(c2), n2.setAttribute("aria-label", t2.imageAria(o2, a2, s2)), r2.appendChild(l2), n2.appendChild(r2), n2;
251
- }, toHTML(e3) {
252
- const t3 = n(e3.attrs?.src ?? ""), i2 = n(e3.attrs?.alt ?? ""), r2 = e3.attrs?.width, o2 = e3.attrs?.height, a2 = e3.attrs?.align ?? "center", s2 = (void 0 !== r2 ? ` width="${r2}"` : "") + (void 0 !== o2 ? ` height="${o2}"` : "");
253
- return `<figure class="notectl-image notectl-image--${n(a2)}"><img src="${t3}" alt="${i2}"${s2}></figure>`;
254
- }, parseHTML: [{ tag: "figure", getAttrs(e3) {
255
- const t3 = e3.querySelector("img");
256
- if (!t3) return false;
257
- const n2 = { src: t3.getAttribute("src") ?? "", alt: t3.getAttribute("alt") ?? "", align: "center" }, i2 = t3.getAttribute("width"), r2 = t3.getAttribute("height");
258
- return i2 && (n2.width = Number.parseInt(i2, 10)), r2 && (n2.height = Number.parseInt(r2, 10)), e3.classList.contains("notectl-image--left") && (n2.align = "left"), e3.classList.contains("notectl-image--right") && (n2.align = "right"), n2;
259
- } }, { tag: "img", getAttrs(e3) {
260
- const t3 = { src: e3.getAttribute("src") ?? "", alt: e3.getAttribute("alt") ?? "", align: "center" }, n2 = e3.getAttribute("width"), i2 = e3.getAttribute("height");
261
- return n2 && (t3.width = Number.parseInt(n2, 10)), i2 && (t3.height = Number.parseInt(i2, 10)), t3;
262
- } }], sanitize: { tags: ["figure", "img"], attrs: ["src", "alt", "width", "height", "class"] } });
263
- }
264
- registerNodeView(e2) {
265
- e2.registerNodeView("image", w(this.config, this.uploadStates, this.resolvedKeymap));
266
- }
267
- registerResizeCommands(e2) {
268
- const t2 = this.config.resizeStep ?? 10, n2 = this.config.resizeStepLarge ?? 50, i2 = this.config.maxWidth;
269
- e2.registerCommand("resizeImageGrow", () => {
270
- const n3 = p(e2, t2, i2);
271
- return n3 && this.announceCurrentSize(e2), n3;
272
- }), e2.registerCommand("resizeImageShrink", () => {
273
- const n3 = p(e2, -t2, i2);
274
- return n3 && this.announceCurrentSize(e2), n3;
275
- }), e2.registerCommand("resizeImageGrowLarge", () => {
276
- const t3 = p(e2, n2, i2);
277
- return t3 && this.announceCurrentSize(e2), t3;
278
- }), e2.registerCommand("resizeImageShrinkLarge", () => {
279
- const t3 = p(e2, -n2, i2);
280
- return t3 && this.announceCurrentSize(e2), t3;
281
- }), e2.registerCommand("resetImageSize", () => {
282
- const t3 = (function(e3) {
283
- const t4 = e3.getState(), n3 = t4.selection;
284
- if (!r(n3)) return false;
285
- const i3 = t4.getBlock(n3.nodeId);
286
- if (!i3 || "image" !== i3.type) return false;
287
- const o2 = t4.getNodePath(n3.nodeId);
288
- if (!o2) return false;
289
- const a2 = { ...i3.attrs ?? {} }, s2 = Object.fromEntries(Object.entries(a2).filter(([e4]) => "width" !== e4 && "height" !== e4)), l2 = t4.transaction("command").setNodeAttr(o2, s2).build();
290
- return e3.dispatch(l2), true;
291
- })(e2);
292
- return t3 && e2.announce(this.locale.resetToNaturalSize), t3;
293
- });
294
- }
295
- registerResizeKeymaps(e2) {
296
- const t2 = {}, n2 = { growWidth: "resizeImageGrow", shrinkWidth: "resizeImageShrink", growWidthLarge: "resizeImageGrowLarge", shrinkWidthLarge: "resizeImageShrinkLarge", resetSize: "resetImageSize" };
297
- for (const [i2, r2] of Object.entries(n2)) {
298
- const n3 = this.resolvedKeymap[i2] ?? null;
299
- n3 && (t2[n3] = () => e2.executeCommand(r2));
300
- }
301
- Object.keys(t2).length > 0 && e2.registerKeymap(t2);
302
- }
303
- registerFileHandler(e2) {
304
- e2.registerFileHandler("image/*", async (t2, n2) => !!this.isAcceptedType(t2.type) && (this.handleFileInsert(e2, t2), true));
305
- }
306
- handleFileInsert(e2, t2) {
307
- if (t2.size > this.config.maxFileSize) return;
308
- const n2 = URL.createObjectURL(t2);
309
- if (this.blobUrls.add(n2), !m(e2, { src: n2 })) return URL.revokeObjectURL(n2), void this.blobUrls.delete(n2);
310
- const i2 = e2.getState().selection;
311
- if (!r(i2)) return;
312
- const o2 = i2.nodeId;
313
- this.uploadStates.set(o2, "uploading"), e2.getService(A) ? this.uploadFile(e2, t2, o2, n2) : this.uploadStates.set(o2, "complete");
314
- }
315
- async uploadFile(e2, t2, n2, i2) {
316
- const r2 = e2.getService(A);
317
- if (r2) try {
318
- const o2 = await r2.upload(t2);
319
- this.uploadStates.set(n2, "complete");
320
- const a2 = e2.getState(), s2 = a2.getBlock(n2);
321
- if (!s2) return;
322
- const l2 = a2.getNodePath(n2);
323
- if (!l2) return;
324
- 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();
325
- e2.dispatch(d2), URL.revokeObjectURL(i2), this.blobUrls.delete(i2);
326
- } catch {
327
- this.uploadStates.set(n2, "error"), e2.announce(this.locale.uploadFailed);
328
- }
329
- }
330
- registerToolbarItem(e2) {
331
- e2.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: (e3, t2, n2) => {
332
- this.renderImagePopup(e3, t2, n2);
333
- } });
334
- }
335
- renderImagePopup(e2, t2, n2) {
336
- e2.style.padding = "8px", e2.style.minWidth = "240px";
337
- const i2 = document.createElement("input");
338
- i2.type = "file", i2.accept = this.config.acceptedTypes.join(","), i2.style.cssText = "position:absolute;width:0;height:0;overflow:hidden;opacity:0;";
339
- const r2 = document.createElement("button");
340
- 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", (e3) => {
341
- e3.preventDefault(), e3.stopPropagation(), i2.click();
342
- }), i2.addEventListener("change", () => {
343
- const e3 = i2.files?.[0];
344
- e3 && (this.handleFileInsert(t2, e3), n2(), t2.getContainer().focus());
345
- }), e2.appendChild(i2), e2.appendChild(r2);
346
- const o2 = document.createElement("div");
347
- o2.style.cssText = "display:flex;align-items:center;margin:8px 0;color:var(--notectl-fg-muted);font-size:12px;";
348
- const a2 = document.createElement("span");
349
- a2.style.cssText = "flex:1;height:1px;background:var(--notectl-border);";
350
- const s2 = document.createElement("span");
351
- s2.textContent = this.locale.separator, s2.style.cssText = "padding:0 8px;";
352
- const l2 = document.createElement("span");
353
- l2.style.cssText = "flex:1;height:1px;background:var(--notectl-border);", o2.appendChild(a2), o2.appendChild(s2), o2.appendChild(l2), e2.appendChild(o2);
354
- const c2 = document.createElement("input");
355
- 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);";
356
- const d2 = document.createElement("button");
357
- 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);";
358
- const g2 = () => {
359
- const e3 = c2.value.trim();
360
- e3 && (m(t2, { src: e3 }), n2(), t2.getContainer().focus());
361
- };
362
- d2.addEventListener("mousedown", (e3) => {
363
- e3.preventDefault(), e3.stopPropagation(), g2();
364
- }), c2.addEventListener("keydown", (e3) => {
365
- "Enter" === e3.key && (e3.preventDefault(), g2());
366
- }), e2.appendChild(c2), e2.appendChild(d2), requestAnimationFrame(() => c2.focus());
367
- }
368
- isAcceptedType(e2) {
369
- return this.config.acceptedTypes.some((t2) => t2 === e2 || t2.endsWith("/*") && e2.startsWith(t2.slice(0, -1)));
370
- }
371
- isImageSelected(e2) {
372
- const t2 = e2.selection;
373
- if (!r(t2)) return false;
374
- const n2 = e2.getBlock(t2.nodeId);
375
- return "image" === n2?.type;
376
- }
377
- announceImageSelection(e2) {
378
- if (!this.context) return;
379
- const t2 = e2.selection;
380
- if (!r(t2)) return;
381
- const n2 = e2.getBlock(t2.nodeId);
382
- if (!n2 || "image" !== n2.type) return;
383
- const i2 = n2.attrs?.alt ?? "", o2 = n2.attrs?.width, a2 = n2.attrs?.height, s2 = ["Image selected."];
384
- i2 && s2.push(`Alt text: ${i2}.`), void 0 !== o2 && void 0 !== a2 && s2.push(`Size: ${o2} by ${a2} pixels.`);
385
- const c2 = this.resolvedKeymap.shrinkWidth ?? null, d2 = this.resolvedKeymap.growWidth ?? null;
386
- c2 && d2 && s2.push(`${l(c2)} / ${l(d2)} to resize.`), this.context.announce(s2.join(" "));
387
- }
388
- announceCurrentSize(e2) {
389
- const t2 = e2.getState(), n2 = t2.selection;
390
- if (!r(n2)) return;
391
- const i2 = t2.getBlock(n2.nodeId);
392
- if (!i2 || "image" !== i2.type) return;
393
- const o2 = i2.attrs?.width, a2 = i2.attrs?.height;
394
- void 0 !== o2 && void 0 !== a2 && e2.announce(`Image resized to ${o2} by ${a2} pixels.`);
395
- }
396
- }
397
- export {
398
- _ as D,
399
- k as I,
400
- f as a,
401
- h as b,
402
- A as c
403
- };
404
- //# sourceMappingURL=index-DyIwN_67.mjs.map