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 ( {props.block.props.caption @@ -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`] = `"

Heading 2

Paragraph

list item

Example

Caption

Example

Caption

"`; +exports[`Test ServerBlockNoteEditor > converts to HTML (blocksToFullHTML) 1`] = `"

Heading 2

Paragraph

list item

Example
Caption

Example

Caption
"`; exports[`Test ServerBlockNoteEditor > converts to and from HTML (blocksToHTMLLossy) 1`] = `"

Heading 2

Paragraph

  • list item

Example
Caption
Example

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 @@ BlockNote image \ 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

BlockNote image 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="" > -
+
@@ -19,8 +19,8 @@

-

Caption

-
+
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 @@ BlockNote image 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="" > -
@@ -19,8 +19,8 @@
-

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 +
-

Caption

-
+
Caption
+
@@ -32,17 +32,17 @@ data-preview-width="256" data-file-block="" > -
- Caption +
-

Caption

-
+
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 +
-

Caption

-
+
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;" >
- BlockNote image +
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="" > -
@@ -23,8 +23,8 @@
-

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="" > -
@@ -24,8 +24,8 @@
-

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 @@ BlockNote image \ 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
- 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 +
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 @@ -BlockNote image \ 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 @@ -![BlockNote image](https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png) +![](https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png) 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 @@ -![BlockNote image](exampleURL) +![](exampleURL) 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="" > -
+
@@ -19,8 +19,8 @@

-

Caption

-
+
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="" > -
@@ -19,8 +19,8 @@
-

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="" > -
@@ -19,8 +19,8 @@
-

Caption

- +
Caption
+
@@ -34,7 +34,7 @@ data-preview-width="256" data-file-block="" > -
@@ -43,8 +43,8 @@
-

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 +
-

Caption

-
+
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 +
Caption
\ No newline at end of file