@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.
- package/README.md +6 -0
- package/dist/annotations.d.ts +2 -2
- package/dist/annotations.js +3 -3
- package/dist/chapters.d.ts +2 -2
- package/dist/chapters.js +3 -3
- package/dist/{chunk-3LLEY7MA.js → chunk-3PPOT5YI.js} +2 -2
- package/dist/{chunk-YH6DS7J6.js → chunk-ARYOSUFI.js} +5 -4
- package/dist/chunk-ARYOSUFI.js.map +1 -0
- package/dist/{chunk-PZ6GV6ZJ.js → chunk-DF3YH3BM.js} +6 -6
- package/dist/{chunk-R4OUWZ3R.js → chunk-HOISQL65.js} +31 -11
- package/dist/chunk-HOISQL65.js.map +1 -0
- package/dist/{chunk-IFTSCRCU.js → chunk-IMQ4IJY6.js} +3 -3
- package/dist/{chunk-JXUHKKIX.js → chunk-QMUWPXP5.js} +2 -2
- package/dist/{chunk-GX7UU6V4.js → chunk-RJDPI4KL.js} +61 -21
- package/dist/chunk-RJDPI4KL.js.map +1 -0
- package/dist/{chunk-ML77YRJL.js → chunk-ZMC36FZ2.js} +92 -18
- package/dist/chunk-ZMC36FZ2.js.map +1 -0
- package/dist/chunk-ZRPA2VFR.js +218 -0
- package/dist/chunk-ZRPA2VFR.js.map +1 -0
- package/dist/{controller-DLy38ais.d.ts → controller-BLA8XNsG.d.ts} +10 -2
- package/dist/{controller-element-BOKM9v2S.d.ts → controller-element-BY0157ve.d.ts} +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/core.js +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +9 -9
- package/dist/media.d.ts +1 -1
- package/dist/media.js +4 -4
- package/dist/player.d.ts +3 -2
- package/dist/player.js +5 -4
- package/dist/player.js.map +1 -1
- package/dist/transcript-element.d.ts +2 -2
- package/dist/transcript-element.js +4 -4
- package/docs/API.md +10 -0
- package/package.json +1 -1
- package/dist/chunk-GX7UU6V4.js.map +0 -1
- package/dist/chunk-ML77YRJL.js.map +0 -1
- package/dist/chunk-NTHMZZYJ.js +0 -38
- package/dist/chunk-NTHMZZYJ.js.map +0 -1
- package/dist/chunk-R4OUWZ3R.js.map +0 -1
- package/dist/chunk-YH6DS7J6.js.map +0 -1
- /package/dist/{chunk-3LLEY7MA.js.map → chunk-3PPOT5YI.js.map} +0 -0
- /package/dist/{chunk-PZ6GV6ZJ.js.map → chunk-DF3YH3BM.js.map} +0 -0
- /package/dist/{chunk-IFTSCRCU.js.map → chunk-IMQ4IJY6.js.map} +0 -0
- /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":";;;;;AAAA,IAAI;AACJ,IAAM,wBAAwB,oBAAI,IAA8B;AAEhE,IAAM,eAAe,CAAC,aAAmD;AACvE,QAAM,aAAa,SAAS,YAAY;AACxC,QAAM,OAAO,eAAe,WAAW,eAAe,UAClD,aACA,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK;AAChC,MAAI,sBAAsB,IAAI,IAAI,EAAG,QAAO,sBAAsB,IAAI,IAAI;AAC1E,QAAM,WAAW,MAAM;AACrB,YAAQ,MAAM;AAAA,MACZ,KAAK;AAAM,eAAO,OAAO,sBAAsB;AAAA,MAC/C,KAAK;AAAM,eAAO,OAAO,sBAAsB;AAAA,MAC/C,KAAK;AAAM,eAAO,OAAO,sBAAsB;AAAA,MAC/C,KAAK;AAAM,eAAO,OAAO,sBAAsB;AAAA,MAC/C,KAAK;AAAS,eAAO,OAAO,yBAAyB;AAAA,MACrD,KAAK;AAAS,eAAO,OAAO,yBAAyB;AAAA,MACrD;AAAS,eAAO;AAAA,IAClB;AAAA,EACF,GAAG;AACH,MAAI,QAAS,uBAAsB,IAAI,MAAM,OAAO;AACpD,SAAO;AACT;AAEO,IAAM,oBAAoB,OAAO,aAAqC;AAC3E,MAAI,SAAU,OAAM,aAAa,QAAQ;AACzC,mBAAiB,OAAO,cAAc;AACtC,QAAM;AACR;;;ACzBO,IAAM,yBAAyB,CAAC,OAAe,MAAuB,YAA6B;AACxG,MAAI,CAAC,WAAW,KAAK,WAAW,EAAG,QAAO,iCAAiC,WAAW,KAAK,CAAC;AAC5F,SAAO,oEAAoE,WAAW,KAAK,CAAC;AAAA,MACxF,KAAK,IAAI,CAAC,QAAQ,yDAAyD,IAAI,SAAS,EAAE,eAAe,IAAI,OAAO,IAAI,SAAS,EAAE,KAAK,IAAI,UAAU,mCAAmC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,SAAS,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;AAAA;AAE1R;AAEO,IAAM,6BAA6B,CACxC,UACsC,UAAU,OAAO,UAAU,SAAS;AAErE,IAAM,sBAAsB,CACjC,OACA,MACA,mBACA,mBACW,+BAA+B,uBAAuB,OAAO,MAAM,iBAAiB,CAAC,SAAS,mBAAmB,cAAc,mBAAmB,aAAa,6EAA6E,EAAE;AAEpP,IAAM,yBAAyB,CAAC,MAAkB,MAAc,UAAU,UAAgB;AAC/F,QAAM,OAAO,CAAC,GAAG,KAAK,iBAA8B,kBAAkB,CAAC;AACvE,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,aAAa,KAAK,cAA2B,uBAAuB;AAC1E,MAAI,WAAW,YAAY;AACzB,eAAW,UAAU,IAAI,SAAS;AAClC,0BAAsB,MAAM,WAAW,UAAU,OAAO,SAAS,CAAC;AAAA,EACpE;AAEA,MAAI,cAAc,KAAK,UAAU,CAAC,QAAQ;AACxC,UAAM,QAAQ,OAAO,IAAI,QAAQ,KAAK;AACtC,UAAM,MAAM,OAAO,IAAI,QAAQ,GAAG;AAClC,WAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,UAAU,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO;AAAA,EACrF,CAAC;AACD,MAAI,cAAc,GAAG;AACnB,aAAS,QAAQ,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACxD,YAAM,MAAM,KAAK,KAAK;AACtB,UAAI,OAAO,OAAO,SAAS,OAAO,IAAI,QAAQ,KAAK,CAAC,KAAK,QAAQ,OAAO,IAAI,QAAQ,KAAK,GAAG;AAC1F,sBAAc;AACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc,EAAG,eAAc;AAEnC,OAAK,QAAQ,CAAC,KAAK,UAAU;AAC3B,UAAM,SAAS,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,WAAW,CAAC;AAC3C,QAAI,UAAU,OAAO,YAAY,KAAK,IAAI,MAAM,MAAM,CAAC;AACvD,QAAI,gBAAgB,eAAe,WAAW,CAAC;AAC/C,QAAI,MAAM,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,IAAI,OAAO;AACzE,QAAI,MAAM,YAAY,0BAA0B,SAAS,IAAI;AAC7D,QAAI,MAAM,aAAa,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY;AAAA,EAC7D,CAAC;AACH;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EAET,QAAQ,OAAyB,KAAkB,MAAmC;AACpF,SAAK,WAAW;AAChB,UAAM,QAAQ,EAAE,KAAK;AACrB,QAAI,OAAO,iBAAiB,YAAa;AAEzC,QAAI;AACF,UAAI,UAAU,KAAK,UAAU,CAAC,MAAM,eAAe,CAAC,IAAI,YAAa;AACrE,YAAM,UAAU,IAAI,aAAa;AACjC,YAAM,SAAS,QAAQ,yBAAyB,KAAK;AACrD,YAAM,WAAW,QAAQ,eAAe;AACxC,eAAS,UAAU;AACnB,eAAS,wBAAwB;AACjC,aAAO,QAAQ,QAAQ,WAAW;AAClC,aAAO,QAAQ,QAAQ;AACvB,WAAK,WAAW;AAChB,WAAK,UAAU;AACf,WAAK,YAAY;AACjB,YAAM,UAAU,IAAI,WAAW,SAAS,OAAO;AAC/C,YAAM,cAAc,IAAI,WAAW,SAAS,iBAAiB;AAC7D,YAAM,SAAS,IAAI,cAAiC,8BAA8B;AAClF,YAAM,gBAAgB,QAAQ,WAAW,IAAI;AAC7C,YAAM,gBAAgB,OAAO,eAAe,eAAe,WAAW,kCAAkC,EAAE;AAC1G,YAAM,eAAe,MAAM;AACzB,YAAI,CAAC,UAAU,CAAC,cAAe;AAC/B,cAAM,QAAQ,KAAK,IAAI,GAAG,oBAAoB,CAAC;AAC/C,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,cAAc,KAAK,CAAC;AAC7D,cAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,eAAe,KAAK,CAAC;AAC/D,YAAI,OAAO,UAAU,SAAS,OAAO,WAAW,QAAQ;AACtD,iBAAO,QAAQ;AACf,iBAAO,SAAS;AAAA,QAClB;AACA,sBAAc,aAAa,OAAO,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,MACrD;AACA,YAAM,eAAe,CAAC,aAAqB;AACzC,YAAI,CAAC,UAAU,CAAC,cAAe;AAC/B,qBAAa;AACb,cAAM,QAAQ,IAAI;AAClB,cAAM,SAAS,IAAI;AACnB,sBAAc,UAAU,GAAG,GAAG,OAAO,MAAM;AAC3C,YAAI,aAAa,EAAG;AACpB,cAAM,SAAS,iBAAiB,GAAG,EAAE,iBAAiB,mBAAmB,EAAE,KAAK,KAAK;AACrF,sBAAc,cAAc,KAAK,IAAI,KAAI,OAAM,WAAW,GAAG;AAC7D,sBAAc,cAAc;AAC5B,sBAAc,YAAY;AAC1B,sBAAc,UAAU;AACxB,cAAM,YAAY,gBAAgB,IAAI,KAAK,IAAI,SAAS,MAAK,IAAI,KAAK,SAAS,SAAS,IAAG;AAC3F,iBAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,gBAAM,IAAK,SAAS,QAAQ,SAAS,KAAM;AAC3C,gBAAM,UAAU,QAAQ,KAAK,IAAK,OAAO;AACzC,gBAAM,IAAI,SAAS,OAAM,SAAS;AAClC,cAAI,UAAU,EAAG,eAAc,OAAO,GAAG,CAAC;AAAA,cACrC,eAAc,OAAO,GAAG,CAAC;AAAA,QAChC;AACA,sBAAc,OAAO;AACrB,sBAAc,cAAc;AAAA,MAC9B;AACA,YAAM,eAAe,CAAC,aAAqB;AACzC,YAAI,CAAC,UAAU,CAAC,cAAe;AAC/B,qBAAa;AACb,cAAM,QAAQ,IAAI;AAClB,cAAM,SAAS,IAAI;AACnB,sBAAc,UAAU,GAAG,GAAG,OAAO,MAAM;AAC3C,YAAI,aAAa,EAAG;AACpB,iBAAS,qBAAqB,WAAW;AACzC,cAAM,SAAS,iBAAiB,GAAG,EAAE,iBAAiB,mBAAmB,EAAE,KAAK,KAAK;AACrF,cAAM,WAAW;AACjB,cAAM,MAAM;AACZ,cAAM,WAAW,KAAK,IAAI,IAAI,QAAQ,OAAO,WAAW,MAAM,QAAQ;AACtE,sBAAc,YAAY;AAC1B,sBAAc,cAAc,gBAAgB,MAAK,KAAK,IAAI,MAAK,OAAM,WAAW,GAAG;AACnF,iBAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,gBAAM,iBAAiB,KAAK,OAAO,QAAQ,aAAa,MAAM,YAAY,SAAS,GAAE;AACrF,gBAAM,SAAS,gBAAgB,QAAO,YAAY,cAAc,KAAK,KAAK;AAC1E,gBAAM,YAAY,KAAK,IAAI,GAAG,SAAS,SAAS,IAAG;AACnD,wBAAc,SAAS,SAAS,WAAW,MAAM,SAAS,WAAW,UAAU,SAAS;AAAA,QAC1F;AACA,sBAAc,cAAc;AAAA,MAC9B;AACA,YAAM,OAAO,MAAM;AACjB,YAAI,UAAU,KAAK,OAAQ;AAC3B,iBAAS,sBAAsB,OAAO;AACtC,YAAI,MAAM;AACV,mBAAW,UAAU,SAAS;AAC5B,gBAAM,cAAc,SAAS,OAAO;AACpC,iBAAO,aAAa;AAAA,QACtB;AACA,cAAM,MAAM,KAAK,KAAK,MAAM,QAAQ,MAAM;AAC1C,cAAM,SAAS,MAAM,UAAU,MAAM,QAAO,IAAI,KAAK,IAAI,IAAI,MAAM,SAAQ,CAAC;AAC5E,aAAK,WAAW,SAAS,KAAK,WAAW,SAAS,KAAK,SAAS,MAAK;AACrE,YAAI,WAAW,KAAK,KAAK,SAAS,KAAK,MAAK,SAAS;AACrD,cAAM,WAAW,gBACb,KAAK,SAAS,KACd,KAAK,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AAC9D,YAAI,MAAM,YAAY,wBAAwB,IAAI,KAAK,gBAAgB,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,GAAG;AAC1G,YAAI,MAAM,YAAY,4BAA4B,GAAG,SAAS,QAAQ,CAAC,CAAC,GAAG;AAC3E,YAAI,MAAM,YAAY,gCAAgC,IAAI,WAAW,MAAK,QAAQ,CAAC,CAAC,GAAG;AACvF,YAAI,MAAM,YAAY,iCAAiC,IAAI,WAAW,MAAK,QAAQ,CAAC,CAAC,GAAG;AACxF,YAAI,SAAS,WAAY,cAAa,QAAQ;AAAA,iBACrC,SAAS,WAAY,cAAa,QAAQ;AACnD,aAAK,SAAS,sBAAsB,IAAI;AAAA,MAC1C;AACA,WAAK;AACL,YAAM,SAAS,MAAM,KAAK,QAAQ,OAAO;AACzC,YAAM,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;AACrD,UAAI,CAAC,MAAM,OAAQ,QAAO;AAAA,IAC5B,QAAQ;AACN,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,aAAmB;AACjB,SAAK,UAAU;AACf,QAAI,OAAO,yBAAyB,YAAa,sBAAqB,KAAK,MAAM;AACjF,SAAK,SAAS;AACd,SAAK,SAAS;AACd,QAAI;AAAE,WAAK,SAAS,WAAW;AAAA,IAAG,QAAQ;AAAA,IAA8B;AACxE,QAAI,KAAK,YAAY,KAAK,SAAS,UAAU,SAAU,MAAK,KAAK,SAAS,MAAM;AAChF,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,WAAW;AAAA,EAClB;AACF;","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
|
|
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 {
|
|
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 {
|
|
2
|
-
export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-IMQ4IJY6.js";
|
|
5
5
|
import {
|
|
6
6
|
MangoAVChaptersElement,
|
|
7
7
|
defineMangoAVChapters
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ARYOSUFI.js";
|
|
9
9
|
import "./chunk-GAVG7CPU.js";
|
|
10
10
|
import {
|
|
11
11
|
MangoAVMediaElement,
|
|
12
12
|
defineMangoAVMedia
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-RJDPI4KL.js";
|
|
14
14
|
import {
|
|
15
15
|
MangoAVPlayerElement,
|
|
16
16
|
defineMangoAVPlayer
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-ZMC36FZ2.js";
|
|
18
|
+
import "./chunk-ZRPA2VFR.js";
|
|
19
19
|
import {
|
|
20
20
|
MangoAVTranscriptElement,
|
|
21
21
|
defineMangoAVTranscript
|
|
22
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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 {
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-RJDPI4KL.js";
|
|
5
|
+
import "./chunk-ZRPA2VFR.js";
|
|
6
6
|
import "./chunk-CDLYT3KB.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
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-
|
|
2
|
-
import { J as JsonObject,
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
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();
|
package/dist/player.js.map
CHANGED
|
@@ -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":"
|
|
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-
|
|
2
|
-
import {
|
|
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-
|
|
4
|
+
} from "./chunk-DF3YH3BM.js";
|
|
5
5
|
import "./chunk-CDLYT3KB.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
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:
|