This commit is contained in:
Aditya kumar singh 2025-09-15 16:28:31 +05:30
commit bd2ce9c248
33 changed files with 1769 additions and 925 deletions

View File

@ -71,6 +71,10 @@
"type": "string", "type": "string",
"default": "" "default": ""
}, },
"commentLearnMoreUrl": {
"type": "string",
"default": ""
},
"enableSignatureEditor": { "enableSignatureEditor": {
"type": "boolean", "type": "boolean",
"default": false "default": false

View File

@ -2340,7 +2340,7 @@ function packageJson() {
bugs: DIST_BUGS_URL, bugs: DIST_BUGS_URL,
license: DIST_LICENSE, license: DIST_LICENSE,
optionalDependencies: { optionalDependencies: {
"@napi-rs/canvas": "^0.1.78", "@napi-rs/canvas": "^0.1.80",
}, },
browser: { browser: {
canvas: false, canvas: false,

View File

@ -264,3 +264,15 @@ pdfjs-editor-free-text-size-input = Mida
pdfjs-editor-ink-color-input = Color pdfjs-editor-ink-color-input = Color
pdfjs-editor-ink-thickness-input = Gruix pdfjs-editor-ink-thickness-input = Gruix
pdfjs-editor-ink-opacity-input = Opacitat pdfjs-editor-ink-opacity-input = Opacitat
## Alt-text dialog
pdfjs-editor-alt-text-cancel-button = Cancel·la
## Dialog buttons
pdfjs-editor-add-signature-cancel-button = Cancel·la
## Edit a comment dialog
pdfjs-editor-edit-comment-manager-cancel-button = Cancel·la

View File

@ -414,7 +414,8 @@ pdfjs-editor-comments-sidebar-close-button =
pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar
# Instructional copy to add a comment by selecting text or an annotations. # Instructional copy to add a comment by selecting text or an annotations.
pdfjs-editor-comments-sidebar-no-comments = Add a comment by selecting text or an annotation. pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.
pdfjs-editor-comments-sidebar-no-comments-link = Learn more
## Alt-text dialog ## Alt-text dialog
@ -670,21 +671,28 @@ pdfjs-editor-edit-signature-dialog-title = Edit description
pdfjs-editor-edit-signature-update-button = Update pdfjs-editor-edit-signature-update-button = Update
## Comment popup
pdfjs-editor-edit-comment-popup-button-label = Edit comment
pdfjs-editor-edit-comment-popup-button =
.title = Edit comment
pdfjs-editor-delete-comment-popup-button-label = Remove comment
pdfjs-editor-delete-comment-popup-button =
.title = Remove comment
## Edit a comment dialog ## Edit a comment dialog
pdfjs-editor-edit-comment-actions-button-label = Actions # An existing comment is edited
pdfjs-editor-edit-comment-actions-button = pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment
.title = Actions
pdfjs-editor-edit-comment-close-button-label = Close
pdfjs-editor-edit-comment-close-button =
.title = Close
pdfjs-editor-edit-comment-actions-edit-button-label = Edit
pdfjs-editor-edit-comment-actions-delete-button-label = Delete
pdfjs-editor-edit-comment-manager-text-input =
.placeholder = Enter your comment
pdfjs-editor-edit-comment-manager-cancel-button = Cancel # No existing comment
pdfjs-editor-edit-comment-manager-save-button = Save pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment
pdfjs-editor-edit-comment-dialog-text-input =
.placeholder = Start typing…
pdfjs-editor-edit-comment-dialog-cancel-button = Cancel
pdfjs-editor-edit-comment-dialog-save-button = Save
## Edit a comment button in the editor toolbar ## Edit a comment button in the editor toolbar

View File

@ -568,6 +568,11 @@ pdfjs-editor-add-signature-cancel-button = Cancelar
pdfjs-editor-add-signature-add-button = Añadir pdfjs-editor-add-signature-add-button = Añadir
pdfjs-editor-edit-signature-update-button = Actualizar pdfjs-editor-edit-signature-update-button = Actualizar
## Edit a comment dialog
pdfjs-editor-edit-comment-manager-cancel-button = Cancelar
pdfjs-editor-edit-comment-manager-save-button = Guardar
## Main menu for adding/removing signatures ## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 = pdfjs-editor-delete-signature-button1 =

View File

@ -286,9 +286,13 @@ pdfjs-web-fonts-disabled = Webeko letra-tipoak desgaituta daude: ezin dira kapsu
pdfjs-editor-free-text-button = pdfjs-editor-free-text-button =
.title = Testua .title = Testua
pdfjs-editor-color-picker-free-text-input =
.title = Aldatu testuaren kolorea
pdfjs-editor-free-text-button-label = Testua pdfjs-editor-free-text-button-label = Testua
pdfjs-editor-ink-button = pdfjs-editor-ink-button =
.title = Marrazkia .title = Marrazkia
pdfjs-editor-color-picker-ink-input =
.title = Aldatu marrazteko kolorea
pdfjs-editor-ink-button-label = Marrazkia pdfjs-editor-ink-button-label = Marrazkia
pdfjs-editor-stamp-button = pdfjs-editor-stamp-button =
.title = Gehitu edo editatu irudiak .title = Gehitu edo editatu irudiak
@ -300,6 +304,10 @@ pdfjs-highlight-floating-button1 =
.title = Nabarmendu .title = Nabarmendu
.aria-label = Nabarmendu .aria-label = Nabarmendu
pdfjs-highlight-floating-button-label = Nabarmendu pdfjs-highlight-floating-button-label = Nabarmendu
pdfjs-comment-floating-button =
.title = Iruzkina
.aria-label = Iruzkina
pdfjs-comment-floating-button-label = Iruzkina
pdfjs-editor-signature-button = pdfjs-editor-signature-button =
.title = Gehitu sinadura .title = Gehitu sinadura
pdfjs-editor-signature-button-label = Gehitu sinadura pdfjs-editor-signature-button-label = Gehitu sinadura
@ -492,6 +500,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi testu alterna
pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu. pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu.
pdfjs-editor-alt-text-settings-close-button = Itxi pdfjs-editor-alt-text-settings-close-button = Itxi
## Accessibility labels (announced by screen readers) for objects added to the editor.
pdfjs-editor-highlight-added-alert = Nabarmentzea gehituta
pdfjs-editor-freetext-added-alert = Testua gehituta
pdfjs-editor-ink-added-alert = Marrazkia gehituta
pdfjs-editor-stamp-added-alert = Irudia gehituta
pdfjs-editor-signature-added-alert = Sinadura gehituta
## "Annotations removed" bar ## "Annotations removed" bar
pdfjs-editor-undo-bar-message-highlight = Nabarmentzea kenduta pdfjs-editor-undo-bar-message-highlight = Nabarmentzea kenduta
@ -564,6 +580,8 @@ pdfjs-editor-add-signature-save-checkbox = Gorde sinadura
pdfjs-editor-add-signature-save-warning-message = Gordetako sinadura kopuruaren mugara heldu zara (5). Gehiago gorde ahal izateko, ken ezazu bat. pdfjs-editor-add-signature-save-warning-message = Gordetako sinadura kopuruaren mugara heldu zara (5). Gehiago gorde ahal izateko, ken ezazu bat.
pdfjs-editor-add-signature-image-upload-error-title = Ezin da irudia igo pdfjs-editor-add-signature-image-upload-error-title = Ezin da irudia igo
pdfjs-editor-add-signature-image-upload-error-description = Egiaztatu zure sareko konexioa edo saiatu beste irudi batekin. pdfjs-editor-add-signature-image-upload-error-description = Egiaztatu zure sareko konexioa edo saiatu beste irudi batekin.
pdfjs-editor-add-signature-image-no-data-error-title = Ezin da irudia sinaduran bihurtu
pdfjs-editor-add-signature-image-no-data-error-description = Saiatu beste irudi bat igotzen.
pdfjs-editor-add-signature-error-close-button = Itxi pdfjs-editor-add-signature-error-close-button = Itxi
## Dialog buttons ## Dialog buttons
@ -572,6 +590,26 @@ pdfjs-editor-add-signature-cancel-button = Utzi
pdfjs-editor-add-signature-add-button = Gehitu pdfjs-editor-add-signature-add-button = Gehitu
pdfjs-editor-edit-signature-update-button = Eguneratu pdfjs-editor-edit-signature-update-button = Eguneratu
## Edit a comment dialog
pdfjs-editor-edit-comment-actions-button-label = Ekintzak
pdfjs-editor-edit-comment-actions-button =
.title = Ekintzak
pdfjs-editor-edit-comment-close-button-label = Itxi
pdfjs-editor-edit-comment-close-button =
.title = Itxi
pdfjs-editor-edit-comment-actions-edit-button-label = Editatu
pdfjs-editor-edit-comment-actions-delete-button-label = Ezabatu
pdfjs-editor-edit-comment-manager-text-input =
.placeholder = Idatzi zure iruzkina
pdfjs-editor-edit-comment-manager-cancel-button = Utzi
pdfjs-editor-edit-comment-manager-save-button = Gorde
## Edit a comment button in the editor toolbar
pdfjs-editor-edit-comment-button =
.title = Editatu iruzkina
## Main menu for adding/removing signatures ## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 = pdfjs-editor-delete-signature-button1 =

View File

@ -278,9 +278,13 @@ pdfjs-web-fonts-disabled = Font web dinonaktifkan: tidak dapat menggunakan font
pdfjs-editor-free-text-button = pdfjs-editor-free-text-button =
.title = Teks .title = Teks
pdfjs-editor-color-picker-free-text-input =
.title = Ubah warna teks
pdfjs-editor-free-text-button-label = Teks pdfjs-editor-free-text-button-label = Teks
pdfjs-editor-ink-button = pdfjs-editor-ink-button =
.title = Gambar .title = Gambar
pdfjs-editor-color-picker-ink-input =
.title = Ubah warna gambar
pdfjs-editor-ink-button-label = Gambar pdfjs-editor-ink-button-label = Gambar
pdfjs-editor-stamp-button = pdfjs-editor-stamp-button =
.title = Tambah atau edit gambar .title = Tambah atau edit gambar
@ -292,6 +296,10 @@ pdfjs-highlight-floating-button1 =
.title = Sorot .title = Sorot
.aria-label = Sorot .aria-label = Sorot
pdfjs-highlight-floating-button-label = Sorot pdfjs-highlight-floating-button-label = Sorot
pdfjs-comment-floating-button =
.title = Komentar
.aria-label = Komentar
pdfjs-comment-floating-button-label = Komentar
pdfjs-editor-signature-button = pdfjs-editor-signature-button =
.title = Tambahkan tanda tangan .title = Tambahkan tanda tangan
pdfjs-editor-signature-button-label = Tambahkan tanda tangan pdfjs-editor-signature-button-label = Tambahkan tanda tangan
@ -484,6 +492,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Tampilkan editor teks
pdfjs-editor-alt-text-settings-show-dialog-description = Membantu Anda memastikan semua gambar Anda memiliki teks alternatif. pdfjs-editor-alt-text-settings-show-dialog-description = Membantu Anda memastikan semua gambar Anda memiliki teks alternatif.
pdfjs-editor-alt-text-settings-close-button = Tutup pdfjs-editor-alt-text-settings-close-button = Tutup
## Accessibility labels (announced by screen readers) for objects added to the editor.
pdfjs-editor-highlight-added-alert = Sorotan ditambahkan
pdfjs-editor-freetext-added-alert = Teks ditambahkan
pdfjs-editor-ink-added-alert = Gambar ditambahkan
pdfjs-editor-stamp-added-alert = Citra ditambahkan
pdfjs-editor-signature-added-alert = Tanda tangan ditambahkan
## "Annotations removed" bar ## "Annotations removed" bar
pdfjs-editor-undo-bar-message-highlight = Sorotan dihapus pdfjs-editor-undo-bar-message-highlight = Sorotan dihapus
@ -548,6 +564,8 @@ pdfjs-editor-add-signature-save-checkbox = Simpan tanda tangan
pdfjs-editor-add-signature-save-warning-message = Anda telah mencapai batas 5 tanda tangan tersimpan. Hapus untuk menyimpan lebih banyak. pdfjs-editor-add-signature-save-warning-message = Anda telah mencapai batas 5 tanda tangan tersimpan. Hapus untuk menyimpan lebih banyak.
pdfjs-editor-add-signature-image-upload-error-title = Tidak dapat mengunggah gambar pdfjs-editor-add-signature-image-upload-error-title = Tidak dapat mengunggah gambar
pdfjs-editor-add-signature-image-upload-error-description = Periksa sambungan jaringan Anda atau coba gambar lain. pdfjs-editor-add-signature-image-upload-error-description = Periksa sambungan jaringan Anda atau coba gambar lain.
pdfjs-editor-add-signature-image-no-data-error-title = Tak bisa mengonversi citra ini menjadi tanda tangan
pdfjs-editor-add-signature-image-no-data-error-description = Coba unggah gambar lain.
pdfjs-editor-add-signature-error-close-button = Tutup pdfjs-editor-add-signature-error-close-button = Tutup
## Dialog buttons ## Dialog buttons
@ -556,6 +574,26 @@ pdfjs-editor-add-signature-cancel-button = Batal
pdfjs-editor-add-signature-add-button = Tambah pdfjs-editor-add-signature-add-button = Tambah
pdfjs-editor-edit-signature-update-button = Perbarui pdfjs-editor-edit-signature-update-button = Perbarui
## Edit a comment dialog
pdfjs-editor-edit-comment-actions-button-label = Aksi
pdfjs-editor-edit-comment-actions-button =
.title = Aksi
pdfjs-editor-edit-comment-close-button-label = Tutup
pdfjs-editor-edit-comment-close-button =
.title = Tutup
pdfjs-editor-edit-comment-actions-edit-button-label = Sunting
pdfjs-editor-edit-comment-actions-delete-button-label = Hapus
pdfjs-editor-edit-comment-manager-text-input =
.placeholder = Masukkan komentar Anda
pdfjs-editor-edit-comment-manager-cancel-button = Batal
pdfjs-editor-edit-comment-manager-save-button = Simpan
## Edit a comment button in the editor toolbar
pdfjs-editor-edit-comment-button =
.title = Sunting komentar
## Main menu for adding/removing signatures ## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 = pdfjs-editor-delete-signature-button1 =

View File

@ -474,6 +474,11 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Sýna alt-myndatextari
pdfjs-editor-alt-text-settings-show-dialog-description = Hjálpar þér að tryggja að allar myndirnar þínar séu með alt-myndatexta. pdfjs-editor-alt-text-settings-show-dialog-description = Hjálpar þér að tryggja að allar myndirnar þínar séu með alt-myndatexta.
pdfjs-editor-alt-text-settings-close-button = Loka pdfjs-editor-alt-text-settings-close-button = Loka
## Accessibility labels (announced by screen readers) for objects added to the editor.
pdfjs-editor-stamp-added-alert = Mynd bætt við
pdfjs-editor-signature-added-alert = Undirritun bætt við
## "Annotations removed" bar ## "Annotations removed" bar
pdfjs-editor-undo-bar-message-highlight = Áherslulitun fjarlægð pdfjs-editor-undo-bar-message-highlight = Áherslulitun fjarlægð
@ -542,6 +547,8 @@ pdfjs-editor-add-signature-save-checkbox = Vista undirskrift
pdfjs-editor-add-signature-save-warning-message = Þú hefur náð hámarki 5 vistaðra undirskrifta. Fjarlægðu eina til að geta vistað fleiri. pdfjs-editor-add-signature-save-warning-message = Þú hefur náð hámarki 5 vistaðra undirskrifta. Fjarlægðu eina til að geta vistað fleiri.
pdfjs-editor-add-signature-image-upload-error-title = Ekki tókst að senda inn mynd pdfjs-editor-add-signature-image-upload-error-title = Ekki tókst að senda inn mynd
pdfjs-editor-add-signature-image-upload-error-description = Athugaðu nettenginguna þína eða prófaðu aðra mynd. pdfjs-editor-add-signature-image-upload-error-description = Athugaðu nettenginguna þína eða prófaðu aðra mynd.
pdfjs-editor-add-signature-image-no-data-error-title = Get ekki breytt þessari mynd í undirskrift
pdfjs-editor-add-signature-image-no-data-error-description = Reyndu að senda inn aðra mynd.
pdfjs-editor-add-signature-error-close-button = Loka pdfjs-editor-add-signature-error-close-button = Loka
## Dialog buttons ## Dialog buttons
@ -550,6 +557,26 @@ pdfjs-editor-add-signature-cancel-button = Hætta við
pdfjs-editor-add-signature-add-button = Bæta við pdfjs-editor-add-signature-add-button = Bæta við
pdfjs-editor-edit-signature-update-button = Uppfæra pdfjs-editor-edit-signature-update-button = Uppfæra
## Edit a comment dialog
pdfjs-editor-edit-comment-actions-button-label = Aðgerðir
pdfjs-editor-edit-comment-actions-button =
.title = Aðgerðir
pdfjs-editor-edit-comment-close-button-label = Loka
pdfjs-editor-edit-comment-close-button =
.title = Loka
pdfjs-editor-edit-comment-actions-edit-button-label = Breyta
pdfjs-editor-edit-comment-actions-delete-button-label = Eyða
pdfjs-editor-edit-comment-manager-text-input =
.placeholder = Settu inn athugasemdina þína
pdfjs-editor-edit-comment-manager-cancel-button = Hætta við
pdfjs-editor-edit-comment-manager-save-button = Vista
## Edit a comment button in the editor toolbar
pdfjs-editor-edit-comment-button =
.title = Breyta athugasemd
## Main menu for adding/removing signatures ## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 = pdfjs-editor-delete-signature-button1 =

View File

@ -286,6 +286,8 @@ pdfjs-web-fonts-disabled = Веб қаріптері сөндірілген: қ
pdfjs-editor-free-text-button = pdfjs-editor-free-text-button =
.title = Мәтін .title = Мәтін
pdfjs-editor-color-picker-free-text-input =
.title = Мәтін түсін өзгерту
pdfjs-editor-free-text-button-label = Мәтін pdfjs-editor-free-text-button-label = Мәтін
pdfjs-editor-ink-button = pdfjs-editor-ink-button =
.title = Сурет салу .title = Сурет салу
@ -300,12 +302,21 @@ pdfjs-highlight-floating-button1 =
.title = Ерекшелеу .title = Ерекшелеу
.aria-label = Ерекшелеу .aria-label = Ерекшелеу
pdfjs-highlight-floating-button-label = Ерекшелеу pdfjs-highlight-floating-button-label = Ерекшелеу
pdfjs-comment-floating-button =
.title = Түсіндірме
.aria-label = Түсіндірме
pdfjs-comment-floating-button-label = Түсіндірме
pdfjs-editor-signature-button = pdfjs-editor-signature-button =
.title = Қолтаңбаны қосу .title = Қолтаңбаны қосу
pdfjs-editor-signature-button-label = Қолтаңбаны қосу pdfjs-editor-signature-button-label = Қолтаңбаны қосу
## Default editor aria labels ## Default editor aria labels
# Used when a signature editor is selected/hovered.
# Variables:
# $description (String) - a string describing/labeling the signature.
pdfjs-editor-signature-editor1 =
.aria-description = Қолтаңба түзеткіші: { $description }
pdfjs-editor-stamp-editor = pdfjs-editor-stamp-editor =
.aria-label = Сурет редакторы .aria-label = Сурет редакторы
@ -564,6 +575,26 @@ pdfjs-editor-add-signature-cancel-button = Бас тарту
pdfjs-editor-add-signature-add-button = Қосу pdfjs-editor-add-signature-add-button = Қосу
pdfjs-editor-edit-signature-update-button = Жаңарту pdfjs-editor-edit-signature-update-button = Жаңарту
## Edit a comment dialog
pdfjs-editor-edit-comment-actions-button-label = Әрекеттер
pdfjs-editor-edit-comment-actions-button =
.title = Әрекеттер
pdfjs-editor-edit-comment-close-button-label = Жабу
pdfjs-editor-edit-comment-close-button =
.title = Жабу
pdfjs-editor-edit-comment-actions-edit-button-label = Түзету
pdfjs-editor-edit-comment-actions-delete-button-label = Өшіру
pdfjs-editor-edit-comment-manager-text-input =
.placeholder = Пікіріңізді енгізіңіз
pdfjs-editor-edit-comment-manager-cancel-button = Бас тарту
pdfjs-editor-edit-comment-manager-save-button = Сақтау
## Edit a comment button in the editor toolbar
pdfjs-editor-edit-comment-button =
.title = Пікірді түзету
## Main menu for adding/removing signatures ## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 = pdfjs-editor-delete-signature-button1 =

View File

@ -278,9 +278,13 @@ pdfjs-web-fonts-disabled = แบบอักษรเว็บถูกปิ
pdfjs-editor-free-text-button = pdfjs-editor-free-text-button =
.title = ข้อความ .title = ข้อความ
pdfjs-editor-color-picker-free-text-input =
.title = เปลี่ยนสีข้อความ
pdfjs-editor-free-text-button-label = ข้อความ pdfjs-editor-free-text-button-label = ข้อความ
pdfjs-editor-ink-button = pdfjs-editor-ink-button =
.title = รูปวาด .title = รูปวาด
pdfjs-editor-color-picker-ink-input =
.title = เปลี่ยนสีรูปวาด
pdfjs-editor-ink-button-label = รูปวาด pdfjs-editor-ink-button-label = รูปวาด
pdfjs-editor-stamp-button = pdfjs-editor-stamp-button =
.title = เพิ่มหรือแก้ไขภาพ .title = เพิ่มหรือแก้ไขภาพ
@ -292,6 +296,10 @@ pdfjs-highlight-floating-button1 =
.title = เน้นสี .title = เน้นสี
.aria-label = เน้นสี .aria-label = เน้นสี
pdfjs-highlight-floating-button-label = เน้นสี pdfjs-highlight-floating-button-label = เน้นสี
pdfjs-comment-floating-button =
.title = แสดงความคิดเห็น
.aria-label = แสดงความคิดเห็น
pdfjs-comment-floating-button-label = แสดงความคิดเห็น
pdfjs-editor-signature-button = pdfjs-editor-signature-button =
.title = เพิ่มลายเซ็น .title = เพิ่มลายเซ็น
pdfjs-editor-signature-button-label = เพิ่มลายเซ็น pdfjs-editor-signature-button-label = เพิ่มลายเซ็น
@ -484,6 +492,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = แสดงตัว
pdfjs-editor-alt-text-settings-show-dialog-description = ช่วยให้คุณแน่ใจว่าภาพทั้งหมดของคุณมีข้อความทดแทน pdfjs-editor-alt-text-settings-show-dialog-description = ช่วยให้คุณแน่ใจว่าภาพทั้งหมดของคุณมีข้อความทดแทน
pdfjs-editor-alt-text-settings-close-button = ปิด pdfjs-editor-alt-text-settings-close-button = ปิด
## Accessibility labels (announced by screen readers) for objects added to the editor.
pdfjs-editor-highlight-added-alert = เพิ่มการเน้นสีแล้ว
pdfjs-editor-freetext-added-alert = เพิ่มข้อความแล้ว
pdfjs-editor-ink-added-alert = เพิ่มรูปวาดแล้ว
pdfjs-editor-stamp-added-alert = เพิ่มภาพแล้ว
pdfjs-editor-signature-added-alert = เพิ่มลายเซ็นแล้ว
## "Annotations removed" bar ## "Annotations removed" bar
pdfjs-editor-undo-bar-message-highlight = เอาการเน้นสีออกแล้ว pdfjs-editor-undo-bar-message-highlight = เอาการเน้นสีออกแล้ว
@ -548,6 +564,8 @@ pdfjs-editor-add-signature-save-checkbox = บันทึกลายเซ็
pdfjs-editor-add-signature-save-warning-message = คุณมีลายเซ็นที่บันทึกถึงจำนวนสูงสุด 5 รายการแล้ว โปรดลบรายการหนึ่งออกเมื่อจะบันทึกเพิ่ม pdfjs-editor-add-signature-save-warning-message = คุณมีลายเซ็นที่บันทึกถึงจำนวนสูงสุด 5 รายการแล้ว โปรดลบรายการหนึ่งออกเมื่อจะบันทึกเพิ่ม
pdfjs-editor-add-signature-image-upload-error-title = ไม่สามารถอัปโหลดภาพได้ pdfjs-editor-add-signature-image-upload-error-title = ไม่สามารถอัปโหลดภาพได้
pdfjs-editor-add-signature-image-upload-error-description = ตรวจสอบการเชื่อมต่อเครือข่ายของคุณหรือลองใช้ภาพอื่น pdfjs-editor-add-signature-image-upload-error-description = ตรวจสอบการเชื่อมต่อเครือข่ายของคุณหรือลองใช้ภาพอื่น
pdfjs-editor-add-signature-image-no-data-error-title = ไม่สามารถแปลงภาพนี้ให้เป็นลายเซ็นได้
pdfjs-editor-add-signature-image-no-data-error-description = โปรดลองอัปโหลดภาพอื่น
pdfjs-editor-add-signature-error-close-button = ปิด pdfjs-editor-add-signature-error-close-button = ปิด
## Dialog buttons ## Dialog buttons
@ -556,6 +574,26 @@ pdfjs-editor-add-signature-cancel-button = ยกเลิก
pdfjs-editor-add-signature-add-button = เพิ่ม pdfjs-editor-add-signature-add-button = เพิ่ม
pdfjs-editor-edit-signature-update-button = อัปเดต pdfjs-editor-edit-signature-update-button = อัปเดต
## Edit a comment dialog
pdfjs-editor-edit-comment-actions-button-label = การกระทำ
pdfjs-editor-edit-comment-actions-button =
.title = การกระทำ
pdfjs-editor-edit-comment-close-button-label = ปิด
pdfjs-editor-edit-comment-close-button =
.title = ปิด
pdfjs-editor-edit-comment-actions-edit-button-label = แก้ไข
pdfjs-editor-edit-comment-actions-delete-button-label = ลบ
pdfjs-editor-edit-comment-manager-text-input =
.placeholder = ป้อนความคิดเห็นของคุณ
pdfjs-editor-edit-comment-manager-cancel-button = ยกเลิก
pdfjs-editor-edit-comment-manager-save-button = บันทึก
## Edit a comment button in the editor toolbar
pdfjs-editor-edit-comment-button =
.title = แก้ไขความคิดเห็น
## Main menu for adding/removing signatures ## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 = pdfjs-editor-delete-signature-button1 =

411
package-lock.json generated
View File

@ -7,30 +7,30 @@
"name": "pdf.js", "name": "pdf.js",
"license": "Apache-2.0", "license": "Apache-2.0",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.28.3", "@babel/core": "^7.28.4",
"@babel/preset-env": "^7.28.3", "@babel/preset-env": "^7.28.3",
"@babel/runtime": "^7.28.3", "@babel/runtime": "^7.28.4",
"@csstools/postcss-light-dark-function": "^2.0.10", "@csstools/postcss-light-dark-function": "^2.0.10",
"@fluent/bundle": "^0.19.1", "@fluent/bundle": "^0.19.1",
"@fluent/dom": "^0.10.2", "@fluent/dom": "^0.10.2",
"@metalsmith/layouts": "^3.0.0", "@metalsmith/layouts": "^3.0.0",
"@metalsmith/markdown": "^1.10.0", "@metalsmith/markdown": "^1.10.0",
"@napi-rs/canvas": "^0.1.78", "@napi-rs/canvas": "^0.1.80",
"@types/node": "^24.3.0", "@types/node": "^24.4.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"babel-loader": "^10.0.0", "babel-loader": "^10.0.0",
"caniuse-lite": "^1.0.30001737", "caniuse-lite": "^1.0.30001741",
"core-js": "^3.45.1", "core-js": "^3.45.1",
"eslint": "^9.34.0", "eslint": "^9.35.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jasmine": "^4.2.2", "eslint-plugin-jasmine": "^4.2.2",
"eslint-plugin-json": "^4.0.1", "eslint-plugin-json": "^4.0.1",
"eslint-plugin-no-unsanitized": "^4.1.2", "eslint-plugin-no-unsanitized": "^4.1.4",
"eslint-plugin-perfectionist": "^4.15.0", "eslint-plugin-perfectionist": "^4.15.0",
"eslint-plugin-prettier": "^5.5.4", "eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-unicorn": "^60.0.0", "eslint-plugin-unicorn": "^61.0.2",
"globals": "^16.3.0", "globals": "^16.4.0",
"gulp": "^5.0.1", "gulp": "^5.0.1",
"gulp-cli": "^3.1.0", "gulp-cli": "^3.1.0",
"gulp-postcss": "^10.0.0", "gulp-postcss": "^10.0.0",
@ -38,7 +38,7 @@
"gulp-replace": "^1.1.4", "gulp-replace": "^1.1.4",
"gulp-zip": "^6.1.0", "gulp-zip": "^6.1.0",
"highlight.js": "^11.11.1", "highlight.js": "^11.11.1",
"jasmine": "^5.9.0", "jasmine": "^5.10.0",
"jsdoc": "^4.0.4", "jsdoc": "^4.0.4",
"jstransformer-nunjucks": "^1.2.0", "jstransformer-nunjucks": "^1.2.0",
"metalsmith": "^2.6.3", "metalsmith": "^2.6.3",
@ -50,10 +50,10 @@
"postcss-discard-comments": "^7.0.4", "postcss-discard-comments": "^7.0.4",
"postcss-nesting": "^13.0.2", "postcss-nesting": "^13.0.2",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"puppeteer": "^24.17.1", "puppeteer": "^24.20.0",
"stylelint": "^16.23.1", "stylelint": "^16.24.0",
"stylelint-prettier": "^5.0.3", "stylelint-prettier": "^5.0.3",
"svglint": "^4.1.0", "svglint": "^4.1.1",
"terser-webpack-plugin": "^5.3.14", "terser-webpack-plugin": "^5.3.14",
"tsc-alias": "^1.8.16", "tsc-alias": "^1.8.16",
"ttest": "^4.0.0", "ttest": "^4.0.0",
@ -76,32 +76,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"dev": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
"integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
"dev": true,
"dependencies": {
"@jridgewell/set-array": "^1.0.0",
"@jridgewell/sourcemap-codec": "^1.4.10"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.27.1", "version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@ -128,22 +102,22 @@
} }
}, },
"node_modules/@babel/core": { "node_modules/@babel/core": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
"integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3", "@babel/generator": "^7.28.3",
"@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.28.3", "@babel/helper-module-transforms": "^7.28.3",
"@babel/helpers": "^7.28.3", "@babel/helpers": "^7.28.4",
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.4",
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/traverse": "^7.28.3", "@babel/traverse": "^7.28.4",
"@babel/types": "^7.28.2", "@babel/types": "^7.28.4",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"debug": "^4.1.0", "debug": "^4.1.0",
"gensync": "^1.0.0-beta.2", "gensync": "^1.0.0-beta.2",
@ -483,27 +457,27 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
"integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/types": "^7.28.2" "@babel/types": "^7.28.4"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
"integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/types": "^7.28.2" "@babel/types": "^7.28.4"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@ -1621,9 +1595,9 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
"integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1646,18 +1620,18 @@
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.28.3", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
"integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.27.1", "@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.3", "@babel/generator": "^7.28.3",
"@babel/helper-globals": "^7.28.0", "@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.28.3", "@babel/parser": "^7.28.4",
"@babel/template": "^7.27.2", "@babel/template": "^7.27.2",
"@babel/types": "^7.28.2", "@babel/types": "^7.28.4",
"debug": "^4.3.1" "debug": "^4.3.1"
}, },
"engines": { "engines": {
@ -1665,9 +1639,9 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.28.2", "version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1858,9 +1832,9 @@
} }
}, },
"node_modules/@eslint-community/eslint-utils": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0", "version": "4.9.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1982,9 +1956,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "9.34.0", "version": "9.35.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
"integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -2238,6 +2212,17 @@
"@jridgewell/trace-mapping": "^0.3.24" "@jridgewell/trace-mapping": "^0.3.24"
} }
}, },
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": { "node_modules/@jridgewell/resolve-uri": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
@ -2247,15 +2232,6 @@
"node": ">=6.0.0" "node": ">=6.0.0"
} }
}, },
"node_modules/@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": { "node_modules/@jridgewell/source-map": {
"version": "0.3.6", "version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
@ -2298,9 +2274,9 @@
} }
}, },
"node_modules/@keyv/serialize": { "node_modules/@keyv/serialize": {
"version": "1.1.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
"integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -2340,9 +2316,9 @@
} }
}, },
"node_modules/@napi-rs/canvas": { "node_modules/@napi-rs/canvas": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz",
"integrity": "sha512-YaBHJvT+T1DoP16puvWM6w46Lq3VhwKIJ8th5m1iEJyGh7mibk5dT7flBvMQ1EH1LYmMzXJ+OUhu+8wQ9I6u7g==", "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"workspaces": [ "workspaces": [
@ -2352,22 +2328,22 @@
"node": ">= 10" "node": ">= 10"
}, },
"optionalDependencies": { "optionalDependencies": {
"@napi-rs/canvas-android-arm64": "0.1.78", "@napi-rs/canvas-android-arm64": "0.1.80",
"@napi-rs/canvas-darwin-arm64": "0.1.78", "@napi-rs/canvas-darwin-arm64": "0.1.80",
"@napi-rs/canvas-darwin-x64": "0.1.78", "@napi-rs/canvas-darwin-x64": "0.1.80",
"@napi-rs/canvas-linux-arm-gnueabihf": "0.1.78", "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80",
"@napi-rs/canvas-linux-arm64-gnu": "0.1.78", "@napi-rs/canvas-linux-arm64-gnu": "0.1.80",
"@napi-rs/canvas-linux-arm64-musl": "0.1.78", "@napi-rs/canvas-linux-arm64-musl": "0.1.80",
"@napi-rs/canvas-linux-riscv64-gnu": "0.1.78", "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80",
"@napi-rs/canvas-linux-x64-gnu": "0.1.78", "@napi-rs/canvas-linux-x64-gnu": "0.1.80",
"@napi-rs/canvas-linux-x64-musl": "0.1.78", "@napi-rs/canvas-linux-x64-musl": "0.1.80",
"@napi-rs/canvas-win32-x64-msvc": "0.1.78" "@napi-rs/canvas-win32-x64-msvc": "0.1.80"
} }
}, },
"node_modules/@napi-rs/canvas-android-arm64": { "node_modules/@napi-rs/canvas-android-arm64": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz",
"integrity": "sha512-N1ikxztjrRmh8xxlG5kYm1RuNr8ZW1EINEDQsLhhuy7t0pWI/e7SH91uFVLZKCMDyjel1tyWV93b5fdCAi7ggw==", "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2382,9 +2358,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-darwin-arm64": { "node_modules/@napi-rs/canvas-darwin-arm64": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz",
"integrity": "sha512-FA3aCU3G5yGc74BSmnLJTObnZRV+HW+JBTrsU+0WVVaNyVKlb5nMvYAQuieQlRVemsAA2ek2c6nYtHh6u6bwFw==", "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2399,9 +2375,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-darwin-x64": { "node_modules/@napi-rs/canvas-darwin-x64": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz",
"integrity": "sha512-xVij69o9t/frixCDEoyWoVDKgE3ksLGdmE2nvBWVGmoLu94MWUlv2y4Qzf5oozBmydG5Dcm4pRHFBM7YWa1i6g==", "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2416,9 +2392,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz",
"integrity": "sha512-aSEXrLcIpBtXpOSnLhTg4jPsjJEnK7Je9KqUdAWjc7T8O4iYlxWxrXFIF8rV8J79h5jNdScgZpAUWYnEcutR3g==", "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -2433,9 +2409,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-linux-arm64-gnu": { "node_modules/@napi-rs/canvas-linux-arm64-gnu": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz",
"integrity": "sha512-dlEPRX1hLGKaY3UtGa1dtkA1uGgFITn2mDnfI6YsLlYyLJQNqHx87D1YTACI4zFCUuLr/EzQDzuX+vnp9YveVg==", "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2450,9 +2426,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-linux-arm64-musl": { "node_modules/@napi-rs/canvas-linux-arm64-musl": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz",
"integrity": "sha512-TsCfjOPZtm5Q/NO1EZHR5pwDPSPjPEttvnv44GL32Zn1uvudssjTLbvaG1jHq81Qxm16GTXEiYLmx4jOLZQYlg==", "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -2467,9 +2443,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-linux-riscv64-gnu": { "node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz",
"integrity": "sha512-+cpTTb0GDshEow/5Fy8TpNyzaPsYb3clQIjgWRmzRcuteLU+CHEU/vpYvAcSo7JxHYPJd8fjSr+qqh+nI5AtmA==", "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -2484,9 +2460,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-linux-x64-gnu": { "node_modules/@napi-rs/canvas-linux-x64-gnu": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz",
"integrity": "sha512-wxRcvKfvYBgtrO0Uy8OmwvjlnTcHpY45LLwkwVNIWHPqHAsyoTyG/JBSfJ0p5tWRzMOPDCDqdhpIO4LOgXjeyg==", "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2501,9 +2477,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-linux-x64-musl": { "node_modules/@napi-rs/canvas-linux-x64-musl": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz",
"integrity": "sha512-vQFOGwC9QDP0kXlhb2LU1QRw/humXgcbVp8mXlyBqzc/a0eijlLF9wzyarHC1EywpymtS63TAj8PHZnhTYN6hg==", "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2518,9 +2494,9 @@
} }
}, },
"node_modules/@napi-rs/canvas-win32-x64-msvc": { "node_modules/@napi-rs/canvas-win32-x64-msvc": {
"version": "0.1.78", "version": "0.1.80",
"resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.78.tgz", "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz",
"integrity": "sha512-/eKlTZBtGUgpRKalzOzRr6h7KVSuziESWXgBcBnXggZmimwIJWPJlEcbrx5Tcwj8rPuZiANXQOG9pPgy9Q4LTQ==", "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -2593,9 +2569,9 @@
} }
}, },
"node_modules/@puppeteer/browsers": { "node_modules/@puppeteer/browsers": {
"version": "2.10.8", "version": "2.10.9",
"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.9.tgz",
"integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", "integrity": "sha512-kUGHwABarVhvMP+zhW5zvDA7LmGcd4TwrTEBwcTQic5EebUqaK5NjC0UXLJepIFVGsr2N/Z8NJQz2JYGo1ZwxA==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@ -2739,13 +2715,13 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "24.3.0", "version": "24.4.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz",
"integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~7.10.0" "undici-types": "~7.11.0"
} }
}, },
"node_modules/@types/vinyl": { "node_modules/@types/vinyl": {
@ -3738,16 +3714,18 @@
"optional": true "optional": true
}, },
"node_modules/bare-fs": { "node_modules/bare-fs": {
"version": "4.2.1", "version": "4.4.4",
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz",
"integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"bare-events": "^2.5.4", "bare-events": "^2.5.4",
"bare-path": "^3.0.0", "bare-path": "^3.0.0",
"bare-stream": "^2.6.4" "bare-stream": "^2.6.4",
"bare-url": "^2.2.2",
"fast-fifo": "^1.3.2"
}, },
"engines": { "engines": {
"bare": ">=1.16.0" "bare": ">=1.16.0"
@ -3806,6 +3784,17 @@
} }
} }
}, },
"node_modules/bare-url": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz",
"integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"bare-path": "^3.0.0"
}
},
"node_modules/base64-js": { "node_modules/base64-js": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@ -4001,24 +3990,24 @@
} }
}, },
"node_modules/cacheable": { "node_modules/cacheable": {
"version": "1.10.3", "version": "1.10.4",
"resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.3.tgz", "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.4.tgz",
"integrity": "sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==", "integrity": "sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"hookified": "^1.10.0", "hookified": "^1.11.0",
"keyv": "^5.4.0" "keyv": "^5.5.0"
} }
}, },
"node_modules/cacheable/node_modules/keyv": { "node_modules/cacheable/node_modules/keyv": {
"version": "5.5.0", "version": "5.5.1",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz", "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.1.tgz",
"integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==", "integrity": "sha512-eF3cHZ40bVsjdlRi/RvKAuB0+B61Q1xWvohnrJrnaQslM3h1n79IV+mc9EGag4nrA9ZOlNyr3TUzW5c8uy8vNA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@keyv/serialize": "^1.1.0" "@keyv/serialize": "^1.1.1"
} }
}, },
"node_modules/cached-iterable": { "node_modules/cached-iterable": {
@ -4090,9 +4079,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001737", "version": "1.0.30001741",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz",
"integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -4754,9 +4743,9 @@
} }
}, },
"node_modules/devtools-protocol": { "node_modules/devtools-protocol": {
"version": "0.0.1475386", "version": "0.0.1495869",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz",
"integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==",
"dev": true, "dev": true,
"license": "BSD-3-Clause" "license": "BSD-3-Clause"
}, },
@ -5237,19 +5226,19 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "9.34.0", "version": "9.35.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
"integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1", "@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.0", "@eslint/config-array": "^0.21.0",
"@eslint/config-helpers": "^0.3.1", "@eslint/config-helpers": "^0.3.1",
"@eslint/core": "^0.15.2", "@eslint/core": "^0.15.2",
"@eslint/eslintrc": "^3.3.1", "@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.34.0", "@eslint/js": "9.35.0",
"@eslint/plugin-kit": "^0.3.5", "@eslint/plugin-kit": "^0.3.5",
"@humanfs/node": "^0.16.6", "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
@ -5451,9 +5440,9 @@
} }
}, },
"node_modules/eslint-plugin-no-unsanitized": { "node_modules/eslint-plugin-no-unsanitized": {
"version": "4.1.2", "version": "4.1.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.2.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.4.tgz",
"integrity": "sha512-ydF3PMFKEIkP71ZbLHFvu6/FW8SvRv6VV/gECfrQkqyD5+5oCAtPz8ZHy0GRuMDtNe2jsNdPCQXX4LSbkapAVQ==", "integrity": "sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==",
"dev": true, "dev": true,
"license": "MPL-2.0", "license": "MPL-2.0",
"peerDependencies": { "peerDependencies": {
@ -5510,9 +5499,9 @@
} }
}, },
"node_modules/eslint-plugin-unicorn": { "node_modules/eslint-plugin-unicorn": {
"version": "60.0.0", "version": "61.0.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-61.0.2.tgz",
"integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==", "integrity": "sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -6639,9 +6628,9 @@
} }
}, },
"node_modules/globals": { "node_modules/globals": {
"version": "16.3.0", "version": "16.4.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
"integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -7078,9 +7067,9 @@
} }
}, },
"node_modules/hookified": { "node_modules/hookified": {
"version": "1.11.0", "version": "1.12.0",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.11.0.tgz", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz",
"integrity": "sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==", "integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -7881,23 +7870,23 @@
} }
}, },
"node_modules/jasmine": { "node_modules/jasmine": {
"version": "5.9.0", "version": "5.10.0",
"resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.9.0.tgz", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.10.0.tgz",
"integrity": "sha512-SspK51QMnuC92z5zpF4kOkWN+MyZZDOBv8zgzlMAYvMD0UoGwcq5yYaDe1mrpN7wXZ2CFXh5y8Ua2ugwE4OmXQ==", "integrity": "sha512-v4FojO8cXQdx15mJXovGhjJOvyIcVf7AC+H0ZahnfLk52vUbwuLxjVgbikc95yLmgwKQsFT47/FGQ3dOrWVxtQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"glob": "^10.2.2", "glob": "^10.2.2",
"jasmine-core": "~5.9.0" "jasmine-core": "~5.10.0"
}, },
"bin": { "bin": {
"jasmine": "bin/jasmine.js" "jasmine": "bin/jasmine.js"
} }
}, },
"node_modules/jasmine-core": { "node_modules/jasmine-core": {
"version": "5.9.0", "version": "5.10.0",
"resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.9.0.tgz", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.10.0.tgz",
"integrity": "sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==", "integrity": "sha512-MrChbWV5LBo+EaeKwTM1eZ6oYSz1brvFExnRafraEkJkbJ9evbUxABhnIgGQimhpMxhg+BD6QmOvb/e3NXsNdg==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -9970,18 +9959,18 @@
} }
}, },
"node_modules/puppeteer": { "node_modules/puppeteer": {
"version": "24.17.1", "version": "24.20.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.1.tgz", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.20.0.tgz",
"integrity": "sha512-KIuX0w+0um4TUbm55yFl2WIsbgjya2BHIgW9ylTuhavtwjXCOM7lMo9oLR1jQnCxrFvm9h/Yeb+zfs4nlgntPg==", "integrity": "sha512-iLnLV9oHKKAujmxiSxRWKfcT1q2COu0g1N9iU2TCp1MlmsyjgNAkcBOR3cAOqKb5UTiVPIGG4z5PO5yfpYZ6jA==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.10.8", "@puppeteer/browsers": "2.10.9",
"chromium-bidi": "8.0.0", "chromium-bidi": "8.0.0",
"cosmiconfig": "^9.0.0", "cosmiconfig": "^9.0.0",
"devtools-protocol": "0.0.1475386", "devtools-protocol": "0.0.1495869",
"puppeteer-core": "24.17.1", "puppeteer-core": "24.20.0",
"typed-query-selector": "^2.12.0" "typed-query-selector": "^2.12.0"
}, },
"bin": { "bin": {
@ -9992,17 +9981,18 @@
} }
}, },
"node_modules/puppeteer-core": { "node_modules/puppeteer-core": {
"version": "24.17.1", "version": "24.20.0",
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.1.tgz", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.20.0.tgz",
"integrity": "sha512-Msh/kf9k1XFN0wuKiT4/npMmMWOT7kPBEUw01gWvRoKOOoz3It9TEmWjnt4Gl4eO+p73VMrvR+wfa0dm9rfxjw==", "integrity": "sha512-n0y/f8EYyZt4yEJkjP3Vrqf9A4qa3uYpKYdsiedIY4bxIfTw1aAJSpSVPmWBPlr1LO4cNq2hGNIBWKPhvBF68w==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@puppeteer/browsers": "2.10.8", "@puppeteer/browsers": "2.10.9",
"chromium-bidi": "8.0.0", "chromium-bidi": "8.0.0",
"debug": "^4.4.1", "debug": "^4.4.1",
"devtools-protocol": "0.0.1475386", "devtools-protocol": "0.0.1495869",
"typed-query-selector": "^2.12.0", "typed-query-selector": "^2.12.0",
"webdriver-bidi-protocol": "0.2.8",
"ws": "^8.18.3" "ws": "^8.18.3"
}, },
"engines": { "engines": {
@ -11050,9 +11040,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/stylelint": { "node_modules/stylelint": {
"version": "16.23.1", "version": "16.24.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz",
"integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==", "integrity": "sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -11079,7 +11069,7 @@
"debug": "^4.4.1", "debug": "^4.4.1",
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"fastest-levenshtein": "^1.0.16", "fastest-levenshtein": "^1.0.16",
"file-entry-cache": "^10.1.3", "file-entry-cache": "^10.1.4",
"global-modules": "^2.0.0", "global-modules": "^2.0.0",
"globby": "^11.1.0", "globby": "^11.1.0",
"globjoin": "^0.1.4", "globjoin": "^0.1.4",
@ -11159,25 +11149,25 @@
"dev": true "dev": true
}, },
"node_modules/stylelint/node_modules/file-entry-cache": { "node_modules/stylelint/node_modules/file-entry-cache": {
"version": "10.1.3", "version": "10.1.4",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.3.tgz", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz",
"integrity": "sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==", "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"flat-cache": "^6.1.12" "flat-cache": "^6.1.13"
} }
}, },
"node_modules/stylelint/node_modules/flat-cache": { "node_modules/stylelint/node_modules/flat-cache": {
"version": "6.1.12", "version": "6.1.13",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.12.tgz", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.13.tgz",
"integrity": "sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==", "integrity": "sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cacheable": "^1.10.3", "cacheable": "^1.10.4",
"flatted": "^3.3.3", "flatted": "^3.3.3",
"hookified": "^1.10.0" "hookified": "^1.11.0"
} }
}, },
"node_modules/stylelint/node_modules/global-modules": { "node_modules/stylelint/node_modules/global-modules": {
@ -11310,9 +11300,9 @@
"dev": true "dev": true
}, },
"node_modules/svglint": { "node_modules/svglint": {
"version": "4.1.0", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/svglint/-/svglint-4.1.0.tgz", "resolved": "https://registry.npmjs.org/svglint/-/svglint-4.1.1.tgz",
"integrity": "sha512-gGpw/a8EQgBEEmkBCMS38ykEVhQJBFObkyLF3BZVO9GzgCuTCTx2Dlms01y+N02IobN80k7Q+NxTvoMd16CP0g==", "integrity": "sha512-//uSfcrDM6bWcgZdqQt2685F3Td58DX8JjEpu5SoBKVRZPLjGXaukVhegFN2HQ08WuChDV4DRqPk5zW1WaNLqA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -12038,9 +12028,9 @@
} }
}, },
"node_modules/undici-types": { "node_modules/undici-types": {
"version": "7.10.0", "version": "7.11.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -12309,6 +12299,13 @@
"node": ">=10.13.0" "node": ">=10.13.0"
} }
}, },
"node_modules/webdriver-bidi-protocol": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.8.tgz",
"integrity": "sha512-KPvtVAIX8VHjLZH1KHT5GXoOaPeb0Ju+JlAcdshw6Z/gsmRtLoxt0Hw99PgJwZta7zUQaAUIHHWDRkzrPHsQTQ==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/webpack": { "node_modules/webpack": {
"version": "5.101.3", "version": "5.101.3",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz",

View File

@ -2,30 +2,30 @@
"name": "pdf.js", "name": "pdf.js",
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.28.3", "@babel/core": "^7.28.4",
"@babel/preset-env": "^7.28.3", "@babel/preset-env": "^7.28.3",
"@babel/runtime": "^7.28.3", "@babel/runtime": "^7.28.4",
"@csstools/postcss-light-dark-function": "^2.0.10", "@csstools/postcss-light-dark-function": "^2.0.10",
"@fluent/bundle": "^0.19.1", "@fluent/bundle": "^0.19.1",
"@fluent/dom": "^0.10.2", "@fluent/dom": "^0.10.2",
"@metalsmith/layouts": "^3.0.0", "@metalsmith/layouts": "^3.0.0",
"@metalsmith/markdown": "^1.10.0", "@metalsmith/markdown": "^1.10.0",
"@napi-rs/canvas": "^0.1.78", "@napi-rs/canvas": "^0.1.80",
"@types/node": "^24.3.0", "@types/node": "^24.4.0",
"autoprefixer": "^10.4.21", "autoprefixer": "^10.4.21",
"babel-loader": "^10.0.0", "babel-loader": "^10.0.0",
"caniuse-lite": "^1.0.30001737", "caniuse-lite": "^1.0.30001741",
"core-js": "^3.45.1", "core-js": "^3.45.1",
"eslint": "^9.34.0", "eslint": "^9.35.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-jasmine": "^4.2.2", "eslint-plugin-jasmine": "^4.2.2",
"eslint-plugin-json": "^4.0.1", "eslint-plugin-json": "^4.0.1",
"eslint-plugin-no-unsanitized": "^4.1.2", "eslint-plugin-no-unsanitized": "^4.1.4",
"eslint-plugin-perfectionist": "^4.15.0", "eslint-plugin-perfectionist": "^4.15.0",
"eslint-plugin-prettier": "^5.5.4", "eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-unicorn": "^60.0.0", "eslint-plugin-unicorn": "^61.0.2",
"globals": "^16.3.0", "globals": "^16.4.0",
"gulp": "^5.0.1", "gulp": "^5.0.1",
"gulp-cli": "^3.1.0", "gulp-cli": "^3.1.0",
"gulp-postcss": "^10.0.0", "gulp-postcss": "^10.0.0",
@ -33,7 +33,7 @@
"gulp-replace": "^1.1.4", "gulp-replace": "^1.1.4",
"gulp-zip": "^6.1.0", "gulp-zip": "^6.1.0",
"highlight.js": "^11.11.1", "highlight.js": "^11.11.1",
"jasmine": "^5.9.0", "jasmine": "^5.10.0",
"jsdoc": "^4.0.4", "jsdoc": "^4.0.4",
"jstransformer-nunjucks": "^1.2.0", "jstransformer-nunjucks": "^1.2.0",
"metalsmith": "^2.6.3", "metalsmith": "^2.6.3",
@ -45,10 +45,10 @@
"postcss-discard-comments": "^7.0.4", "postcss-discard-comments": "^7.0.4",
"postcss-nesting": "^13.0.2", "postcss-nesting": "^13.0.2",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"puppeteer": "^24.17.1", "puppeteer": "^24.20.0",
"stylelint": "^16.23.1", "stylelint": "^16.24.0",
"stylelint-prettier": "^5.0.3", "stylelint-prettier": "^5.0.3",
"svglint": "^4.1.0", "svglint": "^4.1.1",
"terser-webpack-plugin": "^5.3.14", "terser-webpack-plugin": "^5.3.14",
"tsc-alias": "^1.8.16", "tsc-alias": "^1.8.16",
"ttest": "^4.0.0", "ttest": "^4.0.0",

View File

@ -3661,8 +3661,24 @@ class PartialEvaluator {
if (baseEncodingName) { if (baseEncodingName) {
properties.defaultEncoding = getEncoding(baseEncodingName); properties.defaultEncoding = getEncoding(baseEncodingName);
} else { } else {
const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); let isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic);
// The PDF specs state that the flags Symbolic and Nonsymbolic must be
// mutually exclusive. However, some fonts are marked as both.
// In that case we ignore the Symbolic flag when there is a Differences
// entry (which indicates that the font is used as a non-symbolic
// font).
if (
properties.type === "TrueType" &&
isSymbolicFont &&
isNonsymbolicFont &&
differences.length !== 0
) {
properties.flags &= ~FontFlags.Symbolic;
isSymbolicFont = false;
}
// According to "Table 114" in section "9.6.6.1 General" (under // According to "Table 114" in section "9.6.6.1 General" (under
// "9.6.6 Character Encoding") of the PDF specification, a Nonsymbolic // "9.6.6 Character Encoding") of the PDF specification, a Nonsymbolic
// font should use the `StandardEncoding` if no encoding is specified. // font should use the `StandardEncoding` if no encoding is specified.

View File

@ -334,7 +334,7 @@ class AnnotationEditorLayer {
if (editor?.annotationElementId === null) { if (editor?.annotationElementId === null) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
editor.dblclick(); editor.dblclick(e);
} }
}, },
{ signal, capture: true } { signal, capture: true }

View File

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { noContextMenu } from "../display_utils.js"; import { noContextMenu, stopEvent } from "../display_utils.js";
class Comment { class Comment {
#commentStandaloneButton = null; #commentStandaloneButton = null;
@ -34,6 +34,8 @@ class Comment {
#deleted = false; #deleted = false;
#popupPosition = null;
constructor(editor) { constructor(editor) {
this.#editor = editor; this.#editor = editor;
} }
@ -42,7 +44,7 @@ class Comment {
const button = (this.#commentToolbarButton = const button = (this.#commentToolbarButton =
document.createElement("button")); document.createElement("button"));
button.className = "comment"; button.className = "comment";
return this.#render(button); return this.#render(button, false);
} }
renderForStandalone() { renderForStandalone() {
@ -66,16 +68,87 @@ class Comment {
} }
} }
return this.#render(button); return this.#render(button, true);
} }
#render(comment) { onUpdatedColor() {
if (!this.#commentStandaloneButton) {
return;
}
const color = this.#editor.commentButtonColor;
if (color) {
this.#commentStandaloneButton.style.backgroundColor = color;
}
this.#editor._uiManager.updatePopupColor(this.#editor);
}
get commentButtonWidth() {
return (
(this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) /
this.#editor.parent.boundingClientRect.width
);
}
get commentPopupPositionInLayer() {
if (this.#popupPosition) {
return this.#popupPosition;
}
if (!this.#commentStandaloneButton) {
return null;
}
const { x, y, height } =
this.#commentStandaloneButton.getBoundingClientRect();
const {
x: parentX,
y: parentY,
width: parentWidth,
height: parentHeight,
} = this.#editor.parent.boundingClientRect;
const OFFSET_UNDER_BUTTON = 2;
return [
(x - parentX) / parentWidth,
(y + height + OFFSET_UNDER_BUTTON - parentY) / parentHeight,
];
}
set commentPopupPositionInLayer(pos) {
this.#popupPosition = pos;
}
removeStandaloneCommentButton() {
this.#commentStandaloneButton?.remove();
this.#commentStandaloneButton = null;
}
removeToolbarCommentButton() {
this.#commentToolbarButton?.remove();
this.#commentToolbarButton = null;
}
setCommentButtonStates({ selected, hasPopup }) {
if (!this.#commentStandaloneButton) {
return;
}
this.#commentStandaloneButton.classList.toggle("selected", selected);
this.#commentStandaloneButton.ariaExpanded = hasPopup;
}
#render(comment, isStandalone) {
if (!this.#editor._uiManager.hasCommentManager()) { if (!this.#editor._uiManager.hasCommentManager()) {
return null; return null;
} }
comment.tabIndex = "0"; comment.tabIndex = "0";
comment.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-button"); comment.ariaHasPopup = "dialog";
if (isStandalone) {
comment.ariaControls = "commentPopup";
} else {
comment.ariaControlsElements = [
this.#editor._uiManager.getCommentDialogElement(),
];
comment.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-button");
}
const signal = this.#editor._uiManager._signal; const signal = this.#editor._uiManager._signal;
if (!(signal instanceof AbortSignal) || signal.aborted) { if (!(signal instanceof AbortSignal) || signal.aborted) {
@ -83,6 +156,30 @@ class Comment {
} }
comment.addEventListener("contextmenu", noContextMenu, { signal }); comment.addEventListener("contextmenu", noContextMenu, { signal });
if (isStandalone) {
comment.addEventListener(
"focusin",
e => {
this.#editor._focusEventsAllowed = false;
stopEvent(e);
},
{
capture: true,
signal,
}
);
comment.addEventListener(
"focusout",
e => {
this.#editor._focusEventsAllowed = true;
stopEvent(e);
},
{
capture: true,
signal,
}
);
}
comment.addEventListener("pointerdown", event => event.stopPropagation(), { comment.addEventListener("pointerdown", event => event.stopPropagation(), {
signal, signal,
}); });
@ -92,7 +189,7 @@ class Comment {
if (comment === this.#commentToolbarButton) { if (comment === this.#commentToolbarButton) {
this.edit(); this.edit();
} else { } else {
this.#editor._uiManager.toggleComment(this.#editor); this.#editor.toggleComment(/* isSelected = */ true);
} }
}; };
comment.addEventListener("click", onClick, { capture: true, signal }); comment.addEventListener("click", onClick, { capture: true, signal });
@ -107,18 +204,55 @@ class Comment {
{ signal } { signal }
); );
comment.addEventListener(
"pointerenter",
() => {
this.#editor.toggleComment(
/* isSelected = */ false,
/* visibility = */ true
);
},
{ signal }
);
comment.addEventListener(
"pointerleave",
() => {
this.#editor.toggleComment(
/* isSelected = */ false,
/* visibility = */ false
);
},
{ signal }
);
return comment; return comment;
} }
edit() { edit(options) {
const { bottom, left, right } = this.#editor.getClientDimensions(); const position = this.commentPopupPositionInLayer;
const position = { top: bottom }; let posX, posY;
if (this.#editor._uiManager.direction === "ltr") { if (position) {
position.right = right; [posX, posY] = position;
} else { } else {
position.left = left; // The position is in the editor coordinates.
[posX, posY] = this.#editor.commentButtonPosition;
const { width, height, x, y } = this.#editor;
posX = x + posX * width;
posY = y + posY * height;
} }
this.#editor._uiManager.editComment(this.#editor, position); const parentDimensions = this.#editor.parent.boundingClientRect;
const {
x: parentX,
y: parentY,
width: parentWidth,
height: parentHeight,
} = parentDimensions;
this.#editor._uiManager.editComment(
this.#editor,
parentX + posX * parentWidth,
parentY + posY * parentHeight,
{ ...options, parentDimensions }
);
} }
finish() { finish() {

View File

@ -98,6 +98,12 @@ class DrawingEditor extends AnnotationEditor {
this._addOutlines(params); this._addOutlines(params);
} }
/** @inheritdoc */
onUpdatedColor() {
this._colorPicker?.update(this.color);
super.onUpdatedColor();
}
_addOutlines(params) { _addOutlines(params) {
if (params.drawOutlines) { if (params.drawOutlines) {
this.#createDrawOutlines(params); this.#createDrawOutlines(params);
@ -243,7 +249,7 @@ class DrawingEditor extends AnnotationEditor {
options.toSVGProperties() options.toSVGProperties()
); );
if (type === this.colorType) { if (type === this.colorType) {
this._colorPicker?.update(val); this.onUpdatedColor();
} }
}; };
this.addCommands({ this.addCommands({

View File

@ -22,19 +22,13 @@ import {
ColorManager, ColorManager,
KeyboardManager, KeyboardManager,
} from "./tools.js"; } from "./tools.js";
import {
applyOpacity,
CSSConstants,
findContrastColor,
noContextMenu,
stopEvent,
} from "../display_utils.js";
import { import {
FeatureTest, FeatureTest,
MathClamp, MathClamp,
shadow, shadow,
unreachable, unreachable,
} from "../../shared/util.js"; } from "../../shared/util.js";
import { noContextMenu, stopEvent } from "../display_utils.js";
import { AltText } from "./alt_text.js"; import { AltText } from "./alt_text.js";
import { Comment } from "./comment.js"; import { Comment } from "./comment.js";
import { EditorToolbar } from "./toolbar.js"; import { EditorToolbar } from "./toolbar.js";
@ -1098,28 +1092,28 @@ class AnnotationEditor {
await this._editToolbar.addButton(name, tool); await this._editToolbar.addButton(name, tool);
} }
} }
this._editToolbar.addButton("comment", this.addCommentButton()); if (!this.hasComment) {
this._editToolbar.addButton("comment", this.addCommentButton());
}
this._editToolbar.addButton("delete"); this._editToolbar.addButton("delete");
return this._editToolbar; return this._editToolbar;
} }
addCommentButtonInToolbar() { addCommentButtonInToolbar() {
if (!this._editToolbar) { this._editToolbar?.addButtonBefore(
return;
}
this._editToolbar.addButtonBefore(
"comment", "comment",
this.addCommentButton(), this.addCommentButton(),
".deleteButton" ".deleteButton"
); );
} }
removeCommentButtonFromToolbar() {
this._editToolbar?.removeButton("comment");
}
removeEditToolbar() { removeEditToolbar() {
if (!this._editToolbar) { this._editToolbar?.remove();
return;
}
this._editToolbar.remove();
this._editToolbar = null; this._editToolbar = null;
// We destroy the alt text but we don't null it because we want to be able // We destroy the alt text but we don't null it because we want to be able
@ -1195,8 +1189,11 @@ class AnnotationEditor {
} }
addStandaloneCommentButton() { addStandaloneCommentButton() {
this.#comment ||= new Comment(this);
if (this.#commentStandaloneButton) { if (this.#commentStandaloneButton) {
this.#commentStandaloneButton.classList.remove("hidden");
return;
}
if (!this.hasComment) {
return; return;
} }
this.#commentStandaloneButton = this.#comment.renderForStandalone(); this.#commentStandaloneButton = this.#comment.renderForStandalone();
@ -1204,12 +1201,12 @@ class AnnotationEditor {
} }
removeStandaloneCommentButton() { removeStandaloneCommentButton() {
this.#commentStandaloneButton?.remove(); this.#comment.removeStandaloneCommentButton();
this.#commentStandaloneButton = null; this.#commentStandaloneButton = null;
} }
get commentColor() { hideStandaloneCommentButton() {
return null; this.#commentStandaloneButton?.classList.add("hidden");
} }
get comment() { get comment() {
@ -1221,7 +1218,8 @@ class AnnotationEditor {
richText, richText,
date, date,
deleted, deleted,
color: this.commentColor, color: this.getNonHCMColor(),
opacity: this.opacity ?? 1,
}; };
} }
@ -1229,17 +1227,18 @@ class AnnotationEditor {
this.#comment ||= new Comment(this); this.#comment ||= new Comment(this);
this.#comment.data = text; this.#comment.data = text;
if (this.hasComment) { if (this.hasComment) {
this.removeCommentButtonFromToolbar();
this.addStandaloneCommentButton(); this.addStandaloneCommentButton();
this._uiManager.updateComment(this);
} else { } else {
this.addCommentButtonInToolbar(); this.addCommentButtonInToolbar();
this.removeStandaloneCommentButton(); this.removeStandaloneCommentButton();
this._uiManager.removeComment(this);
} }
} }
setCommentData({ comment, richText }) { setCommentData({ comment, richText }) {
if (!this.#comment) { this.#comment ||= new Comment(this);
this.#comment = new Comment(this);
}
this.#comment.setInitialText(comment, richText); this.#comment.setInitialText(comment, richText);
} }
@ -1253,14 +1252,20 @@ class AnnotationEditor {
); );
} }
async editComment() { async editComment(options) {
if (!this.#comment) { this.#comment ||= new Comment(this);
this.#comment = new Comment(this); this.#comment.edit(options);
}
this.#comment.edit();
} }
showComment() {} toggleComment(isSelected, visibility = undefined) {
if (this.hasComment) {
this._uiManager.toggleComment(this, isSelected, visibility);
}
}
setSelectedCommentButton(selected) {
this.#comment.setSelectedButton(selected);
}
addComment(serialized) { addComment(serialized) {
if (this.hasEditedComment) { if (this.hasEditedComment) {
@ -1280,6 +1285,10 @@ class AnnotationEditor {
} }
} }
get parentBoundingClientRect() {
return this.parent.boundingClientRect;
}
/** /**
* Render this editor in a div. * Render this editor in a div.
* @returns {HTMLDivElement | null} * @returns {HTMLDivElement | null}
@ -1327,6 +1336,7 @@ class AnnotationEditor {
}); });
} }
this.addStandaloneCommentButton();
this._uiManager._editorUndoBar?.hide(); this._uiManager._editorUndoBar?.hide();
return div; return div;
@ -1467,6 +1477,11 @@ class AnnotationEditor {
e => { e => {
if (!hasDraggingStarted) { if (!hasDraggingStarted) {
hasDraggingStarted = true; hasDraggingStarted = true;
this._uiManager.toggleComment(
this,
/* isSelected = */ true,
/* visibility = */ false
);
this._onStartDragging(); this._onStartDragging();
} }
const { clientX: x, clientY: y, pointerId } = e; const { clientX: x, clientY: y, pointerId } = e;
@ -1632,9 +1647,25 @@ class AnnotationEditor {
return this.getRect(0, 0); return this.getRect(0, 0);
} }
getNonHCMColor() {
return (
this.color &&
AnnotationEditor._colorManager.convert(
this._uiManager.getNonHCMColor(this.color)
)
);
}
/**
* The color has been changed.
*/
onUpdatedColor() {
this.#comment?.onUpdatedColor();
}
getData() { getData() {
const { const {
comment: { text: str, date, deleted, richText }, comment: { text: str, color, date, opacity, deleted, richText },
uid: id, uid: id,
pageIndex, pageIndex,
creationDate, creationDate,
@ -1649,6 +1680,8 @@ class AnnotationEditor {
creationDate, creationDate,
modificationDate: date || modificationDate, modificationDate: date || modificationDate,
popupRef: !deleted, popupRef: !deleted,
color,
opacity,
}; };
} }
@ -1903,18 +1936,32 @@ class AnnotationEditor {
} }
get commentButtonColor() { get commentButtonColor() {
if (!this.color) { return this._uiManager.makeCommentColor(
return null; this.getNonHCMColor(),
} this.opacity
const [r, g, b] = AnnotationEditor._colorManager.convert(
this._uiManager.getNonHCMColor(this.color)
);
return findContrastColor(
applyOpacity(r, g, b, this.opacity),
CSSConstants.commentForegroundColor
); );
} }
get commentPopupPosition() {
return this.#comment.commentPopupPositionInLayer;
}
set commentPopupPosition(pos) {
this.#comment.commentPopupPositionInLayer = pos;
}
get commentButtonWidth() {
return this.#comment.commentButtonWidth;
}
get elementBeforePopup() {
return this.div;
}
setCommentButtonStates(options) {
this.#comment.setCommentButtonStates(options);
}
/** /**
* onkeydown callback. * onkeydown callback.
* @param {KeyboardEvent} event * @param {KeyboardEvent} event
@ -2047,6 +2094,7 @@ class AnnotationEditor {
*/ */
select() { select() {
if (this.isSelected && this._editToolbar) { if (this.isSelected && this._editToolbar) {
this._editToolbar.show();
return; return;
} }
this.isSelected = true; this.isSelected = true;
@ -2086,6 +2134,13 @@ class AnnotationEditor {
} }
this._editToolbar?.hide(); this._editToolbar?.hide();
this.#altText?.toggleAltTextBadge(true); this.#altText?.toggleAltTextBadge(true);
if (this.hasComment) {
this._uiManager.toggleComment(
this,
/* isSelected = */ false,
/* visibility = */ false
);
}
} }
/** /**
@ -2133,6 +2188,10 @@ class AnnotationEditor {
* @param {MouseEvent} event * @param {MouseEvent} event
*/ */
dblclick(event) { dblclick(event) {
if (event.target.nodeName === "BUTTON") {
// Avoid entering in edit mode when clicking on the comment button.
return;
}
this.enterInEditMode(); this.enterInEditMode();
this.parent.updateToolbar({ this.parent.updateToolbar({
mode: this.constructor._editorType, mode: this.constructor._editorType,

View File

@ -236,14 +236,21 @@ class FreeTextEditor extends AnnotationEditor {
}); });
} }
/** @inheritdoc */
onUpdatedColor() {
this.editorDiv.style.color = this.color;
this._colorPicker?.update(this.color);
super.onUpdatedColor();
}
/** /**
* Update the color and make this action undoable. * Update the color and make this action undoable.
* @param {string} color * @param {string} color
*/ */
#updateColor(color) { #updateColor(color) {
const setColor = col => { const setColor = col => {
this.color = this.editorDiv.style.color = col; this.color = col;
this._colorPicker?.update(col); this.onUpdatedColor();
}; };
const savedColor = this.color; const savedColor = this.color;
this.addCommands({ this.addCommands({

View File

@ -348,6 +348,18 @@ class HighlightEditor extends AnnotationEditor {
]; ];
} }
/** @inheritdoc */
onUpdatedColor() {
this.parent?.drawLayer.updateProperties(this.#id, {
root: {
fill: this.color,
"fill-opacity": this.opacity,
},
});
this.#colorPicker?.updateColor(this.color);
super.onUpdatedColor();
}
/** /**
* Update the color and make this action undoable. * Update the color and make this action undoable.
* @param {string} color * @param {string} color
@ -356,13 +368,7 @@ class HighlightEditor extends AnnotationEditor {
const setColorAndOpacity = (col, opa) => { const setColorAndOpacity = (col, opa) => {
this.color = col; this.color = col;
this.opacity = opa; this.opacity = opa;
this.parent?.drawLayer.updateProperties(this.#id, { this.onUpdatedColor();
root: {
fill: col,
"fill-opacity": opa,
},
});
this.#colorPicker?.updateColor(col);
}; };
const savedColor = this.color; const savedColor = this.color;
const savedOpacity = this.opacity; const savedOpacity = this.opacity;

View File

@ -28,6 +28,8 @@ class EditorToolbar {
#comment = null; #comment = null;
#commentButtonDivider = null;
#signatureDescriptionButton = null; #signatureDescriptionButton = null;
static #l10nRemove = null; static #l10nRemove = null;
@ -167,11 +169,12 @@ class EditorToolbar {
return; return;
} }
this.#addListenersToElement(button); this.#addListenersToElement(button);
const divider = (this.#commentButtonDivider = this.#divider);
if (!beforeElement) { if (!beforeElement) {
this.#buttons.append(button, this.#divider); this.#buttons.append(button, divider);
} else { } else {
this.#buttons.insertBefore(button, beforeElement); this.#buttons.insertBefore(button, beforeElement);
this.#buttons.insertBefore(this.#divider, beforeElement); this.#buttons.insertBefore(divider, beforeElement);
} }
this.#comment = comment; this.#comment = comment;
comment.toolbar = this; comment.toolbar = this;
@ -194,6 +197,17 @@ class EditorToolbar {
this.#buttons.append(button, this.#divider); this.#buttons.append(button, this.#divider);
} }
removeButton(name) {
switch (name) {
case "comment":
this.#comment?.removeToolbarCommentButton();
this.#comment = null;
this.#commentButtonDivider?.remove();
this.#commentButtonDivider = null;
break;
}
}
async addButton(name, tool) { async addButton(name, tool) {
switch (name) { switch (name) {
case "colorPicker": case "colorPicker":

View File

@ -1068,14 +1068,40 @@ class AnnotationEditorUIManager {
return !!this.#commentManager; return !!this.#commentManager;
} }
editComment(editor, position) { editComment(editor, posX, posY, options) {
this.#commentManager?.open(this, editor, position); this.#commentManager?.showDialog(this, editor, posX, posY, options);
} }
showComment(pageIndex, uid) { selectComment(pageIndex, uid) {
const layer = this.#allLayers.get(pageIndex); const layer = this.#allLayers.get(pageIndex);
const editor = layer?.getEditorByUID(uid); const editor = layer?.getEditorByUID(uid);
editor?.showComment(); editor?.toggleComment(/* isSelected */ true, /* visibility */ true);
}
updateComment(editor) {
this.#commentManager?.updateComment(editor.getData());
}
updatePopupColor(editor) {
this.#commentManager?.updatePopupColor(editor);
}
removeComment(editor) {
this.#commentManager?.removeComments([editor.uid]);
}
toggleComment(editor, isSelected, visibility = undefined) {
this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility);
}
makeCommentColor(color, opacity) {
return (
(color && this.#commentManager?.makeCommentColor(color, opacity)) || null
);
}
getCommentDialogElement() {
return this.#commentManager?.dialogElement || null;
} }
async waitForEditorsRendered(pageNumber) { async waitForEditorsRendered(pageNumber) {
@ -1821,22 +1847,28 @@ class AnnotationEditorUIManager {
if (this.#mode === AnnotationEditorType.POPUP) { if (this.#mode === AnnotationEditorType.POPUP) {
this.#commentManager?.hideSidebar(); this.#commentManager?.hideSidebar();
for (const editor of this.#allEditors.values()) {
editor.removeStandaloneCommentButton();
}
} }
this.#commentManager?.destroyPopup();
this.#mode = mode; this.#mode = mode;
if (mode === AnnotationEditorType.NONE) { if (mode === AnnotationEditorType.NONE) {
this.setEditingState(false); this.setEditingState(false);
this.#disableAll(); this.#disableAll();
for (const editor of this.#allEditors.values()) {
editor.hideStandaloneCommentButton();
}
this._editorUndoBar?.hide(); this._editorUndoBar?.hide();
this.toggleComment(/* editor = */ null);
this.#updateModeCapability.resolve(); this.#updateModeCapability.resolve();
return; return;
} }
for (const editor of this.#allEditors.values()) {
editor.addStandaloneCommentButton();
}
if (mode === AnnotationEditorType.SIGNATURE) { if (mode === AnnotationEditorType.SIGNATURE) {
await this.#signatureManager?.loadSignatures(); await this.#signatureManager?.loadSignatures();
} }
@ -1862,7 +1894,6 @@ class AnnotationEditorUIManager {
} }
if (hasComment && !deleted) { if (hasComment && !deleted) {
allComments.push(editor.getData()); allComments.push(editor.getData());
editor.addStandaloneCommentButton();
} }
} }
for (const annotation of this.#allEditableAnnotations) { for (const annotation of this.#allEditableAnnotations) {
@ -1891,7 +1922,7 @@ class AnnotationEditorUIManager {
} }
for (const editor of this.#allEditors.values()) { for (const editor of this.#allEditors.values()) {
if (editor.annotationElementId === editId || editor.id === editId) { if (editor.uid === editId) {
this.setSelected(editor); this.setSelected(editor);
if (editComment) { if (editComment) {
editor.editComment(); editor.editComment();

View File

@ -743,3 +743,4 @@
!tracemonkey_with_editable_annotations.pdf !tracemonkey_with_editable_annotations.pdf
!bug1980958.pdf !bug1980958.pdf
!tracemonkey_annotation_on_page_8.pdf !tracemonkey_annotation_on_page_8.pdf
!issue20232.pdf

BIN
test/pdfs/issue20232.pdf Normal file

Binary file not shown.

View File

@ -13020,5 +13020,12 @@
"md5": "ae4f643ee9bb0fd725277a9d1e0fb1df", "md5": "ae4f643ee9bb0fd725277a9d1e0fb1df",
"rounds": 1, "rounds": 1,
"type": "load" "type": "load"
},
{
"id": "issue20232",
"file": "pdfs/issue20232.pdf",
"md5": "cc53e96a8fd9eafbfbb74de564f37047",
"rounds": 1,
"type": "eq"
} }
] ]

View File

@ -142,7 +142,13 @@
pointer-events: none; pointer-events: none;
&.highlightEditing &.highlightEditing
:is(.freeTextEditor, .inkEditor, .stampEditor, .signatureEditor) { :is(
.freeTextEditor,
.inkEditor,
.stampEditor,
.signatureEditor,
.commentPopup
) {
pointer-events: auto; pointer-events: auto;
} }
} }

