@bendyline/squisq-editor-react 1.2.2 → 1.3.0

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 (95) hide show
  1. package/dist/EditorContext.d.ts +65 -1
  2. package/dist/EditorContext.d.ts.map +1 -1
  3. package/dist/EditorContext.js +31 -4
  4. package/dist/EditorContext.js.map +1 -1
  5. package/dist/EditorShell.d.ts +101 -2
  6. package/dist/EditorShell.d.ts.map +1 -1
  7. package/dist/EditorShell.js +20 -8
  8. package/dist/EditorShell.js.map +1 -1
  9. package/dist/ImageNodeView.d.ts.map +1 -1
  10. package/dist/ImageNodeView.js +12 -2
  11. package/dist/ImageNodeView.js.map +1 -1
  12. package/dist/MediaBin.d.ts.map +1 -1
  13. package/dist/MediaBin.js +16 -1
  14. package/dist/MediaBin.js.map +1 -1
  15. package/dist/MentionExtension.d.ts +22 -0
  16. package/dist/MentionExtension.d.ts.map +1 -0
  17. package/dist/MentionExtension.js +242 -0
  18. package/dist/MentionExtension.js.map +1 -0
  19. package/dist/RawEditor.d.ts +8 -1
  20. package/dist/RawEditor.d.ts.map +1 -1
  21. package/dist/RawEditor.js +167 -30
  22. package/dist/RawEditor.js.map +1 -1
  23. package/dist/TemplateAnnotation.d.ts.map +1 -1
  24. package/dist/TemplateAnnotation.js +4 -2
  25. package/dist/TemplateAnnotation.js.map +1 -1
  26. package/dist/Toolbar.d.ts +7 -1
  27. package/dist/Toolbar.d.ts.map +1 -1
  28. package/dist/Toolbar.js +57 -18
  29. package/dist/Toolbar.js.map +1 -1
  30. package/dist/Tooltip.d.ts +10 -0
  31. package/dist/Tooltip.d.ts.map +1 -0
  32. package/dist/Tooltip.js +104 -0
  33. package/dist/Tooltip.js.map +1 -0
  34. package/dist/ViewSwitcher.d.ts +1 -1
  35. package/dist/ViewSwitcher.d.ts.map +1 -1
  36. package/dist/ViewSwitcher.js +10 -4
  37. package/dist/ViewSwitcher.js.map +1 -1
  38. package/dist/WysiwygEditor.d.ts +13 -2
  39. package/dist/WysiwygEditor.d.ts.map +1 -1
  40. package/dist/WysiwygEditor.js +239 -4
  41. package/dist/WysiwygEditor.js.map +1 -1
  42. package/dist/__tests__/detectMarkdown.test.d.ts +2 -0
  43. package/dist/__tests__/detectMarkdown.test.d.ts.map +1 -0
  44. package/dist/__tests__/detectMarkdown.test.js +69 -0
  45. package/dist/__tests__/detectMarkdown.test.js.map +1 -0
  46. package/dist/__tests__/fileKind.test.d.ts +2 -0
  47. package/dist/__tests__/fileKind.test.d.ts.map +1 -0
  48. package/dist/__tests__/fileKind.test.js +81 -0
  49. package/dist/__tests__/fileKind.test.js.map +1 -0
  50. package/dist/__tests__/tiptapBridge.test.js +36 -0
  51. package/dist/__tests__/tiptapBridge.test.js.map +1 -1
  52. package/dist/detectMarkdown.d.ts +20 -0
  53. package/dist/detectMarkdown.d.ts.map +1 -0
  54. package/dist/detectMarkdown.js +61 -0
  55. package/dist/detectMarkdown.js.map +1 -0
  56. package/dist/fileKind.d.ts +30 -0
  57. package/dist/fileKind.d.ts.map +1 -0
  58. package/dist/fileKind.js +123 -0
  59. package/dist/fileKind.js.map +1 -0
  60. package/dist/hooks/useFileDrop.d.ts.map +1 -1
  61. package/dist/hooks/useFileDrop.js +9 -7
  62. package/dist/hooks/useFileDrop.js.map +1 -1
  63. package/dist/index.d.ts +4 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +4 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/mediaDragMime.d.ts +17 -0
  68. package/dist/mediaDragMime.d.ts.map +1 -0
  69. package/dist/mediaDragMime.js +22 -0
  70. package/dist/mediaDragMime.js.map +1 -0
  71. package/dist/tiptapBridge.d.ts.map +1 -1
  72. package/dist/tiptapBridge.js +58 -2
  73. package/dist/tiptapBridge.js.map +1 -1
  74. package/package.json +9 -7
  75. package/src/EditorContext.tsx +106 -3
  76. package/src/EditorShell.tsx +195 -15
  77. package/src/ImageNodeView.tsx +15 -2
  78. package/src/MediaBin.tsx +23 -1
  79. package/src/MentionExtension.tsx +258 -0
  80. package/src/RawEditor.tsx +193 -37
  81. package/src/TemplateAnnotation.ts +4 -2
  82. package/src/Toolbar.tsx +111 -48
  83. package/src/Tooltip.tsx +124 -0
  84. package/src/ViewSwitcher.tsx +15 -5
  85. package/src/WysiwygEditor.tsx +270 -5
  86. package/src/__tests__/detectMarkdown.test.ts +88 -0
  87. package/src/__tests__/fileKind.test.ts +96 -0
  88. package/src/__tests__/tiptapBridge.test.ts +44 -0
  89. package/src/detectMarkdown.ts +62 -0
  90. package/src/fileKind.ts +134 -0
  91. package/src/hooks/useFileDrop.ts +10 -6
  92. package/src/index.ts +11 -0
  93. package/src/mediaDragMime.ts +32 -0
  94. package/src/styles/editor.css +214 -8
  95. package/src/tiptapBridge.ts +66 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentionExtension.d.ts","sourceRoot":"","sources":["../src/MentionExtension.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAoB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAkBzE;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,eAAe,GAAG,IAAI,mJAwF9E"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * MentionExtension
