@pinkpixel/marzipan 1.1.0 → 1.1.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 (130) hide show
  1. package/README.md +72 -37
  2. package/dist/_basePickBy-D4kyG5Tu.js +152 -0
  3. package/dist/_basePickBy-D4kyG5Tu.js.map +1 -0
  4. package/dist/_baseUniq-s5uZhHMt.js +615 -0
  5. package/dist/_baseUniq-s5uZhHMt.js.map +1 -0
  6. package/dist/arc-Cd2Fw3V6.js +84 -0
  7. package/dist/arc-Cd2Fw3V6.js.map +1 -0
  8. package/dist/architectureDiagram-VXUJARFQ-ylT61Lln.js +4663 -0
  9. package/dist/architectureDiagram-VXUJARFQ-ylT61Lln.js.map +1 -0
  10. package/dist/blockDiagram-VD42YOAC-CoIxLSyQ.js +2257 -0
  11. package/dist/blockDiagram-VD42YOAC-CoIxLSyQ.js.map +1 -0
  12. package/dist/c4Diagram-YG6GDRKO-CsQimMM6.js +1581 -0
  13. package/dist/c4Diagram-YG6GDRKO-CsQimMM6.js.map +1 -0
  14. package/dist/channel-0tZUlnqz.js +6 -0
  15. package/dist/channel-0tZUlnqz.js.map +1 -0
  16. package/dist/chunk-4BX2VUAB-DVkBhLxy.js +9 -0
  17. package/dist/chunk-4BX2VUAB-DVkBhLxy.js.map +1 -0
  18. package/dist/chunk-55IACEB6-CVQcegI-.js +9 -0
  19. package/dist/chunk-55IACEB6-CVQcegI-.js.map +1 -0
  20. package/dist/chunk-B4BG7PRW-DPUTNckV.js +1376 -0
  21. package/dist/chunk-B4BG7PRW-DPUTNckV.js.map +1 -0
  22. package/dist/chunk-DI55MBZ5-F7DI2N9R.js +1371 -0
  23. package/dist/chunk-DI55MBZ5-F7DI2N9R.js.map +1 -0
  24. package/dist/chunk-FMBD7UC4-C3wNpU7V.js +20 -0
  25. package/dist/chunk-FMBD7UC4-C3wNpU7V.js.map +1 -0
  26. package/dist/chunk-QN33PNHL-BOdqrixJ.js +20 -0
  27. package/dist/chunk-QN33PNHL-BOdqrixJ.js.map +1 -0
  28. package/dist/chunk-QZHKN3VN-BFPNdgmW.js +16 -0
  29. package/dist/chunk-QZHKN3VN-BFPNdgmW.js.map +1 -0
  30. package/dist/chunk-TZMSLE5B-BZuxNW58.js +65 -0
  31. package/dist/chunk-TZMSLE5B-BZuxNW58.js.map +1 -0
  32. package/dist/classDiagram-2ON5EDUG-CiRjpBEe.js +17 -0
  33. package/dist/classDiagram-2ON5EDUG-CiRjpBEe.js.map +1 -0
  34. package/dist/classDiagram-v2-WZHVMYZB-CiRjpBEe.js +17 -0
  35. package/dist/classDiagram-v2-WZHVMYZB-CiRjpBEe.js.map +1 -0
  36. package/dist/clone-Bm_onhkP.js +9 -0
  37. package/dist/clone-Bm_onhkP.js.map +1 -0
  38. package/dist/cose-bilkent-S5V4N54A-D9xMKgKB.js +2609 -0
  39. package/dist/cose-bilkent-S5V4N54A-D9xMKgKB.js.map +1 -0
  40. package/dist/dagre-6UL2VRFP-BhIQJjaK.js +445 -0
  41. package/dist/dagre-6UL2VRFP-BhIQJjaK.js.map +1 -0
  42. package/dist/diagram-PSM6KHXK-h4YEzD1S.js +532 -0
  43. package/dist/diagram-PSM6KHXK-h4YEzD1S.js.map +1 -0
  44. package/dist/diagram-QEK2KX5R-spuV0akZ.js +218 -0
  45. package/dist/diagram-QEK2KX5R-spuV0akZ.js.map +1 -0
  46. package/dist/diagram-S2PKOQOG-CQx-wsyw.js +143 -0
  47. package/dist/diagram-S2PKOQOG-CQx-wsyw.js.map +1 -0
  48. package/dist/erDiagram-Q2GNP2WA-Cqkjjf2a.js +842 -0
  49. package/dist/erDiagram-Q2GNP2WA-Cqkjjf2a.js.map +1 -0
  50. package/dist/flowDiagram-NV44I4VS-mCXE9u9b.js +1621 -0
  51. package/dist/flowDiagram-NV44I4VS-mCXE9u9b.js.map +1 -0
  52. package/dist/ganttDiagram-JELNMOA3-Bz1GBIHE.js +2671 -0
  53. package/dist/ganttDiagram-JELNMOA3-Bz1GBIHE.js.map +1 -0
  54. package/dist/gitGraphDiagram-V2S2FVAM-Be01Oq15.js +700 -0
  55. package/dist/gitGraphDiagram-V2S2FVAM-Be01Oq15.js.map +1 -0
  56. package/dist/graph-DVWVTM7e.js +248 -0
  57. package/dist/graph-DVWVTM7e.js.map +1 -0
  58. package/dist/index-kKw24iiA.js +34 -0
  59. package/dist/index-kKw24iiA.js.map +1 -0
  60. package/dist/index.d.ts +0 -11
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +270 -277
  63. package/dist/index.js.map +1 -1
  64. package/dist/infoDiagram-HS3SLOUP-joTtnw9j.js +25 -0
  65. package/dist/infoDiagram-HS3SLOUP-joTtnw9j.js.map +1 -0
  66. package/dist/journeyDiagram-XKPGCS4Q-CMVu7VEd.js +835 -0
  67. package/dist/journeyDiagram-XKPGCS4Q-CMVu7VEd.js.map +1 -0
  68. package/dist/kanban-definition-3W4ZIXB7-CfanK5Eg.js +720 -0
  69. package/dist/kanban-definition-3W4ZIXB7-CfanK5Eg.js.map +1 -0
  70. package/dist/katex-Cj93GM5Y.js +11605 -0
  71. package/dist/katex-Cj93GM5Y.js.map +1 -0
  72. package/dist/layout-BC8VSiQq.js +1336 -0
  73. package/dist/layout-BC8VSiQq.js.map +1 -0
  74. package/dist/linear-GV5CIa17.js +260 -0
  75. package/dist/linear-GV5CIa17.js.map +1 -0
  76. package/dist/marzipan.d.ts +1 -2
  77. package/dist/marzipan.d.ts.map +1 -1
  78. package/dist/marzipan.js +1 -19
  79. package/dist/marzipan.js.map +1 -1
  80. package/dist/mermaid.core-cSWK5aGH.js +15302 -0
  81. package/dist/mermaid.core-cSWK5aGH.js.map +1 -0
  82. package/dist/mindmap-definition-VGOIOE7T-Vu_RTZar.js +785 -0
  83. package/dist/mindmap-definition-VGOIOE7T-Vu_RTZar.js.map +1 -0
  84. package/dist/parser.d.ts.map +1 -1
  85. package/dist/parser.js +6 -5
  86. package/dist/parser.js.map +1 -1
  87. package/dist/pieDiagram-ADFJNKIX-BUcd1l-6.js +162 -0
  88. package/dist/pieDiagram-ADFJNKIX-BUcd1l-6.js.map +1 -0
  89. package/dist/plugins/accentSwatchPlugin.d.ts +1 -1
  90. package/dist/plugins/accentSwatchPlugin.d.ts.map +1 -1
  91. package/dist/plugins/accentSwatchPlugin.js +162 -81
  92. package/dist/plugins/accentSwatchPlugin.js.map +1 -1
  93. package/dist/plugins/block-handles.d.ts +10 -2
  94. package/dist/plugins/block-handles.d.ts.map +1 -1
  95. package/dist/plugins/block-handles.js +77 -51
  96. package/dist/plugins/block-handles.js.map +1 -1
  97. package/dist/plugins/index.d.ts +0 -2
  98. package/dist/plugins/index.d.ts.map +1 -1
  99. package/dist/plugins/index.js +27 -29
  100. package/dist/plugins/index.js.map +1 -1
  101. package/dist/plugins/mermaidPlugin.js +1 -1
  102. package/dist/plugins/tinyHighlight.d.ts.map +1 -1
  103. package/dist/plugins/tinyHighlight.js +34 -22
  104. package/dist/plugins/tinyHighlight.js.map +1 -1
  105. package/dist/quadrantDiagram-AYHSOK5B-B1ekOH99.js +1023 -0
  106. package/dist/quadrantDiagram-AYHSOK5B-B1ekOH99.js.map +1 -0
  107. package/dist/requirementDiagram-UZGBJVZJ-BNcVcwNf.js +851 -0
  108. package/dist/requirementDiagram-UZGBJVZJ-BNcVcwNf.js.map +1 -0
  109. package/dist/sankeyDiagram-TZEHDZUN-BpHcdj5K.js +811 -0
  110. package/dist/sankeyDiagram-TZEHDZUN-BpHcdj5K.js.map +1 -0
  111. package/dist/sequenceDiagram-WL72ISMW-D5UyNvsv.js +2512 -0
  112. package/dist/sequenceDiagram-WL72ISMW-D5UyNvsv.js.map +1 -0
  113. package/dist/stateDiagram-FKZM4ZOC-C8DBscXu.js +264 -0
  114. package/dist/stateDiagram-FKZM4ZOC-C8DBscXu.js.map +1 -0
  115. package/dist/stateDiagram-v2-4FDKWEC3-CHqwUDPY.js +17 -0
  116. package/dist/stateDiagram-v2-4FDKWEC3-CHqwUDPY.js.map +1 -0
  117. package/dist/timeline-definition-IT6M3QCI-Dtg0oJbr.js +796 -0
  118. package/dist/timeline-definition-IT6M3QCI-Dtg0oJbr.js.map +1 -0
  119. package/dist/treemap-GDKQZRPO-rbQo3Em-.js +17926 -0
  120. package/dist/treemap-GDKQZRPO-rbQo3Em-.js.map +1 -0
  121. package/dist/xychartDiagram-PRI3JC2R-uNpgYSnV.js +1341 -0
  122. package/dist/xychartDiagram-PRI3JC2R-uNpgYSnV.js.map +1 -0
  123. package/docs/.vitepress/config.ts +1 -1
  124. package/docs/README.md +6 -8
  125. package/docs/TABLE_OF_CONTENTS.md +4 -1
  126. package/docs/api.md +262 -202
  127. package/docs/index.md +22 -19
  128. package/docs/plugins.md +27 -23
  129. package/package.json +1 -1
  130. package/docs/block-handles.md +0 -325
