@elabs-ai/components-viewer 4.2.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/{code-adapter-ADZ4UOGN.js → adapters/code/code-adapter.js} +15 -64
  2. package/dist/adapters/code/code-adapter.js.map +1 -0
  3. package/dist/adapters/code/code-language.js +10 -0
  4. package/dist/adapters/code/code-language.js.map +1 -0
  5. package/dist/adapters/code/code-manifest.js +10 -0
  6. package/dist/adapters/code/code-manifest.js.map +1 -0
  7. package/dist/adapters/code/code-theme.js +8 -0
  8. package/dist/adapters/code/code-theme.js.map +1 -0
  9. package/dist/{csv-adapter-7HOFZ5Z6.js → adapters/csv/csv-adapter.js} +13 -9
  10. package/dist/adapters/csv/csv-adapter.js.map +1 -0
  11. package/dist/adapters/csv/csv-manifest.js +9 -0
  12. package/dist/adapters/csv/csv-manifest.js.map +1 -0
  13. package/dist/{docx-adapter-5CQDHWTD.js → adapters/docx/docx-adapter.js} +17 -175
  14. package/dist/adapters/docx/docx-adapter.js.map +1 -0
  15. package/dist/adapters/docx/docx-manifest.js +9 -0
  16. package/dist/adapters/docx/docx-manifest.js.map +1 -0
  17. package/dist/adapters/docx/docx-model.js +21 -0
  18. package/dist/adapters/docx/docx-model.js.map +1 -0
  19. package/dist/{image-adapter-WOHZR24J.js → adapters/image/image-adapter.js} +4 -3
  20. package/dist/adapters/image/image-adapter.js.map +1 -0
  21. package/dist/adapters/image/image-manifest.js +9 -0
  22. package/dist/adapters/image/image-manifest.js.map +1 -0
  23. package/dist/adapters/index.js +56 -0
  24. package/dist/adapters/index.js.map +1 -0
  25. package/dist/{json-adapter-ZUW5GQHE.js → adapters/json/json-adapter.js} +4 -3
  26. package/dist/adapters/json/json-adapter.js.map +1 -0
  27. package/dist/adapters/json/json-manifest.js +9 -0
  28. package/dist/adapters/json/json-manifest.js.map +1 -0
  29. package/dist/{markdown-adapter-YC6WTBS4.js → adapters/markdown/markdown-adapter.js} +14 -36
  30. package/dist/adapters/markdown/markdown-adapter.js.map +1 -0
  31. package/dist/adapters/markdown/markdown-manifest.js +9 -0
  32. package/dist/adapters/markdown/markdown-manifest.js.map +1 -0
  33. package/dist/adapters/markdown/markdown-marks.js +10 -0
  34. package/dist/adapters/markdown/markdown-marks.js.map +1 -0
  35. package/dist/{media-adapter-MCTB4GBH.js → adapters/media/media-adapter.js} +4 -3
  36. package/dist/adapters/media/media-adapter.js.map +1 -0
  37. package/dist/adapters/media/media-manifest.js +9 -0
  38. package/dist/adapters/media/media-manifest.js.map +1 -0
  39. package/dist/{pdf-adapter-5PMKEXUD.js → adapters/pdf/pdf-adapter.js} +31 -81
  40. package/dist/adapters/pdf/pdf-adapter.js.map +1 -0
  41. package/dist/adapters/pdf/pdf-engine.js +14 -0
  42. package/dist/adapters/pdf/pdf-engine.js.map +1 -0
  43. package/dist/adapters/pdf/pdf-manifest.js +9 -0
  44. package/dist/adapters/pdf/pdf-manifest.js.map +1 -0
  45. package/dist/adapters/pdf/pdf-text.js +20 -0
  46. package/dist/adapters/pdf/pdf-text.js.map +1 -0
  47. package/dist/{pptx-adapter-BONWFHYT.js → adapters/pptx/pptx-adapter.js} +34 -135
  48. package/dist/adapters/pptx/pptx-adapter.js.map +1 -0
  49. package/dist/adapters/pptx/pptx-manifest.js +9 -0
  50. package/dist/adapters/pptx/pptx-manifest.js.map +1 -0
  51. package/dist/adapters/pptx/pptx-model.js +37 -0
  52. package/dist/adapters/pptx/pptx-model.js.map +1 -0
  53. package/dist/{text-adapter-NFNWB5W3.js → adapters/text/text-adapter.js} +8 -5
  54. package/dist/adapters/text/text-adapter.js.map +1 -0
  55. package/dist/adapters/text/text-manifest.js +9 -0
  56. package/dist/adapters/text/text-manifest.js.map +1 -0
  57. package/dist/{xlsx-adapter-O3XIVLFC.js → adapters/xlsx/xlsx-adapter.js} +12 -8
  58. package/dist/adapters/xlsx/xlsx-adapter.js.map +1 -0
  59. package/dist/adapters/xlsx/xlsx-manifest.js +9 -0
  60. package/dist/adapters/xlsx/xlsx-manifest.js.map +1 -0
  61. package/dist/chunk-3HKQFFZW.js +31 -0
  62. package/dist/chunk-3HKQFFZW.js.map +1 -0
  63. package/dist/chunk-5VJWILZ7.js +182 -0
  64. package/dist/chunk-5VJWILZ7.js.map +1 -0
  65. package/dist/{chunk-UL43NGUG.js → chunk-5YE2MUS2.js} +1 -1
  66. package/dist/{chunk-5OMONA2G.js → chunk-6FVJ4D7W.js} +3 -15
  67. package/dist/chunk-6FVJ4D7W.js.map +1 -0
  68. package/dist/{chunk-RGWDIQJR.js → chunk-7EASJBQM.js} +2 -2
  69. package/dist/chunk-7PGGKQVY.js +26 -0
  70. package/dist/chunk-7PGGKQVY.js.map +1 -0
  71. package/dist/{chunk-XBOR2YXS.js → chunk-AK7F3IZE.js} +9 -30
  72. package/dist/chunk-AK7F3IZE.js.map +1 -0
  73. package/dist/chunk-AOYEL7O3.js +34 -0
  74. package/dist/chunk-AOYEL7O3.js.map +1 -0
  75. package/dist/chunk-BDUFH66C.js +61 -0
  76. package/dist/chunk-BDUFH66C.js.map +1 -0
  77. package/dist/chunk-BWMXMHVZ.js +107 -0
  78. package/dist/chunk-BWMXMHVZ.js.map +1 -0
  79. package/dist/chunk-CIT2HHRI.js +9 -0
  80. package/dist/chunk-CIT2HHRI.js.map +1 -0
  81. package/dist/chunk-CLOI4HBA.js +18 -0
  82. package/dist/chunk-CLOI4HBA.js.map +1 -0
  83. package/dist/chunk-CMYBLW7D.js +21 -0
  84. package/dist/chunk-CMYBLW7D.js.map +1 -0
  85. package/dist/chunk-CO2VJRSU.js +18 -0
  86. package/dist/chunk-CO2VJRSU.js.map +1 -0
  87. package/dist/{chunk-3U3MESBU.js → chunk-EA72HA4I.js} +2 -2
  88. package/dist/{chunk-KOMDRWOU.js → chunk-FDT4QOIG.js} +2 -2
  89. package/dist/chunk-FQHZEQUH.js +90 -0
  90. package/dist/chunk-FQHZEQUH.js.map +1 -0
  91. package/dist/chunk-G27UJZWH.js +82 -0
  92. package/dist/chunk-G27UJZWH.js.map +1 -0
  93. package/dist/{chunk-BCF3RWRL.js → chunk-GH4UBYST.js} +2 -2
  94. package/dist/{chunk-2NQ4RSJ3.js → chunk-GNBD53AT.js} +2 -2
  95. package/dist/{chunk-VO2273Z2.js → chunk-HOQZ7OPH.js} +2 -18
  96. package/dist/chunk-HOQZ7OPH.js.map +1 -0
  97. package/dist/{chunk-GGR7BNW4.js → chunk-HUUJIFFT.js} +2 -2
  98. package/dist/{chunk-FELIAGKI.js → chunk-I5XD2NJ6.js} +2 -2
  99. package/dist/chunk-IB4N72FA.js +21 -0
  100. package/dist/chunk-IB4N72FA.js.map +1 -0
  101. package/dist/{chunk-4OFQYALG.js → chunk-IQ6Z4X3K.js} +8 -68
  102. package/dist/chunk-IQ6Z4X3K.js.map +1 -0
  103. package/dist/{chunk-AORNMH77.js → chunk-JHFC2KBI.js} +1 -5
  104. package/dist/chunk-JHFC2KBI.js.map +1 -0
  105. package/dist/chunk-LRPZ373O.js +93 -0
  106. package/dist/chunk-LRPZ373O.js.map +1 -0
  107. package/dist/chunk-M77ICVWP.js +24 -0
  108. package/dist/chunk-M77ICVWP.js.map +1 -0
  109. package/dist/chunk-MJUH32ZK.js +24 -0
  110. package/dist/chunk-MJUH32ZK.js.map +1 -0
  111. package/dist/chunk-PAIVK4N6.js +162 -0
  112. package/dist/chunk-PAIVK4N6.js.map +1 -0
  113. package/dist/chunk-PKYDKXCO.js +129 -0
  114. package/dist/chunk-PKYDKXCO.js.map +1 -0
  115. package/dist/chunk-QIPKBOZJ.js +59 -0
  116. package/dist/chunk-QIPKBOZJ.js.map +1 -0
  117. package/dist/chunk-SASY77ZL.js +29 -0
  118. package/dist/chunk-SASY77ZL.js.map +1 -0
  119. package/dist/{chunk-SLXRUYT3.js → chunk-SBG7WPGO.js} +2 -44
  120. package/dist/chunk-SBG7WPGO.js.map +1 -0
  121. package/dist/chunk-T4Y4YRHJ.js +733 -0
  122. package/dist/chunk-T4Y4YRHJ.js.map +1 -0
  123. package/dist/chunk-TLCNGQKL.js +37 -0
  124. package/dist/chunk-TLCNGQKL.js.map +1 -0
  125. package/dist/chunk-US5KT3TR.js +141 -0
  126. package/dist/chunk-US5KT3TR.js.map +1 -0
  127. package/dist/{chunk-HMG2ERXH.js → chunk-YA72QE57.js} +2 -2
  128. package/dist/{chunk-H3OAON3D.js → chunk-YWHFMCS4.js} +2 -2
  129. package/dist/{chunk-UJIJECEF.js → chunk-ZAVXZRIO.js} +2 -2
  130. package/dist/components/grid-text.js +19 -0
  131. package/dist/components/grid-text.js.map +1 -0
  132. package/dist/components/marked-text.js +10 -0
  133. package/dist/components/marked-text.js.map +1 -0
  134. package/dist/components/sheet-table.js +14 -0
  135. package/dist/components/sheet-table.js.map +1 -0
  136. package/dist/core/errors.js +18 -0
  137. package/dist/core/errors.js.map +1 -0
  138. package/dist/core/highlight-marks.js +10 -0
  139. package/dist/core/highlight-marks.js.map +1 -0
  140. package/dist/core/highlight-resolve.js +10 -0
  141. package/dist/core/highlight-resolve.js.map +1 -0
  142. package/dist/core/highlight.js +12 -0
  143. package/dist/core/highlight.js.map +1 -0
  144. package/dist/core/registry.js +12 -0
  145. package/dist/core/registry.js.map +1 -0
  146. package/dist/core/scroll-host.js +10 -0
  147. package/dist/core/scroll-host.js.map +1 -0
  148. package/dist/core/text-index.js +14 -0
  149. package/dist/core/text-index.js.map +1 -0
  150. package/dist/core/types.js +8 -0
  151. package/dist/core/types.js.map +1 -0
  152. package/dist/core/use-highlight-scroll.js +11 -0
  153. package/dist/core/use-highlight-scroll.js.map +1 -0
  154. package/dist/core/use-page-control.js +9 -0
  155. package/dist/core/use-page-control.js.map +1 -0
  156. package/dist/core/use-paged-scroll.js +10 -0
  157. package/dist/core/use-paged-scroll.js.map +1 -0
  158. package/dist/core/use-viewport-size.js +10 -0
  159. package/dist/core/use-viewport-size.js.map +1 -0
  160. package/dist/core/zoom.js +16 -0
  161. package/dist/core/zoom.js.map +1 -0
  162. package/dist/file-viewer/file-viewer-context.js +11 -0
  163. package/dist/file-viewer/file-viewer-context.js.map +1 -0
  164. package/dist/file-viewer/file-viewer-find.js +13 -0
  165. package/dist/file-viewer/file-viewer-find.js.map +1 -0
  166. package/dist/file-viewer/file-viewer-pager.js +10 -0
  167. package/dist/file-viewer/file-viewer-pager.js.map +1 -0
  168. package/dist/file-viewer/file-viewer-zoom.js +13 -0
  169. package/dist/file-viewer/file-viewer-zoom.js.map +1 -0
  170. package/dist/file-viewer/file-viewer.js +48 -0
  171. package/dist/file-viewer/file-viewer.js.map +1 -0
  172. package/dist/index.js +78 -1274
  173. package/dist/index.js.map +1 -1
  174. package/package.json +5 -5
  175. package/src/file-viewer/file-viewer-recipes.stories.tsx +406 -0
  176. package/src/file-viewer/file-viewer.stories.tsx +2 -2
  177. package/dist/chunk-4OFQYALG.js.map +0 -1
  178. package/dist/chunk-5OMONA2G.js.map +0 -1
  179. package/dist/chunk-AORNMH77.js.map +0 -1
  180. package/dist/chunk-SLXRUYT3.js.map +0 -1
  181. package/dist/chunk-VO2273Z2.js.map +0 -1
  182. package/dist/chunk-XBOR2YXS.js.map +0 -1
  183. package/dist/code-adapter-ADZ4UOGN.js.map +0 -1
  184. package/dist/csv-adapter-7HOFZ5Z6.js.map +0 -1
  185. package/dist/docx-adapter-5CQDHWTD.js.map +0 -1
  186. package/dist/image-adapter-WOHZR24J.js.map +0 -1
  187. package/dist/json-adapter-ZUW5GQHE.js.map +0 -1
  188. package/dist/markdown-adapter-YC6WTBS4.js.map +0 -1
  189. package/dist/media-adapter-MCTB4GBH.js.map +0 -1
  190. package/dist/pdf-adapter-5PMKEXUD.js.map +0 -1
  191. package/dist/pptx-adapter-BONWFHYT.js.map +0 -1
  192. package/dist/text-adapter-NFNWB5W3.js.map +0 -1
  193. package/dist/xlsx-adapter-O3XIVLFC.js.map +0 -1
  194. /package/dist/{chunk-UL43NGUG.js.map → chunk-5YE2MUS2.js.map} +0 -0
  195. /package/dist/{chunk-RGWDIQJR.js.map → chunk-7EASJBQM.js.map} +0 -0
  196. /package/dist/{chunk-3U3MESBU.js.map → chunk-EA72HA4I.js.map} +0 -0
  197. /package/dist/{chunk-KOMDRWOU.js.map → chunk-FDT4QOIG.js.map} +0 -0
  198. /package/dist/{chunk-BCF3RWRL.js.map → chunk-GH4UBYST.js.map} +0 -0
  199. /package/dist/{chunk-2NQ4RSJ3.js.map → chunk-GNBD53AT.js.map} +0 -0
  200. /package/dist/{chunk-GGR7BNW4.js.map → chunk-HUUJIFFT.js.map} +0 -0
  201. /package/dist/{chunk-FELIAGKI.js.map → chunk-I5XD2NJ6.js.map} +0 -0
  202. /package/dist/{chunk-HMG2ERXH.js.map → chunk-YA72QE57.js.map} +0 -0
  203. /package/dist/{chunk-H3OAON3D.js.map → chunk-YWHFMCS4.js.map} +0 -0
  204. /package/dist/{chunk-UJIJECEF.js.map → chunk-ZAVXZRIO.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/index.ts"],"sourcesContent":["/**\n * The built-in adapters, and the registry that has them all.\n *\n * Every entry is `manifest` (eager, plain data) + `() => import(…)` (lazy). The\n * manifests are imported statically ON PURPOSE — they are a few dozen bytes of\n * data each and answer \"can this be opened, and what controls apply\" with no\n * network. The parsers and renderers behind them are not.\n *\n * `pnpm heavy-deps:check` enforces the split: a static import of `papaparse`\n * (or, from P1, `pdfjs-dist`) fails CI, because those are optional peers — a\n * static edge does not merely bloat a chunk, it makes the package unresolvable\n * for every consumer that did not install that parser.\n */\n\nimport { codeManifest } from \"./code/code-manifest\";\nimport { csvManifest } from \"./csv/csv-manifest\";\nimport { docxManifest } from \"./docx/docx-manifest\";\nimport { markdownManifest } from \"./markdown/markdown-manifest\";\nimport { imageManifest } from \"./image/image-manifest\";\nimport { jsonManifest } from \"./json/json-manifest\";\nimport { mediaManifest } from \"./media/media-manifest\";\nimport { pdfManifest } from \"./pdf/pdf-manifest\";\nimport { pptxManifest } from \"./pptx/pptx-manifest\";\nimport { textManifest } from \"./text/text-manifest\";\nimport { xlsxManifest } from \"./xlsx/xlsx-manifest\";\nimport { createRegistry, type ViewerRegistry } from \"../core/registry\";\n\nexport {\n codeManifest,\n csvManifest,\n docxManifest,\n imageManifest,\n jsonManifest,\n markdownManifest,\n mediaManifest,\n pdfManifest,\n pptxManifest,\n textManifest,\n xlsxManifest,\n};\n\n/**\n * A registry with every built-in adapter registered.\n *\n * Call it per app (or per view) rather than sharing one module-level instance,\n * so one screen's `register()` override cannot leak into another's.\n */\nexport function createDefaultRegistry(): ViewerRegistry {\n const registry = createRegistry();\n registry.register(imageManifest, () => import(\"./image/image-adapter\"));\n registry.register(jsonManifest, () => import(\"./json/json-adapter\"));\n registry.register(csvManifest, () => import(\"./csv/csv-adapter\"));\n registry.register(pdfManifest, () => import(\"./pdf/pdf-adapter\"));\n registry.register(mediaManifest, () => import(\"./media/media-adapter\"));\n registry.register(docxManifest, () => import(\"./docx/docx-adapter\"));\n registry.register(xlsxManifest, () => import(\"./xlsx/xlsx-adapter\"));\n registry.register(pptxManifest, () => import(\"./pptx/pptx-adapter\"));\n registry.register(markdownManifest, () => import(\"./markdown/markdown-adapter\"));\n registry.register(codeManifest, () => import(\"./code/code-adapter\"));\n // Registered last and claiming only broad categories, so anything above wins\n // a file it names specifically. This is the \"readable as text\" backstop.\n registry.register(textManifest, () => import(\"./text/text-adapter\"));\n return registry;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CO,SAAS,wBAAwC;AACtD,QAAM,WAAW,eAAe;AAChC,WAAS,SAAS,eAAe,MAAM,OAAO,mCAAuB,CAAC;AACtE,WAAS,SAAS,cAAc,MAAM,OAAO,iCAAqB,CAAC;AACnE,WAAS,SAAS,aAAa,MAAM,OAAO,+BAAmB,CAAC;AAChE,WAAS,SAAS,aAAa,MAAM,OAAO,+BAAmB,CAAC;AAChE,WAAS,SAAS,eAAe,MAAM,OAAO,mCAAuB,CAAC;AACtE,WAAS,SAAS,cAAc,MAAM,OAAO,iCAAqB,CAAC;AACnE,WAAS,SAAS,cAAc,MAAM,OAAO,iCAAqB,CAAC;AACnE,WAAS,SAAS,cAAc,MAAM,OAAO,iCAAqB,CAAC;AACnE,WAAS,SAAS,kBAAkB,MAAM,OAAO,yCAA6B,CAAC;AAC/E,WAAS,SAAS,cAAc,MAAM,OAAO,iCAAqB,CAAC;AAGnE,WAAS,SAAS,cAAc,MAAM,OAAO,iCAAqB,CAAC;AACnE,SAAO;AACT;","names":[]}