3
+ *
4
+ * Tiptap mention configuration paired with a small absolutely-positioned
5
+ * suggestion popover. Shares a caller-supplied async provider (see
6
+ * `MentionProvider` in EditorContext) with the Monaco `@` completion
7
+ * provider in `RawEditor`, so both editing modes surface the same roster.
8
+ *
9
+ * The mention chip renders as `<span data-mention data-kind data-id
10
+ * data-label class="mention">@Label</span>`, matching the wire format that
11
+ * `tiptapBridge` emits when converting markdown → Tiptap HTML. On serialize
12
+ * back to markdown, the bridge emits `@[Label](kind:id)`.
13
+ */
14
+ import Mention from '@tiptap/extension-mention';
15
+ import { PluginKey } from '@tiptap/pm/state';
16
+ /**
17
+ * Fallback namespace for defensive code paths — used when a mention node
18
+ * somehow lacks a `kind` attribute (e.g. legacy HTML parsed without one).
19
+ * Inserts from the suggestion popover always carry the candidate's own
20
+ * `scheme`, so this only surfaces for malformed/legacy content.
21
+ */
22
+ const FALLBACK_KIND = 'mention';
23
+ /**
24
+ * Build the Tiptap mention extension for an editor. The returned extension
25
+ * captures a reference to `getProvider` at configure-time and calls it on
26
+ * every keystroke — keep the reference stable so we don't recreate the
27
+ * editor just to change who answers the `@` query.
28
+ */
29
+ export function buildMentionExtension(getProvider) {
30
+ return Mention.configure({
31
+ HTMLAttributes: {
32
+ class: 'mention',
33
+ 'data-mention': 'true',
34
+ },
35
+ renderHTML({ options, node }) {
36
+ const label = node.attrs.label ?? node.attrs.id ?? '';
37
+ const id = node.attrs.id ?? '';
38
+ const kind = node.attrs.kind ?? FALLBACK_KIND;
39
+ return [
40
+ 'span',
41
+ {
42
+ ...options.HTMLAttributes,
43
+ 'data-kind': kind,
44
+ 'data-id': id,
45
+ 'data-label': label,
46
+ },
47
+ `@${label}`,
48
+ ];
49
+ },
50
+ renderText({ node }) {
51
+ const label = node.attrs.label ?? node.attrs.id ?? '';
52
+ const id = node.attrs.id ?? '';
53
+ const kind = node.attrs.kind ?? FALLBACK_KIND;
54
+ return `@[${label}](${kind}:${id})`;
55
+ },
56
+ }).extend({
57
+ addAttributes() {
58
+ return {
59
+ id: {
60
+ default: null,
61
+ parseHTML: (el) => el.getAttribute('data-id'),
62
+ renderHTML: (attrs) => (attrs.id ? { 'data-id': attrs.id } : {}),
63
+ },
64
+ label: {
65
+ default: null,
66
+ parseHTML: (el) => el.getAttribute('data-label'),
67
+ renderHTML: (attrs) => (attrs.label ? { 'data-label': attrs.label } : {}),
68
+ },
69
+ kind: {
70
+ default: FALLBACK_KIND,
71
+ parseHTML: (el) => el.getAttribute('data-kind') ?? FALLBACK_KIND,
72
+ renderHTML: (attrs) => ({ 'data-kind': attrs.kind ?? FALLBACK_KIND }),
73
+ },
74
+ };
75
+ },
76
+ addOptions() {
77
+ return {
78
+ ...(this.parent?.() ?? {}),
79
+ suggestion: {
80
+ char: '@',
81
+ // Custom plugin key so the mention suggestion doesn't collide
82
+ // with any future `:` or `/` popovers.
83
+ pluginKey: new PluginKey('mentionSuggestion'),
84
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
85
+ command: ({ editor, range, props }) => {
86
+ const id = props?.id ?? '';
87
+ const label = props?.label ?? id;
88
+ const kind = props?.kind ?? FALLBACK_KIND;
89
+ editor
90
+ .chain()
91
+ .focus()
92
+ .insertContentAt(range, [
93
+ {
94
+ type: 'mention',
95
+ attrs: { id, label, kind },
96
+ },
97
+ { type: 'text', text: ' ' },
98
+ ])
99
+ .run();
100
+ },
101
+ items: async ({ query }) => {
102
+ const provider = getProvider();
103
+ if (!provider)
104
+ return [];
105
+ try {
106
+ return await provider(query);
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ },
112
+ render: renderSuggestionFactory(),
113
+ },
114
+ };
115
+ },
116
+ });
117
+ }
118
+ /**
119
+ * Lightweight suggestion popover. Uses a plain absolutely-positioned div
120
+ * anchored to the caret rect — no tippy.js needed. Keyboard nav handled via
121
+ * the `onKeyDown` hook Tiptap wires up.
122
+ */
123
+ function renderSuggestionFactory() {
124
+ return () => {
125
+ let container = null;
126
+ let state = { items: [], selected: 0 };
127
+ let currentProps = null;
128
+ const update = () => {
129
+ if (!container || !currentProps)
130
+ return;
131
+ container.innerHTML = '';
132
+ if (state.items.length === 0) {
133
+ container.style.display = 'none';
134
+ return;
135
+ }
136
+ container.style.display = 'block';
137
+ for (let i = 0; i < state.items.length; i++) {
138
+ const item = state.items[i];
139
+ const btn = document.createElement('button');
140
+ btn.type = 'button';
141
+ btn.className = 'squisq-mention-item' + (i === state.selected ? ' is-selected' : '');
142
+ btn.dataset.index = String(i);
143
+ btn.innerHTML = '';
144
+ const label = document.createElement('span');
145
+ label.className = 'squisq-mention-label';
146
+ label.textContent = item.label;
147
+ btn.appendChild(label);
148
+ if (item.description) {
149
+ const desc = document.createElement('span');
150
+ desc.className = 'squisq-mention-desc';
151
+ desc.textContent = item.description;
152
+ btn.appendChild(desc);
153
+ }
154
+ btn.addEventListener('mousedown', (ev) => {
155
+ ev.preventDefault();
156
+ selectAt(i);
157
+ });
158
+ container.appendChild(btn);
159
+ }
160
+ positionTo(container, currentProps.clientRect);
161
+ };
162
+ const selectAt = (index) => {
163
+ const item = state.items[index];
164
+ if (!item || !currentProps)
165
+ return;
166
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
+ const command = currentProps.command;
168
+ if (typeof command === 'function') {
169
+ command({ id: item.id, label: item.label, kind: item.scheme });
170
+ }
171
+ };
172
+ return {
173
+ onStart: (props) => {
174
+ currentProps = props;
175
+ state = { items: props.items ?? [], selected: 0 };
176
+ if (!container) {
177
+ container = document.createElement('div');
178
+ container.className = 'squisq-mention-popover';
179
+ container.style.position = 'absolute';
180
+ container.style.zIndex = '10000';
181
+ document.body.appendChild(container);
182
+ }
183
+ update();
184
+ },
185
+ onUpdate: (props) => {
186
+ currentProps = props;
187
+ if (Array.isArray(props.items)) {
188
+ state = { items: props.items, selected: 0 };
189
+ }
190
+ update();
191
+ },
192
+ onKeyDown: ({ event }) => {
193
+ if (!state.items.length)
194
+ return false;
195
+ if (event.key === 'ArrowDown') {
196
+ state.selected = (state.selected + 1) % state.items.length;
197
+ update();
198
+ return true;
199
+ }
200
+ if (event.key === 'ArrowUp') {
201
+ state.selected = (state.selected - 1 + state.items.length) % state.items.length;
202
+ update();
203
+ return true;
204
+ }
205
+ if (event.key === 'Enter' || event.key === 'Tab') {
206
+ selectAt(state.selected);
207
+ return true;
208
+ }
209
+ if (event.key === 'Escape') {
210
+ state = { items: [], selected: 0 };
211
+ update();
212
+ return true;
213
+ }
214
+ return false;
215
+ },
216
+ onExit: () => {
217
+ if (container?.parentNode)
218
+ container.parentNode.removeChild(container);
219
+ container = null;
220
+ currentProps = null;
221
+ },
222
+ };
223
+ };
224
+ }
225
+ function positionTo(el, clientRect) {
226
+ const rect = clientRect?.();
227
+ if (!rect)
228
+ return;
229
+ // Anchor just below the caret; fall back to above when there's no room.
230
+ const viewportH = window.innerHeight;
231
+ const below = rect.bottom + 4;
232
+ const estH = Math.min(240, el.offsetHeight || 200);
233
+ const fitsBelow = below + estH < viewportH;
234
+ el.style.left = `${rect.left + window.scrollX}px`;
235
+ if (fitsBelow) {
236
+ el.style.top = `${below + window.scrollY}px`;
237
+ }
238
+ else {
239
+ el.style.top = `${rect.top + window.scrollY - estH - 4}px`;
240
+ }
241
+ }
242
+ //# sourceMappingURL=MentionExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MentionExtension.js","sourceRoot":"","sources":["../src/MentionExtension.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAO7C;;;;;GAKG;AACH,MAAM,aAAa,GAAG,SAAS,CAAC;AAOhC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAyC;IAC7E,OAAO,OAAO,CAAC,SAAS,CAAC;QACvB,cAAc,EAAE;YACd,KAAK,EAAE,SAAS;YAChB,cAAc,EAAE,MAAM;SACvB;QACD,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;YAC1B,MAAM,KAAK,GACR,IAAI,CAAC,KAAK,CAAC,KAA4B,IAAK,IAAI,CAAC,KAAK,CAAC,EAAyB,IAAI,EAAE,CAAC;YAC1F,MAAM,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,EAAyB,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,GAAI,IAAI,CAAC,KAAK,CAAC,IAA2B,IAAI,aAAa,CAAC;YACtE,OAAO;gBACL,MAAM;gBACN;oBACE,GAAG,OAAO,CAAC,cAAc;oBACzB,WAAW,EAAE,IAAI;oBACjB,SAAS,EAAE,EAAE;oBACb,YAAY,EAAE,KAAK;iBACpB;gBACD,IAAI,KAAK,EAAE;aACZ,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,EAAE,IAAI,EAAE;YACjB,MAAM,KAAK,GACR,IAAI,CAAC,KAAK,CAAC,KAA4B,IAAK,IAAI,CAAC,KAAK,CAAC,EAAyB,IAAI,EAAE,CAAC;YAC1F,MAAM,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,EAAyB,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,GAAI,IAAI,CAAC,KAAK,CAAC,IAA2B,IAAI,aAAa,CAAC;YACtE,OAAO,KAAK,KAAK,KAAK,IAAI,IAAI,EAAE,GAAG,CAAC;QACtC,CAAC;KACF,CAAC,CAAC,MAAM,CAAC;QACR,aAAa;YACX,OAAO;gBACL,EAAE,EAAE;oBACF,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;oBAC7C,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACjE;gBACD,KAAK,EAAE;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;oBAChD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1E;gBACD,IAAI,EAAE;oBACJ,OAAO,EAAE,aAAa;oBACtB,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,aAAa;oBAChE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;iBACtE;aACF,CAAC;QACJ,CAAC;QACD,UAAU;YACR,OAAO;gBACL,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC1B,UAAU,EAAE;oBACV,IAAI,EAAE,GAAG;oBACT,8DAA8D;oBAC9D,uCAAuC;oBACvC,SAAS,EAAE,IAAI,SAAS,CAAC,mBAAmB,CAAC;oBAC7C,8DAA8D;oBAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAgD,EAAE,EAAE;wBAClF,MAAM,EAAE,GAAI,KAAK,EAAE,EAAoB,IAAI,EAAE,CAAC;wBAC9C,MAAM,KAAK,GAAI,KAAK,EAAE,KAAuB,IAAI,EAAE,CAAC;wBACpD,MAAM,IAAI,GAAI,KAAK,EAAE,IAA2B,IAAI,aAAa,CAAC;wBAClE,MAAM;6BACH,KAAK,EAAE;6BACP,KAAK,EAAE;6BACP,eAAe,CAAC,KAAK,EAAE;4BACtB;gCACE,IAAI,EAAE,SAAS;gCACf,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;6BAC3B;4BACD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;yBAC5B,CAAC;6BACD,GAAG,EAAE,CAAC;oBACX,CAAC;oBACD,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAqB,EAAE,EAAE;wBAC5C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;wBAC/B,IAAI,CAAC,QAAQ;4BAAE,OAAO,EAAE,CAAC;wBACzB,IAAI,CAAC;4BACH,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;wBAC/B,CAAC;wBAAC,MAAM,CAAC;4BACP,OAAO,EAAE,CAAC;wBACZ,CAAC;oBACH,CAAC;oBACD,MAAM,EAAE,uBAAuB,EAAE;iBAClC;aACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB;IAC9B,OAAO,GAAG,EAAE;QACV,IAAI,SAAS,GAA0B,IAAI,CAAC;QAC5C,IAAI,KAAK,GAAoB,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACxD,IAAI,YAAY,GAA2B,IAAI,CAAC;QAEhD,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY;gBAAE,OAAO;YACxC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC7C,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACpB,GAAG,CAAC,SAAS,GAAG,qBAAqB,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrF,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC9B,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC7C,KAAK,CAAC,SAAS,GAAG,sBAAsB,CAAC;gBACzC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC/B,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC;oBACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;oBACpC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;gBACD,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE;oBACvC,EAAE,CAAC,cAAc,EAAE,CAAC;oBACpB,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;gBACH,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YAED,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY;gBAAE,OAAO;YACnC,8DAA8D;YAC9D,MAAM,OAAO,GAAI,YAAoB,CAAC,OAAO,CAAC;YAC9C,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,KAAsB,EAAE,EAAE;gBAClC,YAAY,GAAG,KAAK,CAAC;gBACrB,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;gBAClD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;oBAC1C,SAAS,CAAC,SAAS,GAAG,wBAAwB,CAAC;oBAC/C,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;oBACtC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;oBACjC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACvC,CAAC;gBACD,MAAM,EAAE,CAAC;YACX,CAAC;YACD,QAAQ,EAAE,CAAC,KAAsB,EAAE,EAAE;gBACnC,YAAY,GAAG,KAAK,CAAC;gBACrB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/B,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;gBAC9C,CAAC;gBACD,MAAM,EAAE,CAAC;YACX,CAAC;YACD,SAAS,EAAE,CAAC,EAAE,KAAK,EAA4B,EAAE,EAAE;gBACjD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;oBAAE,OAAO,KAAK,CAAC;gBACtC,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;oBAC9B,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC3D,MAAM,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBAC5B,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;oBAChF,MAAM,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;oBACjD,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACzB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAC3B,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;oBACnC,MAAM,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,SAAS,EAAE,UAAU;oBAAE,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBACvE,SAAS,GAAG,IAAI,CAAC;gBACjB,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,EAAkB,EAClB,UAAqD;IAErD,MAAM,IAAI,GAAG,UAAU,EAAE,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,wEAAwE;IACxE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC;IAClD,IAAI,SAAS,EAAE,CAAC;QACd,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -16,10 +16,17 @@ export interface RawEditorProps {
16
16
  wordWrap?: 'on' | 'off' | 'wordWrapColumn' | 'bounded';
17
17
  /** Additional class name for the container */
18
18
  className?: string;
19
+ /**
20
+ * Chat-composer mode: Enter fires this callback (submit) and Cmd/Ctrl+Enter
21
+ * inserts a newline. When undefined, behaves normally.
22
+ */
23
+ submitOnEnter?: () => void;
24
+ /** Make Monaco read-only (no edits, no cursor blink). */
25
+ readOnly?: boolean;
19
26
  }
