@rtif-sdk/web 1.0.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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/dist/block-drag-handler.d.ts +189 -0
  4. package/dist/block-drag-handler.d.ts.map +1 -0
  5. package/dist/block-drag-handler.js +745 -0
  6. package/dist/block-drag-handler.js.map +1 -0
  7. package/dist/block-renderer.d.ts +402 -0
  8. package/dist/block-renderer.d.ts.map +1 -0
  9. package/dist/block-renderer.js +424 -0
  10. package/dist/block-renderer.js.map +1 -0
  11. package/dist/clipboard.d.ts +178 -0
  12. package/dist/clipboard.d.ts.map +1 -0
  13. package/dist/clipboard.js +432 -0
  14. package/dist/clipboard.js.map +1 -0
  15. package/dist/command-bus.d.ts +113 -0
  16. package/dist/command-bus.d.ts.map +1 -0
  17. package/dist/command-bus.js +70 -0
  18. package/dist/command-bus.js.map +1 -0
  19. package/dist/composition.d.ts +220 -0
  20. package/dist/composition.d.ts.map +1 -0
  21. package/dist/composition.js +271 -0
  22. package/dist/composition.js.map +1 -0
  23. package/dist/content-extraction.d.ts +69 -0
  24. package/dist/content-extraction.d.ts.map +1 -0
  25. package/dist/content-extraction.js +228 -0
  26. package/dist/content-extraction.js.map +1 -0
  27. package/dist/content-handler-file.d.ts +40 -0
  28. package/dist/content-handler-file.d.ts.map +1 -0
  29. package/dist/content-handler-file.js +91 -0
  30. package/dist/content-handler-file.js.map +1 -0
  31. package/dist/content-handler-image.d.ts +82 -0
  32. package/dist/content-handler-image.d.ts.map +1 -0
  33. package/dist/content-handler-image.js +120 -0
  34. package/dist/content-handler-image.js.map +1 -0
  35. package/dist/content-handler-url.d.ts +129 -0
  36. package/dist/content-handler-url.d.ts.map +1 -0
  37. package/dist/content-handler-url.js +244 -0
  38. package/dist/content-handler-url.js.map +1 -0
  39. package/dist/content-handlers.d.ts +67 -0
  40. package/dist/content-handlers.d.ts.map +1 -0
  41. package/dist/content-handlers.js +263 -0
  42. package/dist/content-handlers.js.map +1 -0
  43. package/dist/content-pipeline.d.ts +383 -0
  44. package/dist/content-pipeline.d.ts.map +1 -0
  45. package/dist/content-pipeline.js +232 -0
  46. package/dist/content-pipeline.js.map +1 -0
  47. package/dist/cursor-nav.d.ts +149 -0
  48. package/dist/cursor-nav.d.ts.map +1 -0
  49. package/dist/cursor-nav.js +230 -0
  50. package/dist/cursor-nav.js.map +1 -0
  51. package/dist/cursor-rect.d.ts +65 -0
  52. package/dist/cursor-rect.d.ts.map +1 -0
  53. package/dist/cursor-rect.js +98 -0
  54. package/dist/cursor-rect.js.map +1 -0
  55. package/dist/drop-indicator.d.ts +108 -0
  56. package/dist/drop-indicator.d.ts.map +1 -0
  57. package/dist/drop-indicator.js +236 -0
  58. package/dist/drop-indicator.js.map +1 -0
  59. package/dist/editor.d.ts +41 -0
  60. package/dist/editor.d.ts.map +1 -0
  61. package/dist/editor.js +710 -0
  62. package/dist/editor.js.map +1 -0
  63. package/dist/floating-toolbar.d.ts +93 -0
  64. package/dist/floating-toolbar.d.ts.map +1 -0
  65. package/dist/floating-toolbar.js +159 -0
  66. package/dist/floating-toolbar.js.map +1 -0
  67. package/dist/index.d.ts +62 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +119 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/input-bridge.d.ts +273 -0
  72. package/dist/input-bridge.d.ts.map +1 -0
  73. package/dist/input-bridge.js +884 -0
  74. package/dist/input-bridge.js.map +1 -0
  75. package/dist/link-popover.d.ts +38 -0
  76. package/dist/link-popover.d.ts.map +1 -0
  77. package/dist/link-popover.js +278 -0
  78. package/dist/link-popover.js.map +1 -0
  79. package/dist/mark-renderer.d.ts +275 -0
  80. package/dist/mark-renderer.d.ts.map +1 -0
  81. package/dist/mark-renderer.js +210 -0
  82. package/dist/mark-renderer.js.map +1 -0
  83. package/dist/perf.d.ts +145 -0
  84. package/dist/perf.d.ts.map +1 -0
  85. package/dist/perf.js +260 -0
  86. package/dist/perf.js.map +1 -0
  87. package/dist/plugin-kit.d.ts +265 -0
  88. package/dist/plugin-kit.d.ts.map +1 -0
  89. package/dist/plugin-kit.js +234 -0
  90. package/dist/plugin-kit.js.map +1 -0
  91. package/dist/plugins/alignment-plugin.d.ts +68 -0
  92. package/dist/plugins/alignment-plugin.d.ts.map +1 -0
  93. package/dist/plugins/alignment-plugin.js +98 -0
  94. package/dist/plugins/alignment-plugin.js.map +1 -0
  95. package/dist/plugins/block-utils.d.ts +113 -0
  96. package/dist/plugins/block-utils.d.ts.map +1 -0
  97. package/dist/plugins/block-utils.js +191 -0
  98. package/dist/plugins/block-utils.js.map +1 -0
  99. package/dist/plugins/blockquote-plugin.d.ts +39 -0
  100. package/dist/plugins/blockquote-plugin.d.ts.map +1 -0
  101. package/dist/plugins/blockquote-plugin.js +88 -0
  102. package/dist/plugins/blockquote-plugin.js.map +1 -0
  103. package/dist/plugins/bold-plugin.d.ts +37 -0
  104. package/dist/plugins/bold-plugin.d.ts.map +1 -0
  105. package/dist/plugins/bold-plugin.js +48 -0
  106. package/dist/plugins/bold-plugin.js.map +1 -0
  107. package/dist/plugins/callout-plugin.d.ts +100 -0
  108. package/dist/plugins/callout-plugin.d.ts.map +1 -0
  109. package/dist/plugins/callout-plugin.js +200 -0
  110. package/dist/plugins/callout-plugin.js.map +1 -0
  111. package/dist/plugins/code-block-plugin.d.ts +62 -0
  112. package/dist/plugins/code-block-plugin.d.ts.map +1 -0
  113. package/dist/plugins/code-block-plugin.js +176 -0
  114. package/dist/plugins/code-block-plugin.js.map +1 -0
  115. package/dist/plugins/code-plugin.d.ts +37 -0
  116. package/dist/plugins/code-plugin.d.ts.map +1 -0
  117. package/dist/plugins/code-plugin.js +48 -0
  118. package/dist/plugins/code-plugin.js.map +1 -0
  119. package/dist/plugins/embed-plugin.d.ts +90 -0
  120. package/dist/plugins/embed-plugin.d.ts.map +1 -0
  121. package/dist/plugins/embed-plugin.js +147 -0
  122. package/dist/plugins/embed-plugin.js.map +1 -0
  123. package/dist/plugins/font-family-plugin.d.ts +58 -0
  124. package/dist/plugins/font-family-plugin.d.ts.map +1 -0
  125. package/dist/plugins/font-family-plugin.js +57 -0
  126. package/dist/plugins/font-family-plugin.js.map +1 -0
  127. package/dist/plugins/font-size-plugin.d.ts +57 -0
  128. package/dist/plugins/font-size-plugin.d.ts.map +1 -0
  129. package/dist/plugins/font-size-plugin.js +56 -0
  130. package/dist/plugins/font-size-plugin.js.map +1 -0
  131. package/dist/plugins/heading-plugin.d.ts +52 -0
  132. package/dist/plugins/heading-plugin.d.ts.map +1 -0
  133. package/dist/plugins/heading-plugin.js +114 -0
  134. package/dist/plugins/heading-plugin.js.map +1 -0
  135. package/dist/plugins/hr-plugin.d.ts +33 -0
  136. package/dist/plugins/hr-plugin.d.ts.map +1 -0
  137. package/dist/plugins/hr-plugin.js +75 -0
  138. package/dist/plugins/hr-plugin.js.map +1 -0
  139. package/dist/plugins/image-plugin.d.ts +115 -0
  140. package/dist/plugins/image-plugin.d.ts.map +1 -0
  141. package/dist/plugins/image-plugin.js +199 -0
  142. package/dist/plugins/image-plugin.js.map +1 -0
  143. package/dist/plugins/indent-plugin.d.ts +62 -0
  144. package/dist/plugins/indent-plugin.d.ts.map +1 -0
  145. package/dist/plugins/indent-plugin.js +128 -0
  146. package/dist/plugins/indent-plugin.js.map +1 -0
  147. package/dist/plugins/index.d.ts +45 -0
  148. package/dist/plugins/index.d.ts.map +1 -0
  149. package/dist/plugins/index.js +42 -0
  150. package/dist/plugins/index.js.map +1 -0
  151. package/dist/plugins/italic-plugin.d.ts +37 -0
  152. package/dist/plugins/italic-plugin.d.ts.map +1 -0
  153. package/dist/plugins/italic-plugin.js +48 -0
  154. package/dist/plugins/italic-plugin.js.map +1 -0
  155. package/dist/plugins/link-plugin.d.ts +129 -0
  156. package/dist/plugins/link-plugin.d.ts.map +1 -0
  157. package/dist/plugins/link-plugin.js +212 -0
  158. package/dist/plugins/link-plugin.js.map +1 -0
  159. package/dist/plugins/list-plugin.d.ts +53 -0
  160. package/dist/plugins/list-plugin.d.ts.map +1 -0
  161. package/dist/plugins/list-plugin.js +309 -0
  162. package/dist/plugins/list-plugin.js.map +1 -0
  163. package/dist/plugins/mark-utils.d.ts +173 -0
  164. package/dist/plugins/mark-utils.d.ts.map +1 -0
  165. package/dist/plugins/mark-utils.js +425 -0
  166. package/dist/plugins/mark-utils.js.map +1 -0
  167. package/dist/plugins/mention-plugin.d.ts +191 -0
  168. package/dist/plugins/mention-plugin.d.ts.map +1 -0
  169. package/dist/plugins/mention-plugin.js +295 -0
  170. package/dist/plugins/mention-plugin.js.map +1 -0
  171. package/dist/plugins/strikethrough-plugin.d.ts +37 -0
  172. package/dist/plugins/strikethrough-plugin.d.ts.map +1 -0
  173. package/dist/plugins/strikethrough-plugin.js +48 -0
  174. package/dist/plugins/strikethrough-plugin.js.map +1 -0
  175. package/dist/plugins/text-color-plugin.d.ts +57 -0
  176. package/dist/plugins/text-color-plugin.d.ts.map +1 -0
  177. package/dist/plugins/text-color-plugin.js +56 -0
  178. package/dist/plugins/text-color-plugin.js.map +1 -0
  179. package/dist/plugins/underline-plugin.d.ts +37 -0
  180. package/dist/plugins/underline-plugin.d.ts.map +1 -0
  181. package/dist/plugins/underline-plugin.js +48 -0
  182. package/dist/plugins/underline-plugin.js.map +1 -0
  183. package/dist/presets.d.ts +95 -0
  184. package/dist/presets.d.ts.map +1 -0
  185. package/dist/presets.js +159 -0
  186. package/dist/presets.js.map +1 -0
  187. package/dist/renderer.d.ts +125 -0
  188. package/dist/renderer.d.ts.map +1 -0
  189. package/dist/renderer.js +415 -0
  190. package/dist/renderer.js.map +1 -0
  191. package/dist/scroll-to-cursor.d.ts +25 -0
  192. package/dist/scroll-to-cursor.d.ts.map +1 -0
  193. package/dist/scroll-to-cursor.js +59 -0
  194. package/dist/scroll-to-cursor.js.map +1 -0
  195. package/dist/selection-sync.d.ts +159 -0
  196. package/dist/selection-sync.d.ts.map +1 -0
  197. package/dist/selection-sync.js +527 -0
  198. package/dist/selection-sync.js.map +1 -0
  199. package/dist/shortcut-handler.d.ts +98 -0
  200. package/dist/shortcut-handler.d.ts.map +1 -0
  201. package/dist/shortcut-handler.js +155 -0
  202. package/dist/shortcut-handler.js.map +1 -0
  203. package/dist/toolbar.d.ts +103 -0
  204. package/dist/toolbar.d.ts.map +1 -0
  205. package/dist/toolbar.js +134 -0
  206. package/dist/toolbar.js.map +1 -0
  207. package/dist/trigger-manager.d.ts +205 -0
  208. package/dist/trigger-manager.d.ts.map +1 -0
  209. package/dist/trigger-manager.js +466 -0
  210. package/dist/trigger-manager.js.map +1 -0
  211. package/dist/types.d.ts +216 -0
  212. package/dist/types.d.ts.map +1 -0
  213. package/dist/types.js +2 -0
  214. package/dist/types.js.map +1 -0
  215. package/package.json +30 -0