@@ -1,4 +1,4 @@
1
- class r {
1
+ class h {
2
2
  constructor(e, t, n = {}) {
3
3
  this.editor = e, this.preview = t, this.config = {
4
4
  enabled: n.enabled ?? !0,
@@ -10,7 +10,7 @@ class r {
10
10
  selected: n.colors?.selected ?? "rgba(59, 130, 246, 0.2)",
11
11
  handle: n.colors?.handle ?? "rgba(59, 130, 246, 0.8)"
12
12
  }
13
- }, this.blocks = /* @__PURE__ */ new Map(), this.selectedBlockId = null, this.handleContainer = null, this._boundMouseMove = this.handleMouseMove.bind(this), this._boundMouseLeave = this.handleMouseLeave.bind(this), this._boundClick = this.handleClick.bind(this), this._boundKeyDown = this.handleKeyDown.bind(this), this.initialize();
13
+ }, this.blocks = /* @__PURE__ */ new Map(), this.selectedBlockId = null, this.activeBlockId = null, this.handleContainer = null, this._boundMouseMove = this.handleMouseMove.bind(this), this._boundMouseLeave = this.handleMouseLeave.bind(this), this._boundClick = this.handleClick.bind(this), this._boundKeyDown = this.handleKeyDown.bind(this), this._boundCursorUpdate = this.updateActiveBlock.bind(this), this.initialize();
14
14
  }
15
15
  /**
16
16
  * Initialize the plugin
@@ -42,7 +42,7 @@ class r {
42
42
  * since in preview mode the textarea is display:none and the preview has pointer-events:auto.
43
43
  */
44
44
  setupEventListeners() {
45
- this.editor.addEventListener("mousemove", this._boundMouseMove), this.editor.addEventListener("mouseleave", this._boundMouseLeave), this.editor.addEventListener("click", this._boundClick), this.preview.addEventListener("mousemove", this._boundMouseMove), this.preview.addEventListener("mouseleave", this._boundMouseLeave), this.preview.addEventListener("click", this._boundClick), document.addEventListener("keydown", this._boundKeyDown);
45
+ this.editor.addEventListener("mousemove", this._boundMouseMove), this.editor.addEventListener("mouseleave", this._boundMouseLeave), this.editor.addEventListener("click", this._boundClick), this.preview.addEventListener("mousemove", this._boundMouseMove), this.preview.addEventListener("mouseleave", this._boundMouseLeave), this.preview.addEventListener("click", this._boundClick), document.addEventListener("keydown", this._boundKeyDown), this.editor.addEventListener("input", this._boundCursorUpdate), this.editor.addEventListener("mouseup", this._boundCursorUpdate), this.editor.addEventListener("keyup", this._boundCursorUpdate);
46
46
  }
47
47
  /**
48
48
  * Scan the preview for blocks and create handles
@@ -50,18 +50,18 @@ class r {
50
50
  scanBlocks() {
51
51
  if (this.blocks.clear(), !this.handleContainer) return;
52
52
  this.handleContainer.innerHTML = "", this.preview.querySelectorAll("[data-block-id]").forEach((t) => {
53
- const n = t, i = n.getAttribute("data-block-id"), s = n.getAttribute("data-block-type"), c = parseInt(n.getAttribute("data-line-start") || "0", 10), l = parseInt(n.getAttribute("data-line-end") || "0", 10);
54
- if (!i) return;
55
- const a = this.createHandle(i, s || "paragraph");
56
- this.blocks.set(i, {
57
- id: i,
58
- type: s || "paragraph",
59
- lineStart: c,
60
- lineEnd: l,
53
+ const n = t, s = n.getAttribute("data-block-id"), i = n.getAttribute("data-block-type"), l = parseInt(n.getAttribute("data-line-start") || "0", 10), c = parseInt(n.getAttribute("data-line-end") || "0", 10);
54
+ if (!s) return;
55
+ const d = this.createHandle(s, i || "paragraph");
56
+ this.blocks.set(s, {
57
+ id: s,
58
+ type: i || "paragraph",
59
+ lineStart: l,
60
+ lineEnd: c,
61
61
  element: n,
62
- handleElement: a
62
+ handleElement: d
63
63
  });
64
- });
64
+ }), this.updateAllHandlePositions();
65
65
  }
66
66
  /**
67
67
  * Create a handle element for a block
@@ -85,11 +85,14 @@ class r {
85
85
  color: white;
86
86
  font-size: 12px;
87
87
  user-select: none;
88
- `, n.innerHTML = this.getHandleIcon(t), n.addEventListener("click", (i) => {
89
- i.stopPropagation(), this.selectBlock(e);
90
- }), n.addEventListener("contextmenu", (i) => {
91
- i.preventDefault(), i.stopPropagation(), this.showContextMenu(e, i);
92
- }), this.handleContainer?.appendChild(n), this.updateHandlePosition(e), n;
88
+ `, n.innerHTML = this.getHandleIcon(t), n.addEventListener("click", (s) => {
89
+ s.stopPropagation(), s.preventDefault(), this.selectBlock(e), this.showContextMenu(e, s);
90
+ }), n.addEventListener("contextmenu", (s) => {
91
+ s.preventDefault(), s.stopPropagation(), this.showContextMenu(e, s);
92
+ }), n.addEventListener("mouseleave", (s) => {
93
+ const i = s.relatedTarget;
94
+ i === this.editor || i?.closest?.(".mz-block-handle") || i?.closest?.(".mz-block-handles") || (this.hideAllHandles(), this.unhighlightAll(!0));
95
+ }), this.handleContainer?.appendChild(n), n;
93
96
  }
94
97
  /**
95
98
  * Get icon for handle based on block type
@@ -114,8 +117,8 @@ class r {
114
117
  updateHandlePosition(e) {
115
118
  const t = this.blocks.get(e);
116
119
  if (!t || !t.handleElement) return;
117
- const n = t.element.getBoundingClientRect(), i = this.preview.getBoundingClientRect(), s = n.top - i.top;
118
- t.handleElement.style.top = `${s}px`;
120
+ const n = t.element.getBoundingClientRect(), s = this.preview.getBoundingClientRect(), i = n.top - s.top;
121
+ t.handleElement.style.top = `${i}px`;
119
122
  }
120
123
  /**
121
124
  * Update all handle positions (call on scroll/resize)
@@ -132,10 +135,10 @@ class r {
132
135
  */
133
136
  findBlockAtPoint(e, t) {
134
137
  const n = this.config.handleOffset + this.config.handleSize;
135
- for (const i of this.blocks.values()) {
136
- const s = i.element.getBoundingClientRect();
137
- if (e >= s.left - n && e <= s.right && t >= s.top && t <= s.bottom)
138
- return i.element;
138
+ for (const s of this.blocks.values()) {
139
+ const i = s.element.getBoundingClientRect();
140
+ if (e >= i.left - n && e <= i.right && t >= i.top && t <= i.bottom)
141
+ return s.element;
139
142
  }
140
143
  return null;
141
144
  }
@@ -149,16 +152,18 @@ class r {
149
152
  if (t && t.closest?.(".mz-block-handle")) return;
150
153
  const n = this.findBlockAtPoint(e.clientX, e.clientY);
151
154
  if (n) {
152
- const i = n.getAttribute("data-block-id");
153
- i && (this.showHandle(i), i !== this.selectedBlockId && this.highlightBlock(i, !1));
155
+ const s = n.getAttribute("data-block-id");
156
+ s && (this.showHandle(s), s !== this.selectedBlockId && this.highlightBlock(s, !1));
154
157
  } else
155
158
  this.hideAllHandles(), this.unhighlightAll(!0);
156
159
  }
157
160
  /**
158
- * Handle mouse leave event
161
+ * Handle mouse leave event.
162
+ * Checks relatedTarget so handles don't disappear when mouse moves to a handle.
159
163
  */
160
- handleMouseLeave() {
161
- this.hideAllHandles(), this.unhighlightAll(!0);
164
+ handleMouseLeave(e) {
165
+ const t = e.relatedTarget;
166
+ t?.closest?.(".mz-block-handle") || t?.closest?.(".mz-block-handles") || (this.hideAllHandles(), this.unhighlightAll(!0));
162
167
  }
163
168
  /**
164
169
  * Handle click events for block selection.
@@ -171,8 +176,8 @@ class r {
171
176
  if (t) {
172
177
  const n = t.getAttribute("data-block-id");
173
178
  if (n) {
174
- const i = t.getBoundingClientRect();
175
- e.clientX < i.left || e.shiftKey ? (e.preventDefault(), this.selectBlock(n)) : this.selectedBlockId && this.deselectBlock();
179
+ const s = t.getBoundingClientRect();
180
+ e.clientX < s.left || e.shiftKey ? (e.preventDefault(), this.selectBlock(n)) : this.selectedBlockId && this.deselectBlock();
176
181
  }
177
182
  } else e.target.closest?.(".mz-block-handle") || this.deselectBlock();
178
183
  }
@@ -182,6 +187,27 @@ class r {
182
187
  handleKeyDown(e) {
183
188
  this.selectedBlockId && ((e.ctrlKey || e.metaKey) && e.key === "c" && !this.editor.selectionStart && (e.preventDefault(), this.copyBlock(this.selectedBlockId)), (e.key === "Delete" || e.key === "Backspace") && !this.editor.selectionStart && (e.preventDefault(), this.deleteBlock(this.selectedBlockId)), e.key === "Escape" && this.deselectBlock());
184
189
  }
190
+ /**
191
+ * Update the active block handle based on the cursor position in the textarea.
192
+ * Shows the handle for the block containing the current editing line (Notion-like behavior).
193
+ */
194
+ updateActiveBlock() {
195
+ const e = this.editor.selectionStart, n = this.editor.value.substring(0, e).split(`
196
+ `).length - 1;
197
+ let s = null;
198
+ for (const [i, l] of this.blocks)
199
+ if (n >= l.lineStart && n <= l.lineEnd) {
200
+ s = i;
201
+ break;
202
+ }
203
+ if (s !== this.activeBlockId) {
204
+ if (this.activeBlockId && this.activeBlockId !== this.selectedBlockId) {
205
+ const i = this.blocks.get(this.activeBlockId);
206
+ i?.handleElement && (i.handleElement.style.opacity = "0", i.handleElement.style.pointerEvents = "none");
207
+ }
208
+ this.activeBlockId = s, s && this.showHandle(s);
209
+ }
210
+ }
185
211
  /**
186
212
  * Show a specific handle
187
213
  */
@@ -190,11 +216,11 @@ class r {
190
216
  t?.handleElement && (t.handleElement.style.opacity = "1", t.handleElement.style.pointerEvents = "auto");
191
217
  }
192
218
  /**
193
- * Hide all handles except selected
219
+ * Hide all handles except selected and active cursor block
194
220
  */
195
221
  hideAllHandles() {
196
222
  this.blocks.forEach((e) => {
197
- e.handleElement && e.id !== this.selectedBlockId && (e.handleElement.style.opacity = "0", e.handleElement.style.pointerEvents = "none");
223
+ e.handleElement && e.id !== this.selectedBlockId && e.id !== this.activeBlockId && (e.handleElement.style.opacity = "0", e.handleElement.style.pointerEvents = "none");
198
224
  });
199
225
  }
200
226
  /**
@@ -203,8 +229,8 @@ class r {
203
229
  highlightBlock(e, t) {
204
230
  const n = this.blocks.get(e);
205
231
  if (!n) return;
206
- const i = t ? this.config.colors.selected : this.config.colors.hover;
207
- n.element.style.backgroundColor = i ?? "";
232
+ const s = t ? this.config.colors.selected : this.config.colors.hover;
233
+ n.element.style.backgroundColor = s ?? "";
208
234
  }
209
235
  /**
210
236
  * Remove highlight from all blocks
@@ -246,8 +272,8 @@ class r {
246
272
  const n = this.getBlockContent(t);
247
273
  try {
248
274
  await navigator.clipboard.writeText(n), this.showToast("Block copied to clipboard");
249
- } catch (i) {
250
- console.error("Failed to copy block:", i), this.showToast("Failed to copy block", "error");
275
+ } catch (s) {
276
+ console.error("Failed to copy block:", s), this.showToast("Failed to copy block", "error");
251
277
  }
252
278
  }
253
279
  /**
@@ -256,9 +282,9 @@ class r {
256
282
  deleteBlock(e) {
257
283
  const t = this.blocks.get(e);
258
284
  if (!t) return;
259
- const i = this.editor.value.split(`
285
+ const s = this.editor.value.split(`
260
286
  `);
261
- i.splice(t.lineStart, t.lineEnd - t.lineStart + 1), this.editor.value = i.join(`
287
+ s.splice(t.lineStart, t.lineEnd - t.lineStart + 1), this.editor.value = s.join(`
262
288
  `), this.editor.dispatchEvent(new Event("input", { bubbles: !0 })), this.deselectBlock(), this.showToast("Block deleted");
263
289
  }
264
290
  /**
@@ -275,8 +301,8 @@ class r {
275
301
  showContextMenu(e, t) {
276
302
  const n = document.querySelector(".mz-block-context-menu");
277
303
  n && n.remove();
278
- const i = document.createElement("div");
279
- i.className = "mz-block-context-menu", i.style.cssText = `
304
+ const s = document.createElement("div");
305
+ s.className = "mz-block-context-menu", s.style.cssText = `
280
306
  position: fixed;
281
307
  top: ${t.clientY}px;
282
308
  left: ${t.clientX}px;
@@ -293,9 +319,9 @@ class r {
293
319
  { label: "Copy", action: () => this.copyBlock(e), icon: "📋" },
294
320
  { label: "Delete", action: () => this.deleteBlock(e), icon: "🗑️" },
295
321
  { label: "Select", action: () => this.selectBlock(e), icon: "✓" }
296
- ].forEach(({ label: l, action: a, icon: d }) => {
322
+ ].forEach(({ label: c, action: d, icon: a }) => {
297
323
  const o = document.createElement("div");
298
- o.className = "mz-context-menu-item", o.textContent = `${d} ${l}`, o.style.cssText = `
324
+ o.className = "mz-context-menu-item", o.textContent = `${a} ${c}`, o.style.cssText = `
299
325
  padding: 8px 16px;
300
326
  cursor: pointer;
301
327
  user-select: none;
@@ -304,14 +330,14 @@ class r {
304
330
  }), o.addEventListener("mouseleave", () => {
305
331
  o.style.backgroundColor = "";
306
332
  }), o.addEventListener("click", () => {
307
- a(), i.remove();
308
- }), i.appendChild(o);
309
- }), document.body.appendChild(i);
310
- const c = (l) => {
311
- i.contains(l.target) || (i.remove(), document.removeEventListener("click", c));
333
+ d(), s.remove();
334
+ }), s.appendChild(o);
335
+ }), document.body.appendChild(s);
336
+ const l = (c) => {
337
+ s.contains(c.target) || (s.remove(), document.removeEventListener("click", l));
312
338
  };
313
339
  setTimeout(() => {
314
- document.addEventListener("click", c);
340
+ document.addEventListener("click", l);
315
341
  }, 0);
316
342
  }
317
343
  /**
@@ -346,7 +372,7 @@ class r {
346
372
  * Disable the plugin
347
373
  */
348
374
  disable() {
349
- this.config.enabled = !1, this.handleContainer?.remove(), this.handleContainer = null, this.blocks.clear(), this.selectedBlockId = null, this.editor.removeEventListener("mousemove", this._boundMouseMove), this.editor.removeEventListener("mouseleave", this._boundMouseLeave), this.editor.removeEventListener("click", this._boundClick), this.preview.removeEventListener("mousemove", this._boundMouseMove), this.preview.removeEventListener("mouseleave", this._boundMouseLeave), this.preview.removeEventListener("click", this._boundClick), document.removeEventListener("keydown", this._boundKeyDown);
375
+ this.config.enabled = !1, this.handleContainer?.remove(), this.handleContainer = null, this.blocks.clear(), this.selectedBlockId = null, this.activeBlockId = null, this.editor.removeEventListener("mousemove", this._boundMouseMove), this.editor.removeEventListener("mouseleave", this._boundMouseLeave), this.editor.removeEventListener("click", this._boundClick), this.preview.removeEventListener("mousemove", this._boundMouseMove), this.preview.removeEventListener("mouseleave", this._boundMouseLeave), this.preview.removeEventListener("click", this._boundClick), document.removeEventListener("keydown", this._boundKeyDown), this.editor.removeEventListener("input", this._boundCursorUpdate), this.editor.removeEventListener("mouseup", this._boundCursorUpdate), this.editor.removeEventListener("keyup", this._boundCursorUpdate);
350
376
  }
351
377
  /**
352
378
  * Refresh the plugin (rescan blocks and update positions)
@@ -374,6 +400,6 @@ class r {
374
400
  }
375
401
  }
376
402
  export {
377
- r as BlockHandlesPlugin
403
+ h as BlockHandlesPlugin
378
404
  };
379
405
  //# sourceMappingURL=block-handles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-handles.js","sources":["../../src/plugins/block-handles.ts"],"sourcesContent":["/**\n * Block Handles Plugin\n * \n * Provides interactive handles on the left side of markdown blocks in the preview overlay.\n * Handles appear on hover and provide quick actions for block manipulation.\n * \n * Features:\n * - Hover to show handles\n * - Click to select blocks\n * - Copy block content\n * - Delete blocks\n * - Visual feedback for selected blocks\n */\n\nexport interface BlockHandle {\n id: string;\n type: string;\n lineStart: number;\n lineEnd: number;\n element: HTMLElement;\n handleElement: HTMLElement | null;\n}\n\nexport interface BlockHandlesConfig {\n enabled?: boolean;\n showOnHover?: boolean;\n handleOffset?: number;\n handleSize?: number;\n colors?: {\n hover?: string;\n selected?: string;\n handle?: string;\n };\n}\n\nexport class BlockHandlesPlugin {\n private editor: HTMLTextAreaElement;\n private preview: HTMLElement;\n private config: Required<BlockHandlesConfig>;\n private blocks: Map<string, BlockHandle>;\n private selectedBlockId: string | null;\n private handleContainer: HTMLElement | null;\n\n // Stored bound handlers for proper cleanup\n private _boundMouseMove: (e: MouseEvent) => void;\n private _boundMouseLeave: () => void;\n private _boundClick: (e: MouseEvent) => void;\n private _boundKeyDown: (e: KeyboardEvent) => void;\n\n constructor(editor: HTMLTextAreaElement, preview: HTMLElement, config: BlockHandlesConfig = {}) {\n this.editor = editor;\n this.preview = preview;\n this.config = {\n enabled: config.enabled ?? true,\n showOnHover: config.showOnHover ?? true,\n handleOffset: config.handleOffset ?? 4,\n handleSize: config.handleSize ?? 20,\n colors: {\n hover: config.colors?.hover ?? 'rgba(59, 130, 246, 0.1)',\n selected: config.colors?.selected ?? 'rgba(59, 130, 246, 0.2)',\n handle: config.colors?.handle ?? 'rgba(59, 130, 246, 0.8)',\n },\n };\n this.blocks = new Map();\n this.selectedBlockId = null;\n this.handleContainer = null;\n\n // Bind handlers once for consistent add/remove\n this._boundMouseMove = this.handleMouseMove.bind(this);\n this._boundMouseLeave = this.handleMouseLeave.bind(this);\n this._boundClick = this.handleClick.bind(this);\n this._boundKeyDown = this.handleKeyDown.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initialize the plugin\n */\n private initialize(): void {\n if (!this.config.enabled) return;\n\n // Create handle container\n this.createHandleContainer();\n\n // Set up event listeners\n this.setupEventListeners();\n\n // Initial scan for blocks\n this.scanBlocks();\n }\n\n /**\n * Create the container for block handles.\n * Appended to the wrapper (parent of preview) so it sits above the textarea\n * and is not subject to the preview's pointer-events: none rule.\n */\n private createHandleContainer(): void {\n this.handleContainer = document.createElement('div');\n this.handleContainer.className = 'mz-block-handles';\n this.handleContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 2;\n `;\n // Attach to the wrapper (preview's parent), not the preview itself.\n // The preview has pointer-events: none which would prevent any interaction.\n const wrapper = this.preview.parentElement;\n if (wrapper) {\n wrapper.appendChild(this.handleContainer);\n }\n }\n\n /**\n * Set up event listeners for block interactions.\n * We listen on both the textarea (normal mode) and the preview (preview mode),\n * since in preview mode the textarea is display:none and the preview has pointer-events:auto.\n */\n private setupEventListeners(): void {\n // Normal overlay mode: textarea receives pointer events\n this.editor.addEventListener('mousemove', this._boundMouseMove);\n this.editor.addEventListener('mouseleave', this._boundMouseLeave);\n this.editor.addEventListener('click', this._boundClick);\n\n // Preview mode: preview has pointer-events:auto, textarea is display:none\n this.preview.addEventListener('mousemove', this._boundMouseMove);\n this.preview.addEventListener('mouseleave', this._boundMouseLeave);\n this.preview.addEventListener('click', this._boundClick);\n\n // Keyboard shortcuts\n document.addEventListener('keydown', this._boundKeyDown);\n }\n\n /**\n * Scan the preview for blocks and create handles\n */\n public scanBlocks(): void {\n this.blocks.clear();\n \n if (!this.handleContainer) return;\n\n // Clear existing handles\n this.handleContainer.innerHTML = '';\n\n // Find all elements with block metadata\n const blockElements = this.preview.querySelectorAll('[data-block-id]');\n \n blockElements.forEach((element) => {\n const el = element as HTMLElement;\n const blockId = el.getAttribute('data-block-id');\n const blockType = el.getAttribute('data-block-type');\n const lineStart = parseInt(el.getAttribute('data-line-start') || '0', 10);\n const lineEnd = parseInt(el.getAttribute('data-line-end') || '0', 10);\n\n if (!blockId) return;\n\n // Create handle for this block\n const handle = this.createHandle(blockId, blockType || 'paragraph');\n\n this.blocks.set(blockId, {\n id: blockId,\n type: blockType || 'paragraph',\n lineStart,\n lineEnd,\n element: el,\n handleElement: handle,\n });\n });\n }\n\n /**\n * Create a handle element for a block\n */\n private createHandle(blockId: string, blockType: string): HTMLElement {\n const handle = document.createElement('div');\n handle.className = `mz-block-handle mz-block-handle-${blockType}`;\n handle.setAttribute('data-block-id', blockId);\n handle.style.cssText = `\n position: absolute;\n width: ${this.config.handleSize}px;\n height: ${this.config.handleSize}px;\n left: ${this.config.handleOffset}px;\n background: ${this.config.colors.handle};\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.2s ease;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 12px;\n user-select: none;\n `;\n\n // Add icon based on block type\n handle.innerHTML = this.getHandleIcon(blockType);\n\n // Handle click events\n handle.addEventListener('click', (e) => {\n e.stopPropagation();\n this.selectBlock(blockId);\n });\n\n // Show context menu on right click\n handle.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.showContextMenu(blockId, e);\n });\n\n this.handleContainer?.appendChild(handle);\n this.updateHandlePosition(blockId);\n\n return handle;\n }\n\n /**\n * Get icon for handle based on block type\n */\n private getHandleIcon(blockType: string): string {\n const icons: Record<string, string> = {\n heading: '⚡',\n paragraph: '¶',\n 'list-item': '•',\n quote: '\"',\n 'code-fence': '{',\n 'code-content': '{}',\n hr: '―',\n 'table-row': '⊞',\n 'table-separator': '═',\n };\n return icons[blockType] || '○';\n }\n\n /**\n * Update handle position based on block element position.\n * Uses viewport-relative coordinates so scrolling is automatically accounted for.\n */\n private updateHandlePosition(blockId: string): void {\n const block = this.blocks.get(blockId);\n if (!block || !block.handleElement) return;\n\n const blockRect = block.element.getBoundingClientRect();\n const previewRect = this.preview.getBoundingClientRect();\n\n // blockRect.top and previewRect.top are both viewport-relative,\n // so their difference gives the offset within the visible preview area.\n const top = blockRect.top - previewRect.top;\n\n block.handleElement.style.top = `${top}px`;\n }\n\n /**\n * Update all handle positions (call on scroll/resize)\n */\n public updateAllHandlePositions(): void {\n this.blocks.forEach((_block, blockId) => {\n this.updateHandlePosition(blockId);\n });\n }\n\n /**\n * Find the preview block element at a given viewport position.\n * Extends the hit rect to the left by handleOffset + handleSize so the\n * mouse can reach the handle without triggering a hide.\n */\n private findBlockAtPoint(clientX: number, clientY: number): HTMLElement | null {\n const handleReach = this.config.handleOffset + this.config.handleSize;\n for (const block of this.blocks.values()) {\n const rect = block.element.getBoundingClientRect();\n if (clientX >= rect.left - handleReach && clientX <= rect.right &&\n clientY >= rect.top && clientY <= rect.bottom) {\n return block.element;\n }\n }\n return null;\n }\n\n /**\n * Handle mouse move for hover effects.\n * Listens on both the textarea (normal mode) and the preview (preview mode).\n */\n private handleMouseMove(e: MouseEvent): void {\n if (!this.config.showOnHover) return;\n\n // If the element actually under the cursor is a handle, keep it visible\n const elementUnder = document.elementFromPoint(e.clientX, e.clientY);\n if (elementUnder && (elementUnder as HTMLElement).closest?.('.mz-block-handle')) return;\n\n const blockElement = this.findBlockAtPoint(e.clientX, e.clientY);\n\n if (blockElement) {\n const blockId = blockElement.getAttribute('data-block-id');\n if (blockId) {\n this.showHandle(blockId);\n // Don't replace selected-color with hover-color on the selected block\n if (blockId !== this.selectedBlockId) {\n this.highlightBlock(blockId, false);\n }\n }\n } else {\n this.hideAllHandles();\n this.unhighlightAll(true); // keep selected block highlighted\n }\n }\n\n /**\n * Handle mouse leave event\n */\n private handleMouseLeave(): void {\n this.hideAllHandles();\n this.unhighlightAll(true);\n }\n\n /**\n * Handle click events for block selection.\n * Clicks anywhere in the left handle-zone (the padding area left of block text)\n * select the block — no shift key required. Shift+click anywhere on the block\n * also selects it. Clicking in normal text area deselects.\n */\n private handleClick(e: MouseEvent): void {\n const blockElement = this.findBlockAtPoint(e.clientX, e.clientY);\n\n if (blockElement) {\n const blockId = blockElement.getAttribute('data-block-id');\n if (blockId) {\n const blockRect = blockElement.getBoundingClientRect();\n // A click in the handle zone (left of where text starts) or shift+click selects\n const inHandleZone = e.clientX < blockRect.left;\n if (inHandleZone || e.shiftKey) {\n e.preventDefault();\n this.selectBlock(blockId);\n } else {\n // Normal click inside block text — deselect if something was selected\n if (this.selectedBlockId) this.deselectBlock();\n }\n }\n } else if (!(e.target as HTMLElement).closest?.('.mz-block-handle')) {\n // Click outside all blocks — deselect\n this.deselectBlock();\n }\n }\n\n /**\n * Handle keyboard shortcuts\n */\n private handleKeyDown(e: KeyboardEvent): void {\n if (!this.selectedBlockId) return;\n\n // Copy block (Ctrl/Cmd + C when block is selected)\n if ((e.ctrlKey || e.metaKey) && e.key === 'c' && !this.editor.selectionStart) {\n e.preventDefault();\n this.copyBlock(this.selectedBlockId);\n }\n\n // Delete block (Delete or Backspace when block is selected)\n if ((e.key === 'Delete' || e.key === 'Backspace') && !this.editor.selectionStart) {\n e.preventDefault();\n this.deleteBlock(this.selectedBlockId);\n }\n\n // Escape to deselect\n if (e.key === 'Escape') {\n this.deselectBlock();\n }\n }\n\n /**\n * Show a specific handle\n */\n private showHandle(blockId: string): void {\n const block = this.blocks.get(blockId);\n if (block?.handleElement) {\n block.handleElement.style.opacity = '1';\n block.handleElement.style.pointerEvents = 'auto';\n }\n }\n\n /**\n * Hide all handles except selected\n */\n private hideAllHandles(): void {\n this.blocks.forEach((block) => {\n if (block.handleElement && block.id !== this.selectedBlockId) {\n block.handleElement.style.opacity = '0';\n block.handleElement.style.pointerEvents = 'none';\n }\n });\n }\n\n /**\n * Highlight a block\n */\n private highlightBlock(blockId: string, selected: boolean): void {\n const block = this.blocks.get(blockId);\n if (!block) return;\n\n const color = selected ? this.config.colors.selected : this.config.colors.hover;\n block.element.style.backgroundColor = color ?? '';\n }\n\n /**\n * Remove highlight from all blocks\n */\n private unhighlightAll(keepSelected: boolean = false): void {\n this.blocks.forEach((block) => {\n if (!keepSelected || block.id !== this.selectedBlockId) {\n block.element.style.backgroundColor = '';\n }\n });\n }\n\n /**\n * Select a block\n */\n private selectBlock(blockId: string): void {\n // Deselect previous block\n if (this.selectedBlockId) {\n this.unhighlightAll();\n const prevBlock = this.blocks.get(this.selectedBlockId);\n if (prevBlock?.handleElement) {\n prevBlock.handleElement.style.opacity = '0';\n prevBlock.handleElement.style.pointerEvents = 'none';\n }\n }\n\n // Select new block\n this.selectedBlockId = blockId;\n this.highlightBlock(blockId, true);\n this.showHandle(blockId);\n\n // Dispatch selection event\n this.preview.dispatchEvent(new CustomEvent('blockSelected', {\n detail: { blockId, block: this.blocks.get(blockId) },\n }));\n }\n\n /**\n * Deselect current block\n */\n private deselectBlock(): void {\n if (!this.selectedBlockId) return;\n\n const blockId = this.selectedBlockId;\n this.selectedBlockId = null;\n this.unhighlightAll();\n this.hideAllHandles();\n\n // Dispatch deselection event\n this.preview.dispatchEvent(new CustomEvent('blockDeselected', {\n detail: { blockId },\n }));\n }\n\n /**\n * Copy block content to clipboard\n */\n private async copyBlock(blockId: string): Promise<void> {\n const block = this.blocks.get(blockId);\n if (!block) return;\n\n const content = this.getBlockContent(block);\n \n try {\n await navigator.clipboard.writeText(content);\n this.showToast('Block copied to clipboard');\n } catch (err) {\n console.error('Failed to copy block:', err);\n this.showToast('Failed to copy block', 'error');\n }\n }\n\n /**\n * Delete a block from the editor\n */\n private deleteBlock(blockId: string): void {\n const block = this.blocks.get(blockId);\n if (!block) return;\n\n const content = this.editor.value;\n const lines = content.split('\\n');\n\n // Remove lines for this block\n lines.splice(block.lineStart, block.lineEnd - block.lineStart + 1);\n\n // Update editor\n this.editor.value = lines.join('\\n');\n \n // Trigger input event to update preview\n this.editor.dispatchEvent(new Event('input', { bubbles: true }));\n\n // Deselect and rescan\n this.deselectBlock();\n this.showToast('Block deleted');\n }\n\n /**\n * Get the text content of a block from the editor\n */\n private getBlockContent(block: BlockHandle): string {\n const content = this.editor.value;\n const lines = content.split('\\n');\n \n return lines\n .slice(block.lineStart, block.lineEnd + 1)\n .join('\\n');\n }\n\n /**\n * Show context menu for block actions\n */\n private showContextMenu(blockId: string, e: MouseEvent): void {\n // Remove existing context menu if any\n const existingMenu = document.querySelector('.mz-block-context-menu');\n if (existingMenu) {\n existingMenu.remove();\n }\n\n const menu = document.createElement('div');\n menu.className = 'mz-block-context-menu';\n menu.style.cssText = `\n position: fixed;\n top: ${e.clientY}px;\n left: ${e.clientX}px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 150px;\n padding: 4px 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n `;\n\n const actions = [\n { label: 'Copy', action: () => this.copyBlock(blockId), icon: '📋' },\n { label: 'Delete', action: () => this.deleteBlock(blockId), icon: '🗑️' },\n { label: 'Select', action: () => this.selectBlock(blockId), icon: '✓' },\n ];\n\n actions.forEach(({ label, action, icon }) => {\n const item = document.createElement('div');\n item.className = 'mz-context-menu-item';\n item.textContent = `${icon} ${label}`;\n item.style.cssText = `\n padding: 8px 16px;\n cursor: pointer;\n user-select: none;\n `;\n\n item.addEventListener('mouseenter', () => {\n item.style.backgroundColor = '#f5f5f5';\n });\n\n item.addEventListener('mouseleave', () => {\n item.style.backgroundColor = '';\n });\n\n item.addEventListener('click', () => {\n action();\n menu.remove();\n });\n\n menu.appendChild(item);\n });\n\n document.body.appendChild(menu);\n\n // Close menu on click outside\n const closeMenu = (e: MouseEvent) => {\n if (!menu.contains(e.target as Node)) {\n menu.remove();\n document.removeEventListener('click', closeMenu);\n }\n };\n\n setTimeout(() => {\n document.addEventListener('click', closeMenu);\n }, 0);\n }\n\n /**\n * Show a toast notification\n */\n private showToast(message: string, type: 'success' | 'error' = 'success'): void {\n const toast = document.createElement('div');\n toast.className = 'mz-toast';\n toast.textContent = message;\n toast.style.cssText = `\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: ${type === 'success' ? '#10b981' : '#ef4444'};\n color: white;\n padding: 12px 20px;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n animation: slideIn 0.3s ease;\n `;\n\n document.body.appendChild(toast);\n\n setTimeout(() => {\n toast.style.animation = 'slideOut 0.3s ease';\n setTimeout(() => toast.remove(), 300);\n }, 2000);\n }\n\n /**\n * Enable the plugin\n */\n public enable(): void {\n if (this.config.enabled) return; // Already enabled\n this.config.enabled = true;\n this.initialize();\n }\n\n /**\n * Disable the plugin\n */\n public disable(): void {\n this.config.enabled = false;\n this.handleContainer?.remove();\n this.handleContainer = null;\n this.blocks.clear();\n this.selectedBlockId = null;\n // Remove event listeners from both textarea and preview\n this.editor.removeEventListener('mousemove', this._boundMouseMove);\n this.editor.removeEventListener('mouseleave', this._boundMouseLeave);\n this.editor.removeEventListener('click', this._boundClick);\n this.preview.removeEventListener('mousemove', this._boundMouseMove);\n this.preview.removeEventListener('mouseleave', this._boundMouseLeave);\n this.preview.removeEventListener('click', this._boundClick);\n document.removeEventListener('keydown', this._boundKeyDown);\n }\n\n /**\n * Refresh the plugin (rescan blocks and update positions)\n */\n public refresh(): void {\n this.scanBlocks();\n }\n\n /**\n * Get the currently selected block\n */\n public getSelectedBlock(): BlockHandle | null {\n return this.selectedBlockId ? this.blocks.get(this.selectedBlockId) || null : null;\n }\n\n /**\n * Get all blocks\n */\n public getAllBlocks(): BlockHandle[] {\n return Array.from(this.blocks.values());\n }\n\n /**\n * Clean up and remove the plugin\n */\n public destroy(): void {\n this.disable();\n }\n}\n"],"names":["BlockHandlesPlugin","editor","preview","config","wrapper","element","el","blockId","blockType","lineStart","lineEnd","handle","e","block","blockRect","previewRect","top","_block","clientX","clientY","handleReach","rect","elementUnder","blockElement","selected","color","keepSelected","prevBlock","content","err","lines","existingMenu","menu","label","action","icon","item","closeMenu","message","type","toast"],"mappings":"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"}
1
+ {"version":3,"file":"block-handles.js","sources":["../../src/plugins/block-handles.ts"],"sourcesContent":["/**\n * Block Handles Plugin\n * \n * Provides interactive handles on the left side of markdown blocks in the preview overlay.\n * Handles appear on hover and provide quick actions for block manipulation.\n * \n * Features:\n * - Hover to show handles\n * - Click to select blocks\n * - Copy block content\n * - Delete blocks\n * - Visual feedback for selected blocks\n */\n\nexport interface BlockHandle {\n id: string;\n type: string;\n lineStart: number;\n lineEnd: number;\n element: HTMLElement;\n handleElement: HTMLElement | null;\n}\n\nexport interface BlockHandlesConfig {\n enabled?: boolean;\n showOnHover?: boolean;\n handleOffset?: number;\n handleSize?: number;\n colors?: {\n hover?: string;\n selected?: string;\n handle?: string;\n };\n}\n\nexport class BlockHandlesPlugin {\n private editor: HTMLTextAreaElement;\n private preview: HTMLElement;\n private config: Required<BlockHandlesConfig>;\n private blocks: Map<string, BlockHandle>;\n private selectedBlockId: string | null;\n private activeBlockId: string | null;\n private handleContainer: HTMLElement | null;\n\n // Stored bound handlers for proper cleanup\n private _boundMouseMove: (e: MouseEvent) => void;\n private _boundMouseLeave: (e: MouseEvent) => void;\n private _boundClick: (e: MouseEvent) => void;\n private _boundKeyDown: (e: KeyboardEvent) => void;\n private _boundCursorUpdate: () => void;\n\n constructor(editor: HTMLTextAreaElement, preview: HTMLElement, config: BlockHandlesConfig = {}) {\n this.editor = editor;\n this.preview = preview;\n this.config = {\n enabled: config.enabled ?? true,\n showOnHover: config.showOnHover ?? true,\n handleOffset: config.handleOffset ?? 4,\n handleSize: config.handleSize ?? 20,\n colors: {\n hover: config.colors?.hover ?? 'rgba(59, 130, 246, 0.1)',\n selected: config.colors?.selected ?? 'rgba(59, 130, 246, 0.2)',\n handle: config.colors?.handle ?? 'rgba(59, 130, 246, 0.8)',\n },\n };\n this.blocks = new Map();\n this.selectedBlockId = null;\n this.activeBlockId = null;\n this.handleContainer = null;\n\n // Bind handlers once for consistent add/remove\n this._boundMouseMove = this.handleMouseMove.bind(this);\n this._boundMouseLeave = this.handleMouseLeave.bind(this);\n this._boundClick = this.handleClick.bind(this);\n this._boundKeyDown = this.handleKeyDown.bind(this);\n this._boundCursorUpdate = this.updateActiveBlock.bind(this);\n\n this.initialize();\n }\n\n /**\n * Initialize the plugin\n */\n private initialize(): void {\n if (!this.config.enabled) return;\n\n // Create handle container\n this.createHandleContainer();\n\n // Set up event listeners\n this.setupEventListeners();\n\n // Initial scan for blocks\n this.scanBlocks();\n }\n\n /**\n * Create the container for block handles.\n * Appended to the wrapper (parent of preview) so it sits above the textarea\n * and is not subject to the preview's pointer-events: none rule.\n */\n private createHandleContainer(): void {\n this.handleContainer = document.createElement('div');\n this.handleContainer.className = 'mz-block-handles';\n this.handleContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 2;\n `;\n // Attach to the wrapper (preview's parent), not the preview itself.\n // The preview has pointer-events: none which would prevent any interaction.\n const wrapper = this.preview.parentElement;\n if (wrapper) {\n wrapper.appendChild(this.handleContainer);\n }\n }\n\n /**\n * Set up event listeners for block interactions.\n * We listen on both the textarea (normal mode) and the preview (preview mode),\n * since in preview mode the textarea is display:none and the preview has pointer-events:auto.\n */\n private setupEventListeners(): void {\n // Normal overlay mode: textarea receives pointer events\n this.editor.addEventListener('mousemove', this._boundMouseMove);\n this.editor.addEventListener('mouseleave', this._boundMouseLeave);\n this.editor.addEventListener('click', this._boundClick);\n\n // Preview mode: preview has pointer-events:auto, textarea is display:none\n this.preview.addEventListener('mousemove', this._boundMouseMove);\n this.preview.addEventListener('mouseleave', this._boundMouseLeave);\n this.preview.addEventListener('click', this._boundClick);\n\n // Keyboard shortcuts\n document.addEventListener('keydown', this._boundKeyDown);\n\n // Cursor tracking for Notion-like active line handles\n this.editor.addEventListener('input', this._boundCursorUpdate);\n this.editor.addEventListener('mouseup', this._boundCursorUpdate);\n this.editor.addEventListener('keyup', this._boundCursorUpdate);\n }\n\n /**\n * Scan the preview for blocks and create handles\n */\n public scanBlocks(): void {\n this.blocks.clear();\n \n if (!this.handleContainer) return;\n\n // Clear existing handles\n this.handleContainer.innerHTML = '';\n\n // Find all elements with block metadata\n const blockElements = this.preview.querySelectorAll('[data-block-id]');\n \n blockElements.forEach((element) => {\n const el = element as HTMLElement;\n const blockId = el.getAttribute('data-block-id');\n const blockType = el.getAttribute('data-block-type');\n const lineStart = parseInt(el.getAttribute('data-line-start') || '0', 10);\n const lineEnd = parseInt(el.getAttribute('data-line-end') || '0', 10);\n\n if (!blockId) return;\n\n // Create handle for this block\n const handle = this.createHandle(blockId, blockType || 'paragraph');\n\n this.blocks.set(blockId, {\n id: blockId,\n type: blockType || 'paragraph',\n lineStart,\n lineEnd,\n element: el,\n handleElement: handle,\n });\n });\n\n // Now that all blocks are in the map, set their positions.\n // (updateHandlePosition looks up blocks by id, so it must run after blocks.set)\n this.updateAllHandlePositions();\n }\n\n /**\n * Create a handle element for a block\n */\n private createHandle(blockId: string, blockType: string): HTMLElement {\n const handle = document.createElement('div');\n handle.className = `mz-block-handle mz-block-handle-${blockType}`;\n handle.setAttribute('data-block-id', blockId);\n handle.style.cssText = `\n position: absolute;\n width: ${this.config.handleSize}px;\n height: ${this.config.handleSize}px;\n left: ${this.config.handleOffset}px;\n background: ${this.config.colors.handle};\n border-radius: 4px;\n cursor: pointer;\n opacity: 0;\n transition: opacity 0.2s ease;\n pointer-events: none;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 12px;\n user-select: none;\n `;\n\n // Add icon based on block type\n handle.innerHTML = this.getHandleIcon(blockType);\n\n // Handle click — select block and show action menu\n handle.addEventListener('click', (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.selectBlock(blockId);\n this.showContextMenu(blockId, e);\n });\n\n // Show context menu on right click too\n handle.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n e.stopPropagation();\n this.showContextMenu(blockId, e);\n });\n\n // When mouse leaves the handle, hide it (unless going back to editor)\n handle.addEventListener('mouseleave', (e: MouseEvent) => {\n const related = e.relatedTarget as HTMLElement | null;\n if (related === this.editor || related?.closest?.('.mz-block-handle') || related?.closest?.('.mz-block-handles')) {\n return;\n }\n this.hideAllHandles();\n this.unhighlightAll(true);\n });\n\n this.handleContainer?.appendChild(handle);\n\n return handle;\n }\n\n /**\n * Get icon for handle based on block type\n */\n private getHandleIcon(blockType: string): string {\n const icons: Record<string, string> = {\n heading: '⚡',\n paragraph: '¶',\n 'list-item': '•',\n quote: '\"',\n 'code-fence': '{',\n 'code-content': '{}',\n hr: '―',\n 'table-row': '⊞',\n 'table-separator': '═',\n };\n return icons[blockType] || '○';\n }\n\n /**\n * Update handle position based on block element position.\n * Uses viewport-relative coordinates so scrolling is automatically accounted for.\n */\n private updateHandlePosition(blockId: string): void {\n const block = this.blocks.get(blockId);\n if (!block || !block.handleElement) return;\n\n const blockRect = block.element.getBoundingClientRect();\n const previewRect = this.preview.getBoundingClientRect();\n\n // blockRect.top and previewRect.top are both viewport-relative,\n // so their difference gives the offset within the visible preview area.\n const top = blockRect.top - previewRect.top;\n\n block.handleElement.style.top = `${top}px`;\n }\n\n /**\n * Update all handle positions (call on scroll/resize)\n */\n public updateAllHandlePositions(): void {\n this.blocks.forEach((_block, blockId) => {\n this.updateHandlePosition(blockId);\n });\n }\n\n /**\n * Find the preview block element at a given viewport position.\n * Extends the hit rect to the left by handleOffset + handleSize so the\n * mouse can reach the handle without triggering a hide.\n */\n private findBlockAtPoint(clientX: number, clientY: number): HTMLElement | null {\n const handleReach = this.config.handleOffset + this.config.handleSize;\n for (const block of this.blocks.values()) {\n const rect = block.element.getBoundingClientRect();\n if (clientX >= rect.left - handleReach && clientX <= rect.right &&\n clientY >= rect.top && clientY <= rect.bottom) {\n return block.element;\n }\n }\n return null;\n }\n\n /**\n * Handle mouse move for hover effects.\n * Listens on both the textarea (normal mode) and the preview (preview mode).\n */\n private handleMouseMove(e: MouseEvent): void {\n if (!this.config.showOnHover) return;\n\n // If the element actually under the cursor is a handle, keep it visible\n const elementUnder = document.elementFromPoint(e.clientX, e.clientY);\n if (elementUnder && (elementUnder as HTMLElement).closest?.('.mz-block-handle')) return;\n\n const blockElement = this.findBlockAtPoint(e.clientX, e.clientY);\n\n if (blockElement) {\n const blockId = blockElement.getAttribute('data-block-id');\n if (blockId) {\n this.showHandle(blockId);\n // Don't replace selected-color with hover-color on the selected block\n if (blockId !== this.selectedBlockId) {\n this.highlightBlock(blockId, false);\n }\n }\n } else {\n this.hideAllHandles();\n this.unhighlightAll(true); // keep selected block highlighted\n }\n }\n\n /**\n * Handle mouse leave event.\n * Checks relatedTarget so handles don't disappear when mouse moves to a handle.\n */\n private handleMouseLeave(e: MouseEvent): void {\n const related = e.relatedTarget as HTMLElement | null;\n // Don't hide handles if mouse moved to a block handle element\n if (related?.closest?.('.mz-block-handle') || related?.closest?.('.mz-block-handles')) {\n return;\n }\n this.hideAllHandles();\n this.unhighlightAll(true);\n }\n\n /**\n * Handle click events for block selection.\n * Clicks anywhere in the left handle-zone (the padding area left of block text)\n * select the block — no shift key required. Shift+click anywhere on the block\n * also selects it. Clicking in normal text area deselects.\n */\n private handleClick(e: MouseEvent): void {\n const blockElement = this.findBlockAtPoint(e.clientX, e.clientY);\n\n if (blockElement) {\n const blockId = blockElement.getAttribute('data-block-id');\n if (blockId) {\n const blockRect = blockElement.getBoundingClientRect();\n // A click in the handle zone (left of where text starts) or shift+click selects\n const inHandleZone = e.clientX < blockRect.left;\n if (inHandleZone || e.shiftKey) {\n e.preventDefault();\n this.selectBlock(blockId);\n } else {\n // Normal click inside block text — deselect if something was selected\n if (this.selectedBlockId) this.deselectBlock();\n }\n }\n } else if (!(e.target as HTMLElement).closest?.('.mz-block-handle')) {\n // Click outside all blocks — deselect\n this.deselectBlock();\n }\n }\n\n /**\n * Handle keyboard shortcuts\n */\n private handleKeyDown(e: KeyboardEvent): void {\n if (!this.selectedBlockId) return;\n\n // Copy block (Ctrl/Cmd + C when block is selected)\n if ((e.ctrlKey || e.metaKey) && e.key === 'c' && !this.editor.selectionStart) {\n e.preventDefault();\n this.copyBlock(this.selectedBlockId);\n }\n\n // Delete block (Delete or Backspace when block is selected)\n if ((e.key === 'Delete' || e.key === 'Backspace') && !this.editor.selectionStart) {\n e.preventDefault();\n this.deleteBlock(this.selectedBlockId);\n }\n\n // Escape to deselect\n if (e.key === 'Escape') {\n this.deselectBlock();\n }\n }\n\n /**\n * Update the active block handle based on the cursor position in the textarea.\n * Shows the handle for the block containing the current editing line (Notion-like behavior).\n */\n private updateActiveBlock(): void {\n const cursorPos = this.editor.selectionStart;\n const text = this.editor.value.substring(0, cursorPos);\n const lineIndex = text.split('\\n').length - 1;\n\n // Find block containing this line\n let foundBlockId: string | null = null;\n for (const [blockId, block] of this.blocks) {\n if (lineIndex >= block.lineStart && lineIndex <= block.lineEnd) {\n foundBlockId = blockId;\n break;\n }\n }\n\n // If same as current active, nothing to do\n if (foundBlockId === this.activeBlockId) return;\n\n // Clear previous active handle (if it's not selected)\n if (this.activeBlockId && this.activeBlockId !== this.selectedBlockId) {\n const prevBlock = this.blocks.get(this.activeBlockId);\n if (prevBlock?.handleElement) {\n prevBlock.handleElement.style.opacity = '0';\n prevBlock.handleElement.style.pointerEvents = 'none';\n }\n }\n\n this.activeBlockId = foundBlockId;\n\n if (foundBlockId) {\n this.showHandle(foundBlockId);\n }\n }\n\n /**\n * Show a specific handle\n */\n private showHandle(blockId: string): void {\n const block = this.blocks.get(blockId);\n if (block?.handleElement) {\n block.handleElement.style.opacity = '1';\n block.handleElement.style.pointerEvents = 'auto';\n }\n }\n\n /**\n * Hide all handles except selected and active cursor block\n */\n private hideAllHandles(): void {\n this.blocks.forEach((block) => {\n if (block.handleElement && block.id !== this.selectedBlockId && block.id !== this.activeBlockId) {\n block.handleElement.style.opacity = '0';\n block.handleElement.style.pointerEvents = 'none';\n }\n });\n }\n\n /**\n * Highlight a block\n */\n private highlightBlock(blockId: string, selected: boolean): void {\n const block = this.blocks.get(blockId);\n if (!block) return;\n\n const color = selected ? this.config.colors.selected : this.config.colors.hover;\n block.element.style.backgroundColor = color ?? '';\n }\n\n /**\n * Remove highlight from all blocks\n */\n private unhighlightAll(keepSelected: boolean = false): void {\n this.blocks.forEach((block) => {\n if (!keepSelected || block.id !== this.selectedBlockId) {\n block.element.style.backgroundColor = '';\n }\n });\n }\n\n /**\n * Select a block\n */\n private selectBlock(blockId: string): void {\n // Deselect previous block\n if (this.selectedBlockId) {\n this.unhighlightAll();\n const prevBlock = this.blocks.get(this.selectedBlockId);\n if (prevBlock?.handleElement) {\n prevBlock.handleElement.style.opacity = '0';\n prevBlock.handleElement.style.pointerEvents = 'none';\n }\n }\n\n // Select new block\n this.selectedBlockId = blockId;\n this.highlightBlock(blockId, true);\n this.showHandle(blockId);\n\n // Dispatch selection event\n this.preview.dispatchEvent(new CustomEvent('blockSelected', {\n detail: { blockId, block: this.blocks.get(blockId) },\n }));\n }\n\n /**\n * Deselect current block\n */\n private deselectBlock(): void {\n if (!this.selectedBlockId) return;\n\n const blockId = this.selectedBlockId;\n this.selectedBlockId = null;\n this.unhighlightAll();\n this.hideAllHandles();\n\n // Dispatch deselection event\n this.preview.dispatchEvent(new CustomEvent('blockDeselected', {\n detail: { blockId },\n }));\n }\n\n /**\n * Copy block content to clipboard\n */\n private async copyBlock(blockId: string): Promise<void> {\n const block = this.blocks.get(blockId);\n if (!block) return;\n\n const content = this.getBlockContent(block);\n \n try {\n await navigator.clipboard.writeText(content);\n this.showToast('Block copied to clipboard');\n } catch (err) {\n console.error('Failed to copy block:', err);\n this.showToast('Failed to copy block', 'error');\n }\n }\n\n /**\n * Delete a block from the editor\n */\n private deleteBlock(blockId: string): void {\n const block = this.blocks.get(blockId);\n if (!block) return;\n\n const content = this.editor.value;\n const lines = content.split('\\n');\n\n // Remove lines for this block\n lines.splice(block.lineStart, block.lineEnd - block.lineStart + 1);\n\n // Update editor\n this.editor.value = lines.join('\\n');\n \n // Trigger input event to update preview\n this.editor.dispatchEvent(new Event('input', { bubbles: true }));\n\n // Deselect and rescan\n this.deselectBlock();\n this.showToast('Block deleted');\n }\n\n /**\n * Get the text content of a block from the editor\n */\n private getBlockContent(block: BlockHandle): string {\n const content = this.editor.value;\n const lines = content.split('\\n');\n \n return lines\n .slice(block.lineStart, block.lineEnd + 1)\n .join('\\n');\n }\n\n /**\n * Show context menu for block actions\n */\n private showContextMenu(blockId: string, e: MouseEvent): void {\n // Remove existing context menu if any\n const existingMenu = document.querySelector('.mz-block-context-menu');\n if (existingMenu) {\n existingMenu.remove();\n }\n\n const menu = document.createElement('div');\n menu.className = 'mz-block-context-menu';\n menu.style.cssText = `\n position: fixed;\n top: ${e.clientY}px;\n left: ${e.clientX}px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n min-width: 150px;\n padding: 4px 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n `;\n\n const actions = [\n { label: 'Copy', action: () => this.copyBlock(blockId), icon: '📋' },\n { label: 'Delete', action: () => this.deleteBlock(blockId), icon: '🗑️' },\n { label: 'Select', action: () => this.selectBlock(blockId), icon: '✓' },\n ];\n\n actions.forEach(({ label, action, icon }) => {\n const item = document.createElement('div');\n item.className = 'mz-context-menu-item';\n item.textContent = `${icon} ${label}`;\n item.style.cssText = `\n padding: 8px 16px;\n cursor: pointer;\n user-select: none;\n `;\n\n item.addEventListener('mouseenter', () => {\n item.style.backgroundColor = '#f5f5f5';\n });\n\n item.addEventListener('mouseleave', () => {\n item.style.backgroundColor = '';\n });\n\n item.addEventListener('click', () => {\n action();\n menu.remove();\n });\n\n menu.appendChild(item);\n });\n\n document.body.appendChild(menu);\n\n // Close menu on click outside\n const closeMenu = (e: MouseEvent) => {\n if (!menu.contains(e.target as Node)) {\n menu.remove();\n document.removeEventListener('click', closeMenu);\n }\n };\n\n setTimeout(() => {\n document.addEventListener('click', closeMenu);\n }, 0);\n }\n\n /**\n * Show a toast notification\n */\n private showToast(message: string, type: 'success' | 'error' = 'success'): void {\n const toast = document.createElement('div');\n toast.className = 'mz-toast';\n toast.textContent = message;\n toast.style.cssText = `\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: ${type === 'success' ? '#10b981' : '#ef4444'};\n color: white;\n padding: 12px 20px;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n animation: slideIn 0.3s ease;\n `;\n\n document.body.appendChild(toast);\n\n setTimeout(() => {\n toast.style.animation = 'slideOut 0.3s ease';\n setTimeout(() => toast.remove(), 300);\n }, 2000);\n }\n\n /**\n * Enable the plugin\n */\n public enable(): void {\n if (this.config.enabled) return; // Already enabled\n this.config.enabled = true;\n this.initialize();\n }\n\n /**\n * Disable the plugin\n */\n public disable(): void {\n this.config.enabled = false;\n this.handleContainer?.remove();\n this.handleContainer = null;\n this.blocks.clear();\n this.selectedBlockId = null;\n this.activeBlockId = null;\n // Remove event listeners from both textarea and preview\n this.editor.removeEventListener('mousemove', this._boundMouseMove);\n this.editor.removeEventListener('mouseleave', this._boundMouseLeave);\n this.editor.removeEventListener('click', this._boundClick);\n this.preview.removeEventListener('mousemove', this._boundMouseMove);\n this.preview.removeEventListener('mouseleave', this._boundMouseLeave);\n this.preview.removeEventListener('click', this._boundClick);\n document.removeEventListener('keydown', this._boundKeyDown);\n // Remove cursor tracking listeners\n this.editor.removeEventListener('input', this._boundCursorUpdate);\n this.editor.removeEventListener('mouseup', this._boundCursorUpdate);\n this.editor.removeEventListener('keyup', this._boundCursorUpdate);\n }\n\n /**\n * Refresh the plugin (rescan blocks and update positions)\n */\n public refresh(): void {\n this.scanBlocks();\n }\n\n /**\n * Get the currently selected block\n */\n public getSelectedBlock(): BlockHandle | null {\n return this.selectedBlockId ? this.blocks.get(this.selectedBlockId) || null : null;\n }\n\n /**\n * Get all blocks\n */\n public getAllBlocks(): BlockHandle[] {\n return Array.from(this.blocks.values());\n }\n\n /**\n * Clean up and remove the plugin\n */\n public destroy(): void {\n this.disable();\n }\n}\n"],"names":["BlockHandlesPlugin","editor","preview","config","wrapper","element","el","blockId","blockType","lineStart","lineEnd","handle","e","related","block","blockRect","previewRect","top","_block","clientX","clientY","handleReach","rect","elementUnder","blockElement","cursorPos","lineIndex","foundBlockId","prevBlock","selected","color","keepSelected","content","err","lines","existingMenu","menu","label","action","icon","item","closeMenu","message","type","toast"],"mappings":"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"}
@@ -3,8 +3,6 @@
3
3
  *
4
4
  * Collection of plugins that extend Marzipan's functionality.
5
5
  */
6
- export { BlockHandlesPlugin } from './block-handles';
7
- export type { BlockHandle, BlockHandlesConfig } from './block-handles';
8
6
  export { accentSwatchPlugin, accentSwatchStyles } from './accentSwatchPlugin';
9
7
  export { imageManagerPlugin, imageManagerStyles } from './imageManagerPlugin';
10
8
  export { imagePickerPlugin } from './imagePickerPlugin';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAG3E,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAG3E,OAAO,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,YAAY,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
@@ -1,32 +1,30 @@
1
- import { BlockHandlesPlugin as i } from "./block-handles.js";
2
- import { accentSwatchPlugin as o, accentSwatchStyles as l } from "./accentSwatchPlugin.js";
3
- import { imageManagerPlugin as g, imageManagerStyles as n } from "./imageManagerPlugin.js";
4
- import { imagePickerPlugin as P } from "./imagePickerPlugin.js";
5
- import { mermaidPlugin as x } from "./mermaidPlugin.js";
6
- import { mermaidExternalPlugin as p } from "./mermaidExternal.js";
7
- import { tablePlugin as s } from "./tablePlugin.js";
8
- import { tableGridPlugin as d, tableGridStyles as h } from "./tableGridPlugin.js";
9
- import { tableGeneratorPlugin as S } from "./tableGenerator.js";
10
- import { tinyHighlightPlugin as w, tinyHighlightStyles as G } from "./tinyHighlight.js";
11
- import { b as M, r as v } from "../table-DMIy93NJ.js";
12
- import { imagePickerPlugin as B } from "./imagePicker.js";
1
+ import { accentSwatchPlugin as i, accentSwatchStyles as t } from "./accentSwatchPlugin.js";
2
+ import { imageManagerPlugin as a, imageManagerStyles as l } from "./imageManagerPlugin.js";
3
+ import { imagePickerPlugin as n } from "./imagePickerPlugin.js";
4
+ import { mermaidPlugin as P } from "./mermaidPlugin.js";
5
+ import { mermaidExternalPlugin as x } from "./mermaidExternal.js";
6
+ import { tablePlugin as p } from "./tablePlugin.js";
7
+ import { tableGridPlugin as s, tableGridStyles as b } from "./tableGridPlugin.js";
8
+ import { tableGeneratorPlugin as h } from "./tableGenerator.js";
9
+ import { tinyHighlightPlugin as S, tinyHighlightStyles as k } from "./tinyHighlight.js";
10
+ import { b as G, r as M } from "../table-DMIy93NJ.js";
11
+ import { imagePickerPlugin as H } from "./imagePicker.js";
13
12
  export {
14
- i as BlockHandlesPlugin,
15
- o as accentSwatchPlugin,
16
- l as accentSwatchStyles,
17
- M as buildTableMarkdown,
18
- B as coreImagePickerPlugin,
19
- g as imageManagerPlugin,
20
- n as imageManagerStyles,
21
- P as imagePickerPlugin,
22
- p as mermaidExternalPlugin,
23
- x as mermaidPlugin,
24
- v as resolvePositiveInteger,
25
- S as tableGeneratorPlugin,
26
- d as tableGridPlugin,
27
- h as tableGridStyles,
28
- s as tablePlugin,
29
- w as tinyHighlightPlugin,
30
- G as tinyHighlightStyles
13
+ i as accentSwatchPlugin,
14
+ t as accentSwatchStyles,
15
+ G as buildTableMarkdown,
16
+ H as coreImagePickerPlugin,
17
+ a as imageManagerPlugin,
18
+ l as imageManagerStyles,
19
+ n as imagePickerPlugin,
20
+ x as mermaidExternalPlugin,
21
+ P as mermaidPlugin,
22
+ M as resolvePositiveInteger,
23
+ h as tableGeneratorPlugin,
24
+ s as tableGridPlugin,
25
+ b as tableGridStyles,
26
+ p as tablePlugin,
27
+ S as tinyHighlightPlugin,
28
+ k as tinyHighlightStyles
31
29
  };
32
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -4,7 +4,7 @@ function u(s) {
4
4
  const m = async (t) => {
5
5
  const n = t.querySelectorAll("pre code.language-mermaid");
6
6
  if (!n.length) return;
7
- const l = await import("../mermaid.core-KR6iXUBd.js").then((a) => a.bE);
7
+ const l = await import("../mermaid.core-cSWK5aGH.js").then((a) => a.bE);
8
8
  r ?? (r = l.default), r.initialize({
9
9
  startOnLoad: !1,
10
10
  theme: document.documentElement.classList.contains("dark") ? "dark" : "default",
@@ -1 +1 @@
1
- {"version":3,"file":"tinyHighlight.d.ts","sourceRoot":"","sources":["../../src/plugins/tinyHighlight.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;CACxF,CAAC;AA6FF,wBAAgB,mBAAmB,KACzB,QAAQ,YAAY,UAqB7B;AAGD,eAAO,MAAM,mBAAmB,2nBAc/B,CAAC"}
1
+ {"version":3,"file":"tinyHighlight.d.ts","sourceRoot":"","sources":["../../src/plugins/tinyHighlight.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;CACxF,CAAC;AA4HF,wBAAgB,mBAAmB,KACzB,QAAQ,YAAY,UAqB7B;AAGD,eAAO,MAAM,mBAAmB,2nBAc/B,CAAC"}