@embedpdf/angular 3.0.0-next.13 → 3.0.0-next.15

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 (81) hide show
  1. package/README.md +309 -0
  2. package/dist/README.md +309 -0
  3. package/dist/actions/index.d.ts +34 -16
  4. package/dist/anchored/index.d.ts +67 -0
  5. package/dist/annotation/index.d.ts +599 -0
  6. package/dist/commands/index.d.ts +109 -0
  7. package/dist/fesm2022/embedpdf-angular-actions.mjs +117 -36
  8. package/dist/fesm2022/embedpdf-angular-actions.mjs.map +1 -1
  9. package/dist/fesm2022/embedpdf-angular-anchored.mjs +148 -0
  10. package/dist/fesm2022/embedpdf-angular-anchored.mjs.map +1 -0
  11. package/dist/fesm2022/embedpdf-angular-annotation.mjs +1960 -0
  12. package/dist/fesm2022/embedpdf-angular-annotation.mjs.map +1 -0
  13. package/dist/fesm2022/embedpdf-angular-commands.mjs +235 -0
  14. package/dist/fesm2022/embedpdf-angular-commands.mjs.map +1 -0
  15. package/dist/fesm2022/embedpdf-angular-form.mjs +1074 -0
  16. package/dist/fesm2022/embedpdf-angular-form.mjs.map +1 -0
  17. package/dist/fesm2022/embedpdf-angular-history.mjs +54 -0
  18. package/dist/fesm2022/embedpdf-angular-history.mjs.map +1 -0
  19. package/dist/fesm2022/embedpdf-angular-i18n.mjs +100 -0
  20. package/dist/fesm2022/embedpdf-angular-i18n.mjs.map +1 -0
  21. package/dist/fesm2022/embedpdf-angular-interaction.mjs +157 -0
  22. package/dist/fesm2022/embedpdf-angular-interaction.mjs.map +1 -0
  23. package/dist/fesm2022/embedpdf-angular-link.mjs +306 -0
  24. package/dist/fesm2022/embedpdf-angular-link.mjs.map +1 -0
  25. package/dist/fesm2022/embedpdf-angular-measurement.mjs +106 -0
  26. package/dist/fesm2022/embedpdf-angular-measurement.mjs.map +1 -0
  27. package/dist/fesm2022/embedpdf-angular-metadata.mjs +77 -0
  28. package/dist/fesm2022/embedpdf-angular-metadata.mjs.map +1 -0
  29. package/dist/fesm2022/embedpdf-angular-page-edit.mjs +65 -0
  30. package/dist/fesm2022/embedpdf-angular-page-edit.mjs.map +1 -0
  31. package/dist/fesm2022/embedpdf-angular-page-view.mjs +297 -0
  32. package/dist/fesm2022/embedpdf-angular-page-view.mjs.map +1 -0
  33. package/dist/fesm2022/embedpdf-angular-redaction.mjs +93 -0
  34. package/dist/fesm2022/embedpdf-angular-redaction.mjs.map +1 -0
  35. package/dist/fesm2022/embedpdf-angular-render.mjs +331 -69
  36. package/dist/fesm2022/embedpdf-angular-render.mjs.map +1 -1
  37. package/dist/fesm2022/embedpdf-angular-runtime.mjs +1147 -390
  38. package/dist/fesm2022/embedpdf-angular-runtime.mjs.map +1 -1
  39. package/dist/fesm2022/embedpdf-angular-search.mjs +251 -0
  40. package/dist/fesm2022/embedpdf-angular-search.mjs.map +1 -0
  41. package/dist/fesm2022/embedpdf-angular-selection.mjs +477 -0
  42. package/dist/fesm2022/embedpdf-angular-selection.mjs.map +1 -0
  43. package/dist/fesm2022/embedpdf-angular-shell.mjs +177 -0
  44. package/dist/fesm2022/embedpdf-angular-shell.mjs.map +1 -0
  45. package/dist/fesm2022/embedpdf-angular-signature.mjs +120 -0
  46. package/dist/fesm2022/embedpdf-angular-signature.mjs.map +1 -0
  47. package/dist/fesm2022/embedpdf-angular-stage.mjs +688 -288
  48. package/dist/fesm2022/embedpdf-angular-stage.mjs.map +1 -1
  49. package/dist/fesm2022/embedpdf-angular-stamp.mjs +169 -0
  50. package/dist/fesm2022/embedpdf-angular-stamp.mjs.map +1 -0
  51. package/dist/fesm2022/embedpdf-angular-testing.mjs +89 -0
  52. package/dist/fesm2022/embedpdf-angular-testing.mjs.map +1 -0
  53. package/dist/fesm2022/embedpdf-angular-toolbar.mjs +1123 -0
  54. package/dist/fesm2022/embedpdf-angular-toolbar.mjs.map +1 -0
  55. package/dist/fesm2022/embedpdf-angular-view-manager.mjs +69 -0
  56. package/dist/fesm2022/embedpdf-angular-view-manager.mjs.map +1 -0
  57. package/dist/fesm2022/embedpdf-angular.mjs +23 -3
  58. package/dist/fesm2022/embedpdf-angular.mjs.map +1 -1
  59. package/dist/form/index.d.ts +79 -0
  60. package/dist/history/index.d.ts +28 -0
  61. package/dist/i18n/index.d.ts +52 -0
  62. package/dist/index.d.ts +20 -0
  63. package/dist/interaction/index.d.ts +58 -0
  64. package/dist/link/index.d.ts +77 -0
  65. package/dist/measurement/index.d.ts +46 -0
  66. package/dist/metadata/index.d.ts +51 -0
  67. package/dist/page-edit/index.d.ts +22 -0
  68. package/dist/page-view/index.d.ts +94 -0
  69. package/dist/redaction/index.d.ts +38 -0
  70. package/dist/render/index.d.ts +45 -6
  71. package/dist/runtime/index.d.ts +579 -199
  72. package/dist/search/index.d.ts +71 -0
  73. package/dist/selection/index.d.ts +141 -0
  74. package/dist/shell/index.d.ts +88 -0
  75. package/dist/signature/index.d.ts +45 -0
  76. package/dist/stage/index.d.ts +242 -141
  77. package/dist/stamp/index.d.ts +58 -0
  78. package/dist/testing/index.d.ts +53 -0
  79. package/dist/toolbar/index.d.ts +257 -0
  80. package/dist/view-manager/index.d.ts +23 -0
  81. package/package.json +135 -14
