@embedpdf/plugin-selection 2.4.1 → 2.6.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 (45) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +159 -81
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/handlers/marquee-selection.handler.d.ts +9 -7
  6. package/dist/lib/handlers/text-selection.handler.d.ts +8 -6
  7. package/dist/lib/selection-plugin.d.ts +7 -4
  8. package/dist/lib/types.d.ts +71 -2
  9. package/dist/preact/index.cjs +1 -1
  10. package/dist/preact/index.cjs.map +1 -1
  11. package/dist/preact/index.js +65 -19
  12. package/dist/preact/index.js.map +1 -1
  13. package/dist/react/index.cjs +1 -1
  14. package/dist/react/index.cjs.map +1 -1
  15. package/dist/react/index.js +65 -19
  16. package/dist/react/index.js.map +1 -1
  17. package/dist/shared/components/index.d.ts +1 -0
  18. package/dist/shared/components/marquee-selection.d.ts +18 -5
  19. package/dist/shared/components/selection-layer.d.ts +18 -1
  20. package/dist/shared/components/text-selection.d.ts +21 -0
  21. package/dist/shared-preact/components/index.d.ts +1 -0
  22. package/dist/shared-preact/components/marquee-selection.d.ts +18 -5
  23. package/dist/shared-preact/components/selection-layer.d.ts +18 -1
  24. package/dist/shared-preact/components/text-selection.d.ts +21 -0
  25. package/dist/shared-react/components/index.d.ts +1 -0
  26. package/dist/shared-react/components/marquee-selection.d.ts +18 -5
  27. package/dist/shared-react/components/selection-layer.d.ts +18 -1
  28. package/dist/shared-react/components/text-selection.d.ts +21 -0
  29. package/dist/svelte/components/MarqueeSelection.svelte.d.ts +12 -2
  30. package/dist/svelte/components/SelectionLayer.svelte.d.ts +11 -1
  31. package/dist/svelte/components/TextSelection.svelte.d.ts +22 -0
  32. package/dist/svelte/components/index.d.ts +1 -0
  33. package/dist/svelte/index.cjs +1 -1
  34. package/dist/svelte/index.cjs.map +1 -1
  35. package/dist/svelte/index.js +103 -20
  36. package/dist/svelte/index.js.map +1 -1
  37. package/dist/vue/components/index.d.ts +1 -0
  38. package/dist/vue/components/marquee-selection.vue.d.ts +13 -4
  39. package/dist/vue/components/selection-layer.vue.d.ts +15 -5
  40. package/dist/vue/components/text-selection.vue.d.ts +51 -0
  41. package/dist/vue/index.cjs +1 -1
  42. package/dist/vue/index.cjs.map +1 -1
  43. package/dist/vue/index.js +97 -34
  44. package/dist/vue/index.js.map +1 -1
  45. package/package.json +9 -9
package/dist/vue/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import { createPluginPackage } from "@embedpdf/core";
2
2
  import { SelectionPlugin, SelectionPluginPackage as SelectionPluginPackage$1 } from "@embedpdf/plugin-selection";
3
3
  export * from "@embedpdf/plugin-selection";
4
- import { defineComponent, useSlots, ref, computed, watch, createElementBlock, createCommentVNode, openBlock, Fragment, createElementVNode, createBlock, normalizeStyle, renderList, unref, withCtx, renderSlot, resolveDynamicComponent, watchEffect, normalizeClass } from "vue";
5
- import { usePlugin, useCapability, useDocumentState } from "@embedpdf/core/vue";
4
+ import { defineComponent, useSlots, computed, ref, watch, openBlock, createElementBlock, Fragment, createElementVNode, normalizeStyle, renderList, createBlock, unref, withCtx, resolveDynamicComponent, renderSlot, createCommentVNode, normalizeClass, createVNode, normalizeProps, guardReactiveProps, watchEffect } from "vue";
6
5
  import { Rotation } from "@embedpdf/models";
6
+ import { usePlugin, useCapability, useDocumentState } from "@embedpdf/core/vue";
7
7
  import { CounterRotate } from "@embedpdf/utils/vue";
8
8
  const useSelectionCapability = () => useCapability(SelectionPlugin.id);
9
9
  const useSelectionPlugin = () => usePlugin(SelectionPlugin.id);
10
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
11
- __name: "selection-layer",
10
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
11
+ __name: "text-selection",
12
12
  props: {
13
13
  documentId: {},
14
14
  pageIndex: {},
@@ -22,6 +22,10 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
22
22
  const slots = useSlots();
23
23
  const { plugin: selPlugin } = useSelectionPlugin();
24
24
  const documentState = useDocumentState(() => props.documentId);
25
+ const page = computed(() => {
26
+ var _a, _b, _c;
27
+ return (_c = (_b = (_a = documentState.value) == null ? void 0 : _a.document) == null ? void 0 : _b.pages) == null ? void 0 : _c[props.pageIndex];
28
+ });
25
29
  const rects = ref([]);
26
30
  const boundingRect = ref(null);
27
31
  const placement = ref(null);
@@ -31,9 +35,11 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
31
35
  return ((_a = documentState.value) == null ? void 0 : _a.scale) ?? 1;
32
36
  });
33
37
  const actualRotation = computed(() => {
34
- var _a;
38
+ var _a, _b;
35
39
  if (props.rotation !== void 0) return props.rotation;
36
- return ((_a = documentState.value) == null ? void 0 : _a.rotation) ?? Rotation.Degree0;
40
+ const pageRotation = ((_a = page.value) == null ? void 0 : _a.rotation) ?? 0;
41
+ const docRotation = ((_b = documentState.value) == null ? void 0 : _b.rotation) ?? 0;
42
+ return (pageRotation + docRotation) % 4;
37
43
  });
38
44
  const shouldRenderMenu = computed(() => {
39
45
  if (!placement.value) return false;
@@ -156,37 +162,26 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
156
162
  };
157
163
  }
158
164
  });
159
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
160
- __name: "copy-to-clipboard",
161
- setup(__props) {
162
- const { provides: sel } = useSelectionCapability();
163
- watchEffect((onCleanup) => {
164
- if (sel.value) {
165
- const unsubscribe = sel.value.onCopyToClipboard(({ text }) => {
166
- navigator.clipboard.writeText(text).catch((err) => {
167
- console.error("Failed to copy text to clipboard:", err);
168
- });
169
- });
170
- onCleanup(unsubscribe);
171
- }
172
- });
173
- return (_ctx, _cache) => {
174
- return null;
175
- };
176
- }
177
- });
178
- const _sfc_main = /* @__PURE__ */ defineComponent({
165
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
179
166
  __name: "marquee-selection",
180
167
  props: {
181
168
  documentId: {},
182
169
  pageIndex: {},
183
170
  scale: {},
184
171
  className: {},
185
- stroke: { default: "rgba(0,122,204,0.8)" },
186
- fill: { default: "rgba(0,122,204,0.15)" }
172
+ background: {},
173
+ borderColor: {},
174
+ borderStyle: { default: "dashed" },
175
+ stroke: {},
176
+ fill: {}
187
177
  },
188
178
  setup(__props) {
189
179
  const props = __props;
180
+ const resolvedBorderColor = computed(
181
+ () => props.borderColor ?? props.stroke ?? "rgba(0,122,204,0.8)"
182
+ );
183
+ const resolvedBackground = computed(() => props.background ?? props.fill ?? "rgba(0,122,204,0.15)");
184
+ const resolvedBorderStyle = computed(() => props.borderStyle);
190
185
  const { plugin: selPlugin } = useSelectionPlugin();
191
186
  const documentState = useDocumentState(() => props.documentId);
192
187
  const rect = ref(null);
@@ -226,8 +221,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
226
221
  top: `${rect.value.origin.y * actualScale.value}px`,
227
222
  width: `${rect.value.size.width * actualScale.value}px`,
228
223
  height: `${rect.value.size.height * actualScale.value}px`,
229
- border: `1px dashed ${__props.stroke}`,
230
- background: __props.fill,
224
+ border: `1px ${resolvedBorderStyle.value} ${resolvedBorderColor.value}`,
225
+ background: resolvedBackground.value,
231
226
  boxSizing: "border-box",
232
227
  zIndex: 1e3
233
228
  }),
@@ -236,12 +231,80 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
236
231
  };
