kviewer 0.1.2 → 0.2.1

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 (58) hide show
  1. package/README.md +28 -0
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +25 -4
  4. package/dist/runtime/annotation/engine/config.d.ts +1 -1
  5. package/dist/runtime/annotation/engine/config.js +2 -2
  6. package/dist/runtime/annotation/engine/painter.d.ts +1 -1
  7. package/dist/runtime/annotation/engine/utils.d.ts +2 -1
  8. package/dist/runtime/annotation/engine/utils.js +3 -7
  9. package/dist/runtime/annotation/pdf-export/export.js +63 -9
  10. package/dist/runtime/annotation/pdf-export/parse_circle.js +3 -2
  11. package/dist/runtime/annotation/pdf-export/parse_freetext.js +18 -8
  12. package/dist/runtime/annotation/pdf-export/parse_highlight.js +27 -29
  13. package/dist/runtime/annotation/pdf-export/parse_ink.js +5 -3
  14. package/dist/runtime/annotation/pdf-export/parse_line.js +5 -3
  15. package/dist/runtime/annotation/pdf-export/parse_polyline.js +6 -4
  16. package/dist/runtime/annotation/pdf-export/parse_square.js +3 -2
  17. package/dist/runtime/annotation/pdf-export/parse_stamp.js +16 -9
  18. package/dist/runtime/annotation/pdf-export/parse_strikeout.js +11 -10
  19. package/dist/runtime/annotation/pdf-export/parse_text.js +3 -1
  20. package/dist/runtime/annotation/pdf-export/parse_underline.js +11 -10
  21. package/dist/runtime/annotation/pdf-export/parse_utils.d.ts +11 -0
  22. package/dist/runtime/annotation/pdf-export/parse_utils.js +12 -0
  23. package/dist/runtime/annotation/pdf-import/decode.d.ts +2 -1
  24. package/dist/runtime/annotation/pdf-import/decode.js +6 -5
  25. package/dist/runtime/annotation/pdf-import/decode_circle.js +1 -1
  26. package/dist/runtime/annotation/pdf-import/decode_freetext.js +1 -1
  27. package/dist/runtime/annotation/pdf-import/decode_highlight.js +1 -1
  28. package/dist/runtime/annotation/pdf-import/decode_ink.js +1 -1
  29. package/dist/runtime/annotation/pdf-import/decode_line.js +1 -1
  30. package/dist/runtime/annotation/pdf-import/decode_square.js +1 -1
  31. package/dist/runtime/annotation/pdf-import/decode_stamp.js +1 -1
  32. package/dist/runtime/annotation/pdf-import/decode_text.js +1 -1
  33. package/dist/runtime/annotation/pdf-import/extract_stamp_appearance.d.ts +3 -2
  34. package/dist/runtime/annotation/pdf-import/extract_stamp_appearance.js +7 -15
  35. package/dist/runtime/annotation/pdf-import/transform.d.ts +85 -0
  36. package/dist/runtime/annotation/pdf-import/transform.js +81 -0
  37. package/dist/runtime/annotation/pdf-import/types.d.ts +5 -1
  38. package/dist/runtime/annotation/pdf-import/utils.d.ts +6 -5
  39. package/dist/runtime/annotation/pdf-import/utils.js +53 -38
  40. package/dist/runtime/components/AnnotationToolbar.vue +16 -0
  41. package/dist/runtime/components/FormFieldLayer.d.vue.ts +4 -7
  42. package/dist/runtime/components/FormFieldLayer.vue +5 -10
  43. package/dist/runtime/components/FormFieldLayer.vue.d.ts +4 -7
  44. package/dist/runtime/components/PdfPage.vue +1 -6
  45. package/dist/runtime/components/Viewer.d.vue.ts +12 -0
  46. package/dist/runtime/components/Viewer.vue +35 -2
  47. package/dist/runtime/components/Viewer.vue.d.ts +12 -0
  48. package/dist/runtime/components/form-fields/FormFieldWrapper.d.vue.ts +5 -6
  49. package/dist/runtime/components/form-fields/FormFieldWrapper.vue +8 -14
  50. package/dist/runtime/components/form-fields/FormFieldWrapper.vue.d.ts +5 -6
  51. package/dist/runtime/composables/usePageVirtualization.d.ts +17 -0
  52. package/dist/runtime/composables/usePageVirtualization.js +48 -2
  53. package/dist/runtime/embed/bridge-client.d.ts +9 -1
  54. package/dist/runtime/embed/bridge-client.js +13 -0
  55. package/dist/runtime/embed/bridge-host.d.ts +3 -0
  56. package/dist/runtime/embed/bridge-host.js +30 -8
  57. package/dist/runtime/embed/protocol.d.ts +21 -0
  58. package/package.json +1 -1