@@ -0,0 +1,295 @@
1
+ /**
2
+ * @mention plugin — parameterized mark for user mentions with trigger-based
3
+ * picker integration.
4
+ *
5
+ * The plugin has two parts:
6
+ * - **Engine plugin** (`plugin` property): Mark type registration + commands.
7
+ * - **Web `attach()`**: Trigger registration + mark renderer.
8
+ *
9
+ * Consumers render their own UI (dropdown, popover, etc.) using the
10
+ * session callbacks. The plugin handles all the RTIF operation plumbing.
11
+ *
12
+ * @module
13
+ */
14
+ import { findContiguousMarkRange } from './mark-utils.js';
15
+ /**
16
+ * Command name constants for the mention plugin.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * engine.exec(MentionCommands.INSERT, { id: 'user-123', displayName: 'Alice' });
21
+ * engine.exec(MentionCommands.REMOVE);
22
+ * ```
23
+ */
24
+ export const MentionCommands = {
25
+ INSERT: 'insertMention',
26
+ REMOVE: 'removeMention',
27
+ };
28
+ // ---------------------------------------------------------------------------
29
+ // Factory
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Create a mention plugin with trigger-based picker integration.
33
+ *
34
+ * @param config - The mention plugin configuration
35
+ * @returns A result with `plugin` (for engine) and `attach()` (for web editor)
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * const mention = createMentionPlugin({
40
+ * onActivate(session) { showDropdown(session.query, session.getTriggerRect()); },
41
+ * onDeactivate() { hideDropdown(); },
42
+ * onChange(session) { filterDropdown(session.query); },
43
+ * onKeyDown(session, event) {
44
+ * if (event.key === 'Enter') { session.accept(selected); return true; }
45
+ * return false;
46
+ * },
47
+ * });
48
+ *
49
+ * engine.use(mention.plugin);
50
+ * const editor = createWebEditor({ root, engine, accessibleLabel: 'Editor' });
51
+ * const detach = mention.attach(editor);
52
+ * ```
53
+ */
54
+ export function createMentionPlugin(config) {
55
+ const triggerChar = config.triggerChar ?? '@';
56
+ const appendSpace = config.appendSpace !== false;
57
+ // -------------------------------------------------------------------
58
+ // Engine plugin
59
+ // -------------------------------------------------------------------
60
+ const plugin = {
61
+ id: 'mark-mention',
62
+ init(ctx) {
63
+ // Register mention mark type with validator
64
+ ctx.registerMarkType('mention', {
65
+ validate(value) {
66
+ if (typeof value !== 'object' || value === null)
67
+ return false;
68
+ const v = value;
69
+ return typeof v.id === 'string' && typeof v.displayName === 'string';
70
+ },
71
+ });
72
+ // -----------------------------------------------------------
73
+ // insertMention command
74
+ // -----------------------------------------------------------
75
+ ctx.registerCommand(MentionCommands.INSERT, {
76
+ execute(engine, payload) {
77
+ const p = payload;
78
+ if (!p || !p.id || !p.displayName)
79
+ return;
80
+ const { anchor, focus } = engine.state.selection;
81
+ const start = Math.min(anchor.offset, focus.offset);
82
+ const end = Math.max(anchor.offset, focus.offset);
83
+ const text = `${triggerChar}${p.displayName}`;
84
+ const mentionMark = { id: p.id, displayName: p.displayName };
85
+ const ops = [];
86
+ // Delete selection if present
87
+ if (start !== end) {
88
+ ops.push({
89
+ type: 'delete_text',
90
+ offset: start,
91
+ count: end - start,
92
+ });
93
+ }
94
+ // Insert mention text
95
+ ops.push({
96
+ type: 'insert_text',
97
+ offset: start,
98
+ text,
99
+ });
100
+ // Apply mention mark
101
+ ops.push({
102
+ type: 'set_span_marks',
103
+ offset: start,
104
+ count: text.length,
105
+ marks: { mention: mentionMark },
106
+ });
107
+ // Append space
108
+ ops.push({
109
+ type: 'insert_text',
110
+ offset: start + text.length,
111
+ text: ' ',
112
+ });
113
+ engine.dispatch(ops);
114
+ },
115
+ canExecute() {
116
+ return true;
117
+ },
118
+ isActive(engine) {
119
+ const marks = engine.getMarksAtOffset(engine.state.selection.focus.offset);
120
+ return (typeof marks.mention === 'object' &&
121
+ marks.mention !== null);
122
+ },
123
+ });
124
+ // -----------------------------------------------------------
125
+ // removeMention command
126
+ // -----------------------------------------------------------
127
+ ctx.registerCommand(MentionCommands.REMOVE, {
128
+ execute(engine) {
129
+ const focusOffset = engine.state.selection.focus.offset;
130
+ const range = findContiguousMarkRange(engine.state.doc, focusOffset, 'mention');
131
+ if (!range)
132
+ return;
133
+ engine.dispatch({
134
+ type: 'set_span_marks',
135
+ offset: range.offset,
136
+ count: range.count,
137
+ marks: { mention: null },
138
+ });
139
+ },
140
+ canExecute(engine) {
141
+ const marks = engine.getMarksAtOffset(engine.state.selection.focus.offset);
142
+ return typeof marks.mention === 'object' && marks.mention !== null;
143
+ },
144
+ });
145
+ },
146
+ };
147
+ // -------------------------------------------------------------------
148
+ // Web attach
149
+ // -------------------------------------------------------------------
150
+ function attach(editor) {
151
+ // Register mention mark renderer
152
+ editor.markRenderers.register('mention', {
153
+ atomic: true,
154
+ apply(el, value) {
155
+ el.classList.add('rtif-mention');
156
+ el.setAttribute('contenteditable', 'false');
157
+ if (typeof value === 'object' && value !== null) {
158
+ const m = value;
159
+ if (typeof m.id === 'string') {
160
+ el.setAttribute('data-mention-id', m.id);
161
+ }
162
+ if (typeof m.displayName === 'string') {
163
+ el.setAttribute('data-mention-name', m.displayName);
164
+ }
165
+ }
166
+ },
167
+ });
168
+ // Wrap TriggerSession → MentionSession
169
+ function wrapSession(triggerSession) {
170
+ return {
171
+ query: triggerSession.query,
172
+ triggerOffset: triggerSession.triggerOffset,
173
+ getTriggerRect: () => triggerSession.getTriggerRect(),
174
+ getCursorRect: () => triggerSession.getCursorRect(),
175
+ accept(mention) {
176
+ const result = {
177
+ text: `${triggerChar}${mention.displayName}`,
178
+ marks: { mention: { id: mention.id, displayName: mention.displayName } },
179
+ appendSpace,
180
+ };
181
+ triggerSession.accept(result);
182
+ },
183
+ dismiss: () => triggerSession.dismiss(),
184
+ isActive: () => triggerSession.isActive(),
185
+ };
186
+ }
187
+ // Register trigger
188
+ const triggerDisposable = editor.triggers.register({
189
+ id: 'mention',
190
+ char: triggerChar,
191
+ position: config.triggerPosition,
192
+ onActivate(session) {
193
+ config.onActivate(wrapSession(session));
194
+ },
195
+ onDeactivate: config.onDeactivate,
196
+ onChange: config.onChange
197
+ ? (session) => config.onChange(wrapSession(session))
198
+ : undefined,
199
+ onKeyDown: config.onKeyDown
200
+ ? (session, event) => config.onKeyDown(wrapSession(session), event)
201
+ : undefined,
202
+ onPositionChange: config.onPositionChange
203
+ ? (session) => config.onPositionChange(wrapSession(session))
204
+ : undefined,
205
+ });
206
+ return {
207
+ dispose() {
208
+ triggerDisposable.dispose();
209
+ },
210
+ };
211
+ }
212
+ return { plugin, attach };
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Mention serializers (for format plugin integration)
216
+ // ---------------------------------------------------------------------------
217
+ /**
218
+ * Mention serializer for plaintext format.
219
+ * Produces: `@Alice` (just the display text, matching the span text).
220
+ *
221
+ * @example
222
+ * ```ts
223
+ * mentionPlaintextSerializer.serialize('@Alice', { id: 'u1', displayName: 'Alice' });
224
+ * // => '@Alice'
225
+ * ```
226
+ */
227
+ export const mentionPlaintextSerializer = {
228
+ serialize(text) {
229
+ return text;
230
+ },
231
+ };
232
+ /**
233
+ * Mention serializer for markdown format.
234
+ * Produces: `[@Alice](mention:user-123)` (link-like syntax with mention: scheme).
235
+ *
236
+ * @example
237
+ * ```ts
238
+ * mentionMarkdownSerializer.serialize('@Alice', { id: 'u1', displayName: 'Alice' });
239
+ * // => '[@Alice](mention:u1)'
240
+ * ```
241
+ */
242
+ export const mentionMarkdownSerializer = {
243
+ serialize(text, value) {
244
+ const m = value;
245
+ const id = m?.id ?? '';
246
+ return `[${text}](mention:${id})`;
247
+ },
248
+ deserialize(formatted) {
249
+ const match = /^\[([^\]]+)\]\(mention:([^)]+)\)$/.exec(formatted);
250
+ if (!match)
251
+ return null;
252
+ const displayText = match[1];
253
+ const id = match[2];
254
+ // Strip leading @ from display text if present
255
+ const displayName = displayText.startsWith('@') ? displayText.slice(1) : displayText;
256
+ return { id, displayName };
257
+ },
258
+ };
259
+ /**
260
+ * Mention serializer for HTML format.
261
+ * Produces: `<span data-mention-id="user-123" data-mention-name="Alice">@Alice</span>`.
262
+ *
263
+ * @example
264
+ * ```ts
265
+ * mentionHtmlSerializer.serialize('@Alice', { id: 'u1', displayName: 'Alice' });
266
+ * // => '<span data-mention-id="u1" data-mention-name="Alice">@Alice</span>'
267
+ * ```
268
+ */
269
+ export const mentionHtmlSerializer = {
270
+ serialize(text, value) {
271
+ const m = value;
272
+ const id = escapeHtml(m?.id ?? '');
273
+ const name = escapeHtml(m?.displayName ?? '');
274
+ const escapedText = escapeHtml(text);
275
+ return `<span data-mention-id="${id}" data-mention-name="${name}">${escapedText}</span>`;
276
+ },
277
+ deserialize(formatted) {
278
+ const match = /data-mention-id="([^"]*)"/.exec(formatted);
279
+ const nameMatch = /data-mention-name="([^"]*)"/.exec(formatted);
280
+ if (!match)
281
+ return null;
282
+ const id = match[1];
283
+ const displayName = nameMatch?.[1] ?? '';
284
+ return { id, displayName };
285
+ },
286
+ };
287
+ /** Escape special HTML characters in a string. */
288
+ function escapeHtml(str) {
289
+ return str
290
+ .replace(/&/g, '&amp;')
291
+ .replace(/</g, '&lt;')
292
+ .replace(/>/g, '&gt;')
293
+ .replace(/"/g, '&quot;');
294
+ }
295
+ //# sourceMappingURL=mention-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-plugin.js","sourceRoot":"","sources":["../../src/plugins/mention-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Strikethrough mark plugin — registers the `strikethrough` mark type,
3
+ * `toggleMark:strikethrough` command, and Cmd/Ctrl+Shift+X keyboard shortcut.
4
+ *
5
+ * @module
6
+ */
7
+ import type { Plugin } from '@rtif-sdk/engine';
8
+ /**
9
+ * Command name constants for the strikethrough plugin.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * engine.exec(StrikethroughCommands.TOGGLE);
14
+ * ```
15
+ */
16
+ export declare const StrikethroughCommands: {
17
+ readonly TOGGLE: "toggleMark:strikethrough";
18
+ };
19
+ /**
20
+ * Create the strikethrough mark plugin.
21
+ *
22
+ * Registers:
23
+ * - Mark type: `strikethrough` (value must be `true`)
24
+ * - Command: `toggleMark:strikethrough`
25
+ * - Shortcut: Cmd/Ctrl+Shift+X
26
+ *
27
+ * @returns A plugin instance ready for `engine.use()`
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const engine = createEngine(initialDoc);
32
+ * engine.use(strikethroughPlugin());
33
+ * engine.exec(StrikethroughCommands.TOGGLE);
34
+ * ```
35
+ */
36
+ export declare function strikethroughPlugin(): Plugin;
37
+ //# sourceMappingURL=strikethrough-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strikethrough-plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/strikethrough-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB;;CAExB,CAAC;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAmB5C"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Strikethrough mark plugin — registers the `strikethrough` mark type,
3
+ * `toggleMark:strikethrough` command, and Cmd/Ctrl+Shift+X keyboard shortcut.
4
+ *
5
+ * @module
6
+ */
7
+ import { createToggleMarkCommand } from './mark-utils.js';
8
+ /**
9
+ * Command name constants for the strikethrough plugin.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * engine.exec(StrikethroughCommands.TOGGLE);
14
+ * ```
15
+ */
16
+ export const StrikethroughCommands = {
17
+ TOGGLE: 'toggleMark:strikethrough',
18
+ };
19
+ /**
20
+ * Create the strikethrough mark plugin.
21
+ *
22
+ * Registers:
23
+ * - Mark type: `strikethrough` (value must be `true`)
24
+ * - Command: `toggleMark:strikethrough`
25
+ * - Shortcut: Cmd/Ctrl+Shift+X
26
+ *
27
+ * @returns A plugin instance ready for `engine.use()`
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const engine = createEngine(initialDoc);
32
+ * engine.use(strikethroughPlugin());
33
+ * engine.exec(StrikethroughCommands.TOGGLE);
34
+ * ```
35
+ */
36
+ export function strikethroughPlugin() {
37
+ return {
38
+ id: 'mark-strikethrough',
39
+ init(ctx) {
40
+ ctx.registerMarkType('strikethrough', {
41
+ validate: (value) => value === true,
42
+ });
43
+ ctx.registerCommand(StrikethroughCommands.TOGGLE, createToggleMarkCommand('strikethrough'));
44
+ ctx.registerShortcut({ key: 'x', mod: true, shift: true }, StrikethroughCommands.TOGGLE);
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=strikethrough-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strikethrough-plugin.js","sourceRoot":"","sources":["../../src/plugins/strikethrough-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,MAAM,EAAE,0BAA0B;CAC1B,CAAC;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,EAAE,oBAAoB;QACxB,IAAI,CAAC,GAAG;YACN,GAAG,CAAC,gBAAgB,CAAC,eAAe,EAAE;gBACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI;aACpC,CAAC,CAAC;YAEH,GAAG,CAAC,eAAe,CACjB,qBAAqB,CAAC,MAAM,EAC5B,uBAAuB,CAAC,eAAe,CAAC,CACzC,CAAC;YAEF,GAAG,CAAC,gBAAgB,CAClB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EACpC,qBAAqB,CAAC,MAAM,CAC7B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Text color mark plugin — registers the `color` mark type,
3
+ * `setTextColor` and `removeTextColor` commands.
4
+ *
5
+ * This is a parameterized mark plugin: the mark value is a CSS color string
6
+ * (e.g., `"#ff0000"`, `"red"`, `"rgb(255, 0, 0)"`).
7
+ *
8
+ * @module
9
+ */
10
+ import type { Plugin } from '@rtif-sdk/engine';
11
+ /**
12
+ * Command name constants for the text color plugin.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * engine.exec(TextColorCommands.SET, { color: '#ff0000' });
17
+ * engine.exec(TextColorCommands.REMOVE);
18
+ * ```
19
+ */
20
+ export declare const TextColorCommands: {
21
+ readonly SET: "setTextColor";
22
+ readonly REMOVE: "removeTextColor";
23
+ };
24
+ /**
25
+ * Payload for the `setTextColor` command.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * engine.exec('setTextColor', { color: '#ff0000' });
30
+ * ```
31
+ */
32
+ export interface SetTextColorPayload {
33
+ /** The CSS color value to apply */
34
+ readonly color: string;
35
+ }
36
+ /**
37
+ * Create the text color mark plugin.
38
+ *
39
+ * Registers:
40
+ * - Mark type: `color` (value must be a non-empty string)
41
+ * - Command: `setTextColor` — apply color to selection or set pending mark
42
+ * - Command: `removeTextColor` — remove color from selection or set pending mark null
43
+ *
44
+ * No keyboard shortcuts are registered.
45
+ *
46
+ * @returns A plugin instance ready for `engine.use()`
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const engine = createEngine(initialDoc);
51
+ * engine.use(textColorPlugin());
52
+ * engine.exec(TextColorCommands.SET, { color: '#ff0000' });
53
+ * engine.exec(TextColorCommands.REMOVE);
54
+ * ```
55
+ */
56
+ export declare function textColorPlugin(): Plugin;
57
+ //# sourceMappingURL=text-color-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-color-plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/text-color-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAgBxC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Text color mark plugin — registers the `color` mark type,
3
+ * `setTextColor` and `removeTextColor` commands.
4
+ *
5
+ * This is a parameterized mark plugin: the mark value is a CSS color string
6
+ * (e.g., `"#ff0000"`, `"red"`, `"rgb(255, 0, 0)"`).
7
+ *
8
+ * @module
9
+ */
10
+ import { createSetMarkCommand, createRemoveMarkCommand } from './mark-utils.js';
11
+ /**
12
+ * Command name constants for the text color plugin.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * engine.exec(TextColorCommands.SET, { color: '#ff0000' });
17
+ * engine.exec(TextColorCommands.REMOVE);
18
+ * ```
19
+ */
20
+ export const TextColorCommands = {
21
+ SET: 'setTextColor',
22
+ REMOVE: 'removeTextColor',
23
+ };
24
+ /**
25
+ * Create the text color mark plugin.
26
+ *
27
+ * Registers:
28
+ * - Mark type: `color` (value must be a non-empty string)
29
+ * - Command: `setTextColor` — apply color to selection or set pending mark
30
+ * - Command: `removeTextColor` — remove color from selection or set pending mark null
31
+ *
32
+ * No keyboard shortcuts are registered.
33
+ *
34
+ * @returns A plugin instance ready for `engine.use()`
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const engine = createEngine(initialDoc);
39
+ * engine.use(textColorPlugin());
40
+ * engine.exec(TextColorCommands.SET, { color: '#ff0000' });
41
+ * engine.exec(TextColorCommands.REMOVE);
42
+ * ```
43
+ */
44
+ export function textColorPlugin() {
45
+ return {
46
+ id: 'mark-color',
47
+ init(ctx) {
48
+ ctx.registerMarkType('color', {
49
+ validate: (value) => typeof value === 'string' && value.length > 0,
50
+ });
51
+ ctx.registerCommand(TextColorCommands.SET, createSetMarkCommand('color', (p) => p.color));
52
+ ctx.registerCommand(TextColorCommands.REMOVE, createRemoveMarkCommand('color'));
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=text-color-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-color-plugin.js","sourceRoot":"","sources":["../../src/plugins/text-color-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEhF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,EAAE,cAAc;IACnB,MAAM,EAAE,iBAAiB;CACjB,CAAC;AAeX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,IAAI,CAAC,GAAG;YACN,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE;gBAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;aACnE,CAAC,CAAC;YAEH,GAAG,CAAC,eAAe,CACjB,iBAAiB,CAAC,GAAG,EACrB,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAE,CAAyB,CAAC,KAAK,CAAC,CACvE,CAAC;YAEF,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;QAClF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Underline mark plugin — registers the `underline` mark type, `toggleMark:underline`
3
+ * command, and Cmd/Ctrl+U keyboard shortcut.
4
+ *
5
+ * @module
6
+ */
7
+ import type { Plugin } from '@rtif-sdk/engine';
8
+ /**
9
+ * Command name constants for the underline plugin.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * engine.exec(UnderlineCommands.TOGGLE);
14
+ * ```
15
+ */
16
+ export declare const UnderlineCommands: {
17
+ readonly TOGGLE: "toggleMark:underline";
18
+ };
19
+ /**
20
+ * Create the underline mark plugin.
21
+ *
22
+ * Registers:
23
+ * - Mark type: `underline` (value must be `true`)
24
+ * - Command: `toggleMark:underline`
25
+ * - Shortcut: Cmd/Ctrl+U
26
+ *
27
+ * @returns A plugin instance ready for `engine.use()`
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const engine = createEngine(initialDoc);
32
+ * engine.use(underlinePlugin());
33
+ * engine.exec(UnderlineCommands.TOGGLE);
34
+ * ```
35
+ */
36
+ export declare function underlinePlugin(): Plugin;
37
+ //# sourceMappingURL=underline-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"underline-plugin.d.ts","sourceRoot":"","sources":["../../src/plugins/underline-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG/C;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;;CAEpB,CAAC;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAgBxC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Underline mark plugin — registers the `underline` mark type, `toggleMark:underline`
3
+ * command, and Cmd/Ctrl+U keyboard shortcut.
4
+ *
5
+ * @module
6
+ */
7
+ import { createToggleMarkCommand } from './mark-utils.js';
8
+ /**
9
+ * Command name constants for the underline plugin.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * engine.exec(UnderlineCommands.TOGGLE);
14
+ * ```
15
+ */
16
+ export const UnderlineCommands = {
17
+ TOGGLE: 'toggleMark:underline',
18
+ };
19
+ /**
20
+ * Create the underline mark plugin.
21
+ *
22
+ * Registers:
23
+ * - Mark type: `underline` (value must be `true`)
24
+ * - Command: `toggleMark:underline`
25
+ * - Shortcut: Cmd/Ctrl+U
26
+ *
27
+ * @returns A plugin instance ready for `engine.use()`
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const engine = createEngine(initialDoc);
32
+ * engine.use(underlinePlugin());
33
+ * engine.exec(UnderlineCommands.TOGGLE);
34
+ * ```
35
+ */
36
+ export function underlinePlugin() {
37
+ return {
38
+ id: 'mark-underline',
39
+ init(ctx) {
40
+ ctx.registerMarkType('underline', {
41
+ validate: (value) => value === true,
42
+ });
43
+ ctx.registerCommand(UnderlineCommands.TOGGLE, createToggleMarkCommand('underline'));
44
+ ctx.registerShortcut({ key: 'u', mod: true }, UnderlineCommands.TOGGLE);
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=underline-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"underline-plugin.js","sourceRoot":"","sources":["../../src/plugins/underline-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,sBAAsB;CACtB,CAAC;AAEX;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,EAAE,EAAE,gBAAgB;QACpB,IAAI,CAAC,GAAG;YACN,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE;gBAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI;aACpC,CAAC,CAAC;YAEH,GAAG,CAAC,eAAe,CACjB,iBAAiB,CAAC,MAAM,EACxB,uBAAuB,CAAC,WAAW,CAAC,CACrC,CAAC;YAEF,GAAG,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1E,CAAC;KACF,CAAC;AACJ,CAAC"}