@cocoar/vue-document-viewer 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +212 -0
- package/dist/CoarDocumentViewer.vue.d.ts +243 -0
- package/dist/CoarDocumentViewer.vue.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3283 -0
- package/dist/internal/AnnotationLayer.vue.d.ts +23 -0
- package/dist/internal/AnnotationLayer.vue.d.ts.map +1 -0
- package/dist/internal/AnnotationPopover.vue.d.ts +35 -0
- package/dist/internal/AnnotationPopover.vue.d.ts.map +1 -0
- package/dist/internal/DocumentAnnotationPanel.vue.d.ts +27 -0
- package/dist/internal/DocumentAnnotationPanel.vue.d.ts.map +1 -0
- package/dist/internal/DocumentInfoSection.vue.d.ts +18 -0
- package/dist/internal/DocumentInfoSection.vue.d.ts.map +1 -0
- package/dist/internal/DocumentSearchBar.vue.d.ts +23 -0
- package/dist/internal/DocumentSearchBar.vue.d.ts.map +1 -0
- package/dist/internal/DocumentSidebar.vue.d.ts +33 -0
- package/dist/internal/DocumentSidebar.vue.d.ts.map +1 -0
- package/dist/internal/DocumentToolbar.vue.d.ts +92 -0
- package/dist/internal/DocumentToolbar.vue.d.ts.map +1 -0
- package/dist/internal/PdfOutlineList.vue.d.ts +35 -0
- package/dist/internal/PdfOutlineList.vue.d.ts.map +1 -0
- package/dist/internal/effective-tools.d.ts +10 -0
- package/dist/internal/effective-tools.d.ts.map +1 -0
- package/dist/internal/page-provider.d.ts +51 -0
- package/dist/internal/page-provider.d.ts.map +1 -0
- package/dist/internal/useAnnotationEditor.d.ts +210 -0
- package/dist/internal/useAnnotationEditor.d.ts.map +1 -0
- package/dist/internal/useDocumentLoader.d.ts +20 -0
- package/dist/internal/useDocumentLoader.d.ts.map +1 -0
- package/dist/internal/usePageRenderer.d.ts +52 -0
- package/dist/internal/usePageRenderer.d.ts.map +1 -0
- package/dist/internal/usePdfSearch.d.ts +27 -0
- package/dist/internal/usePdfSearch.d.ts.map +1 -0
- package/dist/internal/usePositionMemory.d.ts +24 -0
- package/dist/internal/usePositionMemory.d.ts.map +1 -0
- package/dist/pdf.js +19 -0
- package/dist/source-types.d.ts +100 -0
- package/dist/source-types.d.ts.map +1 -0
- package/dist/sources/image-adapter.d.ts +38 -0
- package/dist/sources/image-adapter.d.ts.map +1 -0
- package/dist/sources/image-gallery-adapter.d.ts +14 -0
- package/dist/sources/image-gallery-adapter.d.ts.map +1 -0
- package/dist/sources/image.d.ts +32 -0
- package/dist/sources/image.d.ts.map +1 -0
- package/dist/sources/pdf-adapter.d.ts +27 -0
- package/dist/sources/pdf-adapter.d.ts.map +1 -0
- package/dist/sources/pdf.d.ts +20 -0
- package/dist/sources/pdf.d.ts.map +1 -0
- package/dist/types.d.ts +132 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/vue-document-viewer.css +2 -0
- package/package.json +64 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Ref, ShallowReactive, ShallowRef } from 'vue';
|
|
2
|
+
import { PageProvider, PageRotation } from './page-provider';
|
|
3
|
+
export type { PageRotation };
|
|
4
|
+
export interface PageEntry {
|
|
5
|
+
/** 0-based page index. */
|
|
6
|
+
index: number;
|
|
7
|
+
/** Intrinsic width in the source's native units (PDF user units, image natural px, …). */
|
|
8
|
+
intrinsicWidth: number;
|
|
9
|
+
intrinsicHeight: number;
|
|
10
|
+
/** Current display dimensions (intrinsic × scale, rotation-aware). */
|
|
11
|
+
displayWidth: number;
|
|
12
|
+
displayHeight: number;
|
|
13
|
+
/** Wrapper div ref — set by the template via `:ref="(el) => bindWrapper(index, el)"`. */
|
|
14
|
+
wrapper: HTMLDivElement | null;
|
|
15
|
+
/** Whether the canvas has been rasterized (at the current scale/rotation). */
|
|
16
|
+
rendered: boolean;
|
|
17
|
+
/** Whether a render is currently in flight. */
|
|
18
|
+
rendering: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface UsePageRendererOptions {
|
|
21
|
+
/** Pre-materialized page providers from the active source adapter. Null when no document is loaded. */
|
|
22
|
+
pageProviders: ShallowRef<PageProvider[] | null>;
|
|
23
|
+
/** Reactive zoom factor. 1 = 100%. */
|
|
24
|
+
scale: Ref<number>;
|
|
25
|
+
/** Reactive rotation in 90-degree steps. */
|
|
26
|
+
rotation: Ref<PageRotation>;
|
|
27
|
+
/** Reactive scroll-container element — used as the IntersectionObserver root. */
|
|
28
|
+
scrollContainer: Ref<HTMLElement | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Device-pixel-ratio multiplier applied to canvas raster dimensions only.
|
|
31
|
+
* Defaults to `window.devicePixelRatio` (clamped to 2 to avoid huge canvases).
|
|
32
|
+
*/
|
|
33
|
+
devicePixelRatio?: () => number;
|
|
34
|
+
}
|
|
35
|
+
export interface UsePageRendererReturn {
|
|
36
|
+
pages: ShallowReactive<PageEntry[]>;
|
|
37
|
+
/** 0-based index of the topmost visible page. */
|
|
38
|
+
visiblePage: Ref<number>;
|
|
39
|
+
/** Bind a wrapper element from the template's `:ref`. */
|
|
40
|
+
bindWrapper: (index: number, el: unknown) => void;
|
|
41
|
+
/** Scroll the given page into view. */
|
|
42
|
+
scrollToPage: (index: number, opts?: {
|
|
43
|
+
behavior?: ScrollBehavior;
|
|
44
|
+
}) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Invalidate all rendered canvases (call after scale or rotation changes).
|
|
47
|
+
* Visible pages re-render immediately; off-screen pages re-render on intersect.
|
|
48
|
+
*/
|
|
49
|
+
invalidateRenders: () => void;
|
|
50
|
+
}
|
|
51
|
+
export declare function usePageRenderer(options: UsePageRendererOptions): UsePageRendererReturn;
|
|
52
|
+
//# sourceMappingURL=usePageRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePageRenderer.d.ts","sourceRoot":"","sources":["../../src/internal/usePageRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,KAAK,CAAC;AACb,OAAO,EAAiB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEtF,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,MAAM,WAAW,SAAS;IACxB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,uGAAuG;IACvG,aAAa,EAAE,UAAU,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,sCAAsC;IACtC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,4CAA4C;IAC5C,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,iFAAiF;IACjF,eAAe,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IACpC,iDAAiD;IACjD,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,yDAAyD;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,uCAAuC;IACvC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E;;;OAGG;IACH,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAoUtF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Ref, ShallowRef } from 'vue';
|
|
2
|
+
import { PDFDocumentProxy } from 'pdfjs-dist';
|
|
3
|
+
import { CoarPdfRect } from '../types';
|
|
4
|
+
export interface SearchMatch {
|
|
5
|
+
pageIndex: number;
|
|
6
|
+
/** Normalised rects covering the match (multiple if the match spans items). */
|
|
7
|
+
rects: CoarPdfRect[];
|
|
8
|
+
/** The matched substring (for accessibility / debug). */
|
|
9
|
+
text: string;
|
|
10
|
+
}
|
|
11
|
+
export interface UsePdfSearchOptions {
|
|
12
|
+
doc: ShallowRef<PDFDocumentProxy | null>;
|
|
13
|
+
}
|
|
14
|
+
export interface UsePdfSearchReturn {
|
|
15
|
+
query: Ref<string>;
|
|
16
|
+
caseSensitive: Ref<boolean>;
|
|
17
|
+
matches: Ref<SearchMatch[]>;
|
|
18
|
+
currentIndex: Ref<number>;
|
|
19
|
+
currentMatch: Ref<SearchMatch | null>;
|
|
20
|
+
searching: Ref<boolean>;
|
|
21
|
+
setQuery: (q: string) => Promise<void>;
|
|
22
|
+
next: () => void;
|
|
23
|
+
prev: () => void;
|
|
24
|
+
clear: () => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function usePdfSearch(opts: UsePdfSearchOptions): UsePdfSearchReturn;
|
|
27
|
+
//# sourceMappingURL=usePdfSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePdfSearch.d.ts","sourceRoot":"","sources":["../../src/internal/usePdfSearch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAwB,KAAK,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,YAAY,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAsCD,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CA6O1E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ComputedRef, Ref, ShallowReactive } from 'vue';
|
|
2
|
+
import { PageEntry, PageRotation } from './usePageRenderer';
|
|
3
|
+
import { CoarDocumentViewerPosition } from '../CoarDocumentViewer.vue';
|
|
4
|
+
export interface UsePositionMemoryOptions {
|
|
5
|
+
storageKey: ComputedRef<string | undefined>;
|
|
6
|
+
/** Consumer-bound position (v-model). When undefined, only storageKey is used. */
|
|
7
|
+
externalPosition: ComputedRef<CoarDocumentViewerPosition | undefined>;
|
|
8
|
+
/** Whether the document is loaded — restore once this turns true. */
|
|
9
|
+
ready: ComputedRef<boolean>;
|
|
10
|
+
scrollContainer: Ref<HTMLElement | null>;
|
|
11
|
+
pages: ShallowReactive<PageEntry[]>;
|
|
12
|
+
visiblePage: Ref<number>;
|
|
13
|
+
scale: Ref<number>;
|
|
14
|
+
rotation: Ref<PageRotation>;
|
|
15
|
+
/** Emit `update:position`. The composable also calls this when storageKey-only. */
|
|
16
|
+
emitPosition: (value: CoarDocumentViewerPosition) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function usePositionMemory(opts: UsePositionMemoryOptions): {
|
|
19
|
+
/** Current view position, recomputed on demand (not reactive). */
|
|
20
|
+
current: ComputedRef<CoarDocumentViewerPosition | null>;
|
|
21
|
+
/** Force a save right now (e.g. on explicit user action). */
|
|
22
|
+
flush: () => void;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=usePositionMemory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePositionMemory.d.ts","sourceRoot":"","sources":["../../src/internal/usePositionMemory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,eAAe,EACrB,MAAM,KAAK,CAAC;AACb,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,kFAAkF;IAClF,gBAAgB,EAAE,WAAW,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;IACtE,qEAAqE;IACrE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAE5B,eAAe,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IACpC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAE5B,mFAAmF;IACnF,YAAY,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;CAC3D;AAqCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB;IA8L5D,kEAAkE;;IAElE,6DAA6D;;EAGhE"}
|
package/dist/pdf.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/sources/pdf.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = {
|
|
4
|
+
kind: "pdf",
|
|
5
|
+
url: e.url,
|
|
6
|
+
headers: Object.freeze({ ...e.headers ?? {} }),
|
|
7
|
+
withCredentials: e.withCredentials ?? !0,
|
|
8
|
+
capabilities: Object.freeze({
|
|
9
|
+
multiPage: !0,
|
|
10
|
+
textLayer: !0,
|
|
11
|
+
search: !0,
|
|
12
|
+
outline: !0,
|
|
13
|
+
print: !0
|
|
14
|
+
})
|
|
15
|
+
};
|
|
16
|
+
return Object.freeze(t);
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { e as pdfSource };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability flags advertised by a `DocumentSource`. The toolbar reads
|
|
3
|
+
* these to decide which tools to enable/disable — e.g. a single-page image
|
|
4
|
+
* source sets `multiPage: false` so the prev/next/page-input buttons go
|
|
5
|
+
* disabled rather than disappearing.
|
|
6
|
+
*
|
|
7
|
+
* Adding capabilities: name them after the *feature* (search, outline) not
|
|
8
|
+
* the *file type*, so future sources can mix-and-match (e.g. a future OCR'd
|
|
9
|
+
* image source could set `search: true`).
|
|
10
|
+
*/
|
|
11
|
+
export interface DocumentSourceCapabilities {
|
|
12
|
+
/** True if the document has more than one page. Drives prev/next/page-input. */
|
|
13
|
+
multiPage: boolean;
|
|
14
|
+
/** True if pages expose selectable text. Drives Ctrl+C copy + the textLayer DOM. */
|
|
15
|
+
textLayer: boolean;
|
|
16
|
+
/** True if the source can be searched for substring matches. Drives search button. */
|
|
17
|
+
search: boolean;
|
|
18
|
+
/** True if the source exposes a navigable outline (table of contents). Drives outline tab. */
|
|
19
|
+
outline: boolean;
|
|
20
|
+
/** True if the source can be printed. Drives print button (some formats can't print sensibly). */
|
|
21
|
+
print: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Tagged union of supported document kinds. Consumers build a source via the
|
|
25
|
+
* matching factory (`pdfSource()`, `imageSource()`, …) — they don't construct
|
|
26
|
+
* the union members directly. The viewer dispatches internally on `kind`.
|
|
27
|
+
*
|
|
28
|
+
* This shape is intentionally opaque from the consumer's POV: implementation
|
|
29
|
+
* fields beyond `kind` and `capabilities` are read by the viewer only.
|
|
30
|
+
*/
|
|
31
|
+
export type DocumentSource = PdfDocumentSource | ImageDocumentSource | ImageGalleryDocumentSource;
|
|
32
|
+
export interface PdfDocumentSource {
|
|
33
|
+
readonly kind: 'pdf';
|
|
34
|
+
readonly capabilities: DocumentSourceCapabilities;
|
|
35
|
+
/** Source URL the pdfjs loader will fetch. */
|
|
36
|
+
readonly url: string;
|
|
37
|
+
/** Extra HTTP headers (e.g. `Authorization`). */
|
|
38
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
39
|
+
/** Whether to send cookies / HTTP auth with the fetch. */
|
|
40
|
+
readonly withCredentials: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ImageDocumentSource {
|
|
43
|
+
readonly kind: 'image';
|
|
44
|
+
readonly capabilities: DocumentSourceCapabilities;
|
|
45
|
+
/** Image URL — anything an `<img src>` can handle (JPG, PNG, SVG, WebP, …). */
|
|
46
|
+
readonly url: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Multiple images presented as the pages of a single document. Page count
|
|
50
|
+
* is `urls.length`; each image gets its own intrinsic dimensions, so a
|
|
51
|
+
* gallery can mix landscape + portrait pages without any extra rigging.
|
|
52
|
+
*/
|
|
53
|
+
export interface ImageGalleryDocumentSource {
|
|
54
|
+
readonly kind: 'image-gallery';
|
|
55
|
+
readonly capabilities: DocumentSourceCapabilities;
|
|
56
|
+
/** Image URLs, one per page. Order in the array = order in the document. */
|
|
57
|
+
readonly urls: readonly string[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Source-level metadata surfaced by the active adapter. The viewer's optional
|
|
61
|
+
* Info panel reads these; consumers can also read them off the
|
|
62
|
+
* `useDocumentLoader` return for their own UI (analytics, audit logs, etc).
|
|
63
|
+
*
|
|
64
|
+
* Every field except `kind`, `format`, and `pageCount` is optional — they're
|
|
65
|
+
* only populated when the source has them. The `pdf` block applies only to
|
|
66
|
+
* PDF sources (always absent for images).
|
|
67
|
+
*/
|
|
68
|
+
export interface DocumentInfo {
|
|
69
|
+
/** Discriminator matching `DocumentSource.kind`. */
|
|
70
|
+
readonly kind: DocumentSource['kind'];
|
|
71
|
+
/**
|
|
72
|
+
* Human-readable format string. Examples:
|
|
73
|
+
* - `"PDF · v1.7"`
|
|
74
|
+
* - `"Image · PNG"`
|
|
75
|
+
* - `"Image gallery · mixed"`
|
|
76
|
+
*/
|
|
77
|
+
readonly format: string;
|
|
78
|
+
/** Total page count. Always present; 1 for `imageSource`, `urls.length` for galleries, `doc.numPages` for PDFs. */
|
|
79
|
+
readonly pageCount: number;
|
|
80
|
+
/** File size in bytes when known. PDFs surface this via the pdfjs `contentLength`; image / gallery sources omit it. */
|
|
81
|
+
readonly bytes?: number;
|
|
82
|
+
/** PDF-only block — present iff `kind === 'pdf'`. Fields inside are individually optional. */
|
|
83
|
+
readonly pdf?: PdfMetadata;
|
|
84
|
+
}
|
|
85
|
+
export interface PdfMetadata {
|
|
86
|
+
readonly title?: string;
|
|
87
|
+
readonly author?: string;
|
|
88
|
+
readonly subject?: string;
|
|
89
|
+
readonly keywords?: string;
|
|
90
|
+
/** Tool that authored the source content (e.g. `"TeX"`, `"Microsoft Word"`). */
|
|
91
|
+
readonly creator?: string;
|
|
92
|
+
/** Tool that produced the final PDF binary (e.g. `"pdfTeX-1.40.10"`). */
|
|
93
|
+
readonly producer?: string;
|
|
94
|
+
/** Human-readable ISO-ish creation date (`YYYY-MM-DD HH:mm:ss`) parsed from the PDF date string. */
|
|
95
|
+
readonly creationDate?: string;
|
|
96
|
+
readonly modificationDate?: string;
|
|
97
|
+
/** PDF specification version (e.g. `"1.7"`). */
|
|
98
|
+
readonly version?: string;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=source-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-types.d.ts","sourceRoot":"","sources":["../src/source-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,0BAA0B;IACzC,gFAAgF;IAChF,SAAS,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,MAAM,EAAE,OAAO,CAAC;IAChB,8FAA8F;IAC9F,OAAO,EAAE,OAAO,CAAC;IACjB,kGAAkG;IAClG,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,0BAA0B,CAAC;AAElG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAClD,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,0DAA0D;IAC1D,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAClD,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,0BAA0B,CAAC;IAClD,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mHAAmH;IACnH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uHAAuH;IACvH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,oGAAoG;IACpG,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,gDAAgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Ref, ShallowRef, ComputedRef } from 'vue';
|
|
2
|
+
import { DocumentInfo, ImageDocumentSource } from '../source-types';
|
|
3
|
+
import { PageProvider } from '../internal/page-provider';
|
|
4
|
+
import { DocumentStatus } from './pdf-adapter';
|
|
5
|
+
export interface ImageDocumentAdapterReturn {
|
|
6
|
+
status: Ref<DocumentStatus>;
|
|
7
|
+
pageProviders: ShallowRef<PageProvider[] | null>;
|
|
8
|
+
info: ShallowRef<DocumentInfo | null>;
|
|
9
|
+
error: Ref<unknown>;
|
|
10
|
+
retry: () => void;
|
|
11
|
+
destroy: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Best-effort image format inference from the URL. Recognized:
|
|
15
|
+
* - `data:image/<mime>;…` data URLs
|
|
16
|
+
* - file extensions on http(s) / blob: URLs
|
|
17
|
+
*
|
|
18
|
+
* Returns an upper-cased short label (`PNG`, `SVG`, …) suitable for
|
|
19
|
+
* displaying after the kind in the Info panel. Falls back to `'Image'`
|
|
20
|
+
* when the URL is opaque (e.g. an `<img>` proxy without a hint).
|
|
21
|
+
*/
|
|
22
|
+
export declare function inferImageFormat(url: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Wrap a loaded `HTMLImageElement` in a single-page `PageProvider`.
|
|
25
|
+
*
|
|
26
|
+
* `render()` clears the canvas to white, then `drawImage`s the picture at the
|
|
27
|
+
* requested scale, applying a `ctx.rotate` for non-zero rotations. Cancel is
|
|
28
|
+
* a no-op because `drawImage` is synchronous — no in-flight work to abort.
|
|
29
|
+
*
|
|
30
|
+
* `getTextLayer` is omitted entirely so `usePageRenderer` skips creating the
|
|
31
|
+
* `.textLayer` div (pdfjs's stylesheet would otherwise make it block clicks
|
|
32
|
+
* on the image — see `page-provider.ts`).
|
|
33
|
+
*
|
|
34
|
+
* Exported so the image-gallery adapter can reuse the per-image draw path.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createImagePageProvider(img: HTMLImageElement): PageProvider;
|
|
37
|
+
export declare function useImageDocumentAdapter(sourceRef: ComputedRef<ImageDocumentSource | null>): ImageDocumentAdapterReturn;
|
|
38
|
+
//# sourceMappingURL=image-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-adapter.d.ts","sourceRoot":"","sources":["../../src/sources/image-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,KAAK,CAAC;AACb,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,aAAa,EAAE,UAAU,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,IAAI,EAAE,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACtC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBpD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAsD3E;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,GACjD,0BAA0B,CAyE5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Ref, ShallowRef, ComputedRef } from 'vue';
|
|
2
|
+
import { DocumentInfo, ImageGalleryDocumentSource } from '../source-types';
|
|
3
|
+
import { PageProvider } from '../internal/page-provider';
|
|
4
|
+
import { DocumentStatus } from './pdf-adapter';
|
|
5
|
+
export interface ImageGalleryAdapterReturn {
|
|
6
|
+
status: Ref<DocumentStatus>;
|
|
7
|
+
pageProviders: ShallowRef<PageProvider[] | null>;
|
|
8
|
+
info: ShallowRef<DocumentInfo | null>;
|
|
9
|
+
error: Ref<unknown>;
|
|
10
|
+
retry: () => void;
|
|
11
|
+
destroy: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare function useImageGalleryAdapter(sourceRef: ComputedRef<ImageGalleryDocumentSource | null>): ImageGalleryAdapterReturn;
|
|
14
|
+
//# sourceMappingURL=image-gallery-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-gallery-adapter.d.ts","sourceRoot":"","sources":["../../src/sources/image-gallery-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,KAAK,CAAC;AACb,OAAO,KAAK,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,aAAa,EAAE,UAAU,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,IAAI,EAAE,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACtC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAYD,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,CAAC,0BAA0B,GAAG,IAAI,CAAC,GACxD,yBAAyB,CAoF3B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DocumentSource } from '../source-types';
|
|
2
|
+
export interface ImageSourceOptions {
|
|
3
|
+
/** Image URL. Anything `<img src>` can handle: JPG, PNG, SVG, WebP, AVIF, GIF, blob:, data:. */
|
|
4
|
+
url: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function imageSource(opts: ImageSourceOptions): DocumentSource;
|
|
7
|
+
export interface ImageGallerySourceOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Image URLs, one per page. Order in the array = order in the document.
|
|
10
|
+
* Mixing portrait + landscape pages is fine — each image carries its own
|
|
11
|
+
* intrinsic dimensions.
|
|
12
|
+
*/
|
|
13
|
+
urls: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Multi-page image document. Use when an "attachment" is really a series of
|
|
17
|
+
* scanned pages, photographed receipts, slide images, etc.
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { imageGallerySource } from '@cocoar/vue-document-viewer';
|
|
21
|
+
*
|
|
22
|
+
* const source = imageGallerySource({
|
|
23
|
+
* urls: ['/scans/page-1.jpg', '/scans/page-2.jpg', '/scans/page-3.jpg'],
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* Single-image case (`urls.length === 1`) works but is identical in effect
|
|
28
|
+
* to `imageSource()` — prefer the latter when you know there's only one
|
|
29
|
+
* image; it's the clearer expression of intent.
|
|
30
|
+
*/
|
|
31
|
+
export declare function imageGallerySource(opts: ImageGallerySourceOptions): DocumentSource;
|
|
32
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/sources/image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,gGAAgG;IAChG,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAiBpE;AAED,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,cAAc,CAgBlF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Ref, ShallowRef, ComputedRef } from 'vue';
|
|
2
|
+
import { PDFDocumentProxy } from 'pdfjs-dist';
|
|
3
|
+
import { DocumentInfo, PdfDocumentSource } from '../source-types';
|
|
4
|
+
import { PageProvider } from '../internal/page-provider';
|
|
5
|
+
export type DocumentStatus = 'idle' | 'loading' | 'ready' | 'error';
|
|
6
|
+
export interface PdfDocumentAdapterReturn {
|
|
7
|
+
status: Ref<DocumentStatus>;
|
|
8
|
+
/** The pdfjs document — kept as a PDF-only escape hatch for sidebar + search. */
|
|
9
|
+
pdfDoc: ShallowRef<PDFDocumentProxy | null>;
|
|
10
|
+
/** Source-agnostic page providers consumed by `usePageRenderer`. */
|
|
11
|
+
pageProviders: ShallowRef<PageProvider[] | null>;
|
|
12
|
+
/** Source-level metadata — null until the document is ready. */
|
|
13
|
+
info: ShallowRef<DocumentInfo | null>;
|
|
14
|
+
error: Ref<unknown>;
|
|
15
|
+
/** Reload the current source. No-op when source is null. */
|
|
16
|
+
retry: () => void;
|
|
17
|
+
/** Tear down the loaded document + cancel any in-flight load. */
|
|
18
|
+
destroy: () => Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse a PDF date string (`D:YYYYMMDDHHmmSS+HH'mm'`) into a human-readable
|
|
22
|
+
* ISO-ish form. Returns the raw string when the format isn't recognized so
|
|
23
|
+
* the field is still surfaced rather than silently dropped.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parsePdfDate(raw: string | undefined): string | undefined;
|
|
26
|
+
export declare function usePdfDocumentAdapter(sourceRef: ComputedRef<PdfDocumentSource | null>): PdfDocumentAdapterReturn;
|
|
27
|
+
//# sourceMappingURL=pdf-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-adapter.d.ts","sourceRoot":"","sources":["../../src/sources/pdf-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA2C,KAAK,GAAG,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAE3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAe,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAErF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,iFAAiF;IACjF,MAAM,EAAE,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC5C,oEAAoE;IACpE,aAAa,EAAE,UAAU,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,gEAAgE;IAChE,IAAI,EAAE,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACtC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,iEAAiE;IACjE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMxE;AAiBD,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAC/C,wBAAwB,CAuL1B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DocumentSource } from '../source-types';
|
|
2
|
+
export interface PdfSourceOptions {
|
|
3
|
+
/** PDF URL. Relative or absolute; CORS rules apply. */
|
|
4
|
+
url: string;
|
|
5
|
+
/**
|
|
6
|
+
* Extra HTTP headers forwarded to pdfjs's request. Common case: bearer
|
|
7
|
+
* tokens for authenticated endpoints.
|
|
8
|
+
*/
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
/**
|
|
11
|
+
* Whether to send cookies / HTTP auth with the fetch. Default `true` —
|
|
12
|
+
* the common Cocoar case is a same-origin cookie-authenticated endpoint.
|
|
13
|
+
* Set false for public cross-origin PDFs served with
|
|
14
|
+
* `Access-Control-Allow-Origin: *` (wildcards reject credentials).
|
|
15
|
+
*/
|
|
16
|
+
withCredentials?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function pdfSource(opts: PdfSourceOptions): DocumentSource;
|
|
19
|
+
export type { DocumentSource, DocumentSourceCapabilities, PdfDocumentSource } from '../source-types';
|
|
20
|
+
//# sourceMappingURL=pdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/sources/pdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,iBAAiB,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,cAAc,CAehE;AAID,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toolbar tool identifiers — pass an array of these to `CoarDocumentViewer`'s
|
|
3
|
+
* `tools` prop. The array drives BOTH the visible set AND the order they
|
|
4
|
+
* appear in, so consumers can rearrange the layout however they want:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* tools: ['prev-page', 'page-input', 'next-page', 'separator', 'zoom-out', 'zoom-reset', 'zoom-in']
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* When omitted, `COAR_DOCUMENT_VIEWER_ALL_TOOLS` is used as the default.
|
|
11
|
+
*
|
|
12
|
+
* Use `'separator'` to place a visual divider between groups. Leading +
|
|
13
|
+
* trailing separators are auto-trimmed and consecutive separators collapse
|
|
14
|
+
* to one — so it's safe to leave a separator after a tool that the section
|
|
15
|
+
* toggles end up filtering out.
|
|
16
|
+
*
|
|
17
|
+
* Mirrors the markdown-editor's `tools` API so consumers using both packages
|
|
18
|
+
* have the same mental model for toolbar configuration.
|
|
19
|
+
*/
|
|
20
|
+
export type CoarDocumentViewerTool = 'sidebar-toggle' | 'prev-page' | 'next-page' | 'page-input' | 'zoom-out' | 'zoom-reset' | 'zoom-in' | 'fit-width' | 'fit-page' | 'pan' | 'reset-view' | 'rotate-ccw' | 'rotate-cw' | 'select' | 'eraser' | 'marker' | 'note' | 'ink' | 'freetext' | 'search' | 'annotations-panel' | 'print' | 'download'
|
|
21
|
+
/**
|
|
22
|
+
* Visual divider between toolbar groups. Renders as a `CoarSidebarDivider`.
|
|
23
|
+
* Place anywhere in `tools` to introduce a separator at that point.
|
|
24
|
+
*/
|
|
25
|
+
| 'separator';
|
|
26
|
+
/**
|
|
27
|
+
* Default toolbar layout. Drives both which tools render AND the order.
|
|
28
|
+
* Separators sit at the original group boundaries (panels / nav / zoom /
|
|
29
|
+
* view / rotation / pointer-modes / drawing / doc-actions).
|
|
30
|
+
*
|
|
31
|
+
* Re-use freely:
|
|
32
|
+
* - filter to a subset: `COAR_DOCUMENT_VIEWER_ALL_TOOLS.filter(t => t !== 'print')`
|
|
33
|
+
* - custom layout: `['prev-page', 'page-input', 'next-page', 'separator', 'zoom-out', 'zoom-reset', 'zoom-in']`
|
|
34
|
+
*/
|
|
35
|
+
export declare const COAR_DOCUMENT_VIEWER_ALL_TOOLS: readonly CoarDocumentViewerTool[];
|
|
36
|
+
/**
|
|
37
|
+
* Coordinates are page-relative and normalized to [0..1] — multiply by current page
|
|
38
|
+
* viewport on render so the same annotation renders correctly at any zoom or rotation.
|
|
39
|
+
*/
|
|
40
|
+
export interface CoarPdfPoint {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
}
|
|
44
|
+
export interface CoarPdfRect {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
w: number;
|
|
48
|
+
h: number;
|
|
49
|
+
}
|
|
50
|
+
export type CoarPdfAnnotationType = 'marker' | 'comment' | 'ink' | 'freetext';
|
|
51
|
+
/**
|
|
52
|
+
* Pointer-interaction mode for the annotation overlay.
|
|
53
|
+
*
|
|
54
|
+
* - `'view'` — read-only; existing annotations are clickable to open the
|
|
55
|
+
* edit popover, but no new annotations are created.
|
|
56
|
+
* - `'select'` — existing annotations are clickable AND draggable (move).
|
|
57
|
+
* - `'eraser'` — clicking a stroke on a marker/ink annotation removes that
|
|
58
|
+
* stroke; the annotation is deleted when the last stroke goes.
|
|
59
|
+
* - The four annotation types (`'marker' | 'comment' | 'ink' | 'freetext'`)
|
|
60
|
+
* are creation modes — pointer interactions on a page wrapper produce new
|
|
61
|
+
* annotations of the matching kind.
|
|
62
|
+
*/
|
|
63
|
+
export type CoarPdfAnnotationMode = 'view' | 'select' | 'eraser' | CoarPdfAnnotationType;
|
|
64
|
+
interface BaseAnnotation {
|
|
65
|
+
id: string;
|
|
66
|
+
type: CoarPdfAnnotationType;
|
|
67
|
+
/** 0-based page index. */
|
|
68
|
+
pageIndex: number;
|
|
69
|
+
/** CSS color. */
|
|
70
|
+
color: string;
|
|
71
|
+
/** ISO timestamp. */
|
|
72
|
+
createdAt: string;
|
|
73
|
+
/** Consumer-provided display string (e.g. user name). */
|
|
74
|
+
createdBy?: string;
|
|
75
|
+
/** Optional text body — every type can carry a comment. */
|
|
76
|
+
comment?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface CoarPdfCommentAnnotation extends BaseAnnotation {
|
|
79
|
+
type: 'comment';
|
|
80
|
+
/** Pin position in normalized page coords. */
|
|
81
|
+
anchor: CoarPdfPoint;
|
|
82
|
+
/** Required for comment annotations. */
|
|
83
|
+
comment: string;
|
|
84
|
+
}
|
|
85
|
+
export interface CoarPdfInkAnnotation extends BaseAnnotation {
|
|
86
|
+
type: 'ink';
|
|
87
|
+
/** SVG-style polyline list — each path is a sequence of normalized points. */
|
|
88
|
+
strokes: CoarPdfPoint[][];
|
|
89
|
+
/** Stroke width in CSS pixels at zoom=1. */
|
|
90
|
+
width: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Freeform highlighter — drawn like a felt-tip marker, semi-transparent over
|
|
94
|
+
* the underlying content. Same wire shape as an ink annotation, but renders
|
|
95
|
+
* with `mix-blend-mode: multiply` and a thicker default width so existing
|
|
96
|
+
* text reads through it.
|
|
97
|
+
*/
|
|
98
|
+
export interface CoarPdfMarkerAnnotation extends BaseAnnotation {
|
|
99
|
+
type: 'marker';
|
|
100
|
+
strokes: CoarPdfPoint[][];
|
|
101
|
+
/** Stroke width in CSS pixels at zoom=1. Defaults to one of the preset thicknesses. */
|
|
102
|
+
width: number;
|
|
103
|
+
}
|
|
104
|
+
export interface CoarPdfFreetextAnnotation extends BaseAnnotation {
|
|
105
|
+
type: 'freetext';
|
|
106
|
+
rect: CoarPdfRect;
|
|
107
|
+
text: string;
|
|
108
|
+
/** Font size in CSS pixels at zoom=1. */
|
|
109
|
+
fontSize: number;
|
|
110
|
+
}
|
|
111
|
+
export type CoarPdfAnnotation = CoarPdfMarkerAnnotation | CoarPdfCommentAnnotation | CoarPdfInkAnnotation | CoarPdfFreetextAnnotation;
|
|
112
|
+
/**
|
|
113
|
+
* Distributive Omit — preserves the discriminated-union structure when stripping
|
|
114
|
+
* shared keys. Plain `Omit<A | B, K>` collapses the union into a single
|
|
115
|
+
* intersection, which breaks narrowing by `type` at the call site.
|
|
116
|
+
*/
|
|
117
|
+
type DistributiveOmit<T, K extends keyof never> = T extends unknown ? Omit<T, K> : never;
|
|
118
|
+
/**
|
|
119
|
+
* Payload emitted by `@annotation:create`. Consumer assigns `id`, `createdAt`, and
|
|
120
|
+
* optionally `createdBy`, then pushes the result into the `annotations` prop.
|
|
121
|
+
*/
|
|
122
|
+
export type CoarPdfAnnotationCreatePayload = DistributiveOmit<CoarPdfAnnotation, 'id' | 'createdAt' | 'createdBy'>;
|
|
123
|
+
/**
|
|
124
|
+
* Payload emitted by `@annotation:update`. Consumer merges `patch` into the
|
|
125
|
+
* existing annotation identified by `id`.
|
|
126
|
+
*/
|
|
127
|
+
export interface CoarPdfAnnotationUpdatePayload {
|
|
128
|
+
id: string;
|
|
129
|
+
patch: Partial<CoarPdfAnnotation>;
|
|
130
|
+
}
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,sBAAsB,GAC9B,gBAAgB,GAChB,WAAW,GACX,WAAW,GACX,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,SAAS,GACT,WAAW,GACX,UAAU,GACV,KAAK,GACL,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,KAAK,GACL,UAAU,GACV,QAAQ,GACR,mBAAmB,GACnB,OAAO,GACP,UAAU;AACZ;;;GAGG;GACD,WAAW,CAAC;AAEhB;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,EAAE,SAAS,sBAAsB,EAuC3E,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,qBAAqB,CAAC;AAEzF,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,qBAAqB,CAAC;IAC5B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,IAAI,EAAE,SAAS,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,YAAY,CAAC;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,IAAI,EAAE,KAAK,CAAC;IACZ,8EAA8E;IAC9E,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;IAC1B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC;IAC1B,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAC/D,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GACzB,uBAAuB,GACvB,wBAAwB,GACxB,oBAAoB,GACpB,yBAAyB,CAAC;AAE9B;;;;GAIG;AACH,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,KAAK,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;AAEzF;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,CAC3D,iBAAiB,EACjB,IAAI,GAAG,WAAW,GAAG,WAAW,CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACnC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.coar-pdf-toolbar[data-v-131f9026]{flex:none}.coar-pdf-toolbar__inline-page[data-v-131f9026]{font-variant-numeric:tabular-nums;align-items:center;gap:4px;padding:0 6px;font-size:12px;display:inline-flex}.coar-pdf-toolbar__inline-page--disabled[data-v-131f9026]{opacity:.4}.coar-pdf-toolbar__inline-page--disabled .coar-pdf-toolbar__page-input[data-v-131f9026]{cursor:not-allowed}.coar-pdf-toolbar__zoom-readout[data-v-131f9026]{font-variant-numeric:tabular-nums;align-items:center;gap:2px;padding:0 6px;font-size:12px;display:inline-flex}.coar-pdf-toolbar__zoom-input[data-v-131f9026]{border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface,#fff);width:3.2em;height:22px;color:inherit;font:inherit;font-variant-numeric:tabular-nums;text-align:right;border-radius:4px;outline:none;padding:0 4px;font-size:12px}.coar-pdf-toolbar__zoom-input[data-v-131f9026]:focus-visible{border-color:var(--coar-color-accent,#2563eb);box-shadow:0 0 0 2px var(--coar-color-accent-tint,#2563eb33)}.coar-pdf-toolbar__zoom-suffix[data-v-131f9026]{color:var(--coar-color-fg-muted,#6b7280);pointer-events:none}.coar-pdf-toolbar__page-input[data-v-131f9026]{border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface,#fff);width:3em;height:22px;color:inherit;font:inherit;text-align:center;font-variant-numeric:tabular-nums;border-radius:4px;padding:0 4px}.coar-pdf-toolbar__page-input[data-v-131f9026]:focus{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:0;border-color:var(--coar-color-accent,#2563eb)}.coar-pdf-toolbar__page-sep[data-v-131f9026],.coar-pdf-toolbar__page-total[data-v-131f9026]{color:var(--coar-color-fg-muted,#6b7280)}.coar-pdf-toolbar__flyout[data-v-131f9026]{flex-direction:column;gap:8px;min-width:220px;padding:10px;display:flex}.coar-pdf-toolbar__flyout-row[data-v-131f9026]{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.coar-pdf-toolbar__flyout-width[data-v-131f9026]{appearance:none;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;width:30px;height:30px;padding:0;display:inline-flex}.coar-pdf-toolbar__flyout-width[data-v-131f9026]:hover{background:var(--coar-color-surface-3,#0000000d)}.coar-pdf-toolbar__flyout-width--active[data-v-131f9026]{border-color:var(--coar-color-accent,#2563eb)}.coar-pdf-toolbar__flyout-width-dot[data-v-131f9026]{border-radius:50%;display:block;box-shadow:inset 0 0 0 1px #00000026}.coar-pdf-toolbar__flyout-color[data-v-131f9026]{appearance:none;cursor:pointer;border:2px solid #0000;border-radius:50%;width:22px;height:22px;padding:0;box-shadow:inset 0 0 0 1px #0000001a}.coar-pdf-toolbar__flyout-color--active[data-v-131f9026]{border-color:var(--coar-color-accent,#2563eb);outline:1px solid var(--coar-color-surface,#fff)}.coar-pdf-toolbar__flyout-color[data-v-131f9026]:focus-visible{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:1px}.coar-pdf-searchbar[data-v-ec33c527]{background:var(--coar-pdf-toolbar-bg);color:var(--coar-pdf-toolbar-fg);border-bottom:1px solid var(--coar-color-border,#e5e7eb);align-items:center;gap:6px;padding:4px 8px;font-size:13px;display:flex}.coar-pdf-searchbar__icon[data-v-ec33c527]{color:var(--coar-color-fg-muted,#6b7280);flex-shrink:0}.coar-pdf-searchbar__input[data-v-ec33c527]{border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface,#fff);min-width:0;height:24px;color:inherit;font:inherit;border-radius:4px;flex:auto;padding:0 8px}.coar-pdf-searchbar__input[data-v-ec33c527]:focus{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:0;border-color:var(--coar-color-accent,#2563eb)}.coar-pdf-searchbar__count[data-v-ec33c527]{font-variant-numeric:tabular-nums;text-align:center;min-width:4em;color:var(--coar-color-fg-muted,#6b7280)}.coar-pdf-searchbar__count[data-empty=true][data-v-ec33c527]{visibility:hidden}.coar-pdf-searchbar__btn[data-v-ec33c527]{appearance:none;width:26px;height:26px;color:inherit;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;padding:0;display:inline-flex}.coar-pdf-searchbar__btn[data-v-ec33c527]:hover:not(:disabled){background:var(--coar-color-surface-3,#0000000f)}.coar-pdf-searchbar__btn[data-v-ec33c527]:focus-visible{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:1px}.coar-pdf-searchbar__btn[data-v-ec33c527]:disabled{opacity:.4;cursor:not-allowed}.coar-pdf-sidebar[data-v-d8662946]{background:var(--coar-color-surface-2,#f6f7f8);border-right:1px solid var(--coar-color-border,#e5e7eb);flex-direction:column;flex:0 0 200px;width:200px;font-size:12px;display:flex;overflow:hidden}.coar-pdf-sidebar__header[data-v-d8662946]{border-bottom:1px solid var(--coar-color-border,#e5e7eb);align-items:center;gap:4px;padding:4px 4px 4px 8px;display:flex}.coar-pdf-sidebar__tabs[data-v-d8662946]{flex:auto;gap:4px;display:flex}.coar-pdf-sidebar__tab[data-v-d8662946]{appearance:none;color:var(--coar-color-fg-muted,#6b7280);cursor:pointer;font:inherit;background:0 0;border:none;border-radius:4px;padding:4px 8px}.coar-pdf-sidebar__tab--active[data-v-d8662946]{color:var(--coar-color-fg,#1a1a1a);background:var(--coar-color-surface,#fff);font-weight:600}.coar-pdf-sidebar__tab[data-v-d8662946]:hover:not(.coar-pdf-sidebar__tab--active){background:var(--coar-color-surface-3,#0000000a)}.coar-pdf-sidebar__close[data-v-d8662946]{appearance:none;width:24px;height:24px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;display:inline-flex}.coar-pdf-sidebar__close[data-v-d8662946]:hover{background:var(--coar-color-surface-3,#0000000f)}.coar-pdf-sidebar__thumbs[data-v-d8662946]{flex-direction:column;flex:auto;align-items:center;gap:6px;padding:8px;display:flex;overflow-y:auto}.coar-pdf-sidebar__thumb[data-v-d8662946]{appearance:none;cursor:pointer;font:inherit;color:inherit;background:0 0;border:2px solid #0000;border-radius:4px;flex-direction:column;align-items:center;gap:2px;width:100%;padding:0;display:flex}.coar-pdf-sidebar__thumb[data-v-d8662946]:hover{border-color:var(--coar-color-border,#e5e7eb)}.coar-pdf-sidebar__thumb--current[data-v-d8662946]{border-color:var(--coar-color-accent,#2563eb)}.coar-pdf-sidebar__thumb[data-v-d8662946] .coar-pdf-sidebar__thumb-canvas{background:#fff;display:block;box-shadow:0 1px 3px #0000001f}.coar-pdf-sidebar__thumb[data-v-d8662946]:not(:has(canvas)){background:var(--coar-color-surface,#fff);min-height:130px}.coar-pdf-sidebar__thumb-label[data-v-d8662946]{color:var(--coar-color-fg-muted,#6b7280);font-variant-numeric:tabular-nums}.coar-pdf-sidebar__outline[data-v-d8662946]{flex:auto;padding:4px 0;overflow-y:auto}.coar-pdf-sidebar__outline[data-v-d8662946] .coar-pdf-sidebar__outline-list{margin:0;padding:0;list-style:none}.coar-pdf-sidebar__outline[data-v-d8662946] .coar-pdf-sidebar__outline-link{appearance:none;text-align:left;width:100%;color:inherit;font:inherit;cursor:pointer;background:0 0;border:none;border-radius:2px;padding:4px 8px;display:block}.coar-pdf-sidebar__outline[data-v-d8662946] .coar-pdf-sidebar__outline-link:hover{background:var(--coar-color-surface-3,#0000000f)}.coar-pdf-info[data-v-36bce3d9]{border-bottom:1px solid var(--coar-color-divider,#00000014);background:var(--coar-color-surface,#fff)}.coar-pdf-info__header[data-v-36bce3d9]{cursor:pointer;width:100%;color:inherit;font:inherit;text-align:left;background:0 0;border:0;align-items:center;gap:6px;padding:10px 12px;display:flex}.coar-pdf-info__header[data-v-36bce3d9]:hover{background:var(--coar-color-surface-2,#00000008)}.coar-pdf-info__header[data-v-36bce3d9]:focus-visible{outline:2px solid var(--coar-color-focus-ring,#2563eb);outline-offset:-2px}.coar-pdf-info__title[data-v-36bce3d9]{text-transform:uppercase;letter-spacing:.04em;color:var(--coar-color-fg-2,#4b5563);font-size:12px;font-weight:600}.coar-pdf-info__body[data-v-36bce3d9]{padding:4px 12px 12px}.coar-pdf-info__rows[data-v-36bce3d9]{grid-template-columns:max-content 1fr;gap:4px 12px;margin:0;font-size:12px;line-height:1.4;display:grid}.coar-pdf-info__dt[data-v-36bce3d9]{color:var(--coar-color-fg-3,#6b7280);white-space:nowrap;margin:0}.coar-pdf-info__dd[data-v-36bce3d9]{color:var(--coar-color-fg,#1a1a1a);overflow-wrap:anywhere;min-width:0;margin:0}.coar-pdf-info__divider[data-v-36bce3d9]{background:var(--coar-color-divider,#0000000f);height:1px;margin:10px 0}.coar-pdf-anno-panel[data-v-bacf840c]{background:var(--coar-color-surface-2,#f6f7f8);border-left:1px solid var(--coar-color-border,#e5e7eb);flex-direction:column;flex:0 0 260px;width:260px;font-size:12px;display:flex;overflow:hidden}.coar-pdf-anno-panel__header[data-v-bacf840c]{border-bottom:1px solid var(--coar-color-border,#e5e7eb);flex-shrink:0;align-items:center;gap:8px;padding:8px 8px 8px 12px;display:flex}.coar-pdf-anno-panel__title[data-v-bacf840c]{color:var(--coar-color-fg,#1a1a1a);font-weight:600}.coar-pdf-anno-panel__count[data-v-bacf840c]{color:var(--coar-color-fg-muted,#6b7280);font-variant-numeric:tabular-nums;margin-left:auto;font-size:11px}.coar-pdf-anno-panel__close[data-v-bacf840c]{appearance:none;width:24px;height:24px;color:inherit;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;display:inline-flex}.coar-pdf-anno-panel__close[data-v-bacf840c]:hover{background:var(--coar-color-surface-3,#0000000f)}.coar-pdf-anno-panel__controls[data-v-bacf840c]{border-bottom:1px solid var(--coar-color-border,#e5e7eb);flex-direction:column;flex-shrink:0;gap:6px;padding:8px;display:flex}.coar-pdf-anno-panel__search-row[data-v-bacf840c]{align-items:center;display:flex;position:relative}.coar-pdf-anno-panel__search-icon[data-v-bacf840c]{color:var(--coar-color-fg-muted,#6b7280);pointer-events:none;position:absolute;left:6px}.coar-pdf-anno-panel__search-input[data-v-bacf840c]{appearance:none;box-sizing:border-box;border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface,#fff);width:100%;color:inherit;font:inherit;border-radius:4px;outline:none;padding:4px 8px 4px 24px;font-size:12px}.coar-pdf-anno-panel__search-input[data-v-bacf840c]:focus-visible{border-color:var(--coar-color-accent,#2563eb);box-shadow:0 0 0 2px var(--coar-color-accent-tint,#2563eb33)}.coar-pdf-anno-panel__filters[data-v-bacf840c]{justify-content:center;gap:4px;display:flex}.coar-pdf-anno-panel__filter[data-v-bacf840c]{appearance:none;border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface,#fff);width:26px;height:26px;color:var(--coar-color-fg,#1a1a1a);cursor:pointer;border-radius:4px;justify-content:center;align-items:center;padding:0;transition:background .1s,opacity .1s;display:inline-flex}.coar-pdf-anno-panel__filter[data-v-bacf840c]:hover{background:var(--coar-color-surface-3,#0000000a)}.coar-pdf-anno-panel__filter--off[data-v-bacf840c]{opacity:.35;background:0 0}.coar-pdf-anno-panel__list[data-v-bacf840c]{flex:auto;padding:4px 0;overflow-y:auto}.coar-pdf-anno-panel__empty[data-v-bacf840c]{color:var(--coar-color-fg-muted,#6b7280);text-align:center;padding:16px 12px;font-size:12px}.coar-pdf-anno-panel__group-header[data-v-bacf840c]{text-transform:uppercase;letter-spacing:.04em;color:var(--coar-color-fg-muted,#6b7280);padding:8px 12px 4px;font-size:11px;font-weight:600}.coar-pdf-anno-panel__item[data-v-bacf840c]{cursor:pointer;border-left:3px solid #0000;outline:none;align-items:flex-start;gap:8px;padding:6px 8px 6px 12px;display:flex}.coar-pdf-anno-panel__item[data-v-bacf840c]:hover{background:var(--coar-color-surface-3,#0000000a)}.coar-pdf-anno-panel__item[data-v-bacf840c]:focus-visible{background:var(--coar-color-surface-3,#0000000a);outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:-2px}.coar-pdf-anno-panel__item--selected[data-v-bacf840c]{background:var(--coar-color-accent-tint,#2563eb14);border-left-color:var(--coar-color-accent,#2563eb)}.coar-pdf-anno-panel__item--selected[data-v-bacf840c]:hover{background:var(--coar-color-accent-tint,#2563eb1f)}.coar-pdf-anno-panel__item-icon[data-v-bacf840c]{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}.coar-pdf-anno-panel__item-body[data-v-bacf840c]{flex-direction:column;flex:auto;gap:2px;min-width:0;line-height:1.3;display:flex}.coar-pdf-anno-panel__item-text[data-v-bacf840c]{color:var(--coar-color-fg,#1a1a1a);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.coar-pdf-anno-panel__item-meta[data-v-bacf840c]{color:var(--coar-color-fg-muted,#6b7280);text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.coar-pdf-anno-panel__item-menu-wrap[data-v-bacf840c]{opacity:0;flex-shrink:0;transition:opacity .1s}.coar-pdf-anno-panel__item:hover .coar-pdf-anno-panel__item-menu-wrap[data-v-bacf840c],.coar-pdf-anno-panel__item:focus-within .coar-pdf-anno-panel__item-menu-wrap[data-v-bacf840c],.coar-pdf-anno-panel__item--selected .coar-pdf-anno-panel__item-menu-wrap[data-v-bacf840c]{opacity:1}.coar-pdf-anno-panel__item-menu[data-v-bacf840c]{appearance:none;width:22px;height:22px;color:var(--coar-color-fg-muted,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:0;display:inline-flex}.coar-pdf-anno-panel__item-menu[data-v-bacf840c]:hover{background:var(--coar-color-surface-3,#0000000f);color:var(--coar-color-fg,#1a1a1a)}.coar-pdf-annotation-layer[data-v-28755751]{transform-origin:0 0;pointer-events:none;position:absolute;top:0;left:0}.coar-pdf-annotation-ink[data-v-28755751]{z-index:10;pointer-events:none;position:absolute;inset:0}.coar-pdf-annotation-ink[data-v-28755751] .coar-pdf-annotation-ink__stroke{pointer-events:stroke;cursor:pointer}.coar-pdf-annotation-marker[data-v-28755751]{pointer-events:none;mix-blend-mode:multiply;position:absolute;inset:0}.coar-pdf-annotation-marker[data-v-28755751] .coar-pdf-annotation-marker__stroke{pointer-events:stroke;cursor:pointer}.coar-pdf-annotation-freetext[data-v-28755751]{z-index:10;pointer-events:auto;cursor:pointer;white-space:pre-wrap;line-height:1.2;font-family:var(--coar-font-family,sans-serif);position:absolute}.coar-pdf-annotation-pin[data-v-28755751]{z-index:10;background:var(--coar-pdf-comment-pin-bg);width:22px;height:22px;color:var(--coar-pdf-comment-pin-fg);cursor:pointer;pointer-events:auto;border:2px solid #fff;border-radius:50%;justify-content:center;align-items:center;margin-top:-11px;margin-left:-11px;padding:0;display:inline-flex;position:absolute;box-shadow:0 1px 3px #00000059}.coar-pdf-annotation-pin[data-v-28755751]:hover{transform:scale(1.1)}.coar-pdf-annotation-pin[data-v-28755751]:focus-visible{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:2px}.coar-pdf-annotation-popover[data-v-a956f092]{z-index:9999;background:var(--coar-color-surface,#fff);min-width:220px;max-width:300px;color:var(--coar-color-fg,#1a1a1a);border:1px solid var(--coar-color-border,#e5e7eb);border-radius:6px;flex-direction:column;gap:8px;padding:8px;font-size:13px;display:flex;position:fixed;box-shadow:0 4px 16px #00000026,0 1px 3px #0000001a}.coar-pdf-annotation-popover__swatches[data-v-a956f092]{flex-wrap:wrap;gap:6px;display:flex}.coar-pdf-annotation-popover__swatch[data-v-a956f092]{appearance:none;cursor:pointer;border:2px solid #0000;border-radius:50%;width:22px;height:22px;padding:0;box-shadow:inset 0 0 0 1px #0000001a}.coar-pdf-annotation-popover__swatch--active[data-v-a956f092]{border-color:var(--coar-color-accent,#2563eb);outline:1px solid var(--coar-color-surface,#fff)}.coar-pdf-annotation-popover__swatch[data-v-a956f092]:focus-visible{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:1px}.coar-pdf-annotation-popover__textarea[data-v-a956f092]{resize:vertical;border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface,#fff);width:100%;color:inherit;font:inherit;box-sizing:border-box;border-radius:4px;padding:6px 8px}.coar-pdf-annotation-popover__textarea[data-v-a956f092]:focus{outline:2px solid var(--coar-color-accent,#2563eb);outline-offset:0;border-color:var(--coar-color-accent,#2563eb)}.coar-pdf-annotation-popover__actions[data-v-a956f092]{justify-content:flex-end;gap:6px;display:flex}.coar-pdf-annotation-popover__btn[data-v-a956f092]{appearance:none;border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface-2,#f6f7f8);color:inherit;font:inherit;cursor:pointer;border-radius:4px;padding:4px 10px}.coar-pdf-annotation-popover__btn[data-v-a956f092]:hover{background:var(--coar-color-surface-3,#ececec)}.coar-pdf-annotation-popover__btn--primary[data-v-a956f092]{background:var(--coar-color-accent,#2563eb);border-color:var(--coar-color-accent,#2563eb);color:#fff}.coar-pdf-annotation-popover__btn--primary[data-v-a956f092]:hover{background:var(--coar-color-accent-hover,#1d4ed8)}.coar-pdf-annotation-popover__btn--danger[data-v-a956f092]{color:var(--coar-color-danger,#dc2626);border-color:var(--coar-color-danger,#dc2626);background:0 0}.coar-pdf-annotation-popover__btn--danger[data-v-a956f092]:hover{background:var(--coar-color-danger-tint,#fef2f2)}.coar-pdf-annotation-popover__btn--ghost[data-v-a956f092]{background:0 0}.coar-pdf-viewer[data-v-485161c5]{--coar-pdf-toolbar-bg:var(--coar-color-surface-2,#f6f7f8);--coar-pdf-toolbar-fg:var(--coar-color-fg,#1a1a1a);--coar-pdf-page-bg:var(--coar-color-surface,#fff);--coar-pdf-page-shadow:0 1px 3px #0000001f, 0 1px 2px #0000000f;--coar-pdf-page-gap:16px;--coar-pdf-canvas-bg:#fff;--coar-pdf-comment-pin-bg:var(--coar-color-accent,#2563eb);--coar-pdf-comment-pin-fg:#fff;--coar-pdf-selection-bg:#2563eb40;--coar-pdf-overlay-bg:#0000000a;background:var(--coar-pdf-overlay-bg);min-width:0;height:100%;min-height:0;color:var(--coar-pdf-toolbar-fg);flex-direction:row;display:flex;position:relative;overflow:hidden}.coar-pdf-viewer__center[data-v-485161c5]{flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}.coar-pdf-viewer__body[data-v-485161c5]{flex:auto;min-width:0;min-height:0;display:flex}.coar-pdf-viewer__divider[data-v-485161c5]{background:var(--coar-color-border,#e5e7eb);cursor:col-resize;flex:0 0 1px;width:1px;position:relative}.coar-pdf-viewer__divider[data-v-485161c5]:before{content:"";z-index:1;position:absolute;inset:0 -3px}.coar-pdf-viewer__divider[data-v-485161c5]:hover,.coar-pdf-viewer--resizing .coar-pdf-viewer__divider[data-v-485161c5]{background:var(--coar-color-accent,#2563eb)}.coar-pdf-viewer--resizing[data-v-485161c5]{-webkit-user-select:none;user-select:none;cursor:col-resize}.coar-pdf-viewer--resizing[data-v-485161c5] *{cursor:col-resize!important}.coar-pdf-viewer__center[data-v-485161c5]>.coar-pdf-toolbar{box-sizing:border-box;border-bottom:1px solid var(--coar-color-border,#e5e7eb);height:44px!important;min-height:44px!important}.coar-pdf-viewer[data-v-485161c5] .coar-pdf-sidebar__header,.coar-pdf-viewer[data-v-485161c5] .coar-pdf-anno-panel__header{box-sizing:border-box;height:44px!important;min-height:44px!important}.coar-pdf-viewer__scroll[data-v-485161c5]{overscroll-behavior:contain;scroll-behavior:smooth;touch-action:pan-x pan-y;flex:auto;min-width:0;min-height:0;position:relative;overflow:auto}.coar-pdf-viewer__scroll--pan[data-v-485161c5]{cursor:grab;scroll-behavior:auto}.coar-pdf-viewer__scroll--pan[data-v-485161c5] .textLayer{pointer-events:none;-webkit-user-select:none;user-select:none}.coar-pdf-viewer__scroll--panning[data-v-485161c5]{cursor:grabbing}.coar-pdf-viewer__scroll--annotate-comment[data-v-485161c5]{cursor:crosshair}.coar-pdf-viewer__scroll--annotate-comment[data-v-485161c5] .coar-pdf-annotation-pin{cursor:pointer}.coar-pdf-viewer__scroll--annotate-ink[data-v-485161c5],.coar-pdf-viewer__scroll--annotate-marker[data-v-485161c5]{cursor:crosshair}.coar-pdf-viewer__scroll--annotate-ink[data-v-485161c5] .textLayer,.coar-pdf-viewer__scroll--annotate-marker[data-v-485161c5] .textLayer{pointer-events:none;-webkit-user-select:none;user-select:none}.coar-pdf-viewer__scroll--annotate-freetext[data-v-485161c5]{cursor:text}.coar-pdf-viewer__scroll--annotate-freetext[data-v-485161c5] .textLayer,.coar-pdf-viewer__scroll--annotate-select[data-v-485161c5] .textLayer{pointer-events:none;-webkit-user-select:none;user-select:none}.coar-pdf-viewer__scroll--annotate-select[data-v-485161c5] [data-annotation-id]{cursor:move}.coar-pdf-viewer__scroll--annotate-eraser[data-v-485161c5]{cursor:cell}.coar-pdf-viewer__scroll--annotate-eraser[data-v-485161c5] .textLayer{pointer-events:none;-webkit-user-select:none;user-select:none}.coar-pdf-viewer__scroll--annotate-eraser[data-v-485161c5] [data-annotation-id]{cursor:not-allowed}.coar-pdf-viewer__pages[data-v-485161c5]{align-items:center;gap:var(--coar-pdf-page-gap);padding:var(--coar-pdf-page-gap);box-sizing:border-box;flex-direction:column;width:max-content;min-width:100%;display:flex}.coar-pdf-page[data-v-485161c5]{background:var(--coar-pdf-canvas-bg);box-shadow:var(--coar-pdf-page-shadow);flex:none;position:relative}.coar-pdf-page[data-v-485161c5] .coar-pdf-page__canvas{width:100%;height:100%;display:block}.coar-pdf-search-overlay[data-v-485161c5]{transform-origin:0 0;pointer-events:none;position:absolute;top:0;left:0}.coar-pdf-search-rect[data-v-485161c5]{background:var(--coar-pdf-search-bg,#fde0478c);mix-blend-mode:multiply;pointer-events:none;z-index:5;border-radius:2px;position:absolute}.coar-pdf-search-rect--current[data-v-485161c5]{background:var(--coar-pdf-search-current-bg,#f97316b3);outline:2px solid var(--coar-color-accent,#2563eb)}.coar-pdf-page[data-v-485161c5] .textLayer{text-align:initial;opacity:1;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;forced-color-adjust:none;transform-origin:0 0;caret-color:canvastext;--min-font-size:1;--text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size));--min-font-size-inv:calc(1 / var(--min-font-size));z-index:1;line-height:1;position:absolute;inset:0;overflow:clip}.coar-pdf-page[data-v-485161c5] .textLayer :is(span,br){color:#0000;white-space:pre;cursor:text;transform-origin:0 0;position:absolute}.coar-pdf-page[data-v-485161c5] .textLayer>:not(.markedContent),.coar-pdf-page[data-v-485161c5] .textLayer .markedContent span:not(.markedContent){z-index:1;--font-height:0;font-size:calc(var(--text-scale-factor) * var(--font-height));--scale-x:1;--rotate:0deg;transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv))}.coar-pdf-page[data-v-485161c5] .textLayer .markedContent{display:contents}.coar-pdf-page[data-v-485161c5] .textLayer ::selection{background:var(--coar-pdf-selection-bg)}.coar-pdf-page[data-v-485161c5] .textLayer br::selection{background:0 0}.coar-pdf-page[data-v-485161c5] .textLayer .endOfContent{z-index:0;cursor:default;-webkit-user-select:none;user-select:none;display:block;position:absolute;inset:100% 0 0}.coar-pdf-viewer__overlay[data-v-485161c5]{pointer-events:none;justify-content:center;align-items:center;font-size:.875rem;display:flex;position:absolute;inset:0}.coar-pdf-viewer__overlay--loading[data-v-485161c5]{color:var(--coar-color-fg-muted,#6b7280);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#ffffff8c}.coar-pdf-viewer__overlay--error[data-v-485161c5]{background:var(--coar-pdf-overlay-bg);color:var(--coar-color-danger,#dc2626);pointer-events:auto}.coar-pdf-viewer__error-body[data-v-485161c5]{background:var(--coar-color-surface,#fff);border:1px solid var(--coar-color-border,#e5e7eb);box-shadow:var(--coar-pdf-page-shadow);border-radius:.5rem;flex-direction:column;align-items:center;gap:.75rem;padding:1rem 1.5rem;display:flex}.coar-pdf-viewer__error-title[data-v-485161c5]{color:var(--coar-color-fg,#1a1a1a);margin:0}.coar-pdf-viewer__error-retry[data-v-485161c5]{appearance:none;border:1px solid var(--coar-color-border,#e5e7eb);background:var(--coar-color-surface-2,#f6f7f8);color:inherit;font:inherit;cursor:pointer;border-radius:.375rem;padding:.375rem .875rem}.coar-pdf-viewer__error-retry[data-v-485161c5]:hover{background:var(--coar-color-surface-3,#ececec)}
|
|
2
|
+
/*$vite$:1*/
|