@@ -23,14 +23,19 @@ SPDX-License-Identifier: AGPL-3.0-or-later
2323 />
2424 <div
2525 class =" overlay"
26+ :role =" isAddingMode ? 'button' : undefined"
27+ :tabindex =" isAddingMode ? 0 : -1"
28+ :aria-label =" getOverlayAriaLabel(docIndex, pIndex)"
2629 @mousemove =" handleMouseMove"
2730 @touchmove =" handleMouseMove"
2831 @click =" handleOverlayClick(docIndex, pIndex, $event)"
2932 @touchend =" handleOverlayClick(docIndex, pIndex, $event)"
33+ @keydown =" handleOverlayKeyDown(docIndex, pIndex, $event)"
3034 >
3135 <div
3236 v-if =" isAddingMode && previewPageDocIndex === docIndex && previewPageIndex === pIndex && previewElement && previewVisible"
3337 class =" preview-element"
38+ aria-hidden =" true"
3439 :style =" {
3540 left: `${previewPosition.x * previewScale.x}px`,
3641 top: `${previewPosition.y * previewScale.y}px`,
@@ -217,6 +222,10 @@ export default defineComponent({
217222 type: Boolean ,
218223 default: false ,
219224 },
225+ pageAriaLabel: {
226+ type: Function as PropType <(info : { docIndex: number ; docName: string ; totalDocs: number ; pageNumber: number ; totalPages: number ; isAddingMode: boolean }) => string >,
227+ default: null ,
228+ },
220229 pdfjsOptions: {
221230 type: Object as PropType <Record <string , unknown >>,
222231 default : () => ({}),
@@ -730,6 +739,42 @@ export default defineComponent({
730739 }
731740 },
732741
742+ getOverlayAriaLabel(docIndex , pageIndex ) {
743+ const doc = this .pdfDocuments ?.[docIndex ]
744+ const docName = doc ?.name ?? ` Document ${docIndex + 1 } `
745+ const totalDocs = this .pdfDocuments ?.length ?? 1
746+ const totalPages = doc ?.numPages ?? 0
747+ const pageNumber = pageIndex + 1
748+ if (this .pageAriaLabel ) {
749+ return this .pageAriaLabel ({ docIndex , docName , totalDocs , pageNumber , totalPages , isAddingMode: this .isAddingMode })
750+ }
751+ const docPrefix = totalDocs > 1 ? ` Document ${docIndex + 1 } of ${totalDocs } (${docName }), ` : ' '
752+ if (this .isAddingMode ) {
753+ return ` ${docPrefix }Page ${pageNumber } of ${totalPages }. Press Enter or Space to place here. `
754+ }
755+ return ` ${docPrefix }Page ${pageNumber } of ${totalPages }. `
756+ },
757+
758+ handleOverlayKeyDown(docIndex , pageIndex , event ) {
759+ if (! this .isAddingMode || ! this .previewElement ) return
760+ if (event .key !== ' Enter' && event .key !== ' ' ) return
761+ event .preventDefault ()
762+
763+ const pageWidth = this .getPageWidth (docIndex , pageIndex )
764+ const pageHeight = this .getPageHeight (docIndex , pageIndex )
765+ const scale = this .getDisplayedPageScale (docIndex , pageIndex ) || 1
766+
767+ this .previewPageDocIndex = docIndex
768+ this .previewPageIndex = pageIndex
769+ this .previewScale = { x: scale , y: scale }
770+ this .previewPosition = {
771+ x: Math .round ((pageWidth - this .previewElement .width ) / 2 ),
772+ y: Math .round ((pageHeight - this .previewElement .height ) / 2 ),
773+ }
774+ this .previewVisible = true
775+ this .finishAdding ()
776+ },
777+
733778 handleWheel(event ) {
734779 if (! event .ctrlKey ) return
735780 event .preventDefault ()
0 commit comments