@mango-iiif/av 0.0.2 → 0.1.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 (44) hide show
  1. package/README.md +6 -0
  2. package/dist/annotations.d.ts +2 -2
  3. package/dist/annotations.js +3 -3
  4. package/dist/chapters.d.ts +2 -2
  5. package/dist/chapters.js +3 -3
  6. package/dist/{chunk-3LLEY7MA.js → chunk-3PPOT5YI.js} +2 -2
  7. package/dist/{chunk-YH6DS7J6.js → chunk-ARYOSUFI.js} +5 -4
  8. package/dist/chunk-ARYOSUFI.js.map +1 -0
  9. package/dist/{chunk-PZ6GV6ZJ.js → chunk-DF3YH3BM.js} +6 -6
  10. package/dist/{chunk-R4OUWZ3R.js → chunk-HOISQL65.js} +31 -11
  11. package/dist/chunk-HOISQL65.js.map +1 -0
  12. package/dist/{chunk-IFTSCRCU.js → chunk-IMQ4IJY6.js} +3 -3
  13. package/dist/{chunk-JXUHKKIX.js → chunk-QMUWPXP5.js} +2 -2
  14. package/dist/{chunk-GX7UU6V4.js → chunk-RJDPI4KL.js} +61 -21
  15. package/dist/chunk-RJDPI4KL.js.map +1 -0
  16. package/dist/{chunk-ML77YRJL.js → chunk-ZMC36FZ2.js} +92 -18
  17. package/dist/chunk-ZMC36FZ2.js.map +1 -0
  18. package/dist/chunk-ZRPA2VFR.js +218 -0
  19. package/dist/chunk-ZRPA2VFR.js.map +1 -0
  20. package/dist/{controller-DLy38ais.d.ts → controller-BLA8XNsG.d.ts} +10 -2
  21. package/dist/{controller-element-BOKM9v2S.d.ts → controller-element-BY0157ve.d.ts} +1 -1
  22. package/dist/core.d.ts +2 -2
  23. package/dist/core.js +2 -2
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.js +9 -9
  26. package/dist/media.d.ts +1 -1
  27. package/dist/media.js +4 -4
  28. package/dist/player.d.ts +3 -2
  29. package/dist/player.js +5 -4
  30. package/dist/player.js.map +1 -1
  31. package/dist/transcript-element.d.ts +2 -2
  32. package/dist/transcript-element.js +4 -4
  33. package/docs/API.md +10 -0
  34. package/package.json +1 -1
  35. package/dist/chunk-GX7UU6V4.js.map +0 -1
  36. package/dist/chunk-ML77YRJL.js.map +0 -1
  37. package/dist/chunk-NTHMZZYJ.js +0 -38
  38. package/dist/chunk-NTHMZZYJ.js.map +0 -1
  39. package/dist/chunk-R4OUWZ3R.js.map +0 -1
  40. package/dist/chunk-YH6DS7J6.js.map +0 -1
  41. /package/dist/{chunk-3LLEY7MA.js.map → chunk-3PPOT5YI.js.map} +0 -0
  42. /package/dist/{chunk-PZ6GV6ZJ.js.map → chunk-DF3YH3BM.js.map} +0 -0
  43. /package/dist/{chunk-IFTSCRCU.js.map → chunk-IMQ4IJY6.js.map} +0 -0
  44. /package/dist/{chunk-JXUHKKIX.js.map → chunk-QMUWPXP5.js.map} +0 -0