View File

@ -491,11 +491,16 @@ const PDFViewerApplication = {
eventBus eventBus
) )
: null; : null;
const ltr = appConfig.viewerContainer
? getComputedStyle(appConfig.viewerContainer).direction === "ltr"
: true;
const commentManager = const commentManager =
AppOptions.get("enableComment") && appConfig.editCommentDialog AppOptions.get("enableComment") && appConfig.editCommentDialog
? new CommentManager( ? new CommentManager(
appConfig.editCommentDialog, appConfig.editCommentDialog,
{ {
learnMoreUrl: AppOptions.get("commentLearnMoreUrl"),
sidebar: sidebar:
appConfig.annotationEditorParams?.editorCommentsSidebar || null, appConfig.annotationEditorParams?.editorCommentsSidebar || null,
commentsList: commentsList:
@ -515,7 +520,8 @@ const PDFViewerApplication = {
}, },
eventBus, eventBus,
linkService, linkService,
overlayManager overlayManager,
ltr
) )
: null; : null;

View File

@ -173,6 +173,14 @@ const defaultOptions = {
value: 200, value: 200,
kind: OptionKind.VIEWER + OptionKind.PREFERENCE, kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
}, },
commentLearnMoreUrl: {
/** @type {string} */
value:
typeof PDFJSDev === "undefined" || PDFJSDev.test("MOZCENTRAL")
? "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/pdf-comment"
: "",
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
},
cursorToolOnLoad: { cursorToolOnLoad: {
/** @type {number} */ /** @type {number} */
value: 0, value: 0,

View File

@ -13,75 +13,23 @@
* limitations under the License. * limitations under the License.
*/ */
.commentPopup,
#commentManagerDialog {
width: 360px;
max-width: 100%;
min-width: 200px;
position: absolute;
padding: 8px 16px 16px;
margin: 0;
box-sizing: border-box;
border-radius: 8px;
}
#commentManagerDialog { #commentManagerDialog {
--comment-actions-button-icon: url(images/comment-actionsButton.svg); --comment-actions-button-icon: url(images/comment-actionsButton.svg);
--comment-close-button-icon: url(images/comment-closeButton.svg); --comment-close-button-icon: url(images/comment-closeButton.svg);
--default-dialog-bg-color: #ffff98;
--dialog-base-color: var(--default-dialog-bg-color);
--dialog-bg-color: color-mix(in srgb, var(--dialog-base-color), white 30%);
--dialog-border-color: var(--dialog-base-color);
--menuitem-bg-color: transparent;
--menuitem-fg-color: black;
--menuitem-hover-bg-color: #3383e7;
--menuitem-hover-fg-color: white;
--comment-text-input-bg: white;
--comment-text-input-fg: black;
--comment-text-input-border: #0060df;
--comment-focus-outline-color: #0060df;
--hover-filter: brightness(0.9);
--text-primary-color: #15141a;
--button-secondary-bg-color: #f0f0f4;
--button-secondary-active-bg-color: color-mix(
in srgb,
var(--button-secondary-bg-color),
black 14%
);
--button-secondary-hover-bg-color: color-mix(
in srgb,
var(--button-secondary-bg-color),
black 7%
);
--button-primary-bg-color: #0060df;
--button-primary-fg-color: #fbfbfe;
--button-primary-active-bg-color: #0050c0;
--button-primary-hover-bg-color: #0250bb;
--menu-bg-color: rgb(253 250 244);
--menu-button-border-color: transparent;
--menu-button-focus-outline-color: var(--comment-text-input-border);
@media screen and (forced-colors: active) {
--hover-filter: none;
--text-primary-color: CanvasText;
--button-secondary-bg-color: HighlightText;
--button-secondary-active-bg-color: HighlightText;
--button-secondary-hover-bg-color: HighlightText;
--button-primary-bg-color: ButtonText;
--button-primary-fg-color: HighlightText;
--button-primary-active-bg-color: SelectedItem;
--button-primary-hover-bg-color: SelectedItem;
--menu-button-border-color: Canvas;
--menu-button-focus-outline-color: CanvasText;
}
width: 308px;
padding: 8px 16px 16px;
overflow: visible;
position: absolute;
margin: 0;
border-radius: 4px;
border: 1px solid var(--dialog-border-color);
background: var(--dialog-bg-color);
box-shadow: 0 2px 14px 0 rgb(58 57 68 / 0.2);
.mainContainer { .mainContainer {
width: 100%; width: 100%;
height: auto; height: auto;
@ -97,156 +45,20 @@
#commentManagerToolbar { #commentManagerToolbar {
width: 100%; width: 100%;
height: 32px;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
gap: 8px; gap: 8px;
align-self: stretch; align-self: stretch;
cursor: move; cursor: move;
> button {
color-scheme: light;
width: 24px;
height: 24px;
padding: 0;
border: none;
cursor: pointer;
&::before {
content: "";
display: inline-block;
width: 100%;
height: 100%;
mask-repeat: no-repeat;
mask-position: center;
}
&#commentActionsButton::before {
mask-image: var(--comment-actions-button-icon);
}
&#commentCloseButton::before {
mask-image: var(--comment-close-button-icon);
}
> span {
display: inline-block;
width: 0;
height: 0;
overflow: hidden;
}
}
menu {
width: max-content;
min-width: 90px;
display: flex;
flex-direction: column;
align-items: center;
gap: 1px;
padding: 5px 6px;
cursor: auto;
z-index: 1;
margin: 0;
position: absolute;
top: 8px;
right: -6.5px;
border-radius: 6px;
border: 0.5px solid #b4b4b6;
background-color: var(--menu-bg-color);
box-shadow:
1px -1px 0 0 #fff inset,
-1px 1px 0 0 #fff inset,
-1px -1px 0 0 #fff inset,
1px 1px 0 0 #fff inset,
0 0 15px 0 rgb(0 0 0 / 0.25);
button {
background-color: var(--menuitem-bg-color);
width: 100%;
height: 24px;
padding: 0;
box-sizing: border-box;
display: flex;
border: 2px solid var(--menu-button-border-color);
color: var(--menuitem-fg-color);
&:hover {
background-color: var(--menuitem-hover-bg-color);
color: var(--menuitem-hover-fg-color);
}
&:is(:focus-visible, :focus) {
outline: none;
border: 2px solid var(--menu-button-focus-outline-color);
}
&:disabled {
opacity: 0.5;
pointer-events: none;
}
span {
align-content: center;
width: 100%;
max-width: min-content;
padding-inline: 8px;
color: inherit;
text-align: start;
font: menu;
font-size: 15px;
font-weight: 400;
line-height: normal;
}
}
}
} }
#commentManagerTextInput { #commentManagerTextInput {
width: 100%; width: 100%;
min-height: 132px; min-height: 132px;
resize: none;
box-sizing: border-box;
margin-bottom: 12px; margin-bottom: 12px;
border-radius: 4px;
border: 2px solid var(--comment-text-input-border);
background-color: var(--comment-text-input-bg);
color: var(--comment-text-input-fg);
}
#commentManagerTextView {
width: 100%;
height: max-content;
resize: none;
box-sizing: border-box;
margin-bottom: 12px;
border: none;
background-color: transparent;
color: var(--comment-text-input-fg);
}
.dialogButtonsGroup {
gap: 8px;
#commentManagerSaveButton:disabled {
background-color: color-mix(
in srgb,
var(--button-primary-disabled-bg-color),
transparent 50%
);
border-color: color-mix(
in srgb,
var(--button-primary-disabled-border-color),
transparent 50%
);
opacity: 1;
}
} }
} }
} }
@ -279,12 +91,14 @@
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--comment-button-bg: Canvas; --comment-button-bg: Canvas;
--comment-button-fg: CanvasText; --comment-button-fg: ButtonText;
--comment-button-hover-bg: Highlight; --comment-button-hover-bg: Canvas;
--comment-button-hover-fg: ButtonFace; --comment-button-hover-fg: Highlight;
--comment-button-active-bg: Highlight; --comment-button-active-bg: Canvas;
--comment-button-active-fg: ButtonFace; --comment-button-active-fg: Highlight;
--comment-button-border-color: ButtonBorder; --comment-button-border-color: ButtonBorder;
--comment-button-active-border-color: ButtonBorder;
--comment-button-hover-border-color: Highlight;
--comment-button-box-shadow: none; --comment-button-box-shadow: none;
--comment-button-focus-outline-color: CanvasText; --comment-button-focus-outline-color: CanvasText;
--comment-button-selected-bg: ButtonBorder; --comment-button-selected-bg: ButtonBorder;
@ -358,36 +172,54 @@
} }
} }
.comment.sidebar { #editorCommentsSidebar,
.commentPopup {
--comment-close-button-icon: url(images/comment-closeButton.svg); --comment-close-button-icon: url(images/comment-closeButton.svg);
--comment-popup-edit-button-icon: url(images/comment-popup-editButton.svg);
--comment-popup-delete-button-icon: url(images/editor-toolbar-delete.svg);
--comment-date-fg-color: light-dark( --comment-date-fg-color: light-dark(
rgb(21 20 26 / 0.69), rgb(21 20 26 / 0.69),
rgb(251 251 254 / 0.69) rgb(251 251 254 / 0.69)
); );
--comment-bg-color: light-dark(#f9f9fb, #1c1b22); --comment-bg-color: light-dark(#f9f9fb, #1c1b22);
--comment-hover-bg-color: light-dark( --comment-hover-bg-color: light-dark(#e0e0e6, #2c2b33);
rgb(21 20 26 / 0.14), --comment-active-bg-color: light-dark(#d1d1d9, #3a3944);
rgb(251 251 254 / 0.14) --comment-hover-brightness: 0.89;
); --comment-hover-filter: brightness(var(--comment-hover-brightness));
--comment-active-bg-color: light-dark( --comment-active-brightness: 0.825;
rgb(21 20 26 / 0.21), --comment-active-filter: brightness(var(--comment-active-brightness));
rgb(251 251 254 / 0.21)
);
--comment-border-color: light-dark(#f0f0f4, #52525e); --comment-border-color: light-dark(#f0f0f4, #52525e);
--comment-focus-outline-color: light-dark(#0062fa, #00cadb); --comment-focus-outline-color: light-dark(#0062fa, #00cadb);
--comment-fg-color: light-dark(#15141a, #fbfbfe); --comment-fg-color: light-dark(#15141a, #fbfbfe);
--comment-count-bg-color: light-dark(#e2f7ff, #00317e); --comment-count-bg-color: light-dark(#e2f7ff, #00317e);
--comment-indicator-active-fg-color: light-dark(#0041a4, #a6ecf4); --comment-indicator-active-fg-color: light-dark(#0041a4, #a6ecf4);
--comment-indicator-active-filter: brightness(
calc(1 / var(--comment-active-brightness))
);
--comment-indicator-focus-fg-color: light-dark(#5b5b66, #fbfbfe); --comment-indicator-focus-fg-color: light-dark(#5b5b66, #fbfbfe);
--comment-indicator-hover-fg-color: light-dark(#0053cb, #61dce9); --comment-indicator-hover-fg-color: light-dark(#0053cb, #61dce9);
--comment-indicator-hover-filter: brightness(
calc(1 / var(--comment-hover-brightness))
);
--comment-indicator-selected-fg-color: light-dark(#0062fa, #00cadb); --comment-indicator-selected-fg-color: light-dark(#0062fa, #00cadb);
--button-comment-bg: transparent;
--button-comment-color: var(--main-color);
--button-comment-active-bg: light-dark(#cfcfd8, #5b5b66);
--button-comment-active-border: none;
--button-comment-active-color: var(--button-comment-color);
--button-comment-border: none;
--button-comment-hover-bg: light-dark(#e0e0e6, #52525e);
--button-comment-hover-color: var(--button-comment-color);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--comment-date-fg-color: CanvasText; --comment-date-fg-color: CanvasText;
--comment-bg-color: Canvas; --comment-bg-color: Canvas;
--comment-hover-bg-color: SelectedItemText; --comment-hover-bg-color: SelectedItemText;
--comment-hover-filter: none;
--comment-active-bg-color: SelectedItemText; --comment-active-bg-color: SelectedItemText;
--comment-active-filter: none;
--comment-border-color: CanvasText; --comment-border-color: CanvasText;
--comment-fg-color: CanvasText; --comment-fg-color: CanvasText;
--comment-count-bg-color: Canvas; --comment-count-bg-color: Canvas;
@ -395,8 +227,17 @@
--comment-indicator-focus-fg-color: CanvasText; --comment-indicator-focus-fg-color: CanvasText;
--comment-indicator-hover-fg-color: CanvasText; --comment-indicator-hover-fg-color: CanvasText;
--comment-indicator-selected-fg-color: SelectedItem; --comment-indicator-selected-fg-color: SelectedItem;
--button-comment-bg: HighlightText;
--button-comment-color: ButtonText;
--button-comment-active-bg: ButtonText;
--button-comment-active-color: HighlightText;
--button-comment-border: 1px solid ButtonText;
--button-comment-hover-bg: Highlight;
--button-comment-hover-color: HighlightText;
} }
}
#editorCommentsSidebar {
display: flex; display: flex;
width: 239px; width: 239px;
height: auto; height: auto;
@ -449,6 +290,7 @@
width: 32px; width: 32px;
height: 32px; height: 32px;
padding: 8px; padding: 8px;
border-radius: 4px;
border: none; border: none;
background: none; background: none;
cursor: pointer; cursor: pointer;
@ -472,6 +314,10 @@
background-color: var(--comment-active-bg-color); background-color: var(--comment-active-bg-color);
} }
&:focus-visible {
outline: var(--focus-ring-outline);
}
> span { > span {
display: inline-block; display: inline-block;
width: 0; width: 0;
@ -483,18 +329,18 @@
#editorCommentsSidebarListContainer { #editorCommentsSidebarListContainer {
overflow: scroll; overflow: scroll;
width: 100%;
#editorCommentsSidebarList { #editorCommentsSidebarList {
display: flex; display: flex;
width: auto; width: auto;
padding: 1px 16px 0; padding: 4px 16px;
gap: 10px; gap: 10px;
flex: 1 0 0; flex: 1 0 0;
align-self: stretch; align-self: stretch;
align-items: flex-start; align-items: flex-start;
flex-direction: column; flex-direction: column;
list-style-type: none; list-style-type: none;
overflow: scroll;
.sidebarComment { .sidebarComment {
display: flex; display: flex;
@ -511,20 +357,28 @@
&:not(.noComments) { &:not(.noComments) {
&:hover { &:hover {
background-color: var(--comment-hover-bg-color); @media screen and (forced-colors: active) {
background-color: var(--comment-hover-bg-color);
}
filter: var(--comment-hover-filter);
time::after { time::after {
display: inline-block; display: inline-block;
background-color: var(--comment-indicator-hover-fg-color); background-color: var(--comment-indicator-hover-fg-color);
filter: var(--comment-indicator-hover-filter);
} }
} }
&:active { &:active {
background-color: var(--comment-active-bg-color); @media screen and (forced-colors: active) {
background-color: var(--comment-active-bg-color);
}
filter: var(--comment-active-filter);
time::after { time::after {
display: inline-block; display: inline-block;
background-color: var(--comment-indicator-active-fg-color); background-color: var(--comment-indicator-active-fg-color);
filter: var(--comment-indicator-active-filter);
} }
} }
@ -565,12 +419,34 @@
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
overflow: hidden; overflow: hidden;
overflow-wrap: break-word; overflow-wrap: break-word;
.richText {
--total-scale-factor: 1.5;
}
} }
&.noComments .sidebarCommentText { &.noComments {
max-height: fit-content; .sidebarCommentText {
-webkit-line-clamp: unset; max-height: fit-content;
user-select: none; -webkit-line-clamp: unset;
user-select: none;
}
a {
font: menu;
font-style: normal;
font-weight: 400;
line-height: normal;
font-size: 15px;
width: 100%;
height: auto;
overflow-wrap: break-word;
margin-block-start: 15px;
&:focus-visible {
outline: var(--focus-ring-outline);
}
}
} }
time { time {
@ -600,3 +476,163 @@
} }
} }
} }
.commentPopup {
color-scheme: light dark;
--divider-color: light-dark(#cfcfd8, #3a3944);
--comment-shadow:
0 0.5px 2px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)),
0 4px 16px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
@media screen and (forced-colors: active) {
--divider-color: CanvasText;
--comment-shadow: none;
}
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 12px;
z-index: 100001; /* above selected annotation editor */
pointer-events: auto;
border: 0.5px solid var(--comment-border-color);
background: var(--comment-bg-color);
box-shadow: var(--comment-shadow);
&:focus-visible {
outline: none;
}
&.dragging {
cursor: move !important;
* {
cursor: move !important;
}
button {
pointer-events: none !important;
}
}
&:not(.selected) .commentPopupButtons {
visibility: hidden !important;
}
hr {
width: 100%;
height: 1px;
border: none;
border-top: 1px solid var(--divider-color);
margin: 0;
padding: 0;
}
.commentPopupTop {
display: flex;
width: 100%;
height: auto;
padding-bottom: 4px;
justify-content: space-between;
align-items: center;
align-self: stretch;
cursor: move;
user-select: none;
.commentPopupTime {
font: menu;
font-style: normal;
font-weight: 400;
line-height: normal;
font-size: 13px;
color: var(--comment-date-fg-color);
}
.commentPopupButtons {
display: flex;
align-items: center;
gap: 2px;
cursor: default;
> button {
width: 32px;
height: 32px;
padding: 8px;
border: none;
border-radius: 4px;
background-color: var(--button-comment-bg);
color: var(--button-comment-color);
&:hover {
background-color: var(--button-comment-hover-bg);
}
&:active {
border: var(--button-comment-active-border);
background-color: var(--button-comment-active-bg);
color: var(--button-comment-active-color);
&::before {
background-color: var(--button-comment-active-color);
}
}
&:focus-visible {
background-color: var(--button-comment-hover-bg);
outline: 2px solid var(--comment-focus-outline-color);
outline-offset: 0;
}
&::before {
content: "";
display: inline-block;
width: 100%;
height: 100%;
mask-repeat: no-repeat;
mask-position: center;
}
&.commentPopupEdit::before {
mask-image: var(--comment-popup-edit-button-icon);
}
&.commentPopupDelete::before {
mask-image: var(--comment-popup-delete-button-icon);
}
}
}
}
.commentPopupText {
width: 100%;
height: auto;
font: menu;
font-style: normal;
font-weight: 400;
line-height: normal;
font-size: 15px;
color: var(--comment-fg-color);
}
}
.commentPopupText,
.sidebarCommentText .richText {
margin-block: 0;
p:first-of-type {
margin-block: 0;
}
> * {
white-space: pre-wrap;
font-size: max(15px, calc(10px * var(--total-scale-factor)));
overflow-wrap: break-word;
}
span {
color: var(--comment-fg-color) !important;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.0189877 13.6645L0.612989 10.4635C0.687989 10.0545 0.884989 9.6805 1.18099 9.3825L9.98199 0.5805C10.756 -0.1925 12.015 -0.1945 12.792 0.5805L14.42 2.2085C15.194 2.9835 15.194 4.2435 14.42 5.0185L5.61599 13.8215C5.31999 14.1165 4.94599 14.3125 4.53799 14.3875L1.33599 14.9815C1.26599 14.9935 1.19799 15.0005 1.12999 15.0005C0.832989 15.0005 0.544988 14.8835 0.330988 14.6695C0.0679874 14.4055 -0.0490122 14.0305 0.0189877 13.6645ZM12.472 5.1965L13.632 4.0365L13.631 3.1885L11.811 1.3675L10.963 1.3685L9.80299 2.5285L12.472 5.1965ZM4.31099 13.1585C4.47099 13.1285 4.61799 13.0515 4.73399 12.9345L11.587 6.0815L8.91899 3.4135L2.06599 10.2655C1.94899 10.3835 1.87199 10.5305 1.84099 10.6915L1.36699 13.2485L1.75199 13.6335L4.31099 13.1585Z" fill="black"/>
</svg>
<!--path d="M0.0189877 14.1645L0.612989 10.9635C0.687989 10.5545 0.884989 10.1805 1.18099 9.8825L9.98199 1.0805C10.756 0.3075 12.015 0.3055 12.792 1.0805L14.42 2.7085C15.194 3.4835 15.194 4.7435 14.42 5.5185L5.61599 14.3215C5.31999 14.6165 4.94599 14.8125 4.53799 14.8875L1.33599 15.4815C1.26599 15.4935 1.19799 15.5005 1.12999 15.5005C0.832989 15.5005 0.544988 15.3835 0.330988 15.1695C0.0679874 14.9055 -0.0490122 14.5305 0.0189877 14.1645ZM12.472 5.6965L13.632 4.5365L13.631 3.6885L11.811 1.8675L10.963 1.8685L9.80299 3.0285L12.472 5.6965ZM4.31099 13.6585C4.47099 13.6285 4.61799 13.5515 4.73399 13.4345L11.587 6.5815L8.91899 3.9135L2.06599 10.7655C1.94899 10.8835 1.87199 11.0305 1.84099 11.1915L1.36699 13.7485L1.75199 14.1335L4.31099 13.6585Z" fill="black"/-->

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1057,6 +1057,7 @@ class PDFViewer {
enableHWA: this.#enableHWA, enableHWA: this.#enableHWA,
enableAutoLinking: this.#enableAutoLinking, enableAutoLinking: this.#enableAutoLinking,
minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas, minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas,
commentManager: this.#commentManager,
}); });
this._pages.push(pageView); this._pages.push(pageView);
} }

View File

@ -249,7 +249,7 @@ See https://github.com/adobe-type-tools/cmap-resources
<button id="editorCommentButton" class="toolbarButton" type="button" tabindex="0" disabled="disabled" role="radio" aria-expanded="false" aria-haspopup="true" aria-controls="editorCommentParamsToolbar" data-l10n-id="pdfjs-editor-comment-button"> <button id="editorCommentButton" class="toolbarButton" type="button" tabindex="0" disabled="disabled" role="radio" aria-expanded="false" aria-haspopup="true" aria-controls="editorCommentParamsToolbar" data-l10n-id="pdfjs-editor-comment-button">
<span data-l10n-id="pdfjs-editor-comment-button-label"></span> <span data-l10n-id="pdfjs-editor-comment-button-label"></span>
</button> </button>
<div class="editorParamsToolbar sidebar hidden menu" id="editorCommentParamsToolbar"> <div class="editorParamsToolbar hidden menu" id="editorCommentParamsToolbar">
<div id="editorCommentsSidebar" class="menuContainer comment sidebar" role="landmark" aria-labelledby="editorCommentsSidebarHeader"> <div id="editorCommentsSidebar" class="menuContainer comment sidebar" role="landmark" aria-labelledby="editorCommentsSidebarHeader">
<div id="editorCommentsSidebarHeader" role="heading" aria-level="2"> <div id="editorCommentsSidebarHeader" role="heading" aria-level="2">
<span class="commentCount"> <span class="commentCount">
@ -260,7 +260,7 @@ See https://github.com/adobe-type-tools/cmap-resources
<span data-l10n-id="pdfjs-editor-comments-sidebar-close-button-label"></span> <span data-l10n-id="pdfjs-editor-comments-sidebar-close-button-label"></span>
</button> </button>
</div> </div>
<div id="editorCommentsSidebarListContainer"> <div id="editorCommentsSidebarListContainer" tabindex="-1">
<ul id="editorCommentsSidebarList"></ul> <ul id="editorCommentsSidebarList"></ul>
</div> </div>
</div> </div>
@ -794,30 +794,16 @@ See https://github.com/adobe-type-tools/cmap-resources
<dialog class="dialog commentManager" id="commentManagerDialog"> <dialog class="dialog commentManager" id="commentManagerDialog">
<div class="mainContainer"> <div class="mainContainer">
<div id="commentManagerToolbar"> <div class="title" id="commentManagerToolbar">
<button id="commentActionsButton" class="toolbarButton" type="button" aria-expanded="false" aria-haspopup="true" aria-controls="commentActionsMenu" tabindex="0" data-l10n-id="pdfjs-editor-edit-comment-actions-button"> <span id="commentManagerTitle" role="sectionhead" data-l10n-id="pdfjs-editor-edit-comment-dialog-title-when-adding" tabindex="0"></span>
<span data-l10n-id="pdfjs-editor-edit-comment-actions-button-label"></span>
</button>
<menu class="hidden" role="menu" id="commentActionsMenu">
<button id="commentActionsEditButton" role="menuitem" type="button" tabindex="0">
<span data-l10n-id="pdfjs-editor-edit-comment-actions-edit-button-label"></span>
</button>
<button id="commentActionsDeleteButton" role="menuitem" type="button" tabindex="0">
<span data-l10n-id="pdfjs-editor-edit-comment-actions-delete-button-label"></span>
</button>
</menu>
<button id="commentCloseButton" class="toolbarButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-edit-comment-close-button">
<span data-l10n-id="pdfjs-editor-edit-comment-close-button-label"></span>
</button>
</div> </div>
<textarea class="hidden" id="commentManagerTextInput" data-l10n-id="pdfjs-editor-edit-comment-manager-text-input"></textarea> <textarea id="commentManagerTextInput" data-l10n-id="pdfjs-editor-edit-comment-dialog-text-input"></textarea>
<div class="hidden" id="commentManagerTextView"></div>
<div class="dialogButtonsGroup"> <div class="dialogButtonsGroup">
<button id="commentManagerCancelButton" type="button" class="secondaryButton" tabindex="0"> <button id="commentManagerCancelButton" type="button" class="secondaryButton" tabindex="0">
<span data-l10n-id="pdfjs-editor-edit-comment-manager-cancel-button"></span> <span data-l10n-id="pdfjs-editor-edit-comment-dialog-cancel-button"></span>
</button> </button>
<button id="commentManagerSaveButton" type="button" class="primaryButton" disabled tabindex="0"> <button id="commentManagerSaveButton" type="button" class="primaryButton" disabled tabindex="0">
<span data-l10n-id="pdfjs-editor-edit-comment-manager-save-button"></span> <span data-l10n-id="pdfjs-editor-edit-comment-dialog-save-button"></span>
</button> </button>
</div> </div>
</div> </div>

View File

@ -282,13 +282,8 @@ function getViewerConfiguration() {
editCommentDialog: { editCommentDialog: {
dialog: document.getElementById("commentManagerDialog"), dialog: document.getElementById("commentManagerDialog"),
toolbar: document.getElementById("commentManagerToolbar"), toolbar: document.getElementById("commentManagerToolbar"),
actions: document.getElementById("commentActionsButton"), title: document.getElementById("commentManagerTitle"),
menu: document.getElementById("commentActionsMenu"),
editMenuItem: document.getElementById("commentActionsEditButton"),
deleteMenuItem: document.getElementById("commentActionsDeleteButton"),
closeButton: document.getElementById("commentCloseButton"),
textInput: document.getElementById("commentManagerTextInput"), textInput: document.getElementById("commentManagerTextInput"),
textView: document.getElementById("commentManagerTextView"),
cancelButton: document.getElementById("commentManagerCancelButton"), cancelButton: document.getElementById("commentManagerCancelButton"),
saveButton: document.getElementById("commentManagerSaveButton"), saveButton: document.getElementById("commentManagerSaveButton"),
}, },