@@ -0,0 +1,29 @@
1
+ "use client";
2
+
3
+ // src/core/zoom.ts
4
+ var VIEWER_ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 3];
5
+ var DEFAULT_ZOOM = 1;
6
+ var EPSILON = 1e-6;
7
+ function isZoomFit(zoom) {
8
+ return typeof zoom === "string";
9
+ }
10
+ function stepZoom(from, delta) {
11
+ const steps = VIEWER_ZOOM_STEPS;
12
+ const first = steps[0];
13
+ const last = steps[steps.length - 1];
14
+ if (delta === 1) return steps.find((step) => step > from + EPSILON) ?? last;
15
+ return [...steps].reverse().find((step) => step < from - EPSILON) ?? first;
16
+ }
17
+ function canStepZoom(from, delta) {
18
+ const steps = VIEWER_ZOOM_STEPS;
19
+ return delta === 1 ? from < steps[steps.length - 1] - EPSILON : from > steps[0] + EPSILON;
20
+ }
21
+
22
+ export {
23
+ VIEWER_ZOOM_STEPS,
24
+ DEFAULT_ZOOM,
25
+ isZoomFit,
26
+ stepZoom,
27
+ canStepZoom
28
+ };
29
+ //# sourceMappingURL=chunk-SASY77ZL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/zoom.ts"],"sourcesContent":["/**\n * The zoom vocabulary — the stops, and how the chrome moves between them.\n *\n * Lives in `core/` rather than in the PDF adapter (where the stops started)\n * because zoom is now provider state: the shell's zoom control, the provider's\n * `zoomIn`/`zoomOut` and every adapter that scales its content all have to agree\n * on the same ladder, or \"125%\" in the toolbar and the scale the page rendered\n * at drift apart.\n */\n\nimport type { ZoomFit, ZoomLevel } from \"./types\";\n\n/**\n * Zoom stops, in document scale.\n *\n * Discrete rather than continuous: a slider is imprecise with a pointer and\n * impossible with a keyboard at this size, and \"somewhere near 137%\" is not a\n * state a reader ever wants to be in. The ladder is the one from the original\n * PDF pager, unchanged, so existing screens land on the same numbers.\n */\nexport const VIEWER_ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 3] as const;\n\n/** 100% — the scale a document opens at. */\nexport const DEFAULT_ZOOM = 1;\n\n/** Float slack, so `1.0000000000000002 > 1` does not skip a stop. */\nconst EPSILON = 1e-6;\n\n/** Whether a zoom level is a fit mode rather than a fixed scale. */\nexport function isZoomFit(zoom: ZoomLevel): zoom is ZoomFit {\n return typeof zoom === \"string\";\n}\n\n/**\n * The next stop above or below `from`.\n *\n * Takes an arbitrary scale, not an index, because a fit mode resolves to\n * whatever the viewport made it (1.37, say) and the reader's next \"zoom in\" has\n * to land on a real stop above that — an index-based pager would jump back to\n * wherever the ladder was last parked.\n */\nexport function stepZoom(from: number, delta: 1 | -1): number {\n const steps = VIEWER_ZOOM_STEPS;\n const first = steps[0];\n const last = steps[steps.length - 1] as number;\n if (delta === 1) return steps.find((step) => step > from + EPSILON) ?? last;\n return [...steps].reverse().find((step) => step < from - EPSILON) ?? (first as number);\n}\n\n/** Whether there is a stop left in that direction — what disables the button. */\nexport function canStepZoom(from: number, delta: 1 | -1): boolean {\n const steps = VIEWER_ZOOM_STEPS;\n return delta === 1\n ? from < (steps[steps.length - 1] as number) - EPSILON\n : from > (steps[0] as number) + EPSILON;\n}\n"],"mappings":";;;AAoBO,IAAM,oBAAoB,CAAC,KAAK,MAAM,GAAG,MAAM,KAAK,GAAG,CAAC;AAGxD,IAAM,eAAe;AAG5B,IAAM,UAAU;AAGT,SAAS,UAAU,MAAkC;AAC1D,SAAO,OAAO,SAAS;AACzB;AAUO,SAAS,SAAS,MAAc,OAAuB;AAC5D,QAAM,QAAQ;AACd,QAAM,QAAQ,MAAM,CAAC;AACrB,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,UAAU,EAAG,QAAO,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,OAAO,KAAK;AACvE,SAAO,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,OAAO,OAAO,OAAO,KAAM;AACxE;AAGO,SAAS,YAAY,MAAc,OAAwB;AAChE,QAAM,QAAQ;AACd,SAAO,UAAU,IACb,OAAQ,MAAM,MAAM,SAAS,CAAC,IAAe,UAC7C,OAAQ,MAAM,CAAC,IAAe;AACpC;","names":[]}
@@ -1,41 +1,4 @@
1
1
  "use client";