@@ -0,0 +1,218 @@
1
+ import {
2
+ escapeHtml
3
+ } from "./chunk-HOISQL65.js";
4
+
5
+ // src/components/media-chrome.ts
6
+ var registration;
7
+ var languageRegistrations = /* @__PURE__ */ new Map();
8
+ var loadLanguage = (language) => {
9
+ const normalized = language.toLowerCase();
10
+ const code = normalized === "zh-cn" || normalized === "zh-tw" ? normalized : normalized.split("-")[0] ?? normalized;
11
+ if (languageRegistrations.has(code)) return languageRegistrations.get(code);
12
+ const pending = (() => {
13
+ switch (code) {
14
+ case "de":
15
+ return import("media-chrome/lang/de");
16
+ case "es":
17
+ return import("media-chrome/lang/es");
18
+ case "fr":
19
+ return import("media-chrome/lang/fr");
20
+ case "pt":
21
+ return import("media-chrome/lang/pt");
22
+ case "zh-cn":
23
+ return import("media-chrome/lang/zh-CN");
24
+ case "zh-tw":
25
+ return import("media-chrome/lang/zh-TW");
26
+ default:
27
+ return void 0;
28
+ }
29
+ })();
30
+ if (pending) languageRegistrations.set(code, pending);
31
+ return pending;
32
+ };
33
+ var ensureMediaChrome = async (language) => {
34
+ if (language) await loadLanguage(language);
35
+ registration ??= import("media-chrome");
36
+ await registration;
37
+ };
38
+
39
+ // src/components/audio-art.ts
40
+ var audioArtTranscriptHtml = (label, cues, enabled) => {
41
+ if (!enabled || cues.length === 0) return `<span class="audio-art-title">${escapeHtml(label)}</span>`;
42
+ return `<div class="audio-art-transcript" aria-live="polite" aria-label="${escapeHtml(label)}">
43
+ ${cues.map((cue) => `<div class="audio-art-cue" data-audio-cue data-start="${cue.start ?? ""}" data-end="${cue.end ?? cue.start ?? ""}">${cue.speaker ? `<span class="audio-art-speaker">${escapeHtml(cue.speaker)}</span>` : ""}<span>${escapeHtml(cue.text)}</span></div>`).join("")}
44
+ </div>`;
45
+ };
46
+ var resolveAudioVisualizerMode = (value) => value === true ? "pulse" : value || void 0;
47
+ var audioArtContentHtml = (label, cues, transcriptEnabled, visualizerMode) => `<div class="audio-art-text">${audioArtTranscriptHtml(label, cues, transcriptEnabled)}</div>${visualizerMode === "waveform" || visualizerMode === "spectrum" ? `<canvas class="audio-art-visualizer-canvas" aria-hidden="true"></canvas>` : ""}`;
48
+ var syncAudioArtTranscript = (root, time, instant = false) => {
49
+ const cues = [...root.querySelectorAll("[data-audio-cue]")];
50
+ if (cues.length === 0) return;
51
+ const transcript = root.querySelector(".audio-art-transcript");
52
+ if (instant && transcript) {
53
+ transcript.classList.add("seeking");
54
+ requestAnimationFrame(() => transcript.classList.remove("seeking"));
55
+ }
56
+ let activeIndex = cues.findIndex((cue) => {
57
+ const start = Number(cue.dataset.start);
58
+ const end = Number(cue.dataset.end);
59
+ return Number.isFinite(start) && time >= start && (!Number.isFinite(end) || time < end);
60
+ });
61
+ if (activeIndex < 0) {
62
+ for (let index = cues.length - 1; index >= 0; index -= 1) {
63
+ const cue = cues[index];
64
+ if (cue && Number.isFinite(Number(cue.dataset.start)) && time >= Number(cue.dataset.start)) {
65
+ activeIndex = index;
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ if (activeIndex < 0) activeIndex = 0;
71
+ cues.forEach((cue, index) => {
72
+ const offset = index - activeIndex;
73
+ cue.classList.toggle("active", offset === 0);
74
+ cue.classList.toggle("adjacent", Math.abs(offset) === 1);
75
+ cue.toggleAttribute("aria-hidden", offset !== 0);
76
+ cue.style.opacity = offset === 0 ? "1" : Math.abs(offset) === 1 ? ".2" : "0";
77
+ cue.style.transform = `translateY(calc(-50% + ${offset * 4.25}rem))`;
78
+ cue.style.visibility = Math.abs(offset) <= 1 ? "visible" : "hidden";
79
+ });
80
+ };
81
+ var AudioArtVisualizer = class {
82
+ #token = 0;
83
+ #context;
84
+ #source;
85
+ #analyzer;
86
+ #frame = 0;
87
+ #level = 0;
88
+ connect(media, art, mode) {
89
+ this.disconnect();
90
+ const token = ++this.#token;
91
+ if (typeof AudioContext === "undefined") return;
92
+ try {
93
+ if (token !== this.#token || !media.isConnected || !art.isConnected) return;
94
+ const context = new AudioContext();
95
+ const source = context.createMediaElementSource(media);
96
+ const analyzer = context.createAnalyser();
97
+ analyzer.fftSize = 512;
98
+ analyzer.smoothingTimeConstant = 0.95;
99
+ source.connect(context.destination);
100
+ source.connect(analyzer);
101
+ this.#context = context;
102
+ this.#source = source;
103
+ this.#analyzer = analyzer;
104
+ const samples = new Uint8Array(analyzer.fftSize);
105
+ const frequencies = new Uint8Array(analyzer.frequencyBinCount);
106
+ const canvas = art.querySelector(".audio-art-visualizer-canvas");
107
+ const canvasContext = canvas?.getContext("2d");
108
+ const reducedMotion = typeof matchMedia !== "undefined" && matchMedia("(prefers-reduced-motion: reduce)").matches;
109
+ const resizeCanvas = () => {
110
+ if (!canvas || !canvasContext) return;
111
+ const scale = Math.min(2, devicePixelRatio || 1);
112
+ const width = Math.max(1, Math.round(art.clientWidth * scale));
113
+ const height = Math.max(1, Math.round(art.clientHeight * scale));
114
+ if (canvas.width !== width || canvas.height !== height) {
115
+ canvas.width = width;
116
+ canvas.height = height;
117
+ }
118
+ canvasContext.setTransform(scale, 0, 0, scale, 0, 0);
119
+ };
120
+ const drawWaveform = (strength) => {
121
+ if (!canvas || !canvasContext) return;
122
+ resizeCanvas();
123
+ const width = art.clientWidth;
124
+ const height = art.clientHeight;
125
+ canvasContext.clearRect(0, 0, width, height);
126
+ if (strength === 0) return;
127
+ const accent = getComputedStyle(art).getPropertyValue("--mango-av-accent").trim() || "#5b3fd6";
128
+ canvasContext.globalAlpha = Math.min(0.7, 0.18 + strength / 100);
129
+ canvasContext.strokeStyle = accent;
130
+ canvasContext.lineWidth = 1.5;
131
+ canvasContext.beginPath();
132
+ const amplitude = reducedMotion ? 0 : Math.min(height * 0.16, 5 + this.#level * height * 0.12);
133
+ for (let index = 0; index < samples.length; index += 1) {
134
+ const x = index / (samples.length - 1) * width;
135
+ const sample = (samples[index] - 128) / 128;
136
+ const y = height * 0.72 + sample * amplitude;
137
+ if (index === 0) canvasContext.moveTo(x, y);
138
+ else canvasContext.lineTo(x, y);
139
+ }
140
+ canvasContext.stroke();
141
+ canvasContext.globalAlpha = 1;
142
+ };
143
+ const drawSpectrum = (strength) => {
144
+ if (!canvas || !canvasContext) return;
145
+ resizeCanvas();
146
+ const width = art.clientWidth;
147
+ const height = art.clientHeight;
148
+ canvasContext.clearRect(0, 0, width, height);
149
+ if (strength === 0) return;
150
+ analyzer.getByteFrequencyData(frequencies);
151
+ const accent = getComputedStyle(art).getPropertyValue("--mango-av-accent").trim() || "#5b3fd6";
152
+ const barCount = 24;
153
+ const gap = 3;
154
+ const barWidth = Math.max(1, (width - gap * (barCount - 1)) / barCount);
155
+ canvasContext.fillStyle = accent;
156
+ canvasContext.globalAlpha = reducedMotion ? 0.2 : Math.min(0.55, 0.15 + strength / 120);
157
+ for (let index = 0; index < barCount; index += 1) {
158
+ const frequencyIndex = Math.floor((index / barCount) ** 1.7 * frequencies.length * 0.7);
159
+ const energy = reducedMotion ? 0.08 : (frequencies[frequencyIndex] ?? 0) / 255;
160
+ const barHeight = Math.max(1, energy * height * 0.32);
161
+ canvasContext.fillRect(index * (barWidth + gap), height - barHeight, barWidth, barHeight);
162
+ }
163
+ canvasContext.globalAlpha = 1;
164
+ };
165
+ const draw = () => {
166
+ if (token !== this.#token) return;
167
+ analyzer.getByteTimeDomainData(samples);
168
+ let sum = 0;
169
+ for (const sample of samples) {
170
+ const normalized = (sample - 128) / 128;
171
+ sum += normalized * normalized;
172
+ }
173
+ const rms = Math.sqrt(sum / samples.length);
174
+ const target = media.paused || rms < 0.012 ? 0 : Math.min(1, (rms - 0.012) * 5);
175
+ this.#level += (target - this.#level) * (target > this.#level ? 0.1 : 0.04);
176
+ if (target === 0 && this.#level < 0.01) this.#level = 0;
177
+ const strength = reducedMotion ? this.#level * 18 : this.#level === 0 ? 0 : Math.min(52, 12 + this.#level * 40);
178
+ art.style.setProperty("--mango-av-wave-rise", `${(8 - (reducedMotion ? 0 : this.#level * 6)).toFixed(2)}%`);
179
+ art.style.setProperty("--mango-av-wave-strength", `${strength.toFixed(1)}%`);
180
+ art.style.setProperty("--mango-av-wave-mid-strength", `${(strength * 0.45).toFixed(1)}%`);
181
+ art.style.setProperty("--mango-av-wave-edge-strength", `${(strength * 0.18).toFixed(1)}%`);
182
+ if (mode === "waveform") drawWaveform(strength);
183
+ else if (mode === "spectrum") drawSpectrum(strength);
184
+ this.#frame = requestAnimationFrame(draw);
185
+ };
186
+ draw();
187
+ const resume = () => void context.resume();
188
+ media.addEventListener("play", resume, { once: true });
189
+ if (!media.paused) resume();
190
+ } catch {
191
+ this.disconnect();
192
+ }
193
+ }
194
+ disconnect() {
195
+ this.#token += 1;
196
+ if (typeof cancelAnimationFrame !== "undefined") cancelAnimationFrame(this.#frame);
197
+ this.#frame = 0;
198
+ this.#level = 0;
199
+ try {
200
+ this.#source?.disconnect();
201
+ } catch {
202
+ }
203
+ if (this.#context && this.#context.state !== "closed") void this.#context.close();
204
+ this.#analyzer = void 0;
205
+ this.#source = void 0;
206
+ this.#context = void 0;
207
+ }
208
+ };
209
+
210
+ export {
211
+ ensureMediaChrome,
212
+ audioArtTranscriptHtml,
213
+ resolveAudioVisualizerMode,
214
+ audioArtContentHtml,
215
+ syncAudioArtTranscript,
216
+ AudioArtVisualizer
217
+ };
218
+ //# sourceMappingURL=chunk-ZRPA2VFR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/media-chrome.ts","../src/components/audio-art.ts"],"sourcesContent":["let registration: Promise<unknown> | undefined;\nconst languageRegistrations = new Map<string, Promise<unknown>>();\n\nconst loadLanguage = (language: string): Promise<unknown> | undefined => {\n const normalized = language.toLowerCase();\n const code = normalized === 'zh-cn' || normalized === 'zh-tw'\n ? normalized\n : normalized.split('-')[0] ?? normalized;\n if (languageRegistrations.has(code)) return languageRegistrations.get(code);\n const pending = (() => {\n switch (code) {\n case 'de': return import('media-chrome/lang/de');\n case 'es': return import('media-chrome/lang/es');\n case 'fr': return import('media-chrome/lang/fr');\n case 'pt': return import('media-chrome/lang/pt');\n case 'zh-cn': return import('media-chrome/lang/zh-CN');\n case 'zh-tw': return import('media-chrome/lang/zh-TW');\n default: return undefined;\n }\n })();\n if (pending) languageRegistrations.set(code, pending);\n return pending;\n};\n\nexport const ensureMediaChrome = async (language?: string): Promise<void> => {\n if (language) await loadLanguage(language);\n registration ??= import('media-chrome');\n await registration;\n};\n","import type { AVAudioVisualizerMode, TranscriptCue } from '../types';\nimport { escapeHtml } from '../utils';\n\nexport const audioArtTranscriptHtml = (label: string, cues: TranscriptCue[], enabled: boolean): string => {\n if (!enabled || cues.length === 0) return `<span class=\"audio-art-title\">${escapeHtml(label)}</span>`;\n return `<div class=\"audio-art-transcript\" aria-live=\"polite\" aria-label=\"${escapeHtml(label)}\">\n ${cues.map((cue) => `<div class=\"audio-art-cue\" data-audio-cue data-start=\"${cue.start ?? ''}\" data-end=\"${cue.end ?? cue.start ?? ''}\">${cue.speaker ? `<span class=\"audio-art-speaker\">${escapeHtml(cue.speaker)}</span>` : ''}<span>${escapeHtml(cue.text)}</span></div>`).join('')}\n </div>`;\n};\n\nexport const resolveAudioVisualizerMode = (\n value: boolean | AVAudioVisualizerMode | undefined,\n): AVAudioVisualizerMode | undefined => value === true ? 'pulse' : value || undefined;\n\nexport const audioArtContentHtml = (\n label: string,\n cues: TranscriptCue[],\n transcriptEnabled: boolean,\n visualizerMode?: AVAudioVisualizerMode,\n): string => `<div class=\"audio-art-text\">${audioArtTranscriptHtml(label, cues, transcriptEnabled)}</div>${visualizerMode === 'waveform' || visualizerMode === 'spectrum' ? `<canvas class=\"audio-art-visualizer-canvas\" aria-hidden=\"true\"></canvas>` : ''}`;\n\nexport const syncAudioArtTranscript = (root: ParentNode, time: number, instant = false): void => {\n const cues = [...root.querySelectorAll<HTMLElement>('[data-audio-cue]')];\n if (cues.length === 0) return;\n const transcript = root.querySelector<HTMLElement>('.audio-art-transcript');\n if (instant && transcript) {\n transcript.classList.add('seeking');\n requestAnimationFrame(() => transcript.classList.remove('seeking'));\n }\n\n let activeIndex = cues.findIndex((cue) => {\n const start = Number(cue.dataset.start);\n const end = Number(cue.dataset.end);\n return Number.isFinite(start) && time >= start && (!Number.isFinite(end) || time < end);\n });\n if (activeIndex < 0) {\n for (let index = cues.length - 1; index >= 0; index -= 1) {\n const cue = cues[index];\n if (cue && Number.isFinite(Number(cue.dataset.start)) && time >= Number(cue.dataset.start)) {\n activeIndex = index;\n break;\n }\n }\n }\n if (activeIndex < 0) activeIndex = 0;\n\n cues.forEach((cue, index) => {\n const offset = index - activeIndex;\n cue.classList.toggle('active', offset === 0);\n cue.classList.toggle('adjacent', Math.abs(offset) === 1);\n cue.toggleAttribute('aria-hidden', offset !== 0);\n cue.style.opacity = offset === 0 ? '1' : Math.abs(offset) === 1 ? '.2' : '0';\n cue.style.transform = `translateY(calc(-50% + ${offset * 4.25}rem))`;\n cue.style.visibility = Math.abs(offset) <= 1 ? 'visible' : 'hidden';\n });\n};\n\nexport class AudioArtVisualizer {\n #token = 0;\n #context: AudioContext | undefined;\n #source: MediaElementAudioSourceNode | undefined;\n #analyzer: AnalyserNode | undefined;\n #frame = 0;\n #level = 0;\n\n connect(media: HTMLMediaElement, art: HTMLElement, mode: AVAudioVisualizerMode): void {\n this.disconnect();\n const token = ++this.#token;\n if (typeof AudioContext === 'undefined') return;\n\n try {\n if (token !== this.#token || !media.isConnected || !art.isConnected) return;\n const context = new AudioContext();\n const source = context.createMediaElementSource(media);\n const analyzer = context.createAnalyser();\n analyzer.fftSize = 512;\n analyzer.smoothingTimeConstant = .95;\n source.connect(context.destination);\n source.connect(analyzer);\n this.#context = context;\n this.#source = source;\n this.#analyzer = analyzer;\n const samples = new Uint8Array(analyzer.fftSize);\n const frequencies = new Uint8Array(analyzer.frequencyBinCount);\n const canvas = art.querySelector<HTMLCanvasElement>('.audio-art-visualizer-canvas');\n const canvasContext = canvas?.getContext('2d');\n const reducedMotion = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const resizeCanvas = () => {\n if (!canvas || !canvasContext) return;\n const scale = Math.min(2, devicePixelRatio || 1);\n const width = Math.max(1, Math.round(art.clientWidth * scale));\n const height = Math.max(1, Math.round(art.clientHeight * scale));\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n }\n canvasContext.setTransform(scale, 0, 0, scale, 0, 0);\n };\n const drawWaveform = (strength: number) => {\n if (!canvas || !canvasContext) return;\n resizeCanvas();\n const width = art.clientWidth;\n const height = art.clientHeight;\n canvasContext.clearRect(0, 0, width, height);\n if (strength === 0) return;\n const accent = getComputedStyle(art).getPropertyValue('--mango-av-accent').trim() || '#5b3fd6';\n canvasContext.globalAlpha = Math.min(.7, .18 + strength / 100);\n canvasContext.strokeStyle = accent;\n canvasContext.lineWidth = 1.5;\n canvasContext.beginPath();\n const amplitude = reducedMotion ? 0 : Math.min(height * .16, 5 + this.#level * height * .12);\n for (let index = 0; index < samples.length; index += 1) {\n const x = (index / (samples.length - 1)) * width;\n const sample = (samples[index]! - 128) / 128;\n const y = height * .72 + sample * amplitude;\n if (index === 0) canvasContext.moveTo(x, y);\n else canvasContext.lineTo(x, y);\n }\n canvasContext.stroke();\n canvasContext.globalAlpha = 1;\n };\n const drawSpectrum = (strength: number) => {\n if (!canvas || !canvasContext) return;\n resizeCanvas();\n const width = art.clientWidth;\n const height = art.clientHeight;\n canvasContext.clearRect(0, 0, width, height);\n if (strength === 0) return;\n analyzer.getByteFrequencyData(frequencies);\n const accent = getComputedStyle(art).getPropertyValue('--mango-av-accent').trim() || '#5b3fd6';\n const barCount = 24;\n const gap = 3;\n const barWidth = Math.max(1, (width - gap * (barCount - 1)) / barCount);\n canvasContext.fillStyle = accent;\n canvasContext.globalAlpha = reducedMotion ? .2 : Math.min(.55, .15 + strength / 120);\n for (let index = 0; index < barCount; index += 1) {\n const frequencyIndex = Math.floor((index / barCount) ** 1.7 * frequencies.length * .7);\n const energy = reducedMotion ? .08 : (frequencies[frequencyIndex] ?? 0) / 255;\n const barHeight = Math.max(1, energy * height * .32);\n canvasContext.fillRect(index * (barWidth + gap), height - barHeight, barWidth, barHeight);\n }\n canvasContext.globalAlpha = 1;\n };\n const draw = () => {\n if (token !== this.#token) return;\n analyzer.getByteTimeDomainData(samples);\n let sum = 0;\n for (const sample of samples) {\n const normalized = (sample - 128) / 128;\n sum += normalized * normalized;\n }\n const rms = Math.sqrt(sum / samples.length);\n const target = media.paused || rms < .012 ? 0 : Math.min(1, (rms - .012) * 5);\n this.#level += (target - this.#level) * (target > this.#level ? .1 : .04);\n if (target === 0 && this.#level < .01) this.#level = 0;\n const strength = reducedMotion\n ? this.#level * 18\n : this.#level === 0 ? 0 : Math.min(52, 12 + this.#level * 40);\n art.style.setProperty('--mango-av-wave-rise', `${(8 - (reducedMotion ? 0 : this.#level * 6)).toFixed(2)}%`);\n art.style.setProperty('--mango-av-wave-strength', `${strength.toFixed(1)}%`);\n art.style.setProperty('--mango-av-wave-mid-strength', `${(strength * .45).toFixed(1)}%`);\n art.style.setProperty('--mango-av-wave-edge-strength', `${(strength * .18).toFixed(1)}%`);\n if (mode === 'waveform') drawWaveform(strength);\n else if (mode === 'spectrum') drawSpectrum(strength);\n this.#frame = requestAnimationFrame(draw);\n };\n draw();\n const resume = () => void context.resume();\n media.addEventListener('play', resume, { once: true });\n if (!media.paused) resume();\n } catch {\n this.disconnect();\n }\n }\n\n disconnect(): void {\n this.#token += 1;\n if (typeof cancelAnimationFrame !== 'undefined') cancelAnimationFrame(this.#frame);\n this.#frame = 0;\n this.#level = 0;\n try { this.#source?.disconnect(); } catch { /* Already disconnected. */ }\n if (this.#context && this.#context.state !== 'closed') void this.#context.close();\n this.#analyzer = undefined;\n this.#source = undefined;\n this.#context = undefined;\n }\n}\n"],"mappings":"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","names":[]}
@@ -147,6 +147,8 @@ interface AVManifest {
147
147
  logo?: string;
148
148
  }
149
149
  interface AVControlsConfig {
150
+ navigation?: boolean;
151
+ autoAdvance?: boolean;
150
152
  seek?: boolean;
151
153
  volume?: boolean;
152
154
  captions?: boolean;
@@ -172,6 +174,11 @@ interface AVTranscriptConfig {
172
174
  showMetadata?: boolean;
173
175
  showSearchMarkers?: boolean;
174
176
  }
177
+ interface AVAudioArtConfig {
178
+ transcript?: boolean;
179
+ visualizer?: boolean | AVAudioVisualizerMode;
180
+ }
181
+ type AVAudioVisualizerMode = 'pulse' | 'waveform' | 'spectrum';
175
182
  interface AVResumeConfig {
176
183
  enabled?: boolean;
177
184
  maxItems?: number;
@@ -228,6 +235,7 @@ interface AVPlayerConfig {
228
235
  controls?: AVControlsConfig;
229
236
  panels?: AVPanelsConfig;
230
237
  transcript?: AVTranscriptConfig;
238
+ audioArt?: AVAudioArtConfig;
231
239
  resume?: AVResumeConfig;
232
240
  strings?: Partial<AVStrings>;
233
241
  preferredLanguages?: string[];
@@ -310,7 +318,7 @@ interface AVPlayerEventMap {
310
318
  'av-statechange': AVPlayerState;
311
319
  }
312
320
  declare const defaultStrings: AVStrings;
313
- declare const defaultConfig: Required<Pick<AVPlayerConfig, 'controls' | 'panels' | 'transcript' | 'resume' | 'strings' | 'preferredLanguages' | 'autoAdvance' | 'repeat' | 'activePanel' | 'crossorigin' | 'preload' | 'playbackRates'>>;
321
+ declare const defaultConfig: Required<Pick<AVPlayerConfig, 'controls' | 'panels' | 'transcript' | 'audioArt' | 'resume' | 'strings' | 'preferredLanguages' | 'autoAdvance' | 'repeat' | 'activePanel' | 'crossorigin' | 'preload' | 'playbackRates'>>;
314
322
 
315
323
  type ResolvedConfig = AVPlayerConfig & typeof defaultConfig;
316
324
  declare class AVPlayerController extends EventTarget {
@@ -353,4 +361,4 @@ declare class AVPlayerController extends EventTarget {
353
361
  resolvedSourceUrl(): Promise<string | undefined>;
354
362
  }
355
363
 
356
- export { type AVAnnotation as A, type Chapter as C, type DownloadResource as D, type IIIFPresentationVersion as I, type JsonObject as J, type LocalizedValue as L, type MediaKind as M, type TextTrack as T, type AVAnnotationAdapter as a, type AVAnnotationDraft as b, type AVCanvas as c, type AVControlsConfig as d, type AVManifest as e, type AVPanelsConfig as f, type AVPlayerConfig as g, AVPlayerController as h, type AVPlayerEventMap as i, type AVPlayerState as j, type AVResumeConfig as k, type AVStrings as l, type AVTranscriptConfig as m, type AuthService as n, type MediaSource as o, type MetadataEntry as p, type TextTrackKind as q, type TimeSpan as r, type TranscriptCue as s, type TranscriptCueType as t, type TranscriptResource as u, defaultConfig as v, defaultStrings as w };
364
+ export { type AVAnnotation as A, type Chapter as C, type DownloadResource as D, type IIIFPresentationVersion as I, type JsonObject as J, type LocalizedValue as L, type MediaKind as M, type TextTrack as T, type AVAnnotationAdapter as a, type AVAnnotationDraft as b, type AVAudioArtConfig as c, type AVAudioVisualizerMode as d, type AVCanvas as e, type AVControlsConfig as f, type AVManifest as g, type AVPanelsConfig as h, type AVPlayerConfig as i, AVPlayerController as j, type AVPlayerEventMap as k, type AVPlayerState as l, type AVResumeConfig as m, type AVStrings as n, type AVTranscriptConfig as o, type AuthService as p, type MediaSource as q, type MetadataEntry as r, type TextTrackKind as s, type TimeSpan as t, type TranscriptCue as u, type TranscriptCueType as v, type TranscriptResource as w, defaultConfig as x, defaultStrings as y };
@@ -1,4 +1,4 @@
1
- import { h as AVPlayerController, i as AVPlayerEventMap } from './controller-DLy38ais.js';
1
+ import { j as AVPlayerController, k as AVPlayerEventMap } from './controller-BLA8XNsG.js';
2
2
 
3
3
  declare const HTMLElementBase: typeof HTMLElement;
4
4
  declare abstract class AVControllerElement extends HTMLElementBase {
package/dist/core.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { l as AVStrings, J as JsonObject, e as AVManifest, u as TranscriptResource, s as TranscriptCue, r as TimeSpan } from './controller-DLy38ais.js';
2
- export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVCanvas, d as AVControlsConfig, f as AVPanelsConfig, g as AVPlayerConfig, h as AVPlayerController, i as AVPlayerEventMap, j as AVPlayerState, k as AVResumeConfig, m as AVTranscriptConfig, n as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, L as LocalizedValue, M as MediaKind, o as MediaSource, p as MetadataEntry, T as TextTrack, q as TextTrackKind, t as TranscriptCueType, v as defaultConfig, w as defaultStrings } from './controller-DLy38ais.js';
1
+ import { n as AVStrings, J as JsonObject, g as AVManifest, w as TranscriptResource, u as TranscriptCue, t as TimeSpan } from './controller-BLA8XNsG.js';
2
+ export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVAudioArtConfig, d as AVAudioVisualizerMode, e as AVCanvas, f as AVControlsConfig, h as AVPanelsConfig, i as AVPlayerConfig, j as AVPlayerController, k as AVPlayerEventMap, l as AVPlayerState, m as AVResumeConfig, o as AVTranscriptConfig, p as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, L as LocalizedValue, M as MediaKind, q as MediaSource, r as MetadataEntry, T as TextTrack, s as TextTrackKind, v as TranscriptCueType, x as defaultConfig, y as defaultStrings } from './controller-BLA8XNsG.js';
3
3
 
4
4
  interface NormalizeOptions {
5
5
  fetch?: typeof globalThis.fetch;
package/dist/core.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  loadTranscript,
4
4
  parseTimedText,
5
5
  parseTranscript
6
- } from "./chunk-3LLEY7MA.js";
6
+ } from "./chunk-3PPOT5YI.js";
7
7
  import {
8
8
  AVPlayerController,
9
9
  defaultConfig,
@@ -12,7 +12,7 @@ import {
12
12
  normalizeManifest,
13
13
  parseTemporalFragment,
14
14
  parseTime
15
- } from "./chunk-R4OUWZ3R.js";
15
+ } from "./chunk-HOISQL65.js";
16
16
  export {
17
17
  AVPlayerController,
18
18
  defaultConfig,
package/dist/index.d.ts CHANGED
@@ -8,9 +8,9 @@ import { MangoAVPlayerElement } from './player.js';
8
8
  export { defineMangoAVPlayer } from './player.js';
9
9
  import { MangoAVMediaElement } from './media.js';
10
10
  export { defineMangoAVMedia } from './media.js';
11
- export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVCanvas, d as AVControlsConfig, e as AVManifest, f as AVPanelsConfig, g as AVPlayerConfig, h as AVPlayerController, i as AVPlayerEventMap, j as AVPlayerState, k as AVResumeConfig, l as AVStrings, m as AVTranscriptConfig, n as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, J as JsonObject, L as LocalizedValue, M as MediaKind, o as MediaSource, p as MetadataEntry, T as TextTrack, q as TextTrackKind, r as TimeSpan, s as TranscriptCue, t as TranscriptCueType, u as TranscriptResource, v as defaultConfig, w as defaultStrings } from './controller-DLy38ais.js';
11
+ export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVAudioArtConfig, d as AVAudioVisualizerMode, e as AVCanvas, f as AVControlsConfig, g as AVManifest, h as AVPanelsConfig, i as AVPlayerConfig, j as AVPlayerController, k as AVPlayerEventMap, l as AVPlayerState, m as AVResumeConfig, n as AVStrings, o as AVTranscriptConfig, p as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, J as JsonObject, L as LocalizedValue, M as MediaKind, q as MediaSource, r as MetadataEntry, T as TextTrack, s as TextTrackKind, t as TimeSpan, u as TranscriptCue, v as TranscriptCueType, w as TranscriptResource, x as defaultConfig, y as defaultStrings } from './controller-BLA8XNsG.js';
12
12
  export { NormalizeOptions, formatTime, loadTranscript, normalizeManifest, parseTemporalFragment, parseTime, parseTimedText, parseTranscript } from './core.js';
13
- import './controller-element-BOKM9v2S.js';
13
+ import './controller-element-BY0157ve.js';
14
14
 
15
15
  declare global {
16
16
  interface HTMLElementTagNameMap {
package/dist/index.js CHANGED
@@ -1,32 +1,32 @@
1
1
  import {
2
2
  MangoAVAnnotationsElement,
3
3
  defineMangoAVAnnotations
4
- } from "./chunk-IFTSCRCU.js";
4
+ } from "./chunk-IMQ4IJY6.js";
5
5
  import {
6
6
  MangoAVChaptersElement,
7
7
  defineMangoAVChapters
8
- } from "./chunk-YH6DS7J6.js";
8
+ } from "./chunk-ARYOSUFI.js";
9
9
  import "./chunk-GAVG7CPU.js";
10
10
  import {
11
11
  MangoAVMediaElement,
12
12
  defineMangoAVMedia
13
- } from "./chunk-GX7UU6V4.js";
13
+ } from "./chunk-RJDPI4KL.js";
14
14
  import {
15
15
  MangoAVPlayerElement,
16
16
  defineMangoAVPlayer
17
- } from "./chunk-ML77YRJL.js";
18
- import "./chunk-NTHMZZYJ.js";
17
+ } from "./chunk-ZMC36FZ2.js";
18
+ import "./chunk-ZRPA2VFR.js";
19
19
  import {
20
20
  MangoAVTranscriptElement,
21
21
  defineMangoAVTranscript
22
- } from "./chunk-PZ6GV6ZJ.js";
22
+ } from "./chunk-DF3YH3BM.js";
23
23
  import "./chunk-CDLYT3KB.js";
24
+ import "./chunk-QMUWPXP5.js";
24
25
  import {
25
26
  loadTranscript,
26
27
  parseTimedText,
27
28
  parseTranscript
28
- } from "./chunk-3LLEY7MA.js";
29
- import "./chunk-JXUHKKIX.js";
29
+ } from "./chunk-3PPOT5YI.js";
30
30
  import {
31
31
  AVPlayerController,
32
32
  defaultConfig,
@@ -35,7 +35,7 @@ import {
35
35
  normalizeManifest,
36
36
  parseTemporalFragment,
37
37
  parseTime
38
- } from "./chunk-R4OUWZ3R.js";
38
+ } from "./chunk-HOISQL65.js";
39
39
 
40
40
  // src/index.ts
41
41
  if (typeof window !== "undefined" && "customElements" in window) {
package/dist/media.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { h as AVPlayerController, J as JsonObject, g as AVPlayerConfig, e as AVManifest, c as AVCanvas } from './controller-DLy38ais.js';
1
+ import { j as AVPlayerController, J as JsonObject, i as AVPlayerConfig, g as AVManifest, e as AVCanvas } from './controller-BLA8XNsG.js';
2
2
 
3
3
  declare const HTMLElementBase: typeof HTMLElement;
4
4
  declare class MangoAVMediaElement extends HTMLElementBase {
package/dist/media.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  MangoAVMediaElement,
3
3
  defineMangoAVMedia
4
- } from "./chunk-GX7UU6V4.js";
5
- import "./chunk-NTHMZZYJ.js";
4
+ } from "./chunk-RJDPI4KL.js";
5
+ import "./chunk-ZRPA2VFR.js";
6
6
  import "./chunk-CDLYT3KB.js";
7
- import "./chunk-3LLEY7MA.js";
8
- import "./chunk-R4OUWZ3R.js";
7
+ import "./chunk-3PPOT5YI.js";
8
+ import "./chunk-HOISQL65.js";
9
9
 
10
10
  // src/media.ts
11
11
  if (typeof window !== "undefined" && "customElements" in window) defineMangoAVMedia();
package/dist/player.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as AVControllerElement } from './controller-element-BOKM9v2S.js';
2
- import { J as JsonObject, g as AVPlayerConfig, e as AVManifest, c as AVCanvas, i as AVPlayerEventMap } from './controller-DLy38ais.js';
1
+ import { A as AVControllerElement } from './controller-element-BY0157ve.js';
2
+ import { J as JsonObject, i as AVPlayerConfig, g as AVManifest, e as AVCanvas, k as AVPlayerEventMap } from './controller-BLA8XNsG.js';
3
3
 
4
4
  declare class MangoAVPlayerElement extends AVControllerElement {
5
5
  #private;
@@ -10,6 +10,7 @@ declare class MangoAVPlayerElement extends AVControllerElement {
10
10
  get config(): AVPlayerConfig;
11
11
  set config(value: AVPlayerConfig);
12
12
  connectedCallback(): void;
13
+ disconnectedCallback(): void;
13
14
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
14
15
  load(input: JsonObject | string): Promise<AVManifest>;
15
16
  play(): Promise<void>;
package/dist/player.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  MangoAVPlayerElement,
3
3
  defineMangoAVPlayer
4
- } from "./chunk-ML77YRJL.js";
5
- import "./chunk-NTHMZZYJ.js";
6
- import "./chunk-JXUHKKIX.js";
7
- import "./chunk-R4OUWZ3R.js";
4
+ } from "./chunk-ZMC36FZ2.js";
5
+ import "./chunk-ZRPA2VFR.js";
6
+ import "./chunk-QMUWPXP5.js";
7
+ import "./chunk-3PPOT5YI.js";
8
+ import "./chunk-HOISQL65.js";
8
9
 
9
10
  // src/player.ts
10
11
  if (typeof window !== "undefined" && "customElements" in window) defineMangoAVPlayer();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/player.ts"],"sourcesContent":["export { defineMangoAVPlayer, MangoAVPlayerElement } from './components/mango-av-player';\n\nimport { defineMangoAVPlayer } from './components/mango-av-player';\nif (typeof window !== 'undefined' && 'customElements' in window) defineMangoAVPlayer();\n"],"mappings":";;;;;;;;;AAGA,IAAI,OAAO,WAAW,eAAe,oBAAoB,OAAQ,qBAAoB;","names":[]}
1
+ {"version":3,"sources":["../src/player.ts"],"sourcesContent":["export { defineMangoAVPlayer, MangoAVPlayerElement } from './components/mango-av-player';\n\nimport { defineMangoAVPlayer } from './components/mango-av-player';\nif (typeof window !== 'undefined' && 'customElements' in window) defineMangoAVPlayer();\n"],"mappings":";;;;;;;;;;AAGA,IAAI,OAAO,WAAW,eAAe,oBAAoB,OAAQ,qBAAoB;","names":[]}
@@ -1,5 +1,5 @@
1
- import { A as AVControllerElement } from './controller-element-BOKM9v2S.js';
2
- import { i as AVPlayerEventMap } from './controller-DLy38ais.js';
1
+ import { A as AVControllerElement } from './controller-element-BY0157ve.js';
2
+ import { k as AVPlayerEventMap } from './controller-BLA8XNsG.js';
3
3
 
4
4
  declare class MangoAVTranscriptElement extends AVControllerElement {
5
5
  #private;
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  MangoAVTranscriptElement,
3
3
  defineMangoAVTranscript
4
- } from "./chunk-PZ6GV6ZJ.js";
4
+ } from "./chunk-DF3YH3BM.js";
5
5
  import "./chunk-CDLYT3KB.js";
6
- import "./chunk-3LLEY7MA.js";
7
- import "./chunk-JXUHKKIX.js";
8
- import "./chunk-R4OUWZ3R.js";
6
+ import "./chunk-QMUWPXP5.js";
7
+ import "./chunk-3PPOT5YI.js";
8
+ import "./chunk-HOISQL65.js";
9
9
 
10
10
  // src/transcript-element.ts
11
11
  if (typeof window !== "undefined" && "customElements" in window) defineMangoAVTranscript();
package/docs/API.md CHANGED
@@ -149,6 +149,8 @@ Renders and follows the active Canvas annotations. Selecting a timed annotation
149
149
  | `--mango-av-panel-width` | `24rem` |
150
150
  | `--mango-av-player-aspect-ratio` | `16 / 9` |
151
151
 
152
+ For audio Canvases, `audioArt.transcript` replaces the artwork title with the current timed cue. The preceding and following cues remain visible at reduced opacity and slide as playback crosses cue boundaries. `audioArt.visualizer` accepts `'pulse'`, `'waveform'`, `'spectrum'`, `true` (an alias for `'pulse'`), or `false`. Every mode inherits `--mango-av-accent`, fades out completely during silence or pause, and reduces or removes movement when `prefers-reduced-motion: reduce` is active.
153
+
152
154
  Media Chrome's own public variables remain available and can override the mapped defaults.
153
155
 
154
156
  ## `AVPlayerConfig`
@@ -156,6 +158,8 @@ Media Chrome's own public variables remain available and can override the mapped
156
158
  ```ts
157
159
  interface AVPlayerConfig {
158
160
  controls?: {
161
+ navigation?: boolean;
162
+ autoAdvance?: boolean;
159
163
  seek?: boolean;
160
164
  volume?: boolean;
161
165
  captions?: boolean;
@@ -181,6 +185,10 @@ interface AVPlayerConfig {
181
185
  showMetadata?: boolean;
182
186
  showSearchMarkers?: boolean;
183
187
  };
188
+ audioArt?: {
189
+ transcript?: boolean;
190
+ visualizer?: boolean | 'pulse' | 'waveform' | 'spectrum';
191
+ };
184
192
  resume?: {
185
193
  enabled?: boolean;
186
194
  maxItems?: number;
@@ -204,6 +212,8 @@ interface AVPlayerConfig {
204
212
  }
205
213
  ```
206
214
 
215
+ `controls.navigation` shows the Previous and Next buttons, while `controls.autoAdvance` shows the Auto-advance checkbox. Both default to `false`; hiding them does not disable `controller.previous()`, `controller.next()`, or programmatic auto-advance.
216
+
207
217
  `fetch` and `requestInit` configure manifest, external AnnotationPage, and transcript requests. `resolveRequest` runs immediately before a media URL is assigned; it can obtain an IIIF Auth token, sign a URL, route through a proxy, or enforce an application's access policy. The normalized Canvas exposes discovered auth services to the callback through `context.canvas.authServices`.
208
218
 
209
219
  `annotationAdapter` connects create/update/delete to the host's persistence API:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mango-iiif/av",
3
- "version": "0.0.2",
3
+ "version": "0.1.0",
4
4
  "description": "Framework-free IIIF audio and video components powered by Media Chrome.",
5
5
  "license": "MIT",
6
6
  "type": "module",