Merge branch 'master' into scientific

This commit is contained in:
calixteman 2026-02-27 18:39:44 +01:00 committed by GitHub
commit 9c3a752388
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 680 additions and 128 deletions

49
.github/workflows/update_locales.yml vendored Normal file
View File

@ -0,0 +1,49 @@
name: Update locales
on:
schedule:
- cron: "0 0 * * 5" # Every Friday at midnight UTC
workflow_dispatch: # Allow manual triggering
permissions:
contents: write
pull-requests: write
jobs:
update-locales:
name: Update locales
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Use Node.js LTS
uses: actions/setup-node@v6
with:
node-version: lts/*
- name: Install dependencies
run: npm ci
- name: Import translations from mozilla-central
run: npx gulp importl10n
- name: Create Pull Request
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [ -z "$(git status --porcelain l10n/)" ]; then
echo "No locale changes to commit."
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git switch -C update-locales
git add l10n/
git commit -m "l10n: Update locale files"
git push --force origin update-locales
gh pr create \
--title "l10n: Update locale files" \
--body "Automated weekly update of locale files from mozilla-central." \
--label l10n || true

View File

@ -91,7 +91,7 @@ async function downloadL10n(root) {
await downloadLanguageFiles(root, langCode);
}
const removeCodes = [];
const rmCodes = [];
for (const entry of fs.readdirSync(root)) {
const dirPath = path.join(root, entry),
stat = fs.lstatSync(dirPath);
@ -101,14 +101,13 @@ async function downloadL10n(root) {
entry !== DEFAULT_LOCALE &&
!langCodes.includes(entry)
) {
removeCodes.push(entry);
fs.rmSync(dirPath, { recursive: true, force: true });
rmCodes.push(entry);
}
}
if (removeCodes.length) {
if (rmCodes.length) {
console.log(
"\nConsider removing the following unmaintained locales:\n" +
removeCodes.join(", ") +
"\n"
`\nRemoved the following unmaintained locales: ${rmCodes.join(", ")}\n`
);
}
}

View File

@ -537,6 +537,7 @@ pdfjs-editor-undo-bar-message-freetext = Тэкст выдалены
pdfjs-editor-undo-bar-message-ink = Малюнак выдалены
pdfjs-editor-undo-bar-message-stamp = Відарыс выдалены
pdfjs-editor-undo-bar-message-signature = Подпіс выдалены
pdfjs-editor-undo-bar-message-comment = Каментарый выдалены
# Variables:
# $count (Number) - the number of removed annotations.
pdfjs-editor-undo-bar-message-multiple =
@ -644,24 +645,71 @@ pdfjs-editor-add-comment-button =
## - layers.
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
pdfjs-toggle-views-manager-button =
.title = Паказаць/схаваць бакавую панэль
pdfjs-toggle-views-manager-notification-button =
.title = Паказаць/схаваць бакавую панэль (дакумент мае мініяцюры/змест/далучэнні/пласты)
pdfjs-toggle-views-manager-button-label = Паказаць/схаваць бакавую панэль
pdfjs-views-manager-sidebar =
.aria-label = Бакавая панэль
pdfjs-views-manager-view-selector-button =
.title = Выгляд
pdfjs-views-manager-view-selector-button-label = Выгляд
pdfjs-views-manager-pages-title = Старонкі
pdfjs-views-manager-outlines-title = Структура дакумента
pdfjs-views-manager-attachments-title = Далучэнні
pdfjs-views-manager-layers-title = Пласты
pdfjs-views-manager-pages-option-label = Старонкі
pdfjs-views-manager-outlines-option-label = Структура дакумента
pdfjs-views-manager-attachments-option-label = Далучэнні
pdfjs-views-manager-layers-option-label = Пласты
pdfjs-views-manager-add-file-button =
.title = Дадаць файл
pdfjs-views-manager-add-file-button-label = Дадаць файл
# Variables:
# $count (Number) - the number of selected pages.
pdfjs-views-manager-pages-status-action-label =
{ $count ->
[one] Вылучана { $count }
[few] Вылучаны { $count }
*[many] Вылучана { $count }
}
pdfjs-views-manager-pages-status-none-action-label = Выбраць старонкі
pdfjs-views-manager-pages-status-action-button-label = Кіраваць
pdfjs-views-manager-pages-status-copy-button-label = Капіяваць
pdfjs-views-manager-pages-status-cut-button-label = Выразаць
pdfjs-views-manager-pages-status-delete-button-label = Выдаліць
pdfjs-views-manager-pages-status-save-as-button-label = Захаваць як…
# Variables:
# $count (Number) - the number of selected pages to be cut.
pdfjs-views-manager-status-undo-cut-label =
{ $count ->
[one] Выразана { $count } старонка
[few] Выразана { $count } старонкі
*[many] Выразана { $count } старонак
}
# Variables:
# $count (Number) - the number of selected pages to be copied.
pdfjs-views-manager-pages-status-undo-copy-label =
{ $count ->
[one] Скапіравана { $count } старонка
[few] Скапіравана { $count } старонкі
*[many] Скапіравана { $count } старонак
}
# Variables:
# $count (Number) - the number of selected pages to be deleted.
pdfjs-views-manager-pages-status-undo-delete-label =
{ $count ->
[one] Выдалена { $count } старонка
[few] Выдалена { $count } старонкі
*[many] Выдалена { $count } старонак
}
pdfjs-views-manager-pages-status-waiting-ready-label = Рыхтуецца ваш файл…
pdfjs-views-manager-pages-status-waiting-uploading-label = Зацягваецца файл…
pdfjs-views-manager-status-warning-cut-label = Не ўдалося выразаць. Абнавіце старонку і паспрабуйце зноў.
pdfjs-views-manager-status-warning-copy-label = Не ўдалося скапіяваць. Абнавіце старонку і паспрабуйце зноў.
pdfjs-views-manager-status-warning-delete-label = Не ўдалося выдаліць. Абнавіце старонку і паспрабуйце зноў.
pdfjs-views-manager-status-warning-save-label = Не ўдалося захаваць. Абнавіце старонку і паспрабуйце зноў.
pdfjs-views-manager-status-undo-button-label = Адмяніць
pdfjs-views-manager-status-close-button =
.title = Закрыць

View File

@ -706,6 +706,7 @@ pdfjs-views-manager-status-undo-button-label = Rückgängig
pdfjs-views-manager-status-close-button =
.title = Schließen
pdfjs-views-manager-status-close-button-label = Schließen
pdfjs-views-manager-paste-button-label = Einfügen
## Main menu for adding/removing signatures

View File

@ -534,6 +534,7 @@ pdfjs-editor-undo-bar-message-freetext = Το κείμενο αφαιρέθηκ
pdfjs-editor-undo-bar-message-ink = Το σχέδιο αφαιρέθηκε
pdfjs-editor-undo-bar-message-stamp = Η εικόνα αφαιρέθηκε
pdfjs-editor-undo-bar-message-signature = Η υπογραφή αφαιρέθηκε
pdfjs-editor-undo-bar-message-comment = Το σχόλιο αφαιρέθηκε
# Variables:
# $count (Number) - the number of removed annotations.
pdfjs-editor-undo-bar-message-multiple =
@ -642,6 +643,8 @@ pdfjs-editor-add-comment-button =
pdfjs-toggle-views-manager-button =
.title = (Απ)ενεργοποίηση πλαϊνής γραμμής
pdfjs-toggle-views-manager-notification-button =
.title = (Απ)ενεργοποίηση πλαϊνής γραμμής (το έγγραφο περιέχει μικρογραφίες/περίγραμμα/συνημμένα/επίπεδα)
pdfjs-toggle-views-manager-button-label = (Απ)ενεργοποίηση πλαϊνής γραμμής
pdfjs-views-manager-sidebar =
.aria-label = Πλαϊνή γραμμή

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Thumbnail of Page { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Select page { $page }
## Find panel button title and messages
@ -648,6 +652,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Toggle Sidebar
pdfjs-views-manager-sidebar =
.aria-label = Sidebar
pdfjs-views-manager-sidebar-resizer =
.aria-label = Sidebar resizer
pdfjs-views-manager-view-selector-button =
.title = Views
pdfjs-views-manager-view-selector-button-label = Views
@ -706,6 +712,7 @@ pdfjs-views-manager-status-undo-button-label = Undo
pdfjs-views-manager-status-close-button =
.title = Close
pdfjs-views-manager-status-close-button-label = Close
pdfjs-views-manager-paste-button-label = Paste
## Main menu for adding/removing signatures

View File

@ -192,8 +192,9 @@ pdfjs-additional-layers = Additional Layers
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-title =
.title = Page { $page }
# $total (Number) - the number of pages
pdfjs-thumb-page-title1 =
.title = Page { $page } of { $total }
# Variables:
# $page (Number) - the page number
@ -202,8 +203,8 @@ pdfjs-thumb-page-canvas =
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Select page { $page }
pdfjs-thumb-page-checkbox1 =
.title = Select page { $page }
## Find panel button title and messages
@ -690,11 +691,11 @@ pdfjs-editor-add-comment-button =
## - layers.
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
pdfjs-toggle-views-manager-button =
.title = Toggle Sidebar
pdfjs-toggle-views-manager-button1 =
.title = Manage pages
pdfjs-toggle-views-manager-notification-button =
.title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)
pdfjs-toggle-views-manager-button-label = Toggle Sidebar
pdfjs-toggle-views-manager-button1-label = Manage pages
pdfjs-views-manager-sidebar =
.aria-label = Sidebar

View File

@ -706,6 +706,7 @@ pdfjs-views-manager-status-undo-button-label = Deshacer
pdfjs-views-manager-status-close-button =
.title = Cerrar
pdfjs-views-manager-status-close-button-label = Cerrar
pdfjs-views-manager-paste-button-label = Pegar
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Vignette de la page { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Sélectionner la page { $page }
## Find panel button title and messages
@ -644,6 +648,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Afficher/Masquer le panneau latéral
pdfjs-views-manager-sidebar =
.aria-label = Panneau latéral
pdfjs-views-manager-sidebar-resizer =
.aria-label = Redimensionner le panneau latéral
pdfjs-views-manager-view-selector-button =
.title = Vues
pdfjs-views-manager-view-selector-button-label = Vues
@ -702,6 +708,7 @@ pdfjs-views-manager-status-undo-button-label = Annuler
pdfjs-views-manager-status-close-button =
.title = Fermer
pdfjs-views-manager-status-close-button-label = Fermer
pdfjs-views-manager-paste-button-label = Coller
## Main menu for adding/removing signatures

View File

@ -534,6 +534,7 @@ pdfjs-editor-undo-bar-message-freetext = Tekst fuortsmiten
pdfjs-editor-undo-bar-message-ink = Tekening fuortsmiten
pdfjs-editor-undo-bar-message-stamp = Ofbylding fuortsmiten
pdfjs-editor-undo-bar-message-signature = Hantekening fuortsmiten
pdfjs-editor-undo-bar-message-comment = Opmerking fuortsmiten
# Variables:
# $count (Number) - the number of removed annotations.
pdfjs-editor-undo-bar-message-multiple =

View File

@ -647,6 +647,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Emoambue tenda yke
pdfjs-views-manager-sidebar =
.aria-label = Taãngarupa yke
pdfjs-views-manager-sidebar-resizer =
.aria-label = Tuichakue mongueha tenda yképe
pdfjs-views-manager-view-selector-button =
.title = Hechaha
pdfjs-views-manager-view-selector-button-label = Hechaha
@ -705,6 +707,7 @@ pdfjs-views-manager-status-undo-button-label = Mboguevi
pdfjs-views-manager-status-close-button =
.title = Mboty
pdfjs-views-manager-status-close-button-label = Mboty
pdfjs-views-manager-paste-button-label = Mboja
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = תצוגה מקדימה של עמוד { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = בחירת עמוד { $page }
## Find panel button title and messages
@ -648,6 +652,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = החלפת תצוגת סרגל צד
pdfjs-views-manager-sidebar =
.aria-label = סרגל צד
pdfjs-views-manager-sidebar-resizer =
.aria-label = שינוי גודל סרגל הצד
pdfjs-views-manager-view-selector-button =
.title = תצוגות
pdfjs-views-manager-view-selector-button-label = תצוגות
@ -706,6 +712,7 @@ pdfjs-views-manager-status-undo-button-label = ביטול פעולה
pdfjs-views-manager-status-close-button =
.title = סגירה
pdfjs-views-manager-status-close-button-label = סגירה
pdfjs-views-manager-paste-button-label = הדבקה
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Miniatura strony { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Stronu { $page } wubrać
## Find panel button title and messages
@ -722,6 +726,7 @@ pdfjs-views-manager-status-undo-button-label = Cofnyć
pdfjs-views-manager-status-close-button =
.title = Začinić
pdfjs-views-manager-status-close-button-label = Začinić
pdfjs-views-manager-paste-button-label = Zasadźić
## Main menu for adding/removing signatures

View File

@ -706,6 +706,7 @@ pdfjs-views-manager-status-undo-button-label = Disfacer
pdfjs-views-manager-status-close-button =
.title = Clauder
pdfjs-views-manager-status-close-button-label = Clauder
pdfjs-views-manager-paste-button-label = Collar
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Miniatura della pagina { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Seleziona pagina { $page }
## Find panel button title and messages
@ -648,6 +652,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Attiva/disattiva barra laterale
pdfjs-views-manager-sidebar =
.aria-label = Barra laterale
pdfjs-views-manager-sidebar-resizer =
.aria-label = Regolatore della larghezza della barra laterale
pdfjs-views-manager-view-selector-button =
.title = Viste
pdfjs-views-manager-view-selector-button-label = Viste
@ -706,6 +712,7 @@ pdfjs-views-manager-status-undo-button-label = Annulla
pdfjs-views-manager-status-close-button =
.title = Chiudi
pdfjs-views-manager-status-close-button-label = Chiudi
pdfjs-views-manager-paste-button-label = Incolla
## Main menu for adding/removing signatures
@ -720,4 +727,3 @@ pdfjs-editor-add-signature-edit-button-label = Modifica descrizione
## Edit signature description dialog
pdfjs-editor-edit-signature-dialog-title = Modifica descrizione

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = { $page } парағы үшін кіші көрінісі
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = { $page } бетін таңдау
## Find panel button title and messages
@ -648,6 +652,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Бүйір панелін көрсету/жасыру
pdfjs-views-manager-sidebar =
.aria-label = Бүйір панелі
pdfjs-views-manager-sidebar-resizer =
.aria-label = Бүйір панелінің өлшемін өзгертуші
pdfjs-views-manager-view-selector-button =
.title = Көріністер
pdfjs-views-manager-view-selector-button-label = Көріністер
@ -706,6 +712,7 @@ pdfjs-views-manager-status-undo-button-label = Болдырмау
pdfjs-views-manager-status-close-button =
.title = Жабу
pdfjs-views-manager-status-close-button-label = Жабу
pdfjs-views-manager-paste-button-label = Кірістіру
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = { $page } 페이지 미리보기
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = { $page } 페이지 선택
## Find panel button title and messages
@ -632,6 +636,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = 사이드바 표시/숨기기
pdfjs-views-manager-sidebar =
.aria-label = 사이드바
pdfjs-views-manager-sidebar-resizer =
.aria-label = 사이드바 크기 조정
pdfjs-views-manager-view-selector-button =
.title = 보기
pdfjs-views-manager-view-selector-button-label = 보기
@ -674,6 +680,7 @@ pdfjs-views-manager-status-undo-button-label = 실행 취소
pdfjs-views-manager-status-close-button =
.title = 닫기
pdfjs-views-manager-status-close-button-label = 닫기
pdfjs-views-manager-paste-button-label = 붙여넣기
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Miniatuur van pagina { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Pagina { $page } selecteren
## Find panel button title and messages
@ -648,6 +652,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Zijbalk in-/uitschakelen
pdfjs-views-manager-sidebar =
.aria-label = Zijbalk
pdfjs-views-manager-sidebar-resizer =
.aria-label = Groottewijziging zijbalk
pdfjs-views-manager-view-selector-button =
.title = Weergaven
pdfjs-views-manager-view-selector-button-label = Weergaven
@ -706,6 +712,7 @@ pdfjs-views-manager-status-undo-button-label = Ongedaan maken
pdfjs-views-manager-status-close-button =
.title = Sluiten
pdfjs-views-manager-status-close-button-label = Sluiten
pdfjs-views-manager-paste-button-label = Plakken
## Main menu for adding/removing signatures

View File

@ -706,6 +706,7 @@ pdfjs-views-manager-status-undo-button-label = Angre
pdfjs-views-manager-status-close-button =
.title = Lat att
pdfjs-views-manager-status-close-button-label = Lat att
pdfjs-views-manager-paste-button-label = Lim inn
## Main menu for adding/removing signatures

View File

@ -536,6 +536,7 @@ pdfjs-editor-undo-bar-message-freetext = Usunięto tekst
pdfjs-editor-undo-bar-message-ink = Usunięto rysunek
pdfjs-editor-undo-bar-message-stamp = Usunięto obraz
pdfjs-editor-undo-bar-message-signature = Usunięto podpis
pdfjs-editor-undo-bar-message-comment = Usunięto komentarz
# Variables:
# $count (Number) - the number of removed annotations.
pdfjs-editor-undo-bar-message-multiple =
@ -636,6 +637,83 @@ pdfjs-editor-edit-comment-dialog-cancel-button = Anuluj
pdfjs-editor-add-comment-button =
.title = Dodaj komentarz
## The view manager is a sidebar displaying different views:
## - thumbnails;
## - outline;
## - attachments;
## - layers.
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
pdfjs-toggle-views-manager-button =
.title = Przełącz panel boczny
pdfjs-toggle-views-manager-notification-button =
.title = Przełącz panel boczny (dokument zawiera miniatury/konspekt/załączniki/warstwy)
pdfjs-toggle-views-manager-button-label = Przełącz panel boczny
pdfjs-views-manager-sidebar =
.aria-label = Panel boczny
pdfjs-views-manager-view-selector-button =
.title = Widoki
pdfjs-views-manager-view-selector-button-label = Widoki
pdfjs-views-manager-pages-title = Strony
pdfjs-views-manager-outlines-title = Konspekt dokumentu
pdfjs-views-manager-attachments-title = Załączniki
pdfjs-views-manager-layers-title = Warstwy
pdfjs-views-manager-pages-option-label = Strony
pdfjs-views-manager-outlines-option-label = Konspekt dokumentu
pdfjs-views-manager-attachments-option-label = Załączniki
pdfjs-views-manager-layers-option-label = Warstwy
pdfjs-views-manager-add-file-button =
.title = Dodaj plik
pdfjs-views-manager-add-file-button-label = Dodaj plik
# Variables:
# $count (Number) - the number of selected pages.
pdfjs-views-manager-pages-status-action-label =
{ $count ->
[one] { $count } zaznaczona
[few] { $count } zaznaczone
*[many] { $count } zaznaczonych
}
pdfjs-views-manager-pages-status-none-action-label = Zaznacz strony
pdfjs-views-manager-pages-status-action-button-label = Zarządzaj
pdfjs-views-manager-pages-status-copy-button-label = Kopiuj
pdfjs-views-manager-pages-status-cut-button-label = Wytnij
pdfjs-views-manager-pages-status-delete-button-label = Usuń
pdfjs-views-manager-pages-status-save-as-button-label = Zapisz jako…
# Variables:
# $count (Number) - the number of selected pages to be cut.
pdfjs-views-manager-status-undo-cut-label =
{ $count ->
[one] Wycięto 1 stronę
[few] Wycięto { $count } strony
*[many] Wycięto { $count } stron
}
# Variables:
# $count (Number) - the number of selected pages to be copied.
pdfjs-views-manager-pages-status-undo-copy-label =
{ $count ->
[one] Skopiowano 1 stronę
[few] Skopiowano { $count } strony
*[many] Skopiowano { $count } stron
}
# Variables:
# $count (Number) - the number of selected pages to be deleted.
pdfjs-views-manager-pages-status-undo-delete-label =
{ $count ->
[one] Usunięto 1 stronę
[few] Usunięto { $count } strony
*[many] Usunięto { $count } stron
}
pdfjs-views-manager-pages-status-waiting-ready-label = Przygotowywanie pliku…
pdfjs-views-manager-pages-status-waiting-uploading-label = Przesyłanie pliku…
pdfjs-views-manager-status-warning-cut-label = Nie udało się wyciąć. Odśwież stronę i spróbuj ponownie.
pdfjs-views-manager-status-warning-copy-label = Nie udało się skopiować. Odśwież stronę i spróbuj ponownie.
pdfjs-views-manager-status-warning-delete-label = Nie udało się usunąć. Odśwież stronę i spróbuj ponownie.
pdfjs-views-manager-status-warning-save-label = Nie udało się zachować. Odśwież stronę i spróbuj ponownie.
pdfjs-views-manager-status-undo-button-label = Cofnij
pdfjs-views-manager-status-close-button =
.title = Zamknij
pdfjs-views-manager-status-close-button-label = Zamknij
## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 =

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Миниатюра страницы { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Выбрать страницу { $page }
## Find panel button title and messages
@ -652,6 +656,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Показать/скрыть боковую панель
pdfjs-views-manager-sidebar =
.aria-label = Боковая панель
pdfjs-views-manager-sidebar-resizer =
.aria-label = Изменение размера боковой панели
pdfjs-views-manager-view-selector-button =
.title = Вид
pdfjs-views-manager-view-selector-button-label = Вид
@ -714,6 +720,7 @@ pdfjs-views-manager-status-undo-button-label = Отменить
pdfjs-views-manager-status-close-button =
.title = Закрыть
pdfjs-views-manager-status-close-button-label = Закрыть
pdfjs-views-manager-paste-button-label = Вставить
## Main menu for adding/removing signatures

View File

@ -540,6 +540,7 @@ pdfjs-editor-undo-bar-message-freetext = Besedilo odstranjeno
pdfjs-editor-undo-bar-message-ink = Risba odstranjena
pdfjs-editor-undo-bar-message-stamp = Slika odstranjena
pdfjs-editor-undo-bar-message-signature = Podpis odstranjen
pdfjs-editor-undo-bar-message-comment = Komentar odstranjen
# Variables:
# $count (Number) - the number of removed annotations.
pdfjs-editor-undo-bar-message-multiple =

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Miniatyr av sida { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Välj sida { $page }
## Find panel button title and messages
@ -648,6 +652,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Visa/dölj sidofält
pdfjs-views-manager-sidebar =
.aria-label = Sidofält
pdfjs-views-manager-sidebar-resizer =
.aria-label = Storleksändring av sidofält
pdfjs-views-manager-view-selector-button =
.title = Vyer
pdfjs-views-manager-view-selector-button-label = Vyer
@ -706,6 +712,7 @@ pdfjs-views-manager-status-undo-button-label = Ångra
pdfjs-views-manager-status-close-button =
.title = Stäng
pdfjs-views-manager-status-close-button-label = Stäng
pdfjs-views-manager-paste-button-label = Klistra in
## Main menu for adding/removing signatures

View File

@ -288,9 +288,13 @@ pdfjs-web-fonts-disabled = Вебшрифти вимкнено: неможлив
pdfjs-editor-free-text-button =
.title = Текст
pdfjs-editor-color-picker-free-text-input =
.title = Змінити колір тексту
pdfjs-editor-free-text-button-label = Текст
pdfjs-editor-ink-button =
.title = Малювати
pdfjs-editor-color-picker-ink-input =
.title = Змінити колір малюнка
pdfjs-editor-ink-button-label = Малювати
pdfjs-editor-stamp-button =
.title = Додати чи редагувати зображення
@ -302,6 +306,14 @@ pdfjs-highlight-floating-button1 =
.title = Підсвітити
.aria-label = Підсвітити
pdfjs-highlight-floating-button-label = Підсвітити
pdfjs-comment-floating-button =
.title = Коментувати
.aria-label = Коментувати
pdfjs-comment-floating-button-label = Коментувати
pdfjs-editor-comment-button =
.title = Коментар
.aria-label = Коментар
pdfjs-editor-comment-button-label = Коментар
pdfjs-editor-signature-button =
.title = Додати підпис
pdfjs-editor-signature-button-label = Додати підпис
@ -364,6 +376,22 @@ pdfjs-editor-add-saved-signature-button =
pdfjs-free-text2 =
.aria-label = Текстовий редактор
.default-content = Напишіть щось…
# Used to show how many comments are present in the pdf file.
# Variables:
# $count (Number) - the number of comments.
pdfjs-editor-comments-sidebar-title =
{ $count ->
[one] Коментар
[few] Коментарі
*[many] Коментарі
}
pdfjs-editor-comments-sidebar-close-button =
.title = Закрити бічну панель
.aria-label = Закрити бічну панель
pdfjs-editor-comments-sidebar-close-button-label = Закрити бічну панель
# Instructional copy to add a comment by selecting text or an annotations.
pdfjs-editor-comments-sidebar-no-comments1 = Бачите щось варте уваги? Підсвітіть і додайте коментар.
pdfjs-editor-comments-sidebar-no-comments-link = Докладніше
## Alt-text dialog
@ -494,6 +522,14 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Показувати
pdfjs-editor-alt-text-settings-show-dialog-description = Допомагає переконатися, що всі ваші зображення мають альтернативний текст.
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
pdfjs-editor-undo-bar-message-highlight = Підсвічення вилучено
@ -501,6 +537,7 @@ pdfjs-editor-undo-bar-message-freetext = Текст вилучено
pdfjs-editor-undo-bar-message-ink = Малюнок вилучено
pdfjs-editor-undo-bar-message-stamp = Зображення вилучено
pdfjs-editor-undo-bar-message-signature = Підпис вилучено
pdfjs-editor-undo-bar-message-comment = Коментар вилучено
# Variables:
# $count (Number) - the number of removed annotations.
pdfjs-editor-undo-bar-message-multiple =
@ -563,6 +600,8 @@ pdfjs-editor-add-signature-save-checkbox = Зберегти підпис
pdfjs-editor-add-signature-save-warning-message = Ви досягли ліміту в 5 збережених підписів. Вилучіть один, щоб зберегти інший.
pdfjs-editor-add-signature-image-upload-error-title = Не вдалося вивантажити зображення
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 = Закрити
## Dialog buttons
@ -571,6 +610,111 @@ pdfjs-editor-add-signature-cancel-button = Скасувати
pdfjs-editor-add-signature-add-button = Додати
pdfjs-editor-edit-signature-update-button = Оновити
## Comment popup
pdfjs-editor-edit-comment-popup-button-label = Редагувати коментар
pdfjs-editor-edit-comment-popup-button =
.title = Редагувати коментар
pdfjs-editor-delete-comment-popup-button-label = Вилучити коментар
pdfjs-editor-delete-comment-popup-button =
.title = Вилучити коментар
pdfjs-show-comment-button =
.title = Показати коментар
## Edit a comment dialog
# An existing comment is edited
pdfjs-editor-edit-comment-dialog-title-when-editing = Редагувати коментар
pdfjs-editor-edit-comment-dialog-save-button-when-editing = Оновити
# No existing comment
pdfjs-editor-edit-comment-dialog-title-when-adding = Додати коментар
pdfjs-editor-edit-comment-dialog-save-button-when-adding = Додати
pdfjs-editor-edit-comment-dialog-text-input =
.placeholder = Почніть вводити…
pdfjs-editor-edit-comment-dialog-cancel-button = Скасувати
## Edit a comment button in the editor toolbar
pdfjs-editor-add-comment-button =
.title = Додати коментар
## The view manager is a sidebar displaying different views:
## - thumbnails;
## - outline;
## - attachments;
## - layers.
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
pdfjs-toggle-views-manager-button =
.title = Перемкнути бічну панель
pdfjs-toggle-views-manager-notification-button =
.title = Перемкнути бічну панель (документ містить мініатюри/ескіз/вкладення/шари)
pdfjs-toggle-views-manager-button-label = Перемкнути бічну панель
pdfjs-views-manager-sidebar =
.aria-label = Бічна панель
pdfjs-views-manager-view-selector-button =
.title = Вигляд
pdfjs-views-manager-view-selector-button-label = Вигляд
pdfjs-views-manager-pages-title = Сторінки
pdfjs-views-manager-outlines-title = Схема документа
pdfjs-views-manager-attachments-title = Вкладення
pdfjs-views-manager-layers-title = Шари
pdfjs-views-manager-pages-option-label = Сторінки
pdfjs-views-manager-outlines-option-label = Схема документа
pdfjs-views-manager-attachments-option-label = Вкладення
pdfjs-views-manager-layers-option-label = Шари
pdfjs-views-manager-add-file-button =
.title = Додати файл
pdfjs-views-manager-add-file-button-label = Додати файл
# Variables:
# $count (Number) - the number of selected pages.
pdfjs-views-manager-pages-status-action-label =
{ $count ->
[one] Вибрано { $count }
[few] Вибрано { $count }
*[many] Вибрано { $count }
}
pdfjs-views-manager-pages-status-none-action-label = Вибрати сторінки
pdfjs-views-manager-pages-status-action-button-label = Керувати
pdfjs-views-manager-pages-status-copy-button-label = Копіювати
pdfjs-views-manager-pages-status-cut-button-label = Вирізати
pdfjs-views-manager-pages-status-delete-button-label = Видалити
pdfjs-views-manager-pages-status-save-as-button-label = Зберегти як…
# Variables:
# $count (Number) - the number of selected pages to be cut.
pdfjs-views-manager-status-undo-cut-label =
{ $count ->
[one] 1 сторінку вирізано
[few] { $count } сторінки вирізано
*[many] { $count } сторінок вирізано
}
# Variables:
# $count (Number) - the number of selected pages to be copied.
pdfjs-views-manager-pages-status-undo-copy-label =
{ $count ->
[one] 1 сторінку скопійовано
[few] { $count } сторінки скопійовано
*[many] { $count } сторінок скопійовано
}
# Variables:
# $count (Number) - the number of selected pages to be deleted.
pdfjs-views-manager-pages-status-undo-delete-label =
{ $count ->
[one] 1 сторінку видалено
[few] { $count } сторінки видалено
*[many] { $count } сторінок видалено
}
pdfjs-views-manager-pages-status-waiting-ready-label = Підготовка файлу…
pdfjs-views-manager-pages-status-waiting-uploading-label = Вивантаження файлу…
pdfjs-views-manager-status-warning-cut-label = Не вдалося вирізати. Оновіть сторінку та спробуйте ще раз.
pdfjs-views-manager-status-warning-copy-label = Не вдалося скопіювати. Оновіть сторінку та спробуйте ще раз.
pdfjs-views-manager-status-warning-delete-label = Не вдалося видалити. Оновіть сторінку та спробуйте ще раз.
pdfjs-views-manager-status-warning-save-label = Не вдалося зберегти. Оновіть сторінку та спробуйте ще раз.
pdfjs-views-manager-status-undo-button-label = Повернути
pdfjs-views-manager-status-close-button =
.title = Закрити
pdfjs-views-manager-status-close-button-label = Закрити
## Main menu for adding/removing signatures
pdfjs-editor-delete-signature-button1 =

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = Ảnh thu nhỏ của trang { $page }
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = Chọn trang { $page }
## Find panel button title and messages
@ -632,6 +636,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = Bật/tắt thanh lề
pdfjs-views-manager-sidebar =
.aria-label = Thanh lề
pdfjs-views-manager-sidebar-resizer =
.aria-label = Công cụ điều chỉnh kích thước thanh lề
pdfjs-views-manager-view-selector-button =
.title = Chế độ hiển thị
pdfjs-views-manager-view-selector-button-label = Chế độ hiển thị
@ -674,6 +680,7 @@ pdfjs-views-manager-status-undo-button-label = Hoàn tác
pdfjs-views-manager-status-close-button =
.title = Đóng
pdfjs-views-manager-status-close-button-label = Đóng
pdfjs-views-manager-paste-button-label = Dán
## Main menu for adding/removing signatures

View File

@ -201,6 +201,10 @@ pdfjs-thumb-page-title =
# $page (Number) - the page number
pdfjs-thumb-page-canvas =
.aria-label = 第 { $page } 頁的縮圖
# Variables:
# $page (Number) - the page number
pdfjs-thumb-page-checkbox =
.aria-label = 選擇第 { $page } 頁
## Find panel button title and messages
@ -632,6 +636,8 @@ pdfjs-toggle-views-manager-notification-button =
pdfjs-toggle-views-manager-button-label = 切換側邊欄
pdfjs-views-manager-sidebar =
.aria-label = 側邊欄
pdfjs-views-manager-sidebar-resizer =
.aria-label = 調整側邊欄大小
pdfjs-views-manager-view-selector-button =
.title = 畫面
pdfjs-views-manager-view-selector-button-label = 畫面
@ -674,6 +680,7 @@ pdfjs-views-manager-status-undo-button-label = 還原
pdfjs-views-manager-status-close-button =
.title = 關閉
pdfjs-views-manager-status-close-button-label = 關閉
pdfjs-views-manager-paste-button-label = 貼上
## Main menu for adding/removing signatures

32
package-lock.json generated
View File

@ -108,7 +108,6 @@
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0",
@ -1648,7 +1647,6 @@
"integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@keyv/serialize": "^1.1.1"
}
@ -1690,7 +1688,6 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": ">=20.19.0"
},
@ -1731,7 +1728,6 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": ">=20.19.0"
}
@ -3124,7 +3120,6 @@
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
@ -3189,7 +3184,6 @@
"integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/linkify-it": "^5",
"@types/mdurl": "^2"
@ -3616,7 +3610,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@ -4272,8 +4265,7 @@
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz",
"integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==",
"dev": true,
"license": "Apache-2.0",
"peer": true
"license": "Apache-2.0"
},
"node_modules/bare-fs": {
"version": "4.5.4",
@ -4389,9 +4381,9 @@
}
},
"node_modules/basic-ftp": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz",
"integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==",
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz",
"integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==",
"dev": true,
"license": "MIT",
"engines": {
@ -4509,7 +4501,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@ -5770,8 +5761,7 @@
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz",
"integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==",
"dev": true,
"license": "BSD-3-Clause",
"peer": true
"license": "BSD-3-Clause"
},
"node_modules/dir-glob": {
"version": "3.0.1",
@ -6308,7 +6298,6 @@
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@ -6369,7 +6358,6 @@
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
@ -7750,7 +7738,6 @@
"integrity": "sha512-PErok3DZSA5WGMd6XXV3IRNO0mlB+wW3OzhFJLEec1jSERg2j1bxJ6e5Fh6N6fn3FH2T9AP4UYNb/pYlADB9sA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"glob-watcher": "^6.0.0",
"gulp-cli": "^3.1.0",
@ -9832,7 +9819,6 @@
"integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"argparse": "^2.0.1",
"entities": "^4.4.0",
@ -9974,7 +9960,6 @@
"integrity": "sha512-DkoXO1jz0UY+k1tj1LpxYLrN+jeGKBicbtsQYeYF8nX9QK4AGyGh4g421qsmEOGfZ02GjW1qxr1XP+8afwcTGQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"chokidar": "^4.0.3",
"commander": "^11.1.0",
@ -11045,7 +11030,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@ -11198,7 +11182,6 @@
"integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@ -11251,7 +11234,6 @@
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@ -12128,7 +12110,6 @@
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@ -13871,7 +13852,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@ -14125,7 +14105,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -14512,7 +14491,6 @@
"integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",

View File

@ -330,15 +330,21 @@ class AnnotationStorage {
* contents. (Necessary since printing is triggered synchronously in browsers.)
*/
class PrintAnnotationStorage extends AnnotationStorage {
#serializable;
#serializable = SerializableEmpty;
constructor(parent) {
super();
const { map, hash, transfer } = parent.serializable;
const { serializable } = parent;
if (serializable === SerializableEmpty) {
return;
}
const { map, hash, transfer } = serializable;
// Create a *copy* of the data, since Objects are passed by reference in JS.
const clone = structuredClone(map, transfer ? { transfer } : null);
this.#serializable = { map: clone, hash, transfer };
// The `PrintAnnotationStorage` instance is re-used for all pages,
// hence we cannot transfer the data since that breaks printing.
this.#serializable = { map: clone, hash, transfer: [] };
}
/**

View File

@ -1898,6 +1898,7 @@ class PDFPageProxy {
annotationStorage: map,
modifiedIds,
},
/* queueingStrategy = */ undefined,
transfer
);
const reader = readableStream.getReader();

