@bendyline/squisq-editor-react 0.1.1 → 1.0.1

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 (47) hide show
  1. package/dist/EditorContext.d.ts +75 -0
  2. package/dist/EditorContext.d.ts.map +1 -0
  3. package/dist/EditorContext.js +158 -0
  4. package/dist/EditorContext.js.map +1 -0
  5. package/dist/EditorShell.d.ts +34 -0
  6. package/dist/EditorShell.d.ts.map +1 -0
  7. package/dist/EditorShell.js +59 -0
  8. package/dist/EditorShell.js.map +1 -0
  9. package/dist/PreviewPanel.d.ts +33 -0
  10. package/dist/PreviewPanel.d.ts.map +1 -0
  11. package/dist/PreviewPanel.js +385 -0
  12. package/dist/PreviewPanel.js.map +1 -0
  13. package/dist/RawEditor.d.ts +25 -0
  14. package/dist/RawEditor.d.ts.map +1 -0
  15. package/dist/RawEditor.js +100 -0
  16. package/dist/RawEditor.js.map +1 -0
  17. package/dist/StatusBar.d.ts +15 -0
  18. package/dist/StatusBar.d.ts.map +1 -0
  19. package/dist/StatusBar.js +24 -0
  20. package/dist/StatusBar.js.map +1 -0
  21. package/dist/TemplateAnnotation.d.ts +20 -0
  22. package/dist/TemplateAnnotation.d.ts.map +1 -0
  23. package/dist/TemplateAnnotation.js +69 -0
  24. package/dist/TemplateAnnotation.js.map +1 -0
  25. package/dist/Toolbar.d.ts +19 -0
  26. package/dist/Toolbar.d.ts.map +1 -0
  27. package/dist/Toolbar.js +350 -0
  28. package/dist/Toolbar.js.map +1 -0
  29. package/dist/ViewSwitcher.d.ts +14 -0
  30. package/dist/ViewSwitcher.d.ts.map +1 -0
  31. package/dist/ViewSwitcher.js +20 -0
  32. package/dist/ViewSwitcher.js.map +1 -0
  33. package/dist/WysiwygEditor.d.ts +28 -0
  34. package/dist/WysiwygEditor.d.ts.map +1 -0
  35. package/dist/WysiwygEditor.js +111 -0
  36. package/dist/WysiwygEditor.js.map +1 -0
  37. package/dist/index.d.ts +36 -268
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +34 -3824
  40. package/dist/index.js.map +1 -1
  41. package/dist/tiptapBridge.d.ts +24 -0
  42. package/dist/tiptapBridge.d.ts.map +1 -0
  43. package/dist/tiptapBridge.js +358 -0
  44. package/dist/tiptapBridge.js.map +1 -0
  45. package/package.json +4 -5
  46. package/src/Toolbar.tsx +50 -45
  47. package/src/styles/editor.css +21 -0
