@kumwe/studio-rich-text 0.1.0-alpha.10

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 (38) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/THIRD_PARTY_NOTICES.md +19 -0
  4. package/dist/first-party-tools.d.ts +173 -0
  5. package/dist/first-party-tools.d.ts.map +1 -0
  6. package/dist/first-party-tools.js +1012 -0
  7. package/dist/first-party-tools.js.map +1 -0
  8. package/dist/index.d.ts +62 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +648 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/markdown.d.ts +14 -0
  13. package/dist/markdown.d.ts.map +1 -0
  14. package/dist/markdown.js +272 -0
  15. package/dist/markdown.js.map +1 -0
  16. package/dist/profiles.d.ts +19 -0
  17. package/dist/profiles.d.ts.map +1 -0
  18. package/dist/profiles.js +87 -0
  19. package/dist/profiles.js.map +1 -0
  20. package/dist/safe-html.d.ts +16 -0
  21. package/dist/safe-html.d.ts.map +1 -0
  22. package/dist/safe-html.js +249 -0
  23. package/dist/safe-html.js.map +1 -0
  24. package/dist/strict-csp-surface.d.ts +10 -0
  25. package/dist/strict-csp-surface.d.ts.map +1 -0
  26. package/dist/strict-csp-surface.js +298 -0
  27. package/dist/strict-csp-surface.js.map +1 -0
  28. package/dist/studio-rich-text-editor.d.ts +55 -0
  29. package/dist/studio-rich-text-editor.d.ts.map +1 -0
  30. package/dist/studio-rich-text-editor.js +121 -0
  31. package/dist/studio-rich-text-editor.js.map +1 -0
  32. package/package.json +42 -0
  33. package/third-party-licenses/codex-notifier-1.1.2.txt +21 -0
  34. package/third-party-licenses/codex-tooltip-1.0.6.txt +7 -0
  35. package/third-party-licenses/editorjs__caret-1.1.0.txt +21 -0
  36. package/third-party-licenses/editorjs__dom-1.1.0.txt +21 -0
  37. package/third-party-licenses/editorjs__editorjs-2.31.6.txt +190 -0
  38. package/third-party-licenses/editorjs__helpers-1.2.2.txt +21 -0
