@bendyline/squisq-react 1.3.0 → 1.3.2
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/index.d.ts +710 -35
- package/dist/index.js +4288 -33
- package/dist/index.js.map +1 -1
- package/dist/squisq-player.global.js +1 -1
- package/dist/standalone-source.js +1 -1
- package/package.json +3 -3
- package/src/standalone-source.d.ts +10 -0
- package/dist/BlockRenderer.d.ts +0 -37
- package/dist/BlockRenderer.d.ts.map +0 -1
- package/dist/BlockRenderer.js +0 -54
- package/dist/BlockRenderer.js.map +0 -1
- package/dist/CaptionOverlay.d.ts +0 -33
- package/dist/CaptionOverlay.d.ts.map +0 -1
- package/dist/CaptionOverlay.js +0 -44
- package/dist/CaptionOverlay.js.map +0 -1
- package/dist/DocControlsBottom.d.ts +0 -28
- package/dist/DocControlsBottom.d.ts.map +0 -1
- package/dist/DocControlsBottom.js +0 -27
- package/dist/DocControlsBottom.js.map +0 -1
- package/dist/DocControlsOverlay.d.ts +0 -28
- package/dist/DocControlsOverlay.d.ts.map +0 -1
- package/dist/DocControlsOverlay.js +0 -80
- package/dist/DocControlsOverlay.js.map +0 -1
- package/dist/DocControlsSidebar.d.ts +0 -27
- package/dist/DocControlsSidebar.d.ts.map +0 -1
- package/dist/DocControlsSidebar.js +0 -10
- package/dist/DocControlsSidebar.js.map +0 -1
- package/dist/DocControlsSlideshow.d.ts +0 -20
- package/dist/DocControlsSlideshow.d.ts.map +0 -1
- package/dist/DocControlsSlideshow.js +0 -69
- package/dist/DocControlsSlideshow.js.map +0 -1
- package/dist/DocPlayer.d.ts +0 -97
- package/dist/DocPlayer.d.ts.map +0 -1
- package/dist/DocPlayer.js +0 -657
- package/dist/DocPlayer.js.map +0 -1
- package/dist/DocPlayerWithSidebar.d.ts +0 -41
- package/dist/DocPlayerWithSidebar.d.ts.map +0 -1
- package/dist/DocPlayerWithSidebar.js +0 -69
- package/dist/DocPlayerWithSidebar.js.map +0 -1
- package/dist/DocProgressBar.d.ts +0 -31
- package/dist/DocProgressBar.d.ts.map +0 -1
- package/dist/DocProgressBar.js +0 -122
- package/dist/DocProgressBar.js.map +0 -1
- package/dist/InlineAudioPlayer.d.ts +0 -15
- package/dist/InlineAudioPlayer.d.ts.map +0 -1
- package/dist/InlineAudioPlayer.js +0 -22
- package/dist/InlineAudioPlayer.js.map +0 -1
- package/dist/InlineVideoPlayer.d.ts +0 -21
- package/dist/InlineVideoPlayer.d.ts.map +0 -1
- package/dist/InlineVideoPlayer.js +0 -29
- package/dist/InlineVideoPlayer.js.map +0 -1
- package/dist/LinearDocView.d.ts +0 -73
- package/dist/LinearDocView.d.ts.map +0 -1
- package/dist/LinearDocView.js +0 -451
- package/dist/LinearDocView.js.map +0 -1
- package/dist/MarkdownRenderer.d.ts +0 -32
- package/dist/MarkdownRenderer.d.ts.map +0 -1
- package/dist/MarkdownRenderer.js +0 -259
- package/dist/MarkdownRenderer.js.map +0 -1
- package/dist/SocialCaptionOverlay.d.ts +0 -27
- package/dist/SocialCaptionOverlay.d.ts.map +0 -1
- package/dist/SocialCaptionOverlay.js +0 -185
- package/dist/SocialCaptionOverlay.js.map +0 -1
- package/dist/__tests__/BlockRenderer.test.d.ts +0 -2
- package/dist/__tests__/BlockRenderer.test.d.ts.map +0 -1
- package/dist/__tests__/BlockRenderer.test.js +0 -82
- package/dist/__tests__/BlockRenderer.test.js.map +0 -1
- package/dist/__tests__/DocControlsSlideshow.test.d.ts +0 -2
- package/dist/__tests__/DocControlsSlideshow.test.d.ts.map +0 -1
- package/dist/__tests__/DocControlsSlideshow.test.js +0 -89
- package/dist/__tests__/DocControlsSlideshow.test.js.map +0 -1
- package/dist/__tests__/JsonView.test.d.ts +0 -2
- package/dist/__tests__/JsonView.test.d.ts.map +0 -1
- package/dist/__tests__/JsonView.test.js +0 -93
- package/dist/__tests__/JsonView.test.js.map +0 -1
- package/dist/__tests__/LinearDocView.test.d.ts +0 -2
- package/dist/__tests__/LinearDocView.test.d.ts.map +0 -1
- package/dist/__tests__/LinearDocView.test.js +0 -250
- package/dist/__tests__/LinearDocView.test.js.map +0 -1
- package/dist/__tests__/MarkdownRenderer.test.d.ts +0 -2
- package/dist/__tests__/MarkdownRenderer.test.d.ts.map +0 -1
- package/dist/__tests__/MarkdownRenderer.test.js +0 -208
- package/dist/__tests__/MarkdownRenderer.test.js.map +0 -1
- package/dist/__tests__/TableLayer.test.d.ts +0 -2
- package/dist/__tests__/TableLayer.test.d.ts.map +0 -1
- package/dist/__tests__/TableLayer.test.js +0 -121
- package/dist/__tests__/TableLayer.test.js.map +0 -1
- package/dist/__tests__/exports.test.d.ts +0 -2
- package/dist/__tests__/exports.test.d.ts.map +0 -1
- package/dist/__tests__/exports.test.js +0 -48
- package/dist/__tests__/exports.test.js.map +0 -1
- package/dist/hooks/AudioProvider.d.ts +0 -71
- package/dist/hooks/AudioProvider.d.ts.map +0 -1
- package/dist/hooks/AudioProvider.js +0 -52
- package/dist/hooks/AudioProvider.js.map +0 -1
- package/dist/hooks/MediaContext.d.ts +0 -35
- package/dist/hooks/MediaContext.d.ts.map +0 -1
- package/dist/hooks/MediaContext.js +0 -72
- package/dist/hooks/MediaContext.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -6
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -5
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/useAudioSync.d.ts +0 -18
- package/dist/hooks/useAudioSync.d.ts.map +0 -1
- package/dist/hooks/useAudioSync.js +0 -340
- package/dist/hooks/useAudioSync.js.map +0 -1
- package/dist/hooks/useAutoSurface.d.ts +0 -11
- package/dist/hooks/useAutoSurface.d.ts.map +0 -1
- package/dist/hooks/useAutoSurface.js +0 -24
- package/dist/hooks/useAutoSurface.js.map +0 -1
- package/dist/hooks/useDocPlayback.d.ts +0 -47
- package/dist/hooks/useDocPlayback.d.ts.map +0 -1
- package/dist/hooks/useDocPlayback.js +0 -179
- package/dist/hooks/useDocPlayback.js.map +0 -1
- package/dist/hooks/useViewportOrientation.d.ts +0 -31
- package/dist/hooks/useViewportOrientation.d.ts.map +0 -1
- package/dist/hooks/useViewportOrientation.js +0 -92
- package/dist/hooks/useViewportOrientation.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/jsonView/JsonView.d.ts +0 -26
- package/dist/jsonView/JsonView.d.ts.map +0 -1
- package/dist/jsonView/JsonView.js +0 -12
- package/dist/jsonView/JsonView.js.map +0 -1
- package/dist/jsonView/RenderNode.d.ts +0 -22
- package/dist/jsonView/RenderNode.d.ts.map +0 -1
- package/dist/jsonView/RenderNode.js +0 -30
- package/dist/jsonView/RenderNode.js.map +0 -1
- package/dist/jsonView/index.d.ts +0 -3
- package/dist/jsonView/index.d.ts.map +0 -1
- package/dist/jsonView/index.js +0 -2
- package/dist/jsonView/index.js.map +0 -1
- package/dist/jsonView/useJsonViewTokens.d.ts +0 -14
- package/dist/jsonView/useJsonViewTokens.d.ts.map +0 -1
- package/dist/jsonView/useJsonViewTokens.js +0 -34
- package/dist/jsonView/useJsonViewTokens.js.map +0 -1
- package/dist/jsonView/viewers.d.ts +0 -30
- package/dist/jsonView/viewers.d.ts.map +0 -1
- package/dist/jsonView/viewers.js +0 -226
- package/dist/jsonView/viewers.js.map +0 -1
- package/dist/layers/ImageLayer.d.ts +0 -23
- package/dist/layers/ImageLayer.d.ts.map +0 -1
- package/dist/layers/ImageLayer.js +0 -104
- package/dist/layers/ImageLayer.js.map +0 -1
- package/dist/layers/MapLayer.d.ts +0 -29
- package/dist/layers/MapLayer.d.ts.map +0 -1
- package/dist/layers/MapLayer.js +0 -97
- package/dist/layers/MapLayer.js.map +0 -1
- package/dist/layers/ShapeLayer.d.ts +0 -20
- package/dist/layers/ShapeLayer.d.ts.map +0 -1
- package/dist/layers/ShapeLayer.js +0 -39
- package/dist/layers/ShapeLayer.js.map +0 -1
- package/dist/layers/TableLayer.d.ts +0 -23
- package/dist/layers/TableLayer.d.ts.map +0 -1
- package/dist/layers/TableLayer.js +0 -58
- package/dist/layers/TableLayer.js.map +0 -1
- package/dist/layers/TextLayer.d.ts +0 -23
- package/dist/layers/TextLayer.d.ts.map +0 -1
- package/dist/layers/TextLayer.js +0 -126
- package/dist/layers/TextLayer.js.map +0 -1
- package/dist/layers/VideoLayer.d.ts +0 -40
- package/dist/layers/VideoLayer.d.ts.map +0 -1
- package/dist/layers/VideoLayer.js +0 -105
- package/dist/layers/VideoLayer.js.map +0 -1
- package/dist/layers/index.d.ts +0 -6
- package/dist/layers/index.d.ts.map +0 -1
- package/dist/layers/index.js +0 -6
- package/dist/layers/index.js.map +0 -1
- package/dist/standalone-entry.d.ts +0 -69
- package/dist/standalone-entry.d.ts.map +0 -1
- package/dist/standalone-entry.js +0 -185
- package/dist/standalone-entry.js.map +0 -1
- package/dist/standalone-source.d.ts +0 -2
- package/dist/types.d.ts +0 -154
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -21
- package/dist/types.js.map +0 -1
- package/dist/utils/animationUtils.d.ts +0 -8
- package/dist/utils/animationUtils.d.ts.map +0 -1
- package/dist/utils/animationUtils.js +0 -8
- package/dist/utils/animationUtils.js.map +0 -1
- package/dist/utils/layerUtils.d.ts +0 -17
- package/dist/utils/layerUtils.d.ts.map +0 -1
- package/dist/utils/layerUtils.js +0 -37
- package/dist/utils/layerUtils.js.map +0 -1
- package/dist/utils/mapTileUtils.d.ts +0 -105
- package/dist/utils/mapTileUtils.d.ts.map +0 -1
- package/dist/utils/mapTileUtils.js +0 -268
- package/dist/utils/mapTileUtils.js.map +0 -1
package/dist/MarkdownRenderer.js
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* MarkdownRenderer Component
|
|
4
|
-
*
|
|
5
|
-
* Converts a MarkdownBlockNode[] AST into React elements for rendering
|
|
6
|
-
* markdown content as readable HTML. Used by LinearDocView to display
|
|
7
|
-
* non-annotated document sections as flowing text.
|
|
8
|
-
*
|
|
9
|
-
* Supports all block and inline node types from the markdown DOM:
|
|
10
|
-
* - Block: paragraph, heading, blockquote, list, code, table,
|
|
11
|
-
* thematicBreak, math, htmlBlock, definitionList, directives
|
|
12
|
-
* - Inline: text, emphasis, strong, delete, inlineCode, link,
|
|
13
|
-
* image, break, inlineMath, htmlInline, footnoteReference
|
|
14
|
-
*
|
|
15
|
-
* All elements use the `squisq-md-*` CSS class prefix for styling.
|
|
16
|
-
*/
|
|
17
|
-
import { Fragment } from 'react';
|
|
18
|
-
import { useMediaUrl } from './hooks/MediaContext';
|
|
19
|
-
import { InlineVideoPlayer } from './InlineVideoPlayer.js';
|
|
20
|
-
import { InlineAudioPlayer } from './InlineAudioPlayer.js';
|
|
21
|
-
// ── Inline Renderer ────────────────────────────────────────────────
|
|
22
|
-
/** Render an array of inline nodes into React elements. */
|
|
23
|
-
function renderInline(nodes, keyPrefix = '') {
|
|
24
|
-
return nodes.map((node, i) => {
|
|
25
|
-
const key = `${keyPrefix}i${i}`;
|
|
26
|
-
switch (node.type) {
|
|
27
|
-
case 'text': {
|
|
28
|
-
// Soft breaks (newlines without two trailing spaces) become \n in
|
|
29
|
-
// text nodes. HTML collapses \n to whitespace, which loses the visual
|
|
30
|
-
// line break the author wanted, so render <br> for each newline.
|
|
31
|
-
if (!node.value.includes('\n')) {
|
|
32
|
-
return _jsx(Fragment, { children: node.value }, key);
|
|
33
|
-
}
|
|
34
|
-
const parts = node.value.split('\n');
|
|
35
|
-
return (_jsx(Fragment, { children: parts.map((part, j) => (_jsxs(Fragment, { children: [j > 0 && _jsx("br", {}), part] }, j))) }, key));
|
|
36
|
-
}
|
|
37
|
-
case 'emphasis':
|
|
38
|
-
return (_jsx("em", { className: "squisq-md-em", children: renderInline(node.children, key) }, key));
|
|
39
|
-
case 'strong':
|
|
40
|
-
return (_jsx("strong", { className: "squisq-md-strong", children: renderInline(node.children, key) }, key));
|
|
41
|
-
case 'delete':
|
|
42
|
-
return (_jsx("del", { className: "squisq-md-del", children: renderInline(node.children, key) }, key));
|
|
43
|
-
case 'inlineCode':
|
|
44
|
-
return (_jsx("code", { className: "squisq-md-inline-code", children: node.value }, key));
|
|
45
|
-
case 'link':
|
|
46
|
-
return (_jsx("a", { className: "squisq-md-link", href: node.url, title: node.title ?? undefined, target: "_blank", rel: "noopener noreferrer", children: renderInline(node.children, key) }, key));
|
|
47
|
-
case 'image':
|
|
48
|
-
return (_jsx(MdImage, { src: node.url, alt: node.alt ?? '', title: node.title ?? undefined }, key));
|
|
49
|
-
case 'break':
|
|
50
|
-
return _jsx("br", {}, key);
|
|
51
|
-
case 'inlineMath':
|
|
52
|
-
return (_jsx("code", { className: "squisq-md-inline-math", children: node.value }, key));
|
|
53
|
-
case 'htmlInline':
|
|
54
|
-
// Fast path: no <video>/<audio> in the subtree → use the original
|
|
55
|
-
// rawHtml passthrough (preserves arbitrary HTML for custom embeds).
|
|
56
|
-
if (!containsMediaTag(node.htmlChildren)) {
|
|
57
|
-
return (_jsx("span", { className: "squisq-md-html-inline", dangerouslySetInnerHTML: { __html: node.rawHtml } }, key));
|
|
58
|
-
}
|
|
59
|
-
// Otherwise reconstruct the subtree as React so <video>/<audio>
|
|
60
|
-
// go through MediaContext-aware player components.
|
|
61
|
-
return (_jsx("span", { className: "squisq-md-html-inline", children: renderHtmlNodes(node.htmlChildren, `${key}h`) }, key));
|
|
62
|
-
case 'footnoteReference':
|
|
63
|
-
return (_jsx("sup", { className: "squisq-md-footnote-ref", children: _jsxs("a", { href: `#fn-${node.identifier}`, children: ["[", node.label ?? node.identifier, "]"] }) }, key));
|
|
64
|
-
case 'linkReference':
|
|
65
|
-
// Render as plain text (definition targets not available at render time)
|
|
66
|
-
return (_jsx("span", { className: "squisq-md-link-ref", children: renderInline(node.children, key) }, key));
|
|
67
|
-
case 'imageReference':
|
|
68
|
-
return (_jsxs("span", { className: "squisq-md-image-ref", children: ["[", node.alt ?? node.identifier, "]"] }, key));
|
|
69
|
-
case 'textDirective':
|
|
70
|
-
return (_jsx("span", { className: "squisq-md-text-directive", "data-directive": node.name, children: renderInline(node.children, key) }, key));
|
|
71
|
-
case 'mention':
|
|
72
|
-
return (_jsxs("span", { className: "squisq-md-mention mention", "data-mention": "true", "data-kind": node.targetKind, "data-id": node.targetId, "data-label": node.displayName, children: ["@", node.displayName] }, key));
|
|
73
|
-
default:
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
// ── Block Renderer ─────────────────────────────────────────────────
|
|
79
|
-
/** Render a single block-level node into a React element. */
|
|
80
|
-
function renderBlock(node, key) {
|
|
81
|
-
switch (node.type) {
|
|
82
|
-
case 'paragraph':
|
|
83
|
-
return (_jsx("p", { className: "squisq-md-p", children: renderInline(node.children, key) }, key));
|
|
84
|
-
case 'heading': {
|
|
85
|
-
const Tag = `h${node.depth}`;
|
|
86
|
-
return (_jsx(Tag, { className: `squisq-md-heading squisq-md-h${node.depth}`, children: renderInline(node.children, key) }, key));
|
|
87
|
-
}
|
|
88
|
-
case 'blockquote':
|
|
89
|
-
return (_jsx("blockquote", { className: "squisq-md-blockquote", children: renderBlocks(node.children, key) }, key));
|
|
90
|
-
case 'list':
|
|
91
|
-
if (node.ordered) {
|
|
92
|
-
return (_jsx("ol", { className: "squisq-md-list squisq-md-ol", start: node.start ?? undefined, children: node.children.map((item, i) => renderListItem(item, `${key}li${i}`)) }, key));
|
|
93
|
-
}
|
|
94
|
-
return (_jsx("ul", { className: "squisq-md-list squisq-md-ul", children: node.children.map((item, i) => renderListItem(item, `${key}li${i}`)) }, key));
|
|
95
|
-
case 'code':
|
|
96
|
-
return (_jsx("pre", { className: "squisq-md-code-block", children: _jsx("code", { className: node.lang ? `language-${node.lang}` : undefined, children: node.value }) }, key));
|
|
97
|
-
case 'thematicBreak':
|
|
98
|
-
return _jsx("hr", { className: "squisq-md-hr" }, key);
|
|
99
|
-
case 'table':
|
|
100
|
-
return renderTable(node.children, node.align, key);
|
|
101
|
-
case 'htmlBlock':
|
|
102
|
-
// Fast path: no <video>/<audio> → preserve the existing rawHtml
|
|
103
|
-
// passthrough so arbitrary HTML embeds still survive verbatim.
|
|
104
|
-
if (!containsMediaTag(node.htmlChildren)) {
|
|
105
|
-
return (_jsx("div", { className: "squisq-md-html-block", dangerouslySetInnerHTML: { __html: node.rawHtml } }, key));
|
|
106
|
-
}
|
|
107
|
-
// Otherwise reconstruct subtree as React so <video>/<audio>
|
|
108
|
-
// route through the player components and resolve via MediaContext.
|
|
109
|
-
return (_jsx("div", { className: "squisq-md-html-block", children: renderHtmlNodes(node.htmlChildren, `${key}h`) }, key));
|
|
110
|
-
case 'math':
|
|
111
|
-
return (_jsx("pre", { className: "squisq-md-math-block", children: _jsx("code", { children: node.value }) }, key));
|
|
112
|
-
case 'definition':
|
|
113
|
-
// Link definitions aren't rendered visually
|
|
114
|
-
return null;
|
|
115
|
-
case 'footnoteDefinition':
|
|
116
|
-
return (_jsxs("div", { className: "squisq-md-footnote-def", id: `fn-${node.identifier}`, children: [_jsx("sup", { children: node.label ?? node.identifier }), renderBlocks(node.children, key)] }, key));
|
|
117
|
-
case 'containerDirective':
|
|
118
|
-
return (_jsxs("div", { className: `squisq-md-directive squisq-md-directive-${node.name}`, "data-directive": node.name, children: [node.label && _jsx("div", { className: "squisq-md-directive-label", children: node.label }), renderBlocks(node.children, key)] }, key));
|
|
119
|
-
case 'leafDirective':
|
|
120
|
-
return (_jsx("div", { className: `squisq-md-directive squisq-md-directive-${node.name}`, "data-directive": node.name, children: renderInline(node.children, key) }, key));
|
|
121
|
-
case 'definitionList':
|
|
122
|
-
return (_jsx("dl", { className: "squisq-md-dl", children: node.children.map((child, i) => {
|
|
123
|
-
if (child.type === 'definitionTerm') {
|
|
124
|
-
return (_jsx("dt", { className: "squisq-md-dt", children: renderInline(child.children, `${key}dt${i}`) }, `${key}dt${i}`));
|
|
125
|
-
}
|
|
126
|
-
return (_jsx("dd", { className: "squisq-md-dd", children: renderBlocks(child.children, `${key}dd${i}`) }, `${key}dd${i}`));
|
|
127
|
-
}) }, key));
|
|
128
|
-
default:
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/** Render a list item, including task-list checkbox support. */
|
|
133
|
-
function renderListItem(item, key) {
|
|
134
|
-
const isTask = item.checked !== null && item.checked !== undefined;
|
|
135
|
-
return (_jsxs("li", { className: `squisq-md-li${isTask ? ' squisq-md-task' : ''}`, children: [isTask && (_jsx("input", { type: "checkbox", checked: !!item.checked, readOnly: true, className: "squisq-md-checkbox" })), renderBlocks(item.children, key)] }, key));
|
|
136
|
-
}
|
|
137
|
-
/** Render a table from rows and alignment data. */
|
|
138
|
-
function renderTable(rows, align, key) {
|
|
139
|
-
const [headerRow, ...bodyRows] = rows;
|
|
140
|
-
return (_jsxs("table", { className: "squisq-md-table", children: [headerRow && (_jsx("thead", { children: _jsx("tr", { children: headerRow.children.map((cell, ci) => (_jsx("th", { className: "squisq-md-th", style: align?.[ci] ? { textAlign: align[ci] } : undefined, children: renderInline(cell.children, `${key}th${ci}`) }, `${key}th${ci}`))) }) })), bodyRows.length > 0 && (_jsx("tbody", { children: bodyRows.map((row, ri) => (_jsx("tr", { children: row.children.map((cell, ci) => (_jsx("td", { className: "squisq-md-td", style: align?.[ci] ? { textAlign: align[ci] } : undefined, children: renderInline(cell.children, `${key}td${ri}-${ci}`) }, `${key}td${ri}-${ci}`))) }, `${key}tr${ri}`))) }))] }, key));
|
|
141
|
-
}
|
|
142
|
-
/** Render an array of block-level nodes. */
|
|
143
|
-
function renderBlocks(nodes, keyPrefix = '') {
|
|
144
|
-
return nodes.map((node, i) => renderBlock(node, `${keyPrefix}b${i}`));
|
|
145
|
-
}
|
|
146
|
-
// ── Image with MediaProvider resolution ───────────────────────────
|
|
147
|
-
/** Renders an <img> that resolves its src through the MediaProvider when available. */
|
|
148
|
-
function MdImage({ src, alt, title }) {
|
|
149
|
-
const resolved = useMediaUrl(src, '.');
|
|
150
|
-
return _jsx("img", { className: "squisq-md-image", src: resolved, alt: alt, title: title });
|
|
151
|
-
}
|
|
152
|
-
// ── Raw-HTML walker (intercepts <video>/<audio>) ─────────────────
|
|
153
|
-
/** True when the htmlElement subtree contains a tag we want to swap
|
|
154
|
-
* for a React component. Cheap recursive scan — lets us keep the
|
|
155
|
-
* `dangerouslySetInnerHTML` fast path for everything else. */
|
|
156
|
-
function containsMediaTag(nodes) {
|
|
157
|
-
for (const node of nodes) {
|
|
158
|
-
if (node.type !== 'htmlElement')
|
|
159
|
-
continue;
|
|
160
|
-
if (node.tagName === 'video' || node.tagName === 'audio')
|
|
161
|
-
return true;
|
|
162
|
-
if (containsMediaTag(node.children))
|
|
163
|
-
return true;
|
|
164
|
-
}
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
/** A pragmatic shortlist of HTML attributes the raw-HTML walker
|
|
168
|
-
* passes through to React when reconstructing a non-media element.
|
|
169
|
-
* Anything outside this list is silently dropped — the media-tag
|
|
170
|
-
* fast path means most authors will never hit this code, so we
|
|
171
|
-
* keep the surface narrow to avoid React warnings about unknown
|
|
172
|
-
* attributes. */
|
|
173
|
-
const PASSTHROUGH_ATTRS = {
|
|
174
|
-
// common
|
|
175
|
-
class: 'className',
|
|
176
|
-
id: 'id',
|
|
177
|
-
title: 'title',
|
|
178
|
-
style: 'style',
|
|
179
|
-
// media-adjacent (used when video/audio appear inside other wrappers)
|
|
180
|
-
width: 'width',
|
|
181
|
-
height: 'height',
|
|
182
|
-
// anchor
|
|
183
|
-
href: 'href',
|
|
184
|
-
target: 'target',
|
|
185
|
-
rel: 'rel',
|
|
186
|
-
};
|
|
187
|
-
function reactPropsFromAttrs(attrs) {
|
|
188
|
-
const out = {};
|
|
189
|
-
for (const [name, value] of Object.entries(attrs)) {
|
|
190
|
-
const propName = PASSTHROUGH_ATTRS[name];
|
|
191
|
-
if (!propName)
|
|
192
|
-
continue;
|
|
193
|
-
if (propName === 'style') {
|
|
194
|
-
// We can't safely parse arbitrary `style="..."` strings without
|
|
195
|
-
// an HTML parser; preserve as a data attribute so authors can
|
|
196
|
-
// see it survived round-trip without crashing React.
|
|
197
|
-
out['data-style'] = value;
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
out[propName] = value;
|
|
201
|
-
}
|
|
202
|
-
return out;
|
|
203
|
-
}
|
|
204
|
-
function renderHtmlElement(el, key) {
|
|
205
|
-
if (el.tagName === 'video') {
|
|
206
|
-
return (_jsx(InlineVideoPlayer, { src: el.attributes.src ?? '', width: el.attributes.width, height: el.attributes.height, poster: el.attributes.poster,
|
|
207
|
-
// The `controls` attribute is a boolean — present means true,
|
|
208
|
-
// even if its value is an empty string.
|
|
209
|
-
controls: 'controls' in el.attributes, preload: el.attributes.preload === 'none' ||
|
|
210
|
-
el.attributes.preload === 'metadata' ||
|
|
211
|
-
el.attributes.preload === 'auto'
|
|
212
|
-
? el.attributes.preload
|
|
213
|
-
: undefined }, key));
|
|
214
|
-
}
|
|
215
|
-
if (el.tagName === 'audio') {
|
|
216
|
-
return (_jsx(InlineAudioPlayer, { src: el.attributes.src ?? '', controls: 'controls' in el.attributes, preload: el.attributes.preload === 'none' ||
|
|
217
|
-
el.attributes.preload === 'metadata' ||
|
|
218
|
-
el.attributes.preload === 'auto'
|
|
219
|
-
? el.attributes.preload
|
|
220
|
-
: undefined }, key));
|
|
221
|
-
}
|
|
222
|
-
const Tag = el.tagName;
|
|
223
|
-
const props = reactPropsFromAttrs(el.attributes);
|
|
224
|
-
if (el.selfClosing) {
|
|
225
|
-
return _jsx(Tag, { ...props }, key);
|
|
226
|
-
}
|
|
227
|
-
return (_jsx(Tag, { ...props, children: renderHtmlNodes(el.children, `${key}c`) }, key));
|
|
228
|
-
}
|
|
229
|
-
function renderHtmlNodes(nodes, keyPrefix) {
|
|
230
|
-
return nodes.map((node, i) => {
|
|
231
|
-
const key = `${keyPrefix}${i}`;
|
|
232
|
-
switch (node.type) {
|
|
233
|
-
case 'htmlElement':
|
|
234
|
-
return renderHtmlElement(node, key);
|
|
235
|
-
case 'htmlText':
|
|
236
|
-
return _jsx(Fragment, { children: node.value }, key);
|
|
237
|
-
case 'htmlComment':
|
|
238
|
-
// Comments don't render in React; ignore.
|
|
239
|
-
return null;
|
|
240
|
-
default:
|
|
241
|
-
return null;
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
// ── Main Component ─────────────────────────────────────────────────
|
|
246
|
-
/**
|
|
247
|
-
* Renders MarkdownBlockNode[] AST as React HTML elements.
|
|
248
|
-
*
|
|
249
|
-
* @example
|
|
250
|
-
* ```tsx
|
|
251
|
-
* <MarkdownRenderer nodes={block.contents} />
|
|
252
|
-
* ```
|
|
253
|
-
*/
|
|
254
|
-
export function MarkdownRenderer({ nodes, className }) {
|
|
255
|
-
if (!nodes || nodes.length === 0)
|
|
256
|
-
return null;
|
|
257
|
-
return _jsx("div", { className: `squisq-md ${className || ''}`, children: renderBlocks(nodes) });
|
|
258
|
-
}
|
|
259
|
-
//# sourceMappingURL=MarkdownRenderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../src/MarkdownRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SocialCaptionOverlay Component
|
|
3
|
-
*
|
|
4
|
-
* Social media-style captions (Instagram/TikTok): large centered words
|
|
5
|
-
* showing 3-5 words at a time with the currently-spoken word highlighted
|
|
6
|
-
* in the theme's primary color. Font and colors are pulled from the
|
|
7
|
-
* active theme.
|
|
8
|
-
*
|
|
9
|
-
* Words are gathered across all caption phrases into a continuous stream,
|
|
10
|
-
* then chunked into uniform groups for smooth, consistent pacing.
|
|
11
|
-
*
|
|
12
|
-
* Supports two timing modes:
|
|
13
|
-
* 1. Precise: uses per-word timestamps from CaptionPhrase.words
|
|
14
|
-
* 2. Interpolated: distributes timing evenly within each phrase
|
|
15
|
-
*/
|
|
16
|
-
import type { CaptionTrack, ViewportConfig } from '@bendyline/squisq/schemas';
|
|
17
|
-
import type { Theme } from '@bendyline/squisq/schemas';
|
|
18
|
-
interface SocialCaptionOverlayProps {
|
|
19
|
-
captions: CaptionTrack | undefined;
|
|
20
|
-
currentTime: number;
|
|
21
|
-
enabled?: boolean;
|
|
22
|
-
theme?: Theme;
|
|
23
|
-
viewport?: ViewportConfig;
|
|
24
|
-
}
|
|
25
|
-
export declare function SocialCaptionOverlay({ captions, currentTime, enabled, theme, viewport, }: SocialCaptionOverlayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
26
|
-
export {};
|
|
27
|
-
//# sourceMappingURL=SocialCaptionOverlay.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SocialCaptionOverlay.d.ts","sourceRoot":"","sources":["../src/SocialCaptionOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAiB,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAwFvD,UAAU,yBAAyB;IACjC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,WAAW,EACX,OAAc,EACd,KAAK,EACL,QAAQ,GACT,EAAE,yBAAyB,kDAsI3B"}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* SocialCaptionOverlay Component
|
|
4
|
-
*
|
|
5
|
-
* Social media-style captions (Instagram/TikTok): large centered words
|
|
6
|
-
* showing 3-5 words at a time with the currently-spoken word highlighted
|
|
7
|
-
* in the theme's primary color. Font and colors are pulled from the
|
|
8
|
-
* active theme.
|
|
9
|
-
*
|
|
10
|
-
* Words are gathered across all caption phrases into a continuous stream,
|
|
11
|
-
* then chunked into uniform groups for smooth, consistent pacing.
|
|
12
|
-
*
|
|
13
|
-
* Supports two timing modes:
|
|
14
|
-
* 1. Precise: uses per-word timestamps from CaptionPhrase.words
|
|
15
|
-
* 2. Interpolated: distributes timing evenly within each phrase
|
|
16
|
-
*/
|
|
17
|
-
import { useMemo } from 'react';
|
|
18
|
-
import { resolveFontFamily } from '@bendyline/squisq/schemas';
|
|
19
|
-
/** Target words per visible chunk. */
|
|
20
|
-
const TARGET_CHUNK_SIZE = 4;
|
|
21
|
-
const MIN_CHUNK_SIZE = 2;
|
|
22
|
-
const MAX_CHUNK_SIZE = 6;
|
|
23
|
-
/**
|
|
24
|
-
* Resolve per-word timing for a single phrase.
|
|
25
|
-
* Uses precise word timestamps when available, otherwise interpolates.
|
|
26
|
-
*/
|
|
27
|
-
function resolvePhraseTiming(phrase) {
|
|
28
|
-
// Use precise timing when available
|
|
29
|
-
if (phrase.words && phrase.words.length > 0) {
|
|
30
|
-
return phrase.words.map((w) => ({
|
|
31
|
-
text: w.text,
|
|
32
|
-
startTime: w.startTime,
|
|
33
|
-
endTime: w.endTime,
|
|
34
|
-
}));
|
|
35
|
-
}
|
|
36
|
-
// Interpolate: split text into words, distribute evenly
|
|
37
|
-
const rawWords = phrase.text.split(/\s+/).filter((w) => w.length > 0);
|
|
38
|
-
if (rawWords.length === 0)
|
|
39
|
-
return [];
|
|
40
|
-
const duration = phrase.endTime - phrase.startTime;
|
|
41
|
-
const wordDuration = duration / rawWords.length;
|
|
42
|
-
return rawWords.map((text, i) => ({
|
|
43
|
-
text,
|
|
44
|
-
startTime: phrase.startTime + i * wordDuration,
|
|
45
|
-
endTime: phrase.startTime + (i + 1) * wordDuration,
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Build a continuous stream of timed words from ALL caption phrases,
|
|
50
|
-
* then group into uniform display chunks. This eliminates the "pulsy"
|
|
51
|
-
* feeling caused by per-phrase chunking with variable phrase lengths.
|
|
52
|
-
*/
|
|
53
|
-
function buildWordStream(captions) {
|
|
54
|
-
// Gather all words across all phrases
|
|
55
|
-
const allWords = [];
|
|
56
|
-
for (const phrase of captions.phrases) {
|
|
57
|
-
allWords.push(...resolvePhraseTiming(phrase));
|
|
58
|
-
}
|
|
59
|
-
if (allWords.length === 0)
|
|
60
|
-
return { words: [], chunks: [] };
|
|
61
|
-
// Determine uniform chunk size
|
|
62
|
-
let chunkSize = TARGET_CHUNK_SIZE;
|
|
63
|
-
if (allWords.length > chunkSize) {
|
|
64
|
-
const numChunks = Math.ceil(allWords.length / chunkSize);
|
|
65
|
-
chunkSize = Math.ceil(allWords.length / numChunks);
|
|
66
|
-
chunkSize = Math.min(MAX_CHUNK_SIZE, Math.max(MIN_CHUNK_SIZE, chunkSize));
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
chunkSize = Math.max(MIN_CHUNK_SIZE, allWords.length);
|
|
70
|
-
}
|
|
71
|
-
// Build chunks
|
|
72
|
-
const chunks = [];
|
|
73
|
-
for (let i = 0; i < allWords.length; i += chunkSize) {
|
|
74
|
-
const chunkWords = allWords.slice(i, i + chunkSize);
|
|
75
|
-
chunks.push({
|
|
76
|
-
words: chunkWords,
|
|
77
|
-
startTime: chunkWords[0].startTime,
|
|
78
|
-
endTime: chunkWords[chunkWords.length - 1].endTime,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
return { words: allWords, chunks };
|
|
82
|
-
}
|
|
83
|
-
export function SocialCaptionOverlay({ captions, currentTime, enabled = true, theme, viewport, }) {
|
|
84
|
-
// Build the word stream once when captions change (memoized)
|
|
85
|
-
const { chunks } = useMemo(() => (captions ? buildWordStream(captions) : { words: [], chunks: [] }), [captions]);
|
|
86
|
-
if (!enabled || chunks.length === 0) {
|
|
87
|
-
return (_jsx("div", { className: "social-caption-overlay", style: {
|
|
88
|
-
position: 'absolute',
|
|
89
|
-
bottom: '18%',
|
|
90
|
-
left: 0,
|
|
91
|
-
right: 0,
|
|
92
|
-
zIndex: 50,
|
|
93
|
-
pointerEvents: 'none',
|
|
94
|
-
opacity: 0,
|
|
95
|
-
transition: 'opacity 0.15s ease-in-out',
|
|
96
|
-
} }));
|
|
97
|
-
}
|
|
98
|
-
// Find the active chunk and word using binary-style search
|
|
99
|
-
let activeChunk = null;
|
|
100
|
-
let activeWordIndex = -1;
|
|
101
|
-
for (const chunk of chunks) {
|
|
102
|
-
if (currentTime >= chunk.startTime && currentTime < chunk.endTime) {
|
|
103
|
-
activeChunk = chunk;
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// If between chunks (gap), show the nearest chunk
|
|
108
|
-
if (!activeChunk) {
|
|
109
|
-
for (let i = 0; i < chunks.length - 1; i++) {
|
|
110
|
-
if (currentTime >= chunks[i].endTime && currentTime < chunks[i + 1].startTime) {
|
|
111
|
-
// In a gap — show the chunk we just left (feels more natural)
|
|
112
|
-
activeChunk = chunks[i];
|
|
113
|
-
activeWordIndex = activeChunk.words.length - 1;
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Past all chunks
|
|
118
|
-
if (!activeChunk && chunks.length > 0 && currentTime >= chunks[chunks.length - 1].startTime) {
|
|
119
|
-
activeChunk = chunks[chunks.length - 1];
|
|
120
|
-
activeWordIndex = activeChunk.words.length - 1;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (!activeChunk)
|
|
124
|
-
return null;
|
|
125
|
-
// Find active word within chunk (if not already set from gap handling)
|
|
126
|
-
if (activeWordIndex === -1) {
|
|
127
|
-
for (let i = 0; i < activeChunk.words.length; i++) {
|
|
128
|
-
const word = activeChunk.words[i];
|
|
129
|
-
if (currentTime >= word.startTime && currentTime < word.endTime) {
|
|
130
|
-
activeWordIndex = i;
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
// Fallback: last word before currentTime
|
|
135
|
-
if (activeWordIndex === -1) {
|
|
136
|
-
for (let i = activeChunk.words.length - 1; i >= 0; i--) {
|
|
137
|
-
if (currentTime >= activeChunk.words[i].startTime) {
|
|
138
|
-
activeWordIndex = i;
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// Final fallback
|
|
144
|
-
if (activeWordIndex === -1)
|
|
145
|
-
activeWordIndex = 0;
|
|
146
|
-
}
|
|
147
|
-
// Theme-derived styling
|
|
148
|
-
const primaryColor = theme?.colors?.primary ?? '#5b9bd5';
|
|
149
|
-
const fontFamily = theme?.typography?.titleFont
|
|
150
|
-
? resolveFontFamily(theme.typography.titleFont, '"PT Serif", Georgia, serif')
|
|
151
|
-
: '"PT Serif", Georgia, serif';
|
|
152
|
-
// Scale font to viewport — aim for ~5.5% of viewport height
|
|
153
|
-
const viewportHeight = viewport?.height ?? 720;
|
|
154
|
-
const baseFontSize = Math.round(viewportHeight * 0.055);
|
|
155
|
-
const fontSize = Math.max(24, Math.min(72, baseFontSize));
|
|
156
|
-
return (_jsx("div", { className: "social-caption-overlay", style: {
|
|
157
|
-
position: 'absolute',
|
|
158
|
-
bottom: '18%',
|
|
159
|
-
left: 0,
|
|
160
|
-
right: 0,
|
|
161
|
-
zIndex: 50,
|
|
162
|
-
pointerEvents: 'none',
|
|
163
|
-
textAlign: 'center',
|
|
164
|
-
padding: '0 8%',
|
|
165
|
-
boxSizing: 'border-box',
|
|
166
|
-
opacity: 1,
|
|
167
|
-
transition: 'opacity 0.15s ease-in-out',
|
|
168
|
-
}, children: _jsx("div", { style: {
|
|
169
|
-
display: 'inline-block',
|
|
170
|
-
lineHeight: 1.3,
|
|
171
|
-
}, children: activeChunk.words.map((word, i) => {
|
|
172
|
-
const isActive = i === activeWordIndex;
|
|
173
|
-
return (_jsx("span", { style: {
|
|
174
|
-
fontFamily,
|
|
175
|
-
fontSize: `${fontSize}px`,
|
|
176
|
-
fontWeight: isActive ? 800 : 600,
|
|
177
|
-
color: isActive ? primaryColor : 'rgba(255, 255, 255, 0.9)',
|
|
178
|
-
textShadow: '0 2px 8px rgba(0,0,0,0.7), 0 0 20px rgba(0,0,0,0.4)',
|
|
179
|
-
marginRight: i < activeChunk.words.length - 1 ? '0.3em' : undefined,
|
|
180
|
-
transition: 'color 0.1s ease, font-weight 0.1s ease',
|
|
181
|
-
textTransform: 'uppercase',
|
|
182
|
-
}, children: word.text }, `${word.startTime}-${i}`));
|
|
183
|
-
}) }) }));
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=SocialCaptionOverlay.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SocialCaptionOverlay.js","sourceRoot":"","sources":["../src/SocialCaptionOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlockRenderer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/BlockRenderer.test.tsx"],"names":[],"mappings":""}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { render } from '@testing-library/react';
|
|
4
|
-
import { BlockRenderer, VIEWPORT } from '../BlockRenderer';
|
|
5
|
-
describe('VIEWPORT constant', () => {
|
|
6
|
-
it('has correct 1080p dimensions', () => {
|
|
7
|
-
expect(VIEWPORT.width).toBe(1920);
|
|
8
|
-
expect(VIEWPORT.height).toBe(1080);
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
describe('BlockRenderer', () => {
|
|
12
|
-
const minimalBlock = {
|
|
13
|
-
id: 'test-block',
|
|
14
|
-
startTime: 0,
|
|
15
|
-
duration: 5,
|
|
16
|
-
audioSegment: 0,
|
|
17
|
-
layers: [],
|
|
18
|
-
};
|
|
19
|
-
it('renders an SVG element', () => {
|
|
20
|
-
const { container } = render(_jsx(BlockRenderer, { block: minimalBlock, blockTime: 0, basePath: "/test" }));
|
|
21
|
-
const svg = container.querySelector('svg');
|
|
22
|
-
expect(svg).toBeTruthy();
|
|
23
|
-
});
|
|
24
|
-
it('renders with correct viewBox', () => {
|
|
25
|
-
const { container } = render(_jsx(BlockRenderer, { block: minimalBlock, blockTime: 0, basePath: "/test" }));
|
|
26
|
-
const svg = container.querySelector('svg');
|
|
27
|
-
expect(svg?.getAttribute('viewBox')).toBe('0 0 1920 1080');
|
|
28
|
-
});
|
|
29
|
-
it('renders with custom viewport', () => {
|
|
30
|
-
const { container } = render(_jsx(BlockRenderer, { block: minimalBlock, blockTime: 0, basePath: "/test", viewport: { width: 1080, height: 1920 } }));
|
|
31
|
-
const svg = container.querySelector('svg');
|
|
32
|
-
expect(svg?.getAttribute('viewBox')).toBe('0 0 1080 1920');
|
|
33
|
-
});
|
|
34
|
-
it('renders text layers', () => {
|
|
35
|
-
const blockWithText = {
|
|
36
|
-
id: 'text-block',
|
|
37
|
-
startTime: 0,
|
|
38
|
-
duration: 5,
|
|
39
|
-
audioSegment: 0,
|
|
40
|
-
layers: [
|
|
41
|
-
{
|
|
42
|
-
type: 'text',
|
|
43
|
-
id: 'title',
|
|
44
|
-
content: {
|
|
45
|
-
text: 'Hello World',
|
|
46
|
-
style: {
|
|
47
|
-
fontSize: 48,
|
|
48
|
-
color: '#ffffff',
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
position: { x: 100, y: 100 },
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
};
|
|
55
|
-
const { container } = render(_jsx(BlockRenderer, { block: blockWithText, blockTime: 0, basePath: "/test" }));
|
|
56
|
-
// Text should be rendered somewhere in the SVG
|
|
57
|
-
expect(container.textContent).toContain('Hello World');
|
|
58
|
-
});
|
|
59
|
-
it('renders shape layers', () => {
|
|
60
|
-
const blockWithShape = {
|
|
61
|
-
id: 'shape-block',
|
|
62
|
-
startTime: 0,
|
|
63
|
-
duration: 5,
|
|
64
|
-
audioSegment: 0,
|
|
65
|
-
layers: [
|
|
66
|
-
{
|
|
67
|
-
type: 'shape',
|
|
68
|
-
id: 'bg',
|
|
69
|
-
content: {
|
|
70
|
-
shape: 'rect',
|
|
71
|
-
fill: '#000000',
|
|
72
|
-
},
|
|
73
|
-
position: { x: 0, y: 0, width: 1920, height: 1080 },
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
};
|
|
77
|
-
const { container } = render(_jsx(BlockRenderer, { block: blockWithShape, blockTime: 0, basePath: "/test" }));
|
|
78
|
-
const rect = container.querySelector('rect');
|
|
79
|
-
expect(rect).toBeTruthy();
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
//# sourceMappingURL=BlockRenderer.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlockRenderer.test.js","sourceRoot":"","sources":["../../src/__tests__/BlockRenderer.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocControlsSlideshow.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DocControlsSlideshow.test.tsx"],"names":[],"mappings":""}
|