diff --git a/packages/core/src/blocks/Audio/block.ts b/packages/core/src/blocks/Audio/block.ts index f271fcb16a..4d771ca837 100644 --- a/packages/core/src/blocks/Audio/block.ts +++ b/packages/core/src/blocks/Audio/block.ts @@ -15,7 +15,27 @@ export const FILE_AUDIO_ICON_SVG = ''; export interface AudioOptions { + /** + * The icon to use for the audio block. As an HTML string. + */ icon?: string; + /** + * Allows overriding the default audio element rendering. + */ + render?: (ctx: { + /** + * The default audio element which you can modify. + */ + element: HTMLAudioElement; + /** + * The block being rendered. + */ + block: BlockFromConfig; + /** + * The editor instance. + */ + editor: BlockNoteEditor<{ audio: AudioBlockConfig }, any, any>; + }) => HTMLAudioElement; } export type AudioBlockConfig = ReturnType; @@ -110,10 +130,16 @@ export const audioRender = audio.contentEditable = "false"; audio.draggable = false; + const audioElement = config.render?.({ + element: audio, + block, + editor, + }); + return createFileBlockWrapper( block, editor, - { dom: audio }, + { dom: audioElement ?? audio }, icon.firstElementChild as HTMLElement, ); }; diff --git a/packages/core/src/blocks/Video/block.ts b/packages/core/src/blocks/Video/block.ts index 026b333ba5..87e300e388 100644 --- a/packages/core/src/blocks/Video/block.ts +++ b/packages/core/src/blocks/Video/block.ts @@ -1,4 +1,9 @@ -import { createBlockConfig, createBlockSpec } from "../../schema/index.js"; +import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js"; +import { + BlockFromConfig, + createBlockConfig, + createBlockSpec, +} from "../../schema/index.js"; import { defaultProps, parseDefaultProps } from "../defaultProps.js"; import { parseFigureElement } from "../File/helpers/parse/parseFigureElement.js"; import { createResizableFileBlockWrapper } from "../File/helpers/render/createResizableFileBlockWrapper.js"; @@ -10,7 +15,27 @@ export const FILE_VIDEO_ICON_SVG = ''; export interface VideoOptions { + /** + * The icon to use for the video block. As an HTML string. + */ icon?: string; + /** + * Allows overriding the default video element rendering. + */ + render?: (ctx: { + /** + * The default video element which you can modify. + */ + element: HTMLVideoElement; + /** + * The block being rendered. + */ + block: BlockFromConfig; + /** + * The editor instance. + */ + editor: BlockNoteEditor<{ video: VideoBlockConfig }, any, any>; + }) => HTMLVideoElement; } export type VideoBlockConfig = ReturnType; @@ -93,7 +118,12 @@ export const createVideoBlockSpec = createBlockSpec( video.contentEditable = "false"; video.draggable = false; video.width = block.props.previewWidth; - videoWrapper.appendChild(video); + const videoElement = config.render?.({ + element: video, + block, + editor, + }); + videoWrapper.appendChild(videoElement ?? video); return createResizableFileBlockWrapper( block,