2
- import {
3
- PROTOCOL_VERSION
4
- } from "./chunk-AORNMH77.js";
5
-
6
- // src/adapters/pdf/pdf-manifest.ts
7
- var pdfManifest = {
8
- id: "pdf",
9
- protocol: PROTOCOL_VERSION,
10
- extensions: ["pdf"],
11
- mediaTypes: ["application/pdf"],
12
- capabilities: {
13
- pages: true,
14
- zoom: true,
15
- text: true,
16
- highlight: ["quote", "range", "rect"]
17
- },
18
- requires: ["pdfjs-dist"]
19
- };
20
-
21
- // src/core/zoom.ts
22
- var VIEWER_ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 3];
23
- var DEFAULT_ZOOM = 1;
24
- var EPSILON = 1e-6;
25
- function isZoomFit(zoom) {
26
- return typeof zoom === "string";
27
- }
28
- function stepZoom(from, delta) {
29
- const steps = VIEWER_ZOOM_STEPS;
30
- const first = steps[0];
31
- const last = steps[steps.length - 1];
32
- if (delta === 1) return steps.find((step) => step > from + EPSILON) ?? last;
33
- return [...steps].reverse().find((step) => step < from - EPSILON) ?? first;
34
- }
35
- function canStepZoom(from, delta) {
36
- const steps = VIEWER_ZOOM_STEPS;
37
- return delta === 1 ? from < steps[steps.length - 1] - EPSILON : from > steps[0] + EPSILON;
38
- }
39
2
 
