@bendyline/squisq-react 1.3.1 → 1.4.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.
Files changed (215) hide show
  1. package/dist/index.d.ts +766 -35
  2. package/dist/index.js +4793 -33
  3. package/dist/index.js.map +1 -1
  4. package/dist/squisq-player.css +1 -1
  5. package/dist/squisq-player.css.map +1 -1
  6. package/dist/squisq-player.global.js +17 -13
  7. package/dist/squisq-player.global.js.map +1 -1
  8. package/dist/standalone-source.js +1 -1
  9. package/package.json +3 -2
  10. package/src/BlockRenderer.tsx +15 -7
  11. package/src/DocPlayer.tsx +65 -12
  12. package/src/DocProgressBar.tsx +21 -3
  13. package/src/LinearDocView.tsx +11 -197
  14. package/src/MarkdownRenderer.tsx +165 -41
  15. package/src/MediaClipLayer.tsx +135 -0
  16. package/src/__tests__/DocPlayer.test.tsx +51 -0
  17. package/src/__tests__/DocProgressBar.test.tsx +76 -0
  18. package/src/__tests__/MarkdownRenderer.test.tsx +95 -1
  19. package/src/__tests__/PathLayer.test.tsx +73 -0
  20. package/src/__tests__/fillStyle.test.tsx +112 -0
  21. package/src/__tests__/transitionStyles.test.ts +125 -0
  22. package/src/__tests__/useDocPlayback.transition.test.ts +70 -0
  23. package/src/hooks/useAudioSync.ts +14 -1
  24. package/src/hooks/useDocPlayback.ts +81 -100
  25. package/src/hooks/useMediaSchedule.ts +39 -0
  26. package/src/index.ts +7 -0
  27. package/src/layers/ImageLayer.tsx +11 -1
  28. package/src/layers/PathLayer.tsx +146 -0
  29. package/src/layers/ShapeLayer.tsx +27 -5
  30. package/src/layers/TextLayer.tsx +395 -22
  31. package/src/layers/VideoLayer.tsx +16 -9
  32. package/src/layers/index.ts +1 -0
  33. package/src/styles/doc-animations.css +1857 -2
  34. package/src/utils/fillStyle.tsx +148 -0
  35. package/dist/BlockRenderer.d.ts +0 -37
  36. package/dist/BlockRenderer.d.ts.map +0 -1
  37. package/dist/BlockRenderer.js +0 -54
  38. package/dist/BlockRenderer.js.map +0 -1
  39. package/dist/CaptionOverlay.d.ts +0 -33
  40. package/dist/CaptionOverlay.d.ts.map +0 -1
  41. package/dist/CaptionOverlay.js +0 -44
  42. package/dist/CaptionOverlay.js.map +0 -1
  43. package/dist/DocControlsBottom.d.ts +0 -28
  44. package/dist/DocControlsBottom.d.ts.map +0 -1
  45. package/dist/DocControlsBottom.js +0 -27
  46. package/dist/DocControlsBottom.js.map +0 -1
  47. package/dist/DocControlsOverlay.d.ts +0 -28
  48. package/dist/DocControlsOverlay.d.ts.map +0 -1
  49. package/dist/DocControlsOverlay.js +0 -80
  50. package/dist/DocControlsOverlay.js.map +0 -1
  51. package/dist/DocControlsSidebar.d.ts +0 -27
  52. package/dist/DocControlsSidebar.d.ts.map +0 -1
  53. package/dist/DocControlsSidebar.js +0 -10
  54. package/dist/DocControlsSidebar.js.map +0 -1
  55. package/dist/DocControlsSlideshow.d.ts +0 -20
  56. package/dist/DocControlsSlideshow.d.ts.map +0 -1
  57. package/dist/DocControlsSlideshow.js +0 -69
  58. package/dist/DocControlsSlideshow.js.map +0 -1
  59. package/dist/DocPlayer.d.ts +0 -97
  60. package/dist/DocPlayer.d.ts.map +0 -1
  61. package/dist/DocPlayer.js +0 -657
  62. package/dist/DocPlayer.js.map +0 -1
  63. package/dist/DocPlayerWithSidebar.d.ts +0 -41
  64. package/dist/DocPlayerWithSidebar.d.ts.map +0 -1
  65. package/dist/DocPlayerWithSidebar.js +0 -69
  66. package/dist/DocPlayerWithSidebar.js.map +0 -1
  67. package/dist/DocProgressBar.d.ts +0 -31
  68. package/dist/DocProgressBar.d.ts.map +0 -1
  69. package/dist/DocProgressBar.js +0 -122
  70. package/dist/DocProgressBar.js.map +0 -1
  71. package/dist/InlineAudioPlayer.d.ts +0 -15
  72. package/dist/InlineAudioPlayer.d.ts.map +0 -1
  73. package/dist/InlineAudioPlayer.js +0 -22
  74. package/dist/InlineAudioPlayer.js.map +0 -1
  75. package/dist/InlineVideoPlayer.d.ts +0 -21
  76. package/dist/InlineVideoPlayer.d.ts.map +0 -1
  77. package/dist/InlineVideoPlayer.js +0 -29
  78. package/dist/InlineVideoPlayer.js.map +0 -1
  79. package/dist/LinearDocView.d.ts +0 -73
  80. package/dist/LinearDocView.d.ts.map +0 -1
  81. package/dist/LinearDocView.js +0 -451
  82. package/dist/LinearDocView.js.map +0 -1
  83. package/dist/MarkdownRenderer.d.ts +0 -32
  84. package/dist/MarkdownRenderer.d.ts.map +0 -1
  85. package/dist/MarkdownRenderer.js +0 -259
  86. package/dist/MarkdownRenderer.js.map +0 -1
  87. package/dist/SocialCaptionOverlay.d.ts +0 -27
  88. package/dist/SocialCaptionOverlay.d.ts.map +0 -1
  89. package/dist/SocialCaptionOverlay.js +0 -185
  90. package/dist/SocialCaptionOverlay.js.map +0 -1
  91. package/dist/__tests__/BlockRenderer.test.d.ts +0 -2
  92. package/dist/__tests__/BlockRenderer.test.d.ts.map +0 -1
  93. package/dist/__tests__/BlockRenderer.test.js +0 -82
  94. package/dist/__tests__/BlockRenderer.test.js.map +0 -1
  95. package/dist/__tests__/DocControlsSlideshow.test.d.ts +0 -2
  96. package/dist/__tests__/DocControlsSlideshow.test.d.ts.map +0 -1
  97. package/dist/__tests__/DocControlsSlideshow.test.js +0 -89
  98. package/dist/__tests__/DocControlsSlideshow.test.js.map +0 -1
  99. package/dist/__tests__/JsonView.test.d.ts +0 -2
  100. package/dist/__tests__/JsonView.test.d.ts.map +0 -1
  101. package/dist/__tests__/JsonView.test.js +0 -93
  102. package/dist/__tests__/JsonView.test.js.map +0 -1
  103. package/dist/__tests__/LinearDocView.test.d.ts +0 -2
  104. package/dist/__tests__/LinearDocView.test.d.ts.map +0 -1
  105. package/dist/__tests__/LinearDocView.test.js +0 -250
  106. package/dist/__tests__/LinearDocView.test.js.map +0 -1
  107. package/dist/__tests__/MarkdownRenderer.test.d.ts +0 -2
  108. package/dist/__tests__/MarkdownRenderer.test.d.ts.map +0 -1
  109. package/dist/__tests__/MarkdownRenderer.test.js +0 -208
  110. package/dist/__tests__/MarkdownRenderer.test.js.map +0 -1
  111. package/dist/__tests__/TableLayer.test.d.ts +0 -2
  112. package/dist/__tests__/TableLayer.test.d.ts.map +0 -1
  113. package/dist/__tests__/TableLayer.test.js +0 -121
  114. package/dist/__tests__/TableLayer.test.js.map +0 -1
  115. package/dist/__tests__/exports.test.d.ts +0 -2
  116. package/dist/__tests__/exports.test.d.ts.map +0 -1
  117. package/dist/__tests__/exports.test.js +0 -48
  118. package/dist/__tests__/exports.test.js.map +0 -1
  119. package/dist/hooks/AudioProvider.d.ts +0 -71
  120. package/dist/hooks/AudioProvider.d.ts.map +0 -1
  121. package/dist/hooks/AudioProvider.js +0 -52
  122. package/dist/hooks/AudioProvider.js.map +0 -1
  123. package/dist/hooks/MediaContext.d.ts +0 -35
  124. package/dist/hooks/MediaContext.d.ts.map +0 -1
  125. package/dist/hooks/MediaContext.js +0 -72
  126. package/dist/hooks/MediaContext.js.map +0 -1
  127. package/dist/hooks/index.d.ts +0 -6
  128. package/dist/hooks/index.d.ts.map +0 -1
  129. package/dist/hooks/index.js +0 -5
  130. package/dist/hooks/index.js.map +0 -1
  131. package/dist/hooks/useAudioSync.d.ts +0 -18
  132. package/dist/hooks/useAudioSync.d.ts.map +0 -1
  133. package/dist/hooks/useAudioSync.js +0 -340
  134. package/dist/hooks/useAudioSync.js.map +0 -1
  135. package/dist/hooks/useAutoSurface.d.ts +0 -11
  136. package/dist/hooks/useAutoSurface.d.ts.map +0 -1
  137. package/dist/hooks/useAutoSurface.js +0 -24
  138. package/dist/hooks/useAutoSurface.js.map +0 -1
  139. package/dist/hooks/useDocPlayback.d.ts +0 -47
  140. package/dist/hooks/useDocPlayback.d.ts.map +0 -1
  141. package/dist/hooks/useDocPlayback.js +0 -179
  142. package/dist/hooks/useDocPlayback.js.map +0 -1
  143. package/dist/hooks/useViewportOrientation.d.ts +0 -31
  144. package/dist/hooks/useViewportOrientation.d.ts.map +0 -1
  145. package/dist/hooks/useViewportOrientation.js +0 -92
  146. package/dist/hooks/useViewportOrientation.js.map +0 -1
  147. package/dist/index.d.ts.map +0 -1
  148. package/dist/jsonView/JsonView.d.ts +0 -26
  149. package/dist/jsonView/JsonView.d.ts.map +0 -1
  150. package/dist/jsonView/JsonView.js +0 -12
  151. package/dist/jsonView/JsonView.js.map +0 -1
  152. package/dist/jsonView/RenderNode.d.ts +0 -22
  153. package/dist/jsonView/RenderNode.d.ts.map +0 -1
  154. package/dist/jsonView/RenderNode.js +0 -30
  155. package/dist/jsonView/RenderNode.js.map +0 -1
  156. package/dist/jsonView/index.d.ts +0 -3
  157. package/dist/jsonView/index.d.ts.map +0 -1
  158. package/dist/jsonView/index.js +0 -2
  159. package/dist/jsonView/index.js.map +0 -1
  160. package/dist/jsonView/useJsonViewTokens.d.ts +0 -14
  161. package/dist/jsonView/useJsonViewTokens.d.ts.map +0 -1
  162. package/dist/jsonView/useJsonViewTokens.js +0 -34
  163. package/dist/jsonView/useJsonViewTokens.js.map +0 -1
  164. package/dist/jsonView/viewers.d.ts +0 -30
  165. package/dist/jsonView/viewers.d.ts.map +0 -1
  166. package/dist/jsonView/viewers.js +0 -226
  167. package/dist/jsonView/viewers.js.map +0 -1
  168. package/dist/layers/ImageLayer.d.ts +0 -23
  169. package/dist/layers/ImageLayer.d.ts.map +0 -1
  170. package/dist/layers/ImageLayer.js +0 -104
  171. package/dist/layers/ImageLayer.js.map +0 -1
  172. package/dist/layers/MapLayer.d.ts +0 -29
  173. package/dist/layers/MapLayer.d.ts.map +0 -1
  174. package/dist/layers/MapLayer.js +0 -97
  175. package/dist/layers/MapLayer.js.map +0 -1
  176. package/dist/layers/ShapeLayer.d.ts +0 -20
  177. package/dist/layers/ShapeLayer.d.ts.map +0 -1
  178. package/dist/layers/ShapeLayer.js +0 -39
  179. package/dist/layers/ShapeLayer.js.map +0 -1
  180. package/dist/layers/TableLayer.d.ts +0 -23
  181. package/dist/layers/TableLayer.d.ts.map +0 -1
  182. package/dist/layers/TableLayer.js +0 -58
  183. package/dist/layers/TableLayer.js.map +0 -1
  184. package/dist/layers/TextLayer.d.ts +0 -23
  185. package/dist/layers/TextLayer.d.ts.map +0 -1
  186. package/dist/layers/TextLayer.js +0 -126
  187. package/dist/layers/TextLayer.js.map +0 -1
  188. package/dist/layers/VideoLayer.d.ts +0 -40
  189. package/dist/layers/VideoLayer.d.ts.map +0 -1
  190. package/dist/layers/VideoLayer.js +0 -105
  191. package/dist/layers/VideoLayer.js.map +0 -1
  192. package/dist/layers/index.d.ts +0 -6
  193. package/dist/layers/index.d.ts.map +0 -1
  194. package/dist/layers/index.js +0 -6
  195. package/dist/layers/index.js.map +0 -1
  196. package/dist/standalone-entry.d.ts +0 -69
  197. package/dist/standalone-entry.d.ts.map +0 -1
  198. package/dist/standalone-entry.js +0 -185
  199. package/dist/standalone-entry.js.map +0 -1
  200. package/dist/types.d.ts +0 -154
  201. package/dist/types.d.ts.map +0 -1
  202. package/dist/types.js +0 -21
  203. package/dist/types.js.map +0 -1
  204. package/dist/utils/animationUtils.d.ts +0 -8
  205. package/dist/utils/animationUtils.d.ts.map +0 -1
  206. package/dist/utils/animationUtils.js +0 -8
  207. package/dist/utils/animationUtils.js.map +0 -1
  208. package/dist/utils/layerUtils.d.ts +0 -17
  209. package/dist/utils/layerUtils.d.ts.map +0 -1
  210. package/dist/utils/layerUtils.js +0 -37
  211. package/dist/utils/layerUtils.js.map +0 -1
  212. package/dist/utils/mapTileUtils.d.ts +0 -105
  213. package/dist/utils/mapTileUtils.d.ts.map +0 -1
  214. package/dist/utils/mapTileUtils.js +0 -268
  215. package/dist/utils/mapTileUtils.js.map +0 -1
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=BlockRenderer.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=DocControlsSlideshow.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocControlsSlideshow.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DocControlsSlideshow.test.tsx"],"names":[],"mappings":""}