refactor(preview): remove pdf (#278)

This commit is contained in:
MadDogOwner
2025-11-14 12:32:33 +08:00
committed by GitHub
parent ea8ecf4482
commit 55082b8a72
7 changed files with 1 additions and 776 deletions

View File

@@ -62,7 +62,6 @@
"@github/webauthn-json": "^2.1.1",
"@hope-ui/solid": "0.6.7",
"@monaco-editor/loader": "^1.5.0",
"@pdfslick/solid": "^3.0.0",
"@ruffle-rs/ruffle": "0.2.0-nightly.2025.8.3",
"@solid-primitives/i18n": "^2.2.1",
"@solid-primitives/keyboard": "^1.3.1",
@@ -95,7 +94,6 @@
"mitt": "^3.0.1",
"monaco-editor": "^0.54.0",
"mpegts.js": "^1.8.0",
"pdfjs-dist": "^5.3.31",
"qrcode": "^1.5.4",
"rehype-katex": "6.0.3",
"rehype-raw": "^7.0.0",
@@ -114,10 +112,5 @@
},
"lint-staged": {
"**/*.{js,ts,css,tsx,jsx,md,html,yml,yaml}": "prettier --write"
},
"pnpm": {
"patchedDependencies": {
"@pdfslick/core@3.0.0": "patches/@pdfslick__core@3.0.0.patch"
}
}
}

View File

