@embedpdf/plugin-search 2.15.0 → 3.0.0-next.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 (61) hide show
  1. package/LICENSE +192 -21
  2. package/dist/index.cjs +363 -2
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +156 -0
  5. package/dist/index.d.ts +156 -1
  6. package/dist/index.js +346 -433
  7. package/dist/index.js.map +1 -1
  8. package/package.json +21 -57
  9. package/dist/lib/actions.d.ts +0 -91
  10. package/dist/lib/index.d.ts +0 -10
  11. package/dist/lib/manifest.d.ts +0 -4
  12. package/dist/lib/reducer.d.ts +0 -6
  13. package/dist/lib/search-plugin.d.ts +0 -32
  14. package/dist/lib/types.d.ts +0 -165
  15. package/dist/preact/adapter.d.ts +0 -5
  16. package/dist/preact/core.d.ts +0 -1
  17. package/dist/preact/index.cjs +0 -2
  18. package/dist/preact/index.cjs.map +0 -1
  19. package/dist/preact/index.d.ts +0 -1
  20. package/dist/preact/index.js +0 -107
  21. package/dist/preact/index.js.map +0 -1
  22. package/dist/react/adapter.d.ts +0 -2
  23. package/dist/react/core.d.ts +0 -1
  24. package/dist/react/index.cjs +0 -2
  25. package/dist/react/index.cjs.map +0 -1
  26. package/dist/react/index.d.ts +0 -1
  27. package/dist/react/index.js +0 -106
  28. package/dist/react/index.js.map +0 -1
  29. package/dist/shared/components/index.d.ts +0 -1
  30. package/dist/shared/components/search-layer.d.ts +0 -11
  31. package/dist/shared/hooks/index.d.ts +0 -1
  32. package/dist/shared/hooks/use-search.d.ts +0 -15
  33. package/dist/shared/index.d.ts +0 -3
  34. package/dist/shared-preact/components/index.d.ts +0 -1
  35. package/dist/shared-preact/components/search-layer.d.ts +0 -11
  36. package/dist/shared-preact/hooks/index.d.ts +0 -1
  37. package/dist/shared-preact/hooks/use-search.d.ts +0 -15
  38. package/dist/shared-preact/index.d.ts +0 -3
  39. package/dist/shared-react/components/index.d.ts +0 -1
  40. package/dist/shared-react/components/search-layer.d.ts +0 -11
  41. package/dist/shared-react/hooks/index.d.ts +0 -1
  42. package/dist/shared-react/hooks/use-search.d.ts +0 -15
  43. package/dist/shared-react/index.d.ts +0 -3
  44. package/dist/svelte/components/SearchLayer.svelte.d.ts +0 -11
  45. package/dist/svelte/components/index.d.ts +0 -1
  46. package/dist/svelte/hooks/index.d.ts +0 -1
  47. package/dist/svelte/hooks/use-search.svelte.d.ts +0 -21
  48. package/dist/svelte/index.cjs +0 -2
  49. package/dist/svelte/index.cjs.map +0 -1
  50. package/dist/svelte/index.d.ts +0 -3
  51. package/dist/svelte/index.js +0 -134
  52. package/dist/svelte/index.js.map +0 -1
  53. package/dist/vue/components/index.d.ts +0 -1
  54. package/dist/vue/components/search-layer.vue.d.ts +0 -13
  55. package/dist/vue/hooks/index.d.ts +0 -1
  56. package/dist/vue/hooks/use-search.d.ts +0 -12
  57. package/dist/vue/index.cjs +0 -2
  58. package/dist/vue/index.cjs.map +0 -1
  59. package/dist/vue/index.d.ts +0 -3
  60. package/dist/vue/index.js +0 -131
  61. package/dist/vue/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-search.svelte.ts","../../src/svelte/components/SearchLayer.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport {\n SearchPlugin,\n SearchDocumentState,\n SearchScope,\n initialSearchDocumentState,\n} from '@embedpdf/plugin-search';\n\nexport const useSearchPlugin = () => usePlugin<SearchPlugin>(SearchPlugin.id);\nexport const useSearchCapability = () => useCapability<SearchPlugin>(SearchPlugin.id);\n\n// Define the return type explicitly to maintain type safety\ninterface UseSearchReturn {\n provides: SearchScope | null;\n state: SearchDocumentState;\n}\n\n/**\n * Hook for search state for a specific document\n * @param getDocumentId Function that returns the document ID\n */\nexport const useSearch = (getDocumentId: () => string | null): UseSearchReturn => {\n const capability = useSearchCapability();\n\n let searchState = $state<SearchDocumentState>(initialSearchDocumentState);\n\n // Reactive documentId\n const documentId = $derived(getDocumentId());\n\n // Scoped capability for current docId\n const scopedProvides = $derived(\n capability.provides && documentId ? capability.provides.forDocument(documentId) : null,\n );\n\n $effect(() => {\n const provides = capability.provides;\n const docId = documentId;\n\n if (!provides || !docId) {\n searchState = initialSearchDocumentState;\n return;\n }\n\n const scope = provides.forDocument(docId);\n\n // Set initial state\n searchState = scope.getState();\n\n // Subscribe to changes\n return scope.onStateChange((state) => {\n searchState = state;\n });\n });\n\n return {\n get provides() {\n return scopedProvides;\n },\n get state() {\n return searchState;\n },\n };\n};\n","<script lang=\"ts\">\n import type { SearchResultState } from '@embedpdf/plugin-search';\n import { useDocumentState } from '@embedpdf/core/svelte';\n import { useSearchCapability } from '../hooks';\n import type { HTMLAttributes } from 'svelte/elements';\n\n interface SearchLayerProps extends HTMLAttributes<HTMLDivElement> {\n documentId: string;\n pageIndex: number;\n scale?: number;\n highlightColor?: string;\n activeHighlightColor?: string;\n }\n\n let {\n documentId,\n pageIndex,\n scale: scaleOverride,\n highlightColor = '#FFFF00',\n activeHighlightColor = '#FFBF00',\n ...divProps\n }: SearchLayerProps = $props();\n\n const searchCapability = useSearchCapability();\n const documentState = useDocumentState(() => documentId);\n\n let searchResultState = $state<SearchResultState | null>(null);\n\n const scope = $derived(searchCapability.provides?.forDocument(documentId) ?? null);\n\n const actualScale = $derived(\n scaleOverride !== undefined ? scaleOverride : (documentState.current?.scale ?? 1),\n );\n\n $effect(() => {\n if (!scope) {\n searchResultState = null;\n return;\n }\n\n // Set initial state\n const currentState = scope.getState();\n searchResultState = {\n results: currentState.results,\n activeResultIndex: currentState.activeResultIndex,\n showAllResults: currentState.showAllResults,\n active: currentState.active,\n };\n\n // Subscribe to changes\n return scope.onSearchResultStateChange((state) => {\n searchResultState = state;\n });\n });\n\n // Filter results for current page while preserving original indices\n const pageResults = $derived(\n searchResultState\n ? searchResultState.results\n .map((result, originalIndex) => ({ result, originalIndex }))\n .filter(({ result }) => result.pageIndex === pageIndex)\n : [],\n );\n\n // Decide which results to show\n const resultsToShow = $derived(\n searchResultState\n ? pageResults.filter(\n ({ originalIndex }) =>\n searchResultState!.showAllResults ||\n originalIndex === searchResultState!.activeResultIndex,\n )\n : [],\n );\n</script>\n\n{#if searchResultState && searchResultState.active}\n <div style:pointer-events=\"none\" {...divProps}>\n {#each resultsToShow as { result, originalIndex }, idx (`result-${idx}`)}\n {#each result.rects as rect, rectIdx (`rect-${idx}-${rectIdx}`)}\n <div\n style:position=\"absolute\"\n style:top=\"{rect.origin.y * actualScale}px\"\n style:left=\"{rect.origin.x * actualScale}px\"\n style:width=\"{rect.size.width * actualScale}px\"\n style:height=\"{rect.size.height * actualScale}px\"\n style:background-color={originalIndex === searchResultState.activeResultIndex\n ? activeHighlightColor\n : highlightColor}\n style:mix-blend-mode=\"multiply\"\n style:transform=\"scale(1.02)\"\n style:transform-origin=\"center\"\n style:transition=\"opacity .3s ease-in-out\"\n style:opacity=\"1\"\n ></div>\n {/each}\n {/each}\n </div>\n{/if}\n"],"names":["$$anchor"],"mappings":"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"}
