@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.
Files changed (54) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +212 -0
  3. package/dist/CoarDocumentViewer.vue.d.ts +243 -0
  4. package/dist/CoarDocumentViewer.vue.d.ts.map +1 -0
  5. package/dist/index.d.ts +7 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +3283 -0
  8. package/dist/internal/AnnotationLayer.vue.d.ts +23 -0
  9. package/dist/internal/AnnotationLayer.vue.d.ts.map +1 -0
  10. package/dist/internal/AnnotationPopover.vue.d.ts +35 -0
  11. package/dist/internal/AnnotationPopover.vue.d.ts.map +1 -0
  12. package/dist/internal/DocumentAnnotationPanel.vue.d.ts +27 -0
  13. package/dist/internal/DocumentAnnotationPanel.vue.d.ts.map +1 -0
  14. package/dist/internal/DocumentInfoSection.vue.d.ts +18 -0
  15. package/dist/internal/DocumentInfoSection.vue.d.ts.map +1 -0
  16. package/dist/internal/DocumentSearchBar.vue.d.ts +23 -0
  17. package/dist/internal/DocumentSearchBar.vue.d.ts.map +1 -0
  18. package/dist/internal/DocumentSidebar.vue.d.ts +33 -0
  19. package/dist/internal/DocumentSidebar.vue.d.ts.map +1 -0
  20. package/dist/internal/DocumentToolbar.vue.d.ts +92 -0
  21. package/dist/internal/DocumentToolbar.vue.d.ts.map +1 -0
  22. package/dist/internal/PdfOutlineList.vue.d.ts +35 -0
  23. package/dist/internal/PdfOutlineList.vue.d.ts.map +1 -0
  24. package/dist/internal/effective-tools.d.ts +10 -0
  25. package/dist/internal/effective-tools.d.ts.map +1 -0
  26. package/dist/internal/page-provider.d.ts +51 -0
  27. package/dist/internal/page-provider.d.ts.map +1 -0
  28. package/dist/internal/useAnnotationEditor.d.ts +210 -0
  29. package/dist/internal/useAnnotationEditor.d.ts.map +1 -0
  30. package/dist/internal/useDocumentLoader.d.ts +20 -0
  31. package/dist/internal/useDocumentLoader.d.ts.map +1 -0
  32. package/dist/internal/usePageRenderer.d.ts +52 -0
  33. package/dist/internal/usePageRenderer.d.ts.map +1 -0
  34. package/dist/internal/usePdfSearch.d.ts +27 -0
  35. package/dist/internal/usePdfSearch.d.ts.map +1 -0
  36. package/dist/internal/usePositionMemory.d.ts +24 -0
  37. package/dist/internal/usePositionMemory.d.ts.map +1 -0
  38. package/dist/pdf.js +19 -0
  39. package/dist/source-types.d.ts +100 -0
  40. package/dist/source-types.d.ts.map +1 -0
  41. package/dist/sources/image-adapter.d.ts +38 -0
  42. package/dist/sources/image-adapter.d.ts.map +1 -0
  43. package/dist/sources/image-gallery-adapter.d.ts +14 -0
  44. package/dist/sources/image-gallery-adapter.d.ts.map +1 -0
  45. package/dist/sources/image.d.ts +32 -0
  46. package/dist/sources/image.d.ts.map +1 -0
  47. package/dist/sources/pdf-adapter.d.ts +27 -0
  48. package/dist/sources/pdf-adapter.d.ts.map +1 -0
  49. package/dist/sources/pdf.d.ts +20 -0
  50. package/dist/sources/pdf.d.ts.map +1 -0
  51. package/dist/types.d.ts +132 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/vue-document-viewer.css +2 -0
  54. 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"}
@@ -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*/