237
232
  }
238
233
  });
239
- const SelectionPluginPackage = createPluginPackage(SelectionPluginPackage$1).addUtility(_sfc_main$1).build();
234
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
235
+ __name: "selection-layer",
236
+ props: {
237
+ documentId: {},
238
+ pageIndex: {},
239
+ scale: {},
240
+ rotation: { default: Rotation.Degree0 },
241
+ background: {},
242
+ textStyle: {},
243
+ marqueeStyle: {},
244
+ marqueeClassName: {},
245
+ selectionMenu: {}
246
+ },
247
+ setup(__props) {
248
+ const props = __props;
249
+ const resolvedTextBackground = computed(() => {
250
+ var _a;
251
+ return ((_a = props.textStyle) == null ? void 0 : _a.background) ?? props.background;
252
+ });
253
+ return (_ctx, _cache) => {
254
+ var _a, _b, _c;
255
+ return openBlock(), createElementBlock(Fragment, null, [
256
+ createVNode(_sfc_main$3, {
257
+ "document-id": __props.documentId,
258
+ "page-index": __props.pageIndex,
259
+ scale: __props.scale,
260
+ rotation: __props.rotation,
261
+ background: resolvedTextBackground.value,
262
+ "selection-menu": __props.selectionMenu
263
+ }, {
264
+ "selection-menu": withCtx((menuProps) => [
265
+ renderSlot(_ctx.$slots, "selection-menu", normalizeProps(guardReactiveProps(menuProps)))
266
+ ]),
267
+ _: 3
268
+ }, 8, ["document-id", "page-index", "scale", "rotation", "background", "selection-menu"]),
269
+ createVNode(_sfc_main$2, {
270
+ "document-id": __props.documentId,
271
+ "page-index": __props.pageIndex,
272
+ scale: __props.scale,
273
+ background: (_a = __props.marqueeStyle) == null ? void 0 : _a.background,
274
+ "border-color": (_b = __props.marqueeStyle) == null ? void 0 : _b.borderColor,
275
+ "border-style": (_c = __props.marqueeStyle) == null ? void 0 : _c.borderStyle,
276
+ "class-name": __props.marqueeClassName
277
+ }, null, 8, ["document-id", "page-index", "scale", "background", "border-color", "border-style", "class-name"])
278
+ ], 64);
279
+ };
280
+ }
281
+ });
282
+ const _sfc_main = /* @__PURE__ */ defineComponent({
283
+ __name: "copy-to-clipboard",
284
+ setup(__props) {
285
+ const { provides: sel } = useSelectionCapability();
286
+ watchEffect((onCleanup) => {
287
+ if (sel.value) {
288
+ const unsubscribe = sel.value.onCopyToClipboard(({ text }) => {
289
+ navigator.clipboard.writeText(text).catch((err) => {
290
+ console.error("Failed to copy text to clipboard:", err);
291
+ });
292
+ });
293
+ onCleanup(unsubscribe);
294
+ }
295
+ });
296
+ return (_ctx, _cache) => {
297
+ return null;
298
+ };
299
+ }
300
+ });
301
+ const SelectionPluginPackage = createPluginPackage(SelectionPluginPackage$1).addUtility(_sfc_main).build();
240
302
  export {
241
- _sfc_main$1 as CopyToClipboard,
242
- _sfc_main as MarqueeSelection,
243
- _sfc_main$2 as SelectionLayer,
303
+ _sfc_main as CopyToClipboard,
304
+ _sfc_main$2 as MarqueeSelection,
305
+ _sfc_main$1 as SelectionLayer,
244
306
  SelectionPluginPackage,
307
+ _sfc_main$3 as TextSelection,
245
308
  useSelectionCapability,
246
309
  useSelectionPlugin
247
310
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/vue/hooks/use-selection.ts","../../src/vue/components/selection-layer.vue","../../src/vue/components/copy-to-clipboard.vue","../../src/vue/components/marquee-selection.vue","../../src/vue/index.ts"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport { SelectionPlugin } from '@embedpdf/plugin-selection';\n\n/**\n * Hook to get the selection plugin's capability API.\n * This provides methods for controlling and listening to selection events.\n */\nexport const useSelectionCapability = () => useCapability<SelectionPlugin>(SelectionPlugin.id);\n\n/**\n * Hook to get the raw selection plugin instance.\n * Useful for accessing plugin-specific properties or methods not exposed in the capability.\n */\nexport const useSelectionPlugin = () => usePlugin<SelectionPlugin>(SelectionPlugin.id);\n","<script setup lang=\"ts\">\nimport { ref, watch, computed, useSlots, type VNode } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { Rotation, type Rect } from '@embedpdf/models';\nimport type { SelectionMenuPlacement } from '@embedpdf/plugin-selection';\nimport { CounterRotate, type MenuWrapperProps } from '@embedpdf/utils/vue';\nimport { useSelectionPlugin } from '../hooks/use-selection';\nimport type { SelectionSelectionContext, SelectionSelectionMenuRenderFn } from '../types';\n\ninterface SelectionLayerProps {\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: Rotation;\n background?: string;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: SelectionSelectionMenuRenderFn;\n}\n\nconst props = withDefaults(defineProps<SelectionLayerProps>(), {\n background: 'rgba(33,150,243)',\n rotation: Rotation.Degree0,\n});\n\nconst slots = useSlots();\nconst { plugin: selPlugin } = useSelectionPlugin();\nconst documentState = useDocumentState(() => props.documentId);\nconst rects = ref<Rect[]>([]);\nconst boundingRect = ref<Rect | null>(null);\nconst placement = ref<SelectionMenuPlacement | null>(null);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nconst actualRotation = computed(() => {\n if (props.rotation !== undefined) return props.rotation;\n return documentState.value?.rotation ?? Rotation.Degree0;\n});\n\n// Check if menu should render: placement is valid AND (render fn OR slot exists)\nconst shouldRenderMenu = computed(() => {\n if (!placement.value) return false;\n if (placement.value.pageIndex !== props.pageIndex) return false;\n if (!placement.value.isVisible) return false;\n\n // Must have either render function or slot\n return !!props.selectionMenu || !!slots['selection-menu'];\n});\n\nwatch(\n [() => selPlugin.value, () => props.documentId, () => props.pageIndex],\n ([plugin, docId, pageIdx], _, onCleanup) => {\n if (!plugin || !docId) {\n rects.value = [];\n boundingRect.value = null;\n return;\n }\n\n const unregister = plugin.registerSelectionOnPage({\n documentId: docId,\n pageIndex: pageIdx,\n onRectsChange: ({ rects: newRects, boundingRect: newBoundingRect }) => {\n rects.value = newRects;\n boundingRect.value = newBoundingRect;\n },\n });\n\n onCleanup(unregister);\n },\n { immediate: true },\n);\n\nwatch(\n [() => selPlugin.value, () => props.documentId],\n ([plugin, docId], _, onCleanup) => {\n if (!plugin || !docId) {\n placement.value = null;\n return;\n }\n\n const unsubscribe = plugin.onMenuPlacement(docId, (newPlacement) => {\n placement.value = newPlacement;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n);\n\n// --- Selection Menu Logic ---\n\n// Build context object for selection menu\nconst buildContext = (): SelectionSelectionContext => ({\n type: 'selection',\n pageIndex: props.pageIndex,\n});\n\n// Build placement hints from plugin placement data\nconst buildMenuPlacement = () => ({\n suggestTop: placement.value?.suggestTop ?? false,\n spaceAbove: placement.value?.spaceAbove ?? 0,\n spaceBelow: placement.value?.spaceBelow ?? 0,\n});\n\n// Render via function (for schema-driven approach)\nconst renderSelectionMenu = (rect: Rect, menuWrapperProps: MenuWrapperProps): VNode | null => {\n if (!props.selectionMenu) return null;\n\n return props.selectionMenu({\n rect,\n menuWrapperProps,\n selected: true, // Selection is always \"selected\" when visible\n placement: buildMenuPlacement(),\n context: buildContext(),\n });\n};\n</script>\n\n<template>\n <template v-if=\"boundingRect\">\n <div\n :style=\"{\n position: 'absolute',\n left: `${boundingRect.origin.x * actualScale}px`,\n top: `${boundingRect.origin.y * actualScale}px`,\n width: `${boundingRect.size.width * actualScale}px`,\n height: `${boundingRect.size.height * actualScale}px`,\n mixBlendMode: 'multiply',\n isolation: 'isolate',\n pointerEvents: 'none',\n }\"\n >\n <div\n v-for=\"(rect, i) in rects\"\n :key=\"i\"\n :style=\"{\n position: 'absolute',\n left: `${(rect.origin.x - boundingRect.origin.x) * actualScale}px`,\n top: `${(rect.origin.y - boundingRect.origin.y) * actualScale}px`,\n width: `${rect.size.width * actualScale}px`,\n height: `${rect.size.height * actualScale}px`,\n background: background,\n }\"\n />\n </div>\n\n <!-- Selection Menu: Supports BOTH render function and slot -->\n <CounterRotate\n v-if=\"shouldRenderMenu\"\n :rect=\"{\n origin: {\n x: placement!.rect.origin.x * actualScale,\n y: placement!.rect.origin.y * actualScale,\n },\n size: {\n width: placement!.rect.size.width * actualScale,\n height: placement!.rect.size.height * actualScale,\n },\n }\"\n :rotation=\"actualRotation\"\n >\n <template #default=\"{ rect, menuWrapperProps }\">\n <!-- Priority 1: Render function prop (schema-driven) -->\n <component v-if=\"selectionMenu\" :is=\"renderSelectionMenu(rect, menuWrapperProps)\" />\n\n <!-- Priority 2: Slot (manual customization) -->\n <slot\n v-else\n name=\"selection-menu\"\n :context=\"buildContext()\"\n :selected=\"true\"\n :rect=\"rect\"\n :placement=\"buildMenuPlacement()\"\n :menuWrapperProps=\"menuWrapperProps\"\n />\n </template>\n </CounterRotate>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { watchEffect } from 'vue';\nimport { useSelectionCapability } from '../hooks';\n\nconst { provides: sel } = useSelectionCapability();\n\n// This effect runs when the component is mounted and the capability is available.\n// It automatically handles unsubscribing when the component is unmounted.\nwatchEffect((onCleanup) => {\n if (sel.value) {\n const unsubscribe = sel.value.onCopyToClipboard(({ text }) => {\n // Use the Clipboard API to write the text\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('Failed to copy text to clipboard:', err);\n });\n });\n\n // Register the cleanup function to run on unmount or re-run\n onCleanup(unsubscribe);\n }\n});\n</script>\n\n<template>\n <!-- This component renders nothing to the DOM -->\n</template>\n","<template>\n <div\n v-if=\"rect\"\n :style=\"{\n position: 'absolute',\n pointerEvents: 'none',\n left: `${rect.origin.x * actualScale}px`,\n top: `${rect.origin.y * actualScale}px`,\n width: `${rect.size.width * actualScale}px`,\n height: `${rect.size.height * actualScale}px`,\n border: `1px dashed ${stroke}`,\n background: fill,\n boxSizing: 'border-box',\n zIndex: 1000,\n }\"\n :class=\"className\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport type { Rect } from '@embedpdf/models';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { useSelectionPlugin } from '../hooks';\n\ninterface MarqueeSelectionProps {\n /** The ID of the document */\n documentId: string;\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page (optional, defaults to document scale) */\n scale?: number;\n /** Optional CSS class applied to the marquee rectangle */\n className?: string;\n /** Stroke colour (default: 'rgba(0,122,204,0.8)') */\n stroke?: string;\n /** Fill colour (default: 'rgba(0,122,204,0.15)') */\n fill?: string;\n}\n\nconst props = withDefaults(defineProps<MarqueeSelectionProps>(), {\n stroke: 'rgba(0,122,204,0.8)',\n fill: 'rgba(0,122,204,0.15)',\n});\n\nconst { plugin: selPlugin } = useSelectionPlugin();\nconst documentState = useDocumentState(() => props.documentId);\nconst rect = ref<Rect | null>(null);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nwatch(\n [selPlugin, () => props.documentId, () => props.pageIndex, actualScale],\n ([plugin, docId, pageIdx, scale], _, onCleanup) => {\n rect.value = null;\n\n if (!plugin) {\n return;\n }\n\n const unregister = plugin.registerMarqueeOnPage({\n documentId: docId,\n pageIndex: pageIdx,\n scale,\n onRectChange: (newRect) => {\n rect.value = newRect;\n },\n });\n\n onCleanup(() => {\n unregister?.();\n });\n },\n { immediate: true },\n);\n</script>\n","import { createPluginPackage } from '@embedpdf/core';\nimport { SelectionPluginPackage as BaseSelectionPluginPackage } from '@embedpdf/plugin-selection';\n\nimport { CopyToClipboard } from './components';\n\nexport * from './hooks';\nexport * from './components';\nexport * from './types';\nexport * from '@embedpdf/plugin-selection';\n\nexport const SelectionPluginPackage = createPluginPackage(BaseSelectionPluginPackage)\n .addUtility(CopyToClipboard)\n .build();\n"],"names":["_createElementBlock","_Fragment","_createElementVNode","_normalizeStyle","_openBlock","_renderList","_createBlock","_unref","_withCtx","_resolveDynamicComponent","_renderSlot","BaseSelectionPluginPackage","CopyToClipboard"],"mappings":";;;;;;;AAOO,MAAM,yBAAyB,MAAM,cAA+B,gBAAgB,EAAE;AAMtF,MAAM,qBAAqB,MAAM,UAA2B,gBAAgB,EAAE;;;;;;;;;;;;ACMrF,UAAM,QAAQ;AAKd,UAAM,QAAQ,SAAA;AACd,UAAM,EAAE,QAAQ,UAAA,IAAc,mBAAA;AAC9B,UAAM,gBAAgB,iBAAiB,MAAM,MAAM,UAAU;AAC7D,UAAM,QAAQ,IAAY,EAAE;AAC5B,UAAM,eAAe,IAAiB,IAAI;AAC1C,UAAM,YAAY,IAAmC,IAAI;AAEzD,UAAM,cAAc,SAAS,MAAM;;AACjC,UAAI,MAAM,UAAU,OAAW,QAAO,MAAM;AAC5C,eAAO,mBAAc,UAAd,mBAAqB,UAAS;AAAA,IACvC,CAAC;AAED,UAAM,iBAAiB,SAAS,MAAM;;AACpC,UAAI,MAAM,aAAa,OAAW,QAAO,MAAM;AAC/C,eAAO,mBAAc,UAAd,mBAAqB,aAAY,SAAS;AAAA,IACnD,CAAC;AAGD,UAAM,mBAAmB,SAAS,MAAM;AACtC,UAAI,CAAC,UAAU,MAAO,QAAO;AAC7B,UAAI,UAAU,MAAM,cAAc,MAAM,UAAW,QAAO;AAC1D,UAAI,CAAC,UAAU,MAAM,UAAW,QAAO;AAGvC,aAAO,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC,MAAM,gBAAgB;AAAA,IAC1D,CAAC;AAED;AAAA,MACE,CAAC,MAAM,UAAU,OAAO,MAAM,MAAM,YAAY,MAAM,MAAM,SAAS;AAAA,MACrE,CAAC,CAAC,QAAQ,OAAO,OAAO,GAAG,GAAG,cAAc;AAC1C,YAAI,CAAC,UAAU,CAAC,OAAO;AACrB,gBAAM,QAAQ,CAAA;AACd,uBAAa,QAAQ;AACrB;AAAA,QACF;AAEA,cAAM,aAAa,OAAO,wBAAwB;AAAA,UAChD,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,eAAe,CAAC,EAAE,OAAO,UAAU,cAAc,sBAAsB;AACrE,kBAAM,QAAQ;AACd,yBAAa,QAAQ;AAAA,UACvB;AAAA,QAAA,CACD;AAED,kBAAU,UAAU;AAAA,MACtB;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAGpB;AAAA,MACE,CAAC,MAAM,UAAU,OAAO,MAAM,MAAM,UAAU;AAAA,MAC9C,CAAC,CAAC,QAAQ,KAAK,GAAG,GAAG,cAAc;AACjC,YAAI,CAAC,UAAU,CAAC,OAAO;AACrB,oBAAU,QAAQ;AAClB;AAAA,QACF;AAEA,cAAM,cAAc,OAAO,gBAAgB,OAAO,CAAC,iBAAiB;AAClE,oBAAU,QAAQ;AAAA,QACpB,CAAC;AAED,kBAAU,WAAW;AAAA,MACvB;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAMpB,UAAM,eAAe,OAAkC;AAAA,MACrD,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,IAAA;AAInB,UAAM,qBAAqB,MAAA;;AAAO;AAAA,QAChC,cAAY,eAAU,UAAV,mBAAiB,eAAc;AAAA,QAC3C,cAAY,eAAU,UAAV,mBAAiB,eAAc;AAAA,QAC3C,cAAY,eAAU,UAAV,mBAAiB,eAAc;AAAA,MAAA;AAAA;AAI7C,UAAM,sBAAsB,CAAC,MAAY,qBAAqD;AAC5F,UAAI,CAAC,MAAM,cAAe,QAAO;AAEjC,aAAO,MAAM,cAAc;AAAA,QACzB;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,QACV,WAAW,mBAAA;AAAA,QACX,SAAS,aAAA;AAAA,MAAa,CACvB;AAAA,IACH;;aAIkB,aAAA,sBAAhBA,mBA0DWC,UAAA,EAAA,KAAA,KAAA;AAAA,QAzDTC,mBAwBM,OAAA;AAAA,UAvBH,OAAKC,eAAA;AAAA;YAAmD,MAAA,GAAA,aAAA,MAAa,OAAO,IAAI,YAAA,KAAW;AAAA,YAAsB,KAAA,GAAA,aAAA,MAAa,OAAO,IAAI,YAAA,KAAW;AAAA,YAAwB,OAAA,GAAA,aAAA,MAAa,KAAK,QAAQ,YAAA,KAAW;AAAA,YAAyB,QAAA,GAAA,aAAA,MAAa,KAAK,SAAS,YAAA,KAAW;AAAA;;;;;WAWjRC,UAAA,IAAA,GAAAJ,mBAWEC,UAAA,MAAAI,WAVoB,MAAA,OAAK,CAAjB,MAAM,MAAC;gCADjBL,mBAWE,OAAA;AAAA,cATC,KAAK;AAAA,cACL,OAAKG,eAAA;AAAA;0BAAwD,KAAK,OAAO,IAAI,aAAA,MAAa,OAAO,KAAK,YAAA,KAAW;AAAA,yBAAyB,KAAK,OAAO,IAAI,aAAA,MAAa,OAAO,KAAK,YAAA,KAAW;AAAA,gBAA0B,OAAA,GAAA,KAAK,KAAK,QAAQ,YAAA,KAAW;AAAA,gBAA2B,QAAA,GAAA,KAAK,KAAK,SAAS,YAAA,KAAW;AAAA,4BAA4B,QAAA;AAAA,cAAA;;;;QAavU,iBAAA,sBADRG,YA6BgBC,MAAA,aAAA,GAAA;AAAA;UA3Bb,MAAI;AAAA;cAAmC,GAAA,UAAA,MAAW,KAAK,OAAO,IAAI,YAAA;AAAA,cAA0B,GAAA,UAAA,MAAW,KAAK,OAAO,IAAI,YAAA;AAAA,YAAA;AAAA;cAAyD,OAAA,UAAA,MAAW,KAAK,KAAK,QAAQ,YAAA;AAAA,cAA+B,QAAA,UAAA,MAAW,KAAK,KAAK,SAAS,YAAA;AAAA,YAAA;AAAA;UAU1Q,UAAU,eAAA;AAAA,QAAA;UAEA,SAAOC,QAEhB,CAAoF,EAFhE,MAAM,uBAAgB;AAAA,YAEzB,QAAA,iBAAjBJ,UAAA,GAAAE,YAAoFG,wBAA/C,oBAAoB,MAAM,gBAAgB,CAAA,GAAA,EAAA,KAAA,EAAA,CAAA,KAG/EC,WAQE,KAAA,QAAA,kBAAA;AAAA;cALC,SAAS,aAAA;AAAA,cACT,UAAU;AAAA,cACV;AAAA,cACA,WAAW,mBAAA;AAAA,cACX;AAAA,YAAA;;;;;;;;;;;AC3KX,UAAM,EAAE,UAAU,IAAA,IAAQ,uBAAA;AAI1B,gBAAY,CAAC,cAAc;AACzB,UAAI,IAAI,OAAO;AACb,cAAM,cAAc,IAAI,MAAM,kBAAkB,CAAC,EAAE,WAAW;AAE5D,oBAAU,UAAU,UAAU,IAAI,EAAE,MAAM,CAAC,QAAQ;AACjD,oBAAQ,MAAM,qCAAqC,GAAG;AAAA,UACxD,CAAC;AAAA,QACH,CAAC;AAGD,kBAAU,WAAW;AAAA,MACvB;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;ACoBD,UAAM,QAAQ;AAKd,UAAM,EAAE,QAAQ,UAAA,IAAc,mBAAA;AAC9B,UAAM,gBAAgB,iBAAiB,MAAM,MAAM,UAAU;AAC7D,UAAM,OAAO,IAAiB,IAAI;AAElC,UAAM,cAAc,SAAS,MAAM;;AACjC,UAAI,MAAM,UAAU,OAAW,QAAO,MAAM;AAC5C,eAAO,mBAAc,UAAd,mBAAqB,UAAS;AAAA,IACvC,CAAC;AAED;AAAA,MACE,CAAC,WAAW,MAAM,MAAM,YAAY,MAAM,MAAM,WAAW,WAAW;AAAA,MACtE,CAAC,CAAC,QAAQ,OAAO,SAAS,KAAK,GAAG,GAAG,cAAc;AACjD,aAAK,QAAQ;AAEb,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,cAAM,aAAa,OAAO,sBAAsB;AAAA,UAC9C,YAAY;AAAA,UACZ,WAAW;AAAA,UACX;AAAA,UACA,cAAc,CAAC,YAAY;AACzB,iBAAK,QAAQ;AAAA,UACf;AAAA,QAAA,CACD;AAED,kBAAU,MAAM;AACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;aA1EV,KAAA,sBADRV,mBAeE,OAAA;AAAA;QAbC,OAAKG,eAAA;AAAA;;UAA4E,MAAA,GAAA,KAAA,MAAK,OAAO,IAAI,YAAA,KAAW;AAAA,UAAoB,KAAA,GAAA,KAAA,MAAK,OAAO,IAAI,YAAA,KAAW;AAAA,UAAsB,OAAA,GAAA,KAAA,MAAK,KAAK,QAAQ,YAAA,KAAW;AAAA,UAAuB,QAAA,GAAA,KAAA,MAAK,KAAK,SAAS,YAAA,KAAW;AAAA,gCAAkC,QAAA,MAAM;AAAA,sBAAsB,QAAA;AAAA;;;QAYjU,sBAAO,QAAA,SAAS;AAAA,MAAA;;;;ACLd,MAAM,yBAAyB,oBAAoBQ,wBAA0B,EACjF,WAAWC,WAAe,EAC1B,MAAA;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/vue/hooks/use-selection.ts","../../src/vue/components/text-selection.vue","../../src/vue/components/marquee-selection.vue","../../src/vue/components/selection-layer.vue","../../src/vue/components/copy-to-clipboard.vue","../../src/vue/index.ts"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport { SelectionPlugin } from '@embedpdf/plugin-selection';\n\n/**\n * Hook to get the selection plugin's capability API.\n * This provides methods for controlling and listening to selection events.\n */\nexport const useSelectionCapability = () => useCapability<SelectionPlugin>(SelectionPlugin.id);\n\n/**\n * Hook to get the raw selection plugin instance.\n * Useful for accessing plugin-specific properties or methods not exposed in the capability.\n */\nexport const useSelectionPlugin = () => usePlugin<SelectionPlugin>(SelectionPlugin.id);\n","<script setup lang=\"ts\">\nimport { ref, watch, computed, useSlots, type VNode } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { Rotation, type Rect } from '@embedpdf/models';\nimport type { SelectionMenuPlacement } from '@embedpdf/plugin-selection';\nimport { CounterRotate, type MenuWrapperProps } from '@embedpdf/utils/vue';\nimport { useSelectionPlugin } from '../hooks/use-selection';\nimport type { SelectionSelectionContext, SelectionSelectionMenuRenderFn } from '../types';\n\ninterface TextSelectionProps {\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: Rotation;\n /** Background color for text selection highlights. Default: 'rgba(33,150,243)' */\n background?: string;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: SelectionSelectionMenuRenderFn;\n}\n\nconst props = withDefaults(defineProps<TextSelectionProps>(), {\n background: 'rgba(33,150,243)',\n rotation: Rotation.Degree0,\n});\n\nconst slots = useSlots();\nconst { plugin: selPlugin } = useSelectionPlugin();\nconst documentState = useDocumentState(() => props.documentId);\nconst page = computed(() => documentState.value?.document?.pages?.[props.pageIndex]);\nconst rects = ref<Rect[]>([]);\nconst boundingRect = ref<Rect | null>(null);\nconst placement = ref<SelectionMenuPlacement | null>(null);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nconst actualRotation = computed(() => {\n if (props.rotation !== undefined) return props.rotation;\n // Combine page intrinsic rotation with document rotation\n const pageRotation = page.value?.rotation ?? 0;\n const docRotation = documentState.value?.rotation ?? 0;\n return ((pageRotation + docRotation) % 4) as Rotation;\n});\n\n// Check if menu should render: placement is valid AND (render fn OR slot exists)\nconst shouldRenderMenu = computed(() => {\n if (!placement.value) return false;\n if (placement.value.pageIndex !== props.pageIndex) return false;\n if (!placement.value.isVisible) return false;\n\n // Must have either render function or slot\n return !!props.selectionMenu || !!slots['selection-menu'];\n});\n\nwatch(\n [() => selPlugin.value, () => props.documentId, () => props.pageIndex],\n ([plugin, docId, pageIdx], _, onCleanup) => {\n if (!plugin || !docId) {\n rects.value = [];\n boundingRect.value = null;\n return;\n }\n\n const unregister = plugin.registerSelectionOnPage({\n documentId: docId,\n pageIndex: pageIdx,\n onRectsChange: ({ rects: newRects, boundingRect: newBoundingRect }) => {\n rects.value = newRects;\n boundingRect.value = newBoundingRect;\n },\n });\n\n onCleanup(unregister);\n },\n { immediate: true },\n);\n\nwatch(\n [() => selPlugin.value, () => props.documentId],\n ([plugin, docId], _, onCleanup) => {\n if (!plugin || !docId) {\n placement.value = null;\n return;\n }\n\n const unsubscribe = plugin.onMenuPlacement(docId, (newPlacement) => {\n placement.value = newPlacement;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n);\n\n// --- Selection Menu Logic ---\n\n// Build context object for selection menu\nconst buildContext = (): SelectionSelectionContext => ({\n type: 'selection',\n pageIndex: props.pageIndex,\n});\n\n// Build placement hints from plugin placement data\nconst buildMenuPlacement = () => ({\n suggestTop: placement.value?.suggestTop ?? false,\n spaceAbove: placement.value?.spaceAbove ?? 0,\n spaceBelow: placement.value?.spaceBelow ?? 0,\n});\n\n// Render via function (for schema-driven approach)\nconst renderSelectionMenu = (rect: Rect, menuWrapperProps: MenuWrapperProps): VNode | null => {\n if (!props.selectionMenu) return null;\n\n return props.selectionMenu({\n rect,\n menuWrapperProps,\n selected: true, // Selection is always \"selected\" when visible\n placement: buildMenuPlacement(),\n context: buildContext(),\n });\n};\n</script>\n\n<template>\n <template v-if=\"boundingRect\">\n <div\n :style=\"{\n position: 'absolute',\n left: `${boundingRect.origin.x * actualScale}px`,\n top: `${boundingRect.origin.y * actualScale}px`,\n width: `${boundingRect.size.width * actualScale}px`,\n height: `${boundingRect.size.height * actualScale}px`,\n mixBlendMode: 'multiply',\n isolation: 'isolate',\n pointerEvents: 'none',\n }\"\n >\n <div\n v-for=\"(rect, i) in rects\"\n :key=\"i\"\n :style=\"{\n position: 'absolute',\n left: `${(rect.origin.x - boundingRect.origin.x) * actualScale}px`,\n top: `${(rect.origin.y - boundingRect.origin.y) * actualScale}px`,\n width: `${rect.size.width * actualScale}px`,\n height: `${rect.size.height * actualScale}px`,\n background: background,\n }\"\n />\n </div>\n\n <!-- Selection Menu: Supports BOTH render function and slot -->\n <CounterRotate\n v-if=\"shouldRenderMenu\"\n :rect=\"{\n origin: {\n x: placement!.rect.origin.x * actualScale,\n y: placement!.rect.origin.y * actualScale,\n },\n size: {\n width: placement!.rect.size.width * actualScale,\n height: placement!.rect.size.height * actualScale,\n },\n }\"\n :rotation=\"actualRotation\"\n >\n <template #default=\"{ rect, menuWrapperProps }\">\n <!-- Priority 1: Render function prop (schema-driven) -->\n <component v-if=\"selectionMenu\" :is=\"renderSelectionMenu(rect, menuWrapperProps)\" />\n\n <!-- Priority 2: Slot (manual customization) -->\n <slot\n v-else\n name=\"selection-menu\"\n :context=\"buildContext()\"\n :selected=\"true\"\n :rect=\"rect\"\n :placement=\"buildMenuPlacement()\"\n :menuWrapperProps=\"menuWrapperProps\"\n />\n </template>\n </CounterRotate>\n </template>\n</template>\n","<template>\n <div\n v-if=\"rect\"\n :style=\"{\n position: 'absolute',\n pointerEvents: 'none',\n left: `${rect.origin.x * actualScale}px`,\n top: `${rect.origin.y * actualScale}px`,\n width: `${rect.size.width * actualScale}px`,\n height: `${rect.size.height * actualScale}px`,\n border: `1px ${resolvedBorderStyle} ${resolvedBorderColor}`,\n background: resolvedBackground,\n boxSizing: 'border-box',\n zIndex: 1000,\n }\"\n :class=\"className\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport type { Rect } from '@embedpdf/models';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport { useSelectionPlugin } from '../hooks';\n\ninterface MarqueeSelectionProps {\n /** The ID of the document */\n documentId: string;\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page (optional, defaults to document scale) */\n scale?: number;\n /** Optional CSS class applied to the marquee rectangle */\n className?: string;\n /** Fill/background color inside the marquee rectangle. Default: 'rgba(0,122,204,0.15)' */\n background?: string;\n /** Border color of the marquee rectangle. Default: 'rgba(0,122,204,0.8)' */\n borderColor?: string;\n /** Border style. Default: 'dashed' */\n borderStyle?: 'solid' | 'dashed' | 'dotted';\n /**\n * @deprecated Use `borderColor` instead.\n */\n stroke?: string;\n /**\n * @deprecated Use `background` instead.\n */\n fill?: string;\n}\n\nconst props = withDefaults(defineProps<MarqueeSelectionProps>(), {\n borderStyle: 'dashed',\n});\n\n// Resolve deprecated props: new CSS-standard props take precedence\nconst resolvedBorderColor = computed(\n () => props.borderColor ?? props.stroke ?? 'rgba(0,122,204,0.8)',\n);\nconst resolvedBackground = computed(() => props.background ?? props.fill ?? 'rgba(0,122,204,0.15)');\nconst resolvedBorderStyle = computed(() => props.borderStyle);\n\nconst { plugin: selPlugin } = useSelectionPlugin();\nconst documentState = useDocumentState(() => props.documentId);\nconst rect = ref<Rect | null>(null);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nwatch(\n [selPlugin, () => props.documentId, () => props.pageIndex, actualScale],\n ([plugin, docId, pageIdx, scale], _, onCleanup) => {\n rect.value = null;\n\n if (!plugin) {\n return;\n }\n\n const unregister = plugin.registerMarqueeOnPage({\n documentId: docId,\n pageIndex: pageIdx,\n scale,\n onRectChange: (newRect) => {\n rect.value = newRect;\n },\n });\n\n onCleanup(() => {\n unregister?.();\n });\n },\n { immediate: true },\n);\n</script>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { Rotation } from '@embedpdf/models';\nimport type { TextSelectionStyle, MarqueeSelectionStyle } from '@embedpdf/plugin-selection';\nimport type { SelectionSelectionMenuRenderFn } from '../types';\nimport TextSelection from './text-selection.vue';\nimport MarqueeSelection from './marquee-selection.vue';\n\ninterface SelectionLayerProps {\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: Rotation;\n /**\n * @deprecated Use `textStyle.background` instead.\n * Background color for selection rectangles.\n */\n background?: string;\n /** Styling options for text selection highlights */\n textStyle?: TextSelectionStyle;\n /** Styling options for the marquee selection rectangle */\n marqueeStyle?: MarqueeSelectionStyle;\n /** Optional CSS class applied to the marquee rectangle */\n marqueeClassName?: string;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: SelectionSelectionMenuRenderFn;\n}\n\nconst props = withDefaults(defineProps<SelectionLayerProps>(), {\n rotation: Rotation.Degree0,\n});\n\nconst resolvedTextBackground = computed(() => props.textStyle?.background ?? props.background);\n</script>\n\n<template>\n <TextSelection\n :document-id=\"documentId\"\n :page-index=\"pageIndex\"\n :scale=\"scale\"\n :rotation=\"rotation\"\n :background=\"resolvedTextBackground\"\n :selection-menu=\"selectionMenu\"\n >\n <template #selection-menu=\"menuProps\">\n <slot name=\"selection-menu\" v-bind=\"menuProps\" />\n </template>\n </TextSelection>\n <MarqueeSelection\n :document-id=\"documentId\"\n :page-index=\"pageIndex\"\n :scale=\"scale\"\n :background=\"marqueeStyle?.background\"\n :border-color=\"marqueeStyle?.borderColor\"\n :border-style=\"marqueeStyle?.borderStyle\"\n :class-name=\"marqueeClassName\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { watchEffect } from 'vue';\nimport { useSelectionCapability } from '../hooks';\n\nconst { provides: sel } = useSelectionCapability();\n\n// This effect runs when the component is mounted and the capability is available.\n// It automatically handles unsubscribing when the component is unmounted.\nwatchEffect((onCleanup) => {\n if (sel.value) {\n const unsubscribe = sel.value.onCopyToClipboard(({ text }) => {\n // Use the Clipboard API to write the text\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('Failed to copy text to clipboard:', err);\n });\n });\n\n // Register the cleanup function to run on unmount or re-run\n onCleanup(unsubscribe);\n }\n});\n</script>\n\n<template>\n <!-- This component renders nothing to the DOM -->\n</template>\n","import { createPluginPackage } from '@embedpdf/core';\nimport { SelectionPluginPackage as BaseSelectionPluginPackage } from '@embedpdf/plugin-selection';\n\nimport { CopyToClipboard } from './components';\n\nexport * from './hooks';\nexport * from './components';\nexport * from './types';\nexport * from '@embedpdf/plugin-selection';\n\nexport const SelectionPluginPackage = createPluginPackage(BaseSelectionPluginPackage)\n .addUtility(CopyToClipboard)\n .build();\n"],"names":["_createElementBlock","_Fragment","_createElementVNode","_normalizeStyle","_openBlock","_renderList","_createBlock","_unref","_withCtx","_resolveDynamicComponent","_renderSlot","_createVNode","TextSelection","MarqueeSelection","BaseSelectionPluginPackage","CopyToClipboard"],"mappings":";;;;;;;AAOO,MAAM,yBAAyB,MAAM,cAA+B,gBAAgB,EAAE;AAMtF,MAAM,qBAAqB,MAAM,UAA2B,gBAAgB,EAAE;;;;;;;;;;;;ACOrF,UAAM,QAAQ;AAKd,UAAM,QAAQ,SAAA;AACd,UAAM,EAAE,QAAQ,UAAA,IAAc,mBAAA;AAC9B,UAAM,gBAAgB,iBAAiB,MAAM,MAAM,UAAU;AAC7D,UAAM,OAAO,SAAS,MAAA;;AAAM,6CAAc,UAAd,mBAAqB,aAArB,mBAA+B,UAA/B,mBAAuC,MAAM;AAAA,KAAU;AACnF,UAAM,QAAQ,IAAY,EAAE;AAC5B,UAAM,eAAe,IAAiB,IAAI;AAC1C,UAAM,YAAY,IAAmC,IAAI;AAEzD,UAAM,cAAc,SAAS,MAAM;;AACjC,UAAI,MAAM,UAAU,OAAW,QAAO,MAAM;AAC5C,eAAO,mBAAc,UAAd,mBAAqB,UAAS;AAAA,IACvC,CAAC;AAED,UAAM,iBAAiB,SAAS,MAAM;;AACpC,UAAI,MAAM,aAAa,OAAW,QAAO,MAAM;AAE/C,YAAM,iBAAe,UAAK,UAAL,mBAAY,aAAY;AAC7C,YAAM,gBAAc,mBAAc,UAAd,mBAAqB,aAAY;AACrD,cAAS,eAAe,eAAe;AAAA,IACzC,CAAC;AAGD,UAAM,mBAAmB,SAAS,MAAM;AACtC,UAAI,CAAC,UAAU,MAAO,QAAO;AAC7B,UAAI,UAAU,MAAM,cAAc,MAAM,UAAW,QAAO;AAC1D,UAAI,CAAC,UAAU,MAAM,UAAW,QAAO;AAGvC,aAAO,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC,MAAM,gBAAgB;AAAA,IAC1D,CAAC;AAED;AAAA,MACE,CAAC,MAAM,UAAU,OAAO,MAAM,MAAM,YAAY,MAAM,MAAM,SAAS;AAAA,MACrE,CAAC,CAAC,QAAQ,OAAO,OAAO,GAAG,GAAG,cAAc;AAC1C,YAAI,CAAC,UAAU,CAAC,OAAO;AACrB,gBAAM,QAAQ,CAAA;AACd,uBAAa,QAAQ;AACrB;AAAA,QACF;AAEA,cAAM,aAAa,OAAO,wBAAwB;AAAA,UAChD,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,eAAe,CAAC,EAAE,OAAO,UAAU,cAAc,sBAAsB;AACrE,kBAAM,QAAQ;AACd,yBAAa,QAAQ;AAAA,UACvB;AAAA,QAAA,CACD;AAED,kBAAU,UAAU;AAAA,MACtB;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAGpB;AAAA,MACE,CAAC,MAAM,UAAU,OAAO,MAAM,MAAM,UAAU;AAAA,MAC9C,CAAC,CAAC,QAAQ,KAAK,GAAG,GAAG,cAAc;AACjC,YAAI,CAAC,UAAU,CAAC,OAAO;AACrB,oBAAU,QAAQ;AAClB;AAAA,QACF;AAEA,cAAM,cAAc,OAAO,gBAAgB,OAAO,CAAC,iBAAiB;AAClE,oBAAU,QAAQ;AAAA,QACpB,CAAC;AAED,kBAAU,WAAW;AAAA,MACvB;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;AAMpB,UAAM,eAAe,OAAkC;AAAA,MACrD,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,IAAA;AAInB,UAAM,qBAAqB,MAAA;;AAAO;AAAA,QAChC,cAAY,eAAU,UAAV,mBAAiB,eAAc;AAAA,QAC3C,cAAY,eAAU,UAAV,mBAAiB,eAAc;AAAA,QAC3C,cAAY,eAAU,UAAV,mBAAiB,eAAc;AAAA,MAAA;AAAA;AAI7C,UAAM,sBAAsB,CAAC,MAAY,qBAAqD;AAC5F,UAAI,CAAC,MAAM,cAAe,QAAO;AAEjC,aAAO,MAAM,cAAc;AAAA,QACzB;AAAA,QACA;AAAA,QACA,UAAU;AAAA;AAAA,QACV,WAAW,mBAAA;AAAA,QACX,SAAS,aAAA;AAAA,MAAa,CACvB;AAAA,IACH;;aAIkB,aAAA,sBAAhBA,mBA0DWC,UAAA,EAAA,KAAA,KAAA;AAAA,QAzDTC,mBAwBM,OAAA;AAAA,UAvBH,OAAKC,eAAA;AAAA;YAAmD,MAAA,GAAA,aAAA,MAAa,OAAO,IAAI,YAAA,KAAW;AAAA,YAAsB,KAAA,GAAA,aAAA,MAAa,OAAO,IAAI,YAAA,KAAW;AAAA,YAAwB,OAAA,GAAA,aAAA,MAAa,KAAK,QAAQ,YAAA,KAAW;AAAA,YAAyB,QAAA,GAAA,aAAA,MAAa,KAAK,SAAS,YAAA,KAAW;AAAA;;;;;WAWjRC,UAAA,IAAA,GAAAJ,mBAWEC,UAAA,MAAAI,WAVoB,MAAA,OAAK,CAAjB,MAAM,MAAC;gCADjBL,mBAWE,OAAA;AAAA,cATC,KAAK;AAAA,cACL,OAAKG,eAAA;AAAA;0BAAwD,KAAK,OAAO,IAAI,aAAA,MAAa,OAAO,KAAK,YAAA,KAAW;AAAA,yBAAyB,KAAK,OAAO,IAAI,aAAA,MAAa,OAAO,KAAK,YAAA,KAAW;AAAA,gBAA0B,OAAA,GAAA,KAAK,KAAK,QAAQ,YAAA,KAAW;AAAA,gBAA2B,QAAA,GAAA,KAAK,KAAK,SAAS,YAAA,KAAW;AAAA,4BAA4B,QAAA;AAAA,cAAA;;;;QAavU,iBAAA,sBADRG,YA6BgBC,MAAA,aAAA,GAAA;AAAA;UA3Bb,MAAI;AAAA;cAAmC,GAAA,UAAA,MAAW,KAAK,OAAO,IAAI,YAAA;AAAA,cAA0B,GAAA,UAAA,MAAW,KAAK,OAAO,IAAI,YAAA;AAAA,YAAA;AAAA;cAAyD,OAAA,UAAA,MAAW,KAAK,KAAK,QAAQ,YAAA;AAAA,cAA+B,QAAA,UAAA,MAAW,KAAK,KAAK,SAAS,YAAA;AAAA,YAAA;AAAA;UAU1Q,UAAU,eAAA;AAAA,QAAA;UAEA,SAAOC,QAEhB,CAAoF,EAFhE,MAAM,uBAAgB;AAAA,YAEzB,QAAA,iBAAjBJ,UAAA,GAAAE,YAAoFG,wBAA/C,oBAAoB,MAAM,gBAAgB,CAAA,GAAA,EAAA,KAAA,EAAA,CAAA,KAG/EC,WAQE,KAAA,QAAA,kBAAA;AAAA;cALC,SAAS,aAAA;AAAA,cACT,UAAU;AAAA,cACV;AAAA,cACA,WAAW,mBAAA;AAAA,cACX;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;AClIX,UAAM,QAAQ;AAKd,UAAM,sBAAsB;AAAA,MAC1B,MAAM,MAAM,eAAe,MAAM,UAAU;AAAA,IAAA;AAE7C,UAAM,qBAAqB,SAAS,MAAM,MAAM,cAAc,MAAM,QAAQ,sBAAsB;AAClG,UAAM,sBAAsB,SAAS,MAAM,MAAM,WAAW;AAE5D,UAAM,EAAE,QAAQ,UAAA,IAAc,mBAAA;AAC9B,UAAM,gBAAgB,iBAAiB,MAAM,MAAM,UAAU;AAC7D,UAAM,OAAO,IAAiB,IAAI;AAElC,UAAM,cAAc,SAAS,MAAM;;AACjC,UAAI,MAAM,UAAU,OAAW,QAAO,MAAM;AAC5C,eAAO,mBAAc,UAAd,mBAAqB,UAAS;AAAA,IACvC,CAAC;AAED;AAAA,MACE,CAAC,WAAW,MAAM,MAAM,YAAY,MAAM,MAAM,WAAW,WAAW;AAAA,MACtE,CAAC,CAAC,QAAQ,OAAO,SAAS,KAAK,GAAG,GAAG,cAAc;AACjD,aAAK,QAAQ;AAEb,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,cAAM,aAAa,OAAO,sBAAsB;AAAA,UAC9C,YAAY;AAAA,UACZ,WAAW;AAAA,UACX;AAAA,UACA,cAAc,CAAC,YAAY;AACzB,iBAAK,QAAQ;AAAA,UACf;AAAA,QAAA,CACD;AAED,kBAAU,MAAM;AACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;aA1FV,KAAA,sBADRV,mBAeE,OAAA;AAAA;QAbC,OAAKG,eAAA;AAAA;;UAA4E,MAAA,GAAA,KAAA,MAAK,OAAO,IAAI,YAAA,KAAW;AAAA,UAAoB,KAAA,GAAA,KAAA,MAAK,OAAO,IAAI,YAAA,KAAW;AAAA,UAAsB,OAAA,GAAA,KAAA,MAAK,KAAK,QAAQ,YAAA,KAAW;AAAA,UAAuB,QAAA,GAAA,KAAA,MAAK,KAAK,SAAS,YAAA,KAAW;AAAA,UAA2B,QAAA,OAAA,oBAAA,KAAmB,IAAI,oBAAA,KAAmB;AAAA,sBAAsB,mBAAA;AAAA;;;QAY9V,sBAAO,QAAA,SAAS;AAAA,MAAA;;;;;;;;;;;;;;;;;;ACarB,UAAM,QAAQ;AAId,UAAM,yBAAyB,SAAS,MAAA;;AAAM,0BAAM,cAAN,mBAAiB,eAAc,MAAM;AAAA,KAAU;;;;QAI3FQ,YAWgBC,aAAA;AAAA,UAVb,eAAa,QAAA;AAAA,UACb,cAAY,QAAA;AAAA,UACZ,OAAO,QAAA;AAAA,UACP,UAAU,QAAA;AAAA,UACV,YAAY,uBAAA;AAAA,UACZ,kBAAgB,QAAA;AAAA,QAAA;UAEN,kBAAcJ,QACvB,CAAiD,cADf;AAAA,YAClCE,WAAiD,iEAAb,SAAS,CAAA,CAAA;AAAA,UAAA;;;QAGjDC,YAQEE,aAAA;AAAA,UAPC,eAAa,QAAA;AAAA,UACb,cAAY,QAAA;AAAA,UACZ,OAAO,QAAA;AAAA,UACP,aAAY,aAAA,iBAAA,mBAAc;AAAA,UAC1B,iBAAc,aAAA,iBAAA,mBAAc;AAAA,UAC5B,iBAAc,aAAA,iBAAA,mBAAc;AAAA,UAC5B,cAAY,QAAA;AAAA,QAAA;;;;;;;;ACnDjB,UAAM,EAAE,UAAU,IAAA,IAAQ,uBAAA;AAI1B,gBAAY,CAAC,cAAc;AACzB,UAAI,IAAI,OAAO;AACb,cAAM,cAAc,IAAI,MAAM,kBAAkB,CAAC,EAAE,WAAW;AAE5D,oBAAU,UAAU,UAAU,IAAI,EAAE,MAAM,CAAC,QAAQ;AACjD,oBAAQ,MAAM,qCAAqC,GAAG;AAAA,UACxD,CAAC;AAAA,QACH,CAAC;AAGD,kBAAU,WAAW;AAAA,MACvB;AAAA,IACF,CAAC;;;;;;ACVM,MAAM,yBAAyB,oBAAoBC,wBAA0B,EACjF,WAAWC,SAAe,EAC1B,MAAA;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-selection",
3
- "version": "2.4.1",
3
+ "version": "2.6.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -34,17 +34,17 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@embedpdf/models": "2.4.1",
38
- "@embedpdf/utils": "2.4.1"
37
+ "@embedpdf/utils": "2.6.0",
38
+ "@embedpdf/models": "2.6.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/react": "^18.2.0",
42
42
  "typescript": "^5.0.0",
43
+ "@embedpdf/core": "2.6.0",
44
+ "@embedpdf/plugin-viewport": "2.6.0",
43
45
  "@embedpdf/build": "1.1.0",
44
- "@embedpdf/core": "2.4.1",
45
- "@embedpdf/plugin-viewport": "2.4.1",
46
- "@embedpdf/plugin-interaction-manager": "2.4.1",
47
- "@embedpdf/plugin-scroll": "2.4.1"
46
+ "@embedpdf/plugin-interaction-manager": "2.6.0",
47
+ "@embedpdf/plugin-scroll": "2.6.0"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "react": ">=16.8.0",
@@ -52,8 +52,8 @@
52
52
  "preact": "^10.26.4",
53
53
  "vue": ">=3.2.0",
54
54
  "svelte": ">=5 <6",
55
- "@embedpdf/core": "2.4.1",
56
- "@embedpdf/plugin-interaction-manager": "2.4.1"
55
+ "@embedpdf/core": "2.6.0",
56
+ "@embedpdf/plugin-interaction-manager": "2.6.0"
57
57
  },
58
58
  "files": [
59
59
  "dist",