View File

@ -803,6 +803,10 @@ class Driver {
}
task.pdfDoc = doc;
if (!task.save && task.print && task.annotationStorage) {
doc.annotationStorage._setValues(task.annotationStorage);
task.printAnnotationStorage = doc.annotationStorage.print;
}
task.optionalContentConfigPromise = doc.getOptionalContentConfig({
intent: task.print ? "print" : "display",
});
@ -969,7 +973,7 @@ class Driver {
pageColors = null,
partialCrop = null;
if (task.annotationStorage) {
if (!task.print && task.annotationStorage) {
task.pdfDoc.annotationStorage._setValues(task.annotationStorage);
}
@ -1079,6 +1083,8 @@ class Driver {
} else if (renderPrint) {
if (task.annotationStorage) {
renderContext.annotationMode = AnnotationMode.ENABLE_STORAGE;
renderContext.printAnnotationStorage =
task.printAnnotationStorage;
}
renderContext.intent = "print";
}

View File

@ -28,12 +28,13 @@ import {
kbDelete,
loadAndWait,
scrollIntoView,
showViewsManager,
waitAndClick,
waitForDOMMutation,
} from "./test_utils.mjs";
async function waitForThumbnailVisible(page, pageNums) {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
const thumbSelector = "#thumbnailsView .thumbnailImageContainer > img";
await page.waitForSelector(thumbSelector, { visible: true });
@ -283,12 +284,12 @@ describe("Reorganize Pages View", () => {
await waitForThumbnailVisible(page, 1);
const rect1 = await getRect(page, getThumbnailSelector(1));
const rect2 = await getRect(page, getThumbnailSelector(2));
await (await page.$(".thumbnail[page-id='14'")).scrollIntoView();
await (await page.$(".thumbnail[page-number='14'")).scrollIntoView();
await page.waitForSelector(getThumbnailSelector(14), {
visible: true,
});
await page.click(`.thumbnail:has(${getThumbnailSelector(14)}) input`);
await (await page.$(".thumbnail[page-id='1'")).scrollIntoView();
await (await page.$(".thumbnail[page-number='1'")).scrollIntoView();
await page.waitForSelector(getThumbnailSelector(1), {
visible: true,
});

View File

@ -262,7 +262,7 @@ function getAnnotationSelector(id) {
}
function getThumbnailSelector(pageNumber) {
return `.thumbnailImageContainer[data-l10n-args='{"page":${pageNumber}}']`;
return `.thumbnailImageContainer[data-l10n-args^='{"page":${pageNumber}']`;
}
async function getSpanRectFromText(page, pageNumber, text) {
@ -645,6 +645,7 @@ function waitForEditorMovedInDOM(page) {
}
async function scrollIntoView(page, selector) {
await page.waitForSelector(selector, { visible: true });
const handle = await page.evaluateHandle(
sel => [
new Promise(resolve => {
@ -964,6 +965,29 @@ async function highlightSpan(
await page.waitForSelector(getEditorSelector(nextId));
}
async function showViewsManager(page) {
const hasAnimations = await page.evaluate(
() => !window.matchMedia("(prefers-reduced-motion: reduce)").matches
);
const movingPromise = hasAnimations
? page.waitForSelector("#outerContainer.viewsManagerMoving", {
visible: true,
})
: Promise.resolve();
await page.click("#viewsManagerToggleButton");
if (hasAnimations) {
await movingPromise;
}
await page.waitForSelector("#viewsManager", { visible: true });
await page.waitForSelector(
"#outerContainer:not(.viewsManagerMoving).viewsManagerOpen",
{ visible: true }
);
await page.waitForSelector("#viewsManagerStatusActionButton:not(:disabled)", {
visible: true,
});
}
// Unicode bidi isolation characters, Fluent adds these markers to the text.
const FSI = "\u2068";
const PDI = "\u2069";
@ -1030,6 +1054,7 @@ export {
selectEditors,
serializeBitmapDimensions,
setCaretAt,
showViewsManager,
switchToEditor,
unselectEditor,
waitAndClick,

View File

@ -2,16 +2,15 @@ import {
awaitPromise,
closePages,
FSI,
getThumbnailSelector,
kbFocusNext,
loadAndWait,
PDI,
showViewsManager,
} from "./test_utils.mjs";
function waitForThumbnailVisible(page, pageNum) {
return page.waitForSelector(
`.thumbnailImageContainer[data-l10n-args='{"page":${pageNum}}']`,
{ visible: true }
);
return page.waitForSelector(getThumbnailSelector(pageNum), { visible: true });
}
async function waitForMenu(page, buttonSelector, visible = true) {
@ -44,7 +43,7 @@ describe("PDF Thumbnail View", () => {
it("should render thumbnails without errors", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
const thumbSelector =
"#thumbnailsView .thumbnailImageContainer > img";
@ -55,6 +54,14 @@ describe("PDF Thumbnail View", () => {
await page.waitForSelector(`${thumbSelector}[src^="blob:http:"]`, {
visible: true,
});
const title = await page.$eval(
getThumbnailSelector(1),
el => el.title
);
expect(title)
.withContext(`In ${browserName}`)
.toBe(`Page ${FSI}1${PDI} of ${FSI}14${PDI}`);
})
);
});
@ -62,7 +69,7 @@ describe("PDF Thumbnail View", () => {
it("should have accessible label on resizer", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
const ariaLabel = await page.$eval("#viewsManagerResizer", el =>
el.getAttribute("aria-label")
@ -104,13 +111,12 @@ describe("PDF Thumbnail View", () => {
it("should scroll the view", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
for (const pageNum of [14, 1, 13, 2]) {
await goToPage(page, pageNum);
const thumbSelector = `.thumbnailImageContainer[data-l10n-args='{"page":${pageNum}}']`;
const thumbSelector = getThumbnailSelector(pageNum);
await page.waitForSelector(
`.thumbnail ${thumbSelector}[aria-current="page"]`,
{ visible: true }
@ -141,8 +147,7 @@ describe("PDF Thumbnail View", () => {
it("should navigate with the keyboard", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
await waitForThumbnailVisible(page, 2);
await waitForThumbnailVisible(page, 3);
@ -159,26 +164,25 @@ describe("PDF Thumbnail View", () => {
await kbFocusNext(page);
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":1}']:focus`,
`#thumbnailsView ${getThumbnailSelector(1)}:focus`,
{ visible: true }
);
await page.keyboard.press("ArrowDown");
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":2}']:focus`,
`#thumbnailsView ${getThumbnailSelector(2)}:focus`,
{ visible: true }
);
await page.keyboard.press("ArrowUp");
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":1}']:focus`,
{ visible: true }
);
await page.waitForSelector(`${getThumbnailSelector(1)}:focus`, {
visible: true,
});
await page.keyboard.press("ArrowDown");
await page.keyboard.press("ArrowDown");
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":3}']:focus`,
`#thumbnailsView ${getThumbnailSelector(3)}:focus`,
{ visible: true }
);
@ -191,13 +195,13 @@ describe("PDF Thumbnail View", () => {
await page.keyboard.press("End");
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":14}']:focus`,
`#thumbnailsView ${getThumbnailSelector(14)}:focus`,
{ visible: true }
);
await page.keyboard.press("Home");
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":1}']:focus`,
`#thumbnailsView ${getThumbnailSelector(1)}:focus`,
{ visible: true }
);
})
@ -235,7 +239,7 @@ describe("PDF Thumbnail View", () => {
it("should open with Enter key and remain open", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
await enableMenuItems(page);
@ -267,7 +271,7 @@ describe("PDF Thumbnail View", () => {
it("should open with Space key and remain open", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
await enableMenuItems(page);
@ -323,18 +327,17 @@ describe("PDF Thumbnail View", () => {
await closePages(pages);
});
it("should have accessible label on checkbox", async () => {
it("should have a title on the checkbox", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
const ariaLabel = await page.$eval(
const title = await page.$eval(
`.thumbnail[page-number="1"] input[type="checkbox"]`,
el => el.getAttribute("aria-label")
el => el.title
);
expect(ariaLabel)
expect(title)
.withContext(`In ${browserName}`)
.toBe(`Select page ${FSI}1${PDI}`);
})
@ -362,7 +365,7 @@ describe("PDF Thumbnail View", () => {
it("must navigate menus with ArrowDown and Tab keys", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
// Focus the views manager selector button
@ -431,7 +434,7 @@ describe("PDF Thumbnail View", () => {
it("should show the manage button in thumbnail view and hide it in outline view", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
// The status bar (Select pages + Manage button) must be visible in
@ -471,8 +474,7 @@ describe("PDF Thumbnail View", () => {
it("should focus checkboxes with Tab key", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
// Focus the first thumbnail button
@ -481,10 +483,9 @@ describe("PDF Thumbnail View", () => {
await kbFocusNext(page);
// Verify we're on the first thumbnail
await page.waitForSelector(
`#thumbnailsView .thumbnailImageContainer[data-l10n-args='{"page":1}']:focus`,
{ visible: true }
);
await page.waitForSelector(`${getThumbnailSelector(1)}:focus`, {
visible: true,
});
// Tab to checkbox
await kbFocusNext(page);
@ -499,8 +500,7 @@ describe("PDF Thumbnail View", () => {
it("should navigate checkboxes with arrow keys", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");
await showViewsManager(page);
await waitForThumbnailVisible(page, 1);
await waitForThumbnailVisible(page, 2);

View File

@ -21,6 +21,7 @@ import {
getSpanRectFromText,
loadAndWait,
scrollIntoView,
showViewsManager,
waitForPageChanging,
waitForPageRendered,
} from "./test_utils.mjs";
@ -1451,6 +1452,82 @@ describe("PDF viewer", () => {
});
});
describe("Outline tree shift-click toggle (PR 20740)", () => {
let pages;
beforeEach(async () => {
pages = await loadAndWait(
"nested_outline.pdf",
"#viewsManagerToggleButton"
);
});
afterEach(async () => {
await closePages(pages);
});
it("should only toggle the clicked item's subtree, not the whole outline", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
// Open the sidebar.
await showViewsManager(page);
// Switch to outline view.
await page.click("#viewsManagerSelectorButton");
await page.waitForSelector("#outlinesViewMenu", { visible: true });
await page.click("#outlinesViewMenu");
// Wait for the outline tree to render with nesting (toggle buttons).
await page.waitForSelector("#outlinesView.withNesting");
// Initially all three top-level togglers must be expanded.
const initialHiddenCount = await page.$$eval(
"#outlinesView > .treeItem > .treeItemToggler",
togglers =>
togglers.filter(t => t.classList.contains("treeItemsHidden"))
.length
);
expect(initialHiddenCount).withContext(`In ${browserName}`).toBe(0);
// Shift-click the first top-level toggler (section "1. Introduction")
// to collapse only its subtree.
// The toggler has width/height 0 (visual content via ::before), so
// we dispatch the MouseEvent directly rather than using page.click().
await page.evaluate(() => {
const toggler = document.querySelector(
"#outlinesView > .treeItem:nth-child(1) > .treeItemToggler"
);
toggler.dispatchEvent(
new MouseEvent("click", {
shiftKey: true,
bubbles: true,
cancelable: true,
})
);
});
// Section 1's toggler must now be collapsed.
const section1Collapsed = await page.$eval(
"#outlinesView > .treeItem:nth-child(1) > .treeItemToggler",
t => t.classList.contains("treeItemsHidden")
);
expect(section1Collapsed).withContext(`In ${browserName}`).toBeTrue();
// Sections 2 and 3 must remain expanded (the bug collapsed the whole
// outline by passing `this.container` instead of
// `target.parentNode`).
const otherHiddenCount = await page.$$eval(
"#outlinesView > .treeItem:nth-child(n+2) > .treeItemToggler",
togglers =>
togglers.filter(t => t.classList.contains("treeItemsHidden"))
.length
);
expect(otherHiddenCount).withContext(`In ${browserName}`).toBe(0);
})
);
});
});
describe("Scroll into view", () => {
let pages;

View File

@ -875,3 +875,4 @@
!bug2014080.pdf
!two_pages.pdf
!sci-notation.pdf
!nested_outline.pdf

Binary file not shown.

View File

@ -604,6 +604,7 @@ const PDFViewerApplication = {
enableHWA,
enableSplitMerge: AppOptions.get("enableSplitMerge"),
manageMenu: appConfig.viewsManager.manageMenu,
addFileButton: appConfig.viewsManager.viewsManagerAddFileButton,
});
renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
}

View File

@ -131,7 +131,7 @@ class BaseTreeViewer {
target.classList.toggle("treeItemsHidden");
if (e.shiftKey) {
const shouldShowAll = !target.classList.contains("treeItemsHidden");
this._toggleTreeItem(this.container, shouldShowAll);
this._toggleTreeItem(target.parentNode, shouldShowAll);
}
});
}

View File

@ -243,6 +243,7 @@
padding-bottom: 16px;
flex-direction: column;
align-items: flex-start;
overflow-y: visible;
#editorCommentsSidebarHeader {
width: 100%;

View File

@ -140,6 +140,9 @@ function getNormalizeWithNFKC() {
const diacriticsRegex = /^\p{M}$/u;
// Some chars must be replaced by their NFKC counterpart during a search.
for (let i = 0; i < 65536; i++) {
if (i >= 0xd800 && i <= 0xdfff) {
continue; // Skip surrogates since they're not valid Unicode scalar values.
}
const c = String.fromCharCode(i);
if (c.normalize("NFKC") !== c && !diacriticsRegex.test(c)) {
if (range.length !== 2) {

View File

@ -119,7 +119,6 @@ class PDFThumbnailView extends RenderableView {
const thumbnailContainer = (this.div = document.createElement("div"));
thumbnailContainer.className = "thumbnail";
thumbnailContainer.setAttribute("page-number", id);
thumbnailContainer.setAttribute("page-id", id);
const imageContainer = (this.imageContainer =
document.createElement("div"));
@ -132,6 +131,8 @@ class PDFThumbnailView extends RenderableView {
imageContainer.tabIndex = -1;
imageContainer.draggable = false;
imageContainer.setAttribute("page-number", id);
imageContainer.setAttribute("data-l10n-id", "pdfjs-thumb-page-title1");
imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true));
const image = (this.image = document.createElement("img"));
imageContainer.append(image);
@ -140,8 +141,8 @@ class PDFThumbnailView extends RenderableView {
const checkbox = (this.checkbox = document.createElement("input"));
checkbox.type = "checkbox";
checkbox.tabIndex = -1;
checkbox.setAttribute("data-l10n-id", "pdfjs-thumb-page-checkbox");
checkbox.setAttribute("data-l10n-args", this.#pageL10nArgs);
checkbox.setAttribute("data-l10n-id", "pdfjs-thumb-page-checkbox1");
checkbox.setAttribute("data-l10n-args", this.#getPageL10nArgs());
thumbnailContainer.append(checkbox);
this.pasteButton = null;
}
@ -332,8 +333,8 @@ class PDFThumbnailView extends RenderableView {
reducedCanvas.toBlob(resolve);
const blob = await promise;
image.src = URL.createObjectURL(blob);
imageContainer.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas");
imageContainer.setAttribute("data-l10n-args", this.#pageL10nArgs);
image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas");
image.setAttribute("data-l10n-args", this.#getPageL10nArgs());
imageContainer.classList.remove("missingThumbnailImage");
if (!FeatureTest.isOffscreenCanvasSupported) {
// Clean up the canvas element since it is no longer needed.
@ -526,8 +527,11 @@ class PDFThumbnailView extends RenderableView {
return canvas;
}
get #pageL10nArgs() {
return JSON.stringify({ page: this.pageLabel ?? this.id });
#getPageL10nArgs(hasTotal = false) {
return JSON.stringify({
page: this.pageLabel ?? this.id,
total: hasTotal ? this.linkService.pagesCount : undefined,
});
}
/**
@ -535,8 +539,12 @@ class PDFThumbnailView extends RenderableView {
*/
setPageLabel(label) {
this.pageLabel = typeof label === "string" ? label : null;
this.imageContainer.setAttribute("data-l10n-args", this.#pageL10nArgs);
this.checkbox?.setAttribute("data-l10n-args", this.#pageL10nArgs);
this.imageContainer.setAttribute(
"data-l10n-args",
this.#getPageL10nArgs(true)
);
this.image.setAttribute("data-l10n-args", this.#getPageL10nArgs());
this.checkbox?.setAttribute("data-l10n-args", this.#getPageL10nArgs());
}
}

View File

@ -70,7 +70,8 @@ const SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT = 15;
* The default value is `false`.
* @property {Object} [manageMenu] - The menu elements to manage saving edited
* PDF.
*/
* @property {HTMLButtonElement} addFileButton - The button that opens a dialog
* to add a PDF file to merge with the current one.
/**
* Viewer control to display thumbnails for pages in a PDF document.
@ -141,6 +142,7 @@ class PDFThumbnailViewer {
enableHWA,
enableSplitMerge,
manageMenu,
addFileButton,
}) {
this.scrollableContainer = container.parentElement;
this.container = container;
@ -152,6 +154,8 @@ class PDFThumbnailViewer {
this.pageColors = pageColors || null;
this.enableHWA = enableHWA || false;
this.#enableSplitMerge = enableSplitMerge || false;
// TODO: uncomment when the "add file" feature is implemented.
// this.#addFileButton = addFileButton;
if (this.#enableSplitMerge && manageMenu) {
const { button, menu, copy, cut, delete: del, saveAs } = manageMenu;

View File

@ -29,6 +29,7 @@
--sidebar-max-width: 632px;
--sidebar-width: 239px;
--resizer-width: 4px;
--resizer-shift: calc(0px - var(--resizer-width) - 2px);
--resizer-hover-bg-color: light-dark(#0062fa, #00cadb);
@media screen and (forced-colors: active) {
@ -49,6 +50,7 @@
max-width: var(--sidebar-max-width);
backdrop-filter: var(--sidebar-backdrop-filter);
box-sizing: border-box;
position: relative;
.sidebarResizer {
width: var(--resizer-width);
@ -56,9 +58,11 @@
forced-color-adjust: none;
cursor: ew-resize;
position: absolute;
inset-block: calc(var(--sidebar-padding) + var(--sidebar-border-radius));
inset-inline-start: calc(0px - var(--resizer-width) / 2);
transition: background-color 0.5s ease-in-out;
inset-block: 0;
inset-inline-start: var(--resizer-shift);
transition:
background-color 0.5s ease-in-out,
border-color 0.5s ease-in-out;
box-sizing: border-box;
border: 1px solid transparent;
border-block-width: 0;
@ -66,6 +70,7 @@
&:hover {
background-color: var(--resizer-hover-bg-color);
border-color: white;
}
&:focus-visible {
background-color: var(--resizer-hover-bg-color);

View File

@ -1360,9 +1360,13 @@ dialog :link {
height: 1px;
}
#toolbarViewerLeft #numPages.toolbarLabel {
padding-inline-start: 3px;
flex: none;
#toolbarViewerLeft {
margin-inline-start: 8px;
#numPages.toolbarLabel {
padding-inline-start: 3px;
flex: none;
}
}
}

View File

@ -111,12 +111,12 @@ See https://github.com/adobe-type-tools/cmap-resources
class="toolbarButton"
type="button"
tabindex="0"
data-l10n-id="pdfjs-toggle-views-manager-button"
data-l10n-id="pdfjs-toggle-views-manager-button1"
aria-expanded="false"
aria-haspopup="true"
aria-controls="viewsManager"
>
<span data-l10n-id="pdfjs-toggle-views-manager-button-label"></span>
<span data-l10n-id="pdfjs-toggle-views-manager-button1-label"></span>
</button>
<div
id="viewsManager"

View File

@ -23,7 +23,7 @@
&.viewsManagerOpen {
#viewsManager {
visibility: visible;
inset-inline-start: 1px;
inset-inline-start: 8px;
}
#viewerContainer:not(.pdfPresentationMode) {
@ -53,7 +53,7 @@
--pages-selected-icon: url(images/pages_selected.svg);
--spinner-icon: url(images/altText_spinner.svg);
--sidebar-bg-color: light-dark(rgb(255 255 255 / 0.92), rgb(35 34 43 / 0.92));
--sidebar-bg-color: light-dark(rgb(255 255 255 / 0.92), rgb(66 65 77 / 0.92));
--sidebar-backdrop-filter: blur(7px);
--sidebar-width: 230px;
--sidebar-min-width: min-content;
@ -86,13 +86,14 @@
--header-shadow:
0 0.25px 0.75px -0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)),
0 2px 6px -6px light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
--header-bg: light-dark(rgb(255 255 255 / 0.92), #42414e);
--image-outline: none;
--image-border-width: 6px;
--image-border-color: light-dark(#cfcfd8, #3a3944);
--image-hover-border-color: #bfbfc9;
--image-current-border-color: var(--button-focus-outline-color);
--image-current-focused-outline-color: var(--image-hover-border-color);
--image-page-number-bg: light-dark(#f0f0f4, #23222b);
--image-page-number-bg: light-dark(#f0f0f4, #42414d);
--image-page-number-fg: var(--text-color);
--image-page-number-border-color: transparent;
--image-hover-page-number-bg: var(--image-page-number-bg);
@ -189,7 +190,7 @@
transition-timing-function: var(--sidebar-transition-timing-function);
.sidebarResizer {
inset-inline-start: 100%;
inset-inline-start: calc(100% + 4px);
}
.viewsManagerButton {
@ -243,12 +244,14 @@
width: 100%;
box-shadow: var(--header-shadow);
flex: 0 0 auto;
background-color: var(--header-bg);
.viewsManagerLabel {
flex: 1 0 0;
flex: 0;
color: var(--text-color);
text-align: center;
height: fit-content;
width: fit-content;
user-select: none;
font: menu;
@ -336,6 +339,8 @@
}
#viewsManagerAddFileButton {
visibility: hidden;
background: var(--button-no-bg);
width: 32px;
height: 32px;

View File

@ -69,6 +69,9 @@ const UI_NOTIFICATION_CLASS = "pdfSidebarNotification";
class ViewsManager extends Sidebar {
static #l10nDescription = null;
#hasAnimations = !window.matchMedia("(prefers-reduced-motion: reduce)")
.matches;
/**
* @param {PDFSidebarOptions} options
*/
@ -86,6 +89,7 @@ class ViewsManager extends Sidebar {
outlinesView,
attachmentsView,
layersView,
viewsManagerAddFileButton,
viewsManagerCurrentOutlineButton,
viewsManagerSelectorButton,
viewsManagerSelectorOptions,
@ -131,6 +135,7 @@ class ViewsManager extends Sidebar {
this.attachmentsView = attachmentsView;
this.layersView = layersView;
this.viewsManagerAddFileButton = viewsManagerAddFileButton;
this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton;
this.viewsManagerHeaderLabel = viewsManagerHeaderLabel;
this.viewsManagerStatus = viewsManagerStatus;
@ -248,6 +253,7 @@ class ViewsManager extends Sidebar {
}
this.viewsManagerStatus.hidden = view !== SidebarView.THUMBS;
this.viewsManagerAddFileButton.hidden = view !== SidebarView.THUMBS;
this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE;
this.viewsManagerHeaderLabel.setAttribute(
"data-l10n-id",
@ -303,15 +309,20 @@ class ViewsManager extends Sidebar {
toggleExpandedBtn(this.toggleButton, true);
this.switchView(this.active);
// Changing `hidden` above may cause a reflow which would prevent the
// CSS transition from being applied correctly, so we need to delay
// adding the relevant CSS classes.
queueMicrotask(() => {
this.outerContainer.classList.add(
"viewsManagerMoving",
"viewsManagerOpen"
);
});
if (this.#hasAnimations) {
// Changing `hidden` above may cause a reflow which would prevent the
// CSS transition from being applied correctly, so we need to delay
// adding the relevant CSS classes.
queueMicrotask(() => {
this.outerContainer.classList.add(
"viewsManagerMoving",
"viewsManagerOpen"
);
});
} else {
this.outerContainer.classList.add("viewsManagerOpen");
this.eventBus.dispatch("resize", { source: this });
}
if (this.active === SidebarView.THUMBS) {
this.onUpdateThumbnails();
}
@ -392,13 +403,16 @@ class ViewsManager extends Sidebar {
#addEventListeners() {
const { eventBus, outerContainer } = this;
this.sidebarContainer.addEventListener("transitionend", evt => {
if (evt.target === this.sidebarContainer) {
outerContainer.classList.remove("viewsManagerMoving");
// Ensure that rendering is triggered after opening/closing the sidebar.
eventBus.dispatch("resize", { source: this });
}
});
if (this.#hasAnimations) {
this.sidebarContainer.addEventListener("transitionend", evt => {
if (evt.target === this.sidebarContainer) {
outerContainer.classList.remove("viewsManagerMoving");
// Ensure that rendering is triggered after opening/closing the
// sidebar.
eventBus.dispatch("resize", { source: this });
}
});
}
// Buttons for switching views.
this.thumbnailButton.addEventListener("click", () => {