@@ -0,0 +1,177 @@
1
+ import { shellState, ShellToken, shellPlugin } from '@embedpdf/plugin-shell';
2
+ export * from '@embedpdf/plugin-shell';
3
+ import * as i0 from '@angular/core';
4
+ import { untracked, Injectable, input, inject, Directive, booleanAttribute, ElementRef, afterRenderEffect } from '@angular/core';
5
+ import { pluginService, CapabilityBinding, injectKernelHost, injectDocumentScope } from '@embedpdf/angular/runtime';
6
+ import { createSurfaceFocusFollower } from '@embedpdf/web';
7
+
8
+ /**
9
+ * The shell plugin's service, feature and directives: which panels, dialogs and menus are open.
10
+ * The app draws them; these bind their open state to the viewer, so a command, a button and
11
+ * your code open the same panel, and the layout can be stored and restored.
12
+ *
13
+ * withShell() the plugin, for provideEmbedPdf()
14
+ * inject(EpdfShell) `openSurfaces()`, `openMenus()`, `open()`, `toggle()`, …
15
+ * shell.surface('comments') one panel: `isOpen()`, `props()`, `open()`, `close()`
16
+ * <button epdfPanelToggle="comments"> a button that opens and closes one
17
+ * <input epdfSurfaceFocus="search"> an element that takes the cursor when its panel asks
18
+ *
19
+ * Without a document every panel reads as closed, no menu as open, and a surface's verbs do
20
+ * nothing, so chrome outside `*epdfDocumentGate` can use them. The service's own methods then
21
+ * refuse with `not-ready`, like every document plugin's.
22
+ */
23
+ const NO_PROPS = Object.freeze({});
24
+ /**
25
+ * The panels, dialogs and menus of this part of the template's document: `openSurfaces()` and
26
+ * `openMenus()` as signals, the shell's methods, `surfaceOpened$` and the other events, and
27
+ * `surface(id)` for one panel.
28
+ */
29
+ class EpdfShell extends pluginService({
30
+ name: 'EpdfShell',
31
+ feature: 'withShell()',
32
+ token: ShellToken,
33
+ state: shellState,
34
+ methods: [
35
+ 'isOpen',
36
+ 'getSurface',
37
+ 'listOpenSurfaces',
38
+ 'open',
39
+ 'close',
40
+ 'toggle',
41
+ 'updateSurfaceProps',
42
+ 'closeAll',
43
+ 'isMenuOpen',
44
+ 'listOpenMenus',
45
+ 'openMenu',
46
+ 'closeMenu',
47
+ 'toggleMenu',
48
+ 'closeAllMenus',
49
+ 'getSnapshot',
50
+ 'applySnapshot',
51
+ ],
52
+ events: ['onSurfaceOpened', 'onSurfaceClosed', 'onMenuOpened', 'onMenuClosed'],
53
+ }) {
54
+ /**
55
+ * One panel, dialog or overlay: `isOpen()` and `props()` as signals, and `open()`, `close()`
56
+ * and `toggle()`. Pass a function for an id that changes (a component's input). Without a
57
+ * document it reads as closed and its verbs do nothing.
58
+ *
59
+ * protected readonly panel = inject(EpdfShell).surface('comments');
60
+ */
61
+ surface(id) {
62
+ const idOf = typeof id === 'function' ? id : () => id;
63
+ const shell = this.binding.capability;
64
+ // The verbs act on the document current when they're called, and on none without one.
65
+ const now = () => untracked(shell);
66
+ return {
67
+ isOpen: this.binding.select((shell) => shell.isOpen(idOf()), false, Object.is),
68
+ props: this.binding.select((shell) => shell.getSurface(idOf())?.props ?? NO_PROPS, NO_PROPS, Object.is),
69
+ open: (options) => now()?.open(untracked(idOf), options),
70
+ close: () => now()?.close(untracked(idOf)),
71
+ toggle: (options) => now()?.toggle(untracked(idOf), options),
72
+ };
73
+ }
74
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfShell, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
75
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfShell, providedIn: 'root' });
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfShell, decorators: [{
78
+ type: Injectable,
79
+ args: [{ providedIn: 'root' }]
80
+ }] });
81
+ /** The shell plugin: which panels, dialogs and menus are open, per document. */
82
+ function withShell() {
83
+ return { plugins: [shellPlugin()], services: [EpdfShell] };
84
+ }
85
+ /**
86
+ * A button of yours that opens and closes a panel, and says whether it's open
87
+ * (`aria-expanded`). `epdfPanelToggleExclusive` gives the panel its group, so opening it
88
+ * closes the group's other panel:
89
+ *
90
+ * <button epdfPanelToggle="comments" epdfPanelToggleExclusive="right">Comments</button>
91
+ *
92
+ * The template reference has `isOpen()`: `#comments="epdfPanelToggle"`.
93
+ */
94
+ class EpdfPanelToggle {
95
+ /** The panel's name. */
96
+ id = input.required(...(ngDevMode ? [{ debugName: "id", alias: 'epdfPanelToggle' }] : [{ alias: 'epdfPanelToggle' }]));
97
+ /** Its group: opening it closes the other open panel of the same group. */
98
+ exclusive = input(undefined, ...(ngDevMode ? [{ debugName: "exclusive", alias: 'epdfPanelToggleExclusive' }] : [{ alias: 'epdfPanelToggleExclusive' }]));
99
+ panel = inject(EpdfShell).surface(() => this.id());
100
+ /** Whether the panel is open. */
101
+ isOpen = this.panel.isOpen;
102
+ /** Open the panel when it's closed, close it when it's open. */
103
+ toggle() {
104
+ const exclusive = this.exclusive();
105
+ this.panel.toggle(exclusive === undefined ? undefined : { exclusive });
106
+ }
107
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfPanelToggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
108
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.4", type: EpdfPanelToggle, isStandalone: true, selector: "[epdfPanelToggle]", inputs: { id: { classPropertyName: "id", publicName: "epdfPanelToggle", isSignal: true, isRequired: true, transformFunction: null }, exclusive: { classPropertyName: "exclusive", publicName: "epdfPanelToggleExclusive", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "toggle()" }, properties: { "attr.aria-expanded": "isOpen()" } }, exportAs: ["epdfPanelToggle"], ngImport: i0 });
109
+ }
110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfPanelToggle, decorators: [{
111
+ type: Directive,
112
+ args: [{
113
+ selector: '[epdfPanelToggle]',
114
+ exportAs: 'epdfPanelToggle',
115
+ host: {
116
+ '(click)': 'toggle()',
117
+ '[attr.aria-expanded]': 'isOpen()',
118
+ },
119
+ }]
120
+ }] });
121
+ /**
122
+ * An element of yours that takes the cursor when the panel `epdfSurfaceFocus` names asks for it:
123
+ * on every `open(id, { focus: true })`, a command whose panel says `focus` among them, and when
124
+ * the element appears while the request is up (the panel opened, or its code loaded, because of
125
+ * it). A plain open never moves it. `epdfSurfaceFocusSelect` selects an input's text, so typing
126
+ * replaces it:
127
+ *
128
+ * <input epdfSurfaceFocus="search" epdfSurfaceFocusSelect [(ngModel)]="query" />
129
+ *
130
+ * It reads the panel of this part of the template's document.
131
+ */
132
+ class EpdfSurfaceFocus {
133
+ /** The panel's name. */
134
+ id = input.required(...(ngDevMode ? [{ debugName: "id", alias: 'epdfSurfaceFocus' }] : [{ alias: 'epdfSurfaceFocus' }]));
135
+ /** Select the text of an input or a text area as it takes focus. */
136
+ select = input(false, ...(ngDevMode ? [{ debugName: "select", alias: 'epdfSurfaceFocusSelect', transform: booleanAttribute }] : [{ alias: 'epdfSurfaceFocusSelect', transform: booleanAttribute }]));
137
+ constructor() {
138
+ // The service's own checks: a viewer above, with withShell() in it.
139
+ inject(EpdfShell);
140
+ const element = inject(ElementRef).nativeElement;
141
+ const shell = new CapabilityBinding(injectKernelHost('epdfSurfaceFocus'), () => ShellToken, injectDocumentScope());
142
+ const request = shell.select((current) => current.getSurface(this.id())?.focusRequest ?? 0, 0, Object.is);
143
+ const follower = createSurfaceFocusFollower();
144
+ // After rendering, so an element that has just appeared is in place to take focus.
145
+ afterRenderEffect({
146
+ write: () => {
147
+ const current = shell.capability();
148
+ const value = request();
149
+ const select = this.select();
150
+ untracked(() => follower.follow(element, current, value, { select }));
151
+ },
152
+ });
153
+ }
154
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfSurfaceFocus, deps: [], target: i0.ɵɵFactoryTarget.Directive });
155
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.4", type: EpdfSurfaceFocus, isStandalone: true, selector: "[epdfSurfaceFocus]", inputs: { id: { classPropertyName: "id", publicName: "epdfSurfaceFocus", isSignal: true, isRequired: true, transformFunction: null }, select: { classPropertyName: "select", publicName: "epdfSurfaceFocusSelect", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfSurfaceFocus, decorators: [{
158
+ type: Directive,
159
+ args: [{ selector: '[epdfSurfaceFocus]' }]
160
+ }], ctorParameters: () => [] });
161
+
162
+ /**
163
+ * @embedpdf/angular/shell: which panels, dialogs and menus are open.
164
+ *
165
+ * withShell() the plugin, for provideEmbedPdf()
166
+ * inject(EpdfShell), shell.surface(id) the open panels and menus, as signals and calls
167
+ * <button epdfPanelToggle="comments"> a button that opens and closes a panel
168
+ * <input epdfSurfaceFocus="search"> an element that takes the cursor when its panel asks
169
+ */
170
+ // The plugin's types and helpers, so app code has one import for the feature.
171
+
172
+ /**
173
+ * Generated bundle index. Do not edit.
174
+ */
175
+
176
+ export { EpdfPanelToggle, EpdfShell, EpdfSurfaceFocus, withShell };
177
+ //# sourceMappingURL=embedpdf-angular-shell.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedpdf-angular-shell.mjs","sources":["../../shell/src/shell.ts","../../shell/src/public_api.ts","../../shell/src/embedpdf-angular-shell.ts"],"sourcesContent":["/**\n * The shell plugin's service, feature and directives: which panels, dialogs and menus are open.\n * The app draws them; these bind their open state to the viewer, so a command, a button and\n * your code open the same panel, and the layout can be stored and restored.\n *\n * withShell() the plugin, for provideEmbedPdf()\n * inject(EpdfShell) `openSurfaces()`, `openMenus()`, `open()`, `toggle()`, …\n * shell.surface('comments') one panel: `isOpen()`, `props()`, `open()`, `close()`\n * <button epdfPanelToggle=\"comments\"> a button that opens and closes one\n * <input epdfSurfaceFocus=\"search\"> an element that takes the cursor when its panel asks\n *\n * Without a document every panel reads as closed, no menu as open, and a surface's verbs do\n * nothing, so chrome outside `*epdfDocumentGate` can use them. The service's own methods then\n * refuse with `not-ready`, like every document plugin's.\n */\nimport {\n afterRenderEffect,\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n Injectable,\n input,\n untracked,\n type Signal,\n} from '@angular/core';\nimport {\n CapabilityBinding,\n injectDocumentScope,\n injectKernelHost,\n pluginService,\n type EmbedPdfFeature,\n} from '@embedpdf/angular/runtime';\nimport { shellPlugin, shellState, ShellToken } from '@embedpdf/plugin-shell';\nimport type { OpenSurfaceOptions, SurfaceProps } from '@embedpdf/plugin-shell';\nimport { createSurfaceFocusFollower } from '@embedpdf/web';\n\n/** One named panel, dialog or overlay of the service's document. */\nexport interface EpdfSurface {\n /** Whether it's open; false without a document. */\n readonly isOpen: Signal<boolean>;\n /** The props it was opened with, or updated to; empty when it has none. */\n readonly props: Signal<SurfaceProps>;\n /** Open it: `exclusive` closes the others of that group, `props` travel with it. */\n open(options?: OpenSurfaceOptions): void;\n close(): void;\n /** Open it when it's closed, close it when it's open. */\n toggle(options?: OpenSurfaceOptions): void;\n}\n\nconst NO_PROPS: SurfaceProps = Object.freeze({});\n\n/**\n * The panels, dialogs and menus of this part of the template's document: `openSurfaces()` and\n * `openMenus()` as signals, the shell's methods, `surfaceOpened$` and the other events, and\n * `surface(id)` for one panel.\n */\n@Injectable({ providedIn: 'root' })\nexport class EpdfShell extends pluginService({\n name: 'EpdfShell',\n feature: 'withShell()',\n token: ShellToken,\n state: shellState,\n methods: [\n 'isOpen',\n 'getSurface',\n 'listOpenSurfaces',\n 'open',\n 'close',\n 'toggle',\n 'updateSurfaceProps',\n 'closeAll',\n 'isMenuOpen',\n 'listOpenMenus',\n 'openMenu',\n 'closeMenu',\n 'toggleMenu',\n 'closeAllMenus',\n 'getSnapshot',\n 'applySnapshot',\n ],\n events: ['onSurfaceOpened', 'onSurfaceClosed', 'onMenuOpened', 'onMenuClosed'],\n}) {\n /**\n * One panel, dialog or overlay: `isOpen()` and `props()` as signals, and `open()`, `close()`\n * and `toggle()`. Pass a function for an id that changes (a component's input). Without a\n * document it reads as closed and its verbs do nothing.\n *\n * protected readonly panel = inject(EpdfShell).surface('comments');\n */\n surface(id: string | (() => string)): EpdfSurface {\n const idOf = typeof id === 'function' ? id : () => id;\n const shell = this.binding.capability;\n // The verbs act on the document current when they're called, and on none without one.\n const now = () => untracked(shell);\n return {\n isOpen: this.binding.select((shell) => shell.isOpen(idOf()), false, Object.is),\n props: this.binding.select(\n (shell) => shell.getSurface(idOf())?.props ?? NO_PROPS,\n NO_PROPS,\n Object.is,\n ),\n open: (options) => now()?.open(untracked(idOf), options),\n close: () => now()?.close(untracked(idOf)),\n toggle: (options) => now()?.toggle(untracked(idOf), options),\n };\n }\n}\n\n/** The shell plugin: which panels, dialogs and menus are open, per document. */\nexport function withShell(): EmbedPdfFeature {\n return { plugins: [shellPlugin()], services: [EpdfShell] };\n}\n\n/**\n * A button of yours that opens and closes a panel, and says whether it's open\n * (`aria-expanded`). `epdfPanelToggleExclusive` gives the panel its group, so opening it\n * closes the group's other panel:\n *\n * <button epdfPanelToggle=\"comments\" epdfPanelToggleExclusive=\"right\">Comments</button>\n *\n * The template reference has `isOpen()`: `#comments=\"epdfPanelToggle\"`.\n */\n@Directive({\n selector: '[epdfPanelToggle]',\n exportAs: 'epdfPanelToggle',\n host: {\n '(click)': 'toggle()',\n '[attr.aria-expanded]': 'isOpen()',\n },\n})\nexport class EpdfPanelToggle {\n /** The panel's name. */\n readonly id = input.required<string>({ alias: 'epdfPanelToggle' });\n /** Its group: opening it closes the other open panel of the same group. */\n readonly exclusive = input<string | undefined>(undefined, { alias: 'epdfPanelToggleExclusive' });\n\n private readonly panel = inject(EpdfShell).surface(() => this.id());\n\n /** Whether the panel is open. */\n readonly isOpen: Signal<boolean> = this.panel.isOpen;\n\n /** Open the panel when it's closed, close it when it's open. */\n toggle(): void {\n const exclusive = this.exclusive();\n this.panel.toggle(exclusive === undefined ? undefined : { exclusive });\n }\n}\n\n/**\n * An element of yours that takes the cursor when the panel `epdfSurfaceFocus` names asks for it:\n * on every `open(id, { focus: true })`, a command whose panel says `focus` among them, and when\n * the element appears while the request is up (the panel opened, or its code loaded, because of\n * it). A plain open never moves it. `epdfSurfaceFocusSelect` selects an input's text, so typing\n * replaces it:\n *\n * <input epdfSurfaceFocus=\"search\" epdfSurfaceFocusSelect [(ngModel)]=\"query\" />\n *\n * It reads the panel of this part of the template's document.\n */\n@Directive({ selector: '[epdfSurfaceFocus]' })\nexport class EpdfSurfaceFocus {\n /** The panel's name. */\n readonly id = input.required<string>({ alias: 'epdfSurfaceFocus' });\n /** Select the text of an input or a text area as it takes focus. */\n readonly select = input(false, { alias: 'epdfSurfaceFocusSelect', transform: booleanAttribute });\n\n constructor() {\n // The service's own checks: a viewer above, with withShell() in it.\n inject(EpdfShell);\n const element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const shell = new CapabilityBinding(\n injectKernelHost('epdfSurfaceFocus'),\n () => ShellToken,\n injectDocumentScope(),\n );\n const request = shell.select(\n (current) => current.getSurface(this.id())?.focusRequest ?? 0,\n 0,\n Object.is,\n );\n const follower = createSurfaceFocusFollower();\n // After rendering, so an element that has just appeared is in place to take focus.\n afterRenderEffect({\n write: () => {\n const current = shell.capability();\n const value = request();\n const select = this.select();\n untracked(() => follower.follow(element, current, value, { select }));\n },\n });\n }\n}\n","/**\n * @embedpdf/angular/shell: which panels, dialogs and menus are open.\n *\n * withShell() the plugin, for provideEmbedPdf()\n * inject(EpdfShell), shell.surface(id) the open panels and menus, as signals and calls\n * <button epdfPanelToggle=\"comments\"> a button that opens and closes a panel\n * <input epdfSurfaceFocus=\"search\"> an element that takes the cursor when its panel asks\n */\n\n// The plugin's types and helpers, so app code has one import for the feature.\nexport * from '@embedpdf/plugin-shell';\nexport * from './shell';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { signatureState, SignatureToken, SIGNATURES_LIBRARY_KIND, signerRowsOf, signaturePlugin } from '@embedpdf/plugin-signature';
2
+ export * from '@embedpdf/plugin-signature';
3
+ import * as i0 from '@angular/core';
4
+ import { computed, Injectable } from '@angular/core';
5
+ import { pluginService, CapabilityBinding, injectDocumentScope } from '@embedpdf/angular/runtime';
6
+ import { StampToken } from '@embedpdf/plugin-stamp/contract';
7
+
8
+ /**
9
+ * The signature plugin's service and feature:
10
+ *
11
+ * withSignature(config) the plugin, for provideEmbedPdf(), with the key to sign with
12
+ * inject(EpdfSignature) sign, fill and check signature fields: `sign()`, `placeMark()`,
13
+ * `signatures()`, the events as streams (`invalidationPredicted$`),
14
+ * and the people whose marks this browser holds, `signerRows()`
15
+ *
16
+ * Signing needs the form plugin (the fields) and the stamp plugin (a person's marks):
17
+ * `provideEmbedPdf(config, withForm(), withStamp(), withSignature({ key }))`.
18
+ */
19
+ const NO_LIBRARIES = Object.freeze([]);
20
+ const NO_ASSETS = Object.freeze([]);
21
+ /**
22
+ * Signatures: `signatures()`, `protection()`, `target()`, `busy()`, `pending()` and `status()`
23
+ * as signals; signing, filling and checking as methods (`sign()`, `placeMark()`,
24
+ * `fillField()`, `validate()`, …, the Signatures page's Methods table); the events as streams
25
+ * (`signed$`, `invalidationPredicted$`, `targetChanged$`, …); and the settings. Without a
26
+ * document, `signatures()` is empty and a method refuses with `not-ready`.
27
+ */
28
+ class EpdfSignature extends pluginService({
29
+ name: 'EpdfSignature',
30
+ feature: 'withSignature()',
31
+ token: SignatureToken,
32
+ state: signatureState,
33
+ methods: [
34
+ 'getSnapshot',
35
+ 'getStatus',
36
+ 'listSignatures',
37
+ 'listUnsignedFields',
38
+ 'getSignature',
39
+ 'listVerdicts',
40
+ 'getVerdict',
41
+ 'getProtection',
42
+ 'getPending',
43
+ 'isBusy',
44
+ 'getMode',
45
+ 'getTarget',
46
+ 'sign',
47
+ 'prepareSignature',
48
+ 'completeSignature',
49
+ 'cancelPending',
50
+ 'fillField',
51
+ 'clearField',
52
+ 'placeMark',
53
+ 'setTarget',
54
+ 'requestInspection',
55
+ 'refresh',
56
+ 'validate',
57
+ 'validateField',
58
+ 'analyzeChanges',
59
+ 'readRevision',
60
+ 'canSign',
61
+ 'canFill',
62
+ 'canCertify',
63
+ 'canReadRevision',
64
+ ],
65
+ events: [
66
+ 'onSigned',
67
+ 'onFilled',
68
+ 'onCleared',
69
+ 'onValidated',
70
+ 'onProtectionChanged',
71
+ 'onInvalidationPredicted',
72
+ 'onTargetChanged',
73
+ 'onSignRequested',
74
+ 'onInspectionRequested',
75
+ ],
76
+ }) {
77
+ /** The stamp plugin, where a person's marks are kept; absent without `withStamp()`. */
78
+ stamp = new CapabilityBinding(this.binding.host, () => StampToken, injectDocumentScope());
79
+ libraries = this.stamp.select((stamp) => stamp.listLibraries({ kind: SIGNATURES_LIBRARY_KIND }), NO_LIBRARIES);
80
+ assets = this.stamp.select((stamp) => stamp.listAssets(), NO_ASSETS);
81
+ /**
82
+ * The people whose marks this browser holds, one row per stamp library of kind
83
+ * `signatures`, each with its signatures and its initials, for a picker. Empty without the
84
+ * stamp plugin. Rename, delete and export a person with the stamp plugin's library methods.
85
+ */
86
+ signerRows = computed(() => signerRowsOf(this.libraries(), this.assets()), ...(ngDevMode ? [{ debugName: "signerRows" }] : []));
87
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfSignature, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
88
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfSignature, providedIn: 'root' });
89
+ }
90
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.4", ngImport: i0, type: EpdfSignature, decorators: [{
91
+ type: Injectable,
92
+ args: [{ providedIn: 'root' }]
93
+ }] });
94
+ /**
95
+ * The signature plugin, with its settings: the `key` to sign with (a signer, or a function that
96
+ * gives one when someone signs), the `mode`, the certificates you `trust`, and `allowCertify`.
97
+ */
98
+ function withSignature(config) {
99
+ return { plugins: [signaturePlugin(config)], services: [EpdfSignature] };
100
+ }
101
+
102
+ /**
103
+ * @embedpdf/angular/signature: sign PDF signature fields with a mark and a key you control,
104
+ * check the signatures a document has, and hear before an edit breaks one.
105
+ *
106
+ * withSignature(config) the plugin, for provideEmbedPdf(), with the key to sign with
107
+ * inject(EpdfSignature) signing, filling and checking, as signals, methods and streams;
108
+ * `signerRows()`, the people whose marks this browser holds
109
+ *
110
+ * The signers (`webCryptoSigner`, `remoteSigner`, `personalSigner` with `indexedDbKeyStore`,
111
+ * `createTestSigner`) come with the plugin's exports below.
112
+ */
113
+ // The plugin's types, helpers and signers, so app code has one import for the feature.
114
+
115
+ /**
116
+ * Generated bundle index. Do not edit.
117
+ */
118
+
119
+ export { EpdfSignature, withSignature };
120
+ //# sourceMappingURL=embedpdf-angular-signature.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedpdf-angular-signature.mjs","sources":["../../signature/src/signature.ts","../../signature/src/public_api.ts","../../signature/src/embedpdf-angular-signature.ts"],"sourcesContent":["/**\n * The signature plugin's service and feature:\n *\n * withSignature(config) the plugin, for provideEmbedPdf(), with the key to sign with\n * inject(EpdfSignature) sign, fill and check signature fields: `sign()`, `placeMark()`,\n * `signatures()`, the events as streams (`invalidationPredicted$`),\n * and the people whose marks this browser holds, `signerRows()`\n *\n * Signing needs the form plugin (the fields) and the stamp plugin (a person's marks):\n * `provideEmbedPdf(config, withForm(), withStamp(), withSignature({ key }))`.\n */\nimport { computed, Injectable, type Signal } from '@angular/core';\nimport {\n CapabilityBinding,\n injectDocumentScope,\n pluginService,\n type EmbedPdfFeature,\n} from '@embedpdf/angular/runtime';\nimport {\n signaturePlugin,\n signatureState,\n signerRowsOf,\n SIGNATURES_LIBRARY_KIND,\n SignatureToken,\n type SignatureConfig,\n type SignerRow,\n} from '@embedpdf/plugin-signature';\nimport {\n StampToken,\n type StampAsset,\n type StampLibrary,\n} from '@embedpdf/plugin-stamp/contract';\n\nconst NO_LIBRARIES: readonly StampLibrary[] = Object.freeze([]);\nconst NO_ASSETS: readonly StampAsset[] = Object.freeze([]);\n\n/**\n * Signatures: `signatures()`, `protection()`, `target()`, `busy()`, `pending()` and `status()`\n * as signals; signing, filling and checking as methods (`sign()`, `placeMark()`,\n * `fillField()`, `validate()`, …, the Signatures page's Methods table); the events as streams\n * (`signed$`, `invalidationPredicted$`, `targetChanged$`, …); and the settings. Without a\n * document, `signatures()` is empty and a method refuses with `not-ready`.\n */\n@Injectable({ providedIn: 'root' })\nexport class EpdfSignature extends pluginService({\n name: 'EpdfSignature',\n feature: 'withSignature()',\n token: SignatureToken,\n state: signatureState,\n methods: [\n 'getSnapshot',\n 'getStatus',\n 'listSignatures',\n 'listUnsignedFields',\n 'getSignature',\n 'listVerdicts',\n 'getVerdict',\n 'getProtection',\n 'getPending',\n 'isBusy',\n 'getMode',\n 'getTarget',\n 'sign',\n 'prepareSignature',\n 'completeSignature',\n 'cancelPending',\n 'fillField',\n 'clearField',\n 'placeMark',\n 'setTarget',\n 'requestInspection',\n 'refresh',\n 'validate',\n 'validateField',\n 'analyzeChanges',\n 'readRevision',\n 'canSign',\n 'canFill',\n 'canCertify',\n 'canReadRevision',\n ],\n events: [\n 'onSigned',\n 'onFilled',\n 'onCleared',\n 'onValidated',\n 'onProtectionChanged',\n 'onInvalidationPredicted',\n 'onTargetChanged',\n 'onSignRequested',\n 'onInspectionRequested',\n ],\n}) {\n /** The stamp plugin, where a person's marks are kept; absent without `withStamp()`. */\n private readonly stamp = new CapabilityBinding(\n this.binding.host,\n () => StampToken,\n injectDocumentScope(),\n );\n private readonly libraries = this.stamp.select(\n (stamp) => stamp.listLibraries({ kind: SIGNATURES_LIBRARY_KIND }),\n NO_LIBRARIES,\n );\n private readonly assets = this.stamp.select((stamp) => stamp.listAssets(), NO_ASSETS);\n\n /**\n * The people whose marks this browser holds, one row per stamp library of kind\n * `signatures`, each with its signatures and its initials, for a picker. Empty without the\n * stamp plugin. Rename, delete and export a person with the stamp plugin's library methods.\n */\n readonly signerRows: Signal<readonly SignerRow[]> = computed(() =>\n signerRowsOf(this.libraries(), this.assets()),\n );\n}\n\n/**\n * The signature plugin, with its settings: the `key` to sign with (a signer, or a function that\n * gives one when someone signs), the `mode`, the certificates you `trust`, and `allowCertify`.\n */\nexport function withSignature(config?: SignatureConfig): EmbedPdfFeature {\n return { plugins: [signaturePlugin(config)], services: [EpdfSignature] };\n}\n","/**\n * @embedpdf/angular/signature: sign PDF signature fields with a mark and a key you control,\n * check the signatures a document has, and hear before an edit breaks one.\n *\n * withSignature(config) the plugin, for provideEmbedPdf(), with the key to sign with\n * inject(EpdfSignature) signing, filling and checking, as signals, methods and streams;\n * `signerRows()`, the people whose marks this browser holds\n *\n * The signers (`webCryptoSigner`, `remoteSigner`, `personalSigner` with `indexedDbKeyStore`,\n * `createTestSigner`) come with the plugin's exports below.\n */\n\n// The plugin's types, helpers and signers, so app code has one import for the feature.\nexport * from '@embedpdf/plugin-signature';\nexport { EpdfSignature, withSignature } from './signature';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;AAAA;;;;;;;;;;AAUG;AAuBH,MAAM,YAAY,GAA4B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/D,MAAM,SAAS,GAA0B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAE1D;;;;;;AAMG;AAEG,MAAO,aAAc,SAAQ,aAAa,CAAC;AAC/C,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,OAAO,EAAE;QACP,aAAa;QACb,WAAW;QACX,gBAAgB;QAChB,oBAAoB;QACpB,cAAc;QACd,cAAc;QACd,YAAY;QACZ,eAAe;QACf,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,WAAW;QACX,MAAM;QACN,kBAAkB;QAClB,mBAAmB;QACnB,eAAe;QACf,WAAW;QACX,YAAY;QACZ,WAAW;QACX,WAAW;QACX,mBAAmB;QACnB,SAAS;QACT,UAAU;QACV,eAAe;QACf,gBAAgB;QAChB,cAAc;QACd,SAAS;QACT,SAAS;QACT,YAAY;QACZ,iBAAiB;AAClB,KAAA;AACD,IAAA,MAAM,EAAE;QACN,UAAU;QACV,UAAU;QACV,WAAW;QACX,aAAa;QACb,qBAAqB;QACrB,yBAAyB;QACzB,iBAAiB;QACjB,iBAAiB;QACjB,uBAAuB;AACxB,KAAA;CACF,CAAC,CAAA;;AAEiB,IAAA,KAAK,GAAG,IAAI,iBAAiB,CAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,MAAM,UAAU,EAChB,mBAAmB,EAAE,CACtB;IACgB,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC5C,CAAC,KAAK,KAAK,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,EACjE,YAAY,CACb;AACgB,IAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC;AAErF;;;;AAIG;AACM,IAAA,UAAU,GAAiC,QAAQ,CAAC,MAC3D,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,sDAC9C;uGApEU,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAwElC;;;AAGG;AACG,SAAU,aAAa,CAAC,MAAwB,EAAA;AACpD,IAAA,OAAO,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE;AAC1E;;ACzHA;;;;;;;;;;AAUG;AAEH;;ACZA;;AAEG;;;;"}