@@ -0,0 +1,249 @@
1
+ import { parseRichTextDocument, } from './index.js';
2
+ import { resolveRichTextProfile } from './profiles.js';
3
+ const SAFE_TAG_CEILING = Object.freeze([
4
+ 'b',
5
+ 'blockquote',
6
+ 'br',
7
+ 'code',
8
+ 'del',
9
+ 'em',
10
+ 'h2',
11
+ 'h3',
12
+ 'h4',
13
+ 'hr',
14
+ 'i',
15
+ 'li',
16
+ 'ol',
17
+ 'p',
18
+ 's',
19
+ 'strong',
20
+ 'ul',
21
+ ]);
22
+ const DROP_WITH_CONTENT = new Set([
23
+ 'canvas',
24
+ 'embed',
25
+ 'iframe',
26
+ 'math',
27
+ 'noscript',
28
+ 'object',
29
+ 'script',
30
+ 'style',
31
+ 'svg',
32
+ 'template',
33
+ ]);
34
+ export const STUDIO_SAFE_HTML_POLICY = Object.freeze({
35
+ allowedTags: SAFE_TAG_CEILING,
36
+ maximumInputCharacters: 1_000_000,
37
+ unknownElements: 'unwrap',
38
+ });
39
+ /**
40
+ * Import inert HTML into canonical rich text. The DOM is only a parser: no
41
+ * parsed node is connected, no handler/URL/style survives, and `innerHTML` is
42
+ * never read or assigned.
43
+ */
44
+ export function importSafeHtml(source, policy = {}) {
45
+ const normalized = normalizePolicy(policy);
46
+ if (source.length > normalized.maximumInputCharacters) {
47
+ throw new RangeError('HTML input exceeds its configured character limit.');
48
+ }
49
+ if (typeof DOMParser !== 'function') {
50
+ throw new Error('Safe HTML import requires a standards-compatible DOMParser.');
51
+ }
52
+ const parsed = new DOMParser().parseFromString(source, 'text/html');
53
+ const blocks = [];
54
+ let looseInline = [];
55
+ const flushLoose = () => {
56
+ const content = compactInline(looseInline);
57
+ if (content.length > 0) {
58
+ blocks.push({ content, type: 'paragraph' });
59
+ }
60
+ looseInline = [];
61
+ };
62
+ for (const child of parsed.body.childNodes) {
63
+ if (child.nodeType === Node.TEXT_NODE) {
64
+ looseInline.push(...inlineNodes(child, [], normalized));
65
+ continue;
66
+ }
67
+ if (!(child instanceof Element)) {
68
+ continue;
69
+ }
70
+ const converted = blockNode(child, normalized);
71
+ if (converted === undefined) {
72
+ if (!DROP_WITH_CONTENT.has(child.localName)) {
73
+ looseInline.push(...inlineNodes(child, [], normalized));
74
+ }
75
+ continue;
76
+ }
77
+ flushLoose();
78
+ blocks.push(converted);
79
+ }
80
+ flushLoose();
81
+ return parseRichTextDocument({ content: blocks.length > 0 ? blocks : [{ type: 'paragraph' }], type: 'doc' }, resolveRichTextProfile(policy.profile));
82
+ }
83
+ function normalizePolicy(policy) {
84
+ const maximumInputCharacters = policy.maximumInputCharacters ?? STUDIO_SAFE_HTML_POLICY.maximumInputCharacters;
85
+ if (!Number.isSafeInteger(maximumInputCharacters) ||
86
+ maximumInputCharacters < 1 ||
87
+ maximumInputCharacters > 10_000_000) {
88
+ throw new RangeError('maximumInputCharacters must be between 1 and 10000000.');
89
+ }
90
+ const tags = policy.allowedTags ?? STUDIO_SAFE_HTML_POLICY.allowedTags;
91
+ const normalized = tags.map((tag) => tag.toLowerCase());
92
+ if (new Set(normalized).size !== normalized.length ||
93
+ normalized.some((tag) => !SAFE_TAG_CEILING.includes(tag))) {
94
+ throw new TypeError('Safe HTML policy may only narrow the Studio tag ceiling.');
95
+ }
96
+ return {
97
+ allowedTags: new Set(normalized),
98
+ maximumInputCharacters,
99
+ unknownElements: policy.unknownElements ?? STUDIO_SAFE_HTML_POLICY.unknownElements,
100
+ };
101
+ }
102
+ function blockNode(element, policy) {
103
+ const tag = element.localName;
104
+ if (!policy.allowedTags.has(tag)) {
105
+ return undefined;
106
+ }
107
+ if (tag === 'p') {
108
+ return { content: compactInline(inlineNodes(element, [], policy)), type: 'paragraph' };
109
+ }
110
+ if (tag === 'h2' || tag === 'h3' || tag === 'h4') {
111
+ return {
112
+ attrs: { level: Number(tag.slice(1)) },
113
+ content: compactInline(inlineNodes(element, [], policy)),
114
+ type: 'heading',
115
+ };
116
+ }
117
+ if (tag === 'hr') {
118
+ return { type: 'horizontalRule' };
119
+ }
120
+ if (tag === 'blockquote') {
121
+ const content = childBlocks(element, policy);
122
+ return {
123
+ content: content.length > 0
124
+ ? content
125
+ : [{ content: compactInline(inlineNodes(element, [], policy)), type: 'paragraph' }],
126
+ type: 'blockquote',
127
+ };
128
+ }
129
+ if (tag === 'ul' || tag === 'ol') {
130
+ const items = [...element.children]
131
+ .filter((child) => child.localName === 'li' && policy.allowedTags.has('li'))
132
+ .map((child) => listItem(child, policy));
133
+ if (items.length === 0) {
134
+ return undefined;
135
+ }
136
+ const list = {
137
+ content: items,
138
+ type: tag === 'ol' ? 'orderedList' : 'bulletList',
139
+ };
140
+ if (tag === 'ol') {
141
+ const start = Number(element.getAttribute('start') ?? '1');
142
+ if (Number.isSafeInteger(start) && start > 1 && start <= 1_000_000) {
143
+ list.attrs = { start };
144
+ }
145
+ }
146
+ return list;
147
+ }
148
+ return undefined;
149
+ }
150
+ function childBlocks(element, policy) {
151
+ const blocks = [];
152
+ for (const child of element.children) {
153
+ const converted = blockNode(child, policy);
154
+ if (converted !== undefined) {
155
+ blocks.push(converted);
156
+ }
157
+ }
158
+ return blocks;
159
+ }
160
+ function listItem(element, policy) {
161
+ const nested = [];
162
+ const inline = [];
163
+ for (const child of element.childNodes) {
164
+ if (child instanceof Element && (child.localName === 'ul' || child.localName === 'ol')) {
165
+ const converted = blockNode(child, policy);
166
+ if (converted !== undefined) {
167
+ nested.push(converted);
168
+ }
169
+ }
170
+ else {
171
+ inline.push(...inlineNodes(child, [], policy));
172
+ }
173
+ }
174
+ return {
175
+ content: [{ content: compactInline(inline), type: 'paragraph' }, ...nested],
176
+ type: 'listItem',
177
+ };
178
+ }
179
+ function inlineNodes(node, marks, policy) {
180
+ if (node.nodeType === Node.TEXT_NODE) {
181
+ const text = node.nodeValue ?? '';
182
+ return text.length === 0
183
+ ? []
184
+ : [{ ...(marks.length > 0 ? { marks: [...marks] } : {}), text, type: 'text' }];
185
+ }
186
+ if (!(node instanceof Element)) {
187
+ return [];
188
+ }
189
+ const tag = node.localName;
190
+ if (DROP_WITH_CONTENT.has(tag) ||
191
+ (!policy.allowedTags.has(tag) && policy.unknownElements === 'drop')) {
192
+ return [];
193
+ }
194
+ if (tag === 'br' && policy.allowedTags.has(tag)) {
195
+ return [{ type: 'hardBreak' }];
196
+ }
197
+ const markType = markForTag(tag, policy);
198
+ const nextMarks = markType === undefined ? marks : mergeMark(marks, markType);
199
+ return [...node.childNodes].flatMap((child) => inlineNodes(child, nextMarks, policy));
200
+ }
201
+ function markForTag(tag, policy) {
202
+ if (!policy.allowedTags.has(tag)) {
203
+ return undefined;
204
+ }
205
+ if (tag === 'b' || tag === 'strong')
206
+ return 'bold';
207
+ if (tag === 'em' || tag === 'i')
208
+ return 'italic';
209
+ if (tag === 'del' || tag === 's')
210
+ return 'strike';
211
+ if (tag === 'code')
212
+ return 'code';
213
+ return undefined;
214
+ }
215
+ function mergeMark(marks, type) {
216
+ if (type === 'code') {
217
+ return [{ type: 'code' }];
218
+ }
219
+ if (marks.some((mark) => mark.type === 'code')) {
220
+ return [...marks];
221
+ }
222
+ return marks.some((mark) => mark.type === type) ? [...marks] : [...marks, { type }];
223
+ }
224
+ function compactInline(nodes) {
225
+ const result = [];
226
+ for (const node of nodes) {
227
+ if (node.type === 'text') {
228
+ const text = (node.text ?? '').replaceAll(/\s+/gu, ' ');
229
+ if (text.length === 0)
230
+ continue;
231
+ const previous = result.at(-1);
232
+ if (previous?.type === 'text' &&
233
+ JSON.stringify(previous.marks ?? []) === JSON.stringify(node.marks ?? [])) {
234
+ previous.text = `${previous.text ?? ''}${text}`;
235
+ continue;
236
+ }
237
+ result.push({ ...node, text });
238
+ continue;
239
+ }
240
+ result.push(node);
241
+ }
242
+ if (result[0]?.type === 'text')
243
+ result[0].text = (result[0].text ?? '').trimStart();
244
+ const last = result.at(-1);
245
+ if (last?.type === 'text')
246
+ last.text = (last.text ?? '').trimEnd();
247
+ return result.filter((node) => node.type !== 'text' || (node.text ?? '').length > 0);
248
+ }
249
+ //# sourceMappingURL=safe-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-html.js","sourceRoot":"","sources":["../src/safe-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { StudioRichTextSurface, StudioRichTextSurfaceAdapter, StudioRichTextSurfaceOptions } from './studio-rich-text-editor.js';
2
+ /**
3
+ * Sink-free authoring surface for hosts enforcing strict style CSP and
4
+ * Trusted Types. It shares Studio's canonical first-party tools but never
5
+ * creates style elements, style attributes, or HTML-string sinks.
6
+ */
7
+ export declare class StudioStrictCspRichTextSurfaceAdapter implements StudioRichTextSurfaceAdapter {
8
+ mount(options: StudioRichTextSurfaceOptions): Promise<StudioRichTextSurface>;
9
+ }
10
+ //# sourceMappingURL=strict-csp-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-csp-surface.d.ts","sourceRoot":"","sources":["../src/strict-csp-surface.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,8BAA8B,CAAC;AAatC;;;;GAIG;AACH,qBAAa,qCAAsC,YAAW,4BAA4B;IACjF,KAAK,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAGpF"}
@@ -0,0 +1,298 @@
1
+ import { STUDIO_EDITOR_JS_TOOL_NAMES, studioEditorJsTools, toStudioEditorJsBlocks, } from './first-party-tools.js';
2
+ /**
3
+ * Sink-free authoring surface for hosts enforcing strict style CSP and
4
+ * Trusted Types. It shares Studio's canonical first-party tools but never
5
+ * creates style elements, style attributes, or HTML-string sinks.
6
+ */
7
+ export class StudioStrictCspRichTextSurfaceAdapter {
8
+ mount(options) {
9
+ return Promise.resolve(new StrictCspRichTextSurface(options));
10
+ }
11
+ }
12
+ class StrictCspRichTextSurface {
13
+ #blocks = document.createElement('div');
14
+ #options;
15
+ #root = document.createElement('section');
16
+ #mounted = [];
17
+ constructor(options) {
18
+ this.#options = options;
19
+ this.#root.className = 'studio-rich-text-strict-surface';
20
+ this.#root.dataset.studioRichTextSurface = 'strict-csp';
21
+ this.#root.setAttribute('aria-label', options.readOnly ? 'Rich text preview' : 'Rich text editor');
22
+ this.#root.setAttribute('role', 'region');
23
+ this.#blocks.className = 'studio-rich-text-strict-blocks';
24
+ this.#blocks.addEventListener('change', this.#notifyChange);
25
+ this.#blocks.addEventListener('input', this.#notifyChange);
26
+ this.#render(options.initialValue);
27
+ options.holder.replaceChildren(this.#root);
28
+ }
29
+ destroy() {
30
+ this.#blocks.removeEventListener('change', this.#notifyChange);
31
+ this.#blocks.removeEventListener('input', this.#notifyChange);
32
+ this.#mounted = [];
33
+ this.#root.remove();
34
+ }
35
+ focus() {
36
+ const target = this.#root.querySelector('[contenteditable="true"], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)');
37
+ if (target !== null) {
38
+ target.focus();
39
+ return;
40
+ }
41
+ this.#root.tabIndex = -1;
42
+ this.#root.focus();
43
+ }
44
+ read() {
45
+ return Promise.resolve(structuredClone(this.#snapshot()));
46
+ }
47
+ replace(value) {
48
+ this.#render(value);
49
+ return Promise.resolve();
50
+ }
51
+ #notifyChange = () => {
52
+ this.#options.onChange();
53
+ };
54
+ #add(type) {
55
+ const document = this.#snapshot();
56
+ document.content.push(defaultNode(type));
57
+ this.#render(document);
58
+ this.#options.onChange();
59
+ }
60
+ #move(index, delta) {
61
+ const document = this.#snapshot();
62
+ const target = index + delta;
63
+ if (target < 0 || target >= document.content.length)
64
+ return;
65
+ const [node] = document.content.splice(index, 1);
66
+ if (node === undefined)
67
+ return;
68
+ document.content.splice(target, 0, node);
69
+ this.#render(document);
70
+ this.#options.onChange();
71
+ this.#focusBlock(target);
72
+ }
73
+ #remove(index) {
74
+ const document = this.#snapshot();
75
+ document.content.splice(index, 1);
76
+ if (document.content.length === 0)
77
+ document.content.push(defaultNode('paragraph'));
78
+ this.#render(document);
79
+ this.#options.onChange();
80
+ this.#focusBlock(Math.min(index, document.content.length - 1));
81
+ }
82
+ #focusBlock(index) {
83
+ this.#blocks
84
+ .querySelector(`[data-studio-rich-text-index="${String(index)}"]`)
85
+ ?.querySelector('[contenteditable="true"], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled)')
86
+ ?.focus();
87
+ }
88
+ #render(value) {
89
+ const tools = studioEditorJsTools();
90
+ const blocks = toStudioEditorJsBlocks(value);
91
+ this.#mounted = blocks.map((block) => {
92
+ const Tool = tools[block.type];
93
+ return {
94
+ tool: new Tool({ data: block.data, readOnly: this.#options.readOnly }),
95
+ type: block.type,
96
+ };
97
+ });
98
+ this.#root.replaceChildren();
99
+ if (!this.#options.readOnly)
100
+ this.#root.append(this.#createToolbar());
101
+ this.#blocks.replaceChildren(...this.#mounted.map((block, index) => this.#renderBlock(block, index)));
102
+ this.#root.append(this.#blocks);
103
+ }
104
+ #renderBlock(block, index) {
105
+ const group = document.createElement('section');
106
+ const title = studioEditorJsTools()[block.type].toolbox.title;
107
+ group.className = 'studio-rich-text-strict-block';
108
+ group.dataset.studioRichTextIndex = String(index);
109
+ group.setAttribute('aria-label', `${title} block ${String(index + 1)}`);
110
+ group.setAttribute('role', 'group');
111
+ if (!this.#options.readOnly) {
112
+ const controls = document.createElement('div');
113
+ controls.className = 'studio-rich-text-strict-block-controls';
114
+ controls.setAttribute('aria-label', `${title} block actions`);
115
+ controls.setAttribute('role', 'toolbar');
116
+ controls.append(actionButton('Move block up', () => this.#move(index, -1), index === 0), actionButton('Move block down', () => this.#move(index, 1), index === this.#mounted.length - 1), actionButton('Remove block', () => this.#remove(index)));
117
+ group.append(controls);
118
+ }
119
+ group.append(block.tool.render());
120
+ return group;
121
+ }
122
+ #createToolbar() {
123
+ const tools = studioEditorJsTools();
124
+ const toolbar = document.createElement('div');
125
+ const select = document.createElement('select');
126
+ select.setAttribute('aria-label', 'Rich text block type');
127
+ for (const type of STUDIO_EDITOR_JS_TOOL_NAMES) {
128
+ const option = document.createElement('option');
129
+ option.textContent = tools[type].toolbox.title;
130
+ option.value = type;
131
+ select.append(option);
132
+ }
133
+ toolbar.className = 'studio-rich-text-strict-toolbar';
134
+ toolbar.setAttribute('aria-label', 'Rich text tools');
135
+ toolbar.setAttribute('role', 'toolbar');
136
+ toolbar.append(select, actionButton('Add rich text block', () => {
137
+ if (isToolName(select.value))
138
+ this.#add(select.value);
139
+ }));
140
+ const tone = highlightToneControl();
141
+ toolbar.append(inlineActionButton('Bold selected text', () => this.#formatInline('bold')), inlineActionButton('Italicize selected text', () => this.#formatInline('italic')), inlineActionButton('Strike selected text', () => this.#formatInline('strike')), inlineActionButton('Format selected text as code', () => this.#formatInline('code')), tone, inlineActionButton('Highlight selected text', () => this.#formatInline('highlight', highlightTone(tone.value))), inlineActionButton('Insert line break', () => this.#formatInline('hard-break')));
142
+ return toolbar;
143
+ }
144
+ #formatInline(action, tone = 'accent') {
145
+ const selection = globalThis.getSelection();
146
+ if (selection === null || selection.rangeCount === 0)
147
+ return;
148
+ const range = selection.getRangeAt(0);
149
+ const start = closestEditable(range.startContainer, this.#root);
150
+ const end = closestEditable(range.endContainer, this.#root);
151
+ if (start === undefined || start !== end)
152
+ return;
153
+ if (action === 'hard-break') {
154
+ range.deleteContents();
155
+ const lineBreak = document.createElement('br');
156
+ range.insertNode(lineBreak);
157
+ range.setStartAfter(lineBreak);
158
+ range.collapse(true);
159
+ selection.removeAllRanges();
160
+ selection.addRange(range);
161
+ this.#options.onChange();
162
+ return;
163
+ }
164
+ if (range.collapsed)
165
+ return;
166
+ const localName = inlineElementName(action);
167
+ const existing = closestInlineElement(range.commonAncestorContainer, start, localName);
168
+ if (existing !== undefined) {
169
+ const parent = existing.parentNode;
170
+ while (existing.firstChild !== null)
171
+ parent?.insertBefore(existing.firstChild, existing);
172
+ existing.remove();
173
+ this.#options.onChange();
174
+ return;
175
+ }
176
+ const wrapper = document.createElement(localName);
177
+ if (action === 'highlight')
178
+ wrapper.dataset.studioTone = tone;
179
+ wrapper.append(range.extractContents());
180
+ range.insertNode(wrapper);
181
+ range.selectNodeContents(wrapper);
182
+ selection.removeAllRanges();
183
+ selection.addRange(range);
184
+ this.#options.onChange();
185
+ }
186
+ #snapshot() {
187
+ return {
188
+ content: this.#mounted.map((block) => block.tool.save().node),
189
+ type: 'doc',
190
+ };
191
+ }
192
+ }
193
+ function actionButton(label, action, disabled = false) {
194
+ const button = document.createElement('button');
195
+ button.disabled = disabled;
196
+ button.textContent = label;
197
+ button.type = 'button';
198
+ button.setAttribute('aria-label', label);
199
+ button.addEventListener('click', action);
200
+ return button;
201
+ }
202
+ function inlineActionButton(label, action) {
203
+ const button = actionButton(label, action);
204
+ button.addEventListener('mousedown', (event) => event.preventDefault());
205
+ return button;
206
+ }
207
+ function highlightToneControl() {
208
+ const select = document.createElement('select');
209
+ select.setAttribute('aria-label', 'Highlight tone');
210
+ for (const tone of ['accent', 'info', 'success', 'warning', 'danger']) {
211
+ const option = document.createElement('option');
212
+ option.textContent = tone;
213
+ option.value = tone;
214
+ select.append(option);
215
+ }
216
+ return select;
217
+ }
218
+ function closestEditable(node, root) {
219
+ let candidate = node instanceof HTMLElement ? node : node.parentElement;
220
+ while (candidate !== null) {
221
+ if (candidate.getAttribute('contenteditable') === 'true')
222
+ return candidate;
223
+ if (candidate === root)
224
+ return undefined;
225
+ candidate = candidate.parentElement;
226
+ }
227
+ return undefined;
228
+ }
229
+ function closestInlineElement(node, boundary, localName) {
230
+ let candidate = node instanceof HTMLElement ? node : node.parentElement;
231
+ while (candidate !== null && candidate !== boundary) {
232
+ if (candidate.localName === localName)
233
+ return candidate;
234
+ candidate = candidate.parentElement;
235
+ }
236
+ return undefined;
237
+ }
238
+ function inlineElementName(action) {
239
+ if (action === 'bold')
240
+ return 'strong';
241
+ if (action === 'italic')
242
+ return 'em';
243
+ if (action === 'strike')
244
+ return 's';
245
+ if (action === 'code')
246
+ return 'code';
247
+ return 'mark';
248
+ }
249
+ function isToolName(value) {
250
+ return STUDIO_EDITOR_JS_TOOL_NAMES.some((name) => name === value);
251
+ }
252
+ function highlightTone(value) {
253
+ return ['accent', 'danger', 'info', 'success', 'warning'].includes(value)
254
+ ? value
255
+ : 'accent';
256
+ }
257
+ function defaultNode(type) {
258
+ switch (type) {
259
+ case 'callout':
260
+ return { attrs: { tone: 'info' }, content: [{ type: 'paragraph' }], type: 'callout' };
261
+ case 'checklist':
262
+ return {
263
+ content: [{ attrs: { checked: false, level: 0 }, type: 'checklistItem' }],
264
+ type: 'checklist',
265
+ };
266
+ case 'code':
267
+ return { attrs: { language: 'text' }, type: 'codeBlock' };
268
+ case 'delimiter':
269
+ return { type: 'horizontalRule' };
270
+ case 'header':
271
+ return { attrs: { level: 2 }, type: 'heading' };
272
+ case 'list':
273
+ return {
274
+ content: [{ content: [{ type: 'paragraph' }], type: 'listItem' }],
275
+ type: 'bulletList',
276
+ };
277
+ case 'paragraph':
278
+ return { type: 'paragraph' };
279
+ case 'quote':
280
+ return { content: [{ type: 'paragraph' }], type: 'blockquote' };
281
+ case 'table':
282
+ return {
283
+ attrs: { header: false },
284
+ content: [
285
+ {
286
+ content: [{ type: 'tableCell' }, { type: 'tableCell' }],
287
+ type: 'tableRow',
288
+ },
289
+ {
290
+ content: [{ type: 'tableCell' }, { type: 'tableCell' }],
291
+ type: 'tableRow',
292
+ },
293
+ ],
294
+ type: 'table',
295
+ };
296
+ }
297
+ }
298
+ //# sourceMappingURL=strict-csp-surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-csp-surface.js","sourceRoot":"","sources":["../src/strict-csp-surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { FieldBinding, StudioDiagnostic } from '@kumwe/studio-protocol';
2
+ import { type StudioRichTextDocument } from './index.js';
3
+ import { type StudioRichTextContainerType, type StudioRichTextProfileId } from './profiles.js';
4
+ export interface StudioRichTextEditorChange {
5
+ diagnostics: StudioDiagnostic[];
6
+ valid: boolean;
7
+ value: StudioRichTextDocument;
8
+ }
9
+ export interface StudioRichTextEditorOptions {
10
+ binding?: FieldBinding;
11
+ containerType?: StudioRichTextContainerType;
12
+ holder: HTMLElement;
13
+ onChange?: (change: StudioRichTextEditorChange) => void;
14
+ placeholder?: string;
15
+ profile?: StudioRichTextProfileId;
16
+ readOnly?: boolean;
17
+ value: StudioRichTextDocument;
18
+ }
19
+ export interface StudioRichTextEditor {
20
+ destroy(): void;
21
+ focus(): void;
22
+ readonly readOnly: boolean;
23
+ replace(value: StudioRichTextDocument): Promise<void>;
24
+ save(): Promise<StudioRichTextDocument>;
25
+ }
26
+ export interface StudioRichTextSurfaceOptions {
27
+ holder: HTMLElement;
28
+ initialValue: StudioRichTextDocument;
29
+ onChange: () => void;
30
+ placeholder?: string;
31
+ readOnly: boolean;
32
+ }
33
+ /** Editor-neutral surface seam used by Studio's factory and deterministic tests. */
34
+ export interface StudioRichTextSurface {
35
+ destroy(): void;
36
+ focus(): void;
37
+ read(): Promise<unknown>;
38
+ replace(value: StudioRichTextDocument): Promise<void>;
39
+ }
40
+ export interface StudioRichTextSurfaceAdapter {
41
+ mount(options: StudioRichTextSurfaceOptions): Promise<StudioRichTextSurface>;
42
+ }
43
+ /**
44
+ * The only public construction path for block prose. Hosts configure Studio
45
+ * profiles and canonical values; the selected editor remains an implementation
46
+ * detail and can never leak its document shape into an artifact.
47
+ */
48
+ export declare class StudioRichTextEditorFactory {
49
+ #private;
50
+ constructor(surfaceAdapter?: StudioRichTextSurfaceAdapter);
51
+ create(options: StudioRichTextEditorOptions): Promise<StudioRichTextEditor>;
52
+ }
53
+ /** Backward-readable explicit name; it still exposes only the neutral factory contract. */
54
+ export declare const EditorJsRichTextEditorFactory: typeof StudioRichTextEditorFactory;
55
+ //# sourceMappingURL=studio-rich-text-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-rich-text-editor.d.ts","sourceRoot":"","sources":["../src/studio-rich-text-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAGL,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC7B,MAAM,eAAe,CAAC;AAQvB,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,aAAa,CAAC,EAAE,2BAA2B,CAAC;IAC5C,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,sBAAsB,CAAC;IACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC9E;AAED;;;;GAIG;AACH,qBAAa,2BAA2B;;gBAGnB,cAAc,GAAE,4BAA2D;IAIjF,MAAM,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA+DzF;AAED,2FAA2F;AAC3F,eAAO,MAAM,6BAA6B,EAAE,OAAO,2BACtB,CAAC"}