@@ -1,33 +0,0 @@
diff --git a/dist/esm/index.js b/dist/esm/index.js
index b1838349fa9644aa6034b1e88b00f8668d242994..fcac95798e8336abe60ab0d8527cb1dc7170ca3c 100644
--- a/dist/esm/index.js
+++ b/dist/esm/index.js
@@ -1,5 +1,5 @@
import { RenderingCancelledException, PixelsPerInch, getXfaPageViewport, AnnotationMode, AnnotationEditorType, GlobalWorkerOptions, AnnotationEditorParamsType, getPdfFilenameFromUrl, getDocument, PDFDateString } from 'pdfjs-dist';
-import { SimpleLinkService, XfaLayerBuilder, GenericL10n, DownloadManager, EventBus, PDFLinkService, PDFFindController, PDFSinglePageViewer, PDFViewer } from 'pdfjs-dist/web/pdf_viewer.mjs';
+import { SimpleLinkService, XfaLayerBuilder, GenericL10n, DownloadManager, EventBus, PDFLinkService, PDFFindController, PDFSinglePageViewer, PDFViewer } from 'pdfjs-dist/legacy/web/pdf_viewer.mjs';
import { createStore } from 'zustand/vanilla';
/******************************************************************************
@@ -2417,7 +2417,7 @@ class PDFSlickPrintDialog {
}
var _PDFSlick_instances, _PDFSlick_renderingQueue, _PDFSlick_container, _PDFSlick_viewerContainer, _PDFSlick_thumbsContainer, _PDFSlick_printService, _PDFSlick_annotationMode, _PDFSlick_annotationEditorMode, _PDFSlick_onError, _PDFSlick_eventAbortController, _PDFSlick_initializePageLabels, _PDFSlick_parseDocumentInfo, _PDFSlick_parsePageSize, _PDFSlick_initInternalEventListeners, _PDFSlick_onDocumentReady, _PDFSlick_onRotationChanging, _PDFSlick_onSwitchSpreadMode, _PDFSlick_onSwitchScrollMode, _PDFSlick_onScaleChanging, _PDFSlick_onPageChanging, _PDFSlick_onPageRendered;
-GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString();
+GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/legacy/build/pdf.worker.min.mjs', import.meta.url).toString();
const US_PAGE_NAMES = {
"8.5x11": "Letter",
"8.5x14": "Legal",
diff --git a/package.json b/package.json
index 3962cc752d8ca79e5985133c0fdc0a7f6f6b9949..720d2b3beb1bce96f6ce47d90dda6e376ced9f0a 100644
--- a/package.json
+++ b/package.json
@@ -42,7 +42,7 @@
"dev": "concurrently \"rollup --config node:@pdfslick/rollup-config --watch\" \"npm run css-watch\"",
"devdev": "rollup --config node:@pdfslick/rollup-config && npm run css",
"build": "rollup --config node:@pdfslick/rollup-config --environment NODE_ENV:production && npm run css",
- "css": "cat ../../node_modules/pdfjs-dist/web/pdf_viewer.css ./styles/pdf_viewer.css | postcss -o dist/pdf_viewer.css",
+ "css": "cat ../../node_modules/pdfjs-dist/legacy/web/pdf_viewer.css ./styles/pdf_viewer.css | postcss -o dist/pdf_viewer.css",
"css-watch": "npm run css",
"css-js": "node combine-css.js",
"css-watch-js": "npm run css -- --watch"

219
pnpm-lock.yaml generated
View File

@@ -4,11 +4,6 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
patchedDependencies:
'@pdfslick/core@3.0.0':
hash: h4ua6dncpwke4tlcj36t6o7tvm
path: patches/@pdfslick__core@3.0.0.patch
importers:
.:
@@ -25,9 +20,6 @@ importers:
'@monaco-editor/loader':
specifier: ^1.5.0
version: 1.6.1
'@pdfslick/solid':
specifier: ^3.0.0
version: 3.0.0(solid-js@1.9.10)
'@ruffle-rs/ruffle':
specifier: 0.2.0-nightly.2025.8.3
version: 0.2.0-nightly.2025.8.3
@@ -124,9 +116,6 @@ importers:
mpegts.js:
specifier: ^1.8.0
version: 1.8.0
pdfjs-dist:
specifier: ^5.3.31
version: 5.4.54
qrcode:
specifier: ^1.5.4
version: 1.5.4
@@ -1067,78 +1056,6 @@ packages:
'@motionone/utils@10.18.0':
resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==}
'@napi-rs/canvas-android-arm64@0.1.74':
resolution: {integrity: sha512-aq5ode+9Z/ZR0H485dI2jdRdttg/hl9Ob+iPCt0nj+QFiirpxDrbUHKeTZWQWEtkWyC7vI5R2dMTbDINBfl9eg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
'@napi-rs/canvas-darwin-arm64@0.1.74':
resolution: {integrity: sha512-eO5Miz+ef1dEQyUMWDdcbAb1Wr7yMyxD9/CL9d4frQxO4pTTaCiMBUWup8XDPLr/g7XkSkGCZLP47xiXiyXSpQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@napi-rs/canvas-darwin-x64@0.1.74':
resolution: {integrity: sha512-0EkO0IFkps7C3JpKC7lbM3IL+QDUYeUKagHLDbUry4PeQTghxp6JcgccpmU32ZbpFZgPnm7o0tTJO0J1d8S2rA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@napi-rs/canvas-linux-arm-gnueabihf@0.1.74':
resolution: {integrity: sha512-qAVJEN2JqGayEI1kSpJy1Xr6ZmCFV9QhRyV35yWsS7e9X1jm+T4DAlCxI4PlKIlqVSzYMYhKrxchST20XBSzHg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@napi-rs/canvas-linux-arm64-gnu@0.1.74':
resolution: {integrity: sha512-lOnop22qy6MYxI94GGunMMjo6D80I//2W/6pqKUfwXaDQtOfvHsTcVVzDu5cFXUTNrb9ZRfMCeol5YEd+9FJvg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@napi-rs/canvas-linux-arm64-musl@0.1.74':
resolution: {integrity: sha512-tfFqLHGtSEabBigOnPUfZviSTGmW2xHv5tYZYPBWmgGiTkoNJ7lEWFUxHjwvV5HXGqLs8ok/O7g1enSpxO6lmQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@napi-rs/canvas-linux-riscv64-gnu@0.1.74':
resolution: {integrity: sha512-j6H9dHTMtr1y3tu/zGm1ythYIL9vTl4EEv9f6CMx0n3Zn2M+OruUUwh9ylCj4afzSNEK9T8cr6zMnmTPzkpBvQ==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
'@napi-rs/canvas-linux-x64-gnu@0.1.74':
resolution: {integrity: sha512-73DIV4E7Y9CpIJuUXVl9H6+MEQXyRy4VJQoUGA1tOlcKQiStxqhq6UErL4decI28NxjyQXBhtYZKj5q8AJEuOg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@napi-rs/canvas-linux-x64-musl@0.1.74':
resolution: {integrity: sha512-FgDMEFdGIJT3I2xejflRJ82/ZgDphyirS43RgtoLaIXI6zihLiZcQ7rczpqeWgAwlJNjR0He2EustsKe1SkUOg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@napi-rs/canvas-win32-x64-msvc@0.1.74':
resolution: {integrity: sha512-x6bhwlhn0wU7dfiP46mt5Bi6PowSUH4CJ4PTzGj58LRQ1HVasEIJgoMx7MLC48F738eJpzbfg3WR/D8+e9CeTA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@napi-rs/canvas@0.1.74':
resolution: {integrity: sha512-pOIyzuS+5Bz1vAhD7tdhaw5/936mMJZUn4aVajojUdjYOGSWmfpDYSgt0nQLZPZVN5GLgWgutqXPOi7Jsm3k+Q==}
engines: {node: '>= 10'}
'@pdfslick/core@3.0.0':
resolution: {integrity: sha512-85LKCZTPKg1dM42rO9RMPmMNKRTG9XSCTX6+s76ffUgdCgniVH/8zduuHYNT8FBfA2Ktiol9f1wu3jMEs03UOQ==}
'@pdfslick/solid@3.0.0':
resolution: {integrity: sha512-x9F8TPNfGU2HcN9e0zaTFgVIipY8zHe0SAL1vewhZ9TSYj61x2JDoWi9EDC8R7Uf+zldQKRMQuHkeq+4+p21Qw==}
peerDependencies:
solid-js: '>=1.5.0'
'@rollup/rollup-android-arm-eabi@4.52.5':
resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
cpu: [arm]
@@ -1252,11 +1169,6 @@ packages:
'@ruffle-rs/ruffle@0.2.0-nightly.2025.8.3':
resolution: {integrity: sha512-3Xn0AEYt84bioRE4HQSALbB+5g/hP04j2P0eCB+fYFj06MGc+7AhlWFas9apE1S4UTJN3TR/WmRMVUGmeouspw==}
'@solid-primitives/event-listener@2.4.1':
resolution: {integrity: sha512-Xc/lBCeuh9LwzR4lYbMDtopwWK7N9b4o+FmI4uoI8DOtVGYi0Ip20DG8PtwHk+g31lHgvwtFFVKfnUx2UaqZJg==}
peerDependencies:
solid-js: ^1.6.12
'@solid-primitives/event-listener@2.4.3':
resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==}
peerDependencies:
@@ -1287,26 +1199,11 @@ packages:
peerDependencies:
solid-js: ^1.6.12
'@solid-primitives/resize-observer@2.1.1':
resolution: {integrity: sha512-vb/VS9+YdUdVZ2V92JimFmFuaJ2MSyKOGnUay/mQvoQ0R+mtdT7FSylfQlVslCzm0ecx8Jkvsm1Sk2lopvMAdg==}
peerDependencies:
solid-js: ^1.6.12
'@solid-primitives/rootless@1.5.1':
resolution: {integrity: sha512-G4eNC6F3ufRT2Mjbodl7rSOH7uq/Emqs3S7/BIBWgh+V/IFUtvu6WELeqSrk4FJX3T/kKKvC+T8gXhepExSWyg==}
peerDependencies:
solid-js: ^1.6.12
'@solid-primitives/rootless@1.5.2':
resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==}
peerDependencies:
solid-js: ^1.6.12
'@solid-primitives/static-store@0.1.1':
resolution: {integrity: sha512-daXWvpLjd+4hbYdGaaEJ2kKFuFhshvfIBFLveW7mfk2BWHl9lGQVwUuExp3qllkK9ONA9p+5D2cpwBQosv8odQ==}
peerDependencies:
solid-js: ^1.6.12
'@solid-primitives/storage@1.3.11':
resolution: {integrity: sha512-PpQWR3TaTxHIJFbI9ZssYTM4Aa67g1vJIgps4TPhcXzHqqomrPAIveFC2FG7SDQoi9YQia8FVBjigELziJpfIg==}
peerDependencies:
@@ -2865,10 +2762,6 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
pdfjs-dist@5.4.54:
resolution: {integrity: sha512-TBAiTfQw89gU/Z4LW98Vahzd2/LoCFprVGvGbTgFt+QCB1F+woyOPmNNVgLa6djX9Z9GGTnj7qE1UzpOVJiINw==}
engines: {node: '>=20.16.0 || >=22.3.0'}
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
@@ -3500,24 +3393,6 @@ packages:
resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==}
engines: {node: '>=12'}
zustand@5.0.5:
resolution: {integrity: sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==}
engines: {node: '>=12.20.0'}
peerDependencies:
'@types/react': '>=18.0.0'
immer: '>=9.0.6'
react: '>=18.0.0'
use-sync-external-store: '>=1.2.0'
peerDependenciesMeta:
'@types/react':
optional: true
immer:
optional: true
react:
optional: true
use-sync-external-store:
optional: true
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -4518,71 +4393,6 @@ snapshots:
hey-listen: 1.0.8
tslib: 2.8.1
'@napi-rs/canvas-android-arm64@0.1.74':
optional: true
'@napi-rs/canvas-darwin-arm64@0.1.74':
optional: true
'@napi-rs/canvas-darwin-x64@0.1.74':
optional: true
'@napi-rs/canvas-linux-arm-gnueabihf@0.1.74':
optional: true
'@napi-rs/canvas-linux-arm64-gnu@0.1.74':
optional: true
'@napi-rs/canvas-linux-arm64-musl@0.1.74':
optional: true
'@napi-rs/canvas-linux-riscv64-gnu@0.1.74':
optional: true
'@napi-rs/canvas-linux-x64-gnu@0.1.74':
optional: true
'@napi-rs/canvas-linux-x64-musl@0.1.74':
optional: true
'@napi-rs/canvas-win32-x64-msvc@0.1.74':
optional: true
'@napi-rs/canvas@0.1.74':
optionalDependencies:
'@napi-rs/canvas-android-arm64': 0.1.74
'@napi-rs/canvas-darwin-arm64': 0.1.74
'@napi-rs/canvas-darwin-x64': 0.1.74
'@napi-rs/canvas-linux-arm-gnueabihf': 0.1.74
'@napi-rs/canvas-linux-arm64-gnu': 0.1.74
'@napi-rs/canvas-linux-arm64-musl': 0.1.74
'@napi-rs/canvas-linux-riscv64-gnu': 0.1.74
'@napi-rs/canvas-linux-x64-gnu': 0.1.74
'@napi-rs/canvas-linux-x64-musl': 0.1.74
'@napi-rs/canvas-win32-x64-msvc': 0.1.74
optional: true
'@pdfslick/core@3.0.0(patch_hash=h4ua6dncpwke4tlcj36t6o7tvm)':
dependencies:
pdfjs-dist: 5.4.54
zustand: 5.0.5
transitivePeerDependencies:
- '@types/react'
- immer
- react
- use-sync-external-store
'@pdfslick/solid@3.0.0(solid-js@1.9.10)':
dependencies:
'@pdfslick/core': 3.0.0(patch_hash=h4ua6dncpwke4tlcj36t6o7tvm)
'@solid-primitives/resize-observer': 2.1.1(solid-js@1.9.10)
solid-js: 1.9.10
transitivePeerDependencies:
- '@types/react'
- immer
- react
- use-sync-external-store
'@rollup/rollup-android-arm-eabi@4.52.5':
optional: true
@@ -4651,11 +4461,6 @@ snapshots:
'@ruffle-rs/ruffle@0.2.0-nightly.2025.8.3': {}
'@solid-primitives/event-listener@2.4.1(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.3.1(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/event-listener@2.4.3(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
@@ -4687,29 +4492,11 @@ snapshots:
'@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/resize-observer@2.1.1(solid-js@1.9.10)':
dependencies:
'@solid-primitives/event-listener': 2.4.1(solid-js@1.9.10)
'@solid-primitives/rootless': 1.5.1(solid-js@1.9.10)
'@solid-primitives/static-store': 0.1.1(solid-js@1.9.10)
'@solid-primitives/utils': 6.3.1(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/rootless@1.5.1(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.3.1(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/rootless@1.5.2(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.3.2(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/static-store@0.1.1(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.3.1(solid-js@1.9.10)
solid-js: 1.9.10
'@solid-primitives/storage@1.3.11(solid-js@1.9.10)':
dependencies:
'@solid-primitives/utils': 6.3.1(solid-js@1.9.10)
@@ -6500,10 +6287,6 @@ snapshots:
pathe@2.0.3: {}
pdfjs-dist@5.4.54:
optionalDependencies:
'@napi-rs/canvas': 0.1.74
pend@1.2.0: {}
picocolors@1.1.1: {}
@@ -7195,6 +6978,4 @@ snapshots:
buffer-crc32: 0.2.13
pend: 1.2.0
zustand@5.0.5: {}
zwitch@2.0.4: {}

View File

@@ -22,31 +22,7 @@
"tr-install": "TrollStore",
"tr-installing": "TrollStore Installing",
"open_in_new_window": "Open in new window",
"auto_next": "Auto next",
"pdf": {
"document_outline": "Document Outline",
"no_outline": "No outline available for this document",
"loading": "Loading...",
"prev_page": "Previous Page",
"next_page": "Next Page",
"toggle_sidebar": "Toggle Sidebar",
"close_sidebar": "Close Sidebar",
"toggle_pen": "Toggle Pen",
"zoom_presets": "Zoom Presets",
"zoom_levels": "Zoom Levels",
"zoom_auto": "Auto",
"zoom_actual": "Actual Size",
"zoom_fit": "Page Fit",
"zoom_width": "Page Width",
"zoom_50": "50%",
"zoom_75": "75%",
"zoom_100": "100%",
"zoom_125": "125%",
"zoom_150": "150%",
"zoom_200": "200%",
"zoom_in": "Zoom In",
"zoom_out": "Zoom Out"
}
"auto_next": "Auto next"
},
"layouts": {
"list": "List View",

View File

@@ -119,12 +119,6 @@ const previews: Preview[] = [
component: lazy(() => import("./heic")),
prior: true,
},
{
name: "PDF Preview",
exts: ["pdf"],
component: lazy(() => import("./pdf")),
prior: true,
},
{
name: "PPT Preview",
exts: ["pptx"],

View File

@@ -1,478 +0,0 @@
import { BoxWithFullScreen } from "~/components"
import { AnnotationEditorType, AnnotationEditorParamsType } from "pdfjs-dist"
import {
PDFSlickState,
TPDFDocumentOutline,
usePDFSlick,
} from "@pdfslick/solid"
import { objStore } from "~/store"
import "@pdfslick/solid/dist/pdf_viewer.css"
import {
Button,
Divider,
HStack,
VStack,
IconButton,
Menu,
MenuContent,
MenuGroup,
MenuItem,
MenuLabel,
MenuTrigger,
Text,
Input,
ButtonGroup,
Box,
createDisclosure,
Tooltip,
} from "@hope-ui/solid"
import {
createSignal,
createEffect,
onCleanup,
For,
Show,
createMemo,
} from "solid-js"
import {
VsChevronUp,
VsChevronDown,
VsLayoutSidebarLeft,
VsLayoutSidebarLeftOff,
VsTriangleRight,
VsClose,
VsTriangleDown,
VsZoomIn,
VsZoomOut,
} from "solid-icons/vs"
import { useT } from "~/hooks"
import { BsEraser, BsPen, BsPenFill } from "solid-icons/bs"
const PDFViewerApp = () => {
const t = useT()
const {
viewerRef,
pdfSlickStore: store,
PDFSlickViewer,
} = usePDFSlick(objStore.raw_url)
const [wantedPageNumber, setWantedPageNumber] = createSignal<number | string>(
1,
)
const { isOpen, onToggle, onClose } = createDisclosure()
const handlePageNumberSubmit = (e: Event) => {
e.preventDefault()
const newPageNumber = parseInt(wantedPageNumber() + "")
if (
Number.isInteger(newPageNumber) &&
newPageNumber > 0 &&
newPageNumber <= store.numPages
) {
store.pdfSlick?.linkService.goToPage(newPageNumber)
} else {
setWantedPageNumber(store.pageNumber)
}
}
const updatePageNumber = ({ pageNumber }: any) =>
setWantedPageNumber(pageNumber)
createEffect(() => {
if (store.pdfSlick) {
store.pdfSlick.on("pagechanging", updatePageNumber)
}
})
onCleanup(() => {
if (store.pdfSlick) {
store.pdfSlick.off("pagechanging", updatePageNumber)
}
})
return (
<Box w="$full" h="70vh" pos="relative" display="flex">
<Sidebar store={store} isOpen={isOpen()} onClose={onClose} />
<BoxWithFullScreen w="$full" h="$full" pos="relative" flex={1}>
<Toolbar
store={store}
isOpen={isOpen()}
onToggle={onToggle}
wantedPageNumber={wantedPageNumber}
onPageNumberChange={setWantedPageNumber}
onPageNumberSubmit={handlePageNumberSubmit}
/>
<PDFSlickViewer {...{ store, viewerRef }} />
</BoxWithFullScreen>
</Box>
)
}
const OutlineItem = (props: {
item: TPDFDocumentOutline[number]
level: number
store: PDFSlickState
}) => {
const [isOpen, setIsOpen] = createSignal(true)
const hasChildren = () => props.item.items && props.item.items.length > 0
const handleClick = () => {
if (props.item.dest && props.store.pdfSlick?.linkService) {
props.store.pdfSlick.linkService.goToDestination(props.item.dest)
}
}
return (
<Box mb="$1">
<HStack spacing="$1" alignItems="center">
<Show when={hasChildren()} fallback={<Box w="16px" />}>
<IconButton
size="xs"
variant="ghost"
aria-label="Toggle"
icon={isOpen() ? <VsTriangleDown /> : <VsTriangleRight />}
minW="16px"
h="16px"
onClick={() => setIsOpen(!isOpen())}
/>
</Show>
<Button
variant="ghost"
size="sm"
justifyContent="flex-start"
flex={1}
fontSize="$sm"
fontWeight="$normal"
py="$1"
px="$2"
h="auto"
minH="$6"
textAlign="left"
overflow="hidden"
onClick={handleClick}
_hover={{ backgroundColor: "$neutral3" }}
title={props.item.title}
color="$neutral12"
>
{props.item.title}
</Button>
</HStack>
<Show when={hasChildren() && isOpen()}>
<Box pl={`${(props.level + 1) * 16}px`}>
<OutlineItems
items={props.item.items}
level={props.level + 1}
store={props.store}
/>
</Box>
</Show>
</Box>
)
}
const OutlineItems = (props: {
items: TPDFDocumentOutline | null
level?: number
store: PDFSlickState
}) => {
if (!props.items || props.items.length === 0) return null
return (
<For each={props.items}>
{(item) => (
<OutlineItem item={item} level={props.level || 0} store={props.store} />
)}
</For>
)
}
const Sidebar = (props: {
store: PDFSlickState
isOpen: boolean
onClose: () => void
}) => {
const t = useT()
return (
<Show when={props.isOpen}>
<Box
w="280px"
h="$full"
bgColor="$neutral1"
borderRight="1px solid $neutral6"
display="flex"
flexDirection="column"
transition="all 0.3s ease"
zIndex="10"
>
<HStack
spacing="$2"
p="$3"
borderBottom="1px solid $neutral6"
bgColor="$neutral2"
>
<Text fontWeight="$semibold" color="$neutral12">
{t("home.preview.pdf.document_outline")}
</Text>
<Box flex={1} />
<Tooltip withArrow label={t("home.preview.pdf.close_sidebar")}>
<IconButton
size="sm"
aria-label={t("home.preview.pdf.close_sidebar")}
icon={<VsClose />}
onClick={props.onClose}
/>
</Tooltip>
</HStack>
<Box flex={1} overflow="auto" p="$3">
<VStack spacing="$2" alignItems="stretch">
<Show
when={
props.store.documentOutline &&
props.store.documentOutline.length > 0
}
fallback={
<Text size="sm" color="$neutral11" textAlign="center" mt="$4">
{t("home.preview.pdf.no_outline")}
</Text>
}
>
<OutlineItems
items={props.store.documentOutline}
store={props.store}
/>
</Show>
</VStack>
</Box>
</Box>
</Show>
)
}
const Toolbar = (props: {
store: PDFSlickState
isOpen: boolean
onToggle: () => void
wantedPageNumber: () => number | string
onPageNumberChange: (value: string) => void
onPageNumberSubmit: (e: Event) => void
}) => {
const t = useT()
let pageNumberRef!: HTMLInputElement
const zoomPresets = [
["auto", t("home.preview.pdf.zoom_auto")],
["page-actual", t("home.preview.pdf.zoom_actual")],
["page-fit", t("home.preview.pdf.zoom_fit")],
["page-width", t("home.preview.pdf.zoom_width")],
] as const
const zoomLevels = [
[0.5, t("home.preview.pdf.zoom_50")],
[0.75, t("home.preview.pdf.zoom_75")],
[1, t("home.preview.pdf.zoom_100")],
[1.25, t("home.preview.pdf.zoom_125")],
[1.5, t("home.preview.pdf.zoom_150")],
[2, t("home.preview.pdf.zoom_200")],
] as const
const getCurrentZoomLabel = createMemo(() => {
if (props.store.scaleValue) {
const preset = zoomPresets.find(
([value]) => value === props.store.scaleValue,
)
if (preset) return preset[1]
}
return `${Math.floor(props.store.scale * 100)}%`
})
const handleZoomPreset = (value: string) => {
if (props.store.pdfSlick) {
props.store.pdfSlick.currentScaleValue = value
}
}
const handleZoomLevel = (value: number) => {
if (props.store.pdfSlick) {
props.store.pdfSlick.currentScale = value
}
}
const isInkMode = () =>
props.store.annotationEditorMode === AnnotationEditorType.INK
return (
<Box
pos="absolute"
left="50%"
transform="translateX(-50%)"
display="flex"
zIndex="1"
css={{
top: "$2",
bottom: "auto",
"@sm": {
top: "auto",
bottom: "$2",
},
}}
>
<HStack
spacing="$4"
w="auto"
p="$2"
rounded="$lg"
shadow="$lg"
bgColor="$neutral1"
opacity="0.7"
transition="all 0.2s ease-in-out"
_hover={{
opacity: "1",
}}
css={{
scale: "0.7",
"@sm": {
scale: "1",
},
}}
>
<Show
when={
props.store.documentOutline &&
props.store.documentOutline.length > 0
}
>
<Tooltip withArrow label={t("home.preview.pdf.toggle_sidebar")}>
<IconButton
size="sm"
colorScheme="neutral"
aria-label={t("home.preview.pdf.toggle_sidebar")}
icon={
props.isOpen ? (
<VsLayoutSidebarLeftOff />
) : (
<VsLayoutSidebarLeft />
)
}
onClick={props.onToggle}
/>
</Tooltip>
</Show>
<Tooltip withArrow label={t("home.preview.pdf.toggle_pen")}>
<IconButton
size="sm"
aria-label={t("home.preview.pdf.toggle_pen")}
colorScheme={(isInkMode() && "primary") || "neutral"}
onClick={() => {
const mode = isInkMode()
? AnnotationEditorType.NONE
: AnnotationEditorType.INK
props.store.pdfSlick?.setAnnotationEditorMode(mode)
props.store.pdfSlick?.setAnnotationEditorParams({
type: AnnotationEditorParamsType.INK_COLOR,
value: "#ff0000",
})
}}
icon={(isInkMode() && <BsPenFill />) || <BsPen />}
/>
</Tooltip>
<Divider orientation="vertical" h="24px" />
<ButtonGroup colorScheme="neutral" attached>
<Tooltip withArrow label={t("home.preview.pdf.zoom_out")}>
<IconButton
size="sm"
aria-label={t("home.preview.pdf.zoom_out")}
disabled={!props.store.pdfSlick || props.store.scale <= 0.25}
onClick={() => props.store.pdfSlick?.viewer?.decreaseScale()}
icon={<VsZoomOut />}
/>
</Tooltip>
<Menu motionPreset="scale-bottom-left">
<MenuTrigger as={Button} size="sm" minW="60px">
<Text size="sm">
{props.store.pdfSlick
? getCurrentZoomLabel()
: t("home.preview.pdf.loading")}
</Text>
</MenuTrigger>
<MenuContent>
<MenuGroup>
<MenuLabel>{t("home.preview.pdf.zoom_presets")}</MenuLabel>
<For each={zoomPresets}>
{(item) => (
<MenuItem onSelect={() => handleZoomPreset(item[0])}>
{item[1]}
</MenuItem>
)}
</For>
</MenuGroup>
<Divider role="presentation" my="$1" />
<MenuGroup>
<MenuLabel>{t("home.preview.pdf.zoom_levels")}</MenuLabel>
<For each={zoomLevels}>
{(item) => (
<MenuItem onSelect={() => handleZoomLevel(item[0])}>
{item[1]}
</MenuItem>
)}
</For>
</MenuGroup>
</MenuContent>
</Menu>
<Tooltip withArrow label={t("home.preview.pdf.zoom_in")}>
<IconButton
size="sm"
aria-label={t("home.preview.pdf.zoom_in")}
disabled={!props.store.pdfSlick || props.store.scale >= 5}
onClick={() => props.store.pdfSlick?.viewer?.increaseScale()}
icon={<VsZoomIn />}
/>
</Tooltip>
</ButtonGroup>
<Divider orientation="vertical" h="24px" />
<HStack spacing="$2" alignItems="center">
<form onSubmit={props.onPageNumberSubmit}>
<Input
size="sm"
ref={pageNumberRef}
type="text"
value={props.wantedPageNumber()}
w="50px"
textAlign="center"
onFocus={() => pageNumberRef!.select()}
onChange={(e) => props.onPageNumberChange(e.currentTarget.value)}
/>
</form>
<Text size="sm" minW="$full">
/ {props.store.numPages}
</Text>
</HStack>
<Tooltip withArrow label={t("home.preview.pdf.prev_page")}>
<IconButton
size="sm"
aria-label={t("home.preview.pdf.prev_page")}
colorScheme="neutral"
disabled={props.store.pageNumber <= 1}
onClick={() => props.store.pdfSlick?.viewer?.previousPage()}
icon={<VsChevronUp />}
/>
</Tooltip>
<Tooltip withArrow label={t("home.preview.pdf.next_page")}>
<IconButton
size="sm"
aria-label={t("home.preview.pdf.next_page")}
colorScheme="neutral"
disabled={
!props.store.pdfSlick ||
props.store.pageNumber >= props.store.numPages
}
onClick={() => props.store.pdfSlick?.viewer?.nextPage()}
icon={<VsChevronDown />}
/>
</Tooltip>
</HStack>
</Box>
)
}
export default PDFViewerApp

View File

@@ -71,14 +71,6 @@ export default defineConfig({
build: {
// target: "es2015", //next
// polyfillDynamicImport: false,
rollupOptions: {
output: {
assetFileNames: (assetInfo) =>
assetInfo.names?.some((name) => name.endsWith("pdf.worker.min.mjs"))
? "assets/[name]-[hash].js"
: "assets/[name]-[hash][extname]",
},
},
},
// experimental: {
// renderBuiltUrl: (filename, { type, hostId, hostType }) => {