@@ -0,0 +1,385 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * PreviewPanel
4
+ *
5
+ * Renders a live preview of the current markdown document as a slideshow
6
+ * using the DocPlayer component from @bendyline/squisq-react.
7
+ *
8
+ * The markdown-derived Doc (from markdownToDoc) contains hierarchical blocks
9
+ * with template names, heading text, and body content — but no audio or
10
+ * visual layers. This component bridges the gap by:
11
+ *
12
+ * 1. Flattening the block tree into a linear slide sequence
13
+ * 2. Converting each block into a TemplateBlock-compatible object
14
+ * (mapping heading text → title, templateOverrides → template fields)
15
+ * 3. Synthesizing a dummy audio segment so DocPlayer's timing works
16
+ * (the player enters fallback-timer mode when audio can't load)
17
+ * 4. Passing the prepared Doc to DocPlayer for SVG-based rendering
18
+ */
19
+ import { useMemo, useState, useEffect } from 'react';
20
+ import { DocPlayer, LinearDocView } from '@bendyline/squisq-react';
21
+ import { flattenBlocks } from '@bendyline/squisq/doc';
22
+ import { hasTemplate } from '@bendyline/squisq/doc';
23
+ import { extractPlainText } from '@bendyline/squisq/markdown';
24
+ import { VIEWPORT_PRESETS } from '@bendyline/squisq/schemas';
25
+ import { getThemeSummaries, resolveTheme } from '@bendyline/squisq/schemas';
26
+ import { useEditorContext } from './EditorContext';
27
+ // ── Helpers ────────────────────────────────────────────────────────
28
+ /**
29
+ * Extract plain text from an array of markdown block nodes.
30
+ * Walks paragraphs, blockquotes, and list items to collect all text.
31
+ */
32
+ function extractBodyText(contents) {
33
+ if (!contents || contents.length === 0)
34
+ return '';
35
+ const parts = [];
36
+ for (const node of contents) {
37
+ parts.push(extractPlainText(node));
38
+ }
39
+ return parts.join('\n').trim();
40
+ }
41
+ /**
42
+ * Extract list items from markdown body content.
43
+ * Returns an array of plain text strings for each list item found.
44
+ */
45
+ function extractListItems(contents) {
46
+ if (!contents)
47
+ return [];
48
+ const items = [];
49
+ for (const node of contents) {
50
+ if (node.type === 'list') {
51
+ for (const item of node.children) {
52
+ const text = extractPlainText(item).trim();
53
+ if (text)
54
+ items.push(text);
55
+ }
56
+ }
57
+ }
58
+ return items;
59
+ }
60
+ /**
61
+ * Provide sensible default fields for templates that require more than
62
+ * just a `title`. This prevents crashes from undefined required fields
63
+ * when the markdown annotations don't supply all template-specific values.
64
+ */
65
+ function getTemplateDefaults(templateName, headingText, block) {
66
+ const body = extractBodyText(block.contents);
67
+ switch (templateName) {
68
+ case 'statHighlight':
69
+ return {
70
+ stat: headingText,
71
+ description: body || headingText,
72
+ };
73
+ case 'quoteBlock':
74
+ case 'fullBleedQuote':
75
+ case 'pullQuote':
76
+ return {
77
+ quote: body || headingText,
78
+ };
79
+ case 'factCard':
80
+ return {
81
+ fact: headingText,
82
+ explanation: body || headingText,
83
+ };
84
+ case 'comparisonBar':
85
+ return {
86
+ leftLabel: 'A',
87
+ leftValue: 60,
88
+ rightLabel: 'B',
89
+ rightValue: 40,
90
+ };
91
+ case 'listBlock':
92
+ return {
93
+ items: extractListItems(block.contents) || ['Item 1', 'Item 2', 'Item 3'],
94
+ };
95
+ case 'definitionCard':
96
+ return {
97
+ term: headingText,
98
+ definition: body || headingText,
99
+ };
100
+ case 'dateEvent':
101
+ return {
102
+ date: headingText,
103
+ description: body || headingText,
104
+ };
105
+ default:
106
+ return {};
107
+ }
108
+ }
109
+ /**
110
+ * Convert a markdown-derived Block into a TemplateBlock-compatible object.
111
+ *
112
+ * The block's heading text becomes `title` (works for sectionHeader,
113
+ * titleBlock, factCard, etc.). Any templateOverrides from annotation
114
+ * syntax `{[template key=value]}` are spread on top so template-specific
115
+ * fields (stat, quote, description, …) are available.
116
+ *
117
+ * If the requested template doesn't exist in the registry, falls back
118
+ * to `sectionHeader` to avoid "Unknown template" warnings.
119
+ */
120
+ function blockToSlide(block, index) {
121
+ const headingText = block.sourceHeading
122
+ ? extractPlainText(block.sourceHeading)
123
+ : block.id || `Slide ${index + 1}`;
124
+ // Validate template name — fall back to sectionHeader for unknowns
125
+ const requestedTemplate = block.template || 'sectionHeader';
126
+ const template = hasTemplate(requestedTemplate) ? requestedTemplate : 'sectionHeader';
127
+ // Get sensible defaults for templates that need more than just `title`
128
+ const defaults = getTemplateDefaults(template, headingText, block);
129
+ return {
130
+ id: block.id,
131
+ template,
132
+ duration: block.duration,
133
+ audioSegment: 0,
134
+ transition: index > 0 ? { type: 'fade', duration: 0.5 } : undefined,
135
+ // Provide heading text as title — consumed by sectionHeader, titleBlock, etc.
136
+ title: headingText,
137
+ // Template-specific defaults (safe fallbacks for required fields)
138
+ ...defaults,
139
+ // Spread annotation overrides last so explicit values win
140
+ ...block.templateOverrides,
141
+ };
142
+ }
143
+ /**
144
+ * Build a player-ready Doc from the markdown-derived Doc.
145
+ *
146
+ * Flattens hierarchical blocks, converts each to a TemplateBlock-compatible
147
+ * slide, recalculates timing, and adds a synthetic audio segment.
148
+ */
149
+ function buildPreviewDoc(doc) {
150
+ const flat = flattenBlocks(doc.blocks);
151
+ const slides = flat.map(blockToSlide);
152
+ // Recalculate sequential timing
153
+ let t = 0;
154
+ for (const slide of slides) {
155
+ slide.startTime = t;
156
+ t += slide.duration;
157
+ }
158
+ return {
159
+ articleId: doc.articleId,
160
+ duration: t,
161
+ blocks: slides,
162
+ audio: {
163
+ // Synthetic segment — audio will fail to load and DocPlayer will use
164
+ // its fallback timer to advance currentTime via requestAnimationFrame.
165
+ segments: t > 0 ? [{ src: '', name: 'preview', duration: t, startTime: 0 }] : [],
166
+ },
167
+ };
168
+ }
169
+ // ── Viewport helpers ───────────────────────────────────────────────
170
+ /** All viewport preset entries for the dropdown */
171
+ const VIEWPORT_OPTIONS = [
172
+ { key: 'landscape', label: '16:9 Landscape' },
173
+ { key: 'portrait', label: '9:16 Portrait' },
174
+ { key: 'square', label: '1:1 Square' },
175
+ { key: 'standard', label: '4:3 Standard' },
176
+ ];
177
+ /**
178
+ * Resolve a `document-render-as` frontmatter value to a ViewportPreset.
179
+ * Accepts preset names ("landscape"), aspect ratio shorthand ("16:9"),
180
+ * and common aliases ("widescreen", "vertical", "stories").
181
+ */
182
+ function resolveRenderAs(value) {
183
+ if (typeof value !== 'string')
184
+ return null;
185
+ const v = value.trim().toLowerCase();
186
+ const mapping = {
187
+ landscape: 'landscape',
188
+ '16:9': 'landscape',
189
+ widescreen: 'landscape',
190
+ portrait: 'portrait',
191
+ '9:16': 'portrait',
192
+ vertical: 'portrait',
193
+ stories: 'portrait',
194
+ square: 'square',
195
+ '1:1': 'square',
196
+ standard: 'standard',
197
+ '4:3': 'standard',
198
+ };
199
+ return mapping[v] ?? null;
200
+ }
201
+ /** Display mode options for the dropdown */
202
+ const DISPLAY_MODE_OPTIONS = [
203
+ { key: 'video', label: 'Video' },
204
+ { key: 'slideshow', label: 'Slideshow' },
205
+ { key: 'linear', label: 'Document' },
206
+ ];
207
+ /** Theme options for the dropdown */
208
+ const THEME_OPTIONS = getThemeSummaries().map((s) => ({ key: s.id, label: s.name }));
209
+ /** Set of valid theme IDs for fast lookup */
210
+ const VALID_THEME_IDS = new Set(THEME_OPTIONS.map((o) => o.key));
211
+ /**
212
+ * Resolve a `theme` frontmatter value to a theme id.
213
+ * Accepts exact theme ids ('documentary', 'bold') and common aliases.
214
+ */
215
+ function resolveFrontmatterTheme(value) {
216
+ if (typeof value !== 'string')
217
+ return null;
218
+ const v = value.trim().toLowerCase();
219
+ if (VALID_THEME_IDS.has(v))
220
+ return v;
221
+ // Allow hyphenated/spaced aliases: "morning light" → "morning-light"
222
+ const normalized = v.replace(/\s+/g, '-');
223
+ if (VALID_THEME_IDS.has(normalized))
224
+ return normalized;
225
+ return null;
226
+ }
227
+ /**
228
+ * Resolve a `display-mode` frontmatter value to a DisplayMode.
229
+ */
230
+ function resolveDisplayMode(value) {
231
+ if (typeof value !== 'string')
232
+ return null;
233
+ const v = value.trim().toLowerCase();
234
+ if (v === 'video' || v === 'slideshow' || v === 'linear')
235
+ return v;
236
+ if (v === 'slides' || v === 'presentation' || v === 'deck')
237
+ return 'slideshow';
238
+ if (v === 'document' || v === 'scroll' || v === 'page')
239
+ return 'linear';
240
+ return null;
241
+ }
242
+ // ── Component ──────────────────────────────────────────────────────
243
+ /**
244
+ * Live preview panel that renders the current document as a slideshow.
245
+ * Uses DocPlayer from @bendyline/squisq-react for SVG block rendering
246
+ * with template expansion, transitions, and playback controls.
247
+ *
248
+ * Includes a viewport format dropdown above the player. The default
249
+ * format can be hinted via YAML frontmatter `document-render-as:`.
250
+ */
251
+ export function PreviewPanel({ basePath = '/', className }) {
252
+ const { doc, parseError, isParsing } = useEditorContext();
253
+ // Determine the frontmatter-hinted viewport preset (if any)
254
+ const frontmatterPreset = useMemo(() => {
255
+ if (!doc?.frontmatter)
256
+ return null;
257
+ return resolveRenderAs(doc.frontmatter['document-render-as']);
258
+ }, [doc?.frontmatter]);
259
+ // Track user-selected viewport; null means "use frontmatter or default"
260
+ const [selectedPreset, setSelectedPreset] = useState(null);
261
+ // When frontmatter preset changes and user hasn't explicitly chosen, sync
262
+ useEffect(() => {
263
+ setSelectedPreset(null);
264
+ }, [frontmatterPreset]);
265
+ // Active preset: explicit user choice > frontmatter hint > landscape
266
+ const activePreset = selectedPreset ?? frontmatterPreset ?? 'landscape';
267
+ const activeViewport = VIEWPORT_PRESETS[activePreset];
268
+ // ── Display mode (video vs slideshow) ──────────────────────────
269
+ // Determine the frontmatter-hinted display mode (if any)
270
+ const frontmatterDisplayMode = useMemo(() => {
271
+ if (!doc?.frontmatter)
272
+ return null;
273
+ return resolveDisplayMode(doc.frontmatter['display-mode']);
274
+ }, [doc?.frontmatter]);
275
+ // Track user-selected display mode; null means "use frontmatter or default"
276
+ const [selectedDisplayMode, setSelectedDisplayMode] = useState(null);
277
+ // When frontmatter display mode changes and user hasn't explicitly chosen, sync
278
+ useEffect(() => {
279
+ setSelectedDisplayMode(null);
280
+ }, [frontmatterDisplayMode]);
281
+ // Active display mode: explicit user choice > frontmatter hint > video
282
+ const activeDisplayMode = selectedDisplayMode ?? frontmatterDisplayMode ?? 'video';
283
+ // ── Theme selection ────────────────────────────────────────────
284
+ // Determine the frontmatter-hinted theme (if any)
285
+ const frontmatterThemeId = useMemo(() => {
286
+ if (!doc?.frontmatter)
287
+ return null;
288
+ return resolveFrontmatterTheme(doc.frontmatter['theme']);
289
+ }, [doc?.frontmatter]);
290
+ // Track user-selected theme; null means "use frontmatter or default"
291
+ const [selectedThemeId, setSelectedThemeId] = useState(null);
292
+ // When frontmatter theme changes and user hasn't explicitly chosen, sync
293
+ useEffect(() => {
294
+ setSelectedThemeId(null);
295
+ }, [frontmatterThemeId]);
296
+ // Active theme: explicit user choice > frontmatter hint > documentary
297
+ const activeThemeId = selectedThemeId ?? frontmatterThemeId ?? 'documentary';
298
+ const activeTheme = useMemo(() => resolveTheme(activeThemeId), [activeThemeId]);
299
+ // Build the player-ready Doc whenever the parsed doc changes
300
+ const previewDoc = useMemo(() => {
301
+ if (!doc || !doc.blocks.length)
302
+ return null;
303
+ return buildPreviewDoc(doc);
304
+ }, [doc]);
305
+ // Status overlays for non-ready states
306
+ if (isParsing) {
307
+ return (_jsx("div", { className: `squisq-preview-status ${className || ''}`, "data-testid": "preview-panel", children: _jsx("p", { children: "Parsing\u2026" }) }));
308
+ }
309
+ if (parseError) {
310
+ return (_jsxs("div", { className: `squisq-preview-status ${className || ''}`, "data-testid": "preview-panel", children: [_jsx("h3", { children: "Parse Error" }), _jsx("pre", { children: parseError })] }));
311
+ }
312
+ if (!previewDoc) {
313
+ return (_jsx("div", { className: `squisq-preview-status ${className || ''}`, "data-testid": "preview-panel", children: _jsx("p", { children: "No content to preview. Start typing in the editor." }) }));
314
+ }
315
+ return (_jsxs("div", { className: `squisq-preview-container ${className || ''}`, "data-testid": "preview-panel", style: {
316
+ width: '100%',
317
+ height: '100%',
318
+ display: 'flex',
319
+ flexDirection: 'column',
320
+ overflow: 'hidden',
321
+ background: 'var(--squisq-bg, #f5f5f5)',
322
+ }, children: [_jsxs("div", { className: "squisq-preview-toolbar", style: {
323
+ display: 'flex',
324
+ alignItems: 'center',
325
+ gap: '8px',
326
+ padding: '6px 12px',
327
+ borderBottom: '1px solid var(--squisq-border, #e0e0e0)',
328
+ flexShrink: 0,
329
+ fontSize: '13px',
330
+ }, children: [_jsx("label", { htmlFor: "viewport-preset", style: { color: 'var(--squisq-text-muted, #6b7280)' }, children: "Format:" }), _jsx("select", { id: "viewport-preset", value: activePreset, onChange: (e) => setSelectedPreset(e.target.value), style: {
331
+ padding: '3px 8px',
332
+ borderRadius: '4px',
333
+ border: '1px solid var(--squisq-border, #d1d5db)',
334
+ background: 'var(--squisq-input-bg, #fff)',
335
+ color: 'var(--squisq-text, #1f2937)',
336
+ fontSize: '13px',
337
+ cursor: 'pointer',
338
+ }, children: VIEWPORT_OPTIONS.map((opt) => (_jsx("option", { value: opt.key, children: opt.label }, opt.key))) }), frontmatterPreset && selectedPreset === null && (_jsx("span", { style: {
339
+ fontSize: '11px',
340
+ color: 'var(--squisq-text-muted, #9ca3af)',
341
+ fontStyle: 'italic',
342
+ }, children: "(from frontmatter)" })), _jsx("span", { style: {
343
+ width: '1px',
344
+ height: '18px',
345
+ background: 'var(--squisq-border, #d1d5db)',
346
+ margin: '0 4px',
347
+ } }), _jsx("label", { htmlFor: "display-mode", style: { color: 'var(--squisq-text-muted, #6b7280)' }, children: "Mode:" }), _jsx("select", { id: "display-mode", value: activeDisplayMode, onChange: (e) => setSelectedDisplayMode(e.target.value), style: {
348
+ padding: '3px 8px',
349
+ borderRadius: '4px',
350
+ border: '1px solid var(--squisq-border, #d1d5db)',
351
+ background: 'var(--squisq-input-bg, #fff)',
352
+ color: 'var(--squisq-text, #1f2937)',
353
+ fontSize: '13px',
354
+ cursor: 'pointer',
355
+ }, children: DISPLAY_MODE_OPTIONS.map((opt) => (_jsx("option", { value: opt.key, children: opt.label }, opt.key))) }), frontmatterDisplayMode && selectedDisplayMode === null && (_jsx("span", { style: {
356
+ fontSize: '11px',
357
+ color: 'var(--squisq-text-muted, #9ca3af)',
358
+ fontStyle: 'italic',
359
+ }, children: "(from frontmatter)" })), _jsx("span", { style: {
360
+ width: '1px',
361
+ height: '18px',
362
+ background: 'var(--squisq-border, #d1d5db)',
363
+ margin: '0 4px',
364
+ } }), _jsx("label", { htmlFor: "theme-select", style: { color: 'var(--squisq-text-muted, #6b7280)' }, children: "Theme:" }), _jsx("select", { id: "theme-select", value: activeThemeId, onChange: (e) => setSelectedThemeId(e.target.value), style: {
365
+ padding: '3px 8px',
366
+ borderRadius: '4px',
367
+ border: '1px solid var(--squisq-border, #d1d5db)',
368
+ background: 'var(--squisq-input-bg, #fff)',
369
+ color: 'var(--squisq-text, #1f2937)',
370
+ fontSize: '13px',
371
+ cursor: 'pointer',
372
+ }, children: THEME_OPTIONS.map((opt) => (_jsx("option", { value: opt.key, children: opt.label }, opt.key))) }), frontmatterThemeId && selectedThemeId === null && (_jsx("span", { style: {
373
+ fontSize: '11px',
374
+ color: 'var(--squisq-text-muted, #9ca3af)',
375
+ fontStyle: 'italic',
376
+ }, children: "(from frontmatter)" }))] }), _jsx("div", { className: "squisq-preview-player", style: {
377
+ flex: 1,
378
+ display: 'flex',
379
+ alignItems: activeDisplayMode === 'linear' ? 'stretch' : 'center',
380
+ justifyContent: 'center',
381
+ overflow: 'hidden',
382
+ minHeight: 0,
383
+ }, children: activeDisplayMode === 'linear' ? (_jsx(LinearDocView, { doc: doc, basePath: basePath, viewport: activeViewport, theme: activeTheme })) : (_jsx(DocPlayer, { script: previewDoc, basePath: basePath, showControls: true, muted: true, forceViewport: activeViewport, displayMode: activeDisplayMode, theme: activeTheme })) })] }));
384
+ }
385
+ //# sourceMappingURL=PreviewPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewPanel.js","sourceRoot":"","sources":["../src/PreviewPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * RawEditor
3
+ *
4
+ * Monaco-based raw markdown editor. Provides full VS Code-like editing
5
+ * experience with syntax highlighting, minimap, and bracket matching.
6
+ * Syncs changes back to EditorContext on every keystroke (debounced).
7
+ */
8
+ export interface RawEditorProps {
9
+ /** Monaco editor theme (default: 'vs-dark') */
10
+ theme?: string;
11
+ /** Show minimap (default: false) */
12
+ minimap?: boolean;
13
+ /** Font size in pixels (default: 14) */
14
+ fontSize?: number;
15
+ /** Word wrap setting (default: 'on') */
16
+ wordWrap?: 'on' | 'off' | 'wordWrapColumn' | 'bounded';
17
+ /** Additional class name for the container */
18
+ className?: string;
19
+ }
20
+ /**
21
+ * Raw markdown editor using Monaco Editor.
22
+ * Binds to the shared EditorContext for source synchronization.
23
+ */
24
+ export declare function RawEditor({ theme, minimap, fontSize, wordWrap, className, }: RawEditorProps): import("react/jsx-runtime").JSX.Element;
25
+ //# sourceMappingURL=RawEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RawEditor.d.ts","sourceRoot":"","sources":["../src/RawEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvD,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAY,EACZ,OAAe,EACf,QAAa,EACb,QAAe,EACf,SAAS,GACV,EAAE,cAAc,2CA8GhB"}
@@ -0,0 +1,100 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * RawEditor
4
+ *
5
+ * Monaco-based raw markdown editor. Provides full VS Code-like editing
6
+ * experience with syntax highlighting, minimap, and bracket matching.
7
+ * Syncs changes back to EditorContext on every keystroke (debounced).
8
+ */
9
+ import { useRef, useCallback, useEffect } from 'react';
10
+ import Editor, { loader } from '@monaco-editor/react';
11
+ import * as monaco from 'monaco-editor';
12
+ import { useEditorContext } from './EditorContext';
13
+ import { getAvailableTemplates } from '@bendyline/squisq/doc';
14
+ // Use locally installed monaco-editor instead of CDN
15
+ loader.config({ monaco });
16
+ /**
17
+ * Raw markdown editor using Monaco Editor.
18
+ * Binds to the shared EditorContext for source synchronization.
19
+ */
20
+ export function RawEditor({ theme = 'vs', minimap = false, fontSize = 14, wordWrap = 'on', className, }) {
21
+ const { markdownSource, setMarkdownSource, setMonacoEditor } = useEditorContext();
22
+ const editorRef = useRef(null);
23
+ const isExternalUpdate = useRef(false);
24
+ const completionDisposable = useRef(null);
25
+ const handleMount = useCallback((editor, monaco) => {
26
+ editorRef.current = editor;
27
+ setMonacoEditor(editor);
28
+ editor.focus();
29
+ // Dispose any previous completion provider (from a prior mount)
30
+ completionDisposable.current?.dispose();
31
+ // Register template annotation completion provider for {[ trigger
32
+ const templates = getAvailableTemplates();
33
+ completionDisposable.current = monaco.languages.registerCompletionItemProvider('markdown', {
34
+ triggerCharacters: ['['],
35
+ provideCompletionItems(model, position) {
36
+ const lineContent = model.getLineContent(position.lineNumber);
37
+ // Only trigger inside a heading line that has {[ before the cursor
38
+ if (!/^#{1,6}\s/.test(lineContent))
39
+ return { suggestions: [] };
40
+ const textBeforeCursor = lineContent.substring(0, position.column - 1);
41
+ const bracketIdx = textBeforeCursor.lastIndexOf('{[');
42
+ if (bracketIdx === -1)
43
+ return { suggestions: [] };
44
+ // The range to replace: from after {[ to the cursor
45
+ const startCol = bracketIdx + 3; // after {[
46
+ const range = new monaco.Range(position.lineNumber, startCol, position.lineNumber, position.column);
47
+ const suggestions = templates.map((name) => ({
48
+ label: name,
49
+ kind: monaco.languages.CompletionItemKind.Value,
50
+ insertText: name + ']}',
51
+ range,
52
+ detail: 'Block template',
53
+ sortText: name,
54
+ }));
55
+ return { suggestions };
56
+ },
57
+ });
58
+ }, [setMonacoEditor]);
59
+ // Unregister on unmount
60
+ useEffect(() => {
61
+ return () => {
62
+ setMonacoEditor(null);
63
+ completionDisposable.current?.dispose();
64
+ completionDisposable.current = null;
65
+ };
66
+ }, [setMonacoEditor]);
67
+ const handleChange = useCallback((value) => {
68
+ if (isExternalUpdate.current)
69
+ return;
70
+ if (value !== undefined) {
71
+ setMarkdownSource(value);
72
+ }
73
+ }, [setMarkdownSource]);
74
+ // When external changes happen (e.g. from WYSIWYG), update Monaco
75
+ useEffect(() => {
76
+ const editor = editorRef.current;
77
+ if (editor) {
78
+ const currentValue = editor.getValue();
79
+ if (currentValue !== markdownSource) {
80
+ isExternalUpdate.current = true;
81
+ editor.setValue(markdownSource);
82
+ isExternalUpdate.current = false;
83
+ }
84
+ }
85
+ }, [markdownSource]);
86
+ return (_jsx("div", { className: className, style: { width: '100%', height: '100%' }, "data-testid": "raw-editor", children: _jsx(Editor, { defaultLanguage: "markdown", value: markdownSource, theme: theme, onMount: handleMount, onChange: handleChange, options: {
87
+ fontSize,
88
+ wordWrap,
89
+ minimap: { enabled: minimap },
90
+ lineNumbers: 'on',
91
+ scrollBeyondLastLine: false,
92
+ automaticLayout: true,
93
+ tabSize: 2,
94
+ renderWhitespace: 'selection',
95
+ bracketPairColorization: { enabled: true },
96
+ guides: { indentation: true },
97
+ padding: { top: 12, bottom: 12 },
98
+ } }) }));
99
+ }
100
+ //# sourceMappingURL=RawEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RawEditor.js","sourceRoot":"","sources":["../src/RawEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * StatusBar
3
+ *
4
+ * Bottom status bar showing document statistics and parse status.
5
+ */
6
+ export interface StatusBarProps {
7
+ /** Additional class name */
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Status bar displaying document statistics: character count, word count,
12
+ * block count, and parse/error status.
13
+ */
14
+ export declare function StatusBar({ className }: StatusBarProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../src/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,cAAc,2CA6BtD"}
@@ -0,0 +1,24 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * StatusBar
4
+ *
5
+ * Bottom status bar showing document statistics and parse status.
6
+ */
7
+ import { useMemo } from 'react';
8
+ import { useEditorContext } from './EditorContext';
9
+ /**
10
+ * Status bar displaying document statistics: character count, word count,
11
+ * block count, and parse/error status.
12
+ */
13
+ export function StatusBar({ className }) {
14
+ const { markdownSource, doc, parseError, isParsing } = useEditorContext();
15
+ const stats = useMemo(() => {
16
+ const chars = markdownSource.length;
17
+ const words = markdownSource.trim() ? markdownSource.trim().split(/\s+/).length : 0;
18
+ const lines = markdownSource.split('\n').length;
19
+ const blocks = doc?.blocks.length ?? 0;
20
+ return { chars, words, lines, blocks };
21
+ }, [markdownSource, doc]);
22
+ return (_jsxs("div", { className: `squisq-status-bar ${className || ''}`, children: [_jsxs("span", { className: "squisq-status-item", children: [stats.words, " words"] }), _jsxs("span", { className: "squisq-status-item", children: [stats.chars, " chars"] }), _jsxs("span", { className: "squisq-status-item", children: [stats.lines, " lines"] }), _jsxs("span", { className: "squisq-status-item", children: [stats.blocks, " blocks"] }), _jsx("span", { className: "squisq-status-spacer" }), isParsing && _jsx("span", { className: "squisq-status-item squisq-status-parsing", children: "Parsing\u2026" }), parseError && (_jsx("span", { className: "squisq-status-item squisq-status-error", title: parseError, children: "\u26A0 Error" })), !isParsing && !parseError && (_jsx("span", { className: "squisq-status-item squisq-status-ok", children: "\u2713 OK" }))] }));
23
+ }
24
+ //# sourceMappingURL=StatusBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../src/StatusBar.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOnD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAkB;IACrD,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE1E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAChD,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACvC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IAE1B,OAAO,CACL,eAAK,SAAS,EAAE,qBAAqB,SAAS,IAAI,EAAE,EAAE,aACpD,gBAAM,SAAS,EAAC,oBAAoB,aAAE,KAAK,CAAC,KAAK,cAAc,EAC/D,gBAAM,SAAS,EAAC,oBAAoB,aAAE,KAAK,CAAC,KAAK,cAAc,EAC/D,gBAAM,SAAS,EAAC,oBAAoB,aAAE,KAAK,CAAC,KAAK,cAAc,EAC/D,gBAAM,SAAS,EAAC,oBAAoB,aAAE,KAAK,CAAC,MAAM,eAAe,EACjE,eAAM,SAAS,EAAC,sBAAsB,GAAG,EACxC,SAAS,IAAI,eAAM,SAAS,EAAC,0CAA0C,8BAAgB,EACvF,UAAU,IAAI,CACb,eAAM,SAAS,EAAC,wCAAwC,EAAC,KAAK,EAAE,UAAU,6BAEnE,CACR,EACA,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAC5B,eAAM,SAAS,EAAC,qCAAqC,0BAAY,CAClE,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TemplateAnnotation — Tiptap Heading Extension
3
+ *
4
+ * Extends Tiptap's built-in Heading node to support `data-template` and
5
+ * `data-template-params` HTML attributes. These attributes store which block
6
+ * template should be used for a heading section.
7
+ *
8
+ * When present, the heading renders a visible badge (styled CSS chip)
9
+ * showing the template name, e.g. `[chart]`.
10
+ *
11
+ * The tiptapBridge converts `### Title {[chart]}` markdown into
12
+ * `<h3 data-template="chart">Title</h3>` and back, so this extension
13
+ * ensures Tiptap's schema preserves those attributes through edits.
14
+ */
15
+ /**
16
+ * HeadingWithTemplate — drop-in replacement for Tiptap's Heading that
17
+ * persists template annotation attributes.
18
+ */
19
+ export declare const HeadingWithTemplate: import("@tiptap/core").Node<import("@tiptap/extension-heading").HeadingOptions, any>;
20
+ //# sourceMappingURL=TemplateAnnotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateAnnotation.d.ts","sourceRoot":"","sources":["../src/TemplateAnnotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,sFAiD9B,CAAC"}