@bendyline/squisq-react 0.1.2 → 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.
- package/README.md +96 -0
- package/dist/BlockRenderer.d.ts +37 -0
- package/dist/BlockRenderer.d.ts.map +1 -0
- package/dist/BlockRenderer.js +51 -0
- package/dist/BlockRenderer.js.map +1 -0
- package/dist/CaptionOverlay.d.ts +24 -0
- package/dist/CaptionOverlay.d.ts.map +1 -0
- package/dist/CaptionOverlay.js +40 -0
- package/dist/CaptionOverlay.js.map +1 -0
- package/dist/DocControlsBottom.d.ts +28 -0
- package/dist/DocControlsBottom.d.ts.map +1 -0
- package/dist/DocControlsBottom.js +23 -0
- package/dist/DocControlsBottom.js.map +1 -0
- package/dist/DocControlsOverlay.d.ts +28 -0
- package/dist/DocControlsOverlay.d.ts.map +1 -0
- package/dist/DocControlsOverlay.js +75 -0
- package/dist/DocControlsOverlay.js.map +1 -0
- package/dist/DocControlsSidebar.d.ts +27 -0
- package/dist/DocControlsSidebar.d.ts.map +1 -0
- package/dist/DocControlsSidebar.js +6 -0
- package/dist/DocControlsSidebar.js.map +1 -0
- package/dist/DocControlsSlideshow.d.ts +20 -0
- package/dist/DocControlsSlideshow.d.ts.map +1 -0
- package/dist/DocControlsSlideshow.js +69 -0
- package/dist/DocControlsSlideshow.js.map +1 -0
- package/dist/DocPlayer.d.ts +87 -0
- package/dist/DocPlayer.d.ts.map +1 -0
- package/dist/DocPlayer.js +604 -0
- package/dist/DocPlayer.js.map +1 -0
- package/dist/DocPlayerWithSidebar.d.ts +41 -0
- package/dist/DocPlayerWithSidebar.d.ts.map +1 -0
- package/dist/DocPlayerWithSidebar.js +68 -0
- package/dist/DocPlayerWithSidebar.js.map +1 -0
- package/dist/DocProgressBar.d.ts +31 -0
- package/dist/DocProgressBar.d.ts.map +1 -0
- package/dist/DocProgressBar.js +122 -0
- package/dist/DocProgressBar.js.map +1 -0
- package/dist/LinearDocView.d.ts +47 -0
- package/dist/LinearDocView.d.ts.map +1 -0
- package/dist/LinearDocView.js +184 -0
- package/dist/LinearDocView.js.map +1 -0
- package/dist/MarkdownRenderer.d.ts +32 -0
- package/dist/MarkdownRenderer.d.ts.map +1 -0
- package/dist/MarkdownRenderer.js +133 -0
- package/dist/MarkdownRenderer.js.map +1 -0
- package/dist/__tests__/BlockRenderer.test.d.ts +2 -0
- package/dist/__tests__/BlockRenderer.test.d.ts.map +1 -0
- package/dist/__tests__/BlockRenderer.test.js +82 -0
- package/dist/__tests__/BlockRenderer.test.js.map +1 -0
- package/dist/__tests__/DocControlsSlideshow.test.d.ts +2 -0
- package/dist/__tests__/DocControlsSlideshow.test.d.ts.map +1 -0
- package/dist/__tests__/DocControlsSlideshow.test.js +88 -0
- package/dist/__tests__/DocControlsSlideshow.test.js.map +1 -0
- package/dist/__tests__/LinearDocView.test.d.ts +2 -0
- package/dist/__tests__/LinearDocView.test.d.ts.map +1 -0
- package/dist/__tests__/LinearDocView.test.js +160 -0
- package/dist/__tests__/LinearDocView.test.js.map +1 -0
- package/dist/__tests__/MarkdownRenderer.test.d.ts +2 -0
- package/dist/__tests__/MarkdownRenderer.test.d.ts.map +1 -0
- package/dist/__tests__/MarkdownRenderer.test.js +208 -0
- package/dist/__tests__/MarkdownRenderer.test.js.map +1 -0
- package/dist/__tests__/exports.test.d.ts +2 -0
- package/dist/__tests__/exports.test.d.ts.map +1 -0
- package/dist/__tests__/exports.test.js +48 -0
- package/dist/__tests__/exports.test.js.map +1 -0
- package/dist/hooks/AudioProvider.d.ts +71 -0
- package/dist/hooks/AudioProvider.d.ts.map +1 -0
- package/dist/hooks/AudioProvider.js +52 -0
- package/dist/hooks/AudioProvider.js.map +1 -0
- package/dist/hooks/MediaContext.d.ts +35 -0
- package/dist/hooks/MediaContext.d.ts.map +1 -0
- package/dist/hooks/MediaContext.js +66 -0
- package/dist/hooks/MediaContext.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAudioSync.d.ts +18 -0
- package/dist/hooks/useAudioSync.d.ts.map +1 -0
- package/dist/hooks/useAudioSync.js +338 -0
- package/dist/hooks/useAudioSync.js.map +1 -0
- package/dist/hooks/useDocPlayback.d.ts +47 -0
- package/dist/hooks/useDocPlayback.d.ts.map +1 -0
- package/dist/hooks/useDocPlayback.js +176 -0
- package/dist/hooks/useDocPlayback.js.map +1 -0
- package/dist/hooks/useViewportOrientation.d.ts +31 -0
- package/dist/hooks/useViewportOrientation.d.ts.map +1 -0
- package/dist/hooks/useViewportOrientation.js +92 -0
- package/dist/hooks/useViewportOrientation.js.map +1 -0
- package/dist/index.d.ts +25 -563
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -3179
- package/dist/index.js.map +1 -1
- package/dist/layers/ImageLayer.d.ts +23 -0
- package/dist/layers/ImageLayer.d.ts.map +1 -0
- package/dist/layers/ImageLayer.js +104 -0
- package/dist/layers/ImageLayer.js.map +1 -0
- package/dist/layers/MapLayer.d.ts +29 -0
- package/dist/layers/MapLayer.d.ts.map +1 -0
- package/dist/layers/MapLayer.js +97 -0
- package/dist/layers/MapLayer.js.map +1 -0
- package/dist/layers/ShapeLayer.d.ts +20 -0
- package/dist/layers/ShapeLayer.d.ts.map +1 -0
- package/dist/layers/ShapeLayer.js +35 -0
- package/dist/layers/ShapeLayer.js.map +1 -0
- package/dist/layers/TextLayer.d.ts +23 -0
- package/dist/layers/TextLayer.d.ts.map +1 -0
- package/dist/layers/TextLayer.js +126 -0
- package/dist/layers/TextLayer.js.map +1 -0
- package/dist/layers/VideoLayer.d.ts +40 -0
- package/dist/layers/VideoLayer.d.ts.map +1 -0
- package/dist/layers/VideoLayer.js +105 -0
- package/dist/layers/VideoLayer.js.map +1 -0
- package/dist/layers/index.d.ts +6 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +6 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/squisq-player.global.js +1 -1
- package/dist/standalone-entry.d.ts +61 -0
- package/dist/standalone-entry.d.ts.map +1 -0
- package/dist/standalone-entry.js +169 -0
- package/dist/standalone-entry.js.map +1 -0
- package/dist/standalone-source.js +1 -1
- package/dist/types.d.ts +131 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/animationUtils.d.ts +8 -0
- package/dist/utils/animationUtils.d.ts.map +1 -0
- package/dist/utils/animationUtils.js +8 -0
- package/dist/utils/animationUtils.js.map +1 -0
- package/dist/utils/layerUtils.d.ts +17 -0
- package/dist/utils/layerUtils.d.ts.map +1 -0
- package/dist/utils/layerUtils.js +37 -0
- package/dist/utils/layerUtils.js.map +1 -0
- package/dist/utils/mapTileUtils.d.ts +105 -0
- package/dist/utils/mapTileUtils.d.ts.map +1 -0
- package/dist/utils/mapTileUtils.js +268 -0
- package/dist/utils/mapTileUtils.js.map +1 -0
- package/package.json +5 -6
|
@@ -0,0 +1,208 @@
|
|
|
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 { MarkdownRenderer } from '../MarkdownRenderer';
|
|
5
|
+
// ── Helpers ────────────────────────────────────────────────────────
|
|
6
|
+
function text(value) {
|
|
7
|
+
return { type: 'text', value };
|
|
8
|
+
}
|
|
9
|
+
function paragraph(...children) {
|
|
10
|
+
return { type: 'paragraph', children };
|
|
11
|
+
}
|
|
12
|
+
function heading(depth, ...children) {
|
|
13
|
+
return { type: 'heading', depth, children };
|
|
14
|
+
}
|
|
15
|
+
// ── Tests ──────────────────────────────────────────────────────────
|
|
16
|
+
describe('MarkdownRenderer', () => {
|
|
17
|
+
it('renders null for empty nodes', () => {
|
|
18
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: [] }));
|
|
19
|
+
expect(container.innerHTML).toBe('');
|
|
20
|
+
});
|
|
21
|
+
it('renders a paragraph', () => {
|
|
22
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: [paragraph(text('Hello world'))] }));
|
|
23
|
+
const p = container.querySelector('p.squisq-md-p');
|
|
24
|
+
expect(p).toBeTruthy();
|
|
25
|
+
expect(p?.textContent).toBe('Hello world');
|
|
26
|
+
});
|
|
27
|
+
it('renders headings at correct depth', () => {
|
|
28
|
+
const nodes = [
|
|
29
|
+
heading(1, text('Title')),
|
|
30
|
+
heading(2, text('Subtitle')),
|
|
31
|
+
heading(3, text('Section')),
|
|
32
|
+
];
|
|
33
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
34
|
+
expect(container.querySelector('h1')?.textContent).toBe('Title');
|
|
35
|
+
expect(container.querySelector('h2')?.textContent).toBe('Subtitle');
|
|
36
|
+
expect(container.querySelector('h3')?.textContent).toBe('Section');
|
|
37
|
+
});
|
|
38
|
+
it('renders emphasis and strong inline', () => {
|
|
39
|
+
const nodes = [
|
|
40
|
+
paragraph(text('normal '), { type: 'emphasis', children: [text('italic')] }, text(' and '), {
|
|
41
|
+
type: 'strong',
|
|
42
|
+
children: [text('bold')],
|
|
43
|
+
}),
|
|
44
|
+
];
|
|
45
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
46
|
+
expect(container.querySelector('em')?.textContent).toBe('italic');
|
|
47
|
+
expect(container.querySelector('strong')?.textContent).toBe('bold');
|
|
48
|
+
});
|
|
49
|
+
it('renders inline code', () => {
|
|
50
|
+
const nodes = [
|
|
51
|
+
paragraph(text('run '), { type: 'inlineCode', value: 'npm install' }),
|
|
52
|
+
];
|
|
53
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
54
|
+
const code = container.querySelector('code.squisq-md-inline-code');
|
|
55
|
+
expect(code?.textContent).toBe('npm install');
|
|
56
|
+
});
|
|
57
|
+
it('renders a link with target _blank', () => {
|
|
58
|
+
const nodes = [
|
|
59
|
+
paragraph({
|
|
60
|
+
type: 'link',
|
|
61
|
+
url: 'https://example.com',
|
|
62
|
+
title: 'Example',
|
|
63
|
+
children: [text('click')],
|
|
64
|
+
}),
|
|
65
|
+
];
|
|
66
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
67
|
+
const a = container.querySelector('a.squisq-md-link');
|
|
68
|
+
expect(a).toBeTruthy();
|
|
69
|
+
expect(a.href).toContain('example.com');
|
|
70
|
+
expect(a.target).toBe('_blank');
|
|
71
|
+
expect(a.textContent).toBe('click');
|
|
72
|
+
});
|
|
73
|
+
it('renders an image', () => {
|
|
74
|
+
const nodes = [
|
|
75
|
+
paragraph({
|
|
76
|
+
type: 'image',
|
|
77
|
+
url: '/cat.jpg',
|
|
78
|
+
alt: 'A cat',
|
|
79
|
+
}),
|
|
80
|
+
];
|
|
81
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
82
|
+
const img = container.querySelector('img.squisq-md-image');
|
|
83
|
+
expect(img).toBeTruthy();
|
|
84
|
+
expect(img.alt).toBe('A cat');
|
|
85
|
+
});
|
|
86
|
+
it('renders an unordered list', () => {
|
|
87
|
+
const nodes = [
|
|
88
|
+
{
|
|
89
|
+
type: 'list',
|
|
90
|
+
ordered: false,
|
|
91
|
+
children: [
|
|
92
|
+
{ type: 'listItem', children: [paragraph(text('Item A'))] },
|
|
93
|
+
{ type: 'listItem', children: [paragraph(text('Item B'))] },
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
98
|
+
const ul = container.querySelector('ul.squisq-md-ul');
|
|
99
|
+
expect(ul).toBeTruthy();
|
|
100
|
+
const items = ul?.querySelectorAll('li');
|
|
101
|
+
expect(items?.length).toBe(2);
|
|
102
|
+
expect(items?.[0]?.textContent).toBe('Item A');
|
|
103
|
+
});
|
|
104
|
+
it('renders an ordered list with start number', () => {
|
|
105
|
+
const nodes = [
|
|
106
|
+
{
|
|
107
|
+
type: 'list',
|
|
108
|
+
ordered: true,
|
|
109
|
+
start: 3,
|
|
110
|
+
children: [{ type: 'listItem', children: [paragraph(text('Third'))] }],
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
114
|
+
const ol = container.querySelector('ol.squisq-md-ol');
|
|
115
|
+
expect(ol).toBeTruthy();
|
|
116
|
+
expect(ol.start).toBe(3);
|
|
117
|
+
});
|
|
118
|
+
it('renders a task list item with checkbox', () => {
|
|
119
|
+
const nodes = [
|
|
120
|
+
{
|
|
121
|
+
type: 'list',
|
|
122
|
+
ordered: false,
|
|
123
|
+
children: [
|
|
124
|
+
{ type: 'listItem', checked: true, children: [paragraph(text('Done'))] },
|
|
125
|
+
{ type: 'listItem', checked: false, children: [paragraph(text('Todo'))] },
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
130
|
+
const checkboxes = container.querySelectorAll('input[type="checkbox"]');
|
|
131
|
+
expect(checkboxes.length).toBe(2);
|
|
132
|
+
expect(checkboxes[0].checked).toBe(true);
|
|
133
|
+
expect(checkboxes[1].checked).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
it('renders a code block', () => {
|
|
136
|
+
const nodes = [
|
|
137
|
+
{ type: 'code', lang: 'typescript', value: 'const x = 1;' },
|
|
138
|
+
];
|
|
139
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
140
|
+
const pre = container.querySelector('pre.squisq-md-code-block');
|
|
141
|
+
expect(pre).toBeTruthy();
|
|
142
|
+
const code = pre?.querySelector('code.language-typescript');
|
|
143
|
+
expect(code?.textContent).toBe('const x = 1;');
|
|
144
|
+
});
|
|
145
|
+
it('renders a blockquote', () => {
|
|
146
|
+
const nodes = [
|
|
147
|
+
{ type: 'blockquote', children: [paragraph(text('Quoted text'))] },
|
|
148
|
+
];
|
|
149
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
150
|
+
const bq = container.querySelector('blockquote.squisq-md-blockquote');
|
|
151
|
+
expect(bq).toBeTruthy();
|
|
152
|
+
expect(bq?.textContent).toBe('Quoted text');
|
|
153
|
+
});
|
|
154
|
+
it('renders a thematic break', () => {
|
|
155
|
+
const nodes = [
|
|
156
|
+
paragraph(text('Before')),
|
|
157
|
+
{ type: 'thematicBreak' },
|
|
158
|
+
paragraph(text('After')),
|
|
159
|
+
];
|
|
160
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
161
|
+
expect(container.querySelector('hr.squisq-md-hr')).toBeTruthy();
|
|
162
|
+
});
|
|
163
|
+
it('renders a table', () => {
|
|
164
|
+
const nodes = [
|
|
165
|
+
{
|
|
166
|
+
type: 'table',
|
|
167
|
+
align: ['left', 'right'],
|
|
168
|
+
children: [
|
|
169
|
+
{
|
|
170
|
+
type: 'tableRow',
|
|
171
|
+
children: [
|
|
172
|
+
{ type: 'tableCell', isHeader: true, children: [text('Name')] },
|
|
173
|
+
{ type: 'tableCell', isHeader: true, children: [text('Value')] },
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'tableRow',
|
|
178
|
+
children: [
|
|
179
|
+
{ type: 'tableCell', children: [text('A')] },
|
|
180
|
+
{ type: 'tableCell', children: [text('1')] },
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
];
|
|
186
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
187
|
+
const table = container.querySelector('table.squisq-md-table');
|
|
188
|
+
expect(table).toBeTruthy();
|
|
189
|
+
expect(table?.querySelectorAll('th').length).toBe(2);
|
|
190
|
+
expect(table?.querySelectorAll('td').length).toBe(2);
|
|
191
|
+
});
|
|
192
|
+
it('renders strikethrough', () => {
|
|
193
|
+
const nodes = [paragraph({ type: 'delete', children: [text('removed')] })];
|
|
194
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
195
|
+
const del = container.querySelector('del.squisq-md-del');
|
|
196
|
+
expect(del?.textContent).toBe('removed');
|
|
197
|
+
});
|
|
198
|
+
it('renders a hard break', () => {
|
|
199
|
+
const nodes = [paragraph(text('line1'), { type: 'break' }, text('line2'))];
|
|
200
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: nodes }));
|
|
201
|
+
expect(container.querySelector('br')).toBeTruthy();
|
|
202
|
+
});
|
|
203
|
+
it('applies custom className', () => {
|
|
204
|
+
const { container } = render(_jsx(MarkdownRenderer, { nodes: [paragraph(text('test'))], className: "custom" }));
|
|
205
|
+
expect(container.querySelector('.squisq-md.custom')).toBeTruthy();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=MarkdownRenderer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.test.js","sourceRoot":"","sources":["../../src/__tests__/MarkdownRenderer.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import * as squisqReact from '../index';
|
|
3
|
+
describe('@bendyline/squisq-react exports', () => {
|
|
4
|
+
it('exports DocPlayer component', () => {
|
|
5
|
+
expect(squisqReact.DocPlayer).toBeDefined();
|
|
6
|
+
expect(typeof squisqReact.DocPlayer).toBe('function');
|
|
7
|
+
});
|
|
8
|
+
it('exports BlockRenderer component', () => {
|
|
9
|
+
expect(squisqReact.BlockRenderer).toBeDefined();
|
|
10
|
+
expect(typeof squisqReact.BlockRenderer).toBe('function');
|
|
11
|
+
});
|
|
12
|
+
it('exports all layer components', () => {
|
|
13
|
+
expect(typeof squisqReact.ImageLayer).toBe('function');
|
|
14
|
+
expect(typeof squisqReact.TextLayer).toBe('function');
|
|
15
|
+
expect(typeof squisqReact.ShapeLayer).toBe('function');
|
|
16
|
+
expect(typeof squisqReact.VideoLayer).toBe('function');
|
|
17
|
+
expect(typeof squisqReact.MapLayer).toBe('function');
|
|
18
|
+
});
|
|
19
|
+
it('exports control components', () => {
|
|
20
|
+
expect(typeof squisqReact.CaptionOverlay).toBe('function');
|
|
21
|
+
expect(typeof squisqReact.DocControlsOverlay).toBe('function');
|
|
22
|
+
expect(typeof squisqReact.DocControlsBottom).toBe('function');
|
|
23
|
+
expect(typeof squisqReact.DocControlsSidebar).toBe('function');
|
|
24
|
+
expect(typeof squisqReact.DocControlsSlideshow).toBe('function');
|
|
25
|
+
expect(typeof squisqReact.DocPlayerWithSidebar).toBe('function');
|
|
26
|
+
expect(typeof squisqReact.DocProgressBar).toBe('function');
|
|
27
|
+
});
|
|
28
|
+
it('exports MarkdownRenderer and LinearDocView', () => {
|
|
29
|
+
expect(typeof squisqReact.MarkdownRenderer).toBe('function');
|
|
30
|
+
expect(typeof squisqReact.LinearDocView).toBe('function');
|
|
31
|
+
});
|
|
32
|
+
it('exports hooks', () => {
|
|
33
|
+
expect(typeof squisqReact.useAudioSync).toBe('function');
|
|
34
|
+
expect(typeof squisqReact.useDocPlayback).toBe('function');
|
|
35
|
+
expect(typeof squisqReact.useViewportOrientation).toBe('function');
|
|
36
|
+
});
|
|
37
|
+
it('exports utility functions', () => {
|
|
38
|
+
expect(typeof squisqReact.getAnimationStyle).toBe('function');
|
|
39
|
+
expect(typeof squisqReact.getTransitionClass).toBe('function');
|
|
40
|
+
});
|
|
41
|
+
it('exports formatTime utility', () => {
|
|
42
|
+
expect(typeof squisqReact.formatTime).toBe('function');
|
|
43
|
+
expect(squisqReact.formatTime(65)).toBe('1:05');
|
|
44
|
+
expect(squisqReact.formatTime(0)).toBe('0:00');
|
|
45
|
+
expect(squisqReact.formatTime(3661)).toBe('61:01');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=exports.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AudioProvider - Abstraction for audio playback in DocPlayer
|
|
3
|
+
*
|
|
4
|
+
* This module defines an interface for audio playback operations that can have
|
|
5
|
+
* different implementations depending on the runtime environment:
|
|
6
|
+
*
|
|
7
|
+
* - Site/Browser: Uses HTML5 Audio element directly
|
|
8
|
+
* - EFB/MSFS: Routes through CompanionAPI to Electron app
|
|
9
|
+
*
|
|
10
|
+
* The DocPlayer uses this abstraction instead of directly manipulating audio,
|
|
11
|
+
* allowing the same component code to work in both environments.
|
|
12
|
+
*/
|
|
13
|
+
import type { AudioTrack, AudioSegment } from '@bendyline/squisq/schemas';
|
|
14
|
+
export interface AudioState {
|
|
15
|
+
/** Current time in overall timeline (seconds) */
|
|
16
|
+
currentTime: number;
|
|
17
|
+
/** Whether audio is currently playing */
|
|
18
|
+
isPlaying: boolean;
|
|
19
|
+
/** Index of current audio segment */
|
|
20
|
+
currentSegment: number;
|
|
21
|
+
/** Total duration of all segments */
|
|
22
|
+
totalDuration: number;
|
|
23
|
+
/** Whether audio has finished */
|
|
24
|
+
isEnded: boolean;
|
|
25
|
+
/** Whether audio is loaded and ready to play */
|
|
26
|
+
isReady: boolean;
|
|
27
|
+
/** Whether the audio backend is available/connected */
|
|
28
|
+
isAvailable: boolean;
|
|
29
|
+
/** Message to show when not available */
|
|
30
|
+
unavailableMessage?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface AudioActions {
|
|
33
|
+
/** Start or resume playback */
|
|
34
|
+
play: () => Promise<void>;
|
|
35
|
+
/** Pause playback */
|
|
36
|
+
pause: () => Promise<void>;
|
|
37
|
+
/** Toggle play/pause */
|
|
38
|
+
toggle: () => Promise<void>;
|
|
39
|
+
/** Seek to specific time in timeline */
|
|
40
|
+
seekTo: (time: number) => Promise<void>;
|
|
41
|
+
/** Skip to specific segment */
|
|
42
|
+
skipToSegment: (index: number) => Promise<void>;
|
|
43
|
+
/** Restart from beginning */
|
|
44
|
+
restart: () => Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export type AudioProvider = AudioState & AudioActions;
|
|
47
|
+
export interface AudioProviderConfig {
|
|
48
|
+
/** Audio track with segments */
|
|
49
|
+
audioTrack: AudioTrack | undefined;
|
|
50
|
+
/** Base path for resolving audio URLs */
|
|
51
|
+
basePath: string;
|
|
52
|
+
/** Article ID (for EFB companion) */
|
|
53
|
+
articleId?: string;
|
|
54
|
+
/** Tile/geohash (for EFB companion) */
|
|
55
|
+
tile?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Calculate segment start times and total duration from an audio track
|
|
59
|
+
*/
|
|
60
|
+
export declare function calculateSegmentTiming(segments: AudioSegment[] | undefined): {
|
|
61
|
+
segmentStarts: number[];
|
|
62
|
+
totalDuration: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Find which segment a given time falls into
|
|
66
|
+
*/
|
|
67
|
+
export declare function findSegmentAtTime(time: number, segments: AudioSegment[] | undefined, segmentStarts: number[]): {
|
|
68
|
+
segmentIndex: number;
|
|
69
|
+
segmentStart: number;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=AudioProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioProvider.d.ts","sourceRoot":"","sources":["../../src/hooks/AudioProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,qBAAqB;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,wBAAwB;IACxB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,wCAAwC;IACxC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,+BAA+B;IAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,6BAA6B;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,GAAG;IAC5E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB,CAaA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,EACpC,aAAa,EAAE,MAAM,EAAE,GACtB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAuBhD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AudioProvider - Abstraction for audio playback in DocPlayer
|
|
3
|
+
*
|
|
4
|
+
* This module defines an interface for audio playback operations that can have
|
|
5
|
+
* different implementations depending on the runtime environment:
|
|
6
|
+
*
|
|
7
|
+
* - Site/Browser: Uses HTML5 Audio element directly
|
|
8
|
+
* - EFB/MSFS: Routes through CompanionAPI to Electron app
|
|
9
|
+
*
|
|
10
|
+
* The DocPlayer uses this abstraction instead of directly manipulating audio,
|
|
11
|
+
* allowing the same component code to work in both environments.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Calculate segment start times and total duration from an audio track
|
|
15
|
+
*/
|
|
16
|
+
export function calculateSegmentTiming(segments) {
|
|
17
|
+
if (!segments?.length) {
|
|
18
|
+
return { segmentStarts: [], totalDuration: 0 };
|
|
19
|
+
}
|
|
20
|
+
let time = 0;
|
|
21
|
+
const segmentStarts = segments.map((seg) => {
|
|
22
|
+
const start = time;
|
|
23
|
+
time += seg.duration;
|
|
24
|
+
return start;
|
|
25
|
+
});
|
|
26
|
+
return { segmentStarts, totalDuration: time };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Find which segment a given time falls into
|
|
30
|
+
*/
|
|
31
|
+
export function findSegmentAtTime(time, segments, segmentStarts) {
|
|
32
|
+
if (!segments?.length) {
|
|
33
|
+
return { segmentIndex: 0, segmentStart: 0 };
|
|
34
|
+
}
|
|
35
|
+
let segmentIndex = 0;
|
|
36
|
+
let segmentStart = 0;
|
|
37
|
+
for (let i = 0; i < segments.length; i++) {
|
|
38
|
+
const segEnd = segmentStarts[i] + segments[i].duration;
|
|
39
|
+
if (time < segEnd) {
|
|
40
|
+
segmentIndex = i;
|
|
41
|
+
segmentStart = segmentStarts[i];
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
// Handle edge case: time exactly at end goes to last segment
|
|
45
|
+
if (i === segments.length - 1) {
|
|
46
|
+
segmentIndex = i;
|
|
47
|
+
segmentStart = segmentStarts[i];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { segmentIndex, segmentStart };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=AudioProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioProvider.js","sourceRoot":"","sources":["../../src/hooks/AudioProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAmDH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAoC;IAIzE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC;QACnB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAAoC,EACpC,aAAuB;IAEvB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvD,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;YAClB,YAAY,GAAG,CAAC,CAAC;YACjB,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QACD,6DAA6D;QAC7D,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,YAAY,GAAG,CAAC,CAAC;YACjB,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MediaContext — React context for providing a MediaProvider to layer components.
|
|
3
|
+
*
|
|
4
|
+
* When a MediaProvider is available in context, layer components (ImageLayer,
|
|
5
|
+
* VideoLayer) will use it to resolve media URLs instead of the basePath prop.
|
|
6
|
+
* This enables slot-based media storage where binary assets are served from
|
|
7
|
+
* IndexedDB as blob URLs.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const provider = createSlotMediaProvider(slotId);
|
|
11
|
+
* <MediaContext.Provider value={provider}>
|
|
12
|
+
* <DocPlayer doc={doc} basePath="/" />
|
|
13
|
+
* </MediaContext.Provider>
|
|
14
|
+
*/
|
|
15
|
+
import type { MediaProvider } from '@bendyline/squisq/schemas';
|
|
16
|
+
/**
|
|
17
|
+
* React context holding the current MediaProvider (or null if none provided).
|
|
18
|
+
*/
|
|
19
|
+
export declare const MediaContext: import("react").Context<MediaProvider | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Hook to access the current MediaProvider from context.
|
|
22
|
+
* Returns null if no provider is set.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useMediaProvider(): MediaProvider | null;
|
|
25
|
+
/**
|
|
26
|
+
* Hook to resolve a media URL via the MediaProvider (if available),
|
|
27
|
+
* falling back to basePath-based resolution.
|
|
28
|
+
*
|
|
29
|
+
* Returns the resolved URL string. Updates when the provider or path changes.
|
|
30
|
+
*
|
|
31
|
+
* @param relativePath - Relative media path from the document (e.g., 'hero.jpg')
|
|
32
|
+
* @param basePath - Fallback base path for URL construction
|
|
33
|
+
*/
|
|
34
|
+
export declare function useMediaUrl(relativePath: string, basePath: string): string;
|
|
35
|
+
//# sourceMappingURL=MediaContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaContext.d.ts","sourceRoot":"","sources":["../../src/hooks/MediaContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,YAAY,+CAA4C,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwC1E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MediaContext — React context for providing a MediaProvider to layer components.
|
|
3
|
+
*
|
|
4
|
+
* When a MediaProvider is available in context, layer components (ImageLayer,
|
|
5
|
+
* VideoLayer) will use it to resolve media URLs instead of the basePath prop.
|
|
6
|
+
* This enables slot-based media storage where binary assets are served from
|
|
7
|
+
* IndexedDB as blob URLs.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const provider = createSlotMediaProvider(slotId);
|
|
11
|
+
* <MediaContext.Provider value={provider}>
|
|
12
|
+
* <DocPlayer doc={doc} basePath="/" />
|
|
13
|
+
* </MediaContext.Provider>
|
|
14
|
+
*/
|
|
15
|
+
import { createContext, useContext, useState, useEffect, useMemo } from 'react';
|
|
16
|
+
/**
|
|
17
|
+
* React context holding the current MediaProvider (or null if none provided).
|
|
18
|
+
*/
|
|
19
|
+
export const MediaContext = createContext(null);
|
|
20
|
+
/**
|
|
21
|
+
* Hook to access the current MediaProvider from context.
|
|
22
|
+
* Returns null if no provider is set.
|
|
23
|
+
*/
|
|
24
|
+
export function useMediaProvider() {
|
|
25
|
+
return useContext(MediaContext);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Hook to resolve a media URL via the MediaProvider (if available),
|
|
29
|
+
* falling back to basePath-based resolution.
|
|
30
|
+
*
|
|
31
|
+
* Returns the resolved URL string. Updates when the provider or path changes.
|
|
32
|
+
*
|
|
33
|
+
* @param relativePath - Relative media path from the document (e.g., 'hero.jpg')
|
|
34
|
+
* @param basePath - Fallback base path for URL construction
|
|
35
|
+
*/
|
|
36
|
+
export function useMediaUrl(relativePath, basePath) {
|
|
37
|
+
const provider = useMediaProvider();
|
|
38
|
+
// For absolute/http URLs, skip resolution entirely
|
|
39
|
+
const isAbsolute = relativePath.startsWith('http') ||
|
|
40
|
+
relativePath.startsWith('/') ||
|
|
41
|
+
relativePath.startsWith('data:') ||
|
|
42
|
+
relativePath.startsWith('blob:');
|
|
43
|
+
// Memoize fallback to avoid recalculating on every render
|
|
44
|
+
const fallback = useMemo(() => (isAbsolute ? relativePath : `${basePath}/${relativePath}`), [isAbsolute, relativePath, basePath]);
|
|
45
|
+
// Fast path: no provider or absolute URL — return synchronously, skip effect entirely
|
|
46
|
+
const needsProvider = !isAbsolute && !!provider;
|
|
47
|
+
const [url, setUrl] = useState(fallback);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!needsProvider) {
|
|
50
|
+
setUrl(fallback);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let cancelled = false;
|
|
54
|
+
provider.resolveUrl(relativePath).then((resolved) => {
|
|
55
|
+
if (!cancelled)
|
|
56
|
+
setUrl(resolved);
|
|
57
|
+
});
|
|
58
|
+
return () => {
|
|
59
|
+
cancelled = true;
|
|
60
|
+
};
|
|
61
|
+
}, [needsProvider, provider, relativePath, fallback]);
|
|
62
|
+
// When provider is not needed, return fallback directly to avoid
|
|
63
|
+
// the one-frame delay from the initial useState → useEffect cycle
|
|
64
|
+
return needsProvider ? url : fallback;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=MediaContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaContext.js","sourceRoot":"","sources":["../../src/hooks/MediaContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGhF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAuB,IAAI,CAAC,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,QAAgB;IAChE,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IAEpC,mDAAmD;IACnD,MAAM,UAAU,GACd,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;QAC/B,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QAC5B,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC;QAChC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAEnC,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAC,EACjE,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CACrC,CAAC;IAEF,sFAAsF;IACtF,MAAM,aAAa,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC;IAEhD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,QAAS,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnD,IAAI,CAAC,SAAS;gBAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtD,iEAAiE;IACjE,kEAAkE;IAClE,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { calculateSegmentTiming, findSegmentAtTime } from './AudioProvider';
|
|
2
|
+
export type { AudioState, AudioActions, AudioProvider, AudioProviderConfig } from './AudioProvider';
|
|
3
|
+
export { useAudioSync } from './useAudioSync';
|
|
4
|
+
export { useDocPlayback } from './useDocPlayback';
|
|
5
|
+
export { useViewportOrientation } from './useViewportOrientation';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEpG,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { calculateSegmentTiming, findSegmentAtTime } from './AudioProvider';
|
|
2
|
+
export { useAudioSync } from './useAudioSync';
|
|
3
|
+
export { useDocPlayback } from './useDocPlayback';
|
|
4
|
+
export { useViewportOrientation } from './useViewportOrientation';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useAudioSync Hook
|
|
3
|
+
*
|
|
4
|
+
* Synchronizes playback state with an audio element. Provides current
|
|
5
|
+
* playback time, playing state, and methods to control audio playback.
|
|
6
|
+
*
|
|
7
|
+
* Handles multiple audio segments (MP3 files) by tracking which segment
|
|
8
|
+
* is currently playing and calculating the overall timeline position.
|
|
9
|
+
*
|
|
10
|
+
* This is the HTML5 Audio implementation of the AudioProvider interface.
|
|
11
|
+
* For EFB/MSFS environments, use useCompanionAudioSync instead.
|
|
12
|
+
*/
|
|
13
|
+
import type { RefObject } from 'react';
|
|
14
|
+
import type { AudioTrack } from '@bendyline/squisq/schemas';
|
|
15
|
+
import type { AudioProvider } from './AudioProvider';
|
|
16
|
+
export declare function useAudioSync(audioRef: RefObject<HTMLAudioElement>, audioTrack: AudioTrack | undefined, basePath?: string): AudioProvider;
|
|
17
|
+
export default useAudioSync;
|
|
18
|
+
//# sourceMappingURL=useAudioSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAudioSync.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioSync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,EACrC,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,QAAQ,GAAE,MAAW,GACpB,aAAa,CA6Wf;AAED,eAAe,YAAY,CAAC"}
|