@bikdotai/bik-component-library 0.0.838-beta.2 → 0.0.838-beta.4

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 (35) hide show
  1. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +23 -23
  2. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js.map +1 -1
  3. package/dist/cjs/components/agent-builder/components/AiTextArea.js +1 -1
  4. package/dist/cjs/components/agent-builder/components/AiTextArea.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js +2 -2
  6. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  7. package/dist/cjs/components/bik-chatbot/components/ChatWindow.js +20 -20
  8. package/dist/cjs/components/bik-chatbot/components/ChatWindow.js.map +1 -1
  9. package/dist/cjs/editor/BikEditor.js +1 -1
  10. package/dist/cjs/editor/BikEditor.js.map +1 -1
  11. package/dist/cjs/editor/BikEditor.utils.js +3 -3
  12. package/dist/cjs/editor/BikEditor.utils.js.map +1 -1
  13. package/dist/cjs/editor/extensions/buildExtensions.js +2 -2
  14. package/dist/cjs/editor/extensions/buildExtensions.js.map +1 -1
  15. package/dist/cjs/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js +2 -0
  16. package/dist/cjs/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js.map +1 -0
  17. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +144 -143
  18. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js.map +1 -1
  19. package/dist/esm/components/agent-builder/components/AiTextArea.js +24 -23
  20. package/dist/esm/components/agent-builder/components/AiTextArea.js.map +1 -1
  21. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js +31 -30
  22. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  23. package/dist/esm/components/bik-chatbot/components/ChatWindow.js +54 -53
  24. package/dist/esm/components/bik-chatbot/components/ChatWindow.js.map +1 -1
  25. package/dist/esm/editor/BikEditor.js +122 -118
  26. package/dist/esm/editor/BikEditor.js.map +1 -1
  27. package/dist/esm/editor/BikEditor.utils.d.ts +1 -1
  28. package/dist/esm/editor/BikEditor.utils.js +111 -111
  29. package/dist/esm/editor/BikEditor.utils.js.map +1 -1
  30. package/dist/esm/editor/extensions/buildExtensions.js +29 -25
  31. package/dist/esm/editor/extensions/buildExtensions.js.map +1 -1
  32. package/dist/esm/editor/extensions/htmlTagStrip/HtmlTagStripExtension.d.ts +15 -0
  33. package/dist/esm/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js +32 -0
  34. package/dist/esm/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js.map +1 -0
  35. package/package.json +1 -1
@@ -1,84 +1,88 @@
1
1
  import { jsxs as g, jsx as h } from "react/jsx-runtime";
