@embedpdf/plugin-annotation 1.5.0 → 2.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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1760 -1444
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +58 -19
- package/dist/lib/annotation-plugin.d.ts +14 -5
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/reducer.d.ts +2 -1
- package/dist/lib/selectors.d.ts +10 -8
- package/dist/lib/types.d.ts +53 -10
- package/dist/preact/index.cjs +1 -1
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.js +96 -48
- package/dist/preact/index.js.map +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +96 -48
- package/dist/react/index.js.map +1 -1
- package/dist/shared/components/annotation-container.d.ts +4 -3
- package/dist/shared/components/annotation-layer.d.ts +7 -7
- package/dist/shared/components/annotation-paint-layer.d.ts +2 -1
- package/dist/shared/components/annotations/stamp.d.ts +2 -1
- package/dist/shared/components/annotations.d.ts +3 -2
- package/dist/shared/components/render-annotation.d.ts +2 -1
- package/dist/shared/components/text-markup.d.ts +2 -1
- package/dist/shared/components/types.d.ts +7 -7
- package/dist/shared/hooks/use-annotation.d.ts +8 -4
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared-preact/components/annotation-container.d.ts +4 -3
- package/dist/shared-preact/components/annotation-layer.d.ts +7 -7
- package/dist/shared-preact/components/annotation-paint-layer.d.ts +2 -1
- package/dist/shared-preact/components/annotations/stamp.d.ts +2 -1
- package/dist/shared-preact/components/annotations.d.ts +3 -2
- package/dist/shared-preact/components/render-annotation.d.ts +2 -1
- package/dist/shared-preact/components/text-markup.d.ts +2 -1
- package/dist/shared-preact/components/types.d.ts +7 -7
- package/dist/shared-preact/hooks/use-annotation.d.ts +8 -4
- package/dist/shared-preact/index.d.ts +1 -0
- package/dist/shared-react/components/annotation-container.d.ts +4 -3
- package/dist/shared-react/components/annotation-layer.d.ts +7 -7
- package/dist/shared-react/components/annotation-paint-layer.d.ts +2 -1
- package/dist/shared-react/components/annotations/stamp.d.ts +2 -1
- package/dist/shared-react/components/annotations.d.ts +3 -2
- package/dist/shared-react/components/render-annotation.d.ts +2 -1
- package/dist/shared-react/components/text-markup.d.ts +2 -1
- package/dist/shared-react/components/types.d.ts +7 -7
- package/dist/shared-react/hooks/use-annotation.d.ts +8 -4
- package/dist/shared-react/index.d.ts +1 -0
- package/dist/svelte/components/AnnotationContainer.svelte.d.ts +26 -0
- package/dist/svelte/components/AnnotationLayer.svelte.d.ts +27 -0
- package/dist/svelte/components/AnnotationPaintLayer.svelte.d.ts +8 -0
- package/dist/svelte/components/Annotations.svelte.d.ts +22 -0
- package/dist/svelte/components/PreviewRenderer.svelte.d.ts +8 -0
- package/dist/svelte/components/RenderAnnotation.svelte.d.ts +13 -0
- package/dist/svelte/components/TextMarkup.svelte.d.ts +8 -0
- package/dist/svelte/components/annotations/Circle.svelte.d.ts +26 -0
- package/dist/svelte/components/annotations/FreeText.svelte.d.ts +15 -0
- package/dist/svelte/components/annotations/Ink.svelte.d.ts +14 -0
- package/dist/svelte/components/annotations/Line.svelte.d.ts +18 -0
- package/dist/svelte/components/annotations/Polygon.svelte.d.ts +19 -0
- package/dist/svelte/components/annotations/Polyline.svelte.d.ts +17 -0
- package/dist/svelte/components/annotations/Square.svelte.d.ts +16 -0
- package/dist/svelte/components/annotations/Stamp.svelte.d.ts +13 -0
- package/dist/svelte/components/annotations/index.d.ts +8 -0
- package/dist/svelte/components/index.d.ts +9 -0
- package/dist/svelte/components/text-markup/Highlight.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/Squiggly.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/Strikeout.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/Underline.svelte.d.ts +13 -0
- package/dist/svelte/components/text-markup/index.d.ts +4 -0
- package/dist/svelte/components/types.d.ts +32 -0
- package/dist/svelte/hooks/index.d.ts +1 -0
- package/dist/svelte/hooks/use-annotation.svelte.d.ts +21 -0
- package/dist/svelte/index.cjs +2 -0
- package/dist/svelte/index.cjs.map +1 -0
- package/dist/svelte/index.d.ts +4 -0
- package/dist/svelte/index.js +3083 -0
- package/dist/svelte/index.js.map +1 -0
- package/dist/svelte/types.d.ts +54 -0
- package/dist/vue/components/annotation-container.vue.d.ts +10 -5
- package/dist/vue/components/annotation-layer.vue.d.ts +13 -7
- package/dist/vue/components/annotation-paint-layer.vue.d.ts +3 -1
- package/dist/vue/components/annotations/circle.vue.d.ts +2 -1
- package/dist/vue/components/annotations/free-text.vue.d.ts +2 -1
- package/dist/vue/components/annotations/ink.vue.d.ts +2 -1
- package/dist/vue/components/annotations/line.vue.d.ts +2 -1
- package/dist/vue/components/annotations/polygon.vue.d.ts +2 -1
- package/dist/vue/components/annotations/polyline.vue.d.ts +2 -1
- package/dist/vue/components/annotations/square.vue.d.ts +2 -1
- package/dist/vue/components/annotations/stamp.vue.d.ts +3 -1
- package/dist/vue/components/annotations.vue.d.ts +7 -3
- package/dist/vue/components/preview-renderer.vue.d.ts +2 -1
- package/dist/vue/components/render-annotation.vue.d.ts +3 -1
- package/dist/vue/components/text-markup/highlight.vue.d.ts +2 -1
- package/dist/vue/components/text-markup/squiggly.vue.d.ts +2 -1
- package/dist/vue/components/text-markup/strikeout.vue.d.ts +2 -1
- package/dist/vue/components/text-markup/underline.vue.d.ts +2 -1
- package/dist/vue/components/text-markup.vue.d.ts +3 -1
- package/dist/vue/hooks/use-annotation.d.ts +21 -2682
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +354 -250
- package/dist/vue/index.js.map +1 -1
- package/dist/vue/types.d.ts +23 -0
- package/package.json +19 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-annotation.svelte.ts","../../src/svelte/components/AnnotationContainer.svelte","../../src/svelte/components/text-markup/Highlight.svelte","../../src/svelte/components/text-markup/Underline.svelte","../../src/svelte/components/text-markup/Strikeout.svelte","../../src/svelte/components/text-markup/Squiggly.svelte","../../src/svelte/components/annotations/Ink.svelte","../../src/svelte/components/annotations/Square.svelte","../../src/svelte/components/annotations/Circle.svelte","../../src/svelte/components/annotations/Line.svelte","../../src/svelte/components/annotations/Polyline.svelte","../../src/svelte/components/annotations/Polygon.svelte","../../src/svelte/components/annotations/FreeText.svelte","../../src/svelte/components/RenderAnnotation.svelte","../../src/svelte/components/annotations/Stamp.svelte","../../src/svelte/components/Annotations.svelte","../../src/svelte/components/TextMarkup.svelte","../../src/svelte/components/PreviewRenderer.svelte","../../src/svelte/components/AnnotationPaintLayer.svelte","../../src/svelte/components/AnnotationLayer.svelte"],"sourcesContent":["import {\n AnnotationPlugin,\n AnnotationDocumentState,\n initialDocumentState,\n AnnotationScope,\n} from '@embedpdf/plugin-annotation';\nimport { useCapability, usePlugin } from '@embedpdf/core/svelte';\n\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\n\n// Define the return type explicitly to maintain type safety\ninterface UseAnnotationReturn {\n provides: AnnotationScope | null;\n state: AnnotationDocumentState;\n}\n\n/**\n * Hook for annotation state for a specific document\n * @param getDocumentId Document ID getter function\n */\nexport const useAnnotation = (getDocumentId: () => string | null): UseAnnotationReturn => {\n const capability = useAnnotationCapability();\n\n let state = $state<AnnotationDocumentState>(initialDocumentState());\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 state = initialDocumentState();\n return;\n }\n\n const scope = provides.forDocument(docId);\n\n // Get initial state\n state = scope.getState();\n\n // Subscribe to state changes for THIS docId\n return scope.onStateChange((newState) => {\n state = newState;\n });\n });\n\n return {\n get provides() {\n return scopedProvides;\n },\n get state() {\n return state;\n },\n };\n};\n","<script lang=\"ts\" generics=\"T extends PdfAnnotationObject\">\n import type { PdfAnnotationObject, Rect } from '@embedpdf/models';\n import { useAnnotationCapability } from '../hooks';\n import type { AnnotationContainerProps } from './types';\n import {\n useInteractionHandles,\n doublePress,\n CounterRotate,\n deepToRaw,\n type SelectionMenuPlacement,\n type MenuWrapperProps,\n } from '@embedpdf/utils/svelte';\n import type { Snippet } from 'svelte';\n import { type AnnotationSelectionContext, type AnnotationSelectionMenuProps } from '../types';\n\n let {\n documentId,\n scale,\n pageIndex,\n rotation,\n pageWidth,\n pageHeight,\n trackedAnnotation,\n children,\n isSelected,\n isDraggable,\n isResizable,\n lockAspectRatio = false,\n style,\n class: propsClass = '',\n vertexConfig,\n selectionMenu,\n selectionMenuSnippet,\n outlineOffset = 1,\n onDoubleClick,\n onSelect,\n zIndex = 20,\n resizeUI,\n vertexUI,\n selectionOutlineColor = '#007ACC',\n customAnnotationRenderer,\n ...restProps\n }: AnnotationContainerProps<T> = $props();\n\n let preview = $state<T>(trackedAnnotation.object);\n let annotationCapability = useAnnotationCapability();\n let gestureBaseRef = $state<T | null>(null);\n\n // Get scoped API for this document\n const annotationProvides = $derived(\n annotationCapability.provides ? annotationCapability.provides.forDocument(documentId) : null,\n );\n\n let currentObject = $derived<T>(\n preview ? { ...trackedAnnotation.object, ...preview } : trackedAnnotation.object,\n );\n\n // Defaults retain current behavior\n const HANDLE_COLOR = $derived(resizeUI?.color ?? '#007ACC');\n const VERTEX_COLOR = $derived(vertexUI?.color ?? '#007ACC');\n const HANDLE_SIZE = $derived(resizeUI?.size ?? 12);\n const VERTEX_SIZE = $derived(vertexUI?.size ?? 12);\n\n $effect(() => {\n if (trackedAnnotation.object) {\n preview = trackedAnnotation.object;\n }\n });\n\n const interactionHandles = useInteractionHandles(() => ({\n controller: {\n element: currentObject.rect,\n vertices: vertexConfig?.extractVertices(currentObject),\n constraints: {\n minWidth: 10,\n minHeight: 10,\n boundingBox: { width: pageWidth, height: pageHeight },\n },\n maintainAspectRatio: lockAspectRatio,\n pageRotation: rotation,\n scale: scale,\n enabled: isSelected,\n onUpdate: (event) => {\n if (!event.transformData?.type) return;\n\n if (event.state === 'start') {\n gestureBaseRef = currentObject;\n }\n\n const transformType = event.transformData.type;\n const base = gestureBaseRef ?? currentObject;\n\n const changes = event.transformData.changes.vertices\n ? vertexConfig?.transformAnnotation(base, event.transformData.changes.vertices)\n : { rect: event.transformData.changes.rect };\n\n const patched = annotationCapability.provides?.transformAnnotation<T>(base, {\n type: transformType,\n changes: changes as Partial<T>,\n metadata: event.transformData.metadata,\n });\n\n if (patched) {\n preview = {\n ...preview,\n ...patched,\n };\n }\n if (event.state === 'end' && patched) {\n gestureBaseRef = null;\n // Sanitize to remove Svelte reactive properties before updating\n // Use deepToRaw to recursively strip proxies while preserving complex objects\n const sanitized = deepToRaw(patched);\n annotationProvides?.updateAnnotation(pageIndex, trackedAnnotation.object.id, sanitized);\n }\n },\n },\n resizeUI: {\n handleSize: HANDLE_SIZE,\n spacing: outlineOffset,\n offsetMode: 'outside',\n includeSides: lockAspectRatio ? false : true,\n zIndex: zIndex + 1,\n },\n vertexUI: {\n vertexSize: VERTEX_SIZE,\n zIndex: zIndex + 2,\n },\n includeVertices: vertexConfig ? true : false,\n }));\n\n // Derived accessors for template\n const resizeHandles = $derived(interactionHandles.resize);\n const vertexHandles = $derived(interactionHandles.vertices);\n\n // --- Selection Menu Logic ---\n\n // Check if we should show menu\n const shouldShowMenu = $derived(isSelected && (!!selectionMenu || !!selectionMenuSnippet));\n\n // Build context object for selection menu\n function buildContext(): AnnotationSelectionContext {\n return {\n type: 'annotation',\n annotation: trackedAnnotation,\n pageIndex,\n };\n }\n\n // Placement hints\n const menuPlacement: SelectionMenuPlacement = {\n suggestTop: false,\n spaceAbove: 0,\n spaceBelow: 0,\n };\n\n // Build menu props\n function buildMenuProps(\n rect: Rect,\n menuWrapperProps: MenuWrapperProps,\n ): AnnotationSelectionMenuProps {\n return {\n context: buildContext(),\n selected: isSelected,\n rect,\n placement: menuPlacement,\n menuWrapperProps,\n };\n }\n</script>\n\n<div data-no-interaction>\n <div\n {...isDraggable && isSelected ? interactionHandles.dragProps : {}}\n use:doublePress={{ onDouble: onDoubleClick }}\n style:position=\"absolute\"\n style:left=\"{currentObject.rect.origin.x * scale}px\"\n style:top=\"{currentObject.rect.origin.y * scale}px\"\n style:width=\"{currentObject.rect.size.width * scale}px\"\n style:height=\"{currentObject.rect.size.height * scale}px\"\n style:outline={isSelected ? `1px solid ${selectionOutlineColor}` : 'none'}\n style:outline-offset={isSelected ? `${outlineOffset}px` : '0px'}\n style:pointer-events={isSelected ? 'auto' : 'none'}\n style:touch-action=\"none\"\n style:cursor={isSelected && isDraggable ? 'move' : 'default'}\n style:z-index={zIndex}\n style={style || ''}\n class={propsClass}\n {...restProps}\n >\n {#if customAnnotationRenderer}\n {@render customAnnotationRenderer?.({\n annotation: currentObject,\n children: children as Snippet,\n isSelected,\n scale,\n rotation,\n pageWidth,\n pageHeight,\n pageIndex,\n onSelect,\n })}\n {:else}\n {@render children(currentObject)}\n {/if}\n\n {#if isSelected && isResizable}\n {#each resizeHandles as { key, style: handleStyle, ...hProps } (key)}\n {#if resizeUI?.component}\n {@const Component = resizeUI.component}\n <Component {...hProps} backgroundColor={HANDLE_COLOR} />\n {:else}\n <div {...hProps} style=\"{handleStyle}; background-color: {HANDLE_COLOR};\"></div>\n {/if}\n {/each}\n {/if}\n\n {#if isSelected}\n {#each vertexHandles as { key, style: vertexStyle, ...vProps } (key)}\n {#if vertexUI?.component}\n {@const Component = vertexUI.component}\n <Component {...vProps} backgroundColor={VERTEX_COLOR} />\n {:else}\n <div {...vProps} style=\"{vertexStyle}; background-color: {VERTEX_COLOR};\"></div>\n {/if}\n {/each}\n {/if}\n </div>\n\n <!-- Selection Menu: Supports BOTH render function and snippet -->\n {#if shouldShowMenu}\n <CounterRotate\n rect={{\n origin: {\n x: currentObject.rect.origin.x * scale,\n y: currentObject.rect.origin.y * scale,\n },\n size: {\n width: currentObject.rect.size.width * scale,\n height: currentObject.rect.size.height * scale,\n },\n }}\n {rotation}\n >\n {#snippet children({ rect, menuWrapperProps })}\n {@const menuProps = buildMenuProps(rect, menuWrapperProps)}\n {#if selectionMenu}\n <!-- Priority 1: Render function (schema-driven) -->\n {@const result = selectionMenu(menuProps)}\n {#if result}\n <result.component {...result.props} />\n {/if}\n {:else if selectionMenuSnippet}\n <!-- Priority 2: Snippet (manual customization) -->\n {@render selectionMenuSnippet(menuProps)}\n {/if}\n {/snippet}\n </CounterRotate>\n {/if}\n</div>\n","<script lang=\"ts\">\n import type { Rect } from '@embedpdf/models';\n\n interface HighlightProps {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n style?: Record<string, string | number | undefined>;\n }\n\n let {\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n }: HighlightProps = $props();\n</script>\n\n{#each segmentRects as b, i (i)}\n <div\n role=\"button\"\n tabindex={onClick ? 0 : -1}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:position=\"absolute\"\n style:left=\"{(rect ? b.origin.x - rect.origin.x : b.origin.x) * scale}px\"\n style:top=\"{(rect ? b.origin.y - rect.origin.y : b.origin.y) * scale}px\"\n style:width=\"{b.size.width * scale}px\"\n style:height=\"{b.size.height * scale}px\"\n style:background={color}\n style:opacity\n style:pointer-events={onClick ? 'auto' : 'none'}\n style:cursor={onClick ? 'pointer' : 'default'}\n style:z-index={onClick ? 1 : undefined}\n {...style ? Object.fromEntries(Object.entries(style).map(([k, v]) => [`style:${k}`, v])) : {}}\n ></div>\n{/each}\n","<script lang=\"ts\">\n import type { Rect } from '@embedpdf/models';\n\n interface UnderlineProps {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n style?: Record<string, string | number | undefined>;\n }\n\n let {\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n }: UnderlineProps = $props();\n\n const thickness = $derived(2 * scale); // 2 CSS px at 100% zoom\n</script>\n\n{#each segmentRects as r, i (i)}\n <div\n role=\"button\"\n tabindex={onClick ? 0 : -1}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:position=\"absolute\"\n style:left=\"{(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px\"\n style:top=\"{(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px\"\n style:width=\"{r.size.width * scale}px\"\n style:height=\"{r.size.height * scale}px\"\n style:background=\"transparent\"\n style:pointer-events={onClick ? 'auto' : 'none'}\n style:cursor={onClick ? 'pointer' : 'default'}\n style:z-index={onClick ? 1 : 0}\n {...style ? Object.fromEntries(Object.entries(style).map(([k, v]) => [`style:${k}`, v])) : {}}\n >\n <!-- Visual underline -->\n <div\n style:position=\"absolute\"\n style:left=\"0\"\n style:bottom=\"0\"\n style:width=\"100%\"\n style:height=\"{thickness}px\"\n style:background={color}\n style:opacity\n style:pointer-events=\"none\"\n ></div>\n </div>\n{/each}\n","<script lang=\"ts\">\n import type { Rect } from '@embedpdf/models';\n\n interface StrikeoutProps {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n style?: Record<string, string | number | undefined>;\n }\n\n let {\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n }: StrikeoutProps = $props();\n\n const thickness = $derived(2 * scale);\n</script>\n\n{#each segmentRects as r, i (i)}\n <div\n role=\"button\"\n tabindex={onClick ? 0 : -1}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:position=\"absolute\"\n style:left=\"{(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px\"\n style:top=\"{(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px\"\n style:width=\"{r.size.width * scale}px\"\n style:height=\"{r.size.height * scale}px\"\n style:background=\"transparent\"\n style:pointer-events={onClick ? 'auto' : 'none'}\n style:cursor={onClick ? 'pointer' : 'default'}\n style:z-index={onClick ? 1 : 0}\n {...style ? Object.fromEntries(Object.entries(style).map(([k, v]) => [`style:${k}`, v])) : {}}\n >\n <!-- Visual strikeout line -->\n <div\n style:position=\"absolute\"\n style:left=\"0\"\n style:top=\"50%\"\n style:width=\"100%\"\n style:height=\"{thickness}px\"\n style:background={color}\n style:opacity\n style:transform=\"translateY(-50%)\"\n style:pointer-events=\"none\"\n ></div>\n </div>\n{/each}\n","<script lang=\"ts\">\n import type { Rect } from '@embedpdf/models';\n\n interface SquigglyProps {\n color?: string;\n opacity?: number;\n segmentRects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n style?: Record<string, string | number | undefined>;\n }\n\n let {\n color = '#FFFF00',\n opacity = 0.5,\n segmentRects,\n rect,\n scale,\n onClick,\n style,\n }: SquigglyProps = $props();\n\n const amplitude = $derived(2 * scale); // wave height\n const period = $derived(6 * scale); // wave length\n\n const svg =\n $derived(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${period}\" height=\"${amplitude * 2}\" viewBox=\"0 0 ${period} ${amplitude * 2}\">\n <path d=\"M0 ${amplitude} Q ${period / 4} 0 ${period / 2} ${amplitude} T ${period} ${amplitude}\"\n fill=\"none\" stroke=\"${color}\" stroke-width=\"${amplitude}\" stroke-linecap=\"round\"/>\n </svg>`);\n\n // Completely escape the SVG markup\n const svgDataUri = $derived(`url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`);\n</script>\n\n{#each segmentRects as r, i (i)}\n <div\n role=\"button\"\n tabindex={onClick ? 0 : -1}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:position=\"absolute\"\n style:left=\"{(rect ? r.origin.x - rect.origin.x : r.origin.x) * scale}px\"\n style:top=\"{(rect ? r.origin.y - rect.origin.y : r.origin.y) * scale}px\"\n style:width=\"{r.size.width * scale}px\"\n style:height=\"{r.size.height * scale}px\"\n style:background=\"transparent\"\n style:pointer-events={onClick ? 'auto' : 'none'}\n style:cursor={onClick ? 'pointer' : 'default'}\n style:z-index={onClick ? 1 : 0}\n {...style ? Object.fromEntries(Object.entries(style).map(([k, v]) => [`style:${k}`, v])) : {}}\n >\n <!-- Visual squiggly line -->\n <div\n style:position=\"absolute\"\n style:left=\"0\"\n style:bottom=\"0\"\n style:width=\"100%\"\n style:height=\"{amplitude * 2}px\"\n style:background-image={svgDataUri}\n style:background-repeat=\"repeat-x\"\n style:background-size=\"{period}px {amplitude * 2}px\"\n style:opacity\n style:pointer-events=\"none\"\n ></div>\n </div>\n{/each}\n","<script lang=\"ts\">\n import type { PdfInkListObject, Rect } from '@embedpdf/models';\n\n interface InkProps {\n isSelected: boolean;\n color?: string;\n opacity?: number;\n strokeWidth: number;\n inkList: PdfInkListObject[];\n rect: Rect;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n }\n\n let {\n isSelected,\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n }: InkProps = $props();\n\n // derived SVG path data\n const paths = $derived.by(() =>\n inkList.map(({ points }) => {\n let d = '';\n for (let i = 0; i < points.length; i++) {\n const { x, y } = points[i];\n const lx = x - rect.origin.x;\n const ly = y - rect.origin.y;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n }\n return d.trim();\n }),\n );\n\n const width = $derived(rect.size.width * scale);\n const height = $derived(rect.size.height * scale);\n</script>\n\n<svg\n style=\"position: absolute; z-index: 2; overflow: visible; pointer-events: none;\"\n style:width={`${width}px`}\n style:height={`${height}px`}\n {width}\n {height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n>\n {#each paths as d, i (i)}\n <path\n {d}\n fill=\"none\"\n {opacity}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:pointer-events={isSelected ? 'none' : 'visibleStroke'}\n style:stroke={color}\n style:stroke-width={strokeWidth}\n style:stroke-linecap=\"round\"\n style:stroke-linejoin=\"round\"\n />\n {/each}\n</svg>\n","<!-- Square.svelte -->\n<script lang=\"ts\">\n import type { Rect } from '@embedpdf/models';\n import { PdfAnnotationBorderStyle } from '@embedpdf/models';\n\n interface SquareProps {\n isSelected: boolean;\n color?: string; // fill color (defaults to black)\n strokeColor?: string; // stroke color (defaults to fill when omitted)\n opacity?: number; // 0–1\n strokeWidth: number; // PDF units\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect; // bbox includes stroke\n scale: number; // page zoom\n onClick?: (e: MouseEvent | TouchEvent) => void;\n }\n\n let {\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n }: SquareProps = $props();\n\n // Geometry helpers — compute inner rect so visual fill matches preview\n const { width, height, x, y } = $derived.by(() => {\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n return {\n width: innerW,\n height: innerH,\n x: strokeWidth / 2,\n y: strokeWidth / 2,\n };\n });\n\n const svgWidth = $derived((width + strokeWidth) * scale);\n const svgHeight = $derived((height + strokeWidth) * scale);\n\n const dash = $derived(\n strokeStyle === PdfAnnotationBorderStyle.DASHED ? strokeDashArray?.join(',') : undefined,\n );\n</script>\n\n<svg\n style=\"position: absolute; pointer-events: none; z-index: 2;\"\n style:width={`${svgWidth}px`}\n style:height={`${svgHeight}px`}\n width={svgWidth}\n height={svgHeight}\n viewBox={`0 0 ${width + strokeWidth} ${height + strokeWidth}`}\n>\n <rect\n {x}\n {y}\n {width}\n {height}\n fill={color}\n {opacity}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:pointer-events={isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible'}\n style:stroke={strokeColor ?? color}\n style:stroke-width={strokeWidth}\n style:stroke-dasharray={dash}\n />\n</svg>\n","<script lang=\"ts\">\n import { PdfAnnotationBorderStyle, type Rect } from '@embedpdf/models';\n\n interface CircleProps {\n /** Whether the annotation is selected */\n isSelected: boolean;\n /** Fill colour – defaults to PDFium’s black if omitted */\n color?: string;\n /** Stroke colour – defaults to same as fill when omitted */\n strokeColor?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Stroke width in PDF units */\n strokeWidth: number;\n /** Stroke type – defaults to solid when omitted */\n strokeStyle?: PdfAnnotationBorderStyle;\n /** Stroke dash array – defaults to undefined when omitted */\n strokeDashArray?: number[];\n /** Bounding box of the annotation */\n rect: Rect;\n /** Current page zoom factor */\n scale: number;\n /** Pointer/touch handler (used for selection) */\n onClick?: (e: PointerEvent | TouchEvent) => void;\n }\n\n let {\n isSelected,\n color = '#000000',\n strokeColor,\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n scale,\n onClick,\n }: CircleProps = $props();\n\n const { width, height, cx, cy, rx, ry } = $derived.by(() => {\n // Full bounding box *includes* stroke width.\n const outerW = rect.size.width;\n const outerH = rect.size.height;\n\n // Remove the stroke so the visible fill matches the preview.\n const innerW = Math.max(outerW - strokeWidth, 0);\n const innerH = Math.max(outerH - strokeWidth, 0);\n\n return {\n width: outerW,\n height: outerH,\n // Centre of the fill sits strokeWidth/2 in from the edges\n cx: strokeWidth / 2 + innerW / 2,\n cy: strokeWidth / 2 + innerH / 2,\n rx: innerW / 2,\n ry: innerH / 2,\n };\n });\n\n let svgWidth = $derived(width * scale);\n let svgHeight = $derived(height * scale);\n\n let peValue = $derived(\n isSelected ? 'none' : color === 'transparent' ? 'visibleStroke' : 'visible',\n );\n</script>\n\n<svg\n style:position=\"absolute\"\n style:width={`${svgWidth}px`}\n style:height={`${svgHeight}px`}\n style:pointer-events=\"none\"\n style:z-index=\"2\"\n {svgWidth}\n {svgHeight}\n viewBox={`0 0 ${width} ${height}`}\n>\n <ellipse\n {cx}\n {cy}\n {rx}\n {ry}\n fill={color}\n {opacity}\n onpointerdown={(e) => onClick?.(e)}\n ontouchstart={(e) => onClick?.(e)}\n style:cursor={isSelected ? 'move' : 'pointer'}\n pointer-events={peValue}\n stroke={strokeColor ?? color}\n stroke-width={strokeWidth}\n stroke-dasharray={strokeStyle === PdfAnnotationBorderStyle.DASHED\n ? strokeDashArray?.join(',')\n : undefined}\n />\n</svg>\n","<!-- Line.svelte -->\n<script lang=\"ts\">\n import type { Rect, LinePoints, LineEndings } from '@embedpdf/models';\n import { PdfAnnotationBorderStyle } from '@embedpdf/models';\n import { patching } from '@embedpdf/plugin-annotation';\n\n interface LineProps {\n color?: string; // interior color\n opacity?: number; // 0–1\n strokeWidth: number; // PDF units\n strokeColor?: string;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n rect: Rect;\n linePoints: LinePoints;\n lineEndings?: LineEndings;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n isSelected: boolean;\n }\n\n let {\n color = 'transparent',\n opacity = 1,\n strokeWidth,\n strokeColor = '#000000',\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n rect,\n linePoints,\n lineEndings,\n scale,\n onClick,\n isSelected,\n }: LineProps = $props();\n\n // Localize endpoints into the annotation's bbox\n const x1 = $derived(linePoints.start.x - rect.origin.x);\n const y1 = $derived(linePoints.start.y - rect.origin.y);\n const x2 = $derived(linePoints.end.x - rect.origin.x);\n const y2 = $derived(linePoints.end.y - rect.origin.y);\n\n // Arrow-head / butt endings via shared factory\n const endings = $derived.by(() => {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n return {\n start: patching.createEnding(lineEndings?.start, strokeWidth, angle + Math.PI, x1, y1),\n end: patching.createEnding(lineEndings?.end, strokeWidth, angle, x2, y2),\n };\n });\n\n // Absolute placement + scaling\n const width = $derived(rect.size.width * scale);\n const height = $derived(rect.size.height * scale);\n\n // Dashed stroke only when requested\n const dash = $derived(\n strokeStyle === PdfAnnotationBorderStyle.DASHED ? strokeDashArray?.join(',') : undefined,\n );\n</script>\n\n<svg\n style=\"position: absolute; z-index: 2; overflow: visible; pointer-events: none;\"\n style:width={`${width}px`}\n style:height={`${height}px`}\n {width}\n {height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n>\n <!-- Main line -->\n <line\n {x1}\n {y1}\n {x2}\n {y2}\n {opacity}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:pointer-events={isSelected ? 'none' : 'visibleStroke'}\n style:stroke={strokeColor}\n style:stroke-width={strokeWidth}\n style:stroke-linecap=\"butt\"\n style:stroke-dasharray={dash}\n />\n\n <!-- Optional arrowheads / butt caps -->\n {#if endings.start}\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n onpointerdown={onClick}\n ontouchstart={onClick}\n stroke={strokeColor}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:stroke-width={strokeWidth}\n style:stroke-linecap=\"butt\"\n style:pointer-events={isSelected\n ? 'none'\n : endings.start.filled\n ? 'visible'\n : 'visibleStroke'}\n style:stroke-dasharray={dash}\n fill={endings.start.filled ? color : 'none'}\n />\n {/if}\n\n {#if endings.end}\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:stroke-width={strokeWidth}\n style:stroke-linecap=\"butt\"\n style:pointer-events={isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke'}\n style:stroke-dasharray={dash}\n fill={endings.end.filled ? color : 'none'}\n />\n {/if}\n</svg>\n","<!-- Polyline.svelte -->\n<script lang=\"ts\">\n import type { Rect, Position, LineEndings } from '@embedpdf/models';\n import { patching } from '@embedpdf/plugin-annotation';\n\n interface PolylineProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n /** Optional start & end endings */\n lineEndings?: LineEndings;\n }\n\n let {\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n scale,\n isSelected,\n onClick,\n lineEndings,\n }: PolylineProps = $props();\n\n // Localize vertices to the annotation rect\n const localPts = $derived(\n vertices.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n );\n\n // Build path data: \"M x0 y0 L x1 y1 ...\"\n const pathData = $derived.by(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n return (\n `M ${first.x} ${first.y} ` +\n rest\n .map((p) => `L ${p.x} ${p.y} `)\n .join('')\n .trim()\n );\n });\n\n // Compute endings (angles from first→second, last-1→last)\n const endings = $derived.by(() => {\n if (localPts.length < 2) return { start: null as any, end: null as any };\n const toAngle = (a: Position, b: Position) => Math.atan2(b.y - a.y, b.x - a.x);\n\n const startRad = toAngle(localPts[0], localPts[1]); // FROM first TO second\n const endRad = toAngle(localPts[localPts.length - 2], localPts[localPts.length - 1]); // FROM second-to-last TO last\n\n const start = patching.createEnding(\n lineEndings?.start,\n strokeWidth,\n startRad + Math.PI, // tip outward from start\n localPts[0].x,\n localPts[0].y,\n );\n const end = patching.createEnding(\n lineEndings?.end,\n strokeWidth,\n endRad, // tip in line direction\n localPts[localPts.length - 1].x,\n localPts[localPts.length - 1].y,\n );\n return { start, end };\n });\n\n const width = $derived(rect.size.width * scale);\n const height = $derived(rect.size.height * scale);\n</script>\n\n<svg\n style=\"position: absolute; width: var(--w); height: var(--h); pointer-events: none; z-index: 2; overflow: visible;\"\n style:--w={`${width}px`}\n style:--h={`${height}px`}\n {width}\n {height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n>\n <path\n d={pathData}\n onpointerdown={onClick}\n ontouchstart={onClick}\n {opacity}\n style:fill=\"none\"\n style:stroke={strokeColor ?? color}\n style:stroke-width={strokeWidth}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:pointer-events={isSelected ? 'none' : 'visibleStroke'}\n style:stroke-linecap=\"butt\"\n style:stroke-linejoin=\"miter\"\n />\n\n {#if endings.start}\n <path\n d={endings.start.d}\n transform={endings.start.transform}\n stroke={strokeColor}\n fill={endings.start.filled ? color : 'none'}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:stroke-width={strokeWidth}\n style:pointer-events={isSelected\n ? 'none'\n : endings.start.filled\n ? 'visible'\n : 'visibleStroke'}\n style:stroke-linecap=\"butt\"\n />\n {/if}\n\n {#if endings.end}\n <path\n d={endings.end.d}\n transform={endings.end.transform}\n stroke={strokeColor}\n fill={endings.end.filled ? color : 'none'}\n onpointerdown={onClick}\n ontouchstart={onClick}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:stroke-width={strokeWidth}\n style:pointer-events={isSelected ? 'none' : endings.end.filled ? 'visible' : 'visibleStroke'}\n style:stroke-linecap=\"butt\"\n />\n {/if}\n</svg>\n","<!-- Polygon.svelte -->\n<script lang=\"ts\">\n import type { Rect, Position } from '@embedpdf/models';\n import { PdfAnnotationBorderStyle } from '@embedpdf/models';\n\n interface PolygonProps {\n rect: Rect;\n vertices: Position[];\n color?: string;\n strokeColor?: string;\n opacity?: number;\n strokeWidth: number;\n strokeStyle?: PdfAnnotationBorderStyle;\n strokeDashArray?: number[];\n scale: number;\n isSelected: boolean;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n // Preview-only\n currentVertex?: Position;\n handleSize?: number;\n }\n\n let {\n rect,\n vertices,\n color = 'transparent',\n strokeColor = '#000000',\n opacity = 1,\n strokeWidth,\n strokeStyle = PdfAnnotationBorderStyle.SOLID,\n strokeDashArray,\n scale,\n isSelected,\n onClick,\n currentVertex,\n handleSize = 14,\n }: PolygonProps = $props();\n\n // Combine vertices with preview point (if any)\n const allPoints = $derived(currentVertex ? [...vertices, currentVertex] : vertices);\n\n // Localize points to the annotation bbox\n const localPts = $derived(\n allPoints.map(({ x, y }) => ({ x: x - rect.origin.x, y: y - rect.origin.y })),\n );\n\n // Build path data; omit 'Z' when previewing\n const pathData = $derived.by(() => {\n if (!localPts.length) return '';\n const [first, ...rest] = localPts;\n const isPreview = !!currentVertex;\n return (\n `M ${first.x} ${first.y} ` +\n rest.map((p) => `L ${p.x} ${p.y}`).join(' ') +\n (isPreview ? '' : ' Z')\n ).trim();\n });\n\n const isPreviewing = $derived(!!currentVertex && vertices.length > 0);\n\n const width = $derived(rect.size.width * scale);\n const height = $derived(rect.size.height * scale);\n\n const dash = $derived(\n strokeStyle === PdfAnnotationBorderStyle.DASHED ? strokeDashArray?.join(',') : undefined,\n );\n</script>\n\n<svg\n style=\"position: absolute; z-index: 2; overflow: visible; pointer-events: none;\"\n style:width={`${width}px`}\n style:height={`${height}px`}\n {width}\n {height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n>\n <path\n d={pathData}\n onpointerdown={onClick}\n ontouchstart={onClick}\n {opacity}\n style:fill={currentVertex ? 'none' : color}\n style:stroke={strokeColor ?? color}\n style:stroke-width={strokeWidth}\n style:cursor={isSelected ? 'move' : 'pointer'}\n style:pointer-events={isSelected\n ? 'none'\n : color === 'transparent'\n ? 'visibleStroke'\n : 'visible'}\n style:stroke-linecap=\"butt\"\n style:stroke-linejoin=\"miter\"\n style:stroke-dasharray={dash}\n />\n\n <!-- Preview-only elements -->\n {#if isPreviewing && vertices.length > 1}\n <path\n d={`M ${localPts[localPts.length - 1].x} ${localPts[localPts.length - 1].y} L ${localPts[0].x} ${localPts[0].y}`}\n fill=\"none\"\n style:stroke={strokeColor}\n style:stroke-width={strokeWidth}\n style:stroke-dasharray={'4,4'}\n style:opacity={0.7}\n />\n {/if}\n\n {#if isPreviewing && vertices.length >= 2}\n <rect\n x={localPts[0].x - handleSize / scale / 2}\n y={localPts[0].y - handleSize / scale / 2}\n width={handleSize / scale}\n height={handleSize / scale}\n fill={strokeColor}\n opacity={0.4}\n stroke={strokeColor}\n stroke-width={strokeWidth / 2}\n />\n {/if}\n</svg>\n","<!-- Free-text.svelte -->\n<script lang=\"ts\">\n import {\n type PdfFreeTextAnnoObject,\n PdfVerticalAlignment,\n standardFontCss,\n textAlignmentToCss,\n } from '@embedpdf/models';\n import type { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n import { useAnnotationCapability } from '../../hooks';\n\n // ---------- props ----------\n interface FreeTextProps {\n documentId: string;\n isSelected: boolean;\n isEditing: boolean;\n annotation: TrackedAnnotation<PdfFreeTextAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n onDoubleClick?: (e: MouseEvent) => void;\n }\n\n let { documentId, isSelected, isEditing, annotation, pageIndex, scale, onClick }: FreeTextProps =\n $props();\n\n // ---------- capabilities ----------\n const annotationCapability = useAnnotationCapability();\n\n // Get scoped API for this document\n const annotationProvides = $derived(\n annotationCapability.provides ? annotationCapability.provides.forDocument(documentId) : null,\n );\n\n // ---------- refs / state ----------\n let editorRef: HTMLSpanElement | null = null;\n let isIOS = $state(false);\n\n // Focus and move caret to end when entering edit mode\n $effect(() => {\n if (!isEditing || !editorRef) return;\n editorRef.focus();\n\n const selection = window.getSelection?.();\n if (!selection) return;\n\n const range = document.createRange();\n range.selectNodeContents(editorRef);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n // One-time iOS detection (prevents zoom by font-size compensation)\n $effect.pre(() => {\n try {\n const nav = navigator as any;\n const ios =\n /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n (navigator.platform === 'MacIntel' && nav?.maxTouchPoints > 1);\n isIOS = ios;\n } catch {\n isIOS = false;\n }\n });\n\n // Persist contents on blur\n function handleBlur() {\n if (!annotationProvides || !editorRef) return;\n annotationProvides.updateAnnotation(pageIndex, annotation.object.id, {\n contents: editorRef.innerText,\n });\n }\n\n // ---------- iOS zoom compensation ----------\n const computedFontPx = $derived(annotation.object.fontSize * scale);\n const MIN_IOS_FOCUS_FONT_PX = 16;\n const needsComp = $derived(\n isIOS && isEditing && computedFontPx > 0 && computedFontPx < MIN_IOS_FOCUS_FONT_PX,\n );\n const adjustedFontPx = $derived(needsComp ? MIN_IOS_FOCUS_FONT_PX : computedFontPx);\n const scaleComp = $derived(needsComp ? computedFontPx / MIN_IOS_FOCUS_FONT_PX : 1);\n const invScalePercent = $derived(needsComp ? 100 / scaleComp : 100);\n\n // ---------- derived sizes ----------\n const outerW = $derived(annotation.object.rect.size.width * scale);\n const outerH = $derived(annotation.object.rect.size.height * scale);\n\n const justify = $derived(\n annotation.object.verticalAlign === PdfVerticalAlignment.Top\n ? 'flex-start'\n : annotation.object.verticalAlign === PdfVerticalAlignment.Middle\n ? 'center'\n : 'flex-end',\n );\n</script>\n\n<!-- Outer positioned container -->\n<div\n style:position=\"absolute\"\n style:width={`${outerW}px`}\n style:height={`${outerH}px`}\n style:z-index={2}\n style:cursor={isSelected && !isEditing ? 'move' : 'default'}\n style:pointer-events={isSelected && !isEditing ? 'none' : 'auto'}\n onpointerdown={onClick}\n ontouchstart={onClick}\n>\n <!-- Editable span -->\n <span\n bind:this={editorRef}\n tabindex=\"0\"\n contenteditable={isEditing}\n onblur={handleBlur}\n style:display=\"flex\"\n style:flex-direction=\"column\"\n style:justify-content={justify}\n style:color={annotation.object.fontColor}\n style:font-size={`${adjustedFontPx}px`}\n style:font-family={standardFontCss(annotation.object.fontFamily)}\n style:text-align={textAlignmentToCss(annotation.object.textAlign)}\n style:background-color={annotation.object.backgroundColor}\n style:opacity={annotation.object.opacity}\n style:width={needsComp ? `${invScalePercent}%` : '100%'}\n style:height={needsComp ? `${invScalePercent}%` : '100%'}\n style:line-height=\"1.18\"\n style:overflow=\"hidden\"\n style:cursor={isEditing ? 'text' : 'pointer'}\n style:outline=\"none\"\n style:transform={needsComp ? `scale(${scaleComp})` : undefined}\n style:transform-origin=\"top left\">{annotation.object.contents}</span\n >\n</div>\n","<script lang=\"ts\">\n import { ignore, type PdfAnnotationObject, PdfErrorCode } from '@embedpdf/models';\n import type { HTMLImgAttributes } from 'svelte/elements';\n import { useAnnotationCapability } from '../hooks';\n import { deepToRaw } from '@embedpdf/utils/svelte';\n\n interface RenderAnnotationProps extends Omit<HTMLImgAttributes, 'style'> {\n documentId: string;\n pageIndex: number;\n annotation: PdfAnnotationObject;\n scaleFactor?: number;\n dpr?: number;\n style?: Record<string, string | number | undefined>;\n }\n\n let {\n documentId,\n pageIndex,\n annotation,\n scaleFactor = 1,\n style,\n ...restProps\n }: RenderAnnotationProps = $props();\n\n const annotationCapability = useAnnotationCapability();\n\n let imageUrl = $state<string | null>(null);\n let urlRef: string | null = null;\n\n const { width, height } = $derived(annotation.rect.size);\n\n // Get scoped API for this document\n const annotationProvides = $derived(\n annotationCapability.provides ? annotationCapability.provides.forDocument(documentId) : null,\n );\n\n // Effect to render annotation\n $effect(() => {\n if (annotationProvides) {\n const task = annotationProvides.renderAnnotation({\n pageIndex,\n annotation: deepToRaw(annotation),\n options: {\n scaleFactor,\n dpr: window.devicePixelRatio,\n },\n });\n\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n imageUrl = url;\n urlRef = url;\n }, ignore);\n\n return () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n }\n });\n\n function handleImageLoad() {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n }\n</script>\n\n{#if imageUrl}\n <img\n alt=\"\"\n src={imageUrl}\n onload={handleImageLoad}\n {...restProps}\n style:width=\"100%\"\n style:height=\"100%\"\n style:display=\"block\"\n {style}\n />\n{/if}\n","<script lang=\"ts\">\n import type { PdfStampAnnoObject } from '@embedpdf/models';\n import type { TrackedAnnotation } from '@embedpdf/plugin-annotation';\n import RenderAnnotation from '../RenderAnnotation.svelte';\n\n interface StampProps {\n documentId: string;\n isSelected: boolean;\n annotation: TrackedAnnotation<PdfStampAnnoObject>;\n pageIndex: number;\n scale: number;\n onClick: (e: MouseEvent | TouchEvent) => void;\n }\n\n let { documentId, isSelected, annotation, pageIndex, scale, onClick }: StampProps = $props();\n\n let annotationProp = $derived({ ...annotation.object, id: annotation.object.id });\n</script>\n\n<div\n style=\"position: absolute; width: 100%; height: 100%; z-index: 2;\"\n style:pointer-events={isSelected ? 'none' : 'auto'}\n style:cursor=\"pointer\"\n onpointerdown={onClick}\n ontouchstart={onClick}\n>\n <RenderAnnotation {documentId} {pageIndex} annotation={annotationProp} scaleFactor={scale} />\n</div>\n","<!-- Annotations.svelte -->\n<script lang=\"ts\">\n import { blendModeToCss, type PdfAnnotationObject, PdfBlendMode } from '@embedpdf/models';\n import {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n isCircle,\n isFreeText,\n isHighlight,\n isInk,\n isLine,\n isPolygon,\n isPolyline,\n isSquare,\n isSquiggly,\n isStamp,\n isStrikeout,\n isUnderline,\n type TrackedAnnotation,\n } from '@embedpdf/plugin-annotation';\n\n import { type PointerEventHandlersWithLifecycle } from '@embedpdf/plugin-interaction-manager';\n import { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/svelte';\n import { useSelectionCapability } from '@embedpdf/plugin-selection/svelte';\n\n import { useAnnotationCapability } from '../hooks';\n\n import Highlight from './text-markup/Highlight.svelte';\n import Underline from './text-markup/Underline.svelte';\n import Strikeout from './text-markup/Strikeout.svelte';\n import Squiggly from './text-markup/Squiggly.svelte';\n import Ink from './annotations/Ink.svelte';\n import Square from './annotations/Square.svelte';\n import Circle from './annotations/Circle.svelte';\n import Line from './annotations/Line.svelte';\n import Polyline from './annotations/Polyline.svelte';\n import Polygon from './annotations/Polygon.svelte';\n import FreeText from './annotations/FreeText.svelte';\n import Stamp from './annotations/Stamp.svelte';\n import type {\n AnnotationSelectionMenuProps,\n AnnotationSelectionMenuRenderFn,\n CustomAnnotationRenderer,\n ResizeHandleUI,\n VertexHandleUI,\n } from '../types';\n import AnnotationContainer from './AnnotationContainer.svelte';\n import type { Snippet } from 'svelte';\n\n // ---------- props ----------\n interface AnnotationsProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n rotation: number;\n pageWidth: number;\n pageHeight: number;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Snippet for custom selection menu (slot-based approach) */\n selectionMenuSnippet?: Snippet<[AnnotationSelectionMenuProps]>;\n resizeUI?: ResizeHandleUI;\n vertexUI?: VertexHandleUI;\n selectionOutlineColor?: string;\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n }\n let annotationsProps: AnnotationsProps = $props();\n\n // ---------- capabilities / handlers ----------\n const annotationCapability = useAnnotationCapability();\n const selectionCapability = useSelectionCapability();\n const pointerHandlers = usePointerHandlers({\n documentId: annotationsProps.documentId,\n pageIndex: annotationsProps.pageIndex,\n });\n\n // ---------- local state ----------\n let annotations = $state<TrackedAnnotation[]>([]);\n let selectionState = $state<TrackedAnnotation | null>(null);\n let editingId = $state<string | null>(null);\n\n // Get scoped API for this document\n const annotationProvides = $derived(\n annotationCapability.provides\n ? annotationCapability.provides.forDocument(annotationsProps.documentId)\n : null,\n );\n\n // subscribe to annotation state\n $effect(() => {\n if (!annotationProvides) return;\n\n // Initialize with current state immediately\n const currentState = annotationProvides.getState();\n annotations = getAnnotationsByPageIndex(currentState, annotationsProps.pageIndex);\n selectionState = getSelectedAnnotationByPageIndex(currentState, annotationsProps.pageIndex);\n\n // Then subscribe to changes\n const off = annotationProvides.onStateChange((state) => {\n annotations = getAnnotationsByPageIndex(state, annotationsProps.pageIndex);\n selectionState = getSelectedAnnotationByPageIndex(state, annotationsProps.pageIndex);\n });\n return () => off?.();\n });\n\n // pointer handlers (capture-down to deselect when clicking empty layer)\n const handlers: PointerEventHandlersWithLifecycle = {\n onPointerDown: (_: unknown, pe: PointerEvent) => {\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n editingId = null;\n }\n },\n };\n\n // register pointer handlers\n $effect(() => {\n return pointerHandlers.register(handlers, { documentId: annotationsProps.documentId });\n });\n\n // click/select logic shared across shapes\n function handleClick(e: MouseEvent | TouchEvent, annotation: TrackedAnnotation) {\n e.stopPropagation();\n if (annotationProvides && selectionCapability.provides) {\n annotationProvides.selectAnnotation(annotationsProps.pageIndex, annotation.object.id);\n selectionCapability.provides.clear();\n if (annotation.object.id !== editingId) {\n editingId = null;\n }\n }\n }\n</script>\n\n{#each annotations as annotation (annotation.object.id)}\n {@const isSelected = selectionState?.object.id === annotation.object.id}\n {@const isEditing = editingId === annotation.object.id}\n {@const tool = annotationProvides?.findToolForAnnotation(annotation.object)}\n {@const mixBlendMode = blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal)}\n\n {#if isInk(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e) => handleClick(e, annotation)}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Ink\n {...obj}\n {isSelected}\n scale={annotationsProps.scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isSquare(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Square\n {...obj}\n {isSelected}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isCircle(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Circle\n {...obj}\n {isSelected}\n scale={annotationsProps.scale}\n onClick={(e: PointerEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isUnderline(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n zIndex={0}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Underline\n {...obj}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isStrikeout(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n zIndex={0}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Strikeout\n {...obj}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isSquiggly(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n zIndex={0}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Squiggly\n {...obj}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isHighlight(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? false}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n zIndex={0}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n style=\"mix-blend-mode: {blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Multiply)}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Highlight\n {...obj}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isLine(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (a) => [a.linePoints.start, a.linePoints.end],\n transformAnnotation: (a, vertices) => ({\n ...a,\n linePoints: { start: vertices[0], end: vertices[1] },\n }),\n }}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Line\n {...obj}\n {isSelected}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isPolyline(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n {isSelected}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (a) => a.vertices,\n transformAnnotation: (a, vertices) => ({ ...a, vertices }),\n }}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Polyline\n {...obj}\n {isSelected}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isPolygon(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? false}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n vertexConfig={{\n extractVertices: (a) => a.vertices,\n transformAnnotation: (a, vertices) => ({ ...a, vertices }),\n }}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(obj)}\n <Polygon\n {...obj}\n {isSelected}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isFreeText(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={(tool?.interaction.isDraggable ?? true) && !isEditing}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e) => handleClick(e, annotation)}\n style=\"mix-blend-mode: {blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal)}\"\n onDoubleClick={(e) => {\n e.stopPropagation();\n editingId = annotation.object.id;\n }}\n {...annotationsProps}\n >\n {#snippet children(object)}\n <FreeText\n documentId={annotationsProps.documentId}\n {isSelected}\n {isEditing}\n annotation={{ ...annotation, object }}\n pageIndex={annotationsProps.pageIndex}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {:else if isStamp(annotation)}\n <AnnotationContainer\n trackedAnnotation={annotation}\n {isSelected}\n isDraggable={tool?.interaction.isDraggable ?? true}\n isResizable={tool?.interaction.isResizable ?? true}\n lockAspectRatio={tool?.interaction.lockAspectRatio ?? false}\n selectionMenu={annotationsProps.selectionMenu}\n selectionMenuSnippet={annotationsProps.selectionMenuSnippet}\n onSelect={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n style=\"mix-blend-mode: {mixBlendMode}\"\n {...annotationsProps}\n >\n {#snippet children(_object)}\n <Stamp\n documentId={annotationsProps.documentId}\n {isSelected}\n {annotation}\n pageIndex={annotationsProps.pageIndex}\n scale={annotationsProps.scale}\n onClick={(e: MouseEvent | TouchEvent) => handleClick(e, annotation)}\n />\n {/snippet}\n </AnnotationContainer>\n {/if}\n{/each}\n","<script lang=\"ts\">\n import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, type Rect } from '@embedpdf/models';\n import type { AnnotationTool } from '@embedpdf/plugin-annotation';\n import { useSelectionCapability } from '@embedpdf/plugin-selection/svelte';\n\n import { useAnnotationCapability } from '../hooks';\n import Highlight from './text-markup/Highlight.svelte';\n import Squiggly from './text-markup/Squiggly.svelte';\n import Underline from './text-markup/Underline.svelte';\n import Strikeout from './text-markup/Strikeout.svelte';\n\n interface TextMarkupProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n }\n\n let { documentId, pageIndex, scale }: TextMarkupProps = $props();\n\n const selectionCapability = useSelectionCapability();\n const annotationCapability = useAnnotationCapability();\n\n let rects = $state<Rect[]>([]);\n let boundingRect = $state<Rect | null>(null);\n let activeTool = $state<AnnotationTool | null>(null);\n\n // Get scoped APIs for this document\n const selectionProvides = $derived(\n selectionCapability.provides ? selectionCapability.provides.forDocument(documentId) : null,\n );\n const annotationProvides = $derived(\n annotationCapability.provides ? annotationCapability.provides.forDocument(documentId) : null,\n );\n\n // Subscribe to selection changes\n $effect(() => {\n if (!selectionProvides) return;\n\n const off = selectionProvides.onSelectionChange(() => {\n rects = selectionProvides.getHighlightRectsForPage(pageIndex);\n boundingRect = selectionProvides.getBoundingRectForPage(pageIndex);\n });\n return off;\n });\n\n // Subscribe to active tool changes\n $effect(() => {\n if (!annotationProvides) return;\n\n // Initialize with current active tool\n activeTool = annotationProvides.getActiveTool();\n\n const off = annotationProvides.onActiveToolChange((tool) => {\n activeTool = tool;\n });\n return off;\n });\n\n const mixBlendMode = $derived(\n activeTool?.defaults?.blendMode\n ? blendModeToCss(activeTool.defaults.blendMode)\n : activeTool?.defaults?.type === PdfAnnotationSubtype.HIGHLIGHT\n ? blendModeToCss(PdfBlendMode.Multiply)\n : blendModeToCss(PdfBlendMode.Normal),\n );\n</script>\n\n{#if boundingRect && activeTool && activeTool.defaults}\n {#if activeTool.defaults.type === PdfAnnotationSubtype.UNDERLINE}\n <div\n style:mix-blend-mode={mixBlendMode}\n style:pointer-events=\"none\"\n style:position=\"absolute\"\n style:inset=\"0\"\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n {scale}\n />\n </div>\n {:else if activeTool.defaults.type === PdfAnnotationSubtype.HIGHLIGHT}\n <div\n style:mix-blend-mode={mixBlendMode}\n style:pointer-events=\"none\"\n style:position=\"absolute\"\n style:inset=\"0\"\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n {scale}\n />\n </div>\n {:else if activeTool.defaults.type === PdfAnnotationSubtype.STRIKEOUT}\n <div\n style:mix-blend-mode={mixBlendMode}\n style:pointer-events=\"none\"\n style:position=\"absolute\"\n style:inset=\"0\"\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n {scale}\n />\n </div>\n {:else if activeTool.defaults.type === PdfAnnotationSubtype.SQUIGGLY}\n <div\n style:mix-blend-mode={mixBlendMode}\n style:pointer-events=\"none\"\n style:position=\"absolute\"\n style:inset=\"0\"\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n segmentRects={rects}\n {scale}\n />\n </div>\n {/if}\n{/if}\n","<script lang=\"ts\">\n import type { AnyPreviewState } from '@embedpdf/plugin-annotation';\n import { PdfAnnotationSubtype } from '@embedpdf/models';\n import Circle from './annotations/Circle.svelte';\n import Square from './annotations/Square.svelte';\n import Polygon from './annotations/Polygon.svelte';\n import Polyline from './annotations/Polyline.svelte';\n import Line from './annotations/Line.svelte';\n import Ink from './annotations/Ink.svelte';\n\n interface PreviewRendererProps {\n preview: AnyPreviewState;\n scale: number;\n }\n\n let { preview, scale }: PreviewRendererProps = $props();\n\n const bounds = $derived(preview.bounds);\n\n const style = $derived({\n left: bounds.origin.x * scale,\n top: bounds.origin.y * scale,\n width: bounds.size.width * scale,\n height: bounds.size.height * scale,\n });\n</script>\n\n{#if preview.type === PdfAnnotationSubtype.CIRCLE}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <Circle isSelected={false} {scale} {...preview.data} />\n </div>\n{:else if preview.type === PdfAnnotationSubtype.SQUARE}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <Square isSelected={false} {scale} {...preview.data} />\n </div>\n{:else if preview.type === PdfAnnotationSubtype.POLYGON}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <Polygon isSelected={false} {scale} {...preview.data} />\n </div>\n{:else if preview.type === PdfAnnotationSubtype.POLYLINE}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <Polyline isSelected={false} {scale} {...preview.data} />\n </div>\n{:else if preview.type === PdfAnnotationSubtype.LINE}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <Line isSelected={false} {scale} {...preview.data} />\n </div>\n{:else if preview.type === PdfAnnotationSubtype.INK}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <Ink isSelected={false} {scale} {...preview.data} />\n </div>\n{:else if preview.type === PdfAnnotationSubtype.FREETEXT}\n <div\n style:position=\"absolute\"\n style:left=\"{style.left}px\"\n style:top=\"{style.top}px\"\n style:width=\"{style.width}px\"\n style:height=\"{style.height}px\"\n style:pointer-events=\"none\"\n style:z-index=\"10\"\n >\n <!-- Render a simple dashed border preview -->\n <div\n style:width=\"100%\"\n style:height=\"100%\"\n style:border=\"1px dashed {preview.data.fontColor || '#000000'}\"\n style:background-color=\"transparent\"\n ></div>\n </div>\n{/if}\n","<script lang=\"ts\">\n import { useAnnotationPlugin } from '../hooks';\n import type { AnyPreviewState, HandlerServices } from '@embedpdf/plugin-annotation';\n import PreviewRenderer from './PreviewRenderer.svelte';\n\n interface AnnotationPaintLayerProps {\n documentId: string;\n pageIndex: number;\n scale: number;\n }\n\n let { documentId, pageIndex, scale }: AnnotationPaintLayerProps = $props();\n\n const annotationPlugin = useAnnotationPlugin();\n let previews = $state<Map<string, AnyPreviewState>>(new Map());\n\n let fileInputRef: HTMLInputElement | null = $state(null);\n let canvasRef: HTMLCanvasElement | null = $state(null);\n\n const services: HandlerServices = {\n requestFile: ({ accept, onFile }) => {\n if (!fileInputRef) return;\n const input = fileInputRef;\n input.accept = accept;\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n onFile(file);\n input.value = '';\n }\n };\n input.click();\n },\n processImage: ({ source, maxWidth, maxHeight, onComplete }) => {\n const canvas = canvasRef;\n if (!canvas || !canvas.getContext) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n let { naturalWidth: width, naturalHeight: height } = img;\n\n // --- SCALING LOGIC ---\n // Calculate the scale factor to fit within maxWidth and maxHeight\n const scaleX = maxWidth ? maxWidth / width : 1;\n const scaleY = maxHeight ? maxHeight / height : 1;\n const scaleFactor = Math.min(scaleX, scaleY, 1); // Ensure we don't scale up\n\n const finalWidth = width * scaleFactor;\n const finalHeight = height * scaleFactor;\n\n canvas.width = finalWidth;\n canvas.height = finalHeight;\n ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n if (typeof source !== 'string') URL.revokeObjectURL(img.src);\n\n onComplete({ imageData, width: finalWidth, height: finalHeight });\n };\n img.src = typeof source === 'string' ? source : URL.createObjectURL(source);\n },\n };\n\n $effect(() => {\n if (!annotationPlugin.plugin) return;\n\n return annotationPlugin.plugin.registerPageHandlers(documentId, pageIndex, scale, {\n services,\n onPreview: (toolId, state) => {\n previews = new Map(previews);\n if (state) {\n previews.set(toolId, state);\n } else {\n previews.delete(toolId);\n }\n },\n });\n });\n</script>\n\n<!-- Hidden DOM elements required by services -->\n<input bind:this={fileInputRef} type=\"file\" style:display=\"none\" />\n<canvas bind:this={canvasRef} style:display=\"none\"></canvas>\n\n<!-- Render any active previews from any tool -->\n{#each Array.from(previews.entries()) as [toolId, preview] (toolId)}\n <PreviewRenderer {preview} {scale} />\n{/each}\n","<script lang=\"ts\">\n import { Rotation, type PdfAnnotationObject } from '@embedpdf/models';\n import { useDocumentState } from '@embedpdf/core/svelte';\n import type { HTMLAttributes } from 'svelte/elements';\n import type {\n AnnotationSelectionMenuProps,\n AnnotationSelectionMenuRenderFn,\n CustomAnnotationRenderer,\n ResizeHandleUI,\n VertexHandleUI,\n } from '../types';\n import Annotations from './Annotations.svelte';\n import TextMarkup from './TextMarkup.svelte';\n import AnnotationPaintLayer from './AnnotationPaintLayer.svelte';\n import type { Snippet } from 'svelte';\n\n type AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n /** The ID of the document that this layer displays annotations for */\n documentId: string;\n pageIndex: number;\n scale?: number;\n rotation?: number;\n /** Render function for selection menu (schema-driven approach) */\n selectionMenu?: AnnotationSelectionMenuRenderFn;\n /** Snippet for custom selection menu (slot-based approach) */\n selectionMenuSnippet?: Snippet<[AnnotationSelectionMenuProps]>;\n style?: Record<string, string | number | undefined>;\n /** Customize resize handles */\n resizeUI?: ResizeHandleUI;\n /** Customize vertex handles */\n vertexUI?: VertexHandleUI;\n /** Customize selection outline color */\n selectionOutlineColor?: string;\n /** Customize annotation renderer */\n customAnnotationRenderer?: CustomAnnotationRenderer<PdfAnnotationObject>;\n };\n\n let {\n style,\n documentId,\n pageIndex,\n scale: overrideScale,\n rotation: overrideRotation,\n selectionMenu,\n selectionMenuSnippet,\n resizeUI,\n vertexUI,\n selectionOutlineColor,\n customAnnotationRenderer,\n ...restProps\n }: AnnotationLayerProps = $props();\n\n const documentState = useDocumentState(() => documentId);\n\n const page = $derived(documentState?.current?.document?.pages?.[pageIndex]);\n const pageWidth = $derived(page?.size?.width ?? 0);\n const pageHeight = $derived(page?.size?.height ?? 0);\n\n const actualScale = $derived(\n overrideScale !== undefined ? overrideScale : (documentState?.current?.scale ?? 1),\n );\n\n const actualRotation = $derived(\n overrideRotation !== undefined\n ? overrideRotation\n : (documentState?.current?.rotation ?? Rotation.Degree0),\n );\n</script>\n\n<div\n id=\"annotation-layer\"\n {...style ? Object.fromEntries(Object.entries(style).map(([k, v]) => [`style:${k}`, v])) : {}}\n {...restProps}\n>\n <Annotations\n {documentId}\n {selectionMenu}\n {selectionMenuSnippet}\n {pageIndex}\n scale={actualScale}\n rotation={actualRotation}\n {pageWidth}\n {pageHeight}\n {resizeUI}\n {vertexUI}\n {selectionOutlineColor}\n {customAnnotationRenderer}\n />\n <TextMarkup {documentId} {pageIndex} scale={actualScale} />\n <AnnotationPaintLayer {documentId} {pageIndex} scale={actualScale} />\n</div>\n"],"names":["_a","$$anchor"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { PdfAnnotationObject } from '@embedpdf/models';
|
|
2
|
+
import { TrackedAnnotation } from '../lib/index.ts';
|
|
3
|
+
import { SelectionMenuPropsBase, SelectionMenuRenderFn } from '@embedpdf/utils/svelte';
|
|
4
|
+
import { Snippet } from 'svelte';
|
|
5
|
+
export type ResizeDirection = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'none';
|
|
6
|
+
export interface AnnotationSelectionContext {
|
|
7
|
+
type: 'annotation';
|
|
8
|
+
annotation: TrackedAnnotation;
|
|
9
|
+
pageIndex: number;
|
|
10
|
+
}
|
|
11
|
+
export type AnnotationSelectionMenuProps = SelectionMenuPropsBase<AnnotationSelectionContext>;
|
|
12
|
+
export type AnnotationSelectionMenuRenderFn = SelectionMenuRenderFn<AnnotationSelectionContext>;
|
|
13
|
+
export interface HandleProps {
|
|
14
|
+
backgroundColor?: string;
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}
|
|
17
|
+
/** UI customization for resize handles */
|
|
18
|
+
export interface ResizeHandleUI {
|
|
19
|
+
/** Handle size in CSS px (default: 12) */
|
|
20
|
+
size?: number;
|
|
21
|
+
/** Default background color for the handle (used by default renderer) */
|
|
22
|
+
color?: string;
|
|
23
|
+
/** Custom renderer for each handle (overrides default) */
|
|
24
|
+
component?: Snippet<[HandleProps]>;
|
|
25
|
+
}
|
|
26
|
+
/** UI customization for vertex handles */
|
|
27
|
+
export interface VertexHandleUI {
|
|
28
|
+
/** Handle size in CSS px (default: 12) */
|
|
29
|
+
size?: number;
|
|
30
|
+
/** Default background color for the handle (used by default renderer) */
|
|
31
|
+
color?: string;
|
|
32
|
+
/** Custom renderer for each vertex (overrides default) */
|
|
33
|
+
component?: Snippet<[HandleProps]>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Props for the custom annotation renderer
|
|
37
|
+
*/
|
|
38
|
+
export interface CustomAnnotationRendererProps<T extends PdfAnnotationObject> {
|
|
39
|
+
annotation: T;
|
|
40
|
+
children: Snippet;
|
|
41
|
+
isSelected: boolean;
|
|
42
|
+
scale: number;
|
|
43
|
+
rotation: number;
|
|
44
|
+
pageWidth: number;
|
|
45
|
+
pageHeight: number;
|
|
46
|
+
pageIndex: number;
|
|
47
|
+
onSelect: (event: any) => void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Custom renderer for an annotation
|
|
51
|
+
*/
|
|
52
|
+
export type CustomAnnotationRenderer<T extends PdfAnnotationObject> = Snippet<[
|
|
53
|
+
CustomAnnotationRendererProps<T>
|
|
54
|
+
]>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { PdfAnnotationObject } from '@embedpdf/models';
|
|
2
2
|
import { TrackedAnnotation } from '../../lib/index.ts';
|
|
3
3
|
import { VertexConfig } from '../../shared-vue/types';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { AnnotationSelectionMenuRenderFn } from '../types';
|
|
5
|
+
declare const __VLS_export: <T extends PdfAnnotationObject>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
6
|
+
props: __VLS_PrettifyLocal<{
|
|
6
7
|
scale: number;
|
|
8
|
+
documentId: string;
|
|
7
9
|
pageIndex: number;
|
|
8
10
|
rotation: number;
|
|
9
11
|
pageWidth: number;
|
|
@@ -14,13 +16,14 @@ declare const _default: <T extends PdfAnnotationObject>(__VLS_props: NonNullable
|
|
|
14
16
|
isResizable: boolean;
|
|
15
17
|
lockAspectRatio?: boolean;
|
|
16
18
|
vertexConfig?: VertexConfig<T>;
|
|
19
|
+
selectionMenu?: AnnotationSelectionMenuRenderFn;
|
|
17
20
|
outlineOffset?: number;
|
|
18
21
|
onDoubleClick?: (event: PointerEvent | MouseEvent) => void;
|
|
19
22
|
onSelect: (event: TouchEvent | MouseEvent) => void;
|
|
20
23
|
zIndex?: number;
|
|
21
24
|
selectionOutlineColor?: string;
|
|
22
|
-
}
|
|
23
|
-
expose(exposed:
|
|
25
|
+
}> & import('vue').PublicProps;
|
|
26
|
+
expose: (exposed: {}) => void;
|
|
24
27
|
attrs: any;
|
|
25
28
|
slots: {
|
|
26
29
|
default?: (props: {
|
|
@@ -32,9 +35,10 @@ declare const _default: <T extends PdfAnnotationObject>(__VLS_props: NonNullable
|
|
|
32
35
|
'vertex-handle'?: (props: any) => any;
|
|
33
36
|
} & {
|
|
34
37
|
'selection-menu'?: (props: {
|
|
35
|
-
|
|
38
|
+
context: any;
|
|
36
39
|
selected: any;
|
|
37
40
|
rect: any;
|
|
41
|
+
placement: any;
|
|
38
42
|
menuWrapperProps: any;
|
|
39
43
|
}) => any;
|
|
40
44
|
};
|
|
@@ -42,6 +46,7 @@ declare const _default: <T extends PdfAnnotationObject>(__VLS_props: NonNullable
|
|
|
42
46
|
}>) => import('vue').VNode & {
|
|
43
47
|
__ctx?: Awaited<typeof __VLS_setup>;
|
|
44
48
|
};
|
|
49
|
+
declare const _default: typeof __VLS_export;
|
|
45
50
|
export default _default;
|
|
46
51
|
type __VLS_PrettifyLocal<T> = {
|
|
47
52
|
[K in keyof T as K]: T[K];
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import { ResizeHandleUI, VertexHandleUI } from '../types';
|
|
1
|
+
import { AnnotationSelectionMenuRenderFn, ResizeHandleUI, VertexHandleUI } from '../types';
|
|
2
2
|
type __VLS_Props = {
|
|
3
|
+
/** The ID of the document that this layer displays annotations for */
|
|
4
|
+
documentId: string;
|
|
3
5
|
pageIndex: number;
|
|
4
|
-
scale
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
rotation: number;
|
|
6
|
+
scale?: number;
|
|
7
|
+
rotation?: number;
|
|
8
|
+
/** Customize resize handles */
|
|
8
9
|
resizeUI?: ResizeHandleUI;
|
|
10
|
+
/** Customize vertex handles */
|
|
9
11
|
vertexUI?: VertexHandleUI;
|
|
12
|
+
/** Customize selection outline color */
|
|
10
13
|
selectionOutlineColor?: string;
|
|
14
|
+
/** Customize selection menu */
|
|
15
|
+
selectionMenu?: AnnotationSelectionMenuRenderFn;
|
|
11
16
|
};
|
|
12
17
|
declare var __VLS_6: any, __VLS_9: any, __VLS_12: any;
|
|
13
18
|
type __VLS_Slots = {} & {
|
|
@@ -17,8 +22,9 @@ type __VLS_Slots = {} & {
|
|
|
17
22
|
} & {
|
|
18
23
|
'vertex-handle'?: (props: typeof __VLS_12) => any;
|
|
19
24
|
};
|
|
20
|
-
declare const
|
|
21
|
-
declare const
|
|
25
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
26
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
27
|
+
declare const _default: typeof __VLS_export;
|
|
22
28
|
export default _default;
|
|
23
29
|
type __VLS_WithSlots<T, S> = T & {
|
|
24
30
|
new (): {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
type __VLS_Props = {
|
|
2
|
+
documentId: string;
|
|
2
3
|
pageIndex: number;
|
|
3
4
|
scale: number;
|
|
4
5
|
};
|
|
5
|
-
declare const
|
|
6
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
6
8
|
export default _default;
|
|
@@ -11,9 +11,10 @@ interface CircleProps {
|
|
|
11
11
|
scale: number;
|
|
12
12
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
13
13
|
}
|
|
14
|
-
declare const
|
|
14
|
+
declare const __VLS_export: import('vue').DefineComponent<CircleProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<CircleProps> & Readonly<{}>, {
|
|
15
15
|
color: string;
|
|
16
16
|
opacity: number;
|
|
17
17
|
strokeStyle: PdfAnnotationBorderStyle;
|
|
18
18
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
19
20
|
export default _default;
|
|
@@ -8,5 +8,6 @@ type __VLS_Props = {
|
|
|
8
8
|
scale: number;
|
|
9
9
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
10
10
|
};
|
|
11
|
-
declare const
|
|
11
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
declare const _default: typeof __VLS_export;
|
|
12
13
|
export default _default;
|
|
@@ -9,8 +9,9 @@ type __VLS_Props = {
|
|
|
9
9
|
scale: number;
|
|
10
10
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
11
11
|
};
|
|
12
|
-
declare const
|
|
12
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
13
13
|
color: string;
|
|
14
14
|
opacity: number;
|
|
15
15
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
16
|
+
declare const _default: typeof __VLS_export;
|
|
16
17
|
export default _default;
|
|
@@ -13,10 +13,11 @@ type __VLS_Props = {
|
|
|
13
13
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
14
14
|
isSelected: boolean;
|
|
15
15
|
};
|
|
16
|
-
declare const
|
|
16
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
17
17
|
color: string;
|
|
18
18
|
opacity: number;
|
|
19
19
|
strokeColor: string;
|
|
20
20
|
strokeStyle: PdfAnnotationBorderStyle;
|
|
21
21
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
22
|
+
declare const _default: typeof __VLS_export;
|
|
22
23
|
export default _default;
|
|
@@ -14,11 +14,12 @@ type __VLS_Props = {
|
|
|
14
14
|
currentVertex?: Position;
|
|
15
15
|
handleSize?: number;
|
|
16
16
|
};
|
|
17
|
-
declare const
|
|
17
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
18
18
|
color: string;
|
|
19
19
|
opacity: number;
|
|
20
20
|
strokeColor: string;
|
|
21
21
|
strokeStyle: PdfAnnotationBorderStyle;
|
|
22
22
|
handleSize: number;
|
|
23
23
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
24
|
+
declare const _default: typeof __VLS_export;
|
|
24
25
|
export default _default;
|
|
@@ -11,9 +11,10 @@ type __VLS_Props = {
|
|
|
11
11
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
12
12
|
lineEndings?: LineEndings;
|
|
13
13
|
};
|
|
14
|
-
declare const
|
|
14
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
15
15
|
color: string;
|
|
16
16
|
opacity: number;
|
|
17
17
|
strokeColor: string;
|
|
18
18
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
19
20
|
export default _default;
|
|
@@ -11,9 +11,10 @@ type __VLS_Props = {
|
|
|
11
11
|
scale: number;
|
|
12
12
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
13
13
|
};
|
|
14
|
-
declare const
|
|
14
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
15
15
|
color: string;
|
|
16
16
|
opacity: number;
|
|
17
17
|
strokeStyle: PdfAnnotationBorderStyle;
|
|
18
18
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
19
20
|
export default _default;
|
|
@@ -3,9 +3,11 @@ import { TrackedAnnotation } from '../../../lib/index.ts';
|
|
|
3
3
|
type __VLS_Props = {
|
|
4
4
|
isSelected: boolean;
|
|
5
5
|
annotation: TrackedAnnotation<PdfStampAnnoObject>;
|
|
6
|
+
documentId: string;
|
|
6
7
|
pageIndex: number;
|
|
7
8
|
scale: number;
|
|
8
9
|
onClick: (e: PointerEvent | TouchEvent) => void;
|
|
9
10
|
};
|
|
10
|
-
declare const
|
|
11
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
declare const _default: typeof __VLS_export;
|
|
11
13
|
export default _default;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { ResizeHandleUI, VertexHandleUI } from '../types';
|
|
1
|
+
import { AnnotationSelectionMenuRenderFn, ResizeHandleUI, VertexHandleUI } from '../types';
|
|
2
2
|
type __VLS_Props = {
|
|
3
|
+
documentId: string;
|
|
3
4
|
pageIndex: number;
|
|
4
5
|
scale: number;
|
|
5
6
|
rotation: number;
|
|
@@ -8,6 +9,8 @@ type __VLS_Props = {
|
|
|
8
9
|
resizeUI?: ResizeHandleUI;
|
|
9
10
|
vertexUI?: VertexHandleUI;
|
|
10
11
|
selectionOutlineColor?: string;
|
|
12
|
+
/** Render function for selection menu (schema-driven approach) */
|
|
13
|
+
selectionMenu?: AnnotationSelectionMenuRenderFn;
|
|
11
14
|
};
|
|
12
15
|
declare var __VLS_12: any, __VLS_15: any, __VLS_18: any, __VLS_31: any, __VLS_34: any, __VLS_37: any, __VLS_50: any, __VLS_53: any, __VLS_56: any, __VLS_69: any, __VLS_72: any, __VLS_75: any, __VLS_88: any, __VLS_91: any, __VLS_94: any, __VLS_107: any, __VLS_110: any, __VLS_113: any, __VLS_126: any, __VLS_129: any, __VLS_132: any, __VLS_145: any, __VLS_148: any, __VLS_151: any, __VLS_164: any, __VLS_177: any, __VLS_190: any, __VLS_203: any;
|
|
13
16
|
type __VLS_Slots = {} & {
|
|
@@ -67,8 +70,9 @@ type __VLS_Slots = {} & {
|
|
|
67
70
|
} & {
|
|
68
71
|
'selection-menu'?: (props: typeof __VLS_203) => any;
|
|
69
72
|
};
|
|
70
|
-
declare const
|
|
71
|
-
declare const
|
|
73
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
74
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
75
|
+
declare const _default: typeof __VLS_export;
|
|
72
76
|
export default _default;
|
|
73
77
|
type __VLS_WithSlots<T, S> = T & {
|
|
74
78
|
new (): {
|
|
@@ -3,5 +3,6 @@ type __VLS_Props = {
|
|
|
3
3
|
preview: AnyPreviewState;
|
|
4
4
|
scale: number;
|
|
5
5
|
};
|
|
6
|
-
declare const
|
|
6
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
7
8
|
export default _default;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { CSSProperties } from 'vue';
|
|
2
2
|
import { PdfAnnotationObject } from '@embedpdf/models';
|
|
3
3
|
type __VLS_Props = {
|
|
4
|
+
documentId: string;
|
|
4
5
|
pageIndex: number;
|
|
5
6
|
annotation: PdfAnnotationObject;
|
|
6
7
|
scaleFactor?: number;
|
|
7
8
|
style?: CSSProperties;
|
|
8
9
|
};
|
|
9
|
-
declare const
|
|
10
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
10
11
|
scaleFactor: number;
|
|
11
12
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
12
14
|
export default _default;
|
|
@@ -7,8 +7,9 @@ type __VLS_Props = {
|
|
|
7
7
|
scale: number;
|
|
8
8
|
onClick?: (e: PointerEvent | TouchEvent) => void;
|
|
9
9
|
};
|
|
10
|
-
declare const
|
|
10
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
11
11
|
color: string;
|
|
12
12
|
opacity: number;
|
|
13
13
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
declare const _default: typeof __VLS_export;
|
|
14
15
|
export default _default;
|