@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.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/block-drag-handler.d.ts +189 -0
- package/dist/block-drag-handler.d.ts.map +1 -0
- package/dist/block-drag-handler.js +745 -0
- package/dist/block-drag-handler.js.map +1 -0
- package/dist/block-renderer.d.ts +402 -0
- package/dist/block-renderer.d.ts.map +1 -0
- package/dist/block-renderer.js +424 -0
- package/dist/block-renderer.js.map +1 -0
- package/dist/clipboard.d.ts +178 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +432 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/command-bus.d.ts +113 -0
- package/dist/command-bus.d.ts.map +1 -0
- package/dist/command-bus.js +70 -0
- package/dist/command-bus.js.map +1 -0
- package/dist/composition.d.ts +220 -0
- package/dist/composition.d.ts.map +1 -0
- package/dist/composition.js +271 -0
- package/dist/composition.js.map +1 -0
- package/dist/content-extraction.d.ts +69 -0
- package/dist/content-extraction.d.ts.map +1 -0
- package/dist/content-extraction.js +228 -0
- package/dist/content-extraction.js.map +1 -0
- package/dist/content-handler-file.d.ts +40 -0
- package/dist/content-handler-file.d.ts.map +1 -0
- package/dist/content-handler-file.js +91 -0
- package/dist/content-handler-file.js.map +1 -0
- package/dist/content-handler-image.d.ts +82 -0
- package/dist/content-handler-image.d.ts.map +1 -0
- package/dist/content-handler-image.js +120 -0
- package/dist/content-handler-image.js.map +1 -0
- package/dist/content-handler-url.d.ts +129 -0
- package/dist/content-handler-url.d.ts.map +1 -0
- package/dist/content-handler-url.js +244 -0
- package/dist/content-handler-url.js.map +1 -0
- package/dist/content-handlers.d.ts +67 -0
- package/dist/content-handlers.d.ts.map +1 -0
- package/dist/content-handlers.js +263 -0
- package/dist/content-handlers.js.map +1 -0
- package/dist/content-pipeline.d.ts +383 -0
- package/dist/content-pipeline.d.ts.map +1 -0
- package/dist/content-pipeline.js +232 -0
- package/dist/content-pipeline.js.map +1 -0
- package/dist/cursor-nav.d.ts +149 -0
- package/dist/cursor-nav.d.ts.map +1 -0
- package/dist/cursor-nav.js +230 -0
- package/dist/cursor-nav.js.map +1 -0
- package/dist/cursor-rect.d.ts +65 -0
- package/dist/cursor-rect.d.ts.map +1 -0
- package/dist/cursor-rect.js +98 -0
- package/dist/cursor-rect.js.map +1 -0
- package/dist/drop-indicator.d.ts +108 -0
- package/dist/drop-indicator.d.ts.map +1 -0
- package/dist/drop-indicator.js +236 -0
- package/dist/drop-indicator.js.map +1 -0
- package/dist/editor.d.ts +41 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +710 -0
- package/dist/editor.js.map +1 -0
- package/dist/floating-toolbar.d.ts +93 -0
- package/dist/floating-toolbar.d.ts.map +1 -0
- package/dist/floating-toolbar.js +159 -0
- package/dist/floating-toolbar.js.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +119 -0
- package/dist/index.js.map +1 -0
- package/dist/input-bridge.d.ts +273 -0
- package/dist/input-bridge.d.ts.map +1 -0
- package/dist/input-bridge.js +884 -0
- package/dist/input-bridge.js.map +1 -0
- package/dist/link-popover.d.ts +38 -0
- package/dist/link-popover.d.ts.map +1 -0
- package/dist/link-popover.js +278 -0
- package/dist/link-popover.js.map +1 -0
- package/dist/mark-renderer.d.ts +275 -0
- package/dist/mark-renderer.d.ts.map +1 -0
- package/dist/mark-renderer.js +210 -0
- package/dist/mark-renderer.js.map +1 -0
- package/dist/perf.d.ts +145 -0
- package/dist/perf.d.ts.map +1 -0
- package/dist/perf.js +260 -0
- package/dist/perf.js.map +1 -0
- package/dist/plugin-kit.d.ts +265 -0
- package/dist/plugin-kit.d.ts.map +1 -0
- package/dist/plugin-kit.js +234 -0
- package/dist/plugin-kit.js.map +1 -0
- package/dist/plugins/alignment-plugin.d.ts +68 -0
- package/dist/plugins/alignment-plugin.d.ts.map +1 -0
- package/dist/plugins/alignment-plugin.js +98 -0
- package/dist/plugins/alignment-plugin.js.map +1 -0
- package/dist/plugins/block-utils.d.ts +113 -0
- package/dist/plugins/block-utils.d.ts.map +1 -0
- package/dist/plugins/block-utils.js +191 -0
- package/dist/plugins/block-utils.js.map +1 -0
- package/dist/plugins/blockquote-plugin.d.ts +39 -0
- package/dist/plugins/blockquote-plugin.d.ts.map +1 -0
- package/dist/plugins/blockquote-plugin.js +88 -0
- package/dist/plugins/blockquote-plugin.js.map +1 -0
- package/dist/plugins/bold-plugin.d.ts +37 -0
- package/dist/plugins/bold-plugin.d.ts.map +1 -0
- package/dist/plugins/bold-plugin.js +48 -0
- package/dist/plugins/bold-plugin.js.map +1 -0
- package/dist/plugins/callout-plugin.d.ts +100 -0
- package/dist/plugins/callout-plugin.d.ts.map +1 -0
- package/dist/plugins/callout-plugin.js +200 -0
- package/dist/plugins/callout-plugin.js.map +1 -0
- package/dist/plugins/code-block-plugin.d.ts +62 -0
- package/dist/plugins/code-block-plugin.d.ts.map +1 -0
- package/dist/plugins/code-block-plugin.js +176 -0
- package/dist/plugins/code-block-plugin.js.map +1 -0
- package/dist/plugins/code-plugin.d.ts +37 -0
- package/dist/plugins/code-plugin.d.ts.map +1 -0
- package/dist/plugins/code-plugin.js +48 -0
- package/dist/plugins/code-plugin.js.map +1 -0
- package/dist/plugins/embed-plugin.d.ts +90 -0
- package/dist/plugins/embed-plugin.d.ts.map +1 -0
- package/dist/plugins/embed-plugin.js +147 -0
- package/dist/plugins/embed-plugin.js.map +1 -0
- package/dist/plugins/font-family-plugin.d.ts +58 -0
- package/dist/plugins/font-family-plugin.d.ts.map +1 -0
- package/dist/plugins/font-family-plugin.js +57 -0
- package/dist/plugins/font-family-plugin.js.map +1 -0
- package/dist/plugins/font-size-plugin.d.ts +57 -0
- package/dist/plugins/font-size-plugin.d.ts.map +1 -0
- package/dist/plugins/font-size-plugin.js +56 -0
- package/dist/plugins/font-size-plugin.js.map +1 -0
- package/dist/plugins/heading-plugin.d.ts +52 -0
- package/dist/plugins/heading-plugin.d.ts.map +1 -0
- package/dist/plugins/heading-plugin.js +114 -0
- package/dist/plugins/heading-plugin.js.map +1 -0
- package/dist/plugins/hr-plugin.d.ts +33 -0
- package/dist/plugins/hr-plugin.d.ts.map +1 -0
- package/dist/plugins/hr-plugin.js +75 -0
- package/dist/plugins/hr-plugin.js.map +1 -0
- package/dist/plugins/image-plugin.d.ts +115 -0
- package/dist/plugins/image-plugin.d.ts.map +1 -0
- package/dist/plugins/image-plugin.js +199 -0
- package/dist/plugins/image-plugin.js.map +1 -0
- package/dist/plugins/indent-plugin.d.ts +62 -0
- package/dist/plugins/indent-plugin.d.ts.map +1 -0
- package/dist/plugins/indent-plugin.js +128 -0
- package/dist/plugins/indent-plugin.js.map +1 -0
- package/dist/plugins/index.d.ts +45 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +42 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/italic-plugin.d.ts +37 -0
- package/dist/plugins/italic-plugin.d.ts.map +1 -0
- package/dist/plugins/italic-plugin.js +48 -0
- package/dist/plugins/italic-plugin.js.map +1 -0
- package/dist/plugins/link-plugin.d.ts +129 -0
- package/dist/plugins/link-plugin.d.ts.map +1 -0
- package/dist/plugins/link-plugin.js +212 -0
- package/dist/plugins/link-plugin.js.map +1 -0
- package/dist/plugins/list-plugin.d.ts +53 -0
- package/dist/plugins/list-plugin.d.ts.map +1 -0
- package/dist/plugins/list-plugin.js +309 -0
- package/dist/plugins/list-plugin.js.map +1 -0
- package/dist/plugins/mark-utils.d.ts +173 -0
- package/dist/plugins/mark-utils.d.ts.map +1 -0
- package/dist/plugins/mark-utils.js +425 -0
- package/dist/plugins/mark-utils.js.map +1 -0
- package/dist/plugins/mention-plugin.d.ts +191 -0
- package/dist/plugins/mention-plugin.d.ts.map +1 -0
- package/dist/plugins/mention-plugin.js +295 -0
- package/dist/plugins/mention-plugin.js.map +1 -0
- package/dist/plugins/strikethrough-plugin.d.ts +37 -0
- package/dist/plugins/strikethrough-plugin.d.ts.map +1 -0
- package/dist/plugins/strikethrough-plugin.js +48 -0
- package/dist/plugins/strikethrough-plugin.js.map +1 -0
- package/dist/plugins/text-color-plugin.d.ts +57 -0
- package/dist/plugins/text-color-plugin.d.ts.map +1 -0
- package/dist/plugins/text-color-plugin.js +56 -0
- package/dist/plugins/text-color-plugin.js.map +1 -0
- package/dist/plugins/underline-plugin.d.ts +37 -0
- package/dist/plugins/underline-plugin.d.ts.map +1 -0
- package/dist/plugins/underline-plugin.js +48 -0
- package/dist/plugins/underline-plugin.js.map +1 -0
- package/dist/presets.d.ts +95 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +159 -0
- package/dist/presets.js.map +1 -0
- package/dist/renderer.d.ts +125 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +415 -0
- package/dist/renderer.js.map +1 -0
- package/dist/scroll-to-cursor.d.ts +25 -0
- package/dist/scroll-to-cursor.d.ts.map +1 -0
- package/dist/scroll-to-cursor.js +59 -0
- package/dist/scroll-to-cursor.js.map +1 -0
- package/dist/selection-sync.d.ts +159 -0
- package/dist/selection-sync.d.ts.map +1 -0
- package/dist/selection-sync.js +527 -0
- package/dist/selection-sync.js.map +1 -0
- package/dist/shortcut-handler.d.ts +98 -0
- package/dist/shortcut-handler.d.ts.map +1 -0
- package/dist/shortcut-handler.js +155 -0
- package/dist/shortcut-handler.js.map +1 -0
- package/dist/toolbar.d.ts +103 -0
- package/dist/toolbar.d.ts.map +1 -0
- package/dist/toolbar.js +134 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/trigger-manager.d.ts +205 -0
- package/dist/trigger-manager.d.ts.map +1 -0
- package/dist/trigger-manager.js +466 -0
- package/dist/trigger-manager.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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, '&')
|
|
291
|
+
.replace(/</g, '<')
|
|
292
|
+
.replace(/>/g, '>')
|
|
293
|
+
.replace(/"/g, '"');
|
|
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"}
|