40
3
  // src/adapters/pdf/pdf-engine.ts
41
4
  var config = {};
@@ -78,14 +41,9 @@ async function openPdfDocument(bytes, signal) {
78
41
  }
79
42
 
80
43
  export {
81
- pdfManifest,
82
- VIEWER_ZOOM_STEPS,
83
- DEFAULT_ZOOM,
84
- isZoomFit,
85
- stepZoom,
86
- canStepZoom,
87
44
  configurePdfEngine,
88
45
  getPdfEngineConfig,
46
+ loadPdfEngine,
89
47
  openPdfDocument
90
48
  };
91
- //# sourceMappingURL=chunk-SLXRUYT3.js.map
49
+ //# sourceMappingURL=chunk-SBG7WPGO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/pdf/pdf-engine.ts"],"sourcesContent":["/**\n * The pdf.js seam — one place that knows the engine exists.\n *\n * Everything here is deliberately NOT React. Splitting the engine wiring from\n * the renderer keeps two things true: the dynamic `import(\"pdfjs-dist\")` has a\n * single call site (so `heavy-deps:check` has one edge to police), and an app\n * can configure the worker before any file is ever opened.\n *\n * ## Why a worker is not optional\n *\n * pdf.js parses and rasterizes on a worker thread; without one it falls back to\n * doing that on the main thread, and a 40-page document freezes the tab. The\n * default below resolves the worker that ships INSIDE `pdfjs-dist`, via\n * `new URL(…, import.meta.url)` — the form every modern bundler understands, so\n * it works with no configuration in Vite/webpack/Next.\n *\n * ## Why an app may still have to configure it\n *\n * A CSP without `worker-src blob:` — or a bundler that cannot see through the\n * `new URL` form — needs the worker served as a real asset instead. Hence\n * {@link configurePdfEngine}: set `workerSrc` to a URL your app serves, and the\n * default is never consulted. `cMapUrl` / `standardFontDataUrl` are the same\n * story for CJK text and non-embedded fonts, which pdf.js fetches on demand.\n */\n\n/** Engine wiring an app can override. Every field is optional. */\nexport interface PdfEngineConfig {\n /** URL of `pdf.worker.min.mjs`. Defaults to the copy inside `pdfjs-dist`. */\n workerSrc?: string;\n /** Directory of pdf.js `cmaps/`, for documents with CJK text. */\n cMapUrl?: string;\n /** Directory of pdf.js `standard_fonts/`, for documents that embed no fonts. */\n standardFontDataUrl?: string;\n}\n\nlet config: PdfEngineConfig = {};\n\n/**\n * Point the PDF adapter at your own copies of the pdf.js assets.\n *\n * Call once at app start, before a PDF is opened. Calling it later is harmless\n * but only affects documents opened afterwards — pdf.js reads the worker\n * setting when a document is created.\n */\nexport function configurePdfEngine(next: PdfEngineConfig): void {\n config = { ...config, ...next };\n}\n\n/** What the adapter will actually use, after any {@link configurePdfEngine} call. */\nexport function getPdfEngineConfig(): Readonly<PdfEngineConfig> {\n return config;\n}\n\n/**\n * The pdf.js surface this adapter uses, declared structurally.\n *\n * `pdfjs-dist` is an OPTIONAL peer, so its types are not guaranteed to be\n * installed — importing them would make this package's typecheck depend on a\n * package a consumer may not have. Declaring the handful of members used here\n * keeps the build honest without that coupling, and a shape change in pdf.js\n * surfaces as a runtime failure the `parse-failed` panel already handles.\n */\nexport interface PdfPageViewport {\n width: number;\n height: number;\n}\n\nexport interface PdfTextItem {\n str: string;\n transform: number[];\n width: number;\n height: number;\n fontName?: string;\n}\n\nexport interface PdfPage {\n getViewport(options: { scale: number; rotation?: number }): PdfPageViewport;\n render(options: { canvasContext: CanvasRenderingContext2D; viewport: PdfPageViewport }): {\n promise: Promise<void>;\n cancel(): void;\n };\n getTextContent(): Promise<{ items: PdfTextItem[] }>;\n cleanup(): void;\n}\n\nexport interface PdfDocument {\n numPages: number;\n getPage(pageNumber: number): Promise<PdfPage>;\n}\n\n/**\n * An open document plus the one call that releases its worker.\n *\n * The two are separate because **the worker belongs to the LOADING TASK, not to\n * the document**: pdf.js removed `PDFDocumentProxy.destroy()` in v5, so\n * `document.destroy()` is not a function on the engine this package installs. It\n * type-checked anyway — the structural `PdfDocument` interface here declared a\n * method the real proxy does not have — and threw a `TypeError` on every unmount,\n * leaking exactly the worker per document that `dispose()` exists to prevent.\n * Keeping the teardown on this object rather than on `document` is what stops the\n * mistake from being expressible.\n */\nexport interface PdfSession {\n document: PdfDocument;\n destroy(): Promise<void>;\n}\n\ninterface PdfJsModule {\n GlobalWorkerOptions: { workerSrc: string };\n getDocument(options: Record<string, unknown>): {\n promise: Promise<PdfDocument>;\n destroy(): Promise<void>;\n };\n}\n\nlet enginePromise: Promise<PdfJsModule> | undefined;\n\n/**\n * Load pdf.js once per page load and wire its worker.\n *\n * The result is cached: opening a second PDF must not re-fetch a megabyte of\n * engine. A FAILED load is not cached, so a transient network error can be\n * retried by the viewer's own retry button.\n */\nexport async function loadPdfEngine(): Promise<PdfJsModule> {\n enginePromise ??= (async () => {\n // The ONLY edge to the optional peer. A static import here would break\n // every consumer that did not install pdfjs-dist (heavy-deps:check).\n const pdfjs = (await import(\"pdfjs-dist\")) as unknown as PdfJsModule;\n pdfjs.GlobalWorkerOptions.workerSrc = config.workerSrc ?? defaultWorkerSrc();\n return pdfjs;\n })().catch((error: unknown) => {\n enginePromise = undefined;\n throw error;\n });\n return enginePromise;\n}\n\n/**\n * The worker that ships with the installed `pdfjs-dist`.\n *\n * `new URL(…, import.meta.url)` is a *bundler instruction*, not a runtime path\n * lookup: Vite, webpack 5 and Turbopack all rewrite it to an emitted asset URL.\n * It is wrapped because a runtime without `import.meta.url` (a CJS test) throws\n * here, and a missing worker should surface as \"configure the worker\", not as an\n * unexplained crash.\n */\nfunction defaultWorkerSrc(): string {\n return new URL(\"pdfjs-dist/build/pdf.worker.min.mjs\", import.meta.url).href;\n}\n\n/** Open a document from bytes. The caller owns `destroy()` — see the adapter's `dispose`. */\nexport async function openPdfDocument(\n bytes: Uint8Array,\n signal?: AbortSignal,\n): Promise<PdfSession> {\n const pdfjs = await loadPdfEngine();\n const task = pdfjs.getDocument({\n data: bytes,\n // Defence in depth: pdf.js can evaluate font programs, and a viewer opens\n // files the app did not write. The cost is a rare, slightly slower font\n // path; the benefit is that a malicious PDF has no `eval` to reach for.\n isEvalSupported: false,\n cMapUrl: config.cMapUrl,\n cMapPacked: true,\n standardFontDataUrl: config.standardFontDataUrl,\n });\n signal?.addEventListener(\"abort\", () => void task.destroy(), { once: true });\n const document = await task.promise;\n return { document, destroy: () => task.destroy() };\n}\n"],"mappings":";;;AAmCA,IAAI,SAA0B,CAAC;AASxB,SAAS,mBAAmB,MAA6B;AAC9D,WAAS,EAAE,GAAG,QAAQ,GAAG,KAAK;AAChC;AAGO,SAAS,qBAAgD;AAC9D,SAAO;AACT;AAgEA,IAAI;AASJ,eAAsB,gBAAsC;AAC1D,qBAAmB,YAAY;AAG7B,UAAM,QAAS,MAAM,OAAO,YAAY;AACxC,UAAM,oBAAoB,YAAY,OAAO,aAAa,iBAAiB;AAC3E,WAAO;AAAA,EACT,GAAG,EAAE,MAAM,CAAC,UAAmB;AAC7B,oBAAgB;AAChB,UAAM;AAAA,EACR,CAAC;AACD,SAAO;AACT;AAWA,SAAS,mBAA2B;AAClC,SAAO,IAAI,IAAI,uCAAuC,YAAY,GAAG,EAAE;AACzE;AAGA,eAAsB,gBACpB,OACA,QACqB;AACrB,QAAM,QAAQ,MAAM,cAAc;AAClC,QAAM,OAAO,MAAM,YAAY;AAAA,IAC7B,MAAM;AAAA;AAAA;AAAA;AAAA,IAIN,iBAAiB;AAAA,IACjB,SAAS,OAAO;AAAA,IAChB,YAAY;AAAA,IACZ,qBAAqB,OAAO;AAAA,EAC9B,CAAC;AACD,UAAQ,iBAAiB,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AAC3E,QAAM,WAAW,MAAM,KAAK;AAC5B,SAAO,EAAE,UAAU,SAAS,MAAM,KAAK,QAAQ,EAAE;AACnD;","names":[]}