20
27
  /**
21
28
  * Raw markdown editor using Monaco Editor.
22
29
  * Binds to the shared EditorContext for source synchronization.
23
30
  */
24
- export declare function RawEditor({ theme, minimap, fontSize, wordWrap, className, }: RawEditorProps): import("react/jsx-runtime").JSX.Element;
31
+ export declare function RawEditor({ theme, minimap, fontSize, wordWrap, className, submitOnEnter, readOnly, }: RawEditorProps): import("react/jsx-runtime").JSX.Element;
25
32
  //# sourceMappingURL=RawEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RawEditor.d.ts","sourceRoot":"","sources":["../src/RawEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvD,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAY,EACZ,OAAe,EACf,QAAa,EACb,QAAe,EACf,SAAS,GACV,EAAE,cAAc,2CA8GhB"}
1
+ {"version":3,"file":"RawEditor.d.ts","sourceRoot":"","sources":["../src/RawEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvD,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAY,EACZ,OAAe,EACf,QAAa,EACb,QAAe,EACf,SAAS,EACT,aAAa,EACb,QAAgB,GACjB,EAAE,cAAc,2CAgQhB"}
package/dist/RawEditor.js CHANGED
@@ -11,6 +11,7 @@ import Editor, { loader } from '@monaco-editor/react';
11
11
  import * as monaco from 'monaco-editor';
12
12
  import { useEditorContext } from './EditorContext';
13
13
  import { getAvailableTemplates } from '@bendyline/squisq/doc';
14
+ import { SQUISQ_MEDIA_MIME, parseSquisqMediaPayload } from './mediaDragMime';
14
15
  // Use locally installed monaco-editor instead of CDN.
15
16
  //
16
17
  // NOTE: By default this imports the full monaco-editor with all 80+ languages
@@ -26,51 +27,185 @@ loader.config({ monaco });
26
27
  * Raw markdown editor using Monaco Editor.
27
28
  * Binds to the shared EditorContext for source synchronization.
28
29
  */
29
- export function RawEditor({ theme = 'vs', minimap = false, fontSize = 14, wordWrap = 'on', className, }) {
30
- const { markdownSource, setMarkdownSource, setMonacoEditor } = useEditorContext();
30
+ export function RawEditor({ theme = 'vs', minimap = false, fontSize = 14, wordWrap = 'on', className, submitOnEnter, readOnly = false, }) {
31
+ const { markdownSource, setMarkdownSource, setMonacoEditor, language, mentionProvider } = useEditorContext();
31
32
  const editorRef = useRef(null);
32
33
  const isExternalUpdate = useRef(false);
33
34
  const completionDisposable = useRef(null);
35
+ const mentionCompletionDisposable = useRef(null);
36
+ const dropCleanupRef = useRef(null);
37
+ const keyDisposable = useRef(null);
38
+ // Ref so the keydown handler always sees the latest callback.
39
+ const submitOnEnterRef = useRef(submitOnEnter);
40
+ useEffect(() => {
41
+ submitOnEnterRef.current = submitOnEnter;
42
+ }, [submitOnEnter]);
43
+ // Ref so the completion provider — registered once at mount — always
44
+ // sees the latest mentionProvider without needing to unregister.
45
+ const mentionProviderRef = useRef(mentionProvider);
46
+ useEffect(() => {
47
+ mentionProviderRef.current = mentionProvider;
48
+ }, [mentionProvider]);
34
49
  const handleMount = useCallback((editor, monaco) => {
35
50
  editorRef.current = editor;
36
51
  setMonacoEditor(editor);
37
52
  editor.focus();
38
53
  // Dispose any previous completion provider (from a prior mount)
39
54
  completionDisposable.current?.dispose();
40
- // Register template annotation completion provider for {[ trigger
41
- const templates = getAvailableTemplates();
42
- completionDisposable.current = monaco.languages.registerCompletionItemProvider('markdown', {
43
- triggerCharacters: ['['],
44
- provideCompletionItems(model, position) {
45
- const lineContent = model.getLineContent(position.lineNumber);
46
- // Only trigger inside a heading line that has {[ before the cursor
47
- if (!/^#{1,6}\s/.test(lineContent))
48
- return { suggestions: [] };
49
- const textBeforeCursor = lineContent.substring(0, position.column - 1);
50
- const bracketIdx = textBeforeCursor.lastIndexOf('{[');
51
- if (bracketIdx === -1)
52
- return { suggestions: [] };
53
- // The range to replace: from after {[ to the cursor
54
- const startCol = bracketIdx + 3; // after {[
55
- const range = new monaco.Range(position.lineNumber, startCol, position.lineNumber, position.column);
56
- const suggestions = templates.map((name) => ({
57
- label: name,
58
- kind: monaco.languages.CompletionItemKind.Value,
59
- insertText: name + ']}',
60
- range,
61
- detail: 'Block template',
62
- sortText: name,
63
- }));
64
- return { suggestions };
65
- },
55
+ completionDisposable.current = null;
56
+ mentionCompletionDisposable.current?.dispose();
57
+ mentionCompletionDisposable.current = null;
58
+ // Register the `{[template]}` completion provider only for markdown
59
+ // files — it's meaningless for TypeScript, JSON, Python, etc.
60
+ if (language === 'markdown') {
61
+ const templates = getAvailableTemplates();
62
+ completionDisposable.current = monaco.languages.registerCompletionItemProvider('markdown', {
63
+ triggerCharacters: ['['],
64
+ provideCompletionItems(model, position) {
65
+ const lineContent = model.getLineContent(position.lineNumber);
66
+ // Only trigger inside a heading line that has {[ before the cursor
67
+ if (!/^#{1,6}\s/.test(lineContent))
68
+ return { suggestions: [] };
69
+ const textBeforeCursor = lineContent.substring(0, position.column - 1);
70
+ const bracketIdx = textBeforeCursor.lastIndexOf('{[');
71
+ if (bracketIdx === -1)
72
+ return { suggestions: [] };
73
+ // The range to replace: from after {[ to the cursor
74
+ const startCol = bracketIdx + 3; // after {[
75
+ const range = new monaco.Range(position.lineNumber, startCol, position.lineNumber, position.column);
76
+ const suggestions = templates.map((name) => ({
77
+ label: name,
78
+ kind: monaco.languages.CompletionItemKind.Value,
79
+ insertText: name + ']}',
80
+ range,
81
+ detail: 'Block template',
82
+ sortText: name,
83
+ }));
84
+ return { suggestions };
85
+ },
86
+ });
87
+ // `@mention` completion — queries the shared MentionProvider. Keep
88
+ // this in its own registration so we can dispose it independently
89
+ // of the template provider, and so the trigger character is just
90
+ // `@` (not `[`).
91
+ mentionCompletionDisposable.current = monaco.languages.registerCompletionItemProvider('markdown', {
92
+ triggerCharacters: ['@'],
93
+ async provideCompletionItems(model, position) {
94
+ const provider = mentionProviderRef.current;
95
+ if (!provider)
96
+ return { suggestions: [] };
97
+ const lineContent = model.getLineContent(position.lineNumber);
98
+ const textBeforeCursor = lineContent.substring(0, position.column - 1);
99
+ const atIdx = textBeforeCursor.lastIndexOf('@');
100
+ if (atIdx === -1)
101
+ return { suggestions: [] };
102
+ // `@` must be at line start or preceded by whitespace/punct —
103
+ // skip e.g. email addresses like `foo@bar`.
104
+ if (atIdx > 0) {
105
+ const prevChar = textBeforeCursor[atIdx - 1];
106
+ if (!/[\s\p{P}]/u.test(prevChar))
107
+ return { suggestions: [] };
108
+ }
109
+ const query = textBeforeCursor.slice(atIdx + 1);
110
+ // Only fire for short queries — once the user has typed
111
+ // a full word, the popover gets noisy.
112
+ if (query.length > 40)
113
+ return { suggestions: [] };
114
+ if (/\s/.test(query))
115
+ return { suggestions: [] };
116
+ let candidates;
117
+ try {
118
+ candidates = await provider(query);
119
+ }
120
+ catch {
121
+ return { suggestions: [] };
122
+ }
123
+ const range = new monaco.Range(position.lineNumber, atIdx + 1, position.lineNumber, position.column);
124
+ return {
125
+ suggestions: candidates.map((c) => ({
126
+ label: `@${c.label}`,
127
+ kind: monaco.languages.CompletionItemKind.User,
128
+ insertText: `@[${c.label}](${c.scheme}:${c.id}) `,
129
+ range,
130
+ ...(c.description ? { detail: c.description } : {}),
131
+ sortText: c.label,
132
+ })),
133
+ };
134
+ },
135
+ });
136
+ }
137
+ // Chat-composer mode: intercept Enter before Monaco inserts a newline.
138
+ // Cmd/Ctrl+Enter falls through so the native newline still works.
139
+ keyDisposable.current?.dispose();
140
+ keyDisposable.current = editor.onKeyDown((e) => {
141
+ if (e.keyCode !== monaco.KeyCode.Enter)
142
+ return;
143
+ if (!submitOnEnterRef.current)
144
+ return;
145
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
146
+ return;
147
+ e.preventDefault();
148
+ e.stopPropagation();
149
+ submitOnEnterRef.current();
66
150
  });
67
- }, [setMonacoEditor]);
151
+ // Attach native drop listeners for in-app MediaBin drags. Monaco's own
152
+ // drop handling doesn't know about our custom MIME type, so we insert
153
+ // markdown image syntax explicitly in the capture phase.
154
+ dropCleanupRef.current?.();
155
+ const domNode = editor.getDomNode();
156
+ if (domNode) {
157
+ const onDragOver = (e) => {
158
+ if (e.dataTransfer?.types.includes(SQUISQ_MEDIA_MIME)) {
159
+ e.preventDefault();
160
+ e.dataTransfer.dropEffect = 'copy';
161
+ }
162
+ };
163
+ const onDrop = (e) => {
164
+ const dt = e.dataTransfer;
165
+ if (!dt)
166
+ return;
167
+ const raw = dt.getData(SQUISQ_MEDIA_MIME);
168
+ if (!raw)
169
+ return;
170
+ const payload = parseSquisqMediaPayload(raw);
171
+ if (!payload || !payload.mimeType.startsWith('image/'))
172
+ return;
173
+ e.preventDefault();
174
+ e.stopPropagation();
175
+ const target = editor.getTargetAtClientPoint(e.clientX, e.clientY);
176
+ const position = target?.position ?? editor.getPosition();
177
+ if (!position)
178
+ return;
179
+ const markdown = `![${payload.alt}](${payload.name})`;
180
+ editor.executeEdits('squisq-media-drop', [
181
+ {
182
+ range: new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column),
183
+ text: markdown,
184
+ forceMoveMarkers: true,
185
+ },
186
+ ]);
187
+ editor.focus();
188
+ };
189
+ domNode.addEventListener('dragover', onDragOver, true);
190
+ domNode.addEventListener('drop', onDrop, true);
191
+ dropCleanupRef.current = () => {
192
+ domNode.removeEventListener('dragover', onDragOver, true);
193
+ domNode.removeEventListener('drop', onDrop, true);
194
+ };
195
+ }
196
+ }, [setMonacoEditor, language]);
68
197
  // Unregister on unmount
69
198
  useEffect(() => {
70
199
  return () => {
71
200
  setMonacoEditor(null);
72
201
  completionDisposable.current?.dispose();
73
202
  completionDisposable.current = null;
203
+ mentionCompletionDisposable.current?.dispose();
204
+ mentionCompletionDisposable.current = null;
205
+ dropCleanupRef.current?.();
206
+ dropCleanupRef.current = null;
207
+ keyDisposable.current?.dispose();
208
+ keyDisposable.current = null;
74
209
  };
75
210
  }, [setMonacoEditor]);
76
211
  const handleChange = useCallback((value) => {
@@ -92,7 +227,7 @@ export function RawEditor({ theme = 'vs', minimap = false, fontSize = 14, wordWr
92
227
  }
93
228
  }
94
229
  }, [markdownSource]);
95
- return (_jsx("div", { className: className, style: { width: '100%', height: '100%' }, "data-testid": "raw-editor", children: _jsx(Editor, { defaultLanguage: "markdown", value: markdownSource, theme: theme, onMount: handleMount, onChange: handleChange, options: {
230
+ return (_jsx("div", { className: className, style: { width: '100%', height: '100%' }, "data-testid": "raw-editor", children: _jsx(Editor, { defaultLanguage: language, value: markdownSource, theme: theme, onMount: handleMount, onChange: handleChange, options: {
96
231
  fontSize,
97
232
  wordWrap,
98
233
  minimap: { enabled: minimap },
@@ -104,6 +239,8 @@ export function RawEditor({ theme = 'vs', minimap = false, fontSize = 14, wordWr
104
239
  bracketPairColorization: { enabled: true },
105
240
  guides: { indentation: true },
106
241
  padding: { top: 12, bottom: 12 },
242
+ readOnly,
243
+ domReadOnly: readOnly,
107
244
  } }) }));
108
245
  }
109
246
  //# sourceMappingURL=RawEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RawEditor.js","sourceRoot":"","sources":["../src/RawEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RawEditor.js","sourceRoot":"","sources":["../src/RawEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateAnnotation.d.ts","sourceRoot":"","sources":["../src/TemplateAnnotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,sFAiD9B,CAAC"}
1
+ {"version":3,"file":"TemplateAnnotation.d.ts","sourceRoot":"","sources":["../src/TemplateAnnotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,sFAmD9B,CAAC"}
@@ -46,7 +46,10 @@ export const HeadingWithTemplate = Heading.extend({
46
46
  const tag = `h${level}`;
47
47
  const templateName = HTMLAttributes['data-template'];
48
48
  if (templateName) {
49
- // Render heading with a trailing badge span
49
+ // Render heading with a trailing badge span. The badge has no text
50
+ // content — its label is painted via CSS `content: attr(data-template)`
51
+ // so the template name never becomes part of the serialized heading
52
+ // text (which would leak into markdown on round-trip).
50
53
  return [
51
54
  tag,
52
55
  HTMLAttributes,
@@ -58,7 +61,6 @@ export const HeadingWithTemplate = Heading.extend({
58
61
  contenteditable: 'false',
59
62
  'data-template': templateName,
60
63
  },
61
- templateName,
62
64
  ],
63
65
  ];
64
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateAnnotation.js","sourceRoot":"","sources":["../src/TemplateAnnotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAChD,aAAa;QACX,OAAO;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,YAAY,EAAE;gBACZ,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,CAAC,OAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,IAAI;gBAClF,UAAU,EAAE,CAAC,UAAmC,EAAE,EAAE;oBAClD,IAAI,CAAC,UAAU,CAAC,YAAY;wBAAE,OAAO,EAAE,CAAC;oBACxC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;gBACtD,CAAC;aACF;YACD,kBAAkB,EAAE;gBAClB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,CAAC,OAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,IAAI;gBACzF,UAAU,EAAE,CAAC,UAAmC,EAAE,EAAE;oBAClD,IAAI,CAAC,UAAU,CAAC,kBAAkB;wBAAE,OAAO,EAAE,CAAC;oBAC9C,OAAO,EAAE,sBAAsB,EAAE,UAAU,CAAC,kBAAkB,EAAE,CAAC;gBACnE,CAAC;aACF;SACF,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,YAAY,EAAE,CAAC;YACjB,4CAA4C;YAC5C,OAAO;gBACL,GAAG;gBACH,cAAc;gBACd,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;gBAChD;oBACE,MAAM;oBACN;wBACE,KAAK,EAAE,uBAAuB;wBAC9B,eAAe,EAAE,OAAO;wBACxB,eAAe,EAAE,YAAY;qBAC9B;oBACD,YAAY;iBACb;aACF,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"TemplateAnnotation.js","sourceRoot":"","sources":["../src/TemplateAnnotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAChD,aAAa;QACX,OAAO;YACL,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;YAClB,YAAY,EAAE;gBACZ,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,CAAC,OAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,IAAI;gBAClF,UAAU,EAAE,CAAC,UAAmC,EAAE,EAAE;oBAClD,IAAI,CAAC,UAAU,CAAC,YAAY;wBAAE,OAAO,EAAE,CAAC;oBACxC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;gBACtD,CAAC;aACF;YACD,kBAAkB,EAAE;gBAClB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,CAAC,OAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,IAAI;gBACzF,UAAU,EAAE,CAAC,UAAmC,EAAE,EAAE;oBAClD,IAAI,CAAC,UAAU,CAAC,kBAAkB;wBAAE,OAAO,EAAE,CAAC;oBAC9C,OAAO,EAAE,sBAAsB,EAAE,UAAU,CAAC,kBAAkB,EAAE,CAAC;gBACnE,CAAC;aACF;SACF,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,YAAY,EAAE,CAAC;YACjB,mEAAmE;YACnE,wEAAwE;YACxE,oEAAoE;YACpE,uDAAuD;YACvD,OAAO;gBACL,GAAG;gBACH,cAAc;gBACd,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;gBAChD;oBACE,MAAM;oBACN;wBACE,KAAK,EAAE,uBAAuB;wBAC9B,eAAe,EAAE,OAAO;wBACxB,eAAe,EAAE,YAAY;qBAC9B;iBACF;aACF,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;CACF,CAAC,CAAC"}
package/dist/Toolbar.d.ts CHANGED
@@ -20,11 +20,17 @@ export interface ToolbarProps {
20
20
  slotAfterActions?: ReactNode;
21
21
  /** Content rendered at the rightmost end of the toolbar, after all other elements. */
22
22
  slotRight?: ReactNode;
23
+ /**
24
+ * Whether to include the "Play" (preview) tab in the view switcher.
25
+ * Defaults to true. Hosts that don't want the slideshow preview — e.g.
26
+ * editing free-form prompts — can pass false to suppress it.
27
+ */
28
+ showPlayTab?: boolean;
23
29
  }
24
30
  /**
25
31
  * Formatting toolbar.
26
32
  * - WYSIWYG: calls Tiptap chain commands (toggleBold, etc.)
27
33
  * - Raw: appends markdown syntax to the source
28
34
  */
29
- export declare function Toolbar({ className, showFiles, onToggleFiles, slotLeft, slotAfterActions, slotRight, }: ToolbarProps): import("react/jsx-runtime").JSX.Element;
35
+ export declare function Toolbar({ className, showFiles, onToggleFiles, slotLeft, slotAfterActions, slotRight, showPlayTab, }: ToolbarProps): import("react/jsx-runtime").JSX.Element;
30
36
  //# sourceMappingURL=Toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAevC,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,sFAAsF;IACtF,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAyFD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,SAAS,EACT,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,SAAS,GACV,EAAE,YAAY,2CA8xBd"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAevC,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,sFAAsF;IACtF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA8FD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,SAAS,EACT,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,WAAkB,GACnB,EAAE,YAAY,2CAi1Bd"}