@bendyline/squisq-editor-react 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EditorContext.d.ts +65 -1
- package/dist/EditorContext.d.ts.map +1 -1
- package/dist/EditorContext.js +31 -4
- package/dist/EditorContext.js.map +1 -1
- package/dist/EditorShell.d.ts +101 -2
- package/dist/EditorShell.d.ts.map +1 -1
- package/dist/EditorShell.js +20 -8
- package/dist/EditorShell.js.map +1 -1
- package/dist/ImageNodeView.d.ts.map +1 -1
- package/dist/ImageNodeView.js +12 -2
- package/dist/ImageNodeView.js.map +1 -1
- package/dist/MediaBin.d.ts.map +1 -1
- package/dist/MediaBin.js +16 -1
- package/dist/MediaBin.js.map +1 -1
- package/dist/MentionExtension.d.ts +22 -0
- package/dist/MentionExtension.d.ts.map +1 -0
- package/dist/MentionExtension.js +242 -0
- package/dist/MentionExtension.js.map +1 -0
- package/dist/PreviewPanel.d.ts +3 -8
- package/dist/PreviewPanel.d.ts.map +1 -1
- package/dist/PreviewPanel.js +4 -282
- package/dist/PreviewPanel.js.map +1 -1
- package/dist/RawEditor.d.ts +8 -1
- package/dist/RawEditor.d.ts.map +1 -1
- package/dist/RawEditor.js +167 -30
- package/dist/RawEditor.js.map +1 -1
- package/dist/TemplateAnnotation.d.ts.map +1 -1
- package/dist/TemplateAnnotation.js +4 -2
- package/dist/TemplateAnnotation.js.map +1 -1
- package/dist/Toolbar.d.ts +7 -1
- package/dist/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar.js +57 -18
- package/dist/Toolbar.js.map +1 -1
- package/dist/Tooltip.d.ts +10 -0
- package/dist/Tooltip.d.ts.map +1 -0
- package/dist/Tooltip.js +104 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/ViewSwitcher.d.ts +1 -1
- package/dist/ViewSwitcher.d.ts.map +1 -1
- package/dist/ViewSwitcher.js +10 -4
- package/dist/ViewSwitcher.js.map +1 -1
- package/dist/WysiwygEditor.d.ts +13 -2
- package/dist/WysiwygEditor.d.ts.map +1 -1
- package/dist/WysiwygEditor.js +239 -4
- package/dist/WysiwygEditor.js.map +1 -1
- package/dist/__tests__/detectMarkdown.test.d.ts +2 -0
- package/dist/__tests__/detectMarkdown.test.d.ts.map +1 -0
- package/dist/__tests__/detectMarkdown.test.js +69 -0
- package/dist/__tests__/detectMarkdown.test.js.map +1 -0
- package/dist/__tests__/fileKind.test.d.ts +2 -0
- package/dist/__tests__/fileKind.test.d.ts.map +1 -0
- package/dist/__tests__/fileKind.test.js +81 -0
- package/dist/__tests__/fileKind.test.js.map +1 -0
- package/dist/__tests__/tiptapBridge.test.js +36 -0
- package/dist/__tests__/tiptapBridge.test.js.map +1 -1
- package/dist/buildPreviewDoc.d.ts +22 -0
- package/dist/buildPreviewDoc.d.ts.map +1 -0
- package/dist/buildPreviewDoc.js +212 -0
- package/dist/buildPreviewDoc.js.map +1 -0
- package/dist/detectMarkdown.d.ts +20 -0
- package/dist/detectMarkdown.d.ts.map +1 -0
- package/dist/detectMarkdown.js +61 -0
- package/dist/detectMarkdown.js.map +1 -0
- package/dist/fileKind.d.ts +30 -0
- package/dist/fileKind.d.ts.map +1 -0
- package/dist/fileKind.js +123 -0
- package/dist/fileKind.js.map +1 -0
- package/dist/hooks/useFileDrop.d.ts.map +1 -1
- package/dist/hooks/useFileDrop.js +9 -7
- package/dist/hooks/useFileDrop.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/mediaDragMime.d.ts +17 -0
- package/dist/mediaDragMime.d.ts.map +1 -0
- package/dist/mediaDragMime.js +22 -0
- package/dist/mediaDragMime.js.map +1 -0
- package/dist/tiptapBridge.d.ts.map +1 -1
- package/dist/tiptapBridge.js +58 -2
- package/dist/tiptapBridge.js.map +1 -1
- package/package.json +9 -7
- package/src/EditorContext.tsx +106 -3
- package/src/EditorShell.tsx +195 -15
- package/src/ImageNodeView.tsx +15 -2
- package/src/MediaBin.tsx +23 -1
- package/src/MentionExtension.tsx +258 -0
- package/src/PreviewPanel.tsx +5 -333
- package/src/RawEditor.tsx +193 -37
- package/src/TemplateAnnotation.ts +4 -2
- package/src/Toolbar.tsx +111 -48
- package/src/Tooltip.tsx +124 -0
- package/src/ViewSwitcher.tsx +15 -5
- package/src/WysiwygEditor.tsx +270 -5
- package/src/__tests__/detectMarkdown.test.ts +88 -0
- package/src/__tests__/fileKind.test.ts +96 -0
- package/src/__tests__/tiptapBridge.test.ts +44 -0
- package/src/buildPreviewDoc.ts +254 -0
- package/src/detectMarkdown.ts +62 -0
- package/src/fileKind.ts +134 -0
- package/src/hooks/useFileDrop.ts +10 -6
- package/src/index.ts +14 -0
- package/src/mediaDragMime.ts +32 -0
- package/src/styles/editor.css +214 -8
- package/src/tiptapBridge.ts +66 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildPreviewDoc — Converts a markdown-derived Doc into a player-ready Doc
|
|
3
|
+
* with TemplateBlock slides and interleaved images.
|
|
4
|
+
*
|
|
5
|
+
* Shared between PreviewPanel (live preview) and export flows (HTML/video).
|
|
6
|
+
*
|
|
7
|
+
* Pipeline:
|
|
8
|
+
* 1. Flatten hierarchical blocks into a linear slide sequence
|
|
9
|
+
* 2. Convert each block into a TemplateBlock-compatible object
|
|
10
|
+
* 3. Interleave images as standalone imageWithCaption slides
|
|
11
|
+
* 4. Synthesize a dummy audio segment for timer-based playback
|
|
12
|
+
*/
|
|
13
|
+
import type { Doc } from '@bendyline/squisq/schemas';
|
|
14
|
+
/**
|
|
15
|
+
* Build a player-ready Doc from a markdown-derived Doc.
|
|
16
|
+
*
|
|
17
|
+
* Flattens hierarchical blocks, converts each to a TemplateBlock-compatible
|
|
18
|
+
* slide, interleaves images, recalculates timing, and adds a synthetic
|
|
19
|
+
* audio segment.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildPreviewDoc(doc: Doc): Doc;
|
|
22
|
+
//# sourceMappingURL=buildPreviewDoc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildPreviewDoc.d.ts","sourceRoot":"","sources":["../src/buildPreviewDoc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAS,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAwJ5D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CA8E7C"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buildPreviewDoc — Converts a markdown-derived Doc into a player-ready Doc
|
|
3
|
+
* with TemplateBlock slides and interleaved images.
|
|
4
|
+
*
|
|
5
|
+
* Shared between PreviewPanel (live preview) and export flows (HTML/video).
|
|
6
|
+
*
|
|
7
|
+
* Pipeline:
|
|
8
|
+
* 1. Flatten hierarchical blocks into a linear slide sequence
|
|
9
|
+
* 2. Convert each block into a TemplateBlock-compatible object
|
|
10
|
+
* 3. Interleave images as standalone imageWithCaption slides
|
|
11
|
+
* 4. Synthesize a dummy audio segment for timer-based playback
|
|
12
|
+
*/
|
|
13
|
+
import { flattenBlocks, hasTemplate } from '@bendyline/squisq/doc';
|
|
14
|
+
import { extractPlainText } from '@bendyline/squisq/markdown';
|
|
15
|
+
import { getChildren } from '@bendyline/squisq/markdown';
|
|
16
|
+
// ── Helpers ────────────────────────────────────────────────────────
|
|
17
|
+
function extractBodyText(contents) {
|
|
18
|
+
if (!contents || contents.length === 0)
|
|
19
|
+
return '';
|
|
20
|
+
const parts = [];
|
|
21
|
+
for (const node of contents) {
|
|
22
|
+
parts.push(extractPlainText(node));
|
|
23
|
+
}
|
|
24
|
+
return parts.join('\n').trim();
|
|
25
|
+
}
|
|
26
|
+
function extractBlockImages(contents) {
|
|
27
|
+
if (!contents || contents.length === 0)
|
|
28
|
+
return [];
|
|
29
|
+
const images = [];
|
|
30
|
+
function walk(node) {
|
|
31
|
+
if ('type' in node && node.type === 'image' && 'url' in node) {
|
|
32
|
+
const img = node;
|
|
33
|
+
if (img.url) {
|
|
34
|
+
images.push({ src: img.url, alt: img.alt ?? '' });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
for (const child of getChildren(node)) {
|
|
38
|
+
walk(child);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
for (const node of contents) {
|
|
42
|
+
walk(node);
|
|
43
|
+
}
|
|
44
|
+
return images;
|
|
45
|
+
}
|
|
46
|
+
function collectAllDocImages(blocks) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
const images = [];
|
|
49
|
+
function walkBlocks(blockList) {
|
|
50
|
+
for (const block of blockList) {
|
|
51
|
+
for (const img of extractBlockImages(block.contents)) {
|
|
52
|
+
if (!seen.has(img.src)) {
|
|
53
|
+
seen.add(img.src);
|
|
54
|
+
images.push(img);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (block.children) {
|
|
58
|
+
walkBlocks(block.children);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
walkBlocks(blocks);
|
|
63
|
+
return images;
|
|
64
|
+
}
|
|
65
|
+
function extractListItems(contents) {
|
|
66
|
+
if (!contents)
|
|
67
|
+
return [];
|
|
68
|
+
const items = [];
|
|
69
|
+
for (const node of contents) {
|
|
70
|
+
if (node.type === 'list') {
|
|
71
|
+
for (const item of node.children) {
|
|
72
|
+
const text = extractPlainText(item).trim();
|
|
73
|
+
if (text)
|
|
74
|
+
items.push(text);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return items;
|
|
79
|
+
}
|
|
80
|
+
function getTemplateDefaults(templateName, headingText, block) {
|
|
81
|
+
const body = extractBodyText(block.contents);
|
|
82
|
+
switch (templateName) {
|
|
83
|
+
case 'statHighlight':
|
|
84
|
+
return { stat: headingText, description: body || headingText };
|
|
85
|
+
case 'quoteBlock':
|
|
86
|
+
case 'fullBleedQuote':
|
|
87
|
+
case 'pullQuote':
|
|
88
|
+
return { quote: body || headingText };
|
|
89
|
+
case 'factCard':
|
|
90
|
+
return { fact: headingText, explanation: body || headingText };
|
|
91
|
+
case 'comparisonBar':
|
|
92
|
+
return { leftLabel: 'A', leftValue: 60, rightLabel: 'B', rightValue: 40 };
|
|
93
|
+
case 'listBlock': {
|
|
94
|
+
const items = extractListItems(block.contents);
|
|
95
|
+
return { items: items.length > 0 ? items : ['Item 1', 'Item 2', 'Item 3'] };
|
|
96
|
+
}
|
|
97
|
+
case 'definitionCard':
|
|
98
|
+
return { term: headingText, definition: body || headingText };
|
|
99
|
+
case 'dateEvent':
|
|
100
|
+
return { date: headingText, description: body || headingText };
|
|
101
|
+
default:
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function blockToSlide(block, index) {
|
|
106
|
+
const headingText = block.sourceHeading
|
|
107
|
+
? extractPlainText(block.sourceHeading)
|
|
108
|
+
: block.title || block.id || `Slide ${index + 1}`;
|
|
109
|
+
const requestedTemplate = block.template || 'sectionHeader';
|
|
110
|
+
const template = hasTemplate(requestedTemplate) ? requestedTemplate : 'sectionHeader';
|
|
111
|
+
const defaults = getTemplateDefaults(template, headingText, block);
|
|
112
|
+
const { id: _id, startTime: _st, duration: _d, audioSegment: _as, layers: _l, transition: _tr, template: _t, title: _ti, children: _c, contents: _co, sourceHeading: _sh, templateOverrides: _to, ...extraFields } = block;
|
|
113
|
+
return {
|
|
114
|
+
id: block.id,
|
|
115
|
+
template,
|
|
116
|
+
duration: block.duration,
|
|
117
|
+
audioSegment: 0,
|
|
118
|
+
transition: index > 0 ? { type: 'fade', duration: 0.5 } : undefined,
|
|
119
|
+
title: headingText,
|
|
120
|
+
...defaults,
|
|
121
|
+
...extraFields,
|
|
122
|
+
...block.templateOverrides,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const IMAGE_MOTIONS = [
|
|
126
|
+
'zoomIn',
|
|
127
|
+
'zoomOut',
|
|
128
|
+
'panLeft',
|
|
129
|
+
'panRight',
|
|
130
|
+
];
|
|
131
|
+
// ── Public API ─────────────────────────────────────────────────────
|
|
132
|
+
/**
|
|
133
|
+
* Build a player-ready Doc from a markdown-derived Doc.
|
|
134
|
+
*
|
|
135
|
+
* Flattens hierarchical blocks, converts each to a TemplateBlock-compatible
|
|
136
|
+
* slide, interleaves images, recalculates timing, and adds a synthetic
|
|
137
|
+
* audio segment.
|
|
138
|
+
*/
|
|
139
|
+
export function buildPreviewDoc(doc) {
|
|
140
|
+
const flat = flattenBlocks(doc.blocks);
|
|
141
|
+
const allImages = collectAllDocImages(doc.blocks);
|
|
142
|
+
const usedImageSrcs = new Set();
|
|
143
|
+
const slides = [];
|
|
144
|
+
let motionIndex = 0;
|
|
145
|
+
for (let i = 0; i < flat.length; i++) {
|
|
146
|
+
const block = flat[i];
|
|
147
|
+
const blockImages = extractBlockImages(block.contents);
|
|
148
|
+
const slide = blockToSlide(block, i);
|
|
149
|
+
if (blockImages.length > 0 && slide.template === 'sectionHeader') {
|
|
150
|
+
const img = blockImages[0];
|
|
151
|
+
usedImageSrcs.add(img.src);
|
|
152
|
+
slide.template = 'imageWithCaption';
|
|
153
|
+
slide.imageSrc = img.src;
|
|
154
|
+
slide.imageAlt = img.alt;
|
|
155
|
+
slide.caption = slide.title;
|
|
156
|
+
slide.captionPosition = 'bottom';
|
|
157
|
+
slide.ambientMotion = IMAGE_MOTIONS[motionIndex++ % IMAGE_MOTIONS.length];
|
|
158
|
+
}
|
|
159
|
+
else if (blockImages.length > 0) {
|
|
160
|
+
const img = blockImages[0];
|
|
161
|
+
usedImageSrcs.add(img.src);
|
|
162
|
+
if (!slide.accentImage) {
|
|
163
|
+
slide.accentImage = {
|
|
164
|
+
src: img.src,
|
|
165
|
+
alt: img.alt,
|
|
166
|
+
position: 'left-strip',
|
|
167
|
+
ambientMotion: IMAGE_MOTIONS[motionIndex++ % IMAGE_MOTIONS.length],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
slides.push(slide);
|
|
172
|
+
}
|
|
173
|
+
// Interleave unused images
|
|
174
|
+
const unusedImages = allImages.filter((img) => !usedImageSrcs.has(img.src));
|
|
175
|
+
if (unusedImages.length > 0 && slides.length > 0) {
|
|
176
|
+
const interval = Math.max(2, Math.floor(slides.length / (unusedImages.length + 1)));
|
|
177
|
+
let insertOffset = 0;
|
|
178
|
+
for (let imgIdx = 0; imgIdx < unusedImages.length; imgIdx++) {
|
|
179
|
+
const insertAt = Math.min((imgIdx + 1) * interval + insertOffset, slides.length);
|
|
180
|
+
const img = unusedImages[imgIdx];
|
|
181
|
+
slides.splice(insertAt, 0, {
|
|
182
|
+
id: `img-interleave-${imgIdx}`,
|
|
183
|
+
template: 'imageWithCaption',
|
|
184
|
+
duration: 5,
|
|
185
|
+
audioSegment: 0,
|
|
186
|
+
imageSrc: img.src,
|
|
187
|
+
imageAlt: img.alt,
|
|
188
|
+
ambientMotion: IMAGE_MOTIONS[motionIndex++ % IMAGE_MOTIONS.length],
|
|
189
|
+
transition: { type: 'fade', duration: 0.5 },
|
|
190
|
+
});
|
|
191
|
+
insertOffset++;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Recalculate timing
|
|
195
|
+
let t = 0;
|
|
196
|
+
for (const slide of slides) {
|
|
197
|
+
slide.startTime = t;
|
|
198
|
+
t += slide.duration;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
articleId: doc.articleId,
|
|
202
|
+
duration: t,
|
|
203
|
+
blocks: slides,
|
|
204
|
+
audio: {
|
|
205
|
+
segments: t > 0 ? [{ src: '', name: 'preview', duration: t, startTime: 0 }] : [],
|
|
206
|
+
},
|
|
207
|
+
...(doc.captions ? { captions: doc.captions } : {}),
|
|
208
|
+
...(doc.startBlock ? { startBlock: doc.startBlock } : {}),
|
|
209
|
+
...(doc.themeId ? { themeId: doc.themeId } : {}),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=buildPreviewDoc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildPreviewDoc.js","sourceRoot":"","sources":["../src/buildPreviewDoc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIzD,sEAAsE;AAEtE,SAAS,eAAe,CAAC,QAAyC;IAChE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAyC;IAEzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClD,MAAM,MAAM,GAAwC,EAAE,CAAC;IAEvD,SAAS,IAAI,CAAC,IAAkB;QAC9B,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,IAAqC,CAAC;YAClD,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAe;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAwC,EAAE,CAAC;IAEvD,SAAS,UAAU,CAAC,SAAkB;QACpC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAyC;IACjE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAK,IAAqB,CAAC,QAAQ,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAAoB,EACpB,WAAmB,EACnB,KAAY;IAEZ,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE7C,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,eAAe;YAClB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;QACjE,KAAK,YAAY,CAAC;QAClB,KAAK,gBAAgB,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;QACxC,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;QACjE,KAAK,eAAe;YAClB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC5E,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9E,CAAC;QACD,KAAK,gBAAgB;YACnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;QAChE,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,WAAW,EAAE,CAAC;QACjE;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAY,EAAE,KAAa;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa;QACrC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC;QACvC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,IAAI,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC;IAEpD,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC;IAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;IACtF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAEnE,MAAM,EACJ,EAAE,EAAE,GAAG,EACP,SAAS,EAAE,GAAG,EACd,QAAQ,EAAE,EAAE,EACZ,YAAY,EAAE,GAAG,EACjB,MAAM,EAAE,EAAE,EACV,UAAU,EAAE,GAAG,EACf,QAAQ,EAAE,EAAE,EACZ,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,EAAE,EACZ,QAAQ,EAAE,GAAG,EACb,aAAa,EAAE,GAAG,EAClB,iBAAiB,EAAE,GAAG,EACtB,GAAG,WAAW,EACf,GAAG,KAA2C,CAAC;IAEhD,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,QAAQ;QACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QACnE,KAAK,EAAE,WAAW;QAClB,GAAG,QAAQ;QACX,GAAG,WAAW;QACd,GAAG,KAAK,CAAC,iBAAiB;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAyD;IAC1E,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;CACX,CAAC;AAEF,sEAAsE;AAEtE;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAErC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;YACjE,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,kBAAkB,CAAC;YACpC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;YACzB,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;YACzB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,KAAe,CAAC;YACtC,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;YACjC,KAAK,CAAC,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,WAAW,GAAG;oBAClB,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,QAAQ,EAAE,YAAY;oBACtB,aAAa,EAAE,aAAa,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC;iBACnE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACjF,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACzB,EAAE,EAAE,kBAAkB,MAAM,EAAE;gBAC9B,QAAQ,EAAE,kBAAkB;gBAC5B,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,CAAC;gBACf,QAAQ,EAAE,GAAG,CAAC,GAAG;gBACjB,QAAQ,EAAE,GAAG,CAAC,GAAG;gBACjB,aAAa,EAAE,aAAa,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC;gBAClE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE;aAC5C,CAAC,CAAC;YACH,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpB,CAAC,IAAI,KAAK,CAAC,QAAkB,CAAC;IAChC,CAAC;IAED,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,MAA4B;QACpC,KAAK,EAAE;YACL,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;SACjF;QACD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown detection — heuristic for spotting markdown source in pasted text.
|
|
3
|
+
*
|
|
4
|
+
* Used by the WYSIWYG editor's paste handler to decide whether plain-text
|
|
5
|
+
* paste content should be parsed as markdown rather than inserted literally.
|
|
6
|
+
*
|
|
7
|
+
* The heuristic prefers false negatives (treating markdown as plain text)
|
|
8
|
+
* over false positives (mangling plain text that happens to contain a few
|
|
9
|
+
* special characters).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Returns true if the text looks like markdown source.
|
|
13
|
+
*
|
|
14
|
+
* Detection rules:
|
|
15
|
+
* - Any line matching a strong block pattern → yes
|
|
16
|
+
* - Two or more inline pattern matches anywhere in the text → yes
|
|
17
|
+
* - Otherwise → no
|
|
18
|
+
*/
|
|
19
|
+
export declare function looksLikeMarkdown(text: string): boolean;
|
|
20
|
+
//# sourceMappingURL=detectMarkdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectMarkdown.d.ts","sourceRoot":"","sources":["../src/detectMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBvD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown detection — heuristic for spotting markdown source in pasted text.
|
|
3
|
+
*
|
|
4
|
+
* Used by the WYSIWYG editor's paste handler to decide whether plain-text
|
|
5
|
+
* paste content should be parsed as markdown rather than inserted literally.
|
|
6
|
+
*
|
|
7
|
+
* The heuristic prefers false negatives (treating markdown as plain text)
|
|
8
|
+
* over false positives (mangling plain text that happens to contain a few
|
|
9
|
+
* special characters).
|
|
10
|
+
*/
|
|
11
|
+
/** Block-level patterns that strongly indicate markdown. Any one is enough. */
|
|
12
|
+
const STRONG_BLOCK_PATTERNS = [
|
|
13
|
+
/^#{1,6}\s+\S/, // # Heading
|
|
14
|
+
/^[-*+]\s+\S/, // - bullet
|
|
15
|
+
/^\d+\.\s+\S/, // 1. ordered
|
|
16
|
+
/^>\s+\S/, // > blockquote
|
|
17
|
+
/^```/, // ``` code fence
|
|
18
|
+
/^\|.+\|\s*$/, // | table | row |
|
|
19
|
+
/^[-*+]\s+\[[ xX]\]\s+/, // - [ ] task
|
|
20
|
+
];
|
|
21
|
+
/** Inline patterns that are weaker indicators on their own. */
|
|
22
|
+
const INLINE_PATTERNS = [
|
|
23
|
+
/\*\*[^*\n]+\*\*/, // **bold**
|
|
24
|
+
/__[^_\n]+__/, // __bold__
|
|
25
|
+
/`[^`\n]+`/, // `code`
|
|
26
|
+
/\[[^\]\n]+\]\([^)\n]+\)/, // [link](url)
|
|
27
|
+
/!\[[^\]\n]*\]\([^)\n]+\)/, // 
|
|
28
|
+
/~~[^~\n]+~~/, // ~~strike~~
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Returns true if the text looks like markdown source.
|
|
32
|
+
*
|
|
33
|
+
* Detection rules:
|
|
34
|
+
* - Any line matching a strong block pattern → yes
|
|
35
|
+
* - Two or more inline pattern matches anywhere in the text → yes
|
|
36
|
+
* - Otherwise → no
|
|
37
|
+
*/
|
|
38
|
+
export function looksLikeMarkdown(text) {
|
|
39
|
+
if (!text || text.length < 2)
|
|
40
|
+
return false;
|
|
41
|
+
const lines = text.split(/\r?\n/);
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
const trimmed = line.trim();
|
|
44
|
+
if (!trimmed)
|
|
45
|
+
continue;
|
|
46
|
+
for (const re of STRONG_BLOCK_PATTERNS) {
|
|
47
|
+
if (re.test(trimmed))
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
let inlineHits = 0;
|
|
52
|
+
for (const re of INLINE_PATTERNS) {
|
|
53
|
+
if (re.test(text)) {
|
|
54
|
+
inlineHits++;
|
|
55
|
+
if (inlineHits >= 2)
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=detectMarkdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectMarkdown.js","sourceRoot":"","sources":["../src/detectMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+EAA+E;AAC/E,MAAM,qBAAqB,GAAa;IACtC,cAAc,EAAE,YAAY;IAC5B,aAAa,EAAE,WAAW;IAC1B,aAAa,EAAE,aAAa;IAC5B,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,iBAAiB;IACzB,aAAa,EAAE,kBAAkB;IACjC,uBAAuB,EAAE,aAAa;CACvC,CAAC;AAEF,+DAA+D;AAC/D,MAAM,eAAe,GAAa;IAChC,iBAAiB,EAAE,WAAW;IAC9B,aAAa,EAAE,WAAW;IAC1B,WAAW,EAAE,SAAS;IACtB,yBAAyB,EAAE,cAAc;IACzC,0BAA0B,EAAE,gBAAgB;IAC5C,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,KAAK,MAAM,EAAE,IAAI,qBAAqB,EAAE,CAAC;YACvC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,UAAU,EAAE,CAAC;YACb,IAAI,UAAU,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fileKind
|
|
3
|
+
*
|
|
4
|
+
* Maps a file name (or bare extension) to a Monaco language ID and decides
|
|
5
|
+
* whether the editor shell should operate in markdown mode (full WYSIWYG +
|
|
6
|
+
* Preview experience) or code mode (Monaco-only view with formatting
|
|
7
|
+
* buttons hidden).
|
|
8
|
+
*
|
|
9
|
+
* The mapping favors common web / systems languages that Monaco ships with
|
|
10
|
+
* out of the box. Unknown extensions fall back to markdown mode so the
|
|
11
|
+
* existing UX remains the default for anything we don't recognize.
|
|
12
|
+
*/
|
|
13
|
+
export interface FileKind {
|
|
14
|
+
/** 'markdown' keeps the full editor (WYSIWYG + Preview tabs); 'code' is Monaco-only. */
|
|
15
|
+
mode: 'markdown' | 'code';
|
|
16
|
+
/** Monaco language ID — passed to `<Editor defaultLanguage={...} />`. */
|
|
17
|
+
language: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Detect a Monaco language ID from a file name. Returns null when the
|
|
21
|
+
* extension (or bare name) is not in the mapping.
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectLanguageFromFileName(fileName: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the editor mode + Monaco language for a given file. The explicit
|
|
26
|
+
* `language` argument, if provided, wins over any detection from
|
|
27
|
+
* `fileName`. When nothing matches, falls back to markdown mode.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveFileKind(fileName?: string, language?: string): FileKind;
|
|
30
|
+
//# sourceMappingURL=fileKind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileKind.d.ts","sourceRoot":"","sources":["../src/fileKind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,QAAQ;IACvB,wFAAwF;IACxF,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyFD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI1E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAW9E"}
|
package/dist/fileKind.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fileKind
|
|
3
|
+
*
|
|
4
|
+
* Maps a file name (or bare extension) to a Monaco language ID and decides
|
|
5
|
+
* whether the editor shell should operate in markdown mode (full WYSIWYG +
|
|
6
|
+
* Preview experience) or code mode (Monaco-only view with formatting
|
|
7
|
+
* buttons hidden).
|
|
8
|
+
*
|
|
9
|
+
* The mapping favors common web / systems languages that Monaco ships with
|
|
10
|
+
* out of the box. Unknown extensions fall back to markdown mode so the
|
|
11
|
+
* existing UX remains the default for anything we don't recognize.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Extension → Monaco language ID. Keys are lowercase, no leading dot.
|
|
15
|
+
* Extend as needed; unknown extensions fall back to markdown mode.
|
|
16
|
+
*/
|
|
17
|
+
const EXT_TO_LANGUAGE = {
|
|
18
|
+
md: 'markdown',
|
|
19
|
+
markdown: 'markdown',
|
|
20
|
+
mdown: 'markdown',
|
|
21
|
+
txt: 'plaintext',
|
|
22
|
+
ts: 'typescript',
|
|
23
|
+
tsx: 'typescript',
|
|
24
|
+
js: 'javascript',
|
|
25
|
+
jsx: 'javascript',
|
|
26
|
+
mjs: 'javascript',
|
|
27
|
+
cjs: 'javascript',
|
|
28
|
+
json: 'json',
|
|
29
|
+
jsonc: 'json',
|
|
30
|
+
html: 'html',
|
|
31
|
+
htm: 'html',
|
|
32
|
+
css: 'css',
|
|
33
|
+
scss: 'scss',
|
|
34
|
+
less: 'less',
|
|
35
|
+
py: 'python',
|
|
36
|
+
go: 'go',
|
|
37
|
+
rs: 'rust',
|
|
38
|
+
rb: 'ruby',
|
|
39
|
+
java: 'java',
|
|
40
|
+
c: 'c',
|
|
41
|
+
h: 'c',
|
|
42
|
+
cpp: 'cpp',
|
|
43
|
+
hpp: 'cpp',
|
|
44
|
+
cc: 'cpp',
|
|
45
|
+
cs: 'csharp',
|
|
46
|
+
php: 'php',
|
|
47
|
+
sh: 'shell',
|
|
48
|
+
bash: 'shell',
|
|
49
|
+
zsh: 'shell',
|
|
50
|
+
yml: 'yaml',
|
|
51
|
+
yaml: 'yaml',
|
|
52
|
+
toml: 'ini',
|
|
53
|
+
ini: 'ini',
|
|
54
|
+
xml: 'xml',
|
|
55
|
+
svg: 'xml',
|
|
56
|
+
sql: 'sql',
|
|
57
|
+
lua: 'lua',
|
|
58
|
+
swift: 'swift',
|
|
59
|
+
kt: 'kotlin',
|
|
60
|
+
kts: 'kotlin',
|
|
61
|
+
dockerfile: 'dockerfile',
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Languages that keep the full markdown shell (WYSIWYG + Preview). Anything
|
|
65
|
+
* outside this set is treated as code.
|
|
66
|
+
*/
|
|
67
|
+
const MARKDOWN_MODE_LANGUAGES = new Set(['markdown', 'plaintext']);
|
|
68
|
+
/**
|
|
69
|
+
* Pull the lowercase extension (no leading dot) from a file name or bare
|
|
70
|
+
* extension string. Returns null when none is discernible.
|
|
71
|
+
*
|
|
72
|
+
* Examples:
|
|
73
|
+
* "foo.ts" → "ts"
|
|
74
|
+
* "foo.tar.gz" → "gz"
|
|
75
|
+
* ".ts" → "ts"
|
|
76
|
+
* "ts" → "ts"
|
|
77
|
+
* "Dockerfile" → "dockerfile" (full name match for extensionless files)
|
|
78
|
+
* "" → null
|
|
79
|
+
*/
|
|
80
|
+
function extractExtension(fileName) {
|
|
81
|
+
const trimmed = fileName.trim();
|
|
82
|
+
if (!trimmed)
|
|
83
|
+
return null;
|
|
84
|
+
// Strip any leading path — take only the basename.
|
|
85
|
+
const base = trimmed.replace(/^.*[/\\]/, '');
|
|
86
|
+
if (!base)
|
|
87
|
+
return null;
|
|
88
|
+
const dotIdx = base.lastIndexOf('.');
|
|
89
|
+
if (dotIdx === -1) {
|
|
90
|
+
// No dot — could still be a recognized bare name (Dockerfile) or a bare
|
|
91
|
+
// extension passed by a caller like "ts". Lower-case and return.
|
|
92
|
+
return base.toLowerCase();
|
|
93
|
+
}
|
|
94
|
+
if (dotIdx === base.length - 1)
|
|
95
|
+
return null; // Trailing dot, no extension.
|
|
96
|
+
return base.slice(dotIdx + 1).toLowerCase();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Detect a Monaco language ID from a file name. Returns null when the
|
|
100
|
+
* extension (or bare name) is not in the mapping.
|
|
101
|
+
*/
|
|
102
|
+
export function detectLanguageFromFileName(fileName) {
|
|
103
|
+
const ext = extractExtension(fileName);
|
|
104
|
+
if (!ext)
|
|
105
|
+
return null;
|
|
106
|
+
return EXT_TO_LANGUAGE[ext] ?? null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve the editor mode + Monaco language for a given file. The explicit
|
|
110
|
+
* `language` argument, if provided, wins over any detection from
|
|
111
|
+
* `fileName`. When nothing matches, falls back to markdown mode.
|
|
112
|
+
*/
|
|
113
|
+
export function resolveFileKind(fileName, language) {
|
|
114
|
+
const resolvedLanguage = language ?? (fileName ? detectLanguageFromFileName(fileName) : null);
|
|
115
|
+
if (!resolvedLanguage) {
|
|
116
|
+
return { mode: 'markdown', language: 'markdown' };
|
|
117
|
+
}
|
|
118
|
+
const mode = MARKDOWN_MODE_LANGUAGES.has(resolvedLanguage)
|
|
119
|
+
? 'markdown'
|
|
120
|
+
: 'code';
|
|
121
|
+
return { mode, language: resolvedLanguage };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=fileKind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileKind.js","sourceRoot":"","sources":["../src/fileKind.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFileDrop.d.ts","sourceRoot":"","sources":["../../src/hooks/useFileDrop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6BH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAOxD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAiB/E;AAwCD,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,eAAe,EAAE,eAAe,CAAC;IACjC,4CAA4C;IAC5C,cAAc,EAAE;QACd,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QACzC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC1C,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,sDAAsD;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK;QACjC,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QACzC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;KACtC,CAAC;CACH;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAc,EAAE,EAAE,kBAAkB,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"useFileDrop.d.ts","sourceRoot":"","sources":["../../src/hooks/useFileDrop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6BH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAOxD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAiB/E;AAwCD,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,eAAe,EAAE,eAAe,CAAC;IACjC,4CAA4C;IAC5C,cAAc,EAAE;QACd,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QACzC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC1C,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,sDAAsD;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK;QACjC,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QACzC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;KACtC,CAAC;CACH;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAc,EAAE,EAAE,kBAAkB,GAAG,iBAAiB,CAqG7F"}
|
|
@@ -95,17 +95,19 @@ export function useFileDrop({ onDrop, enabled = true }) {
|
|
|
95
95
|
const handleDragEnter = useCallback((e) => {
|
|
96
96
|
if (!enabled)
|
|
97
97
|
return;
|
|
98
|
+
// Only react to OS file drags. In-app drags (e.g. dragging a thumbnail
|
|
99
|
+
// out of the MediaBin) don't carry file-kind items and must pass
|
|
100
|
+
// through to the editors without showing the drop overlay.
|
|
101
|
+
const classification = e.dataTransfer.items
|
|
102
|
+
? classifyDataTransferItems(e.dataTransfer.items)
|
|
103
|
+
: 'mixed';
|
|
104
|
+
if (!classification)
|
|
105
|
+
return;
|
|
98
106
|
e.preventDefault();
|
|
99
107
|
dragCounterRef.current++;
|
|
100
108
|
if (dragCounterRef.current === 1) {
|
|
101
109
|
setIsDragging(true);
|
|
102
|
-
|
|
103
|
-
setDragContentType(classifyDataTransferItems(e.dataTransfer.items));
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
// Fallback: can't classify, show all zones
|
|
107
|
-
setDragContentType('mixed');
|
|
108
|
-
}
|
|
110
|
+
setDragContentType(classification);
|
|
109
111
|
}
|
|
110
112
|
}, [enabled]);
|
|
111
113
|
const handleDragOver = useCallback((e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFileDrop.js","sourceRoot":"","sources":["../../src/hooks/useFileDrop.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useFileDrop.js","sourceRoot":"","sources":["../../src/hooks/useFileDrop.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
export { EditorShell } from './EditorShell.js';
|
|
20
20
|
export type { EditorShellProps, EditorTheme } from './EditorShell.js';
|
|
21
21
|
export { EditorProvider, useEditorContext } from './EditorContext.js';
|
|
22
|
-
export type { EditorView, EditorState, EditorActions, EditorContextValue, EditorProviderProps, } from './EditorContext.js';
|
|
22
|
+
export type { EditorView, EditorMode, EditorState, EditorActions, EditorContextValue, EditorProviderProps, ImageDisplayMode, MentionCandidate, MentionProvider, } from './EditorContext.js';
|
|
23
|
+
export { resolveFileKind, detectLanguageFromFileName } from './fileKind.js';
|
|
24
|
+
export type { FileKind } from './fileKind.js';
|
|
23
25
|
export { RawEditor } from './RawEditor.js';
|
|
24
26
|
export type { RawEditorProps } from './RawEditor.js';
|
|
25
27
|
export { WysiwygEditor } from './WysiwygEditor.js';
|
|
@@ -36,11 +38,13 @@ export { MediaBin } from './MediaBin.js';
|
|
|
36
38
|
export type { MediaBinProps } from './MediaBin.js';
|
|
37
39
|
export { StatusBar } from './StatusBar.js';
|
|
38
40
|
export type { StatusBarProps } from './StatusBar.js';
|
|
41
|
+
export { TooltipLayer } from './Tooltip.js';
|
|
39
42
|
export { DropZoneOverlay } from './DropZoneOverlay.js';
|
|
40
43
|
export type { DropZoneOverlayProps } from './DropZoneOverlay.js';
|
|
41
44
|
export { useFileDrop, classifyFile } from './hooks/useFileDrop.js';
|
|
42
45
|
export type { FileCategory, DragContentType, DropTarget, UseFileDropOptions, UseFileDropResult, } from './hooks/useFileDrop.js';
|
|
43
46
|
export { partitionFiles, processMediaFiles, processTextFile, processTextFiles, } from './utils/dropUtils.js';
|
|
44
47
|
export { markdownToTiptap, tiptapToMarkdown } from './tiptapBridge.js';
|
|
48
|
+
export { buildPreviewDoc } from './buildPreviewDoc.js';
|
|
45
49
|
export { HeadingWithTemplate } from './TemplateAnnotation.js';
|
|
46
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EACV,YAAY,EACZ,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
export { EditorShell } from './EditorShell.js';
|
|
21
21
|
// Context
|
|
22
22
|
export { EditorProvider, useEditorContext } from './EditorContext.js';
|
|
23
|
+
// File-kind detection — useful for hosts that want to pre-decide chrome
|
|
24
|
+
// around the editor based on whether a file is markdown or code.
|
|
25
|
+
export { resolveFileKind, detectLanguageFromFileName } from './fileKind.js';
|
|
23
26
|
// Individual editors (for custom layouts)
|
|
24
27
|
export { RawEditor } from './RawEditor.js';
|
|
25
28
|
export { WysiwygEditor } from './WysiwygEditor.js';
|
|
@@ -30,12 +33,15 @@ export { ViewSwitcher } from './ViewSwitcher.js';
|
|
|
30
33
|
export { Toolbar } from './Toolbar.js';
|
|
31
34
|
export { MediaBin } from './MediaBin.js';
|
|
32
35
|
export { StatusBar } from './StatusBar.js';
|
|
36
|
+
export { TooltipLayer } from './Tooltip.js';
|
|
33
37
|
// Drag-and-drop
|
|
34
38
|
export { DropZoneOverlay } from './DropZoneOverlay.js';
|
|
35
39
|
export { useFileDrop, classifyFile } from './hooks/useFileDrop.js';
|
|
36
40
|
export { partitionFiles, processMediaFiles, processTextFile, processTextFiles, } from './utils/dropUtils.js';
|
|
37
41
|
// Bridge utilities
|
|
38
42
|
export { markdownToTiptap, tiptapToMarkdown } from './tiptapBridge.js';
|
|
43
|
+
// Slideshow builder (shared between PreviewPanel and export flows)
|
|
44
|
+
export { buildPreviewDoc } from './buildPreviewDoc.js';
|
|
39
45
|
// Tiptap extension: Heading with template annotation support
|
|
40
46
|
export { HeadingWithTemplate } from './TemplateAnnotation.js';
|
|
41
47
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAatE,wEAAwE;AACxE,iEAAiE;AACjE,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAG5E,0CAA0C;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,gBAAgB;AAChB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AASnE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,mBAAmB;AACnB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,mEAAmE;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,6DAA6D;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|