@embedpdf/vue 0.0.0-stage → 3.0.0-next.16

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 (417) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +258 -2
  3. package/dist/Anchored.vue_vue_type_script_setup_true_lang-BEImlFso.cjs +124 -0
  4. package/dist/Anchored.vue_vue_type_script_setup_true_lang-BEImlFso.cjs.map +1 -0
  5. package/dist/Anchored.vue_vue_type_script_setup_true_lang-Brhh5jyF.js +125 -0
  6. package/dist/Anchored.vue_vue_type_script_setup_true_lang-Brhh5jyF.js.map +1 -0
  7. package/dist/AnchoredScope.vue_vue_type_script_setup_true_lang-BwtHXw73.cjs +20 -0
  8. package/dist/AnchoredScope.vue_vue_type_script_setup_true_lang-BwtHXw73.cjs.map +1 -0
  9. package/dist/AnchoredScope.vue_vue_type_script_setup_true_lang-Ulkr3a6R.js +21 -0
  10. package/dist/AnchoredScope.vue_vue_type_script_setup_true_lang-Ulkr3a6R.js.map +1 -0
  11. package/dist/DocumentScope.vue_vue_type_script_setup_true_lang-C-7yeEGh.js +192 -0
  12. package/dist/DocumentScope.vue_vue_type_script_setup_true_lang-C-7yeEGh.js.map +1 -0
  13. package/dist/DocumentScope.vue_vue_type_script_setup_true_lang-czzeUzPl.cjs +191 -0
  14. package/dist/DocumentScope.vue_vue_type_script_setup_true_lang-czzeUzPl.cjs.map +1 -0
  15. package/dist/FormLayer.vue_vue_type_script_setup_true_lang-BA0_VwFc.cjs +682 -0
  16. package/dist/FormLayer.vue_vue_type_script_setup_true_lang-BA0_VwFc.cjs.map +1 -0
  17. package/dist/FormLayer.vue_vue_type_script_setup_true_lang-DUqft-xs.js +683 -0
  18. package/dist/FormLayer.vue_vue_type_script_setup_true_lang-DUqft-xs.js.map +1 -0
  19. package/dist/LinkLayer.vue_vue_type_script_setup_true_lang-C5-eQD34.cjs +174 -0
  20. package/dist/LinkLayer.vue_vue_type_script_setup_true_lang-C5-eQD34.cjs.map +1 -0
  21. package/dist/LinkLayer.vue_vue_type_script_setup_true_lang-EzLaOP3g.js +175 -0
  22. package/dist/LinkLayer.vue_vue_type_script_setup_true_lang-EzLaOP3g.js.map +1 -0
  23. package/dist/PagePointerSource.vue_vue_type_script_setup_true_lang-CJt3vdBW.js +33 -0
  24. package/dist/PagePointerSource.vue_vue_type_script_setup_true_lang-CJt3vdBW.js.map +1 -0
  25. package/dist/PagePointerSource.vue_vue_type_script_setup_true_lang-Cw29c8Oa.cjs +32 -0
  26. package/dist/PagePointerSource.vue_vue_type_script_setup_true_lang-Cw29c8Oa.cjs.map +1 -0
  27. package/dist/PageView.vue_vue_type_script_setup_true_lang-CjrpumX2.cjs +151 -0
  28. package/dist/PageView.vue_vue_type_script_setup_true_lang-CjrpumX2.cjs.map +1 -0
  29. package/dist/PageView.vue_vue_type_script_setup_true_lang-O4AFc0_R.js +152 -0
  30. package/dist/PageView.vue_vue_type_script_setup_true_lang-O4AFc0_R.js.map +1 -0
  31. package/dist/Scrollbar.vue_vue_type_script_setup_true_lang-DrOORC1H.cjs +480 -0
  32. package/dist/Scrollbar.vue_vue_type_script_setup_true_lang-DrOORC1H.cjs.map +1 -0
  33. package/dist/Scrollbar.vue_vue_type_script_setup_true_lang-HbCryx1B.js +481 -0
  34. package/dist/Scrollbar.vue_vue_type_script_setup_true_lang-HbCryx1B.js.map +1 -0
  35. package/dist/SearchLayer.vue_vue_type_script_setup_true_lang-BlLIPH1B.js +118 -0
  36. package/dist/SearchLayer.vue_vue_type_script_setup_true_lang-BlLIPH1B.js.map +1 -0
  37. package/dist/SearchLayer.vue_vue_type_script_setup_true_lang-CQozZCvB.cjs +117 -0
  38. package/dist/SearchLayer.vue_vue_type_script_setup_true_lang-CQozZCvB.cjs.map +1 -0
  39. package/dist/SelectionClipboard.vue_vue_type_script_setup_true_lang-C4TUDuyu.js +302 -0
  40. package/dist/SelectionClipboard.vue_vue_type_script_setup_true_lang-C4TUDuyu.js.map +1 -0
  41. package/dist/SelectionClipboard.vue_vue_type_script_setup_true_lang-C8T9q6Kb.cjs +301 -0
  42. package/dist/SelectionClipboard.vue_vue_type_script_setup_true_lang-C8T9q6Kb.cjs.map +1 -0
  43. package/dist/SvgShapes.vue_vue_type_script_setup_true_lang-D_c-wINF.cjs +38 -0
  44. package/dist/SvgShapes.vue_vue_type_script_setup_true_lang-D_c-wINF.cjs.map +1 -0
  45. package/dist/SvgShapes.vue_vue_type_script_setup_true_lang-fOTs4aqv.js +39 -0
  46. package/dist/SvgShapes.vue_vue_type_script_setup_true_lang-fOTs4aqv.js.map +1 -0
  47. package/dist/actions.cjs +42 -0
  48. package/dist/actions.cjs.map +1 -0
  49. package/dist/actions.d.cts +41 -0
  50. package/dist/actions.d.ts +41 -0
  51. package/dist/actions.js +37 -0
  52. package/dist/actions.js.map +1 -0
  53. package/dist/anchored/Anchored.vue.d.cts +40 -0
  54. package/dist/anchored/Anchored.vue.d.ts +40 -0
  55. package/dist/anchored/AnchoredScope.vue.d.cts +17 -0
  56. package/dist/anchored/AnchoredScope.vue.d.ts +17 -0
  57. package/dist/anchored/PlacedAnchored.vue.d.cts +19 -0
  58. package/dist/anchored/PlacedAnchored.vue.d.ts +19 -0
  59. package/dist/anchored/projector.d.cts +32 -0
  60. package/dist/anchored/projector.d.ts +32 -0
  61. package/dist/anchored.cjs +13 -0
  62. package/dist/anchored.cjs.map +1 -0
  63. package/dist/anchored.d.cts +15 -0
  64. package/dist/anchored.d.ts +15 -0
  65. package/dist/anchored.js +13 -0
  66. package/dist/anchored.js.map +1 -0
  67. package/dist/annotation/AnnotationChrome.vue.d.cts +20 -0
  68. package/dist/annotation/AnnotationChrome.vue.d.ts +20 -0
  69. package/dist/annotation/AnnotationDraftMenu.vue.d.cts +26 -0
  70. package/dist/annotation/AnnotationDraftMenu.vue.d.ts +26 -0
  71. package/dist/annotation/AnnotationFrame.vue.d.cts +25 -0
  72. package/dist/annotation/AnnotationFrame.vue.d.ts +25 -0
  73. package/dist/annotation/AnnotationLayer.vue.d.cts +23 -0
  74. package/dist/annotation/AnnotationLayer.vue.d.ts +23 -0
  75. package/dist/annotation/AnnotationLook.vue.d.cts +21 -0
  76. package/dist/annotation/AnnotationLook.vue.d.ts +21 -0
  77. package/dist/annotation/AnnotationMenu.vue.d.cts +23 -0
  78. package/dist/annotation/AnnotationMenu.vue.d.ts +23 -0
  79. package/dist/annotation/AnnotationRotationBadge.vue.d.cts +26 -0
  80. package/dist/annotation/AnnotationRotationBadge.vue.d.ts +26 -0
  81. package/dist/annotation/AnnotationScene.vue.d.cts +7 -0
  82. package/dist/annotation/AnnotationScene.vue.d.ts +7 -0
  83. package/dist/annotation/FreeTextBox.vue.d.cts +9 -0
  84. package/dist/annotation/FreeTextBox.vue.d.ts +9 -0
  85. package/dist/annotation/NativeDrawing.vue.d.cts +10 -0
  86. package/dist/annotation/NativeDrawing.vue.d.ts +10 -0
  87. package/dist/annotation/StampGhost.vue.d.cts +7 -0
  88. package/dist/annotation/StampGhost.vue.d.ts +7 -0
  89. package/dist/annotation/composables.d.cts +76 -0
  90. package/dist/annotation/composables.d.ts +76 -0
  91. package/dist/annotation/state.d.cts +19 -0
  92. package/dist/annotation/state.d.ts +19 -0
  93. package/dist/annotation/text-box.d.cts +28 -0
  94. package/dist/annotation/text-box.d.ts +28 -0
  95. package/dist/annotation/types.d.cts +154 -0
  96. package/dist/annotation/types.d.ts +154 -0
  97. package/dist/annotation.cjs +29 -0
  98. package/dist/annotation.cjs.map +1 -0
  99. package/dist/annotation.d.cts +35 -0
  100. package/dist/annotation.d.ts +35 -0
  101. package/dist/annotation.js +23 -0
  102. package/dist/annotation.js.map +1 -0
  103. package/dist/attachment.cjs +22 -0
  104. package/dist/attachment.cjs.map +1 -0
  105. package/dist/attachment.d.cts +34 -0
  106. package/dist/attachment.d.ts +34 -0
  107. package/dist/attachment.js +17 -0
  108. package/dist/attachment.js.map +1 -0
  109. package/dist/capabilities-C7YzgPCX.js +164 -0
  110. package/dist/capabilities-C7YzgPCX.js.map +1 -0
  111. package/dist/capabilities-DVNJmgy7.cjs +163 -0
  112. package/dist/capabilities-DVNJmgy7.cjs.map +1 -0
  113. package/dist/commands.cjs +81 -0
  114. package/dist/commands.cjs.map +1 -0
  115. package/dist/commands.d.cts +61 -0
  116. package/dist/commands.d.ts +61 -0
  117. package/dist/commands.js +76 -0
  118. package/dist/commands.js.map +1 -0
  119. package/dist/composables-BGBsNDf9.cjs +25 -0
  120. package/dist/composables-BGBsNDf9.cjs.map +1 -0
  121. package/dist/composables-Bi6QvJpj.cjs +978 -0
  122. package/dist/composables-Bi6QvJpj.cjs.map +1 -0
  123. package/dist/composables-DK3lwh38.js +979 -0
  124. package/dist/composables-DK3lwh38.js.map +1 -0
  125. package/dist/composables-DwsZdg06.js +26 -0
  126. package/dist/composables-DwsZdg06.js.map +1 -0
  127. package/dist/dev-CtMlvxjZ.js +17 -0
  128. package/dist/dev-CtMlvxjZ.js.map +1 -0
  129. package/dist/dev-eeIS2B4c.cjs +16 -0
  130. package/dist/dev-eeIS2B4c.cjs.map +1 -0
  131. package/dist/dev.d.cts +11 -0
  132. package/dist/dev.d.ts +11 -0
  133. package/dist/documents-DUu5H4yH.js +34 -0
  134. package/dist/documents-DUu5H4yH.js.map +1 -0
  135. package/dist/documents-TQ1fMdWI.cjs +33 -0
  136. package/dist/documents-TQ1fMdWI.cjs.map +1 -0
  137. package/dist/form/ButtonControl.vue.d.cts +11 -0
  138. package/dist/form/ButtonControl.vue.d.ts +11 -0
  139. package/dist/form/ComboControl.vue.d.cts +11 -0
  140. package/dist/form/ComboControl.vue.d.ts +11 -0
  141. package/dist/form/FieldPictures.vue.d.cts +3 -0
  142. package/dist/form/FieldPictures.vue.d.ts +3 -0
  143. package/dist/form/FormFocusRing.vue.d.cts +8 -0
  144. package/dist/form/FormFocusRing.vue.d.ts +8 -0
  145. package/dist/form/FormLayer.vue.d.cts +3 -0
  146. package/dist/form/FormLayer.vue.d.ts +3 -0
  147. package/dist/form/ListControl.vue.d.cts +11 -0
  148. package/dist/form/ListControl.vue.d.ts +11 -0
  149. package/dist/form/NativeListBox.vue.d.cts +27 -0
  150. package/dist/form/NativeListBox.vue.d.ts +27 -0
  151. package/dist/form/SignatureControl.vue.d.cts +11 -0
  152. package/dist/form/SignatureControl.vue.d.ts +11 -0
  153. package/dist/form/TextControl.vue.d.cts +11 -0
  154. package/dist/form/TextControl.vue.d.ts +11 -0
  155. package/dist/form/ToggleControl.vue.d.cts +11 -0
  156. package/dist/form/ToggleControl.vue.d.ts +11 -0
  157. package/dist/form/composables.d.cts +52 -0
  158. package/dist/form/composables.d.ts +52 -0
  159. package/dist/form/widget-box.d.cts +34 -0
  160. package/dist/form/widget-box.d.ts +34 -0
  161. package/dist/form.cjs +17 -0
  162. package/dist/form.cjs.map +1 -0
  163. package/dist/form.d.cts +12 -0
  164. package/dist/form.d.ts +12 -0
  165. package/dist/form.js +11 -0
  166. package/dist/form.js.map +1 -0
  167. package/dist/history.cjs +22 -0
  168. package/dist/history.cjs.map +1 -0
  169. package/dist/history.d.cts +31 -0
  170. package/dist/history.d.ts +31 -0
  171. package/dist/history.js +17 -0
  172. package/dist/history.js.map +1 -0
  173. package/dist/i18n.cjs +29 -0
  174. package/dist/i18n.cjs.map +1 -0
  175. package/dist/i18n.d.cts +36 -0
  176. package/dist/i18n.d.ts +36 -0
  177. package/dist/i18n.js +24 -0
  178. package/dist/i18n.js.map +1 -0
  179. package/dist/index.cjs +414 -0
  180. package/dist/index.cjs.map +1 -0
  181. package/dist/index.d.cts +32 -0
  182. package/dist/index.d.ts +32 -0
  183. package/dist/index.js +234 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/interaction/PagePointerSource.vue.d.cts +3 -0
  186. package/dist/interaction/PagePointerSource.vue.d.ts +3 -0
  187. package/dist/interaction.cjs +63 -0
  188. package/dist/interaction.cjs.map +1 -0
  189. package/dist/interaction.d.cts +40 -0
  190. package/dist/interaction.d.ts +40 -0
  191. package/dist/interaction.js +47 -0
  192. package/dist/interaction.js.map +1 -0
  193. package/dist/link/LinkAnchor.vue.d.cts +9 -0
  194. package/dist/link/LinkAnchor.vue.d.ts +9 -0
  195. package/dist/link/LinkLayer.vue.d.cts +22 -0
  196. package/dist/link/LinkLayer.vue.d.ts +22 -0
  197. package/dist/link/composables.d.cts +29 -0
  198. package/dist/link/composables.d.ts +29 -0
  199. package/dist/link.cjs +14 -0
  200. package/dist/link.cjs.map +1 -0
  201. package/dist/link.d.cts +11 -0
  202. package/dist/link.d.ts +11 -0
  203. package/dist/link.js +8 -0
  204. package/dist/link.js.map +1 -0
  205. package/dist/measurement.cjs +43 -0
  206. package/dist/measurement.cjs.map +1 -0
  207. package/dist/measurement.d.cts +51 -0
  208. package/dist/measurement.d.ts +51 -0
  209. package/dist/measurement.js +38 -0
  210. package/dist/measurement.js.map +1 -0
  211. package/dist/metadata.cjs +22 -0
  212. package/dist/metadata.cjs.map +1 -0
  213. package/dist/metadata.d.cts +31 -0
  214. package/dist/metadata.d.ts +31 -0
  215. package/dist/metadata.js +17 -0
  216. package/dist/metadata.js.map +1 -0
  217. package/dist/outline.cjs +22 -0
  218. package/dist/outline.cjs.map +1 -0
  219. package/dist/outline.d.cts +36 -0
  220. package/dist/outline.d.ts +36 -0
  221. package/dist/outline.js +17 -0
  222. package/dist/outline.js.map +1 -0
  223. package/dist/page-D9XIuLSj.js +16 -0
  224. package/dist/page-D9XIuLSj.js.map +1 -0
  225. package/dist/page-Doy4_Sdz.cjs +15 -0
  226. package/dist/page-Doy4_Sdz.cjs.map +1 -0
  227. package/dist/page-edit.cjs +18 -0
  228. package/dist/page-edit.cjs.map +1 -0
  229. package/dist/page-edit.d.cts +28 -0
  230. package/dist/page-edit.d.ts +28 -0
  231. package/dist/page-edit.js +13 -0
  232. package/dist/page-edit.js.map +1 -0
  233. package/dist/page-layers-c-CJYAUO.cjs +30 -0
  234. package/dist/page-layers-c-CJYAUO.cjs.map +1 -0
  235. package/dist/page-layers-rlh4-1qr.js +31 -0
  236. package/dist/page-layers-rlh4-1qr.js.map +1 -0
  237. package/dist/page-layers.d.cts +21 -0
  238. package/dist/page-layers.d.ts +21 -0
  239. package/dist/page-view/PageView.vue.d.cts +42 -0
  240. package/dist/page-view/PageView.vue.d.ts +42 -0
  241. package/dist/page-view.cjs +5 -0
  242. package/dist/page-view.cjs.map +1 -0
  243. package/dist/page-view.d.cts +10 -0
  244. package/dist/page-view.d.ts +10 -0
  245. package/dist/page-view.js +5 -0
  246. package/dist/page-view.js.map +1 -0
  247. package/dist/projector-CDZn1kh1.js +32 -0
  248. package/dist/projector-CDZn1kh1.js.map +1 -0
  249. package/dist/projector-Cf7879sx.cjs +31 -0
  250. package/dist/projector-Cf7879sx.cjs.map +1 -0
  251. package/dist/redaction.cjs +34 -0
  252. package/dist/redaction.cjs.map +1 -0
  253. package/dist/redaction.d.cts +44 -0
  254. package/dist/redaction.d.ts +44 -0
  255. package/dist/redaction.js +29 -0
  256. package/dist/redaction.js.map +1 -0
  257. package/dist/render/RenderLayer.vue.d.cts +23 -0
  258. package/dist/render/RenderLayer.vue.d.ts +23 -0
  259. package/dist/render/TileImage.vue.d.cts +13 -0
  260. package/dist/render/TileImage.vue.d.ts +13 -0
  261. package/dist/render/TilePlane.vue.d.cts +7 -0
  262. package/dist/render/TilePlane.vue.d.ts +7 -0
  263. package/dist/render.cjs +262 -0
  264. package/dist/render.cjs.map +1 -0
  265. package/dist/render.d.cts +16 -0
  266. package/dist/render.d.ts +16 -0
  267. package/dist/render.js +257 -0
  268. package/dist/render.js.map +1 -0
  269. package/dist/runtime/DocumentGate.vue.d.cts +24 -0
  270. package/dist/runtime/DocumentGate.vue.d.ts +24 -0
  271. package/dist/runtime/DocumentScope.vue.d.cts +16 -0
  272. package/dist/runtime/DocumentScope.vue.d.ts +16 -0
  273. package/dist/runtime/KernelProvider.vue.d.cts +17 -0
  274. package/dist/runtime/KernelProvider.vue.d.ts +17 -0
  275. package/dist/runtime/SvgShapes.vue.d.cts +7 -0
  276. package/dist/runtime/SvgShapes.vue.d.ts +7 -0
  277. package/dist/runtime/Viewer.vue.d.cts +57 -0
  278. package/dist/runtime/Viewer.vue.d.ts +57 -0
  279. package/dist/runtime/capabilities.d.cts +52 -0
  280. package/dist/runtime/capabilities.d.ts +52 -0
  281. package/dist/runtime/documents.d.cts +42 -0
  282. package/dist/runtime/documents.d.ts +42 -0
  283. package/dist/runtime/kernel.d.cts +36 -0
  284. package/dist/runtime/kernel.d.ts +36 -0
  285. package/dist/runtime/page.d.cts +15 -0
  286. package/dist/runtime/page.d.ts +15 -0
  287. package/dist/runtime/refs.d.cts +12 -0
  288. package/dist/runtime/refs.d.ts +12 -0
  289. package/dist/runtime/surface-box.d.cts +12 -0
  290. package/dist/runtime/surface-box.d.ts +12 -0
  291. package/dist/runtime.cjs +53 -0
  292. package/dist/runtime.cjs.map +1 -0
  293. package/dist/runtime.d.cts +24 -0
  294. package/dist/runtime.d.ts +24 -0
  295. package/dist/runtime.js +38 -0
  296. package/dist/runtime.js.map +1 -0
  297. package/dist/scope-BQA4toWB.cjs +17 -0
  298. package/dist/scope-BQA4toWB.cjs.map +1 -0
  299. package/dist/scope-BgdCqnYb.js +18 -0
  300. package/dist/scope-BgdCqnYb.js.map +1 -0
  301. package/dist/search/SearchLayer.vue.d.cts +17 -0
  302. package/dist/search/SearchLayer.vue.d.ts +17 -0
  303. package/dist/search/composables.d.cts +31 -0
  304. package/dist/search/composables.d.ts +31 -0
  305. package/dist/search.cjs +17 -0
  306. package/dist/search.cjs.map +1 -0
  307. package/dist/search.d.cts +10 -0
  308. package/dist/search.d.ts +10 -0
  309. package/dist/search.js +11 -0
  310. package/dist/search.js.map +1 -0
  311. package/dist/selection/SelectionClipboard.vue.d.cts +24 -0
  312. package/dist/selection/SelectionClipboard.vue.d.ts +24 -0
  313. package/dist/selection/SelectionHandles.vue.d.cts +8 -0
  314. package/dist/selection/SelectionHandles.vue.d.ts +8 -0
  315. package/dist/selection/SelectionLayer.vue.d.cts +3 -0
  316. package/dist/selection/SelectionLayer.vue.d.ts +3 -0
  317. package/dist/selection/SelectionMenu.vue.d.cts +23 -0
  318. package/dist/selection/SelectionMenu.vue.d.ts +23 -0
  319. package/dist/selection/composables.d.cts +24 -0
  320. package/dist/selection/composables.d.ts +24 -0
  321. package/dist/selection.cjs +24 -0
  322. package/dist/selection.cjs.map +1 -0
  323. package/dist/selection.d.cts +16 -0
  324. package/dist/selection.d.ts +16 -0
  325. package/dist/selection.js +15 -0
  326. package/dist/selection.js.map +1 -0
  327. package/dist/shell.cjs +72 -0
  328. package/dist/shell.cjs.map +1 -0
  329. package/dist/shell.d.cts +56 -0
  330. package/dist/shell.d.ts +56 -0
  331. package/dist/shell.js +67 -0
  332. package/dist/shell.js.map +1 -0
  333. package/dist/signature/composables.d.cts +39 -0
  334. package/dist/signature/composables.d.ts +39 -0
  335. package/dist/signature.cjs +16 -0
  336. package/dist/signature.cjs.map +1 -0
  337. package/dist/signature.d.cts +15 -0
  338. package/dist/signature.d.ts +15 -0
  339. package/dist/signature.js +10 -0
  340. package/dist/signature.js.map +1 -0
  341. package/dist/stage/PageSurface.vue.d.cts +29 -0
  342. package/dist/stage/PageSurface.vue.d.ts +29 -0
  343. package/dist/stage/Scrollbar.vue.d.cts +32 -0
  344. package/dist/stage/Scrollbar.vue.d.ts +32 -0
  345. package/dist/stage/Stage.vue.d.cts +44 -0
  346. package/dist/stage/Stage.vue.d.ts +44 -0
  347. package/dist/stage/StageScope.vue.d.cts +17 -0
  348. package/dist/stage/StageScope.vue.d.ts +17 -0
  349. package/dist/stage/composables.d.cts +41 -0
  350. package/dist/stage/composables.d.ts +41 -0
  351. package/dist/stage/scope.d.cts +12 -0
  352. package/dist/stage/scope.d.ts +12 -0
  353. package/dist/stage.cjs +21 -0
  354. package/dist/stage.cjs.map +1 -0
  355. package/dist/stage.d.cts +17 -0
  356. package/dist/stage.d.ts +17 -0
  357. package/dist/stage.js +15 -0
  358. package/dist/stage.js.map +1 -0
  359. package/dist/stamp.cjs +68 -0
  360. package/dist/stamp.cjs.map +1 -0
  361. package/dist/stamp.d.cts +61 -0
  362. package/dist/stamp.d.ts +61 -0
  363. package/dist/stamp.js +61 -0
  364. package/dist/stamp.js.map +1 -0
  365. package/dist/state-DZg8q3v6.js +52 -0
  366. package/dist/state-DZg8q3v6.js.map +1 -0
  367. package/dist/state-M22NDJQo.cjs +51 -0
  368. package/dist/state-M22NDJQo.cjs.map +1 -0
  369. package/dist/state.d.cts +32 -0
  370. package/dist/state.d.ts +32 -0
  371. package/dist/strip-BSDB39Xh.cjs +743 -0
  372. package/dist/strip-BSDB39Xh.cjs.map +1 -0
  373. package/dist/strip-C3wLonKB.js +744 -0
  374. package/dist/strip-C3wLonKB.js.map +1 -0
  375. package/dist/surface-box-B9oa4YoG.js +12 -0
  376. package/dist/surface-box-B9oa4YoG.js.map +1 -0
  377. package/dist/surface-box-C7EvUOXp.cjs +11 -0
  378. package/dist/surface-box-C7EvUOXp.cjs.map +1 -0
  379. package/dist/theme.d.cts +13 -0
  380. package/dist/theme.d.ts +13 -0
  381. package/dist/toolbar/DefaultCollapsed.vue.d.cts +9 -0
  382. package/dist/toolbar/DefaultCollapsed.vue.d.ts +9 -0
  383. package/dist/toolbar/DefaultCommand.vue.d.cts +8 -0
  384. package/dist/toolbar/DefaultCommand.vue.d.ts +8 -0
  385. package/dist/toolbar/DefaultGroupTrigger.vue.d.cts +9 -0
  386. package/dist/toolbar/DefaultGroupTrigger.vue.d.ts +9 -0
  387. package/dist/toolbar/DefaultOverflowMenu.vue.d.cts +9 -0
  388. package/dist/toolbar/DefaultOverflowMenu.vue.d.ts +9 -0
  389. package/dist/toolbar/DefaultOverflowTrigger.vue.d.cts +10 -0
  390. package/dist/toolbar/DefaultOverflowTrigger.vue.d.ts +10 -0
  391. package/dist/toolbar/Measured.vue.d.cts +21 -0
  392. package/dist/toolbar/Measured.vue.d.ts +21 -0
  393. package/dist/toolbar/NativeSlotSocket.vue.d.cts +22 -0
  394. package/dist/toolbar/NativeSlotSocket.vue.d.ts +22 -0
  395. package/dist/toolbar/Toolbar.vue.d.cts +82 -0
  396. package/dist/toolbar/Toolbar.vue.d.ts +82 -0
  397. package/dist/toolbar/ToolbarPart.vue.d.cts +42 -0
  398. package/dist/toolbar/ToolbarPart.vue.d.ts +42 -0
  399. package/dist/toolbar/paint.d.cts +3 -0
  400. package/dist/toolbar/paint.d.ts +3 -0
  401. package/dist/toolbar/strip.d.cts +14 -0
  402. package/dist/toolbar/strip.d.ts +14 -0
  403. package/dist/toolbar/views.d.cts +15 -0
  404. package/dist/toolbar/views.d.ts +15 -0
  405. package/dist/toolbar.cjs +27 -0
  406. package/dist/toolbar.cjs.map +1 -0
  407. package/dist/toolbar.d.cts +14 -0
  408. package/dist/toolbar.d.ts +14 -0
  409. package/dist/toolbar.js +12 -0
  410. package/dist/toolbar.js.map +1 -0
  411. package/dist/view-manager.cjs +22 -0
  412. package/dist/view-manager.cjs.map +1 -0
  413. package/dist/view-manager.d.cts +24 -0
  414. package/dist/view-manager.d.ts +24 -0
  415. package/dist/view-manager.js +17 -0
  416. package/dist/view-manager.js.map +1 -0
  417. package/package.json +179 -3
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const pluginRender = require("@embedpdf/plugin-render");
4
+ const capabilities = require("./capabilities-DVNJmgy7.cjs");
5
+ const state = require("./state-M22NDJQo.cjs");
6
+ const vue = require("vue");
7
+ const host = require("@embedpdf/plugin-render/contract/host");
8
+ const web = require("@embedpdf/web");
9
+ const dev = require("./dev-eeIS2B4c.cjs");
10
+ const pageLayers = require("./page-layers-c-CJYAUO.cjs");
11
+ const page = require("./page-Doy4_Sdz.cjs");
12
+ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
13
+ __name: "TileImage",
14
+ props: {
15
+ source: {},
16
+ view: {},
17
+ page: {},
18
+ viewScale: {}
19
+ },
20
+ setup(__props) {
21
+ const props = __props;
22
+ const image = vue.ref(null);
23
+ vue.watch(
24
+ [image, () => props.source.handle],
25
+ ([element, handle], _previous, onCleanup) => {
26
+ if (!element) return;
27
+ const { view, page: page2, source } = props;
28
+ onCleanup(
29
+ web.bindPaintedImage(element, handle, {
30
+ onPainted: () => view.markPainted(page2, source.key),
31
+ onUnpainted: () => view.markUnpainted(page2, source.key)
32
+ })
33
+ );
34
+ },
35
+ { immediate: true, flush: "post" }
36
+ );
37
+ function checkSize(event) {
38
+ const naturalWidth = event.currentTarget.naturalWidth;
39
+ if (naturalWidth <= 0) return;
40
+ const expected = Math.round(props.source.rect.width * props.source.scale);
41
+ if (Math.abs(naturalWidth - expected) > 1) {
42
+ dev.devWarn(
43
+ "tile-size",
44
+ `tile bitmap ${naturalWidth}px wide does not match its rect (expected ~${expected}px) — stale raster identity? key=${props.source.key}`
45
+ );
46
+ }
47
+ }
48
+ const style = vue.computed(() => {
49
+ const { rect, z } = props.source;
50
+ const scale = props.viewScale;
51
+ return {
52
+ position: "absolute",
53
+ left: `${rect.x * scale}px`,
54
+ top: `${rect.y * scale}px`,
55
+ width: `${rect.width * scale}px`,
56
+ height: `${rect.height * scale}px`,
57
+ zIndex: z
58
+ };
59
+ });
60
+ return (_ctx, _cache) => {
61
+ return vue.openBlock(), vue.createElementBlock("img", {
62
+ ref_key: "image",
63
+ ref: image,
64
+ alt: "",
65
+ draggable: "false",
66
+ style: vue.normalizeStyle(style.value),
67
+ onLoad: checkSize
68
+ }, null, 36);
69
+ };
70
+ }
71
+ });
72
+ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
73
+ __name: "TilePlane",
74
+ props: {
75
+ layers: {}
76
+ },
77
+ setup(__props) {
78
+ const props = __props;
79
+ const page$1 = page.usePage();
80
+ const render = capabilities.useOptionalCapability(host.RenderToken);
81
+ const view = vue.shallowRef(null);
82
+ const pageRef = vue.computed(() => page$1.value.ref);
83
+ const viewId = vue.computed(() => page$1.value.view);
84
+ vue.watch(
85
+ [view, pageRef],
86
+ ([handle, ref], _previous, onCleanup) => {
87
+ if (handle) onCleanup(() => handle.release(ref));
88
+ },
89
+ { immediate: true }
90
+ );
91
+ vue.watch(
92
+ [render, viewId],
93
+ ([lens, id], _previous, onCleanup) => {
94
+ if (!lens) {
95
+ view.value = null;
96
+ return;
97
+ }
98
+ const handle = lens.createViewDemand(id);
99
+ view.value = handle;
100
+ onCleanup(() => handle.dispose());
101
+ },
102
+ { immediate: true }
103
+ );
104
+ const demand = capabilities.useKernelValue(
105
+ () => {
106
+ var _a, _b;
107
+ return ((_b = (_a = page$1.value).getViewDemand) == null ? void 0 : _b.call(_a)) ?? { desiredDeviceWidth: page$1.value.transform.deviceWidth };
108
+ },
109
+ host.samePageViewDemand
110
+ );
111
+ vue.watch(
112
+ [view, demand, pageRef, () => props.layers],
113
+ ([handle, wanted, ref, layers]) => {
114
+ handle == null ? void 0 : handle.setDemand(ref, wanted, layers);
115
+ },
116
+ { immediate: true }
117
+ );
118
+ const plan = capabilities.useKernelValue(() => {
119
+ var _a;
120
+ return ((_a = view.value) == null ? void 0 : _a.getPlan(pageRef.value)) ?? null;
121
+ });
122
+ const planeStyle = vue.computed(
123
+ () => ({
124
+ position: "absolute",
125
+ left: 0,
126
+ top: 0,
127
+ width: `${page$1.value.transform.contentWidth}px`,
128
+ height: `${page$1.value.transform.contentHeight}px`,
129
+ pointerEvents: "none",
130
+ // Tiles carry z ranks (coarse under fine) while generations mix, mid-zoom.
131
+ // A stacking context of its own keeps those ranks inside the plane, below
132
+ // annotations, page chrome and menus.
133
+ isolation: "isolate"
134
+ })
135
+ );
136
+ return (_ctx, _cache) => {
137
+ return view.value && vue.unref(plan) && vue.unref(plan).paint.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", {
138
+ key: 0,
139
+ style: vue.normalizeStyle(planeStyle.value)
140
+ }, [
141
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(plan).paint, (source) => {
142
+ return vue.openBlock(), vue.createBlock(_sfc_main$2, {
143
+ key: source.key,
144
+ source,
145
+ view: view.value,
146
+ page: vue.unref(page$1).ref,
147
+ "view-scale": vue.unref(page$1).transform.viewScale
148
+ }, null, 8, ["source", "view", "page", "view-scale"]);
149
+ }), 128))
150
+ ], 4)) : vue.createCommentVNode("", true);
151
+ };
152
+ }
153
+ });
154
+ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
155
+ __name: "RenderLayer",
156
+ props: {
157
+ annotations: { type: Boolean, default: void 0 },
158
+ formFields: { type: Boolean, default: void 0 },
159
+ tiles: { type: Boolean, default: true }
160
+ },
161
+ setup(__props) {
162
+ const props = __props;
163
+ const page$1 = page.usePage();
164
+ const render = capabilities.useOptionalCapability(host.RenderToken);
165
+ const NO_PAINT = { tiles: false };
166
+ const settings = capabilities.useOptionalSelector(host.RenderToken, (lens) => lens.getPaintSettings(), NO_PAINT);
167
+ const pageRef = vue.computed(() => page$1.value.ref);
168
+ const parts = vue.computed(() => ({ annotations: props.annotations, formFields: props.formFields }));
169
+ const painted = pageLayers.usePaintedParts(pageRef);
170
+ const may = capabilities.useOptionalSelector(host.RenderToken, (lens) => lens.getLayerRights(), null);
171
+ const layers = vue.computed(
172
+ () => painted.value && may.value ? web.pictureLayerOptionsOf(painted.value, parts.value, may.value) : null
173
+ );
174
+ vue.watch([painted, parts], ([current, asked]) => {
175
+ if (current && web.partsDrawnTwice(current, asked).length > 0) {
176
+ dev.devWarn(
177
+ "render-layer-draws-what-a-layer-paints",
178
+ "<RenderLayer :annotations> or <RenderLayer :form-fields> draws what an <AnnotationLayer> or a <FormLayer> on the page paints too, so it shows twice. Leave the prop out: the picture leaves out what a layer paints."
179
+ );
180
+ }
181
+ });
182
+ const sourceKey = capabilities.useOptionalSelector(
183
+ host.RenderToken,
184
+ (lens) => layers.value ? lens.getSourceKey(page$1.value.ref, {
185
+ scale: page$1.value.transform.renderScale,
186
+ ...layers.value
187
+ }) : null,
188
+ null
189
+ );
190
+ const image = vue.ref(null);
191
+ vue.watch(
192
+ [render, pageRef, sourceKey, layers],
193
+ ([lens, shown, _key, drawn], _previous, onCleanup) => {
194
+ if (!lens || !drawn) return;
195
+ const controller = new AbortController();
196
+ let revoke;
197
+ onCleanup(() => {
198
+ controller.abort();
199
+ revoke == null ? void 0 : revoke();
200
+ });
201
+ void (async () => {
202
+ try {
203
+ const picture = await lens.renderSource(shown, {
204
+ scale: page$1.value.transform.renderScale,
205
+ ...drawn,
206
+ view: page$1.value.view,
207
+ signal: controller.signal
208
+ });
209
+ const object = await picture.objectUrl().abortWith(controller.signal);
210
+ if (controller.signal.aborted) {
211
+ object.revoke();
212
+ return;
213
+ }
214
+ revoke = object.revoke;
215
+ if (image.value) image.value.src = object.url;
216
+ } catch {
217
+ }
218
+ })();
219
+ },
220
+ { immediate: true, flush: "post" }
221
+ );
222
+ return (_ctx, _cache) => {
223
+ return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
224
+ vue.createElementVNode("img", {
225
+ ref_key: "image",
226
+ ref: image,
227
+ alt: "",
228
+ draggable: "false",
229
+ style: {
230
+ position: "absolute",
231
+ inset: 0,
232
+ width: "100%",
233
+ height: "100%",
234
+ pointerEvents: "none"
235
+ }
236
+ }, null, 512),
237
+ __props.tiles && vue.unref(settings).tiles && layers.value ? (vue.openBlock(), vue.createBlock(_sfc_main$1, {
238
+ key: 0,
239
+ layers: layers.value
240
+ }, null, 8, ["layers"])) : vue.createCommentVNode("", true)
241
+ ], 64);
242
+ };
243
+ }
244
+ });
245
+ function useRender() {
246
+ return capabilities.useCapability(pluginRender.RenderToken);
247
+ }
248
+ const useRenderSettings = state.settingsComposable(pluginRender.RenderToken);
249
+ function useRenderEvent(select, handler) {
250
+ capabilities.useCapabilityEvent(pluginRender.RenderToken, select, handler);
251
+ }
252
+ exports.RenderLayer = _sfc_main;
253
+ exports.useRender = useRender;
254
+ exports.useRenderEvent = useRenderEvent;
255
+ exports.useRenderSettings = useRenderSettings;
256
+ Object.keys(pluginRender).forEach((k) => {
257
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
258
+ enumerable: true,
259
+ get: () => pluginRender[k]
260
+ });
261
+ });
262
+ //# sourceMappingURL=render.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.cjs","sources":["../src/render/TileImage.vue","../src/render/TilePlane.vue","../src/render/RenderLayer.vue","../src/render.ts"],"sourcesContent":["<!--\n One tile: its place in view space, and the shared browser image binding,\n which hides the image until it is complete, reports painted after its first\n chance to be shown, and reports the inverse when it leaves.\n-->\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport type { CSSProperties } from 'vue';\nimport type { PageRef } from '@embedpdf/core';\nimport type { TilePaintSource, ViewDemand } from '@embedpdf/plugin-render/contract/host';\nimport { bindPaintedImage } from '@embedpdf/web';\nimport { devWarn } from '../dev';\n\nconst props = defineProps<{\n source: TilePaintSource;\n /** The view's tile surface, told when this tile is painted and when it leaves. */\n view: ViewDemand;\n page: PageRef;\n /** View px per page point. */\n viewScale: number;\n}>();\n\nconst image = ref<HTMLImageElement | null>(null);\n\n// The handle is the bitmap's identity; the reports go to the view that planned it.\nwatch(\n [image, () => props.source.handle],\n ([element, handle], _previous, onCleanup) => {\n if (!element) return;\n const { view, page, source } = props;\n onCleanup(\n bindPaintedImage(element, handle, {\n onPainted: () => view.markPainted(page, source.key),\n onUnpainted: () => view.markUnpainted(page, source.key),\n }),\n );\n },\n { immediate: true, flush: 'post' },\n);\n\n/** A raster whose size disagrees with its rect would be stretched into place: a stale picture. */\nfunction checkSize(event: Event) {\n const naturalWidth = (event.currentTarget as HTMLImageElement).naturalWidth;\n if (naturalWidth <= 0) return;\n const expected = Math.round(props.source.rect.width * props.source.scale);\n if (Math.abs(naturalWidth - expected) > 1) {\n devWarn(\n 'tile-size',\n `tile bitmap ${naturalWidth}px wide does not match its rect ` +\n `(expected ~${expected}px) — stale raster identity? key=${props.source.key}`,\n );\n }\n}\n\nconst style = computed((): CSSProperties => {\n const { rect, z } = props.source;\n const scale = props.viewScale;\n return {\n position: 'absolute',\n left: `${rect.x * scale}px`,\n top: `${rect.y * scale}px`,\n width: `${rect.width * scale}px`,\n height: `${rect.height * scale}px`,\n zIndex: z,\n };\n});\n</script>\n\n<template>\n <img ref=\"image\" alt=\"\" draggable=\"false\" :style=\"style\" @load=\"checkSize\" />\n</template>\n","<!--\n The sharp plane above the base picture: the plugin's tile plan for this view,\n as keyed <img>s. Each tile reports painted after its first chance to be shown\n (and the inverse when it leaves), so coarser tiles are released only once\n their replacement can really be composited.\n\n Tiles are placed in view (CSS px) space, never in page points under a scaled\n container: browsers round layout lengths to 1/64 CSS px before transforms\n apply, so a point-space rect under a ×25 zoom would be off by 0.4px or more\n per tile, showing seams. In view space the rounding stays 1/64 px at every zoom.\n-->\n<script setup lang=\"ts\">\nimport { computed, shallowRef, watch } from 'vue';\nimport type { CSSProperties } from 'vue';\nimport { RenderToken, samePageViewDemand } from '@embedpdf/plugin-render/contract/host';\nimport type { PageLayerOptions, ViewDemand } from '@embedpdf/plugin-render/contract/host';\nimport { useOptionalCapability } from '../runtime/capabilities';\nimport { useKernelValue } from '../runtime/kernel';\nimport { usePage } from '../runtime/page';\nimport TileImage from './TileImage.vue';\n\nconst props = defineProps<{ layers: PageLayerOptions }>();\n\nconst page = usePage();\nconst render = useOptionalCapability(RenderToken);\n\n// This view's tile surface: planned per view and page, so a thumbnail rail's\n// demand can't disturb the main view's tiles. The handle is shared per view\n// and counted: one `dispose` for every `createViewDemand`.\nconst view = shallowRef<ViewDemand | null>(null);\n\n// Which page and which view this plane plans for. The page context is a new\n// value on every zoom; these change only when the page or the view does, so\n// the handle and the page's claim on it follow ownership, never the camera.\nconst pageRef = computed(() => page.value.ref);\nconst viewId = computed(() => page.value.view);\n\n// Declared before the handle's own watcher, so on unmount the page is released\n// before the handle is disposed. Releasing stops in-flight fetches; resolved\n// pictures stay cached.\nwatch(\n [view, pageRef],\n ([handle, ref], _previous, onCleanup) => {\n if (handle) onCleanup(() => handle.release(ref));\n },\n { immediate: true },\n);\nwatch(\n [render, viewId],\n ([lens, id], _previous, onCleanup) => {\n if (!lens) {\n view.value = null;\n return;\n }\n const handle = lens.createViewDemand(id);\n view.value = handle;\n onCleanup(() => handle.dispose());\n },\n { immediate: true },\n);\n\n// The demand: the host's live view (a Stage page's visible part) or the whole\n// page. Read on every kernel change, so a pan re-plans; level settling is the\n// plugin's.\nconst demand = useKernelValue(\n () => page.value.getViewDemand?.() ?? { desiredDeviceWidth: page.value.transform.deviceWidth },\n samePageViewDemand,\n);\n\n// Demand in, plan out: setting the demand is the one call that fetches and\n// re-plans; reading the plan is pure. Before the render, so a camera move\n// re-plans in the same update.\nwatch(\n [view, demand, pageRef, () => props.layers],\n ([handle, wanted, ref, layers]) => {\n handle?.setDemand(ref, wanted, layers);\n },\n { immediate: true },\n);\nconst plan = useKernelValue(() => view.value?.getPlan(pageRef.value) ?? null);\n\nconst planeStyle = computed(\n (): CSSProperties => ({\n position: 'absolute',\n left: 0,\n top: 0,\n width: `${page.value.transform.contentWidth}px`,\n height: `${page.value.transform.contentHeight}px`,\n pointerEvents: 'none',\n // Tiles carry z ranks (coarse under fine) while generations mix, mid-zoom.\n // A stacking context of its own keeps those ranks inside the plane, below\n // annotations, page chrome and menus.\n isolation: 'isolate',\n }),\n);\n</script>\n\n<template>\n <div v-if=\"view && plan && plan.paint.length > 0\" :style=\"planeStyle\">\n <TileImage\n v-for=\"source in plan.paint\"\n :key=\"source.key\"\n :source=\"source\"\n :view=\"view\"\n :page=\"page.ref\"\n :view-scale=\"page.transform.viewScale\"\n />\n </div>\n</template>\n","<!--\n <RenderLayer>: the page's picture, in two planes. The base plane is a\n whole-page <img> at the plugin's resolved size, always there, the instant\n backdrop. The tile plane above it paints the plugin's tile plan when the view\n wants more pixels than the base may spend; a thumbnail-sized view engages\n none. The layer only paints: every decision (sizes, tiles, caching, release)\n is the render plugin's, and anything mid-gesture scales with CSS until the\n plugin hands down new pixels.\n-->\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { RenderToken } from '@embedpdf/plugin-render/contract/host';\nimport type { PaintSettings } from '@embedpdf/plugin-render/contract/host';\nimport { partsDrawnTwice, pictureLayerOptionsOf } from '@embedpdf/web';\nimport { devWarn } from '../dev';\nimport { usePaintedParts } from '../page-layers';\nimport { useOptionalCapability, useOptionalSelector } from '../runtime/capabilities';\nimport { usePage } from '../runtime/page';\nimport TilePlane from './TilePlane.vue';\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Draw the annotations into the page's picture (`true`) or leave them out\n * (`false`). Left unset, the picture leaves them to an `<AnnotationLayer>`\n * on the page, and otherwise draws them when the user may read them.\n */\n annotations?: boolean;\n /** The same for the form fields, which a `<FormLayer>` paints. */\n formFields?: boolean;\n /**\n * Mount the tile plane. Whether it spends anything is the plugin's\n * arithmetic: leave it on, and pass `false` only for a view that must never\n * tile, even at deep zoom.\n */\n tiles?: boolean;\n }>(),\n // Unset stays unset: a boolean prop would otherwise read `false`.\n { annotations: undefined, formFields: undefined, tiles: true },\n);\n\nconst page = usePage();\n// The layer is a host of the render plugin: it paints conformed sources. The\n// host lens is the same runtime token, typed wider.\nconst render = useOptionalCapability(RenderToken);\nconst NO_PAINT: PaintSettings = { tiles: false };\n// The same object until a setting it reads changes.\nconst settings = useOptionalSelector(RenderToken, (lens) => lens.getPaintSettings(), NO_PAINT);\n\nconst pageRef = computed(() => page.value.ref);\nconst parts = computed(() => ({ annotations: props.annotations, formFields: props.formFields }));\nconst painted = usePaintedParts(pageRef);\nconst may = useOptionalSelector(RenderToken, (lens) => lens.getLayerRights(), null);\n/** The parts the picture draws; `null` until the page's layers have said what they paint. */\nconst layers = computed(() =>\n painted.value && may.value ? pictureLayerOptionsOf(painted.value, parts.value, may.value) : null,\n);\nwatch([painted, parts], ([current, asked]) => {\n if (current && partsDrawnTwice(current, asked).length > 0) {\n devWarn(\n 'render-layer-draws-what-a-layer-paints',\n '<RenderLayer :annotations> or <RenderLayer :form-fields> draws what an <AnnotationLayer> ' +\n 'or a <FormLayer> on the page paints too, so it shows twice. Leave the prop out: the ' +\n 'picture leaves out what a layer paints.',\n );\n }\n});\n\n// The raster's identity: its conformed width, the parts it draws and the\n// page's epoch. Above the budget it stays put while zooming, so the deep-zoom\n// backdrop never fetches again.\nconst sourceKey = useOptionalSelector(\n RenderToken,\n (lens) =>\n layers.value\n ? lens.getSourceKey(page.value.ref, {\n scale: page.value.transform.renderScale,\n ...layers.value,\n })\n : null,\n null,\n);\n\nconst image = ref<HTMLImageElement | null>(null);\nwatch(\n [render, pageRef, sourceKey, layers],\n ([lens, shown, _key, drawn], _previous, onCleanup) => {\n if (!lens || !drawn) return;\n const controller = new AbortController();\n let revoke: (() => void) | undefined;\n onCleanup(() => {\n controller.abort();\n revoke?.();\n });\n void (async () => {\n try {\n // The plugin conforms this to its resolved size and collapses asks for\n // the same key, so any scale that maps to this key asks for this key.\n const picture = await lens.renderSource(shown, {\n scale: page.value.transform.renderScale,\n ...drawn,\n view: page.value.view,\n signal: controller.signal,\n });\n const object = await picture.objectUrl().abortWith(controller.signal);\n if (controller.signal.aborted) {\n object.revoke();\n return;\n }\n revoke = object.revoke;\n // Set on a lasting element: the browser keeps the old picture until the\n // new one decodes, and never asks for the old URL again, so revoking it\n // on cleanup is safe.\n if (image.value) image.value.src = object.url;\n } catch {\n // Aborted (the view moved, or the layer unmounted), or the render failed.\n }\n })();\n },\n { immediate: true, flush: 'post' },\n);\n</script>\n\n<template>\n <img\n ref=\"image\"\n alt=\"\"\n draggable=\"false\"\n :style=\"{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }\"\n />\n <TilePlane v-if=\"tiles && settings.tiles && layers\" :layers=\"layers\" />\n</template>\n","/**\n * @embedpdf/vue/render: the Vue view of `@embedpdf/plugin-render`.\n * `<RenderLayer>` draws a page; `useRender()` renders pages yourself, for\n * previews and exports; `useRenderSettings()` and `useRenderEvent()` read and\n * follow the plugin.\n */\n\n// One line per feature: registration travels with the UI.\nexport * from '@embedpdf/plugin-render';\nimport { RenderToken } from '@embedpdf/plugin-render';\nimport type { RenderCapability } from '@embedpdf/plugin-render';\nimport type { EventHook } from '@embedpdf/core';\nimport { useCapability, useCapabilityEvent } from './runtime/capabilities';\nimport { settingsComposable } from './state';\n\nexport { default as RenderLayer } from './render/RenderLayer.vue';\n\n/** The render API (renderPage, renderThumbnail, invalidation, settings) for app code. The object never changes. */\nexport function useRender(): RenderCapability {\n return useCapability(RenderToken);\n}\n\n/** The render settings (`fullPage`, `tiles`, `format`, …), with or without a document, as refs. Takes a selector. */\nexport const useRenderSettings = settingsComposable(RenderToken);\n\n/** Subscribe to one render event while the component lives: `useRenderEvent((render) => render.onInvalidated, handler)`. */\nexport function useRenderEvent<Event>(\n select: (render: RenderCapability) => EventHook<Event>,\n handler: (event: Event) => void,\n): void {\n useCapabilityEvent(RenderToken, select, handler);\n}\n"],"names":["ref","watch","page","bindPaintedImage","devWarn","computed","_createElementBlock","usePage","useOptionalCapability","RenderToken","shallowRef","useKernelValue","samePageViewDemand","_unref","_openBlock","_Fragment","_renderList","_createBlock","TileImage","useOptionalSelector","usePaintedParts","pictureLayerOptionsOf","partsDrawnTwice","_createElementVNode","TilePlane","useCapability","settingsComposable","useCapabilityEvent"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @embedpdf/vue/render: the Vue view of `@embedpdf/plugin-render`.
3
+ * `<RenderLayer>` draws a page; `useRender()` renders pages yourself, for
4
+ * previews and exports; `useRenderSettings()` and `useRenderEvent()` read and
5
+ * follow the plugin.
6
+ */
7
+ export * from '@embedpdf/plugin-render';
8
+ import type { RenderCapability } from '@embedpdf/plugin-render';
9
+ import type { EventHook } from '@embedpdf/core';
10
+ export { default as RenderLayer } from './render/RenderLayer.vue.cjs';
11
+ /** The render API (renderPage, renderThumbnail, invalidation, settings) for app code. The object never changes. */
12
+ export declare function useRender(): RenderCapability;
13
+ /** The render settings (`fullPage`, `tiles`, `format`, …), with or without a document, as refs. Takes a selector. */
14
+ export declare const useRenderSettings: import("./state.cjs").SettingsComposable<import("@embedpdf/plugin-render").RenderSettings & object>;
15
+ /** Subscribe to one render event while the component lives: `useRenderEvent((render) => render.onInvalidated, handler)`. */
16
+ export declare function useRenderEvent<Event>(select: (render: RenderCapability) => EventHook<Event>, handler: (event: Event) => void): void;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @embedpdf/vue/render: the Vue view of `@embedpdf/plugin-render`.
3
+ * `<RenderLayer>` draws a page; `useRender()` renders pages yourself, for
4
+ * previews and exports; `useRenderSettings()` and `useRenderEvent()` read and
5
+ * follow the plugin.
6
+ */
7
+ export * from '@embedpdf/plugin-render';
8
+ import type { RenderCapability } from '@embedpdf/plugin-render';
9
+ import type { EventHook } from '@embedpdf/core';
10
+ export { default as RenderLayer } from './render/RenderLayer.vue.js';
11
+ /** The render API (renderPage, renderThumbnail, invalidation, settings) for app code. The object never changes. */
12
+ export declare function useRender(): RenderCapability;
13
+ /** The render settings (`fullPage`, `tiles`, `format`, …), with or without a document, as refs. Takes a selector. */
14
+ export declare const useRenderSettings: import("./state.js").SettingsComposable<import("@embedpdf/plugin-render").RenderSettings & object>;
15
+ /** Subscribe to one render event while the component lives: `useRenderEvent((render) => render.onInvalidated, handler)`. */
16
+ export declare function useRenderEvent<Event>(select: (render: RenderCapability) => EventHook<Event>, handler: (event: Event) => void): void;
package/dist/render.js ADDED
@@ -0,0 +1,257 @@
1
+ import { RenderToken as RenderToken$1 } from "@embedpdf/plugin-render";
2
+ export * from "@embedpdf/plugin-render";
3
+ import { h as useOptionalCapability, g as useKernelValue, i as useOptionalSelector, a as useCapability, b as useCapabilityEvent } from "./capabilities-C7YzgPCX.js";
4
+ import { s as settingsComposable } from "./state-DZg8q3v6.js";
5
+ import { defineComponent, ref, watch, computed, openBlock, createElementBlock, normalizeStyle, shallowRef, unref, Fragment, renderList, createBlock, createCommentVNode, createElementVNode } from "vue";
6
+ import { samePageViewDemand, RenderToken } from "@embedpdf/plugin-render/contract/host";
7
+ import { bindPaintedImage, pictureLayerOptionsOf, partsDrawnTwice } from "@embedpdf/web";
8
+ import { d as devWarn } from "./dev-CtMlvxjZ.js";
9
+ import { u as usePaintedParts } from "./page-layers-rlh4-1qr.js";
10
+ import { u as usePage } from "./page-D9XIuLSj.js";
11
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
12
+ __name: "TileImage",
13
+ props: {
14
+ source: {},
15
+ view: {},
16
+ page: {},
17
+ viewScale: {}
18
+ },
19
+ setup(__props) {
20
+ const props = __props;
21
+ const image = ref(null);
22
+ watch(
23
+ [image, () => props.source.handle],
24
+ ([element, handle], _previous, onCleanup) => {
25
+ if (!element) return;
26
+ const { view, page, source } = props;
27
+ onCleanup(
28
+ bindPaintedImage(element, handle, {
29
+ onPainted: () => view.markPainted(page, source.key),
30
+ onUnpainted: () => view.markUnpainted(page, source.key)
31
+ })
32
+ );
33
+ },
34
+ { immediate: true, flush: "post" }
35
+ );
36
+ function checkSize(event) {
37
+ const naturalWidth = event.currentTarget.naturalWidth;
38
+ if (naturalWidth <= 0) return;
39
+ const expected = Math.round(props.source.rect.width * props.source.scale);
40
+ if (Math.abs(naturalWidth - expected) > 1) {
41
+ devWarn(
42
+ "tile-size",
43
+ `tile bitmap ${naturalWidth}px wide does not match its rect (expected ~${expected}px) — stale raster identity? key=${props.source.key}`
44
+ );
45
+ }
46
+ }
47
+ const style = computed(() => {
48
+ const { rect, z } = props.source;
49
+ const scale = props.viewScale;
50
+ return {
51
+ position: "absolute",
52
+ left: `${rect.x * scale}px`,
53
+ top: `${rect.y * scale}px`,
54
+ width: `${rect.width * scale}px`,
55
+ height: `${rect.height * scale}px`,
56
+ zIndex: z
57
+ };
58
+ });
59
+ return (_ctx, _cache) => {
60
+ return openBlock(), createElementBlock("img", {
61
+ ref_key: "image",
62
+ ref: image,
63
+ alt: "",
64
+ draggable: "false",
65
+ style: normalizeStyle(style.value),
66
+ onLoad: checkSize
67
+ }, null, 36);
68
+ };
69
+ }
70
+ });
71
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
72
+ __name: "TilePlane",
73
+ props: {
74
+ layers: {}
75
+ },
76
+ setup(__props) {
77
+ const props = __props;
78
+ const page = usePage();
79
+ const render = useOptionalCapability(RenderToken);
80
+ const view = shallowRef(null);
81
+ const pageRef = computed(() => page.value.ref);
82
+ const viewId = computed(() => page.value.view);
83
+ watch(
84
+ [view, pageRef],
85
+ ([handle, ref2], _previous, onCleanup) => {
86
+ if (handle) onCleanup(() => handle.release(ref2));
87
+ },
88
+ { immediate: true }
89
+ );
90
+ watch(
91
+ [render, viewId],
92
+ ([lens, id], _previous, onCleanup) => {
93
+ if (!lens) {
94
+ view.value = null;
95
+ return;
96
+ }
97
+ const handle = lens.createViewDemand(id);
98
+ view.value = handle;
99
+ onCleanup(() => handle.dispose());
100
+ },
101
+ { immediate: true }
102
+ );
103
+ const demand = useKernelValue(
104
+ () => {
105
+ var _a, _b;
106
+ return ((_b = (_a = page.value).getViewDemand) == null ? void 0 : _b.call(_a)) ?? { desiredDeviceWidth: page.value.transform.deviceWidth };
107
+ },
108
+ samePageViewDemand
109
+ );
110
+ watch(
111
+ [view, demand, pageRef, () => props.layers],
112
+ ([handle, wanted, ref2, layers]) => {
113
+ handle == null ? void 0 : handle.setDemand(ref2, wanted, layers);
114
+ },
115
+ { immediate: true }
116
+ );
117
+ const plan = useKernelValue(() => {
118
+ var _a;
119
+ return ((_a = view.value) == null ? void 0 : _a.getPlan(pageRef.value)) ?? null;
120
+ });
121
+ const planeStyle = computed(
122
+ () => ({
123
+ position: "absolute",
124
+ left: 0,
125
+ top: 0,
126
+ width: `${page.value.transform.contentWidth}px`,
127
+ height: `${page.value.transform.contentHeight}px`,
128
+ pointerEvents: "none",
129
+ // Tiles carry z ranks (coarse under fine) while generations mix, mid-zoom.
130
+ // A stacking context of its own keeps those ranks inside the plane, below
131
+ // annotations, page chrome and menus.
132
+ isolation: "isolate"
133
+ })
134
+ );
135
+ return (_ctx, _cache) => {
136
+ return view.value && unref(plan) && unref(plan).paint.length > 0 ? (openBlock(), createElementBlock("div", {
137
+ key: 0,
138
+ style: normalizeStyle(planeStyle.value)
139
+ }, [
140
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(plan).paint, (source) => {
141
+ return openBlock(), createBlock(_sfc_main$2, {
142
+ key: source.key,
143
+ source,
144
+ view: view.value,
145
+ page: unref(page).ref,
146
+ "view-scale": unref(page).transform.viewScale
147
+ }, null, 8, ["source", "view", "page", "view-scale"]);
148
+ }), 128))
149
+ ], 4)) : createCommentVNode("", true);
150
+ };
151
+ }
152
+ });
153
+ const _sfc_main = /* @__PURE__ */ defineComponent({
154
+ __name: "RenderLayer",
155
+ props: {
156
+ annotations: { type: Boolean, default: void 0 },
157
+ formFields: { type: Boolean, default: void 0 },
158
+ tiles: { type: Boolean, default: true }
159
+ },
160
+ setup(__props) {
161
+ const props = __props;
162
+ const page = usePage();
163
+ const render = useOptionalCapability(RenderToken);
164
+ const NO_PAINT = { tiles: false };
165
+ const settings = useOptionalSelector(RenderToken, (lens) => lens.getPaintSettings(), NO_PAINT);
166
+ const pageRef = computed(() => page.value.ref);
167
+ const parts = computed(() => ({ annotations: props.annotations, formFields: props.formFields }));
168
+ const painted = usePaintedParts(pageRef);
169
+ const may = useOptionalSelector(RenderToken, (lens) => lens.getLayerRights(), null);
170
+ const layers = computed(
171
+ () => painted.value && may.value ? pictureLayerOptionsOf(painted.value, parts.value, may.value) : null
172
+ );
173
+ watch([painted, parts], ([current, asked]) => {
174
+ if (current && partsDrawnTwice(current, asked).length > 0) {
175
+ devWarn(
176
+ "render-layer-draws-what-a-layer-paints",
177
+ "<RenderLayer :annotations> or <RenderLayer :form-fields> draws what an <AnnotationLayer> or a <FormLayer> on the page paints too, so it shows twice. Leave the prop out: the picture leaves out what a layer paints."
178
+ );
179
+ }
180
+ });
181
+ const sourceKey = useOptionalSelector(
182
+ RenderToken,
183
+ (lens) => layers.value ? lens.getSourceKey(page.value.ref, {
184
+ scale: page.value.transform.renderScale,
185
+ ...layers.value
186
+ }) : null,
187
+ null
188
+ );
189
+ const image = ref(null);
190
+ watch(
191
+ [render, pageRef, sourceKey, layers],
192
+ ([lens, shown, _key, drawn], _previous, onCleanup) => {
193
+ if (!lens || !drawn) return;
194
+ const controller = new AbortController();
195
+ let revoke;
196
+ onCleanup(() => {
197
+ controller.abort();
198
+ revoke == null ? void 0 : revoke();
199
+ });
200
+ void (async () => {
201
+ try {
202
+ const picture = await lens.renderSource(shown, {
203
+ scale: page.value.transform.renderScale,
204
+ ...drawn,
205
+ view: page.value.view,
206
+ signal: controller.signal
207
+ });
208
+ const object = await picture.objectUrl().abortWith(controller.signal);
209
+ if (controller.signal.aborted) {
210
+ object.revoke();
211
+ return;
212
+ }
213
+ revoke = object.revoke;
214
+ if (image.value) image.value.src = object.url;
215
+ } catch {
216
+ }
217
+ })();
218
+ },
219
+ { immediate: true, flush: "post" }
220
+ );
221
+ return (_ctx, _cache) => {
222
+ return openBlock(), createElementBlock(Fragment, null, [
223
+ createElementVNode("img", {
224
+ ref_key: "image",
225
+ ref: image,
226
+ alt: "",
227
+ draggable: "false",
228
+ style: {
229
+ position: "absolute",
230
+ inset: 0,
231
+ width: "100%",
232
+ height: "100%",
233
+ pointerEvents: "none"
234
+ }
235
+ }, null, 512),
236
+ __props.tiles && unref(settings).tiles && layers.value ? (openBlock(), createBlock(_sfc_main$1, {
237
+ key: 0,
238
+ layers: layers.value
239
+ }, null, 8, ["layers"])) : createCommentVNode("", true)
240
+ ], 64);
241
+ };
242
+ }
243
+ });
244
+ function useRender() {
245
+ return useCapability(RenderToken$1);
246
+ }
247
+ const useRenderSettings = settingsComposable(RenderToken$1);
248
+ function useRenderEvent(select, handler) {
249
+ useCapabilityEvent(RenderToken$1, select, handler);
250
+ }
251
+ export {
252
+ _sfc_main as RenderLayer,
253
+ useRender,
254
+ useRenderEvent,
255
+ useRenderSettings
256
+ };
257
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sources":["../src/render/TileImage.vue","../src/render/TilePlane.vue","../src/render/RenderLayer.vue","../src/render.ts"],"sourcesContent":["<!--\n One tile: its place in view space, and the shared browser image binding,\n which hides the image until it is complete, reports painted after its first\n chance to be shown, and reports the inverse when it leaves.\n-->\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport type { CSSProperties } from 'vue';\nimport type { PageRef } from '@embedpdf/core';\nimport type { TilePaintSource, ViewDemand } from '@embedpdf/plugin-render/contract/host';\nimport { bindPaintedImage } from '@embedpdf/web';\nimport { devWarn } from '../dev';\n\nconst props = defineProps<{\n source: TilePaintSource;\n /** The view's tile surface, told when this tile is painted and when it leaves. */\n view: ViewDemand;\n page: PageRef;\n /** View px per page point. */\n viewScale: number;\n}>();\n\nconst image = ref<HTMLImageElement | null>(null);\n\n// The handle is the bitmap's identity; the reports go to the view that planned it.\nwatch(\n [image, () => props.source.handle],\n ([element, handle], _previous, onCleanup) => {\n if (!element) return;\n const { view, page, source } = props;\n onCleanup(\n bindPaintedImage(element, handle, {\n onPainted: () => view.markPainted(page, source.key),\n onUnpainted: () => view.markUnpainted(page, source.key),\n }),\n );\n },\n { immediate: true, flush: 'post' },\n);\n\n/** A raster whose size disagrees with its rect would be stretched into place: a stale picture. */\nfunction checkSize(event: Event) {\n const naturalWidth = (event.currentTarget as HTMLImageElement).naturalWidth;\n if (naturalWidth <= 0) return;\n const expected = Math.round(props.source.rect.width * props.source.scale);\n if (Math.abs(naturalWidth - expected) > 1) {\n devWarn(\n 'tile-size',\n `tile bitmap ${naturalWidth}px wide does not match its rect ` +\n `(expected ~${expected}px) — stale raster identity? key=${props.source.key}`,\n );\n }\n}\n\nconst style = computed((): CSSProperties => {\n const { rect, z } = props.source;\n const scale = props.viewScale;\n return {\n position: 'absolute',\n left: `${rect.x * scale}px`,\n top: `${rect.y * scale}px`,\n width: `${rect.width * scale}px`,\n height: `${rect.height * scale}px`,\n zIndex: z,\n };\n});\n</script>\n\n<template>\n <img ref=\"image\" alt=\"\" draggable=\"false\" :style=\"style\" @load=\"checkSize\" />\n</template>\n","<!--\n The sharp plane above the base picture: the plugin's tile plan for this view,\n as keyed <img>s. Each tile reports painted after its first chance to be shown\n (and the inverse when it leaves), so coarser tiles are released only once\n their replacement can really be composited.\n\n Tiles are placed in view (CSS px) space, never in page points under a scaled\n container: browsers round layout lengths to 1/64 CSS px before transforms\n apply, so a point-space rect under a ×25 zoom would be off by 0.4px or more\n per tile, showing seams. In view space the rounding stays 1/64 px at every zoom.\n-->\n<script setup lang=\"ts\">\nimport { computed, shallowRef, watch } from 'vue';\nimport type { CSSProperties } from 'vue';\nimport { RenderToken, samePageViewDemand } from '@embedpdf/plugin-render/contract/host';\nimport type { PageLayerOptions, ViewDemand } from '@embedpdf/plugin-render/contract/host';\nimport { useOptionalCapability } from '../runtime/capabilities';\nimport { useKernelValue } from '../runtime/kernel';\nimport { usePage } from '../runtime/page';\nimport TileImage from './TileImage.vue';\n\nconst props = defineProps<{ layers: PageLayerOptions }>();\n\nconst page = usePage();\nconst render = useOptionalCapability(RenderToken);\n\n// This view's tile surface: planned per view and page, so a thumbnail rail's\n// demand can't disturb the main view's tiles. The handle is shared per view\n// and counted: one `dispose` for every `createViewDemand`.\nconst view = shallowRef<ViewDemand | null>(null);\n\n// Which page and which view this plane plans for. The page context is a new\n// value on every zoom; these change only when the page or the view does, so\n// the handle and the page's claim on it follow ownership, never the camera.\nconst pageRef = computed(() => page.value.ref);\nconst viewId = computed(() => page.value.view);\n\n// Declared before the handle's own watcher, so on unmount the page is released\n// before the handle is disposed. Releasing stops in-flight fetches; resolved\n// pictures stay cached.\nwatch(\n [view, pageRef],\n ([handle, ref], _previous, onCleanup) => {\n if (handle) onCleanup(() => handle.release(ref));\n },\n { immediate: true },\n);\nwatch(\n [render, viewId],\n ([lens, id], _previous, onCleanup) => {\n if (!lens) {\n view.value = null;\n return;\n }\n const handle = lens.createViewDemand(id);\n view.value = handle;\n onCleanup(() => handle.dispose());\n },\n { immediate: true },\n);\n\n// The demand: the host's live view (a Stage page's visible part) or the whole\n// page. Read on every kernel change, so a pan re-plans; level settling is the\n// plugin's.\nconst demand = useKernelValue(\n () => page.value.getViewDemand?.() ?? { desiredDeviceWidth: page.value.transform.deviceWidth },\n samePageViewDemand,\n);\n\n// Demand in, plan out: setting the demand is the one call that fetches and\n// re-plans; reading the plan is pure. Before the render, so a camera move\n// re-plans in the same update.\nwatch(\n [view, demand, pageRef, () => props.layers],\n ([handle, wanted, ref, layers]) => {\n handle?.setDemand(ref, wanted, layers);\n },\n { immediate: true },\n);\nconst plan = useKernelValue(() => view.value?.getPlan(pageRef.value) ?? null);\n\nconst planeStyle = computed(\n (): CSSProperties => ({\n position: 'absolute',\n left: 0,\n top: 0,\n width: `${page.value.transform.contentWidth}px`,\n height: `${page.value.transform.contentHeight}px`,\n pointerEvents: 'none',\n // Tiles carry z ranks (coarse under fine) while generations mix, mid-zoom.\n // A stacking context of its own keeps those ranks inside the plane, below\n // annotations, page chrome and menus.\n isolation: 'isolate',\n }),\n);\n</script>\n\n<template>\n <div v-if=\"view && plan && plan.paint.length > 0\" :style=\"planeStyle\">\n <TileImage\n v-for=\"source in plan.paint\"\n :key=\"source.key\"\n :source=\"source\"\n :view=\"view\"\n :page=\"page.ref\"\n :view-scale=\"page.transform.viewScale\"\n />\n </div>\n</template>\n","<!--\n <RenderLayer>: the page's picture, in two planes. The base plane is a\n whole-page <img> at the plugin's resolved size, always there, the instant\n backdrop. The tile plane above it paints the plugin's tile plan when the view\n wants more pixels than the base may spend; a thumbnail-sized view engages\n none. The layer only paints: every decision (sizes, tiles, caching, release)\n is the render plugin's, and anything mid-gesture scales with CSS until the\n plugin hands down new pixels.\n-->\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { RenderToken } from '@embedpdf/plugin-render/contract/host';\nimport type { PaintSettings } from '@embedpdf/plugin-render/contract/host';\nimport { partsDrawnTwice, pictureLayerOptionsOf } from '@embedpdf/web';\nimport { devWarn } from '../dev';\nimport { usePaintedParts } from '../page-layers';\nimport { useOptionalCapability, useOptionalSelector } from '../runtime/capabilities';\nimport { usePage } from '../runtime/page';\nimport TilePlane from './TilePlane.vue';\n\nconst props = withDefaults(\n defineProps<{\n /**\n * Draw the annotations into the page's picture (`true`) or leave them out\n * (`false`). Left unset, the picture leaves them to an `<AnnotationLayer>`\n * on the page, and otherwise draws them when the user may read them.\n */\n annotations?: boolean;\n /** The same for the form fields, which a `<FormLayer>` paints. */\n formFields?: boolean;\n /**\n * Mount the tile plane. Whether it spends anything is the plugin's\n * arithmetic: leave it on, and pass `false` only for a view that must never\n * tile, even at deep zoom.\n */\n tiles?: boolean;\n }>(),\n // Unset stays unset: a boolean prop would otherwise read `false`.\n { annotations: undefined, formFields: undefined, tiles: true },\n);\n\nconst page = usePage();\n// The layer is a host of the render plugin: it paints conformed sources. The\n// host lens is the same runtime token, typed wider.\nconst render = useOptionalCapability(RenderToken);\nconst NO_PAINT: PaintSettings = { tiles: false };\n// The same object until a setting it reads changes.\nconst settings = useOptionalSelector(RenderToken, (lens) => lens.getPaintSettings(), NO_PAINT);\n\nconst pageRef = computed(() => page.value.ref);\nconst parts = computed(() => ({ annotations: props.annotations, formFields: props.formFields }));\nconst painted = usePaintedParts(pageRef);\nconst may = useOptionalSelector(RenderToken, (lens) => lens.getLayerRights(), null);\n/** The parts the picture draws; `null` until the page's layers have said what they paint. */\nconst layers = computed(() =>\n painted.value && may.value ? pictureLayerOptionsOf(painted.value, parts.value, may.value) : null,\n);\nwatch([painted, parts], ([current, asked]) => {\n if (current && partsDrawnTwice(current, asked).length > 0) {\n devWarn(\n 'render-layer-draws-what-a-layer-paints',\n '<RenderLayer :annotations> or <RenderLayer :form-fields> draws what an <AnnotationLayer> ' +\n 'or a <FormLayer> on the page paints too, so it shows twice. Leave the prop out: the ' +\n 'picture leaves out what a layer paints.',\n );\n }\n});\n\n// The raster's identity: its conformed width, the parts it draws and the\n// page's epoch. Above the budget it stays put while zooming, so the deep-zoom\n// backdrop never fetches again.\nconst sourceKey = useOptionalSelector(\n RenderToken,\n (lens) =>\n layers.value\n ? lens.getSourceKey(page.value.ref, {\n scale: page.value.transform.renderScale,\n ...layers.value,\n })\n : null,\n null,\n);\n\nconst image = ref<HTMLImageElement | null>(null);\nwatch(\n [render, pageRef, sourceKey, layers],\n ([lens, shown, _key, drawn], _previous, onCleanup) => {\n if (!lens || !drawn) return;\n const controller = new AbortController();\n let revoke: (() => void) | undefined;\n onCleanup(() => {\n controller.abort();\n revoke?.();\n });\n void (async () => {\n try {\n // The plugin conforms this to its resolved size and collapses asks for\n // the same key, so any scale that maps to this key asks for this key.\n const picture = await lens.renderSource(shown, {\n scale: page.value.transform.renderScale,\n ...drawn,\n view: page.value.view,\n signal: controller.signal,\n });\n const object = await picture.objectUrl().abortWith(controller.signal);\n if (controller.signal.aborted) {\n object.revoke();\n return;\n }\n revoke = object.revoke;\n // Set on a lasting element: the browser keeps the old picture until the\n // new one decodes, and never asks for the old URL again, so revoking it\n // on cleanup is safe.\n if (image.value) image.value.src = object.url;\n } catch {\n // Aborted (the view moved, or the layer unmounted), or the render failed.\n }\n })();\n },\n { immediate: true, flush: 'post' },\n);\n</script>\n\n<template>\n <img\n ref=\"image\"\n alt=\"\"\n draggable=\"false\"\n :style=\"{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n }\"\n />\n <TilePlane v-if=\"tiles && settings.tiles && layers\" :layers=\"layers\" />\n</template>\n","/**\n * @embedpdf/vue/render: the Vue view of `@embedpdf/plugin-render`.\n * `<RenderLayer>` draws a page; `useRender()` renders pages yourself, for\n * previews and exports; `useRenderSettings()` and `useRenderEvent()` read and\n * follow the plugin.\n */\n\n// One line per feature: registration travels with the UI.\nexport * from '@embedpdf/plugin-render';\nimport { RenderToken } from '@embedpdf/plugin-render';\nimport type { RenderCapability } from '@embedpdf/plugin-render';\nimport type { EventHook } from '@embedpdf/core';\nimport { useCapability, useCapabilityEvent } from './runtime/capabilities';\nimport { settingsComposable } from './state';\n\nexport { default as RenderLayer } from './render/RenderLayer.vue';\n\n/** The render API (renderPage, renderThumbnail, invalidation, settings) for app code. The object never changes. */\nexport function useRender(): RenderCapability {\n return useCapability(RenderToken);\n}\n\n/** The render settings (`fullPage`, `tiles`, `format`, …), with or without a document, as refs. Takes a selector. */\nexport const useRenderSettings = settingsComposable(RenderToken);\n\n/** Subscribe to one render event while the component lives: `useRenderEvent((render) => render.onInvalidated, handler)`. */\nexport function useRenderEvent<Event>(\n select: (render: RenderCapability) => EventHook<Event>,\n handler: (event: Event) => void,\n): void {\n useCapabilityEvent(RenderToken, select, handler);\n}\n"],"names":["_createElementBlock","ref","_unref","_openBlock","_Fragment","_renderList","_createBlock","TileImage","_createElementVNode","TilePlane","RenderToken"],"mappings":"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"}