@@ -20,7 +20,8 @@ type EventHandler<E extends EventName> = (payload: EventPayloads[E]) => void;
20
20
  * Parent-page client that drives a `<KViewer>` instance running inside
21
21
  * an iframe. Wraps `postMessage` into a Promise-based RPC mirroring the
22
22
  * viewer's exposed methods, and surfaces iframe-emitted events
23
- * (`ready`, `formEditMode-changed`) via `on()`.
23
+ * (`ready`, `formEditMode-changed`, `viewedPages-changed`, `all-pages-read`)
24
+ * via `on()`.
24
25
  */
25
26
  export declare class KViewerEmbedClient {
26
27
  private readonly iframe;
@@ -52,6 +53,13 @@ export declare class KViewerEmbedClient {
52
53
  getFormEditMode(): Promise<boolean>;
53
54
  setFormEditMode(enabled: boolean): Promise<void>;
54
55
  toggleFormEditMode(): Promise<boolean>;
56
+ /** True once the user has viewed every page. For a push-style signal,
57
+ * subscribe via `on('all-pages-read', …)` / `on('viewedPages-changed', …)`. */
58
+ allPagesRead(): Promise<boolean>;
59
+ /** Page numbers viewed so far, ascending. */
60
+ getViewedPages(): Promise<number[]>;
61
+ /** Clear viewed-page tracking, e.g. to restart a signing session. */
62
+ resetViewedPages(): Promise<void>;
55
63
  private call;
56
64
  private handleMessage;
57
65
  }
@@ -87,6 +87,19 @@ export class KViewerEmbedClient {
87
87
  toggleFormEditMode() {
88
88
  return this.call("toggleFormEditMode");
89
89
  }
90
+ /** True once the user has viewed every page. For a push-style signal,
91
+ * subscribe via `on('all-pages-read', …)` / `on('viewedPages-changed', …)`. */
92
+ allPagesRead() {
93
+ return this.call("allPagesRead");
94
+ }
95
+ /** Page numbers viewed so far, ascending. */
96
+ getViewedPages() {
97
+ return this.call("getViewedPages");
98
+ }
99
+ /** Clear viewed-page tracking, e.g. to restart a signing session. */
100
+ resetViewedPages() {
101
+ return this.call("resetViewedPages");
102
+ }
90
103
  // ── internals ──────────────────────────────────────────────────────────
91
104
  call(method, ...args) {
92
105
  if (this.disposed) {
@@ -26,6 +26,9 @@ export interface KViewerApi {
26
26
  formEditMode: Ref<boolean>;
27
27
  setFormEditMode: (enabled: boolean) => void;
28
28
  toggleFormEditMode: () => boolean;
29
+ allPagesRead: () => boolean;
30
+ getViewedPages: () => number[];
31
+ resetViewedPages: () => void;
29
32
  }
30
33
  export interface KViewerEmbedBridgeOptions {
31
34
  /**
@@ -75,6 +75,13 @@ export function useKViewerEmbedBridge(viewerRef, options) {
75
75
  }
76
76
  case "toggleFormEditMode":
77
77
  return viewer.toggleFormEditMode();
78
+ case "allPagesRead":
79
+ return viewer.allPagesRead();
80
+ case "getViewedPages":
81
+ return viewer.getViewedPages();
82
+ case "resetViewedPages":
83
+ viewer.resetViewedPages();
84
+ return void 0;
78
85
  default:
79
86
  throw new Error(`Unknown KViewer embed method: ${req.method}`);
80
87
  }
@@ -110,17 +117,32 @@ export function useKViewerEmbedBridge(viewerRef, options) {
110
117
  target.postMessage(reply, event.origin === "" ? options.parentOrigin : event.origin);
111
118
  }
112
119
  win.addEventListener("message", handleMessage);
113
- let stopFormEditWatch = null;
120
+ let stopViewerStateWatches = [];
114
121
  const stopViewerWatch = watch(
115
122
  viewerRef,
116
123
  (viewer) => {
117
- stopFormEditWatch?.();
118
- stopFormEditWatch = null;
124
+ for (const stop of stopViewerStateWatches) stop();
125
+ stopViewerStateWatches = [];
119
126
  if (!viewer) return;
120
127
  postEvent("ready", { protocolVersion: KVIEWER_EMBED_PROTOCOL_VERSION });
121
- stopFormEditWatch = watch(
122
- viewer.formEditMode,
123
- (enabled) => postEvent("formEditMode-changed", { enabled })
128
+ stopViewerStateWatches.push(
129
+ watch(
130
+ viewer.formEditMode,
131
+ (enabled) => postEvent("formEditMode-changed", { enabled })
132
+ ),
133
+ // Read-tracking. The getters touch the viewer's reactive viewed-pages
134
+ // state, so watch re-runs them whenever a page is viewed or tracking
135
+ // is reset.
136
+ watch(
137
+ () => viewer.allPagesRead(),
138
+ (read, prev) => {
139
+ if (read && !prev) postEvent("all-pages-read", {});
140
+ }
141
+ ),
142
+ watch(
143
+ () => viewer.getViewedPages(),
144
+ (pages) => postEvent("viewedPages-changed", { pages, allRead: viewer.allPagesRead() })
145
+ )
124
146
  );
125
147
  },
126
148
  { immediate: true }
@@ -128,8 +150,8 @@ export function useKViewerEmbedBridge(viewerRef, options) {
128
150
  function unmount() {
129
151
  win.removeEventListener("message", handleMessage);
130
152
  stopViewerWatch();
131
- stopFormEditWatch?.();
132
- stopFormEditWatch = null;
153
+ for (const stop of stopViewerStateWatches) stop();
154
+ stopViewerStateWatches = [];
133
155
  }
134
156
  onScopeDispose(unmount);
135
157
  return { unmount };
@@ -59,6 +59,18 @@ export interface MethodSignatures {
59
59
  args: [];
60
60
  result: boolean;
61
61
  };
62
+ allPagesRead: {
63
+ args: [];
64
+ result: boolean;
65
+ };
66
+ getViewedPages: {
67
+ args: [];
68
+ result: number[];
69
+ };
70
+ resetViewedPages: {
71
+ args: [];
72
+ result: undefined;
73
+ };
62
74
  }
63
75
  export type MethodName = keyof MethodSignatures;
64
76
  export interface RequestMessage<M extends MethodName = MethodName> {
@@ -91,6 +103,15 @@ export interface EventPayloads {
91
103
  'formEditMode-changed': {
92
104
  enabled: boolean;
93
105
  };
106
+ /** The set of viewed pages changed. `allRead` is true once every page has
107
+ * been viewed. */
108
+ 'viewedPages-changed': {
109
+ pages: number[];
110
+ allRead: boolean;
111
+ };
112
+ /** Fires once when the final unseen page is viewed. Re-arms after
113
+ * `resetViewedPages()` or a new document. */
114
+ 'all-pages-read': Record<string, never>;
94
115
  }
95
116
  export type EventName = keyof EventPayloads;
96
117
  export interface EventMessage<E extends EventName = EventName> {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kviewer",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "Kabema PDF Editor",
5
5
  "repository": "kabema/kviewer",
6
6
  "license": "MIT",