@@ -1 +0,0 @@
1
- export { default as SearchLayer } from './search-layer.vue';
@@ -1,13 +0,0 @@
1
- interface SearchLayerProps {
2
- documentId: string;
3
- pageIndex: number;
4
- scale?: number;
5
- highlightColor?: string;
6
- activeHighlightColor?: string;
7
- }
8
- declare const __VLS_export: import('vue').DefineComponent<SearchLayerProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<SearchLayerProps> & Readonly<{}>, {
9
- highlightColor: string;
10
- activeHighlightColor: string;
11
- }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
- declare const _default: typeof __VLS_export;
13
- export default _default;
@@ -1 +0,0 @@
1
- export * from './use-search';
@@ -1,12 +0,0 @@
1
- import { MaybeRefOrGetter, Ref, ComputedRef } from 'vue';
2
- import { SearchPlugin, SearchDocumentState, SearchScope } from '../../lib/index.ts';
3
- export declare const useSearchPlugin: () => import('@embedpdf/core/vue').PluginState<SearchPlugin>;
4
- export declare const useSearchCapability: () => import('@embedpdf/core/vue').CapabilityState<Readonly<import('../../lib/index.ts').SearchCapability>>;
5
- /**
6
- * Hook for search state for a specific document
7
- * @param documentId Document ID (can be ref, computed, getter, or plain value)
8
- */
9
- export declare const useSearch: (documentId: MaybeRefOrGetter<string>) => {
10
- state: Ref<SearchDocumentState>;
11
- provides: ComputedRef<SearchScope | null>;
12
- };
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("@embedpdf/core/vue"),l=require("@embedpdf/plugin-search"),a=()=>t.useCapability(l.SearchPlugin.id),r=e.defineComponent({__name:"search-layer",props:{documentId:{},pageIndex:{},scale:{},highlightColor:{default:"#FFFF00"},activeHighlightColor:{default:"#FFBF00"}},setup(l){const r=l,{provides:o}=a(),n=t.useDocumentState(()=>r.documentId),u=e.ref(null),i=e.computed(()=>{var e;return(null==(e=o.value)?void 0:e.forDocument(r.documentId))??null}),c=e.computed(()=>{var e;return void 0!==r.scale?r.scale:(null==(e=n.value)?void 0:e.scale)??1});e.watch(i,(e,t,l)=>{if(!e)return void(u.value=null);const a=e.getState();u.value={results:a.results,activeResultIndex:a.activeResultIndex,showAllResults:a.showAllResults,active:a.active};l(e.onSearchResultStateChange(e=>{u.value=e}))},{immediate:!0});const s=e.computed(()=>u.value?u.value.results.map((e,t)=>({result:e,originalIndex:t})).filter(({result:e})=>e.pageIndex===r.pageIndex):[]),d=e.computed(()=>u.value?s.value.filter(({originalIndex:e})=>u.value.showAllResults||e===u.value.activeResultIndex):[]);return(t,a)=>u.value&&u.value.active?(e.openBlock(),e.createElementBlock("div",e.mergeProps({key:0,style:{pointerEvents:"none"}},t.$attrs),[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,({result:t,originalIndex:a},r)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:`result-${r}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.rects,(t,o)=>(e.openBlock(),e.createElementBlock("div",{key:`rect-${r}-${o}`,style:e.normalizeStyle({position:"absolute",top:t.origin.y*c.value+"px",left:t.origin.x*c.value+"px",width:t.size.width*c.value+"px",height:t.size.height*c.value+"px",backgroundColor:a===u.value.activeResultIndex?l.activeHighlightColor:l.highlightColor,mixBlendMode:"multiply",transform:"scale(1.02)",transformOrigin:"center",transition:"opacity .3s ease-in-out",opacity:1})},null,4))),128))],64))),128))],16)):e.createCommentVNode("",!0)}});exports.SearchLayer=r,exports.useSearch=t=>{const{provides:r}=a(),o=e.ref(l.initialSearchDocumentState);e.watch([r,()=>e.toValue(t)],([e,t],a,r)=>{if(!e)return void(o.value=l.initialSearchDocumentState);const n=e.forDocument(t);o.value=n.getState();r(n.onStateChange(e=>{o.value=e}))},{immediate:!0});const n=e.computed(()=>{var l;const a=e.toValue(t);return(null==(l=r.value)?void 0:l.forDocument(a))??null});return{state:o,provides:n}},exports.useSearchCapability=a,exports.useSearchPlugin=()=>t.usePlugin(l.SearchPlugin.id),Object.keys(l).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>l[e]})});
2
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/vue/hooks/use-search.ts","../../src/vue/components/search-layer.vue"],"sourcesContent":["import { ref, watch, computed, toValue, type MaybeRefOrGetter, Ref, ComputedRef } from 'vue';\nimport { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n SearchPlugin,\n SearchDocumentState,\n SearchScope,\n initialSearchDocumentState,\n} from '@embedpdf/plugin-search';\n\nexport const useSearchPlugin = () => usePlugin<SearchPlugin>(SearchPlugin.id);\nexport const useSearchCapability = () => useCapability<SearchPlugin>(SearchPlugin.id);\n\n/**\n * Hook for search state for a specific document\n * @param documentId Document ID (can be ref, computed, getter, or plain value)\n */\nexport const useSearch = (\n documentId: MaybeRefOrGetter<string>,\n): {\n state: Ref<SearchDocumentState>;\n provides: ComputedRef<SearchScope | null>;\n} => {\n const { provides } = useSearchCapability();\n const searchState = ref<SearchDocumentState>(initialSearchDocumentState);\n\n watch(\n [provides, () => toValue(documentId)],\n ([providesValue, docId], _, onCleanup) => {\n if (!providesValue) {\n searchState.value = initialSearchDocumentState;\n return;\n }\n\n const scope = providesValue.forDocument(docId);\n\n // Set initial state\n searchState.value = scope.getState();\n\n // Subscribe to changes\n const unsubscribe = scope.onStateChange((state) => {\n searchState.value = state;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n );\n\n const scopedProvides = computed(() => {\n const docId = toValue(documentId);\n return provides.value?.forDocument(docId) ?? null;\n });\n\n return {\n state: searchState,\n provides: scopedProvides,\n };\n};\n","<script setup lang=\"ts\">\nimport { ref, watch, computed } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport type { SearchResultState } from '@embedpdf/plugin-search';\nimport { useSearchCapability } from '../hooks/use-search';\n\ninterface SearchLayerProps {\n documentId: string;\n pageIndex: number;\n scale?: number;\n highlightColor?: string;\n activeHighlightColor?: string;\n}\n\nconst props = withDefaults(defineProps<SearchLayerProps>(), {\n highlightColor: '#FFFF00',\n activeHighlightColor: '#FFBF00',\n});\n\nconst { provides: searchProvides } = useSearchCapability();\nconst documentState = useDocumentState(() => props.documentId);\nconst searchResultState = ref<SearchResultState | null>(null);\n\nconst scope = computed(() => searchProvides.value?.forDocument(props.documentId) ?? null);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nwatch(\n scope,\n (scopeValue, _, onCleanup) => {\n if (!scopeValue) {\n searchResultState.value = null;\n return;\n }\n\n // Set initial state\n const currentState = scopeValue.getState();\n searchResultState.value = {\n results: currentState.results,\n activeResultIndex: currentState.activeResultIndex,\n showAllResults: currentState.showAllResults,\n active: currentState.active,\n };\n\n // Subscribe to changes\n const unsubscribe = scopeValue.onSearchResultStateChange((state) => {\n searchResultState.value = state;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n);\n\n// Filter results for current page while preserving original indices\nconst pageResults = computed(() => {\n if (!searchResultState.value) return [];\n\n return searchResultState.value.results\n .map((result, originalIndex) => ({ result, originalIndex }))\n .filter(({ result }) => result.pageIndex === props.pageIndex);\n});\n\n// Decide which results to show\nconst resultsToShow = computed(() => {\n if (!searchResultState.value) return [];\n\n return pageResults.value.filter(\n ({ originalIndex }) =>\n searchResultState.value!.showAllResults ||\n originalIndex === searchResultState.value!.activeResultIndex,\n );\n});\n</script>\n\n<template>\n <div\n v-if=\"searchResultState && searchResultState.active\"\n :style=\"{\n pointerEvents: 'none',\n }\"\n v-bind=\"$attrs\"\n >\n <template v-for=\"({ result, originalIndex }, idx) in resultsToShow\" :key=\"`result-${idx}`\">\n <div\n v-for=\"(rect, rectIdx) in result.rects\"\n :key=\"`rect-${idx}-${rectIdx}`\"\n :style=\"{\n position: 'absolute',\n top: `${rect.origin.y * actualScale}px`,\n left: `${rect.origin.x * actualScale}px`,\n width: `${rect.size.width * actualScale}px`,\n height: `${rect.size.height * actualScale}px`,\n backgroundColor:\n originalIndex === searchResultState.activeResultIndex\n ? activeHighlightColor\n : highlightColor,\n mixBlendMode: 'multiply',\n transform: 'scale(1.02)',\n transformOrigin: 'center',\n transition: 'opacity .3s ease-in-out',\n opacity: 1,\n }\"\n />\n </template>\n </div>\n</template>\n"],"names":["useSearchCapability","useCapability","SearchPlugin","id","props","__props","provides","searchProvides","documentState","useDocumentState","documentId","searchResultState","ref","scope","computed","_a","value","forDocument","actualScale","scale","watch","scopeValue","_","onCleanup","currentState","getState","results","activeResultIndex","showAllResults","active","onSearchResultStateChange","state","immediate","pageResults","map","result","originalIndex","filter","pageIndex","resultsToShow","_openBlock","_createElementBlock","_mergeProps","style","$attrs","_Fragment","idx","rects","rect","rectIdx","key","_normalizeStyle","top","origin","y","left","x","width","size","height","activeHighlightColor","highlightColor","searchState","initialSearchDocumentState","toValue","providesValue","docId","onStateChange","scopedProvides","usePlugin"],"mappings":"4KAUaA,EAAsB,IAAMC,gBAA4BC,EAAAA,aAAaC,gLCIlF,MAAMC,EAAQC,GAKNC,SAAUC,GAAmBP,IAC/BQ,EAAgBC,EAAAA,iBAAiB,IAAML,EAAMM,YAC7CC,EAAoBC,EAAAA,IAA8B,MAElDC,EAAQC,WAAS,WAAM,OAAA,OAAAC,EAAAR,EAAeS,YAAf,EAAAD,EAAsBE,YAAYb,EAAMM,cAAe,OAE9EQ,EAAcJ,EAAAA,SAAS,WAC3B,YAAoB,IAAhBV,EAAMe,MAA4Bf,EAAMe,OACrC,OAAAJ,EAAAP,EAAcQ,YAAd,EAAAD,EAAqBI,QAAS,IAGvCC,EAAAA,MACEP,EACA,CAACQ,EAAYC,EAAGC,KACd,IAAKF,EAEH,YADAV,EAAkBK,MAAQ,MAK5B,MAAMQ,EAAeH,EAAWI,WAChCd,EAAkBK,MAAQ,CACxBU,QAASF,EAAaE,QACtBC,kBAAmBH,EAAaG,kBAChCC,eAAgBJ,EAAaI,eAC7BC,OAAQL,EAAaK,QAQvBN,EAJoBF,EAAWS,0BAA2BC,IACxDpB,EAAkBK,MAAQe,MAK9B,CAAEC,WAAW,IAIf,MAAMC,EAAcnB,EAAAA,SAAS,IACtBH,EAAkBK,MAEhBL,EAAkBK,MAAMU,QAC5BQ,IAAI,CAACC,EAAQC,KAAA,CAAqBD,SAAQC,mBAC1CC,OAAO,EAAGF,YAAaA,EAAOG,YAAclC,EAAMkC,WAJhB,IAQjCC,EAAgBzB,EAAAA,SAAS,IACxBH,EAAkBK,MAEhBiB,EAAYjB,MAAMqB,OACvB,EAAGD,mBACDzB,EAAkBK,MAAOY,gBACzBQ,IAAkBzB,EAAkBK,MAAOW,mBALV,iBAY7BhB,EAAAK,OAAqBL,EAAAK,MAAkBa,QAD/CW,EAAAA,YAAAC,EAAAA,mBA6BM,MA7BNC,aA6BM,OA3BHC,MAAO,wBAGAC,EAAAA,QAAM,EAEdJ,EAAAA,WAAA,GAAAC,qBAqBWI,EAAAA,2BArB0CN,EAAAvB,MAAa,EAA9CmB,SAAQC,iBAAiBU,kEAAuCA,OAClFN,EAAAA,WAAA,GAAAC,EAAAA,mBAmBEI,6BAlB0BV,EAAOY,MAAK,CAA9BC,EAAMC,mBADhBR,EAAAA,mBAmBE,MAAA,CAjBCS,IAAG,QAAUJ,KAAOG,IACpBN,MAAKQ,EAAAA,eAAA,qBAAsDC,IAAAJ,EAAKK,OAAOC,EAAIpC,EAAAF,MAAhB,KAAoDuC,KAAAP,EAAKK,OAAOG,EAAItC,EAAAF,MAAhB,KAAqDyC,MAAAT,EAAKU,KAAKD,MAAQvC,EAAAF,MAAlB,KAAwD2C,OAAAX,EAAKU,KAAKC,OAASzC,EAAAF,MAAnB,qBAA2EoB,IAAkBzB,EAAAK,MAAkBW,kBAAkCtB,EAAAuD,qBAAqCvD,EAAAwD,oPDzEzZnD,IAKA,MAAMJ,SAAEA,GAAaN,IACf8D,EAAclD,EAAAA,IAAyBmD,8BAE7C3C,EAAAA,MACE,CAACd,EAAU,IAAM0D,UAAQtD,IACzB,EAAEuD,EAAeC,GAAQ5C,EAAGC,KAC1B,IAAK0C,EAEH,YADAH,EAAY9C,MAAQ+C,EAAAA,4BAItB,MAAMlD,EAAQoD,EAAchD,YAAYiD,GAGxCJ,EAAY9C,MAAQH,EAAMY,WAO1BF,EAJoBV,EAAMsD,cAAepC,IACvC+B,EAAY9C,MAAQe,MAKxB,CAAEC,WAAW,IAGf,MAAMoC,EAAiBtD,EAAAA,SAAS,WAC9B,MAAMoD,EAAQF,EAAAA,QAAQtD,GACtB,OAAO,OAAAK,EAAAT,EAASU,YAAT,EAAAD,EAAgBE,YAAYiD,KAAU,OAG/C,MAAO,CACLnC,MAAO+B,EACPxD,SAAU8D,0DA9CiB,IAAMC,YAAwBnE,EAAAA,aAAaC"}
@@ -1,3 +0,0 @@
1
- export * from './hooks';
2
- export * from './components';
3
- export * from '../lib/index.ts';
package/dist/vue/index.js DELETED
@@ -1,131 +0,0 @@
1
- import { ref, watch, toValue, computed, defineComponent, openBlock, createElementBlock, mergeProps, Fragment, renderList, normalizeStyle, createCommentVNode } from "vue";
2
- import { usePlugin, useCapability, useDocumentState } from "@embedpdf/core/vue";
3
- import { SearchPlugin, initialSearchDocumentState } from "@embedpdf/plugin-search";
4
- export * from "@embedpdf/plugin-search";
5
- const useSearchPlugin = () => usePlugin(SearchPlugin.id);
6
- const useSearchCapability = () => useCapability(SearchPlugin.id);
7
- const useSearch = (documentId) => {
8
- const { provides } = useSearchCapability();
9
- const searchState = ref(initialSearchDocumentState);
10
- watch(
11
- [provides, () => toValue(documentId)],
12
- ([providesValue, docId], _, onCleanup) => {
13
- if (!providesValue) {
14
- searchState.value = initialSearchDocumentState;
15
- return;
16
- }
17
- const scope = providesValue.forDocument(docId);
18
- searchState.value = scope.getState();
19
- const unsubscribe = scope.onStateChange((state) => {
20
- searchState.value = state;
21
- });
22
- onCleanup(unsubscribe);
23
- },
24
- { immediate: true }
25
- );
26
- const scopedProvides = computed(() => {
27
- var _a;
28
- const docId = toValue(documentId);
29
- return ((_a = provides.value) == null ? void 0 : _a.forDocument(docId)) ?? null;
30
- });
31
- return {
32
- state: searchState,
33
- provides: scopedProvides
34
- };
35
- };
36
- const _sfc_main = /* @__PURE__ */ defineComponent({
37
- __name: "search-layer",
38
- props: {
39
- documentId: {},
40
- pageIndex: {},
41
- scale: {},
42
- highlightColor: { default: "#FFFF00" },
43
- activeHighlightColor: { default: "#FFBF00" }
44
- },
45
- setup(__props) {
46
- const props = __props;
47
- const { provides: searchProvides } = useSearchCapability();
48
- const documentState = useDocumentState(() => props.documentId);
49
- const searchResultState = ref(null);
50
- const scope = computed(() => {
51
- var _a;
52
- return ((_a = searchProvides.value) == null ? void 0 : _a.forDocument(props.documentId)) ?? null;
53
- });
54
- const actualScale = computed(() => {
55
- var _a;
56
- if (props.scale !== void 0) return props.scale;
57
- return ((_a = documentState.value) == null ? void 0 : _a.scale) ?? 1;
58
- });
59
- watch(
60
- scope,
61
- (scopeValue, _, onCleanup) => {
62
- if (!scopeValue) {
63
- searchResultState.value = null;
64
- return;
65
- }
66
- const currentState = scopeValue.getState();
67
- searchResultState.value = {
68
- results: currentState.results,
69
- activeResultIndex: currentState.activeResultIndex,
70
- showAllResults: currentState.showAllResults,
71
- active: currentState.active
72
- };
73
- const unsubscribe = scopeValue.onSearchResultStateChange((state) => {
74
- searchResultState.value = state;
75
- });
76
- onCleanup(unsubscribe);
77
- },
78
- { immediate: true }
79
- );
80
- const pageResults = computed(() => {
81
- if (!searchResultState.value) return [];
82
- return searchResultState.value.results.map((result, originalIndex) => ({ result, originalIndex })).filter(({ result }) => result.pageIndex === props.pageIndex);
83
- });
84
- const resultsToShow = computed(() => {
85
- if (!searchResultState.value) return [];
86
- return pageResults.value.filter(
87
- ({ originalIndex }) => searchResultState.value.showAllResults || originalIndex === searchResultState.value.activeResultIndex
88
- );
89
- });
90
- return (_ctx, _cache) => {
91
- return searchResultState.value && searchResultState.value.active ? (openBlock(), createElementBlock("div", mergeProps({
92
- key: 0,
93
- style: {
94
- pointerEvents: "none"
95
- }
96
- }, _ctx.$attrs), [
97
- (openBlock(true), createElementBlock(Fragment, null, renderList(resultsToShow.value, ({ result, originalIndex }, idx) => {
98
- return openBlock(), createElementBlock(Fragment, {
99
- key: `result-${idx}`
100
- }, [
101
- (openBlock(true), createElementBlock(Fragment, null, renderList(result.rects, (rect, rectIdx) => {
102
- return openBlock(), createElementBlock("div", {
103
- key: `rect-${idx}-${rectIdx}`,
104
- style: normalizeStyle({
105
- position: "absolute",
106
- top: `${rect.origin.y * actualScale.value}px`,
107
- left: `${rect.origin.x * actualScale.value}px`,
108
- width: `${rect.size.width * actualScale.value}px`,
109
- height: `${rect.size.height * actualScale.value}px`,
110
- backgroundColor: originalIndex === searchResultState.value.activeResultIndex ? __props.activeHighlightColor : __props.highlightColor,
111
- mixBlendMode: "multiply",
112
- transform: "scale(1.02)",
113
- transformOrigin: "center",
114
- transition: "opacity .3s ease-in-out",
115
- opacity: 1
116
- })
117
- }, null, 4);
118
- }), 128))
119
- ], 64);
120
- }), 128))
121
- ], 16)) : createCommentVNode("", true);
122
- };
123
- }
124
- });
125
- export {
126
- _sfc_main as SearchLayer,
127
- useSearch,
128
- useSearchCapability,
129
- useSearchPlugin
130
- };
131
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/vue/hooks/use-search.ts","../../src/vue/components/search-layer.vue"],"sourcesContent":["import { ref, watch, computed, toValue, type MaybeRefOrGetter, Ref, ComputedRef } from 'vue';\nimport { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport {\n SearchPlugin,\n SearchDocumentState,\n SearchScope,\n initialSearchDocumentState,\n} from '@embedpdf/plugin-search';\n\nexport const useSearchPlugin = () => usePlugin<SearchPlugin>(SearchPlugin.id);\nexport const useSearchCapability = () => useCapability<SearchPlugin>(SearchPlugin.id);\n\n/**\n * Hook for search state for a specific document\n * @param documentId Document ID (can be ref, computed, getter, or plain value)\n */\nexport const useSearch = (\n documentId: MaybeRefOrGetter<string>,\n): {\n state: Ref<SearchDocumentState>;\n provides: ComputedRef<SearchScope | null>;\n} => {\n const { provides } = useSearchCapability();\n const searchState = ref<SearchDocumentState>(initialSearchDocumentState);\n\n watch(\n [provides, () => toValue(documentId)],\n ([providesValue, docId], _, onCleanup) => {\n if (!providesValue) {\n searchState.value = initialSearchDocumentState;\n return;\n }\n\n const scope = providesValue.forDocument(docId);\n\n // Set initial state\n searchState.value = scope.getState();\n\n // Subscribe to changes\n const unsubscribe = scope.onStateChange((state) => {\n searchState.value = state;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n );\n\n const scopedProvides = computed(() => {\n const docId = toValue(documentId);\n return provides.value?.forDocument(docId) ?? null;\n });\n\n return {\n state: searchState,\n provides: scopedProvides,\n };\n};\n","<script setup lang=\"ts\">\nimport { ref, watch, computed } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport type { SearchResultState } from '@embedpdf/plugin-search';\nimport { useSearchCapability } from '../hooks/use-search';\n\ninterface SearchLayerProps {\n documentId: string;\n pageIndex: number;\n scale?: number;\n highlightColor?: string;\n activeHighlightColor?: string;\n}\n\nconst props = withDefaults(defineProps<SearchLayerProps>(), {\n highlightColor: '#FFFF00',\n activeHighlightColor: '#FFBF00',\n});\n\nconst { provides: searchProvides } = useSearchCapability();\nconst documentState = useDocumentState(() => props.documentId);\nconst searchResultState = ref<SearchResultState | null>(null);\n\nconst scope = computed(() => searchProvides.value?.forDocument(props.documentId) ?? null);\n\nconst actualScale = computed(() => {\n if (props.scale !== undefined) return props.scale;\n return documentState.value?.scale ?? 1;\n});\n\nwatch(\n scope,\n (scopeValue, _, onCleanup) => {\n if (!scopeValue) {\n searchResultState.value = null;\n return;\n }\n\n // Set initial state\n const currentState = scopeValue.getState();\n searchResultState.value = {\n results: currentState.results,\n activeResultIndex: currentState.activeResultIndex,\n showAllResults: currentState.showAllResults,\n active: currentState.active,\n };\n\n // Subscribe to changes\n const unsubscribe = scopeValue.onSearchResultStateChange((state) => {\n searchResultState.value = state;\n });\n\n onCleanup(unsubscribe);\n },\n { immediate: true },\n);\n\n// Filter results for current page while preserving original indices\nconst pageResults = computed(() => {\n if (!searchResultState.value) return [];\n\n return searchResultState.value.results\n .map((result, originalIndex) => ({ result, originalIndex }))\n .filter(({ result }) => result.pageIndex === props.pageIndex);\n});\n\n// Decide which results to show\nconst resultsToShow = computed(() => {\n if (!searchResultState.value) return [];\n\n return pageResults.value.filter(\n ({ originalIndex }) =>\n searchResultState.value!.showAllResults ||\n originalIndex === searchResultState.value!.activeResultIndex,\n );\n});\n</script>\n\n<template>\n <div\n v-if=\"searchResultState && searchResultState.active\"\n :style=\"{\n pointerEvents: 'none',\n }\"\n v-bind=\"$attrs\"\n >\n <template v-for=\"({ result, originalIndex }, idx) in resultsToShow\" :key=\"`result-${idx}`\">\n <div\n v-for=\"(rect, rectIdx) in result.rects\"\n :key=\"`rect-${idx}-${rectIdx}`\"\n :style=\"{\n position: 'absolute',\n top: `${rect.origin.y * actualScale}px`,\n left: `${rect.origin.x * actualScale}px`,\n width: `${rect.size.width * actualScale}px`,\n height: `${rect.size.height * actualScale}px`,\n backgroundColor:\n originalIndex === searchResultState.activeResultIndex\n ? activeHighlightColor\n : highlightColor,\n mixBlendMode: 'multiply',\n transform: 'scale(1.02)',\n transformOrigin: 'center',\n transition: 'opacity .3s ease-in-out',\n opacity: 1,\n }\"\n />\n </template>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_mergeProps","$attrs","_Fragment","_normalizeStyle"],"mappings":"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"}