Skip to content

Commit 66a1689

Browse files
authored
Merge pull request #39 from LibreSign/feat/a11y
feat: a11y
2 parents 1f867a6 + 60f6f50 commit 66a1689

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@libresign/pdf-elements",
33
"description": "PDF viewer with draggable and resizable element overlays for Vue 3",
4-
"version": "1.0.2",
4+
"version": "1.1.0",
55
"author": "LibreCode <contact@librecode.coop>",
66
"private": false,
77
"main": "dist/index.js",

src/components/PDFElements.vue

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)