import { html } from "lit";
import { msg } from "@lit/localize";
import type { BuilderComponent } from "../../types/BuilderComponent";
const PLACEHOLDER_AUDIO =
"https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3";
export const AudioComponent: BuilderComponent = {
type: "audio",
label: () => msg("Audio"),
group: "media",
defaultData: {
src: PLACEHOLDER_AUDIO,
},
render(data) {
const src = data?.src || PLACEHOLDER_AUDIO;
return html`
`;
},
// Generic sidebar field
bindings: () => [
{
key: "src",
label: msg("Audio URL"),
kind: "attr",
target: "audio",
name: "src",
placeholder: `https://… ${msg("or")} data:audio/…`,
},
],
// Upload + reset grouped consistently with other media components
settings: ({ setData }) => {
const onFileChange = (e: Event) => {
const input = e.currentTarget as HTMLInputElement;
const file = input.files?.[0];
if (!file) return;
if (!file.type.startsWith("audio/")) return;
const reader = new FileReader();
reader.onload = () =>
setData({ src: String(reader.result ?? PLACEHOLDER_AUDIO) });
reader.readAsDataURL(file);
input.value = "";
};
const resetToPlaceholder = () => setData({ src: PLACEHOLDER_AUDIO });
return html`
`;
},
};