2
- import { getMarkRange as kt } from "../node_modules/@tiptap/core/dist/index.js";
3
- import { useEditor as yt, EditorContent as Bt } from "@tiptap/react";
4
- import { forwardRef as bt, useState as G, useRef as a, useEffect as xt, useImperativeHandle as vt } from "react";
5
- import { BodyCaption as K } from "../components/TypographyStyle.js";
6
- import { BikEditorShell as At, BikJsonHeader as Tt, BikJsonError as Et } from "./BikEditor.styles.js";
7
- import { DEFAULT_FORMAT_STATE as X } from "./BikEditor.types.js";
8
- import { buildJsonCodeBlockHtml as Rt, buildSectionedContent as Y, normalizeHtml as i, extractActiveFormats as tt, extractContent as et, parseJson as p, getCodeBlockText as d, extractBodyContent as It, extractSectionContent as Lt, setCodeBlockText as b, findSectionEndPos as nt, findSectionStartPos as Mt, setSectionContentInEditor as T, insertInlineHtml as Ot } from "./BikEditor.utils.js";
9
- import { buildExtensions as Jt } from "./extensions/buildExtensions.js";
10
- import { LinkBubbleMenu as Ft } from "./floating/LinkBubbleMenu.js";
11
- import Nt from "../icons/BIK AI specific/WandSparkles.js";
12
- import jt from "../icons/Actions/Formatting/Copy.js";
13
- function zt(y) {
14
- return Object.entries(y).map(
2
+ import { getMarkRange as yt } from "../node_modules/@tiptap/core/dist/index.js";
3
+ import { useEditor as Bt, EditorContent as bt } from "@tiptap/react";
4
+ import { forwardRef as xt, useCallback as vt, useState as K, useRef as a, useEffect as At, useImperativeHandle as Et } from "react";
5
+ import { BodyCaption as X } from "../components/TypographyStyle.js";
6
+ import { sanitizeEmailHtml as Rt, sanitizeBasicHtml as Tt } from "../helpers/sanitize.js";
7
+ import { BikEditorShell as It, BikJsonHeader as Lt, BikJsonError as Mt } from "./BikEditor.styles.js";
8
+ import { DEFAULT_FORMAT_STATE as Y } from "./BikEditor.types.js";
9
+ import { normalizeHtml as Ot, buildJsonCodeBlockHtml as Jt, buildSectionedContent as tt, extractActiveFormats as et, extractContent as nt, parseJson as p, getCodeBlockText as d, extractBodyContent as zt, extractSectionContent as Ft, setCodeBlockText as b, findSectionEndPos as ot, findSectionStartPos as Ht, setSectionContentInEditor as E, insertInlineHtml as Nt } from "./BikEditor.utils.js";
10
+ import { buildExtensions as jt } from "./extensions/buildExtensions.js";
11
+ import { LinkBubbleMenu as Pt } from "./floating/LinkBubbleMenu.js";
12
+ import wt from "../icons/BIK AI specific/WandSparkles.js";
13
+ import Dt from "../icons/Actions/Formatting/Copy.js";
14
+ function qt(B) {
15
+ return Object.entries(B).map(
15
16
  ([x, S]) => `${x.replace(/([A-Z])/g, (k) => `-${k.toLowerCase()}`)}:${S}`
16
17
  ).join(";");
17
18
  }
18
- const Ht = (y, x) => {
19
+ const Ut = (B, x) => {
19
20
  const {
20
21
  initialContent: S,
21
22
  sections: k,
22
- features: B,
23
- disabled: ot,
24
- maxCharacters: E,
25
- characterLimit: rt,
26
- shortcuts: st,
27
- sendShortcut: it,
23
+ features: y,
24
+ disabled: rt,
25
+ maxCharacters: R,
26
+ characterLimit: st,
27
+ shortcuts: it,
28
+ sendShortcut: ct,
28
29
  mentions: l,
29
30
  slashCommands: C,
30
- link: ct,
31
- onPaste: at,
32
- onReady: R,
31
+ link: at,
32
+ onPaste: lt,
33
+ onReady: T,
33
34
  onChange: I,
34
35
  onSend: v,
35
36
  onFocus: L,
36
37
  onBlur: M,
37
38
  onSelectionChange: O,
38
- minHeight: lt,
39
- maxHeight: dt,
40
- style: ut,
41
- className: mt,
39
+ minHeight: dt,
40
+ maxHeight: ut,
41
+ style: mt,
42
+ className: ft,
42
43
  editorClassName: J,
43
- editorStyle: F,
44
- renderJsonError: N
45
- } = y, m = !!B?.jsonMode, [u, j] = G(null), [ft, z] = G(!1), gt = m ? Rt(S ?? "") : k?.length ? Y(
44
+ editorStyle: z,
45
+ renderJsonError: F
46
+ } = B, m = !!y?.jsonMode, H = !!y?.richPaste ? Rt : Tt, i = vt(
47
+ (t) => Ot(t, H),
48
+ [H]
49
+ ), [u, N] = K(null), [gt, j] = K(!1), ht = m ? Jt(S ?? "") : k?.length ? tt(
46
50
  i(S ?? ""),
47
51
  k.map((t) => ({ ...t, content: i(t.content) }))
48
- ) : i(S ?? ""), A = a([]), H = a(!1), w = a(R);
49
- w.current = R;
50
- const P = a(I);
51
- P.current = I;
52
- const D = a(O);
53
- D.current = O;
54
- const q = a(X), U = a(L);
55
- U.current = L;
56
- const W = a(M);
57
- W.current = M;
58
- const $ = a(v);
59
- $.current = v;
60
- const V = a(l?.agents ?? []);
61
- V.current = l?.agents ?? [];
62
- const _ = a(l?.teams ?? []);
63
- _.current = l?.teams ?? [];
64
- const Q = a(C?.items ?? []);
65
- Q.current = C?.items ?? [];
66
- const n = yt({
67
- extensions: Jt({
68
- features: B,
69
- placeholder: y.placeholder,
70
- maxCharacters: E,
71
- characterLimit: rt,
52
+ ) : i(S ?? ""), A = a([]), P = a(!1), w = a(T);
53
+ w.current = T;
54
+ const D = a(I);
55
+ D.current = I;
56
+ const q = a(O);
57
+ q.current = O;
58
+ const U = a(Y), W = a(L);
59
+ W.current = L;
60
+ const $ = a(M);
61
+ $.current = M;
62
+ const V = a(v);
63
+ V.current = v;
64
+ const _ = a(l?.agents ?? []);
65
+ _.current = l?.agents ?? [];
66
+ const Q = a(l?.teams ?? []);
67
+ Q.current = l?.teams ?? [];
68
+ const Z = a(C?.items ?? []);
69
+ Z.current = C?.items ?? [];
70
+ const n = Bt({
71
+ extensions: jt({
72
+ features: y,
73
+ placeholder: B.placeholder,
74
+ maxCharacters: R,
75
+ characterLimit: st,
72
76
  hasSections: (k?.length ?? 0) > 0,
73
77
  mentions: {
74
- agents: l ? V : void 0,
75
- teams: l ? _ : void 0
78
+ agents: l ? _ : void 0,
79
+ teams: l ? Q : void 0
76
80
  },
77
- slashCommands: C ? Q : void 0,
78
- onPaste: at,
79
- onSend: v ? (t) => $.current?.(t) : void 0,
80
- sendShortcut: it,
81
- shortcuts: st,
81
+ slashCommands: C ? Z : void 0,
82
+ onPaste: lt,
83
+ onSend: v ? (t) => V.current?.(t) : void 0,
84
+ sendShortcut: ct,
85
+ shortcuts: it,
82
86
  onMentionSelected: l?.onSelect,
83
87
  onSlashCommandSelected: C?.onSelect,
84
88
  renderMentionItem: l?.renderItem,
@@ -87,38 +91,38 @@ const Ht = (y, x) => {
87
91
  renderSlashCommandItem: C?.renderItem,
88
92
  renderSlashCommandDropdown: C?.renderDropdown
89
93
  }),
90
- content: gt,
91
- editable: !ot,
94
+ content: ht,
95
+ editable: !rt,
92
96
  immediatelyRender: !1,
93
97
  // SSR-safe — NEVER remove this
94
98
  editorProps: {
95
99
  attributes: {
96
100
  ...J ? { class: J } : {},
97
- ...F ? { style: zt(F) } : {}
101
+ ...z ? { style: qt(z) } : {}
98
102
  }
99
103
  },
100
104
  onUpdate: ({ editor: t }) => {
101
- if (P.current?.(et(t)), m) {
105
+ if (D.current?.(nt(t)), m) {
102
106
  const e = p(d(t));
103
- j(e.valid ? null : e);
107
+ N(e.valid ? null : e);
104
108
  }
105
109
  },
106
110
  onTransaction: ({ editor: t }) => {
107
- const e = tt(t), o = q.current;
108
- (o.bold !== e.bold || o.italic !== e.italic || o.underline !== e.underline || o.strike !== e.strike || o.bulletList !== e.bulletList || o.orderedList !== e.orderedList || o.blockquote !== e.blockquote || o.codeBlock !== e.codeBlock || o.superscript !== e.superscript || o.subscript !== e.subscript || o.textAlign !== e.textAlign || o.fontFamily !== e.fontFamily || o.fontSize !== e.fontSize || o.color !== e.color || o.highlight !== e.highlight || o.link?.href !== e.link?.href) && (q.current = e, D.current?.(e));
111
+ const e = et(t), o = U.current;
112
+ (o.bold !== e.bold || o.italic !== e.italic || o.underline !== e.underline || o.strike !== e.strike || o.bulletList !== e.bulletList || o.orderedList !== e.orderedList || o.blockquote !== e.blockquote || o.codeBlock !== e.codeBlock || o.superscript !== e.superscript || o.subscript !== e.subscript || o.textAlign !== e.textAlign || o.fontFamily !== e.fontFamily || o.fontSize !== e.fontSize || o.color !== e.color || o.highlight !== e.highlight || o.link?.href !== e.link?.href) && (U.current = e, q.current?.(e));
109
113
  },
110
- onFocus: () => U.current?.(),
111
- onBlur: () => W.current?.()
114
+ onFocus: () => W.current?.(),
115
+ onBlur: () => $.current?.()
112
116
  });
113
117
  function s(t) {
114
118
  n ? t(n) : A.current.push(t);
115
119
  }
116
- xt(() => {
117
- if (n && (A.current.length > 0 && A.current.splice(0).forEach((e) => e(n)), H.current || (H.current = !0, w.current?.()), m)) {
120
+ At(() => {
121
+ if (n && (A.current.length > 0 && A.current.splice(0).forEach((e) => e(n)), P.current || (P.current = !0, w.current?.()), m)) {
118
122
  const t = p(d(n));
119
- j(t.valid ? null : t);
123
+ N(t.valid ? null : t);
120
124
  }
121
- }, [n, m]), vt(
125
+ }, [n, m]), Et(
122
126
  x,
123
127
  () => ({
124
128
  // ── Focus ────────────────────────────────────────────────────────
@@ -135,7 +139,7 @@ const Ht = (y, x) => {
135
139
  s((o) => o.commands.insertContent(e));
136
140
  },
137
141
  insertInlineContent: (t) => {
138
- s((e) => Ot(e, t));
142
+ s((e) => Nt(e, t));
139
143
  },
140
144
  insertAtStart: (t) => {
141
145
  const e = i(t);
@@ -160,7 +164,7 @@ const Ht = (y, x) => {
160
164
  appendContent(t) {
161
165
  this.appendInline(t);
162
166
  },
163
- getContent: () => n ? et(n) : { html: "", text: "", isEmpty: !0, characterCount: 0 },
167
+ getContent: () => n ? nt(n) : { html: "", text: "", isEmpty: !0, characterCount: 0 },
164
168
  getJSON: () => n?.getJSON() ?? null,
165
169
  getMentions: () => {
166
170
  const t = /* @__PURE__ */ new Set(), e = /* @__PURE__ */ new Set();
@@ -185,7 +189,7 @@ const Ht = (y, x) => {
185
189
  return t.doc.textBetween(e, o, " ");
186
190
  const c = t.schema.marks.link;
187
191
  if (c) {
188
- const f = kt(t.doc.resolve(e), c);
192
+ const f = yt(t.doc.resolve(e), c);
189
193
  if (f)
190
194
  return t.doc.textBetween(f.from, f.to, " ");
191
195
  }
@@ -194,13 +198,13 @@ const Ht = (y, x) => {
194
198
  // ── Character count ───────────────────────────────────────────────
195
199
  getCharacterCount: () => ({
196
200
  count: n?.storage.characterCount?.characters?.() ?? n?.getText().length ?? 0,
197
- limit: E ?? null
201
+ limit: R ?? null
198
202
  }),
199
203
  // ── Sections ─────────────────────────────────────────────────────
200
- getSectionContent: (t) => n ? Lt(n, t) : { html: "", text: "", isEmpty: !0, characterCount: 0 },
204
+ getSectionContent: (t) => n ? Ft(n, t) : { html: "", text: "", isEmpty: !0, characterCount: 0 },
201
205
  setSectionContent: (t, e) => {
202
206
  const o = i(e);
203
- s((r) => T(r, t, o));
207
+ s((r) => E(r, t, o));
204
208
  },
205
209
  focusSection: (t) => {
206
210
  s((e) => {
@@ -217,16 +221,16 @@ const Ht = (y, x) => {
217
221
  });
218
222
  },
219
223
  clearSection: (t) => {
220
- s((e) => T(e, t, "<p></p>"));
224
+ s((e) => E(e, t, "<p></p>"));
221
225
  },
222
226
  // ── Convenience body shorthands ───────────────────────────────────
223
- getBodyContent: () => n ? It(n) : { html: "", text: "", isEmpty: !0, characterCount: 0 },
227
+ getBodyContent: () => n ? zt(n) : { html: "", text: "", isEmpty: !0, characterCount: 0 },
224
228
  setBodyContent: (t) => {
225
229
  const e = i(t);
226
- s((o) => T(o, "body", e));
230
+ s((o) => E(o, "body", e));
227
231
  },
228
232
  setBodyAndSections: (t, e) => {
229
- const o = Y(
233
+ const o = tt(
230
234
  i(t),
231
235
  e.map((r) => ({
232
236
  id: r.id,
@@ -238,7 +242,7 @@ const Ht = (y, x) => {
238
242
  appendBodyContent: (t) => {
239
243
  const e = i(t);
240
244
  s((o) => {
241
- const r = nt(o, "body");
245
+ const r = ot(o, "body");
242
246
  o.commands.insertContentAt(r - 1, e, {
243
247
  parseOptions: { preserveWhitespace: !0 }
244
248
  });
@@ -247,7 +251,7 @@ const Ht = (y, x) => {
247
251
  insertAtSectionStart: (t, e) => {
248
252
  const o = i(e);
249
253
  s((r) => {
250
- const c = Mt(r, t);
254
+ const c = Ht(r, t);
251
255
  c !== -1 && r.commands.insertContentAt(c, o, {
252
256
  parseOptions: { preserveWhitespace: !0 }
253
257
  });
@@ -256,14 +260,14 @@ const Ht = (y, x) => {
256
260
  insertAtSectionEnd: (t, e) => {
257
261
  const o = i(e);
258
262
  s((r) => {
259
- const c = nt(r, t);
263
+ const c = ot(r, t);
260
264
  r.commands.insertContentAt(c, o, {
261
265
  parseOptions: { preserveWhitespace: !0 }
262
266
  });
263
267
  });
264
268
  },
265
269
  // ── Formats & actions ─────────────────────────────────────────────
266
- getActiveFormats: () => n ? tt(n) : X,
270
+ getActiveFormats: () => n ? et(n) : Y,
267
271
  actions: {
268
272
  toggleBold: () => n?.chain().focus().toggleBold().run(),
269
273
  toggleItalic: () => n?.chain().focus().toggleItalic().run(),
@@ -282,12 +286,12 @@ const Ht = (y, x) => {
282
286
  unsetHighlight: () => n?.chain().focus().unsetHighlight().run(),
283
287
  setLink: (t, e) => {
284
288
  n && (e !== void 0 ? n.chain().focus().extendMarkRange("link").command(({ tr: o, state: r }) => {
285
- const { from: c, to: f } = o.selection, Z = r.schema.marks.link;
286
- if (!Z) return !1;
287
- const Ct = r.schema.text(e, [
288
- Z.create({ href: t })
289
- ]), St = r.schema.text(" ");
290
- return o.replaceWith(c, f, [Ct, St]), !0;
289
+ const { from: c, to: f } = o.selection, G = r.schema.marks.link;
290
+ if (!G) return !1;
291
+ const St = r.schema.text(e, [
292
+ G.create({ href: t })
293
+ ]), kt = r.schema.text(" ");
294
+ return o.replaceWith(c, f, [St, kt]), !0;
291
295
  }).run() : n.chain().focus().extendMarkRange("link").setLink({ href: t }).insertContent(" ").run());
292
296
  },
293
297
  updateLink: (t) => n?.chain().focus().extendMarkRange("link").setLink({ href: t }).run(),
@@ -304,7 +308,7 @@ const Ht = (y, x) => {
304
308
  insertImage: (t) => n?.chain().focus().setImage({ src: t }).run()
305
309
  },
306
310
  // ── JSON body ─────────────────────────────────────────────────────
307
- json: B?.jsonMode ? {
311
+ json: y?.jsonMode ? {
308
312
  getText: () => n ? d(n) : "",
309
313
  setText: (t) => s((e) => b(e, t)),
310
314
  parse: () => p(n ? d(n) : ""),
@@ -322,48 +326,48 @@ const Ht = (y, x) => {
322
326
  // eslint-disable-next-line react-hooks/exhaustive-deps
323
327
  [n]
324
328
  );
325
- const ht = () => {
329
+ const pt = () => {
326
330
  if (!n) return;
327
331
  const { valid: t, value: e } = p(d(n));
328
332
  !t || e === null || b(n, JSON.stringify(e, null, 2));
329
- }, pt = () => {
330
- n && (navigator.clipboard?.writeText(d(n)), z(!0), setTimeout(() => z(!1), 1500));
333
+ }, Ct = () => {
334
+ n && (navigator.clipboard?.writeText(d(n)), j(!0), setTimeout(() => j(!1), 1500));
331
335
  };
332
336
  return n ? /* @__PURE__ */ g(
333
- At,
337
+ It,
334
338
  {
335
- minHeight: lt,
336
- maxHeight: dt,
337
- tightParagraphs: !B?.richPaste,
339
+ minHeight: dt,
340
+ maxHeight: ut,
341
+ tightParagraphs: !y?.richPaste,
338
342
  jsonMode: m,
339
- style: ut,
340
- className: mt,
343
+ style: mt,
344
+ className: ft,
341
345
  children: [
342
- m && /* @__PURE__ */ g(Tt, { children: [
346
+ m && /* @__PURE__ */ g(Lt, { children: [
343
347
  /* @__PURE__ */ h("span", { className: "bik-json-header-label", children: "JSON" }),
344
348
  /* @__PURE__ */ g("div", { className: "bik-json-header-actions", children: [
345
349
  /* @__PURE__ */ g(
346
350
  "button",
347
351
  {
348
352
  type: "button",
349
- onClick: ht,
353
+ onClick: pt,
350
354
  disabled: !!u,
351
355
  title: "Format JSON",
352
356
  children: [
353
- /* @__PURE__ */ h(Nt, { size: 16 }),
354
- /* @__PURE__ */ h(K, { children: "Beautify" })
357
+ /* @__PURE__ */ h(wt, { size: 16 }),
358
+ /* @__PURE__ */ h(X, { children: "Beautify" })
355
359
  ]
356
360
  }
357
361
  ),
358
- /* @__PURE__ */ g("button", { type: "button", onClick: pt, title: "Copy JSON", children: [
359
- /* @__PURE__ */ h(jt, { size: 16 }),
360
- ft && /* @__PURE__ */ h(K, { children: "Copied" })
362
+ /* @__PURE__ */ g("button", { type: "button", onClick: Ct, title: "Copy JSON", children: [
363
+ /* @__PURE__ */ h(Dt, { size: 16 }),
364
+ gt && /* @__PURE__ */ h(X, { children: "Copied" })
361
365
  ] })
362
366
  ] })
363
367
  ] }),
364
- /* @__PURE__ */ h(Bt, { editor: n }),
365
- /* @__PURE__ */ h(Ft, { editor: n, renderLinkTooltip: ct?.renderTooltip }),
366
- m && u ? N ? N(u) : /* @__PURE__ */ g(Et, { children: [
368
+ /* @__PURE__ */ h(bt, { editor: n }),
369
+ /* @__PURE__ */ h(Pt, { editor: n, renderLinkTooltip: at?.renderTooltip }),
370
+ m && u ? F ? F(u) : /* @__PURE__ */ g(Mt, { children: [
367
371
  u.line != null && /* @__PURE__ */ g("strong", { children: [
368
372
  "Line ",
369
373
  u.line,
@@ -376,11 +380,11 @@ const Ht = (y, x) => {
376
380
  ]
377
381
  }
378
382
  ) : null;
379
- }, wt = bt(
380
- Ht
383
+ }, Wt = xt(
384
+ Ut
381
385
  );
382
- wt.displayName = "BikEditor";
386
+ Wt.displayName = "BikEditor";
383
387
  export {
384
- wt as BikEditor
388
+ Wt as BikEditor
385
389
  };
386
390
  //# sourceMappingURL=BikEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BikEditor.js","sources":["../../../src/editor/BikEditor.tsx"],"sourcesContent":["'use client';\n\n/**\n * IMPLEMENTATION LAYER — TipTap-specific.\n * If the underlying editor is swapped, this file changes; BikEditor.types.ts and\n * src/editor/index.ts (the consumer contract) do NOT change.\n */\nimport { Editor, getMarkRange } from '@tiptap/core';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport React, {\n\tforwardRef,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport { BodyCaption } from '@src/components/TypographyStyle';\nimport { Copy, WandSparkles } from '../icons';\nimport {\n\tBikEditorShell,\n\tBikJsonError,\n\tBikJsonHeader,\n} from './BikEditor.styles';\nimport {\n\tBikEditorProps,\n\tBikEditorRef,\n\tDEFAULT_FORMAT_STATE,\n\tFormatState,\n\tJsonParseResult,\n} from './BikEditor.types';\nimport {\n\tbuildJsonCodeBlockHtml,\n\tbuildSectionedContent,\n\textractActiveFormats,\n\textractBodyContent,\n\textractContent,\n\textractSectionContent,\n\tfindSectionEndPos,\n\tfindSectionStartPos,\n\tgetCodeBlockText,\n\tinsertInlineHtml,\n\tnormalizeHtml,\n\tparseJson,\n\tsetCodeBlockText,\n\tsetSectionContentInEditor,\n} from './BikEditor.utils';\nimport { buildExtensions } from './extensions/buildExtensions';\nimport { LinkBubbleMenu } from './floating/LinkBubbleMenu';\n\n/** Convert React.CSSProperties to an inline CSS string for editorProps.attributes. */\nfunction cssToString(style: React.CSSProperties): string {\n\treturn Object.entries(style)\n\t\t.map(\n\t\t\t([k, v]) => `${k.replace(/([A-Z])/g, (c) => `-${c.toLowerCase()}`)}:${v}`,\n\t\t)\n\t\t.join(';');\n}\n\nconst BikEditorInner = (\n\tprops: BikEditorProps,\n\tref: React.Ref<BikEditorRef>,\n) => {\n\tconst {\n\t\tinitialContent,\n\t\tsections,\n\t\tfeatures,\n\t\tdisabled,\n\t\tmaxCharacters,\n\t\tcharacterLimit,\n\t\tshortcuts,\n\t\tsendShortcut,\n\t\tmentions,\n\t\tslashCommands,\n\t\tlink,\n\t\tonPaste,\n\t\tonReady,\n\t\tonChange,\n\t\tonSend,\n\t\tonFocus,\n\t\tonBlur,\n\t\tonSelectionChange,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tstyle,\n\t\tclassName,\n\t\teditorClassName,\n\t\teditorStyle,\n\t\trenderJsonError,\n\t} = props;\n\n\tconst isJsonMode = !!features?.jsonMode;\n\n\t// Live JSON parse error, shown inside the editor when jsonMode is on.\n\t// null = valid (or not applicable) → nothing rendered.\n\tconst [jsonError, setJsonError] = useState<JsonParseResult | null>(null);\n\t// Transient \"Copied\" state for the jsonMode copy button.\n\tconst [jsonCopied, setJsonCopied] = useState(false);\n\n\t// JSON body mode: treat initialContent as raw JSON text and wrap it in a code\n\t// block. Skips section/HTML normalisation entirely.\n\tconst initialEditorContent = isJsonMode\n\t\t? buildJsonCodeBlockHtml(initialContent ?? '')\n\t\t: sections?.length\n\t\t? buildSectionedContent(\n\t\t\t\tnormalizeHtml(initialContent ?? ''),\n\t\t\t\tsections.map((s) => ({ ...s, content: normalizeHtml(s.content) })),\n\t\t )\n\t\t: normalizeHtml(initialContent ?? '');\n\n\t// ── Command queue ─────────────────────────────────────────────────────────\n\t// TipTap's useEditor initializes asynchronously; the editor instance is null\n\t// until the first commit. Any imperative method called before the editor is\n\t// ready is enqueued here and flushed automatically once it becomes non-null.\n\t// Consumers never need setTimeout or readiness guards.\n\tconst pendingQueue = useRef<Array<(e: Editor) => void>>([]);\n\tconst hasCalledOnReady = useRef(false);\n\t// Keep stable refs to all callbacks so useEditor receives the same function\n\t// identity on every render — prevents TipTap from re-registering event\n\t// handlers every time the parent re-renders with new inline function props.\n\tconst onReadyRef = useRef(onReady);\n\tonReadyRef.current = onReady;\n\tconst onChangeRef = useRef(onChange);\n\tonChangeRef.current = onChange;\n\tconst onSelectionChangeRef = useRef(onSelectionChange);\n\tonSelectionChangeRef.current = onSelectionChange;\n\tconst prevFormatsRef = useRef<FormatState>(DEFAULT_FORMAT_STATE);\n\tconst onFocusRef = useRef(onFocus);\n\tonFocusRef.current = onFocus;\n\tconst onBlurRef = useRef(onBlur);\n\tonBlurRef.current = onBlur;\n\tconst onSendRef = useRef(onSend);\n\tonSendRef.current = onSend;\n\tconst agentMentionsRef = useRef(mentions?.agents ?? []);\n\tagentMentionsRef.current = mentions?.agents ?? [];\n\tconst teamMentionsRef = useRef(mentions?.teams ?? []);\n\tteamMentionsRef.current = mentions?.teams ?? [];\n\tconst slashCommandsRef = useRef(slashCommands?.items ?? []);\n\tslashCommandsRef.current = slashCommands?.items ?? [];\n\n\tconst editor = useEditor({\n\t\textensions: buildExtensions({\n\t\t\tfeatures,\n\t\t\tplaceholder: props.placeholder,\n\t\t\tmaxCharacters,\n\t\t\tcharacterLimit,\n\t\t\thasSections: (sections?.length ?? 0) > 0,\n\t\t\tmentions: {\n\t\t\t\tagents: mentions ? agentMentionsRef : undefined,\n\t\t\t\tteams: mentions ? teamMentionsRef : undefined,\n\t\t\t},\n\t\t\tslashCommands: slashCommands ? slashCommandsRef : undefined,\n\t\t\tonPaste,\n\t\t\tonSend: onSend ? (snapshot) => onSendRef.current?.(snapshot) : undefined,\n\t\t\tsendShortcut,\n\t\t\tshortcuts,\n\t\t\tonMentionSelected: mentions?.onSelect,\n\t\t\tonSlashCommandSelected: slashCommands?.onSelect,\n\t\t\trenderMentionItem: mentions?.renderItem,\n\t\t\trenderMentionDropdown: mentions?.renderDropdown,\n\t\t\tremoveMentionTriggerOnDismiss: mentions?.removeTriggerOnDismiss,\n\t\t\trenderSlashCommandItem: slashCommands?.renderItem,\n\t\t\trenderSlashCommandDropdown: slashCommands?.renderDropdown,\n\t\t}),\n\t\tcontent: initialEditorContent,\n\t\teditable: !disabled,\n\t\timmediatelyRender: false, // SSR-safe — NEVER remove this\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\t...(editorClassName ? { class: editorClassName } : {}),\n\t\t\t\t...(editorStyle ? { style: cssToString(editorStyle) } : {}),\n\t\t\t},\n\t\t},\n\t\tonUpdate: ({ editor: e }) => {\n\t\t\tonChangeRef.current?.(extractContent(e));\n\t\t\tif (isJsonMode) {\n\t\t\t\tconst result = parseJson(getCodeBlockText(e));\n\t\t\t\tsetJsonError(result.valid ? null : result);\n\t\t\t}\n\t\t},\n\t\tonTransaction: ({ editor: e }) => {\n\t\t\tconst next = extractActiveFormats(e);\n\t\t\tconst prev = prevFormatsRef.current;\n\t\t\tconst changed =\n\t\t\t\tprev.bold !== next.bold ||\n\t\t\t\tprev.italic !== next.italic ||\n\t\t\t\tprev.underline !== next.underline ||\n\t\t\t\tprev.strike !== next.strike ||\n\t\t\t\tprev.bulletList !== next.bulletList ||\n\t\t\t\tprev.orderedList !== next.orderedList ||\n\t\t\t\tprev.blockquote !== next.blockquote ||\n\t\t\t\tprev.codeBlock !== next.codeBlock ||\n\t\t\t\tprev.superscript !== next.superscript ||\n\t\t\t\tprev.subscript !== next.subscript ||\n\t\t\t\tprev.textAlign !== next.textAlign ||\n\t\t\t\tprev.fontFamily !== next.fontFamily ||\n\t\t\t\tprev.fontSize !== next.fontSize ||\n\t\t\t\tprev.color !== next.color ||\n\t\t\t\tprev.highlight !== next.highlight ||\n\t\t\t\tprev.link?.href !== next.link?.href;\n\t\t\tif (changed) {\n\t\t\t\tprevFormatsRef.current = next;\n\t\t\t\tonSelectionChangeRef.current?.(next);\n\t\t\t}\n\t\t},\n\t\tonFocus: () => onFocusRef.current?.(),\n\t\tonBlur: () => onBlurRef.current?.(),\n\t});\n\n\t// ── enqueue ───────────────────────────────────────────────────────────────\n\t// Run immediately if the editor is ready; otherwise defer to the queue.\n\t// Closures passed to enqueue MUST capture all parameters explicitly —\n\t// they must NOT close over `editor` (which would be null at enqueue time).\n\tfunction enqueue(op: (e: Editor) => void): void {\n\t\tif (editor) {\n\t\t\top(editor);\n\t\t} else {\n\t\t\tpendingQueue.current.push(op);\n\t\t}\n\t}\n\n\t// Flush the pending queue and fire onReady when editor transitions null → ready.\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\t\tif (pendingQueue.current.length > 0) {\n\t\t\tconst queue = pendingQueue.current.splice(0);\n\t\t\tqueue.forEach((op) => op(editor));\n\t\t}\n\t\tif (!hasCalledOnReady.current) {\n\t\t\thasCalledOnReady.current = true;\n\t\t\tonReadyRef.current?.();\n\t\t}\n\t\t// Surface an error for invalid initialContent immediately on mount.\n\t\tif (isJsonMode) {\n\t\t\tconst result = parseJson(getCodeBlockText(editor));\n\t\t\tsetJsonError(result.valid ? null : result);\n\t\t}\n\t}, [editor, isJsonMode]);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\t// ── Focus ────────────────────────────────────────────────────────\n\t\t\tfocus: (position) => enqueue((e) => e.commands.focus(position)),\n\t\t\tblur: () => enqueue((e) => e.commands.blur()),\n\n\t\t\t// ── Content ──────────────────────────────────────────────────────\n\t\t\tclearContent: () => enqueue((e) => e.commands.clearContent(true)),\n\t\t\tsetContent: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => e.commands.setContent(normalised, { emitUpdate: true }));\n\t\t\t},\n\t\t\tinsertContent: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => e.commands.insertContent(normalised));\n\t\t\t},\n\t\t\tinsertInlineContent: (html) => {\n\t\t\t\tenqueue((e) => insertInlineHtml(e, html));\n\t\t\t},\n\t\t\tinsertAtStart: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => e.commands.insertContentAt(1, normalised));\n\t\t\t},\n\t\t\tinsertBlock: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) =>\n\t\t\t\t\te.commands.insertContentAt(e.state.doc.content.size, normalised),\n\t\t\t\t);\n\t\t\t},\n\t\t\tappendInline: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\t// doc.content.size is after the last </p> (block boundary).\n\t\t\t\t// Subtract 1 to land inside the last paragraph so text appends\n\t\t\t\t// inline rather than being wrapped in a new paragraph each call.\n\t\t\t\tenqueue((e) =>\n\t\t\t\t\te.commands.insertContentAt(e.state.doc.content.size - 1, normalised),\n\t\t\t\t);\n\t\t\t},\n\t\t\t// Backwards-compatible aliases\n\t\t\tinsertAtEnd(html) {\n\t\t\t\tthis.insertBlock(html);\n\t\t\t},\n\t\t\tappendContent(html) {\n\t\t\t\tthis.appendInline(html);\n\t\t\t},\n\t\t\tgetContent: () =>\n\t\t\t\teditor\n\t\t\t\t\t? extractContent(editor)\n\t\t\t\t\t: { html: '', text: '', isEmpty: true, characterCount: 0 },\n\t\t\tgetJSON: () => editor?.getJSON() ?? null,\n\t\t\tgetMentions: () => {\n\t\t\t\tconst agentIds = new Set<string>();\n\t\t\t\tconst teamIds = new Set<string>();\n\t\t\t\tif (!editor) return { agentIds: [], teamIds: [] };\n\t\t\t\teditor.state.doc.descendants((node) => {\n\t\t\t\t\tif (node.type.name === 'mentionAgent' && node.attrs['id'] != null) {\n\t\t\t\t\t\tagentIds.add(String(node.attrs['id']));\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tnode.type.name === 'mentionTeam' &&\n\t\t\t\t\t\tnode.attrs['id'] != null\n\t\t\t\t\t) {\n\t\t\t\t\t\tteamIds.add(String(node.attrs['id']));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn { agentIds: Array.from(agentIds), teamIds: Array.from(teamIds) };\n\t\t\t},\n\n\t\t\t// ── Selection ────────────────────────────────────────────────────\n\t\t\tgetCursorPosition: () => {\n\t\t\t\tif (!editor) return { from: 0, to: 0 };\n\t\t\t\tconst { from, to } = editor.state.selection;\n\t\t\t\treturn { from, to };\n\t\t\t},\n\t\t\tinsertAtPosition: (pos, html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => e.commands.insertContentAt(pos, normalised));\n\t\t\t},\n\t\t\tgetSelectedText: () => {\n\t\t\t\tif (!editor) return '';\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { from, to, empty } = state.selection;\n\t\t\t\tif (!empty) {\n\t\t\t\t\treturn state.doc.textBetween(from, to, ' ');\n\t\t\t\t}\n\t\t\t\t// When the cursor is inside a link with nothing selected, return the\n\t\t\t\t// full link text — useful for pre-filling a link modal's text field.\n\t\t\t\tconst linkMarkType = state.schema.marks['link'];\n\t\t\t\tif (linkMarkType) {\n\t\t\t\t\tconst range = getMarkRange(state.doc.resolve(from), linkMarkType);\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\treturn state.doc.textBetween(range.from, range.to, ' ');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t},\n\n\t\t\t// ── Character count ───────────────────────────────────────────────\n\t\t\tgetCharacterCount: () => ({\n\t\t\t\tcount:\n\t\t\t\t\teditor?.storage.characterCount?.characters?.() ??\n\t\t\t\t\teditor?.getText().length ??\n\t\t\t\t\t0,\n\t\t\t\tlimit: maxCharacters ?? null,\n\t\t\t}),\n\n\t\t\t// ── Sections ─────────────────────────────────────────────────────\n\t\t\tgetSectionContent: (sectionId) =>\n\t\t\t\teditor\n\t\t\t\t\t? extractSectionContent(editor, sectionId)\n\t\t\t\t\t: { html: '', text: '', isEmpty: true, characterCount: 0 },\n\n\t\t\tsetSectionContent: (sectionId, html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => setSectionContentInEditor(e, sectionId, normalised));\n\t\t\t},\n\n\t\t\tfocusSection: (sectionId) => {\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tif (sectionId === 'body') {\n\t\t\t\t\t\tlet endOfBody = e.state.doc.content.size - 1;\n\t\t\t\t\t\te.state.doc.descendants((node, pos) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tnode.type.name === 'sectionDivider' &&\n\t\t\t\t\t\t\t\tendOfBody === e.state.doc.content.size - 1\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tendOfBody = pos - 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endOfBody === e.state.doc.content.size - 1;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (endOfBody < 1) endOfBody = 1;\n\t\t\t\t\t\te.chain().focus().setTextSelection(endOfBody).run();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet targetPos = -1;\n\t\t\t\t\te.state.doc.descendants((node, pos) => {\n\t\t\t\t\t\tif (targetPos !== -1) return false;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnode.type.name === 'sectionDivider' &&\n\t\t\t\t\t\t\tnode.attrs['sectionId'] === sectionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// pos + nodeSize lands right after the divider;\n\t\t\t\t\t\t\t// +1 more puts us inside the first paragraph of that section.\n\t\t\t\t\t\t\ttargetPos = pos + node.nodeSize + 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (targetPos !== -1) {\n\t\t\t\t\t\te.chain().focus().setTextSelection(targetPos).run();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tclearSection: (sectionId) => {\n\t\t\t\tenqueue((e) => setSectionContentInEditor(e, sectionId, '<p></p>'));\n\t\t\t},\n\n\t\t\t// ── Convenience body shorthands ───────────────────────────────────\n\t\t\tgetBodyContent: () =>\n\t\t\t\teditor\n\t\t\t\t\t? extractBodyContent(editor)\n\t\t\t\t\t: { html: '', text: '', isEmpty: true, characterCount: 0 },\n\t\t\tsetBodyContent: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => setSectionContentInEditor(e, 'body', normalised));\n\t\t\t},\n\t\t\tsetBodyAndSections: (body, sections) => {\n\t\t\t\tconst html = buildSectionedContent(\n\t\t\t\t\tnormalizeHtml(body),\n\t\t\t\t\tsections.map((s) => ({\n\t\t\t\t\t\tid: s.id,\n\t\t\t\t\t\tcontent: normalizeHtml(s.content),\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tenqueue((e) => e.commands.setContent(html, { emitUpdate: true }));\n\t\t\t},\n\t\t\tappendBodyContent: (html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\t// findSectionEndPos returns the position of the first divider (or\n\t\t\t\t// doc.content.size), which is the block boundary after the last </p>.\n\t\t\t\t// Subtract 1 to stay inside the last paragraph so successive calls\n\t\t\t\t// append inline text rather than creating a new paragraph each time.\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tconst boundaryPos = findSectionEndPos(e, 'body');\n\t\t\t\t\te.commands.insertContentAt(boundaryPos - 1, normalised, {\n\t\t\t\t\t\tparseOptions: { preserveWhitespace: true },\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tinsertAtSectionStart: (sectionId, html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tconst pos = findSectionStartPos(e, sectionId);\n\t\t\t\t\tif (pos !== -1)\n\t\t\t\t\t\te.commands.insertContentAt(pos, normalised, {\n\t\t\t\t\t\t\tparseOptions: { preserveWhitespace: true },\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tinsertAtSectionEnd: (sectionId, html) => {\n\t\t\t\tconst normalised = normalizeHtml(html);\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tconst pos = findSectionEndPos(e, sectionId);\n\t\t\t\t\te.commands.insertContentAt(pos, normalised, {\n\t\t\t\t\t\tparseOptions: { preserveWhitespace: true },\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\t// ── Formats & actions ─────────────────────────────────────────────\n\t\t\tgetActiveFormats: () =>\n\t\t\t\teditor ? extractActiveFormats(editor) : DEFAULT_FORMAT_STATE,\n\t\t\tactions: {\n\t\t\t\ttoggleBold: () => editor?.chain().focus().toggleBold().run(),\n\t\t\t\ttoggleItalic: () => editor?.chain().focus().toggleItalic().run(),\n\t\t\t\ttoggleUnderline: () => editor?.chain().focus().toggleUnderline().run(),\n\t\t\t\ttoggleStrike: () => editor?.chain().focus().toggleStrike().run(),\n\t\t\t\ttoggleBulletList: () =>\n\t\t\t\t\teditor?.chain().focus().toggleBulletList().run(),\n\t\t\t\ttoggleOrderedList: () =>\n\t\t\t\t\teditor?.chain().focus().toggleOrderedList().run(),\n\t\t\t\ttoggleBlockquote: () =>\n\t\t\t\t\teditor?.chain().focus().toggleBlockquote().run(),\n\t\t\t\ttoggleCodeBlock: () => editor?.chain().focus().toggleCodeBlock().run(),\n\t\t\t\tsetTextAlign: (align) =>\n\t\t\t\t\teditor?.chain().focus().setTextAlign(align).run(),\n\t\t\t\tsetFontFamily: (font) =>\n\t\t\t\t\teditor?.chain().focus().setFontFamily(font).run(),\n\t\t\t\tsetFontSize: (size) => editor?.chain().focus().setFontSize(size).run(),\n\t\t\t\tsetColor: (color) => editor?.chain().focus().setColor(color).run(),\n\t\t\t\tsetHighlight: (color) =>\n\t\t\t\t\teditor?.chain().focus().toggleHighlight({ color }).run(),\n\t\t\t\tunsetColor: () => editor?.chain().focus().unsetColor().run(),\n\t\t\t\tunsetHighlight: () => editor?.chain().focus().unsetHighlight().run(),\n\t\t\t\tsetLink: (href, text) => {\n\t\t\t\t\tif (!editor) return;\n\t\t\t\t\tif (text !== undefined) {\n\t\t\t\t\t\teditor\n\t\t\t\t\t\t\t.chain()\n\t\t\t\t\t\t\t.focus()\n\t\t\t\t\t\t\t.extendMarkRange('link')\n\t\t\t\t\t\t\t.command(({ tr, state }) => {\n\t\t\t\t\t\t\t\tconst { from, to } = tr.selection;\n\t\t\t\t\t\t\t\tconst linkMarkType = state.schema.marks['link'];\n\t\t\t\t\t\t\t\tif (!linkMarkType) return false;\n\t\t\t\t\t\t\t\tconst linkNode = state.schema.text(text, [\n\t\t\t\t\t\t\t\t\tlinkMarkType.create({ href }),\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t\tconst space = state.schema.text(' ');\n\t\t\t\t\t\t\t\ttr.replaceWith(from, to, [linkNode, space]);\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.run();\n\t\t\t\t\t} else {\n\t\t\t\t\t\teditor\n\t\t\t\t\t\t\t.chain()\n\t\t\t\t\t\t\t.focus()\n\t\t\t\t\t\t\t.extendMarkRange('link')\n\t\t\t\t\t\t\t.setLink({ href })\n\t\t\t\t\t\t\t.insertContent(' ')\n\t\t\t\t\t\t\t.run();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tupdateLink: (href) =>\n\t\t\t\t\teditor\n\t\t\t\t\t\t?.chain()\n\t\t\t\t\t\t.focus()\n\t\t\t\t\t\t.extendMarkRange('link')\n\t\t\t\t\t\t.setLink({ href })\n\t\t\t\t\t\t.run(),\n\t\t\t\tremoveLink: () =>\n\t\t\t\t\teditor?.chain().focus().extendMarkRange('link').unsetLink().run(),\n\t\t\t\tinsertEmoji: (emoji) =>\n\t\t\t\t\teditor?.chain().focus().insertContent(emoji).run(),\n\t\t\t\tinsertVariable: (variableName) =>\n\t\t\t\t\teditor?.chain().focus().insertContent(`{{${variableName}}}`).run(),\n\t\t\t\tinsertHtml: (html) =>\n\t\t\t\t\teditor?.commands.insertContent(normalizeHtml(html)),\n\t\t\t\tundo: () => editor?.chain().focus().undo().run(),\n\t\t\t\tredo: () => editor?.chain().focus().redo().run(),\n\t\t\t\tcanUndo: () => editor?.can().undo() ?? false,\n\t\t\t\tcanRedo: () => editor?.can().redo() ?? false,\n\t\t\t\ttoggleSuperscript: () =>\n\t\t\t\t\teditor?.chain().focus().toggleSuperscript().run(),\n\t\t\t\ttoggleSubscript: () => editor?.chain().focus().toggleSubscript().run(),\n\t\t\t\tinsertImage: (src) => editor?.chain().focus().setImage({ src }).run(),\n\t\t\t},\n\n\t\t\t// ── JSON body ─────────────────────────────────────────────────────\n\t\t\tjson: features?.jsonMode\n\t\t\t\t? {\n\t\t\t\t\t\tgetText: () => (editor ? getCodeBlockText(editor) : ''),\n\t\t\t\t\t\tsetText: (raw) => enqueue((e) => setCodeBlockText(e, raw)),\n\t\t\t\t\t\tparse: () => parseJson(editor ? getCodeBlockText(editor) : ''),\n\t\t\t\t\t\tisValid: () =>\n\t\t\t\t\t\t\tparseJson(editor ? getCodeBlockText(editor) : '').valid,\n\t\t\t\t\t\tformat: (indent = 2) =>\n\t\t\t\t\t\t\tenqueue((e) => {\n\t\t\t\t\t\t\t\tconst { valid, value } = parseJson(getCodeBlockText(e));\n\t\t\t\t\t\t\t\tif (!valid || value === null) return;\n\t\t\t\t\t\t\t\tsetCodeBlockText(e, JSON.stringify(value, null, indent));\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tminify: () =>\n\t\t\t\t\t\t\tenqueue((e) => {\n\t\t\t\t\t\t\t\tconst { valid, value } = parseJson(getCodeBlockText(e));\n\t\t\t\t\t\t\t\tif (!valid || value === null) return;\n\t\t\t\t\t\t\t\tsetCodeBlockText(e, JSON.stringify(value));\n\t\t\t\t\t\t\t}),\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t}),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[editor],\n\t);\n\n\t// ── jsonMode floating actions ────────────────────────────────────────────\n\t// Beautify pretty-prints in place (no-op / disabled while the JSON is broken);\n\t// Copy writes the raw text to the clipboard with transient feedback.\n\tconst handleJsonBeautify = () => {\n\t\tif (!editor) return;\n\t\tconst { valid, value } = parseJson(getCodeBlockText(editor));\n\t\tif (!valid || value === null) return;\n\t\tsetCodeBlockText(editor, JSON.stringify(value, null, 2));\n\t};\n\tconst handleJsonCopy = () => {\n\t\tif (!editor) return;\n\t\tvoid navigator.clipboard?.writeText(getCodeBlockText(editor));\n\t\tsetJsonCopied(true);\n\t\tsetTimeout(() => setJsonCopied(false), 1500);\n\t};\n\n\tif (!editor) return null;\n\n\treturn (\n\t\t<BikEditorShell\n\t\t\tminHeight={minHeight}\n\t\t\tmaxHeight={maxHeight}\n\t\t\ttightParagraphs={!features?.richPaste}\n\t\t\tjsonMode={isJsonMode}\n\t\t\tstyle={style}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{isJsonMode && (\n\t\t\t\t<BikJsonHeader>\n\t\t\t\t\t<span className=\"bik-json-header-label\">JSON</span>\n\t\t\t\t\t<div className=\"bik-json-header-actions\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleJsonBeautify}\n\t\t\t\t\t\t\tdisabled={!!jsonError}\n\t\t\t\t\t\t\ttitle=\"Format JSON\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<WandSparkles size={16} />\n\t\t\t\t\t\t\t<BodyCaption>Beautify</BodyCaption>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" onClick={handleJsonCopy} title=\"Copy JSON\">\n\t\t\t\t\t\t\t<Copy size={16} />\n\t\t\t\t\t\t\t{jsonCopied && <BodyCaption>Copied</BodyCaption>}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</BikJsonHeader>\n\t\t\t)}\n\t\t\t<EditorContent editor={editor} />\n\t\t\t<LinkBubbleMenu editor={editor} renderLinkTooltip={link?.renderTooltip} />\n\t\t\t{isJsonMode && jsonError ? (\n\t\t\t\trenderJsonError ? (\n\t\t\t\t\trenderJsonError(jsonError)\n\t\t\t\t) : (\n\t\t\t\t\t<BikJsonError>\n\t\t\t\t\t\t{jsonError.line != null && (\n\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\tLine {jsonError.line}\n\t\t\t\t\t\t\t\t{jsonError.column != null ? `, column ${jsonError.column}` : ''}\n\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{jsonError.error}\n\t\t\t\t\t</BikJsonError>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t</BikEditorShell>\n\t);\n};\n\nexport const BikEditor = forwardRef<BikEditorRef, BikEditorProps>(\n\tBikEditorInner,\n);\nBikEditor.displayName = 'BikEditor';\n"],"names":["cssToString","style","k","v","c","BikEditorInner","props","ref","initialContent","sections","features","disabled","maxCharacters","characterLimit","shortcuts","sendShortcut","mentions","slashCommands","link","onPaste","onReady","onChange","onSend","onFocus","onBlur","onSelectionChange","minHeight","maxHeight","className","editorClassName","editorStyle","renderJsonError","isJsonMode","jsonError","setJsonError","useState","jsonCopied","setJsonCopied","initialEditorContent","buildJsonCodeBlockHtml","buildSectionedContent","normalizeHtml","s","pendingQueue","useRef","hasCalledOnReady","onReadyRef","onChangeRef","onSelectionChangeRef","prevFormatsRef","DEFAULT_FORMAT_STATE","onFocusRef","onBlurRef","onSendRef","agentMentionsRef","teamMentionsRef","slashCommandsRef","editor","useEditor","buildExtensions","snapshot","e","extractContent","result","parseJson","getCodeBlockText","next","extractActiveFormats","prev","enqueue","op","useEffect","useImperativeHandle","position","html","normalised","insertInlineHtml","agentIds","teamIds","node","from","to","pos","state","empty","linkMarkType","range","getMarkRange","sectionId","extractSectionContent","setSectionContentInEditor","endOfBody","targetPos","extractBodyContent","body","boundaryPos","findSectionEndPos","findSectionStartPos","align","font","size","color","href","text","tr","linkNode","space","emoji","variableName","src","raw","setCodeBlockText","indent","valid","value","handleJsonBeautify","handleJsonCopy","jsxs","BikEditorShell","BikJsonHeader","jsx","WandSparkles","BodyCaption","Copy","EditorContent","LinkBubbleMenu","BikJsonError","BikEditor","forwardRef"],"mappings":"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"}
1
+ {"version":3,"file":"BikEditor.js","sources":["../../../src/editor/BikEditor.tsx"],"sourcesContent":["'use client';\n\n/**\n * IMPLEMENTATION LAYER — TipTap-specific.\n * If the underlying editor is swapped, this file changes; BikEditor.types.ts and\n * src/editor/index.ts (the consumer contract) do NOT change.\n */\nimport { Editor, getMarkRange } from '@tiptap/core';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport React, {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport { BodyCaption } from '@src/components/TypographyStyle';\nimport { sanitizeBasicHtml, sanitizeEmailHtml } from '../helpers/sanitize';\nimport { Copy, WandSparkles } from '../icons';\nimport {\n\tBikEditorShell,\n\tBikJsonError,\n\tBikJsonHeader,\n} from './BikEditor.styles';\nimport {\n\tBikEditorProps,\n\tBikEditorRef,\n\tDEFAULT_FORMAT_STATE,\n\tFormatState,\n\tJsonParseResult,\n} from './BikEditor.types';\nimport {\n\tbuildJsonCodeBlockHtml,\n\tbuildSectionedContent,\n\textractActiveFormats,\n\textractBodyContent,\n\textractContent,\n\textractSectionContent,\n\tfindSectionEndPos,\n\tfindSectionStartPos,\n\tgetCodeBlockText,\n\tinsertInlineHtml,\n\tnormalizeHtml,\n\tparseJson,\n\tsetCodeBlockText,\n\tsetSectionContentInEditor,\n} from './BikEditor.utils';\nimport { buildExtensions } from './extensions/buildExtensions';\nimport { LinkBubbleMenu } from './floating/LinkBubbleMenu';\n\n/** Convert React.CSSProperties to an inline CSS string for editorProps.attributes. */\nfunction cssToString(style: React.CSSProperties): string {\n\treturn Object.entries(style)\n\t\t.map(\n\t\t\t([k, v]) => `${k.replace(/([A-Z])/g, (c) => `-${c.toLowerCase()}`)}:${v}`,\n\t\t)\n\t\t.join(';');\n}\n\nconst BikEditorInner = (\n\tprops: BikEditorProps,\n\tref: React.Ref<BikEditorRef>,\n) => {\n\tconst {\n\t\tinitialContent,\n\t\tsections,\n\t\tfeatures,\n\t\tdisabled,\n\t\tmaxCharacters,\n\t\tcharacterLimit,\n\t\tshortcuts,\n\t\tsendShortcut,\n\t\tmentions,\n\t\tslashCommands,\n\t\tlink,\n\t\tonPaste,\n\t\tonReady,\n\t\tonChange,\n\t\tonSend,\n\t\tonFocus,\n\t\tonBlur,\n\t\tonSelectionChange,\n\t\tminHeight,\n\t\tmaxHeight,\n\t\tstyle,\n\t\tclassName,\n\t\teditorClassName,\n\t\teditorStyle,\n\t\trenderJsonError,\n\t} = props;\n\n\tconst isJsonMode = !!features?.jsonMode;\n\tconst isRichPaste = !!features?.richPaste;\n\n\t// Pick the right sanitizer: email channels (richPaste) get the full email\n\t// allowlist; non-email channels get the basic formatting allowlist.\n\tconst sanitizer = isRichPaste ? sanitizeEmailHtml : sanitizeBasicHtml;\n\tconst normalize = useCallback(\n\t\t(html: string) => normalizeHtml(html, sanitizer),\n\t\t[sanitizer],\n\t);\n\n\t// Live JSON parse error, shown inside the editor when jsonMode is on.\n\t// null = valid (or not applicable) → nothing rendered.\n\tconst [jsonError, setJsonError] = useState<JsonParseResult | null>(null);\n\t// Transient \"Copied\" state for the jsonMode copy button.\n\tconst [jsonCopied, setJsonCopied] = useState(false);\n\n\t// JSON body mode: treat initialContent as raw JSON text and wrap it in a code\n\t// block. Skips section/HTML normalisation entirely.\n\tconst initialEditorContent = isJsonMode\n\t\t? buildJsonCodeBlockHtml(initialContent ?? '')\n\t\t: sections?.length\n\t\t? buildSectionedContent(\n\t\t\t\tnormalize(initialContent ?? ''),\n\t\t\t\tsections.map((s) => ({ ...s, content: normalize(s.content) })),\n\t\t )\n\t\t: normalize(initialContent ?? '');\n\n\t// ── Command queue ─────────────────────────────────────────────────────────\n\t// TipTap's useEditor initializes asynchronously; the editor instance is null\n\t// until the first commit. Any imperative method called before the editor is\n\t// ready is enqueued here and flushed automatically once it becomes non-null.\n\t// Consumers never need setTimeout or readiness guards.\n\tconst pendingQueue = useRef<Array<(e: Editor) => void>>([]);\n\tconst hasCalledOnReady = useRef(false);\n\t// Keep stable refs to all callbacks so useEditor receives the same function\n\t// identity on every render — prevents TipTap from re-registering event\n\t// handlers every time the parent re-renders with new inline function props.\n\tconst onReadyRef = useRef(onReady);\n\tonReadyRef.current = onReady;\n\tconst onChangeRef = useRef(onChange);\n\tonChangeRef.current = onChange;\n\tconst onSelectionChangeRef = useRef(onSelectionChange);\n\tonSelectionChangeRef.current = onSelectionChange;\n\tconst prevFormatsRef = useRef<FormatState>(DEFAULT_FORMAT_STATE);\n\tconst onFocusRef = useRef(onFocus);\n\tonFocusRef.current = onFocus;\n\tconst onBlurRef = useRef(onBlur);\n\tonBlurRef.current = onBlur;\n\tconst onSendRef = useRef(onSend);\n\tonSendRef.current = onSend;\n\tconst agentMentionsRef = useRef(mentions?.agents ?? []);\n\tagentMentionsRef.current = mentions?.agents ?? [];\n\tconst teamMentionsRef = useRef(mentions?.teams ?? []);\n\tteamMentionsRef.current = mentions?.teams ?? [];\n\tconst slashCommandsRef = useRef(slashCommands?.items ?? []);\n\tslashCommandsRef.current = slashCommands?.items ?? [];\n\n\tconst editor = useEditor({\n\t\textensions: buildExtensions({\n\t\t\tfeatures,\n\t\t\tplaceholder: props.placeholder,\n\t\t\tmaxCharacters,\n\t\t\tcharacterLimit,\n\t\t\thasSections: (sections?.length ?? 0) > 0,\n\t\t\tmentions: {\n\t\t\t\tagents: mentions ? agentMentionsRef : undefined,\n\t\t\t\tteams: mentions ? teamMentionsRef : undefined,\n\t\t\t},\n\t\t\tslashCommands: slashCommands ? slashCommandsRef : undefined,\n\t\t\tonPaste,\n\t\t\tonSend: onSend ? (snapshot) => onSendRef.current?.(snapshot) : undefined,\n\t\t\tsendShortcut,\n\t\t\tshortcuts,\n\t\t\tonMentionSelected: mentions?.onSelect,\n\t\t\tonSlashCommandSelected: slashCommands?.onSelect,\n\t\t\trenderMentionItem: mentions?.renderItem,\n\t\t\trenderMentionDropdown: mentions?.renderDropdown,\n\t\t\tremoveMentionTriggerOnDismiss: mentions?.removeTriggerOnDismiss,\n\t\t\trenderSlashCommandItem: slashCommands?.renderItem,\n\t\t\trenderSlashCommandDropdown: slashCommands?.renderDropdown,\n\t\t}),\n\t\tcontent: initialEditorContent,\n\t\teditable: !disabled,\n\t\timmediatelyRender: false, // SSR-safe — NEVER remove this\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\t...(editorClassName ? { class: editorClassName } : {}),\n\t\t\t\t...(editorStyle ? { style: cssToString(editorStyle) } : {}),\n\t\t\t},\n\t\t},\n\t\tonUpdate: ({ editor: e }) => {\n\t\t\tonChangeRef.current?.(extractContent(e));\n\t\t\tif (isJsonMode) {\n\t\t\t\tconst result = parseJson(getCodeBlockText(e));\n\t\t\t\tsetJsonError(result.valid ? null : result);\n\t\t\t}\n\t\t},\n\t\tonTransaction: ({ editor: e }) => {\n\t\t\tconst next = extractActiveFormats(e);\n\t\t\tconst prev = prevFormatsRef.current;\n\t\t\tconst changed =\n\t\t\t\tprev.bold !== next.bold ||\n\t\t\t\tprev.italic !== next.italic ||\n\t\t\t\tprev.underline !== next.underline ||\n\t\t\t\tprev.strike !== next.strike ||\n\t\t\t\tprev.bulletList !== next.bulletList ||\n\t\t\t\tprev.orderedList !== next.orderedList ||\n\t\t\t\tprev.blockquote !== next.blockquote ||\n\t\t\t\tprev.codeBlock !== next.codeBlock ||\n\t\t\t\tprev.superscript !== next.superscript ||\n\t\t\t\tprev.subscript !== next.subscript ||\n\t\t\t\tprev.textAlign !== next.textAlign ||\n\t\t\t\tprev.fontFamily !== next.fontFamily ||\n\t\t\t\tprev.fontSize !== next.fontSize ||\n\t\t\t\tprev.color !== next.color ||\n\t\t\t\tprev.highlight !== next.highlight ||\n\t\t\t\tprev.link?.href !== next.link?.href;\n\t\t\tif (changed) {\n\t\t\t\tprevFormatsRef.current = next;\n\t\t\t\tonSelectionChangeRef.current?.(next);\n\t\t\t}\n\t\t},\n\t\tonFocus: () => onFocusRef.current?.(),\n\t\tonBlur: () => onBlurRef.current?.(),\n\t});\n\n\t// ── enqueue ───────────────────────────────────────────────────────────────\n\t// Run immediately if the editor is ready; otherwise defer to the queue.\n\t// Closures passed to enqueue MUST capture all parameters explicitly —\n\t// they must NOT close over `editor` (which would be null at enqueue time).\n\tfunction enqueue(op: (e: Editor) => void): void {\n\t\tif (editor) {\n\t\t\top(editor);\n\t\t} else {\n\t\t\tpendingQueue.current.push(op);\n\t\t}\n\t}\n\n\t// Flush the pending queue and fire onReady when editor transitions null → ready.\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\t\tif (pendingQueue.current.length > 0) {\n\t\t\tconst queue = pendingQueue.current.splice(0);\n\t\t\tqueue.forEach((op) => op(editor));\n\t\t}\n\t\tif (!hasCalledOnReady.current) {\n\t\t\thasCalledOnReady.current = true;\n\t\t\tonReadyRef.current?.();\n\t\t}\n\t\t// Surface an error for invalid initialContent immediately on mount.\n\t\tif (isJsonMode) {\n\t\t\tconst result = parseJson(getCodeBlockText(editor));\n\t\t\tsetJsonError(result.valid ? null : result);\n\t\t}\n\t}, [editor, isJsonMode]);\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\t// ── Focus ────────────────────────────────────────────────────────\n\t\t\tfocus: (position) => enqueue((e) => e.commands.focus(position)),\n\t\t\tblur: () => enqueue((e) => e.commands.blur()),\n\n\t\t\t// ── Content ──────────────────────────────────────────────────────\n\t\t\tclearContent: () => enqueue((e) => e.commands.clearContent(true)),\n\t\t\tsetContent: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => e.commands.setContent(normalised, { emitUpdate: true }));\n\t\t\t},\n\t\t\tinsertContent: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => e.commands.insertContent(normalised));\n\t\t\t},\n\t\t\tinsertInlineContent: (html) => {\n\t\t\t\tenqueue((e) => insertInlineHtml(e, html));\n\t\t\t},\n\t\t\tinsertAtStart: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => e.commands.insertContentAt(1, normalised));\n\t\t\t},\n\t\t\tinsertBlock: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) =>\n\t\t\t\t\te.commands.insertContentAt(e.state.doc.content.size, normalised),\n\t\t\t\t);\n\t\t\t},\n\t\t\tappendInline: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\t// doc.content.size is after the last </p> (block boundary).\n\t\t\t\t// Subtract 1 to land inside the last paragraph so text appends\n\t\t\t\t// inline rather than being wrapped in a new paragraph each call.\n\t\t\t\tenqueue((e) =>\n\t\t\t\t\te.commands.insertContentAt(e.state.doc.content.size - 1, normalised),\n\t\t\t\t);\n\t\t\t},\n\t\t\t// Backwards-compatible aliases\n\t\t\tinsertAtEnd(html) {\n\t\t\t\tthis.insertBlock(html);\n\t\t\t},\n\t\t\tappendContent(html) {\n\t\t\t\tthis.appendInline(html);\n\t\t\t},\n\t\t\tgetContent: () =>\n\t\t\t\teditor\n\t\t\t\t\t? extractContent(editor)\n\t\t\t\t\t: { html: '', text: '', isEmpty: true, characterCount: 0 },\n\t\t\tgetJSON: () => editor?.getJSON() ?? null,\n\t\t\tgetMentions: () => {\n\t\t\t\tconst agentIds = new Set<string>();\n\t\t\t\tconst teamIds = new Set<string>();\n\t\t\t\tif (!editor) return { agentIds: [], teamIds: [] };\n\t\t\t\teditor.state.doc.descendants((node) => {\n\t\t\t\t\tif (node.type.name === 'mentionAgent' && node.attrs['id'] != null) {\n\t\t\t\t\t\tagentIds.add(String(node.attrs['id']));\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tnode.type.name === 'mentionTeam' &&\n\t\t\t\t\t\tnode.attrs['id'] != null\n\t\t\t\t\t) {\n\t\t\t\t\t\tteamIds.add(String(node.attrs['id']));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn { agentIds: Array.from(agentIds), teamIds: Array.from(teamIds) };\n\t\t\t},\n\n\t\t\t// ── Selection ────────────────────────────────────────────────────\n\t\t\tgetCursorPosition: () => {\n\t\t\t\tif (!editor) return { from: 0, to: 0 };\n\t\t\t\tconst { from, to } = editor.state.selection;\n\t\t\t\treturn { from, to };\n\t\t\t},\n\t\t\tinsertAtPosition: (pos, html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => e.commands.insertContentAt(pos, normalised));\n\t\t\t},\n\t\t\tgetSelectedText: () => {\n\t\t\t\tif (!editor) return '';\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { from, to, empty } = state.selection;\n\t\t\t\tif (!empty) {\n\t\t\t\t\treturn state.doc.textBetween(from, to, ' ');\n\t\t\t\t}\n\t\t\t\t// When the cursor is inside a link with nothing selected, return the\n\t\t\t\t// full link text — useful for pre-filling a link modal's text field.\n\t\t\t\tconst linkMarkType = state.schema.marks['link'];\n\t\t\t\tif (linkMarkType) {\n\t\t\t\t\tconst range = getMarkRange(state.doc.resolve(from), linkMarkType);\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\treturn state.doc.textBetween(range.from, range.to, ' ');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t},\n\n\t\t\t// ── Character count ───────────────────────────────────────────────\n\t\t\tgetCharacterCount: () => ({\n\t\t\t\tcount:\n\t\t\t\t\teditor?.storage.characterCount?.characters?.() ??\n\t\t\t\t\teditor?.getText().length ??\n\t\t\t\t\t0,\n\t\t\t\tlimit: maxCharacters ?? null,\n\t\t\t}),\n\n\t\t\t// ── Sections ─────────────────────────────────────────────────────\n\t\t\tgetSectionContent: (sectionId) =>\n\t\t\t\teditor\n\t\t\t\t\t? extractSectionContent(editor, sectionId)\n\t\t\t\t\t: { html: '', text: '', isEmpty: true, characterCount: 0 },\n\n\t\t\tsetSectionContent: (sectionId, html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => setSectionContentInEditor(e, sectionId, normalised));\n\t\t\t},\n\n\t\t\tfocusSection: (sectionId) => {\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tif (sectionId === 'body') {\n\t\t\t\t\t\tlet endOfBody = e.state.doc.content.size - 1;\n\t\t\t\t\t\te.state.doc.descendants((node, pos) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tnode.type.name === 'sectionDivider' &&\n\t\t\t\t\t\t\t\tendOfBody === e.state.doc.content.size - 1\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tendOfBody = pos - 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn endOfBody === e.state.doc.content.size - 1;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (endOfBody < 1) endOfBody = 1;\n\t\t\t\t\t\te.chain().focus().setTextSelection(endOfBody).run();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet targetPos = -1;\n\t\t\t\t\te.state.doc.descendants((node, pos) => {\n\t\t\t\t\t\tif (targetPos !== -1) return false;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnode.type.name === 'sectionDivider' &&\n\t\t\t\t\t\t\tnode.attrs['sectionId'] === sectionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// pos + nodeSize lands right after the divider;\n\t\t\t\t\t\t\t// +1 more puts us inside the first paragraph of that section.\n\t\t\t\t\t\t\ttargetPos = pos + node.nodeSize + 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (targetPos !== -1) {\n\t\t\t\t\t\te.chain().focus().setTextSelection(targetPos).run();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tclearSection: (sectionId) => {\n\t\t\t\tenqueue((e) => setSectionContentInEditor(e, sectionId, '<p></p>'));\n\t\t\t},\n\n\t\t\t// ── Convenience body shorthands ───────────────────────────────────\n\t\t\tgetBodyContent: () =>\n\t\t\t\teditor\n\t\t\t\t\t? extractBodyContent(editor)\n\t\t\t\t\t: { html: '', text: '', isEmpty: true, characterCount: 0 },\n\t\t\tsetBodyContent: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => setSectionContentInEditor(e, 'body', normalised));\n\t\t\t},\n\t\t\tsetBodyAndSections: (body, sections) => {\n\t\t\t\tconst html = buildSectionedContent(\n\t\t\t\t\tnormalize(body),\n\t\t\t\t\tsections.map((s) => ({\n\t\t\t\t\t\tid: s.id,\n\t\t\t\t\t\tcontent: normalize(s.content),\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tenqueue((e) => e.commands.setContent(html, { emitUpdate: true }));\n\t\t\t},\n\t\t\tappendBodyContent: (html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\t// findSectionEndPos returns the position of the first divider (or\n\t\t\t\t// doc.content.size), which is the block boundary after the last </p>.\n\t\t\t\t// Subtract 1 to stay inside the last paragraph so successive calls\n\t\t\t\t// append inline text rather than creating a new paragraph each time.\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tconst boundaryPos = findSectionEndPos(e, 'body');\n\t\t\t\t\te.commands.insertContentAt(boundaryPos - 1, normalised, {\n\t\t\t\t\t\tparseOptions: { preserveWhitespace: true },\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tinsertAtSectionStart: (sectionId, html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tconst pos = findSectionStartPos(e, sectionId);\n\t\t\t\t\tif (pos !== -1)\n\t\t\t\t\t\te.commands.insertContentAt(pos, normalised, {\n\t\t\t\t\t\t\tparseOptions: { preserveWhitespace: true },\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\tinsertAtSectionEnd: (sectionId, html) => {\n\t\t\t\tconst normalised = normalize(html);\n\t\t\t\tenqueue((e) => {\n\t\t\t\t\tconst pos = findSectionEndPos(e, sectionId);\n\t\t\t\t\te.commands.insertContentAt(pos, normalised, {\n\t\t\t\t\t\tparseOptions: { preserveWhitespace: true },\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\t// ── Formats & actions ─────────────────────────────────────────────\n\t\t\tgetActiveFormats: () =>\n\t\t\t\teditor ? extractActiveFormats(editor) : DEFAULT_FORMAT_STATE,\n\t\t\tactions: {\n\t\t\t\ttoggleBold: () => editor?.chain().focus().toggleBold().run(),\n\t\t\t\ttoggleItalic: () => editor?.chain().focus().toggleItalic().run(),\n\t\t\t\ttoggleUnderline: () => editor?.chain().focus().toggleUnderline().run(),\n\t\t\t\ttoggleStrike: () => editor?.chain().focus().toggleStrike().run(),\n\t\t\t\ttoggleBulletList: () =>\n\t\t\t\t\teditor?.chain().focus().toggleBulletList().run(),\n\t\t\t\ttoggleOrderedList: () =>\n\t\t\t\t\teditor?.chain().focus().toggleOrderedList().run(),\n\t\t\t\ttoggleBlockquote: () =>\n\t\t\t\t\teditor?.chain().focus().toggleBlockquote().run(),\n\t\t\t\ttoggleCodeBlock: () => editor?.chain().focus().toggleCodeBlock().run(),\n\t\t\t\tsetTextAlign: (align) =>\n\t\t\t\t\teditor?.chain().focus().setTextAlign(align).run(),\n\t\t\t\tsetFontFamily: (font) =>\n\t\t\t\t\teditor?.chain().focus().setFontFamily(font).run(),\n\t\t\t\tsetFontSize: (size) => editor?.chain().focus().setFontSize(size).run(),\n\t\t\t\tsetColor: (color) => editor?.chain().focus().setColor(color).run(),\n\t\t\t\tsetHighlight: (color) =>\n\t\t\t\t\teditor?.chain().focus().toggleHighlight({ color }).run(),\n\t\t\t\tunsetColor: () => editor?.chain().focus().unsetColor().run(),\n\t\t\t\tunsetHighlight: () => editor?.chain().focus().unsetHighlight().run(),\n\t\t\t\tsetLink: (href, text) => {\n\t\t\t\t\tif (!editor) return;\n\t\t\t\t\tif (text !== undefined) {\n\t\t\t\t\t\teditor\n\t\t\t\t\t\t\t.chain()\n\t\t\t\t\t\t\t.focus()\n\t\t\t\t\t\t\t.extendMarkRange('link')\n\t\t\t\t\t\t\t.command(({ tr, state }) => {\n\t\t\t\t\t\t\t\tconst { from, to } = tr.selection;\n\t\t\t\t\t\t\t\tconst linkMarkType = state.schema.marks['link'];\n\t\t\t\t\t\t\t\tif (!linkMarkType) return false;\n\t\t\t\t\t\t\t\tconst linkNode = state.schema.text(text, [\n\t\t\t\t\t\t\t\t\tlinkMarkType.create({ href }),\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t\tconst space = state.schema.text(' ');\n\t\t\t\t\t\t\t\ttr.replaceWith(from, to, [linkNode, space]);\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.run();\n\t\t\t\t\t} else {\n\t\t\t\t\t\teditor\n\t\t\t\t\t\t\t.chain()\n\t\t\t\t\t\t\t.focus()\n\t\t\t\t\t\t\t.extendMarkRange('link')\n\t\t\t\t\t\t\t.setLink({ href })\n\t\t\t\t\t\t\t.insertContent(' ')\n\t\t\t\t\t\t\t.run();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tupdateLink: (href) =>\n\t\t\t\t\teditor\n\t\t\t\t\t\t?.chain()\n\t\t\t\t\t\t.focus()\n\t\t\t\t\t\t.extendMarkRange('link')\n\t\t\t\t\t\t.setLink({ href })\n\t\t\t\t\t\t.run(),\n\t\t\t\tremoveLink: () =>\n\t\t\t\t\teditor?.chain().focus().extendMarkRange('link').unsetLink().run(),\n\t\t\t\tinsertEmoji: (emoji) =>\n\t\t\t\t\teditor?.chain().focus().insertContent(emoji).run(),\n\t\t\t\tinsertVariable: (variableName) =>\n\t\t\t\t\teditor?.chain().focus().insertContent(`{{${variableName}}}`).run(),\n\t\t\t\tinsertHtml: (html) => editor?.commands.insertContent(normalize(html)),\n\t\t\t\tundo: () => editor?.chain().focus().undo().run(),\n\t\t\t\tredo: () => editor?.chain().focus().redo().run(),\n\t\t\t\tcanUndo: () => editor?.can().undo() ?? false,\n\t\t\t\tcanRedo: () => editor?.can().redo() ?? false,\n\t\t\t\ttoggleSuperscript: () =>\n\t\t\t\t\teditor?.chain().focus().toggleSuperscript().run(),\n\t\t\t\ttoggleSubscript: () => editor?.chain().focus().toggleSubscript().run(),\n\t\t\t\tinsertImage: (src) => editor?.chain().focus().setImage({ src }).run(),\n\t\t\t},\n\n\t\t\t// ── JSON body ─────────────────────────────────────────────────────\n\t\t\tjson: features?.jsonMode\n\t\t\t\t? {\n\t\t\t\t\t\tgetText: () => (editor ? getCodeBlockText(editor) : ''),\n\t\t\t\t\t\tsetText: (raw) => enqueue((e) => setCodeBlockText(e, raw)),\n\t\t\t\t\t\tparse: () => parseJson(editor ? getCodeBlockText(editor) : ''),\n\t\t\t\t\t\tisValid: () =>\n\t\t\t\t\t\t\tparseJson(editor ? getCodeBlockText(editor) : '').valid,\n\t\t\t\t\t\tformat: (indent = 2) =>\n\t\t\t\t\t\t\tenqueue((e) => {\n\t\t\t\t\t\t\t\tconst { valid, value } = parseJson(getCodeBlockText(e));\n\t\t\t\t\t\t\t\tif (!valid || value === null) return;\n\t\t\t\t\t\t\t\tsetCodeBlockText(e, JSON.stringify(value, null, indent));\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\tminify: () =>\n\t\t\t\t\t\t\tenqueue((e) => {\n\t\t\t\t\t\t\t\tconst { valid, value } = parseJson(getCodeBlockText(e));\n\t\t\t\t\t\t\t\tif (!valid || value === null) return;\n\t\t\t\t\t\t\t\tsetCodeBlockText(e, JSON.stringify(value));\n\t\t\t\t\t\t\t}),\n\t\t\t\t }\n\t\t\t\t: undefined,\n\t\t}),\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[editor],\n\t);\n\n\t// ── jsonMode floating actions ────────────────────────────────────────────\n\t// Beautify pretty-prints in place (no-op / disabled while the JSON is broken);\n\t// Copy writes the raw text to the clipboard with transient feedback.\n\tconst handleJsonBeautify = () => {\n\t\tif (!editor) return;\n\t\tconst { valid, value } = parseJson(getCodeBlockText(editor));\n\t\tif (!valid || value === null) return;\n\t\tsetCodeBlockText(editor, JSON.stringify(value, null, 2));\n\t};\n\tconst handleJsonCopy = () => {\n\t\tif (!editor) return;\n\t\tvoid navigator.clipboard?.writeText(getCodeBlockText(editor));\n\t\tsetJsonCopied(true);\n\t\tsetTimeout(() => setJsonCopied(false), 1500);\n\t};\n\n\tif (!editor) return null;\n\n\treturn (\n\t\t<BikEditorShell\n\t\t\tminHeight={minHeight}\n\t\t\tmaxHeight={maxHeight}\n\t\t\ttightParagraphs={!features?.richPaste}\n\t\t\tjsonMode={isJsonMode}\n\t\t\tstyle={style}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{isJsonMode && (\n\t\t\t\t<BikJsonHeader>\n\t\t\t\t\t<span className=\"bik-json-header-label\">JSON</span>\n\t\t\t\t\t<div className=\"bik-json-header-actions\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleJsonBeautify}\n\t\t\t\t\t\t\tdisabled={!!jsonError}\n\t\t\t\t\t\t\ttitle=\"Format JSON\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<WandSparkles size={16} />\n\t\t\t\t\t\t\t<BodyCaption>Beautify</BodyCaption>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" onClick={handleJsonCopy} title=\"Copy JSON\">\n\t\t\t\t\t\t\t<Copy size={16} />\n\t\t\t\t\t\t\t{jsonCopied && <BodyCaption>Copied</BodyCaption>}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</BikJsonHeader>\n\t\t\t)}\n\t\t\t<EditorContent editor={editor} />\n\t\t\t<LinkBubbleMenu editor={editor} renderLinkTooltip={link?.renderTooltip} />\n\t\t\t{isJsonMode && jsonError ? (\n\t\t\t\trenderJsonError ? (\n\t\t\t\t\trenderJsonError(jsonError)\n\t\t\t\t) : (\n\t\t\t\t\t<BikJsonError>\n\t\t\t\t\t\t{jsonError.line != null && (\n\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\tLine {jsonError.line}\n\t\t\t\t\t\t\t\t{jsonError.column != null ? `, column ${jsonError.column}` : ''}\n\t\t\t\t\t\t\t\t:{' '}\n\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{jsonError.error}\n\t\t\t\t\t</BikJsonError>\n\t\t\t\t)\n\t\t\t) : null}\n\t\t</BikEditorShell>\n\t);\n};\n\nexport const BikEditor = forwardRef<BikEditorRef, BikEditorProps>(\n\tBikEditorInner,\n);\nBikEditor.displayName = 'BikEditor';\n"],"names":["cssToString","style","k","v","c","BikEditorInner","props","ref","initialContent","sections","features","disabled","maxCharacters","characterLimit","shortcuts","sendShortcut","mentions","slashCommands","link","onPaste","onReady","onChange","onSend","onFocus","onBlur","onSelectionChange","minHeight","maxHeight","className","editorClassName","editorStyle","renderJsonError","isJsonMode","sanitizer","sanitizeEmailHtml","sanitizeBasicHtml","normalize","useCallback","html","normalizeHtml","jsonError","setJsonError","useState","jsonCopied","setJsonCopied","initialEditorContent","buildJsonCodeBlockHtml","buildSectionedContent","s","pendingQueue","useRef","hasCalledOnReady","onReadyRef","onChangeRef","onSelectionChangeRef","prevFormatsRef","DEFAULT_FORMAT_STATE","onFocusRef","onBlurRef","onSendRef","agentMentionsRef","teamMentionsRef","slashCommandsRef","editor","useEditor","buildExtensions","snapshot","e","extractContent","result","parseJson","getCodeBlockText","next","extractActiveFormats","prev","enqueue","op","useEffect","useImperativeHandle","position","normalised","insertInlineHtml","agentIds","teamIds","node","from","to","pos","state","empty","linkMarkType","range","getMarkRange","sectionId","extractSectionContent","setSectionContentInEditor","endOfBody","targetPos","extractBodyContent","body","boundaryPos","findSectionEndPos","findSectionStartPos","align","font","size","color","href","text","tr","linkNode","space","emoji","variableName","src","raw","setCodeBlockText","indent","valid","value","handleJsonBeautify","handleJsonCopy","jsxs","BikEditorShell","BikJsonHeader","jsx","WandSparkles","BodyCaption","Copy","EditorContent","LinkBubbleMenu","BikJsonError","BikEditor","forwardRef"],"mappings":"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"}
@@ -18,7 +18,7 @@ import { EditorSnapshot, FormatState, JsonParseResult } from './BikEditor.types'
18
18
  * editor is created lazily on the client (`immediatelyRender: false`), meaning
19
19
  * the value is only parsed client-side and passing through on the server is safe.
20
20
  */
21
- export declare function normalizeHtml(html: string): string;
21
+ export declare function normalizeHtml(html: string, sanitizer?: (input: string) => string): string;
22
22
  /**
23
23
  * Make editor HTML portable across email clients and chat renderers.
24
24
  *