diff --git a/packages/core/src/blocks/File/helpers/render/createFileBlockWrapper.ts b/packages/core/src/blocks/File/helpers/render/createFileBlockWrapper.ts
index cbb347acff..51de658d2c 100644
--- a/packages/core/src/blocks/File/helpers/render/createFileBlockWrapper.ts
+++ b/packages/core/src/blocks/File/helpers/render/createFileBlockWrapper.ts
@@ -26,7 +26,12 @@ export const createFileBlockWrapper = (
element?: { dom: HTMLElement; destroy?: () => void },
buttonIcon?: HTMLElement,
) => {
- const wrapper = document.createElement("div");
+ // Use a / when the block has a caption, so the caption
+ // is semantically associated with its content for assistive tech. Falls back
+ // to a plain when there is no caption (or the file has not been
+ // uploaded yet, since the upload UI never shows the caption).
+ const useFigure = block.props.url !== "" && !!block.props.caption;
+ const wrapper = document.createElement(useFigure ? "figure" : "div");
wrapper.className = "bn-file-block-content-wrapper";
// Show the add file button if the file has not been uploaded yet. Change to
@@ -73,7 +78,7 @@ export const createFileBlockWrapper = (
// Show the caption if there is one.
if (block.props.caption) {
- const caption = document.createElement("p");
+ const caption = document.createElement("figcaption");
caption.className = "bn-file-caption";
caption.textContent = block.props.caption;
wrapper.appendChild(caption);
diff --git a/packages/core/src/blocks/Image/block.ts b/packages/core/src/blocks/Image/block.ts
index 503c483527..9de973bb49 100644
--- a/packages/core/src/blocks/Image/block.ts
+++ b/packages/core/src/blocks/Image/block.ts
@@ -116,7 +116,10 @@ export const imageRender =
image.src = block.props.url;
}
- image.alt = block.props.name || block.props.caption || "BlockNote image";
+ // alt describes image content (per WCAG H86); figcaption (when present)
+ // is the contextual caption. Fall back to "" so unlabelled images are
+ // marked decorative rather than getting a noisy generic fallback.
+ image.alt = block.props.name || "";
image.contentEditable = "false";
image.draggable = false;
imageWrapper.appendChild(image);
@@ -150,7 +153,7 @@ export const imageToExternalHTML =
if (block.props.showPreview) {
image = document.createElement("img");
image.src = block.props.url;
- image.alt = block.props.name || block.props.caption || "BlockNote image";
+ image.alt = block.props.name || "";
if (block.props.previewWidth) {
image.width = block.props.previewWidth;
}
diff --git a/packages/core/src/editor/Block.css b/packages/core/src/editor/Block.css
index bba397ee58..990a856504 100644
--- a/packages/core/src/editor/Block.css
+++ b/packages/core/src/editor/Block.css
@@ -468,6 +468,9 @@ NESTED BLOCKS
cursor: pointer;
display: flex;
flex-direction: column;
+ /* Reset default
browser margins (the wrapper becomes a
+ when the block has a caption). */
+ margin: 0;
user-select: none;
}
diff --git a/packages/react/src/blocks/File/helpers/render/FileBlockWrapper.tsx b/packages/react/src/blocks/File/helpers/render/FileBlockWrapper.tsx
index 6499b40ca0..f277db693f 100644
--- a/packages/react/src/blocks/File/helpers/render/FileBlockWrapper.tsx
+++ b/packages/react/src/blocks/File/helpers/render/FileBlockWrapper.tsx
@@ -29,8 +29,14 @@ export const FileBlockWrapper = (
) => {
const showLoader = useUploadLoading(props.block.id);
+ // Use a / when the block has a caption, so the caption
+ // is semantically associated with its content for assistive tech.
+ const useFigure =
+ props.block.props.url !== "" && !!props.block.props.caption && !showLoader;
+ const Wrapper = useFigure ? "figure" : "div";
+
return (
- {props.block.props.caption}
+
+ {props.block.props.caption}
+
)}
>
)}
-
+
);
};
diff --git a/packages/react/src/blocks/Image/block.tsx b/packages/react/src/blocks/Image/block.tsx
index 92de17d8cc..be682b47c2 100644
--- a/packages/react/src/blocks/Image/block.tsx
+++ b/packages/react/src/blocks/Image/block.tsx
@@ -18,6 +18,11 @@ export const ImagePreview = (
) => {
const resolved = useResolveUrl(props.block.props.url!);
+ // alt describes image content (per WCAG H86); figcaption (when present)
+ // is the contextual caption. Fall back to "" so unlabelled images are
+ // marked decorative rather than getting a noisy generic fallback.
+ const alt = props.block.props.name || "";
+
return (
@@ -43,12 +48,11 @@ export const ImageToExternalHTML = (
return Add image
;
}
+ const alt = props.block.props.name || "";
const image = props.block.props.showPreview ? (
) : (
diff --git a/packages/server-util/src/context/__snapshots__/ServerBlockNoteEditor.test.ts.snap b/packages/server-util/src/context/__snapshots__/ServerBlockNoteEditor.test.ts.snap
index 6600cd0ead..777d7a773f 100644
--- a/packages/server-util/src/context/__snapshots__/ServerBlockNoteEditor.test.ts.snap
+++ b/packages/server-util/src/context/__snapshots__/ServerBlockNoteEditor.test.ts.snap
@@ -1,6 +1,6 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`Test ServerBlockNoteEditor > converts to HTML (blocksToFullHTML) 1`] = `""`;
+exports[`Test ServerBlockNoteEditor > converts to HTML (blocksToFullHTML) 1`] = `""`;
exports[`Test ServerBlockNoteEditor > converts to and from HTML (blocksToHTMLLossy) 1`] = `"Heading 2 Paragraph
Caption "`;
diff --git a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/image.html b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/image.html
index 8b48774f5b..dbeb38ec30 100644
--- a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/image.html
+++ b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/image.html
@@ -1,5 +1,5 @@
\ No newline at end of file
diff --git a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/nestedImage.html b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/nestedImage.html
index ece8708071..45b2830cd7 100644
--- a/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/nestedImage.html
+++ b/tests/src/unit/core/clipboard/copy/__snapshots__/text/html/nestedImage.html
@@ -1,7 +1,7 @@
Paragraph 1
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/basic.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/basic.html
index 9974d8d975..d7802da3e3 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/basic.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/basic.html
@@ -9,7 +9,7 @@
data-caption="Caption"
data-file-block=""
>
-
+
@@ -20,8 +20,8 @@
example
- Caption
-
+ Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/nested.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/nested.html
index 6553a5c4a8..c62486d27d 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/nested.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/nested.html
@@ -9,7 +9,7 @@
data-caption="Caption"
data-file-block=""
>
-
+
@@ -20,8 +20,8 @@
example
- Caption
-
+ Caption
+
@@ -34,7 +34,7 @@
data-caption="Caption"
data-file-block=""
>
-
+
@@ -45,8 +45,8 @@
example
- Caption
-
+
Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/noName.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/noName.html
index 47ae5b3bf9..1ec20af747 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/noName.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/file/noName.html
@@ -8,7 +8,7 @@
data-caption="Caption"
data-file-block=""
>
-
+ Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image.html
index cf93dca684..a17b1d3982 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image.html
@@ -15,7 +15,7 @@
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/basic.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/basic.html
index 5c7411f3ed..55c9555506 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/basic.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/basic.html
@@ -10,7 +10,7 @@
data-preview-width="256"
data-file-block=""
>
-
- Caption
-
+ Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/nested.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/nested.html
index 7eac772896..a5b2647bec 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/nested.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/nested.html
@@ -9,17 +9,17 @@
data-preview-width="256"
data-file-block=""
>
-
+ Caption
+
@@ -32,17 +32,17 @@
data-preview-width="256"
data-file-block=""
>
-
+
Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noName.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noName.html
index 315d8db293..7032fc34e8 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noName.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noName.html
@@ -9,17 +9,17 @@
data-preview-width="256"
data-file-block=""
>
-
+ Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noPreview.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noPreview.html
index 3e1f5a6264..59d65f82ae 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noPreview.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/noPreview.html
@@ -11,7 +11,7 @@
data-preview-width="256"
data-file-block=""
>
-
+
@@ -22,8 +22,8 @@
example
- Caption
-
+ Caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/urlOnly.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/urlOnly.html
index f529f9e2bb..6940729386 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/urlOnly.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/urlOnly.html
@@ -12,12 +12,7 @@
style="position: relative; width: fit-content;"
>
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/withCaption.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/withCaption.html
index bca753588e..5844c98607 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/withCaption.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/image/withCaption.html
@@ -9,7 +9,7 @@
data-caption="This is a caption"
data-file-block=""
>
-
- This is a caption
-
+ This is a caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/video/withCaption.html b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/video/withCaption.html
index 9de3da2aca..b85963a4e8 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/video/withCaption.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/blocknoteHTML/video/withCaption.html
@@ -9,7 +9,7 @@
data-caption="Video caption"
data-file-block=""
>
-
- Video caption
-
+ Video caption
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image.html b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image.html
index ef7342fe92..a9efaefefc 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image.html
@@ -1,5 +1,5 @@
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/nested.html b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/nested.html
index 04ccf17c56..667cef41ab 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/nested.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/nested.html
@@ -1,5 +1,5 @@
-
+
Caption
-
+
Caption
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/noName.html b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/noName.html
index 686fc7d4e5..47f0cbe255 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/noName.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/noName.html
@@ -1,4 +1,4 @@
-
+
Caption
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/urlOnly.html b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/urlOnly.html
index 80685a3c89..41960a99f8 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/urlOnly.html
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/html/image/urlOnly.html
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image.md b/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image.md
index 3219bb9f00..58d07ff1a4 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image.md
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image.md
@@ -1 +1 @@
-
+
diff --git a/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image/urlOnly.md b/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image/urlOnly.md
index dcf874d74c..f667f8e031 100644
--- a/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image/urlOnly.md
+++ b/tests/src/unit/core/formatConversion/export/__snapshots__/markdown/image/urlOnly.md
@@ -1 +1 @@
-
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/basic.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/basic.html
index 9974d8d975..d7802da3e3 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/basic.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/basic.html
@@ -9,7 +9,7 @@
data-caption="Caption"
data-file-block=""
>
-
+
@@ -20,8 +20,8 @@
example
- Caption
-
+ Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/nested.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/nested.html
index 6553a5c4a8..c62486d27d 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/nested.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/nested.html
@@ -9,7 +9,7 @@
data-caption="Caption"
data-file-block=""
>
-
+
@@ -20,8 +20,8 @@
example
- Caption
-
+ Caption
+
@@ -34,7 +34,7 @@
data-caption="Caption"
data-file-block=""
>
-
+
@@ -45,8 +45,8 @@
example
- Caption
-
+
Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/noName.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/noName.html
index 47ae5b3bf9..1ec20af747 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/noName.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactFile/noName.html
@@ -8,7 +8,7 @@
data-caption="Caption"
data-file-block=""
>
-
+ Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/basic.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/basic.html
index 5c7411f3ed..55c9555506 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/basic.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/basic.html
@@ -10,7 +10,7 @@
data-preview-width="256"
data-file-block=""
>
-
- Caption
-
+ Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/nested.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/nested.html
index 3a0d0d50b0..a6296f823b 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/nested.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/nested.html
@@ -10,7 +10,7 @@
data-preview-width="256"
data-file-block=""
>
-
- Caption
-
+ Caption
+
@@ -34,7 +34,7 @@
data-preview-width="256"
data-file-block=""
>
-
-
Caption
-
+
Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noName.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noName.html
index 315d8db293..7032fc34e8 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noName.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noName.html
@@ -9,17 +9,17 @@
data-preview-width="256"
data-file-block=""
>
-
+ Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noPreview.html b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noPreview.html
index 3e1f5a6264..59d65f82ae 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noPreview.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/blocknoteHTML/reactImage/noPreview.html
@@ -11,7 +11,7 @@
data-preview-width="256"
data-file-block=""
>
-
+
@@ -22,8 +22,8 @@
example
- Caption
-
+ Caption
+
diff --git a/tests/src/unit/react/formatConversion/export/__snapshots__/html/reactImage/noName.html b/tests/src/unit/react/formatConversion/export/__snapshots__/html/reactImage/noName.html
index 686fc7d4e5..47f0cbe255 100644
--- a/tests/src/unit/react/formatConversion/export/__snapshots__/html/reactImage/noName.html
+++ b/tests/src/unit/react/formatConversion/export/__snapshots__/html/reactImage/noName.html
@@ -1,4 +1,4 @@
-
+
Caption
\ No newline at end of file