@embedpdf/plugin-annotation 1.0.11 → 1.0.12
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 +2 -693
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -266
- package/dist/index.js +180 -158
- package/dist/index.js.map +1 -1
- package/dist/lib/actions.d.ts +104 -0
- package/dist/lib/annotation-plugin.d.ts +33 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/manifest.d.ts +4 -0
- package/dist/lib/reducer.d.ts +5 -0
- package/dist/lib/selectors.d.ts +13 -0
- package/dist/lib/types.d.ts +121 -0
- package/dist/lib/utils.d.ts +11 -0
- package/dist/lib/variant-key.d.ts +8 -0
- package/dist/preact/adapter.d.ts +8 -0
- package/dist/preact/core.d.ts +1 -0
- package/dist/preact/index.cjs +2 -1038
- package/dist/preact/index.cjs.map +1 -1
- package/dist/preact/index.d.ts +1 -28
- package/dist/preact/index.js +126 -156
- package/dist/preact/index.js.map +1 -1
- package/dist/preact/interaction-manager.d.ts +1 -0
- package/dist/preact/selection.d.ts +1 -0
- package/dist/react/adapter.d.ts +2 -0
- package/dist/react/core.d.ts +1 -0
- package/dist/react/index.cjs +2 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +983 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/interaction-manager.d.ts +1 -0
- package/dist/react/selection.d.ts +1 -0
- package/dist/shared-preact/components/annotation-container.d.ts +19 -0
- package/dist/shared-preact/components/annotation-layer.d.ts +11 -0
- package/dist/shared-preact/components/annotations/ink-highlight-paint.d.ts +0 -0
- package/dist/shared-preact/components/annotations/ink-paint.d.ts +17 -0
- package/dist/shared-preact/components/annotations/ink.d.ts +23 -0
- package/dist/shared-preact/components/annotations.d.ts +7 -0
- package/dist/shared-preact/components/index.d.ts +1 -0
- package/dist/shared-preact/components/render-annotation.d.ts +11 -0
- package/dist/shared-preact/components/text-markup/highlight.d.ts +13 -0
- package/dist/shared-preact/components/text-markup/squiggly.d.ts +13 -0
- package/dist/shared-preact/components/text-markup/strikeout.d.ts +13 -0
- package/dist/shared-preact/components/text-markup/underline.d.ts +13 -0
- package/dist/shared-preact/components/text-markup.d.ts +6 -0
- package/dist/shared-preact/hooks/index.d.ts +1 -0
- package/dist/shared-preact/hooks/use-annotation.d.ts +11 -0
- package/dist/shared-preact/index.d.ts +2 -0
- package/dist/shared-preact/resize-ink.d.ts +17 -0
- package/dist/shared-preact/types.d.ts +1 -0
- package/dist/shared-react/components/annotation-container.d.ts +19 -0
- package/dist/shared-react/components/annotation-layer.d.ts +11 -0
- package/dist/shared-react/components/annotations/ink-highlight-paint.d.ts +0 -0
- package/dist/shared-react/components/annotations/ink-paint.d.ts +17 -0
- package/dist/shared-react/components/annotations/ink.d.ts +23 -0
- package/dist/shared-react/components/annotations.d.ts +7 -0
- package/dist/shared-react/components/index.d.ts +1 -0
- package/dist/shared-react/components/render-annotation.d.ts +11 -0
- package/dist/shared-react/components/text-markup/highlight.d.ts +13 -0
- package/dist/shared-react/components/text-markup/squiggly.d.ts +13 -0
- package/dist/shared-react/components/text-markup/strikeout.d.ts +13 -0
- package/dist/shared-react/components/text-markup/underline.d.ts +13 -0
- package/dist/shared-react/components/text-markup.d.ts +6 -0
- package/dist/shared-react/hooks/index.d.ts +1 -0
- package/dist/shared-react/hooks/use-annotation.d.ts +11 -0
- package/dist/shared-react/index.d.ts +2 -0
- package/dist/shared-react/resize-ink.d.ts +17 -0
- package/dist/shared-react/types.d.ts +1 -0
- package/package.json +17 -15
- package/dist/index.d.cts +0 -266
- package/dist/preact/index.d.cts +0 -28
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/preact/index.ts","../../src/preact/hooks/use-annotation.ts","../../src/preact/components/annotations.tsx","../../src/preact/components/annotation-container.tsx","../../src/preact/components/text-markup/highlight.tsx","../../src/preact/components/text-markup/underline.tsx","../../src/preact/components/text-markup/strikeout.tsx","../../src/preact/components/text-markup/squiggly.tsx","../../src/preact/components/annotations/ink.tsx","../../src/shared/resize-ink.ts","../../src/preact/components/text-markup.tsx","../../src/preact/components/annotations/ink-paint.tsx","../../src/preact/components/annotation-layer.tsx"],"sourcesContent":["export * from './hooks';\nexport * from './components';\n","import { useCapability, usePlugin } from '@embedpdf/core/preact';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/preact';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n TrackedAnnotation,\n} from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../hooks';\nimport { useMemo, useState, useEffect, useCallback } from 'preact/hooks';\nimport { AnnotationContainer } from './annotation-container';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/preact';\nimport { resizeInkAnnotation } from '../../shared/resize-ink';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale } = annotationsProps;\n const { provides: annotationProvides } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n\n useEffect(() => {\n if (annotationProvides) {\n annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<MouseEvent> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\n selectionProvides.clear();\n }\n },\n [annotationProvides, selectionProvides, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.localId === annotation.localId;\n\n switch (annotation.object.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Underline\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Strikeout\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Squiggly\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n rect={annotation.object.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{ mixBlendMode: 'multiply' }}\n {...annotationsProps}\n >\n <Highlight\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n rect={annotation.object.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.INK:\n return (\n <AnnotationContainer\n key={annotation.localId}\n isSelected={isSelected}\n trackedAnnotation={annotation}\n outlineOffset={6}\n computeResizePatch={resizeInkAnnotation}\n {...annotationsProps}\n >\n {(obj: PdfInkAnnoObject) => (\n <Ink\n color={obj.color}\n opacity={obj.opacity}\n strokeWidth={obj.strokeWidth}\n inkList={obj.inkList}\n rect={obj.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n default:\n return null;\n }\n })}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { ComponentChildren, JSX } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationObject, Rect, restoreOffset, restoreRect } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { ResizeDirection } from '../../shared/types';\n\ntype AnnotationContainerProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n scale: number;\n isSelected?: boolean;\n pageIndex: number;\n rotation: number;\n trackedAnnotation: TrackedAnnotation;\n children: ComponentChildren | ((annotation: PdfAnnotationObject) => ComponentChildren);\n style?: JSX.CSSProperties;\n isDraggable?: boolean;\n isResizable?: boolean;\n outlineOffset?: number;\n computeResizePatch?: (\n original: PdfAnnotationObject,\n newRect: Rect,\n direction: ResizeDirection,\n ) => Partial<PdfAnnotationObject>;\n};\n\ntype Point = { x: number; y: number };\n\nexport function AnnotationContainer({\n scale,\n pageIndex,\n rotation,\n trackedAnnotation,\n children,\n style,\n outlineOffset = 1,\n isSelected = false,\n isDraggable = true,\n isResizable = true,\n computeResizePatch,\n ...props\n}: AnnotationContainerProps) {\n const { provides: annotationProvides } = useAnnotationCapability();\n const ref = useRef<HTMLDivElement>(null);\n const [dragState, setDragState] = useState<'idle' | 'dragging' | 'resizing'>('idle');\n const [resizeDirection, setResizeDirection] = useState<ResizeDirection | null>(null);\n const [startPos, setStartPos] = useState<Point | null>(null);\n const [startRect, setStartRect] = useState<Rect | null>(null);\n const [currentRect, setCurrentRect] = useState<Rect>(trackedAnnotation.object.rect);\n const [previewObject, setPreviewObject] = useState<Partial<PdfAnnotationObject> | null>(null);\n\n useEffect(() => {\n setCurrentRect(trackedAnnotation.object.rect);\n setPreviewObject(null);\n }, [trackedAnnotation]);\n\n const handlePointerDown = (e: PointerEvent) => {\n if (!isSelected) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n const target = e.target as HTMLElement;\n\n if (isResizable && target.classList.contains('resize-handle')) {\n setDragState('resizing');\n setResizeDirection(target.dataset.direction as ResizeDirection);\n } else if (isDraggable) {\n setDragState('dragging');\n } else {\n return;\n }\n\n setStartPos({ x: e.clientX, y: e.clientY });\n setStartRect(currentRect);\n\n ref.current?.setPointerCapture(e.pointerId);\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (dragState === 'idle' || !startPos || !startRect) return;\n\n const dispDelta = { x: e.clientX - startPos.x, y: e.clientY - startPos.y };\n const { x: dx, y: dy } = restoreOffset(dispDelta, rotation, scale);\n\n let newOriginX = startRect.origin.x;\n let newOriginY = startRect.origin.y;\n let newWidth = startRect.size.width;\n let newHeight = startRect.size.height;\n\n if (dragState === 'dragging') {\n newOriginX += dx;\n newOriginY += dy;\n } else if (dragState === 'resizing' && resizeDirection) {\n if (resizeDirection.includes('right')) {\n newWidth += dx;\n } else if (resizeDirection.includes('left')) {\n newOriginX += dx;\n newWidth -= dx;\n }\n\n if (resizeDirection.includes('bottom')) {\n newHeight += dy;\n } else if (resizeDirection.includes('top')) {\n newOriginY += dy;\n newHeight -= dy;\n }\n\n // Prevent negative dimensions\n if (newWidth < 1 || newHeight < 1) return;\n }\n\n const tentativeRect = {\n origin: { x: newOriginX, y: newOriginY },\n size: { width: newWidth, height: newHeight },\n };\n\n let previewPatch: Partial<PdfAnnotationObject> = { rect: tentativeRect };\n\n if (computeResizePatch) {\n const dir = dragState === 'resizing' ? resizeDirection : 'bottom-right';\n if (dir) {\n previewPatch = computeResizePatch(trackedAnnotation.object, tentativeRect, dir);\n }\n }\n\n setCurrentRect(previewPatch.rect || tentativeRect);\n setPreviewObject(previewPatch);\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n if (dragState === 'idle') return;\n\n const usedDirection = resizeDirection || 'bottom-right';\n setDragState('idle');\n setResizeDirection(null);\n\n ref.current?.releasePointerCapture(e.pointerId);\n\n // Commit the changes\n if (annotationProvides && trackedAnnotation) {\n let patch: Partial<PdfAnnotationObject> = { rect: currentRect };\n if (computeResizePatch && usedDirection) {\n patch = computeResizePatch(trackedAnnotation.object, currentRect, usedDirection);\n }\n annotationProvides.updateAnnotation(pageIndex, trackedAnnotation.localId, patch);\n }\n\n setStartPos(null);\n setStartRect(null);\n setPreviewObject(null);\n };\n\n const currentObject = previewObject\n ? ({ ...trackedAnnotation.object, ...previewObject } as PdfAnnotationObject)\n : trackedAnnotation.object;\n\n return (\n <div\n ref={ref}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{\n position: 'absolute',\n outline: isSelected ? '1px solid #007ACC' : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n left: `${currentRect.origin.x * scale}px`,\n top: `${currentRect.origin.y * scale}px`,\n width: `${currentRect.size.width * scale}px`,\n height: `${currentRect.size.height * scale}px`,\n pointerEvents: isSelected ? 'auto' : 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n ...style,\n }}\n {...props}\n >\n {typeof children === 'function' ? children(currentObject) : children}\n {isSelected && isResizable && (\n <>\n <div\n className=\"resize-handle\"\n data-direction=\"top-left\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"top-right\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-left\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-right\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n </>\n )}\n </div>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : null,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent) => void;\n style?: JSX.CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<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 = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { useMemo } from 'preact/hooks';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps) {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\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 }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={opacity}\n pointerEvents=\"visibleStroke\"\n onMouseDown={onClick}\n style={{\n cursor: 'pointer',\n }}\n />\n ))}\n </svg>\n );\n}\n","import {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { ResizeDirection } from './types';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport function resizeInkAnnotation(\n original: PdfAnnotationObject, // Assumes type=INK\n newRect: Rect,\n direction: ResizeDirection,\n uniform: boolean = false,\n): Partial<PdfInkAnnoObject> {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n newRect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n newRect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: newRect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: newRect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = original.strokeWidth * avgScale;\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: newRect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n}\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { PdfAnnotationSubtype, Rect } from '@embedpdf/models';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/preact';\n\nimport { useEffect, useState } from 'preact/hooks';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<ActiveTool>({ mode: null, defaults: null });\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n const off = selectionProvides.onSelectionChange(() => {\n setRects(selectionProvides.getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.getBoundingRectForPage(pageIndex));\n });\n return off;\n }, [selectionProvides, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!boundingRect) return null;\n\n switch (activeTool.mode) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <div\n style={{\n mixBlendMode: 'multiply',\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","/** @jsxImportSource preact */\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/preact';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { PdfInkListObject, Rect, PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\nconst MAX_STROKE_WIDTH = 30;\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ mode: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (activeTool.mode !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand rect by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const rectMinX = minX - halfStroke;\n const rectMinY = minY - halfStroke;\n const rectMaxX = maxX + halfStroke;\n const rectMaxY = maxY + halfStroke;\n\n // Ignore tiny drawings\n if (rectMaxX - rectMinX < 1 || rectMaxY - rectMinY < 1) return;\n\n const rect: Rect = {\n origin: { x: rectMinX, y: rectMinY },\n size: { width: rectMaxX - rectMinX, height: rectMaxY - rectMinY },\n };\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setAnnotationMode(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand bounds by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const svgMaxX = maxX + halfStroke;\n const svgMaxY = maxY + halfStroke;\n\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const paths = currentStrokes.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // Adjust coordinates relative to the expanded SVG bounds\n const lx = x - svgMinX;\n const ly = y - svgMinY;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={toolColor}\n strokeWidth={toolStrokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={toolOpacity}\n />\n ))}\n </svg>\n );\n};\n","/** @jsxImportSource preact */\nimport { JSX } from 'preact';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\n\ntype AnnotationLayerProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n style?: JSX.CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations pageIndex={pageIndex} scale={scale} rotation={rotation} />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n </div>\n );\n}\n"],"mappings":"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","names":["import_models","import_preact","import_plugin_annotation","import_hooks","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_hooks","import_jsx_runtime","import_preact","import_models","import_jsx_runtime","import_models","import_preact","import_hooks","import_jsx_runtime","import_hooks","import_preact","import_models","import_jsx_runtime","allPoints","minX","minY","maxX","maxY","halfStroke","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-annotation.ts","../../src/shared/components/annotation-container.tsx","../../src/shared/components/text-markup/highlight.tsx","../../src/shared/components/text-markup/underline.tsx","../../src/shared/components/text-markup/strikeout.tsx","../../src/shared/components/text-markup/squiggly.tsx","../../src/shared/components/annotations/ink.tsx","../../src/shared/resize-ink.ts","../../src/shared/components/annotations.tsx","../../src/shared/components/text-markup.tsx","../../src/shared/components/annotations/ink-paint.tsx","../../src/shared/components/annotation-layer.tsx"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { AnnotationPlugin } from '@embedpdf/plugin-annotation';\n\nexport const useAnnotationPlugin = () => usePlugin<AnnotationPlugin>(AnnotationPlugin.id);\nexport const useAnnotationCapability = () => useCapability<AnnotationPlugin>(AnnotationPlugin.id);\n","import {\n JSX,\n HTMLAttributes,\n CSSProperties,\n useEffect,\n useRef,\n useState,\n PointerEvent,\n} from '@framework';\nimport { TrackedAnnotation } from '@embedpdf/plugin-annotation';\nimport { PdfAnnotationObject, Rect, restoreOffset } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../hooks';\nimport { ResizeDirection } from '../../shared/types';\n\ntype AnnotationContainerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style' | 'children'> & {\n scale: number;\n isSelected?: boolean;\n pageIndex: number;\n rotation: number;\n trackedAnnotation: TrackedAnnotation;\n children: JSX.Element | ((annotation: PdfAnnotationObject) => JSX.Element);\n style?: CSSProperties;\n isDraggable?: boolean;\n isResizable?: boolean;\n outlineOffset?: number;\n computeResizePatch?: (\n original: PdfAnnotationObject,\n newRect: Rect,\n direction: ResizeDirection,\n ) => Partial<PdfAnnotationObject>;\n};\n\ntype Point = { x: number; y: number };\n\nexport function AnnotationContainer({\n scale,\n pageIndex,\n rotation,\n trackedAnnotation,\n children,\n style,\n outlineOffset = 1,\n isSelected = false,\n isDraggable = true,\n isResizable = true,\n computeResizePatch,\n ...props\n}: AnnotationContainerProps): JSX.Element {\n const { provides: annotationProvides } = useAnnotationCapability();\n const ref = useRef<HTMLDivElement>(null);\n const [dragState, setDragState] = useState<'idle' | 'dragging' | 'resizing'>('idle');\n const [resizeDirection, setResizeDirection] = useState<ResizeDirection | null>(null);\n const [startPos, setStartPos] = useState<Point | null>(null);\n const [startRect, setStartRect] = useState<Rect | null>(null);\n const [currentRect, setCurrentRect] = useState<Rect>(trackedAnnotation.object.rect);\n const [previewObject, setPreviewObject] = useState<Partial<PdfAnnotationObject> | null>(null);\n\n useEffect(() => {\n setCurrentRect(trackedAnnotation.object.rect);\n setPreviewObject(null);\n }, [trackedAnnotation]);\n\n const handlePointerDown = (e: PointerEvent<HTMLDivElement>) => {\n if (!isSelected) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n const target = e.target as HTMLElement;\n\n if (isResizable && target.classList.contains('resize-handle')) {\n setDragState('resizing');\n setResizeDirection(target.dataset.direction as ResizeDirection);\n } else if (isDraggable) {\n setDragState('dragging');\n } else {\n return;\n }\n\n setStartPos({ x: e.clientX, y: e.clientY });\n setStartRect(currentRect);\n\n ref.current?.setPointerCapture(e.pointerId);\n };\n\n const handlePointerMove = (e: PointerEvent<HTMLDivElement>) => {\n if (dragState === 'idle' || !startPos || !startRect) return;\n\n const dispDelta = { x: e.clientX - startPos.x, y: e.clientY - startPos.y };\n const { x: dx, y: dy } = restoreOffset(dispDelta, rotation, scale);\n\n let newOriginX = startRect.origin.x;\n let newOriginY = startRect.origin.y;\n let newWidth = startRect.size.width;\n let newHeight = startRect.size.height;\n\n if (dragState === 'dragging') {\n newOriginX += dx;\n newOriginY += dy;\n } else if (dragState === 'resizing' && resizeDirection) {\n if (resizeDirection.includes('right')) {\n newWidth += dx;\n } else if (resizeDirection.includes('left')) {\n newOriginX += dx;\n newWidth -= dx;\n }\n\n if (resizeDirection.includes('bottom')) {\n newHeight += dy;\n } else if (resizeDirection.includes('top')) {\n newOriginY += dy;\n newHeight -= dy;\n }\n\n // Prevent negative dimensions\n if (newWidth < 1 || newHeight < 1) return;\n }\n\n const tentativeRect = {\n origin: { x: newOriginX, y: newOriginY },\n size: { width: newWidth, height: newHeight },\n };\n\n let previewPatch: Partial<PdfAnnotationObject> = { rect: tentativeRect };\n\n if (computeResizePatch) {\n const dir = dragState === 'resizing' ? resizeDirection : 'bottom-right';\n if (dir) {\n previewPatch = computeResizePatch(trackedAnnotation.object, tentativeRect, dir);\n }\n }\n\n setCurrentRect(previewPatch.rect || tentativeRect);\n setPreviewObject(previewPatch);\n };\n\n const handlePointerUp = (e: PointerEvent<HTMLDivElement>) => {\n if (dragState === 'idle') return;\n\n const usedDirection = resizeDirection || 'bottom-right';\n setDragState('idle');\n setResizeDirection(null);\n\n ref.current?.releasePointerCapture(e.pointerId);\n\n // Commit the changes\n if (annotationProvides && trackedAnnotation) {\n let patch: Partial<PdfAnnotationObject> = { rect: currentRect };\n if (computeResizePatch && usedDirection) {\n patch = computeResizePatch(trackedAnnotation.object, currentRect, usedDirection);\n }\n annotationProvides.updateAnnotation(pageIndex, trackedAnnotation.localId, patch);\n }\n\n setStartPos(null);\n setStartRect(null);\n setPreviewObject(null);\n };\n\n const currentObject = previewObject\n ? ({ ...trackedAnnotation.object, ...previewObject } as PdfAnnotationObject)\n : trackedAnnotation.object;\n\n return (\n <div\n ref={ref}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{\n position: 'absolute',\n outline: isSelected ? '1px solid #007ACC' : 'none',\n outlineOffset: isSelected ? `${outlineOffset}px` : '0px',\n left: `${currentRect.origin.x * scale}px`,\n top: `${currentRect.origin.y * scale}px`,\n width: `${currentRect.size.width * scale}px`,\n height: `${currentRect.size.height * scale}px`,\n pointerEvents: isSelected ? 'auto' : 'none',\n cursor: isSelected && isDraggable ? 'move' : 'default',\n ...style,\n }}\n {...props}\n >\n {typeof children === 'function' ? children(currentObject) : children}\n {isSelected && isResizable && (\n <>\n <div\n className=\"resize-handle\"\n data-direction=\"top-left\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"top-right\"\n style={{\n position: 'absolute',\n top: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-left\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n left: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nwse-resize' : 'nesw-resize',\n }}\n />\n <div\n className=\"resize-handle\"\n data-direction=\"bottom-right\"\n style={{\n position: 'absolute',\n bottom: -7 - outlineOffset,\n right: -7 - outlineOffset,\n width: 13,\n height: 13,\n background: 'blue',\n borderRadius: '50%',\n cursor: rotation % 2 ? 'nesw-resize' : 'nwse-resize',\n }}\n />\n </>\n )}\n </div>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype HighlightProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Highlight({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: HighlightProps) {\n return (\n <>\n {rects.map((b, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? b.origin.x - rect.origin.x : b.origin.x) * scale,\n top: (rect ? b.origin.y - rect.origin.y : b.origin.y) * scale,\n width: b.size.width * scale,\n height: b.size.height * scale,\n background: color,\n opacity: opacity,\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : undefined,\n ...style,\n }}\n {...props}\n />\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype UnderlineProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Underline({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: UnderlineProps) {\n const thickness = 2 * scale; // 2 CSS px at 100 % zoom\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual underline */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype StrikeoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Strikeout({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: StrikeoutProps) {\n const thickness = 2 * scale;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual strikeout line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n width: '100%',\n height: thickness,\n background: color,\n opacity: opacity,\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { HTMLAttributes, CSSProperties, MouseEvent } from '@framework';\nimport { Rect } from '@embedpdf/models';\n\ntype SquigglyProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n color?: string;\n opacity?: number;\n rects: Rect[];\n rect?: Rect;\n scale: number;\n onClick?: (e: MouseEvent<HTMLDivElement>) => void;\n style?: CSSProperties;\n};\n\nexport function Squiggly({\n color = '#FFFF00',\n opacity = 0.5,\n rects,\n rect,\n scale,\n onClick,\n style,\n ...props\n}: SquigglyProps) {\n const amplitude = 2 * scale; // wave height\n const period = 6 * scale; // wave length\n\n const svg = `<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 = `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`;\n\n return (\n <>\n {rects.map((r, i) => (\n <div\n key={i}\n onMouseDown={onClick}\n style={{\n position: 'absolute',\n left: (rect ? r.origin.x - rect.origin.x : r.origin.x) * scale,\n top: (rect ? r.origin.y - rect.origin.y : r.origin.y) * scale,\n width: r.size.width * scale,\n height: r.size.height * scale,\n background: 'transparent',\n pointerEvents: onClick ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : 'default',\n zIndex: onClick ? 1 : 0,\n ...style,\n }}\n {...props}\n >\n {/* Visual squiggly line */}\n <div\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: '100%',\n height: amplitude * 2,\n backgroundImage: svgDataUri,\n backgroundRepeat: 'repeat-x',\n backgroundSize: `${period}px ${amplitude * 2}px`,\n opacity: opacity,\n pointerEvents: 'none',\n }}\n />\n </div>\n ))}\n </>\n );\n}\n","import { useMemo, MouseEvent } from '@framework';\nimport { PdfInkListObject, Rect } from '@embedpdf/models';\n\n/* ---------------------------------------------------------------- *\\\n|* Types *|\n\\* ---------------------------------------------------------------- */\n\ninterface InkProps {\n /** Stroke colour (falls back to PDFium default black) */\n color?: string;\n /** 0 – 1 */\n opacity?: number;\n /** Line width in PDF units */\n strokeWidth: number;\n /** Array of strokes — exactly as in your JSON */\n inkList: PdfInkListObject[];\n /** Bounding box of the whole annotation */\n rect: Rect;\n /** Page zoom factor */\n scale: number;\n /** Callback for when the annotation is clicked */\n onClick?: (e: MouseEvent<SVGPathElement>) => void;\n}\n\n/**\n * Renders a PDF Ink annotation (free-hand drawing) as SVG.\n */\nexport function Ink({\n color = '#000000',\n opacity = 1,\n strokeWidth,\n inkList,\n rect,\n scale,\n onClick,\n}: InkProps): JSX.Element {\n /* convert each stroke to an SVG <path d=\"\"> string */\n const paths = useMemo(() => {\n return inkList.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // localise to the annotation’s own bbox so viewBox can stay tidy\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 }, [inkList, rect]);\n\n /* absolute placement + scaling just like your text-markup components */\n const width = rect.size.width * scale;\n const height = rect.size.height * scale;\n\n return (\n <svg\n style={{\n position: 'absolute',\n width,\n height,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={width}\n height={height}\n viewBox={`0 0 ${rect.size.width} ${rect.size.height}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={opacity}\n pointerEvents=\"visibleStroke\"\n onMouseDown={onClick}\n style={{\n cursor: 'pointer',\n }}\n />\n ))}\n </svg>\n );\n}\n","import {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfInkAnnoObject,\n Rect,\n} from '@embedpdf/models';\nimport { ResizeDirection } from './types';\n\n/**\n * Computes a patch for resizing an ink annotation.\n * - Scales all points in inkList to fit the new rect.\n * - Scales strokeWidth proportionally (using average scale factor).\n * - Handles non-uniform scaling (stretch).\n * - Optionally preserves aspect ratio (set uniform=true).\n *\n * @param original The original ink annotation object.\n * @param newRect The new bounding rect after resize.\n * @param direction The resize handle direction (affects origin adjustments if needed).\n * @param uniform If true, constrains to uniform scaling (uses min scale factor).\n * @returns Partial patch { rect, inkList, strokeWidth } to apply.\n */\nexport function resizeInkAnnotation(\n original: PdfAnnotationObject, // Assumes type=INK\n newRect: Rect,\n direction: ResizeDirection,\n uniform: boolean = false,\n): Partial<PdfInkAnnoObject> {\n if (original.type !== PdfAnnotationSubtype.INK) {\n throw new Error('resizeInkAnnotation: original is not an ink annotation');\n }\n\n const oldRect = original.rect;\n let scaleX = newRect.size.width / oldRect.size.width;\n let scaleY = newRect.size.height / oldRect.size.height;\n\n // Enforce minimum size to avoid collapse\n const minSize = 10; // Arbitrary PDF units; adjust as needed\n if (newRect.size.width < minSize || newRect.size.height < minSize) {\n // Return empty patch or throw; for now, clamp\n scaleX = Math.max(scaleX, minSize / oldRect.size.width);\n scaleY = Math.max(scaleY, minSize / oldRect.size.height);\n newRect = {\n origin: newRect.origin,\n size: {\n width: oldRect.size.width * scaleX,\n height: oldRect.size.height * scaleY,\n },\n };\n }\n\n // Optional: Uniform scaling (preserve aspect ratio)\n if (uniform) {\n const minScale = Math.min(scaleX, scaleY);\n scaleX = minScale;\n scaleY = minScale;\n // Adjust newRect size accordingly (keep origin the same)\n newRect.size = {\n width: oldRect.size.width * minScale,\n height: oldRect.size.height * minScale,\n };\n }\n\n // Scale points: Normalize relative to old origin, scale, then add new origin\n const newInkList = original.inkList.map((stroke) => ({\n points: stroke.points.map((p) => ({\n x: newRect.origin.x + (p.x - oldRect.origin.x) * scaleX,\n y: newRect.origin.y + (p.y - oldRect.origin.y) * scaleY,\n })),\n }));\n\n // Scale strokeWidth: Use average scale (preserves \"thickness feel\")\n // Alternatives: Math.min(scaleX, scaleY) for conservative, or sqrt(scaleX * scaleY) for area-preserving\n const avgScale = (scaleX + scaleY) / 2;\n const newStrokeWidth = original.strokeWidth * avgScale;\n\n // Optional: Adjust based on direction (e.g., if resizing from top-left, points might need flip/recalc, but usually not needed as scaling handles it)\n\n return {\n rect: newRect,\n inkList: newInkList,\n strokeWidth: newStrokeWidth,\n };\n}\n","import {\n blendModeToCss,\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfBlendMode,\n PdfInkAnnoObject,\n} from '@embedpdf/models';\nimport { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport {\n getAnnotationsByPageIndex,\n getSelectedAnnotationByPageIndex,\n TrackedAnnotation,\n} from '@embedpdf/plugin-annotation';\nimport { useAnnotationCapability } from '../hooks';\nimport { useMemo, useState, useEffect, useCallback, MouseEvent } from '@framework';\nimport { AnnotationContainer } from './annotation-container';\nimport { Highlight } from './text-markup/highlight';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Ink } from './annotations/ink';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\nimport { resizeInkAnnotation } from '../../shared/resize-ink';\n\ninterface AnnotationsProps {\n pageIndex: number;\n scale: number;\n rotation: number;\n}\n\nexport function Annotations(annotationsProps: AnnotationsProps) {\n const { pageIndex, scale } = annotationsProps;\n const { provides: annotationProvides } = useAnnotationCapability();\n const { provides: selectionProvides } = useSelectionCapability();\n const [annotations, setAnnotations] = useState<TrackedAnnotation[]>([]);\n const { register } = usePointerHandlers({ pageIndex });\n const [selectionState, setSelectionState] = useState<TrackedAnnotation | null>(null);\n\n useEffect(() => {\n if (annotationProvides) {\n annotationProvides.onStateChange((state) => {\n setAnnotations(getAnnotationsByPageIndex(state, pageIndex));\n setSelectionState(getSelectedAnnotationByPageIndex(state, pageIndex));\n });\n }\n }, [annotationProvides]);\n\n const handlers = useMemo(\n (): PointerEventHandlers<MouseEvent> => ({\n onPointerDown: (_, pe) => {\n // Only deselect if clicking directly on the layer (not on an annotation)\n if (pe.target === pe.currentTarget && annotationProvides) {\n annotationProvides.deselectAnnotation();\n }\n },\n }),\n [annotationProvides],\n );\n\n const handleClick = useCallback(\n (e: MouseEvent, annotation: TrackedAnnotation) => {\n e.stopPropagation();\n if (annotationProvides && selectionProvides) {\n annotationProvides.selectAnnotation(pageIndex, annotation.localId);\n selectionProvides.clear();\n }\n },\n [annotationProvides, selectionProvides, pageIndex],\n );\n\n useEffect(() => {\n return register(handlers);\n }, [register, handlers]);\n\n return (\n <>\n {annotations.map((annotation) => {\n const isSelected = selectionState?.localId === annotation.localId;\n\n switch (annotation.object.type) {\n case PdfAnnotationSubtype.UNDERLINE:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n <Underline\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.STRIKEOUT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n <Strikeout\n rect={annotation.object.rect}\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.SQUIGGLY:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n <Squiggly\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n rect={annotation.object.rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.HIGHLIGHT:\n return (\n <AnnotationContainer\n key={annotation.localId}\n trackedAnnotation={annotation}\n isSelected={isSelected}\n isDraggable={false}\n isResizable={false}\n style={{\n mixBlendMode: blendModeToCss(\n annotation.object.blendMode ?? PdfBlendMode.Multiply,\n ),\n }}\n {...annotationsProps}\n >\n <Highlight\n color={annotation.object.color}\n opacity={annotation.object.opacity}\n rects={annotation.object.segmentRects}\n scale={scale}\n rect={annotation.object.rect}\n onClick={(e) => handleClick(e, annotation)}\n />\n </AnnotationContainer>\n );\n case PdfAnnotationSubtype.INK:\n return (\n <AnnotationContainer\n key={annotation.localId}\n isSelected={isSelected}\n trackedAnnotation={annotation}\n outlineOffset={6}\n computeResizePatch={resizeInkAnnotation}\n style={{\n mixBlendMode: blendModeToCss(annotation.object.blendMode ?? PdfBlendMode.Normal),\n }}\n {...annotationsProps}\n >\n {(obj: PdfAnnotationObject) => (\n <Ink\n color={(obj as PdfInkAnnoObject).color}\n opacity={(obj as PdfInkAnnoObject).opacity}\n strokeWidth={(obj as PdfInkAnnoObject).strokeWidth}\n inkList={(obj as PdfInkAnnoObject).inkList}\n rect={(obj as PdfInkAnnoObject).rect}\n scale={scale}\n onClick={(e) => handleClick(e, annotation)}\n />\n )}\n </AnnotationContainer>\n );\n default:\n return null;\n }\n })}\n </>\n );\n}\n","import { blendModeToCss, PdfAnnotationSubtype, PdfBlendMode, Rect } from '@embedpdf/models';\nimport { ActiveTool, makeVariantKey } from '@embedpdf/plugin-annotation';\nimport { useSelectionCapability } from '@embedpdf/plugin-selection/@framework';\n\nimport { useEffect, useState } from '@framework';\nimport { useAnnotationCapability } from '../hooks';\nimport { Highlight } from './text-markup/highlight';\nimport { Squiggly } from './text-markup/squiggly';\nimport { Underline } from './text-markup/underline';\nimport { Strikeout } from './text-markup/strikeout';\n\ninterface TextMarkupProps {\n pageIndex: number;\n scale: number;\n}\n\nexport function TextMarkup({ pageIndex, scale }: TextMarkupProps) {\n const { provides: selectionProvides } = useSelectionCapability();\n const { provides: annotationProvides } = useAnnotationCapability();\n const [rects, setRects] = useState<Array<Rect>>([]);\n const [boundingRect, setBoundingRect] = useState<Rect | null>(null);\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!selectionProvides) return;\n\n const off = selectionProvides.onSelectionChange(() => {\n setRects(selectionProvides.getHighlightRectsForPage(pageIndex));\n setBoundingRect(selectionProvides.getBoundingRectForPage(pageIndex));\n });\n return off;\n }, [selectionProvides, pageIndex]);\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!boundingRect) return null;\n\n switch (activeTool.variantKey) {\n case makeVariantKey(PdfAnnotationSubtype.UNDERLINE):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Underline\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(PdfAnnotationSubtype.HIGHLIGHT):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Multiply),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Highlight\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(PdfAnnotationSubtype.STRIKEOUT):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Strikeout\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n case makeVariantKey(PdfAnnotationSubtype.SQUIGGLY):\n return (\n <div\n style={{\n mixBlendMode: blendModeToCss(activeTool.defaults?.blendMode ?? PdfBlendMode.Normal),\n pointerEvents: 'none',\n position: 'absolute',\n inset: 0,\n }}\n >\n <Squiggly\n color={activeTool.defaults?.color}\n opacity={activeTool.defaults?.opacity}\n rects={rects}\n scale={scale}\n />\n </div>\n );\n default:\n return null;\n }\n}\n","import { useEffect, useMemo, useRef, useState } from '@framework';\nimport type { PointerEventHandlers } from '@embedpdf/plugin-interaction-manager';\nimport { usePointerHandlers } from '@embedpdf/plugin-interaction-manager/@framework';\nimport { ActiveTool } from '@embedpdf/plugin-annotation';\nimport { PdfInkListObject, Rect, PdfAnnotationSubtype, PdfInkAnnoObject } from '@embedpdf/models';\nimport { useAnnotationCapability } from '../../hooks';\n\ninterface InkPaintProps {\n /** Index of the page this layer lives on */\n pageIndex: number;\n /** Scale of the page */\n scale: number;\n /** Width of the page */\n pageWidth: number;\n /** Height of the page */\n pageHeight: number;\n}\n\nconst MAX_STROKE_WIDTH = 30;\n\n/**\n * Allows the user to draw freehand ink annotations.\n * Hook it into the interaction-manager with modeId = 'inkPaint'.\n * Supports multi-stroke annotations: if the user starts a new stroke within 3 seconds of releasing the previous one, it adds to the same annotation.\n */\nexport const InkPaint = ({ pageIndex, scale, pageWidth, pageHeight }: InkPaintProps) => {\n /* ------------------------------------------------------------------ */\n /* annotation capability */\n /* ------------------------------------------------------------------ */\n const { provides: annotationProvides } = useAnnotationCapability();\n\n /* ------------------------------------------------------------------ */\n /* active tool state */\n /* ------------------------------------------------------------------ */\n const [activeTool, setActiveTool] = useState<ActiveTool>({ variantKey: null, defaults: null });\n\n useEffect(() => {\n if (!annotationProvides) return;\n\n const off = annotationProvides.onActiveToolChange(setActiveTool);\n return off;\n }, [annotationProvides]);\n\n if (!activeTool.defaults) return null;\n if (activeTool.defaults.subtype !== PdfAnnotationSubtype.INK) return null;\n\n const toolColor = activeTool.defaults?.color ?? '#000000';\n const toolOpacity = activeTool.defaults?.opacity ?? 1;\n const toolStrokeWidth = activeTool.defaults?.strokeWidth ?? 2;\n\n /* ------------------------------------------------------------------ */\n /* integration with interaction-manager */\n /* ------------------------------------------------------------------ */\n const { register } = usePointerHandlers({ modeId: 'ink', pageIndex });\n\n /* ------------------------------------------------------------------ */\n /* helpers */\n /* ------------------------------------------------------------------ */\n const clamp = (v: number, min: number, max: number) => Math.max(min, Math.min(max, v));\n\n /* ------------------------------------------------------------------ */\n /* local state – current strokes (preview), persist timer, and drawing flag */\n /* ------------------------------------------------------------------ */\n const [currentStrokes, setCurrentStrokes] = useState<PdfInkListObject[]>([]);\n const [isDrawing, setIsDrawing] = useState(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n\n /* page size in **PDF-space** (unscaled) ----------------------------- */\n const pageWidthPDF = pageWidth / scale;\n const pageHeightPDF = pageHeight / scale;\n\n /* ------------------------------------------------------------------ */\n /* pointer handlers */\n /* ------------------------------------------------------------------ */\n const handlers = useMemo<PointerEventHandlers<PointerEvent>>(\n () => ({\n onPointerDown: (pos, evt) => {\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n setIsDrawing(true);\n\n if (timerRef.current) {\n // Continuing the current annotation – clear timer and add new stroke\n clearTimeout(timerRef.current);\n timerRef.current = null;\n setCurrentStrokes((prev) => [...prev, { points: [{ x: curX, y: curY }] }]);\n } else {\n // Start a new annotation\n setCurrentStrokes([{ points: [{ x: curX, y: curY }] }]);\n }\n\n (evt.target as HTMLElement)?.setPointerCapture?.(evt.pointerId);\n },\n onPointerMove: (pos) => {\n if (!isDrawing) return;\n\n const curX = clamp(pos.x, 0, pageWidthPDF);\n const curY = clamp(pos.y, 0, pageHeightPDF);\n\n // Add point to the last stroke\n setCurrentStrokes((prev) => {\n if (!prev.length) return prev;\n const last = prev[prev.length - 1];\n const newLast = { points: [...last.points, { x: curX, y: curY }] };\n return [...prev.slice(0, -1), newLast];\n });\n },\n onPointerUp: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Start/restart the persist timer\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n if (currentStrokes.length && annotationProvides) {\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand rect by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const rectMinX = minX - halfStroke;\n const rectMinY = minY - halfStroke;\n const rectMaxX = maxX + halfStroke;\n const rectMaxY = maxY + halfStroke;\n\n // Ignore tiny drawings\n if (rectMaxX - rectMinX < 1 || rectMaxY - rectMinY < 1) return;\n\n const rect: Rect = {\n origin: { x: rectMinX, y: rectMinY },\n size: { width: rectMaxX - rectMinX, height: rectMaxY - rectMinY },\n };\n\n const anno: PdfInkAnnoObject = {\n type: PdfAnnotationSubtype.INK,\n rect,\n inkList: currentStrokes,\n color: toolColor,\n opacity: toolOpacity,\n strokeWidth: toolStrokeWidth,\n pageIndex,\n id: Date.now() + Math.random(),\n };\n\n annotationProvides.createAnnotation(pageIndex, anno);\n annotationProvides.setActiveVariant(null);\n annotationProvides.selectAnnotation(pageIndex, anno.id);\n }\n\n setCurrentStrokes([]);\n timerRef.current = null;\n }, 3000);\n },\n onPointerCancel: (_, evt) => {\n setIsDrawing(false);\n (evt.target as HTMLElement)?.releasePointerCapture?.(evt.pointerId);\n\n // Cancel – clear preview without persisting\n setCurrentStrokes([]);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n },\n }),\n [\n pageWidthPDF,\n pageHeightPDF,\n currentStrokes,\n annotationProvides,\n pageIndex,\n toolColor,\n toolOpacity,\n toolStrokeWidth,\n isDrawing,\n ],\n );\n\n /* register with the interaction-manager */\n useEffect(() => {\n if (!register) return;\n return register(handlers);\n }, [register, handlers]);\n\n /* cleanup timer on unmount */\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n /* ------------------------------------------------------------------ */\n /* render preview */\n /* ------------------------------------------------------------------ */\n if (!currentStrokes.length) return null;\n\n const allPoints = currentStrokes.flatMap((s) => s.points);\n if (!allPoints.length) return null;\n\n const minX = Math.min(...allPoints.map((p) => p.x));\n const minY = Math.min(...allPoints.map((p) => p.y));\n const maxX = Math.max(...allPoints.map((p) => p.x));\n const maxY = Math.max(...allPoints.map((p) => p.y));\n\n // Account for stroke width - expand bounds by half stroke width on all sides\n const halfStroke = MAX_STROKE_WIDTH / 2;\n const svgMinX = minX - halfStroke;\n const svgMinY = minY - halfStroke;\n const svgMaxX = maxX + halfStroke;\n const svgMaxY = maxY + halfStroke;\n\n const dw = svgMaxX - svgMinX;\n const dh = svgMaxY - svgMinY;\n\n const paths = currentStrokes.map(({ points }) => {\n let d = '';\n points.forEach(({ x, y }, i) => {\n // Adjust coordinates relative to the expanded SVG bounds\n const lx = x - svgMinX;\n const ly = y - svgMinY;\n d += (i === 0 ? 'M' : 'L') + lx + ' ' + ly + ' ';\n });\n return d.trim();\n });\n\n return (\n <svg\n style={{\n position: 'absolute',\n left: svgMinX * scale,\n top: svgMinY * scale,\n width: dw * scale,\n height: dh * scale,\n pointerEvents: 'none',\n zIndex: 2,\n }}\n width={dw * scale}\n height={dh * scale}\n viewBox={`0 0 ${dw} ${dh}`}\n >\n {paths.map((d, i) => (\n <path\n key={i}\n d={d}\n fill=\"none\"\n stroke={toolColor}\n strokeWidth={toolStrokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n opacity={toolOpacity}\n />\n ))}\n </svg>\n );\n};\n","import { HTMLAttributes, CSSProperties } from '@framework';\nimport { Annotations } from './annotations';\nimport { TextMarkup } from './text-markup';\nimport { InkPaint } from './annotations/ink-paint';\n\ntype AnnotationLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & {\n pageIndex: number;\n scale: number;\n pageWidth: number;\n pageHeight: number;\n rotation: number;\n style?: CSSProperties;\n};\n\nexport function AnnotationLayer({\n pageIndex,\n scale,\n pageWidth,\n pageHeight,\n rotation,\n style,\n ...props\n}: AnnotationLayerProps) {\n return (\n <div\n style={{\n ...style,\n }}\n {...props}\n >\n <Annotations pageIndex={pageIndex} scale={scale} rotation={rotation} />\n <TextMarkup pageIndex={pageIndex} scale={scale} />\n <InkPaint pageIndex={pageIndex} scale={scale} pageWidth={pageWidth} pageHeight={pageHeight} />\n </div>\n );\n}\n"],"names":["useAnnotationCapability","useCapability","AnnotationPlugin","id","AnnotationContainer","scale","pageIndex","rotation","trackedAnnotation","children","style","outlineOffset","isSelected","isDraggable","isResizable","computeResizePatch","props","provides","annotationProvides","ref","useRef","dragState","setDragState","useState","resizeDirection","setResizeDirection","startPos","setStartPos","startRect","setStartRect","currentRect","setCurrentRect","object","rect","previewObject","setPreviewObject","useEffect","currentObject","jsxRuntime","jsxs","onPointerDown","e","stopPropagation","preventDefault","target","classList","contains","dataset","direction","x","clientX","y","clientY","_a","current","setPointerCapture","pointerId","onPointerMove","dispDelta","dx","dy","restoreOffset","newOriginX","origin","newOriginY","newWidth","size","width","newHeight","height","includes","tentativeRect","previewPatch","dir","onPointerUp","usedDirection","releasePointerCapture","patch","updateAnnotation","localId","position","outline","left","top","pointerEvents","cursor","Fragment","jsx","className","background","borderRadius","right","bottom","Highlight","color","opacity","rects","onClick","map","b","i","onMouseDown","zIndex","Underline","thickness","r","Strikeout","transform","Squiggly","amplitude","period","svgDataUri","encodeURIComponent","backgroundImage","backgroundRepeat","backgroundSize","Ink","strokeWidth","inkList","paths","useMemo","points","d","forEach","lx","ly","trim","viewBox","fill","stroke","strokeLinecap","strokeLinejoin","resizeInkAnnotation","original","newRect","uniform","type","PdfAnnotationSubtype","INK","Error","oldRect","scaleX","scaleY","Math","max","minScale","min","newInkList","p","avgScale","newStrokeWidth","Annotations","annotationsProps","selectionProvides","useSelectionCapability","annotations","setAnnotations","register","usePointerHandlers","selectionState","setSelectionState","onStateChange","state","getAnnotationsByPageIndex","getSelectedAnnotationByPageIndex","handlers","_","pe","currentTarget","deselectAnnotation","handleClick","useCallback","annotation","selectAnnotation","clear","UNDERLINE","mixBlendMode","blendModeToCss","blendMode","PdfBlendMode","Normal","segmentRects","STRIKEOUT","SQUIGGLY","HIGHLIGHT","Multiply","obj","TextMarkup","setRects","boundingRect","setBoundingRect","activeTool","setActiveTool","variantKey","defaults","onSelectionChange","getHighlightRectsForPage","getBoundingRectForPage","onActiveToolChange","makeVariantKey","inset","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","InkPaint","pageWidth","pageHeight","subtype","toolColor","toolOpacity","toolStrokeWidth","modeId","clamp","v","currentStrokes","setCurrentStrokes","isDrawing","setIsDrawing","timerRef","pageWidthPDF","pageHeightPDF","pos","evt","curX","curY","clearTimeout","prev","call","length","newLast","slice","setTimeout","allPoints","flatMap","s","minX","halfStroke","MAX_STROKE_WIDTH","rectMinX","rectMinY","rectMaxX","rectMaxY","anno","Date","now","random","createAnnotation","setActiveVariant","onPointerCancel","minY","maxX","maxY","svgMinX","svgMinY","dw","dh","usePlugin"],"mappings":"0XAIaA,EAA0B,IAAMC,gBAAgCC,EAAAA,iBAAiBC,IC8BvF,SAASC,GAAoBC,MAClCA,EAAAC,UACAA,EAAAC,SACAA,EAAAC,kBACAA,EAAAC,SACAA,EAAAC,MACAA,EAAAC,cACAA,EAAgB,EAAAC,WAChBA,GAAa,EAAAC,YACbA,GAAc,EAAAC,YACdA,GAAc,EAAAC,mBACdA,KACGC,IAEH,MAAQC,SAAUC,GAAuBlB,IACnCmB,EAAMC,SAAuB,OAC5BC,EAAWC,GAAgBC,EAAAA,SAA2C,SACtEC,EAAiBC,GAAsBF,EAAAA,SAAiC,OACxEG,EAAUC,GAAeJ,EAAAA,SAAuB,OAChDK,EAAWC,GAAgBN,EAAAA,SAAsB,OACjDO,EAAaC,GAAkBR,EAAeA,SAAAf,EAAkBwB,OAAOC,OACvEC,EAAeC,GAAoBZ,EAAAA,SAA8C,MAExFa,EAAAA,WAAU,KACOL,EAAAvB,EAAkBwB,OAAOC,MACxCE,EAAiB,KAAI,GACpB,CAAC3B,IAEE,MAiGA6B,EAAgBH,EACjB,IAAK1B,EAAkBwB,UAAWE,GACnC1B,EAAkBwB,OAGpB,OAAAM,EAAAC,KAAC,MAAA,CACCpB,MACAqB,cAxGuBC,UACzB,IAAK7B,EAAY,OAEjB6B,EAAEC,kBACFD,EAAEE,iBAEF,MAAMC,EAASH,EAAEG,OAEjB,GAAI9B,GAAe8B,EAAOC,UAAUC,SAAS,iBAC3CxB,EAAa,YACMG,EAAAmB,EAAOG,QAAQC,oBACzBnC,EAGT,OAFAS,EAAa,WAEb,CAGFK,EAAY,CAAEsB,EAAGR,EAAES,QAASC,EAAGV,EAAEW,UACjCvB,EAAaC,GAET,OAAAuB,EAAAlC,EAAAmC,UAASD,EAAAE,kBAAkBd,EAAEe,UAAA,EAqF/BC,cAlFuBhB,IACzB,GAAkB,SAAdpB,IAAyBK,IAAaE,EAAW,OAE/C,MAAA8B,EAAY,CAAET,EAAGR,EAAES,QAAUxB,EAASuB,EAAGE,EAAGV,EAAEW,QAAU1B,EAASyB,IAC/DF,EAAGU,EAAIR,EAAGS,GAAOC,gBAAcH,EAAWnD,EAAUF,GAExD,IAAAyD,EAAalC,EAAUmC,OAAOd,EAC9Be,EAAapC,EAAUmC,OAAOZ,EAC9Bc,EAAWrC,EAAUsC,KAAKC,MAC1BC,EAAYxC,EAAUsC,KAAKG,OAE/B,GAAkB,aAAdhD,EACYyC,GAAAH,EACAK,GAAAJ,OAAA,GACS,aAAdvC,GAA4BG,IACjCA,EAAgB8C,SAAS,SACfL,GAAAN,EACHnC,EAAgB8C,SAAS,UACpBR,GAAAH,EACFM,GAAAN,GAGVnC,EAAgB8C,SAAS,UACdF,GAAAR,EACJpC,EAAgB8C,SAAS,SACpBN,GAAAJ,EACDQ,GAAAR,GAIXK,EAAW,GAAKG,EAAY,GAAG,OAGrC,MAAMG,EAAgB,CACpBR,OAAQ,CAAEd,EAAGa,EAAYX,EAAGa,GAC5BE,KAAM,CAAEC,MAAOF,EAAUI,OAAQD,IAG/B,IAAAI,EAA6C,CAAEvC,KAAMsC,GAEzD,GAAIxD,EAAoB,CAChB,MAAA0D,EAAoB,aAAdpD,EAA2BG,EAAkB,eACrDiD,IACFD,EAAezD,EAAmBP,EAAkBwB,OAAQuC,EAAeE,GAC7E,CAGa1C,EAAAyC,EAAavC,MAAQsC,GACpCpC,EAAiBqC,EAAY,EAmC3BE,YAhCqBjC,UACvB,GAAkB,SAAdpB,EAAsB,OAE1B,MAAMsD,EAAgBnD,GAAmB,eAOzC,GANAF,EAAa,QACbG,EAAmB,MAEf,OAAA4B,EAAAlC,EAAAmC,UAASD,EAAAuB,sBAAsBnC,EAAEe,WAGjCtC,GAAsBV,EAAmB,CACvC,IAAAqE,EAAsC,CAAE5C,KAAMH,GAC9Cf,GAAsB4D,IACxBE,EAAQ9D,EAAmBP,EAAkBwB,OAAQF,EAAa6C,IAEpEzD,EAAmB4D,iBAAiBxE,EAAWE,EAAkBuE,QAASF,EAAK,CAGjFlD,EAAY,MACZE,EAAa,MACbM,EAAiB,KAAI,EAanBzB,MAAO,CACLsE,SAAU,WACVC,QAASrE,EAAa,oBAAsB,OAC5CD,cAAeC,EAAa,GAAGD,MAAoB,MACnDuE,KAASpD,EAAYiC,OAAOd,EAAI5C,EAA1B,KACN8E,IAAQrD,EAAYiC,OAAOZ,EAAI9C,EAA1B,KACL8D,MAAUrC,EAAYoC,KAAKC,MAAQ9D,EAA5B,KACPgE,OAAWvC,EAAYoC,KAAKG,OAAShE,EAA7B,KACR+E,cAAexE,EAAa,OAAS,OACrCyE,OAAQzE,GAAcC,EAAc,OAAS,aAC1CH,MAEDM,EAEHP,SAAA,CAAoB,mBAAbA,EAA0BA,EAAS4B,GAAiB5B,EAC3DG,GAAcE,GAEXyB,EAAAA,KAAA+C,EAAAA,SAAA,CAAA7E,SAAA,CAAA6B,EAAAiD,IAAC,MAAA,CACCC,UAAU,gBACV,iBAAe,WACf9E,MAAO,CACLsE,SAAU,WACVG,KAAU,EAAAxE,EACVuE,MAAW,EAAAvE,EACXwD,MAAO,GACPE,OAAQ,GACRoB,WAAY,OACZC,aAAc,MACdL,OAAQ9E,EAAW,EAAI,cAAgB,iBAG3C+B,EAAAiD,IAAC,MAAA,CACCC,UAAU,gBACV,iBAAe,YACf9E,MAAO,CACLsE,SAAU,WACVG,KAAU,EAAAxE,EACVgF,OAAY,EAAAhF,EACZwD,MAAO,GACPE,OAAQ,GACRoB,WAAY,OACZC,aAAc,MACdL,OAAQ9E,EAAW,EAAI,cAAgB,iBAG3C+B,EAAAiD,IAAC,MAAA,CACCC,UAAU,gBACV,iBAAe,cACf9E,MAAO,CACLsE,SAAU,WACVY,QAAa,EAAAjF,EACbuE,MAAW,EAAAvE,EACXwD,MAAO,GACPE,OAAQ,GACRoB,WAAY,OACZC,aAAc,MACdL,OAAQ9E,EAAW,EAAI,cAAgB,iBAG3C+B,EAAAiD,IAAC,MAAA,CACCC,UAAU,gBACV,iBAAe,eACf9E,MAAO,CACLsE,SAAU,WACVY,QAAa,EAAAjF,EACbgF,OAAY,EAAAhF,EACZwD,MAAO,GACPE,OAAQ,GACRoB,WAAY,OACZC,aAAc,MACdL,OAAQ9E,EAAW,EAAI,cAAgB,sBAOrD,CCzOO,SAASsF,GAAUC,MACxBA,EAAQ,UAAAC,QACRA,EAAU,GAAAC,MACVA,EAAA/D,KACAA,EAAA5B,MACAA,EAAA4F,QACAA,EAAAvF,MACAA,KACGM,IAIEuE,OAAAA,EAAAA,IAAAD,EAAAA,SAAA,CAAA7E,SAAAuF,EAAME,KAAI,CAACC,EAAGC,IACb9D,EAAAiD,IAAC,MAAA,CAECc,YAAaJ,EACbvF,MAAO,CACLsE,SAAU,WACVE,MAAOjD,EAAOkE,EAAEpC,OAAOd,EAAIhB,EAAK8B,OAAOd,EAAIkD,EAAEpC,OAAOd,GAAK5C,EACzD8E,KAAMlD,EAAOkE,EAAEpC,OAAOZ,EAAIlB,EAAK8B,OAAOZ,EAAIgD,EAAEpC,OAAOZ,GAAK9C,EACxD8D,MAAOgC,EAAEjC,KAAKC,MAAQ9D,EACtBgE,OAAQ8B,EAAEjC,KAAKG,OAAShE,EACxBoF,WAAYK,EACZC,UACAX,cAAea,EAAU,OAAS,OAClCZ,OAAQY,EAAU,UAAY,UAC9BK,OAAQL,EAAU,OAAI,KACnBvF,MAEDM,GAfCoF,MAoBf,CClCO,SAASG,GAAUT,MACxBA,EAAQ,UAAAC,QACRA,EAAU,GAAAC,MACVA,EAAA/D,KACAA,EAAA5B,MACAA,EAAA4F,QACAA,EAAAvF,MACAA,KACGM,IAEH,MAAMwF,EAAY,EAAInG,EAIjBkF,OAAAA,EAAAA,IAAAD,EAAAA,SAAA,CAAA7E,SAAAuF,EAAME,KAAI,CAACO,EAAGL,IACb9D,EAAAiD,IAAC,MAAA,CAECc,YAAaJ,EACbvF,MAAO,CACLsE,SAAU,WACVE,MAAOjD,EAAOwE,EAAE1C,OAAOd,EAAIhB,EAAK8B,OAAOd,EAAIwD,EAAE1C,OAAOd,GAAK5C,EACzD8E,KAAMlD,EAAOwE,EAAE1C,OAAOZ,EAAIlB,EAAK8B,OAAOZ,EAAIsD,EAAE1C,OAAOZ,GAAK9C,EACxD8D,MAAOsC,EAAEvC,KAAKC,MAAQ9D,EACtBgE,OAAQoC,EAAEvC,KAAKG,OAAShE,EACxBoF,WAAY,cACZL,cAAea,EAAU,OAAS,OAClCZ,OAAQY,EAAU,UAAY,UAC9BK,OAAQL,EAAU,EAAI,KACnBvF,MAEDM,EAGJP,SAAA6B,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsE,SAAU,WACVE,KAAM,EACNU,OAAQ,EACRzB,MAAO,OACPE,OAAQmC,EACRf,WAAYK,EACZC,UACAX,cAAe,WA1BdgB,MAiCf,CCjDO,SAASM,GAAUZ,MACxBA,EAAQ,UAAAC,QACRA,EAAU,GAAAC,MACVA,EAAA/D,KACAA,EAAA5B,MACAA,EAAA4F,QACAA,EAAAvF,MACAA,KACGM,IAEH,MAAMwF,EAAY,EAAInG,EAIjBkF,OAAAA,EAAAA,IAAAD,EAAAA,SAAA,CAAA7E,SAAAuF,EAAME,KAAI,CAACO,EAAGL,IACb9D,EAAAiD,IAAC,MAAA,CAECc,YAAaJ,EACbvF,MAAO,CACLsE,SAAU,WACVE,MAAOjD,EAAOwE,EAAE1C,OAAOd,EAAIhB,EAAK8B,OAAOd,EAAIwD,EAAE1C,OAAOd,GAAK5C,EACzD8E,KAAMlD,EAAOwE,EAAE1C,OAAOZ,EAAIlB,EAAK8B,OAAOZ,EAAIsD,EAAE1C,OAAOZ,GAAK9C,EACxD8D,MAAOsC,EAAEvC,KAAKC,MAAQ9D,EACtBgE,OAAQoC,EAAEvC,KAAKG,OAAShE,EACxBoF,WAAY,cACZL,cAAea,EAAU,OAAS,OAClCZ,OAAQY,EAAU,UAAY,UAC9BK,OAAQL,EAAU,EAAI,KACnBvF,MAEDM,EAGJP,SAAA6B,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsE,SAAU,WACVE,KAAM,EACNC,IAAK,MACLhB,MAAO,OACPE,OAAQmC,EACRf,WAAYK,EACZC,UACAY,UAAW,mBACXvB,cAAe,WA3BdgB,MAkCf,CClDO,SAASQ,GAASd,MACvBA,EAAQ,UAAAC,QACRA,EAAU,GAAAC,MACVA,EAAA/D,KACAA,EAAA5B,MACAA,EAAA4F,QACAA,EAAAvF,MACAA,KACGM,IAEH,MAAM6F,EAAY,EAAIxG,EAChByG,EAAS,EAAIzG,EAQb0G,EAAa,gCAAgCC,mBANvC,kDAAkDF,cAA+B,EAAZD,mBAA+BC,KAAsB,EAAZD,0BACxGA,OAAeC,EAAS,OAAOA,EAAS,KAAKD,OAAeC,KAAUD,uCACxDf,oBAAwBe,+CAQnDtB,OAAAA,EAAAA,IAAAD,EAAAA,SAAA,CAAA7E,SAAAuF,EAAME,KAAI,CAACO,EAAGL,IACb9D,EAAAiD,IAAC,MAAA,CAECc,YAAaJ,EACbvF,MAAO,CACLsE,SAAU,WACVE,MAAOjD,EAAOwE,EAAE1C,OAAOd,EAAIhB,EAAK8B,OAAOd,EAAIwD,EAAE1C,OAAOd,GAAK5C,EACzD8E,KAAMlD,EAAOwE,EAAE1C,OAAOZ,EAAIlB,EAAK8B,OAAOZ,EAAIsD,EAAE1C,OAAOZ,GAAK9C,EACxD8D,MAAOsC,EAAEvC,KAAKC,MAAQ9D,EACtBgE,OAAQoC,EAAEvC,KAAKG,OAAShE,EACxBoF,WAAY,cACZL,cAAea,EAAU,OAAS,OAClCZ,OAAQY,EAAU,UAAY,UAC9BK,OAAQL,EAAU,EAAI,KACnBvF,MAEDM,EAGJP,SAAA6B,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsE,SAAU,WACVE,KAAM,EACNU,OAAQ,EACRzB,MAAO,OACPE,OAAoB,EAAZwC,EACRI,gBAAiBF,EACjBG,iBAAkB,WAClBC,eAAgB,GAAGL,OAAwB,EAAZD,MAC/Bd,UACAX,cAAe,WA5BdgB,MAmCf,CC9CO,SAASgB,GAAItB,MAClBA,EAAQ,UAAAC,QACRA,EAAU,EAAAsB,YACVA,EAAAC,QACAA,EAAArF,KACAA,EAAA5B,MACAA,EAAA4F,QACAA,IAGM,MAAAsB,EAAQC,EAAAA,SAAQ,IACbF,EAAQpB,KAAI,EAAGuB,aACpB,IAAIC,EAAI,GAOR,OANAD,EAAOE,SAAQ,EAAG1E,IAAGE,KAAKiD,KAElB,MAAAwB,EAAK3E,EAAIhB,EAAK8B,OAAOd,EACrB4E,EAAK1E,EAAIlB,EAAK8B,OAAOZ,EAC3BuE,IAAY,IAANtB,EAAU,IAAM,KAAOwB,EAAK,IAAMC,EAAK,GAAA,IAExCH,EAAEI,MAAK,KAEf,CAACR,EAASrF,IAGPkC,EAAQlC,EAAKiC,KAAKC,MAAQ9D,EAC1BgE,EAASpC,EAAKiC,KAAKG,OAAShE,EAGhC,OAAAiC,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsE,SAAU,WACVb,QACAE,SACAe,cAAe,OACfkB,OAAQ,GAEVnC,QACAE,SACA0D,QAAS,OAAO9F,EAAKiC,KAAKC,SAASlC,EAAKiC,KAAKG,SAE5C5D,SAAM8G,EAAArB,KAAI,CAACwB,EAAGtB,IACb9D,EAAAiD,IAAC,OAAA,CAECmC,IACAM,KAAK,OACLC,OAAQnC,EACRuB,cACAa,cAAc,QACdC,eAAe,QACfpC,UACAX,cAAc,gBACdiB,YAAaJ,EACbvF,MAAO,CACL2E,OAAQ,YAXLe,MAiBf,CCjEO,SAASgC,EACdC,EACAC,EACAtF,EACAuF,GAAmB,GAEf,GAAAF,EAASG,OAASC,EAAAA,qBAAqBC,IACnC,MAAA,IAAIC,MAAM,0DAGlB,MAAMC,EAAUP,EAASpG,KACzB,IAAI4G,EAASP,EAAQpE,KAAKC,MAAQyE,EAAQ1E,KAAKC,MAC3C2E,EAASR,EAAQpE,KAAKG,OAASuE,EAAQ1E,KAAKG,OAkBhD,IAdIiE,EAAQpE,KAAKC,MADD,IACoBmE,EAAQpE,KAAKG,OADjC,MAGdwE,EAASE,KAAKC,IAAIH,EAHJ,GAGsBD,EAAQ1E,KAAKC,OACjD2E,EAASC,KAAKC,IAAIF,EAJJ,GAIsBF,EAAQ1E,KAAKG,QACvCiE,EAAA,CACRvE,OAAQuE,EAAQvE,OAChBG,KAAM,CACJC,MAAOyE,EAAQ1E,KAAKC,MAAQ0E,EAC5BxE,OAAQuE,EAAQ1E,KAAKG,OAASyE,KAMhCP,EAAS,CACX,MAAMU,EAAWF,KAAKG,IAAIL,EAAQC,GACzBD,EAAAI,EACAH,EAAAG,EAETX,EAAQpE,KAAO,CACbC,MAAOyE,EAAQ1E,KAAKC,MAAQ8E,EAC5B5E,OAAQuE,EAAQ1E,KAAKG,OAAS4E,EAChC,CAIF,MAAME,EAAad,EAASf,QAAQpB,KAAK+B,IAAY,CACnDR,OAAQQ,EAAOR,OAAOvB,KAAKkD,IAAO,CAChCnG,EAAGqF,EAAQvE,OAAOd,GAAKmG,EAAEnG,EAAI2F,EAAQ7E,OAAOd,GAAK4F,EACjD1F,EAAGmF,EAAQvE,OAAOZ,GAAKiG,EAAEjG,EAAIyF,EAAQ7E,OAAOZ,GAAK2F,UAM/CO,GAAYR,EAASC,GAAU,EAC/BQ,EAAiBjB,EAAShB,YAAcgC,EAIvC,MAAA,CACLpH,KAAMqG,EACNhB,QAAS6B,EACT9B,YAAaiC,EAEjB,CCnDO,SAASC,EAAYC,GACpB,MAAAlJ,UAAEA,EAAWD,MAAAA,GAAUmJ,GACrBvI,SAAUC,GAAuBlB,KACjCiB,SAAUwI,GAAsBC,4BACjCC,EAAaC,GAAkBrI,EAAAA,SAA8B,KAC9DsI,SAAEA,GAAaC,qBAAmB,CAAExJ,eACnCyJ,EAAgBC,GAAqBzI,EAAAA,SAAmC,MAE/Ea,EAAAA,WAAU,KACJlB,GACiBA,EAAA+I,eAAeC,IACjBN,EAAAO,EAAAA,0BAA0BD,EAAO5J,IAC9B0J,EAAAI,EAAAA,iCAAiCF,EAAO5J,GAAU,GACrE,GAEF,CAACY,IAEJ,MAAMmJ,EAAW7C,EAAAA,SACf,KAAyC,CACvChF,cAAe,CAAC8H,EAAGC,KAEbA,EAAG3H,SAAW2H,EAAGC,eAAiBtJ,GACpCA,EAAmBuJ,oBAAmB,KAI5C,CAACvJ,IAGGwJ,EAAcC,EAAAA,aAClB,CAAClI,EAAemI,KACdnI,EAAEC,kBACExB,GAAsBuI,IACLvI,EAAA2J,iBAAiBvK,EAAWsK,EAAW7F,SAC1D0E,EAAkBqB,QAAM,GAG5B,CAAC5J,EAAoBuI,EAAmBnJ,IASrCiF,OANLnD,EAAAA,WAAU,IACDyH,EAASQ,IACf,CAACR,EAAUQ,IAIT9E,EAAAA,IAAAD,EAAAA,SAAA,CAAA7E,SAAAkJ,EAAYzD,KAAK0E,IACV,MAAAhK,GAA6B,MAAhBmJ,OAAgB,EAAAA,EAAAhF,WAAY6F,EAAW7F,QAElD,OAAA6F,EAAW5I,OAAOwG,MACxB,KAAKC,EAAqBA,qBAAAsC,UAEtB,OAAAzI,EAAAiD,IAACnF,EAAA,CAECI,kBAAmBoK,EACnBhK,aACAC,aAAa,EACbC,aAAa,EACbJ,MAAO,CACLsK,aAAcC,EAAeA,eAAAL,EAAW5I,OAAOkJ,WAAaC,eAAaC,YAEvE5B,EAEJ/I,SAAA6B,EAAAiD,IAACgB,EAAA,CACCtE,KAAM2I,EAAW5I,OAAOC,KACxB6D,MAAO8E,EAAW5I,OAAO8D,MACzBC,QAAS6E,EAAW5I,OAAO+D,QAC3BC,MAAO4E,EAAW5I,OAAOqJ,aACzBhL,QACA4F,QAAUxD,GAAMiI,EAAYjI,EAAGmI,MAhB5BA,EAAW7F,SAoBtB,KAAK0D,EAAqBA,qBAAA6C,UAEtB,OAAAhJ,EAAAiD,IAACnF,EAAA,CAECI,kBAAmBoK,EACnBhK,aACAC,aAAa,EACbC,aAAa,EACbJ,MAAO,CACLsK,aAAcC,EAAeA,eAAAL,EAAW5I,OAAOkJ,WAAaC,eAAaC,YAEvE5B,EAEJ/I,SAAA6B,EAAAiD,IAACmB,EAAA,CACCzE,KAAM2I,EAAW5I,OAAOC,KACxB6D,MAAO8E,EAAW5I,OAAO8D,MACzBC,QAAS6E,EAAW5I,OAAO+D,QAC3BC,MAAO4E,EAAW5I,OAAOqJ,aACzBhL,QACA4F,QAAUxD,GAAMiI,EAAYjI,EAAGmI,MAhB5BA,EAAW7F,SAoBtB,KAAK0D,EAAqBA,qBAAA8C,SAEtB,OAAAjJ,EAAAiD,IAACnF,EAAA,CAECI,kBAAmBoK,EACnBhK,aACAC,aAAa,EACbC,aAAa,EACbJ,MAAO,CACLsK,aAAcC,EAAeA,eAAAL,EAAW5I,OAAOkJ,WAAaC,eAAaC,YAEvE5B,EAEJ/I,SAAA6B,EAAAiD,IAACqB,EAAA,CACCd,MAAO8E,EAAW5I,OAAO8D,MACzBC,QAAS6E,EAAW5I,OAAO+D,QAC3BC,MAAO4E,EAAW5I,OAAOqJ,aACzBpJ,KAAM2I,EAAW5I,OAAOC,KACxB5B,QACA4F,QAAUxD,GAAMiI,EAAYjI,EAAGmI,MAhB5BA,EAAW7F,SAoBtB,KAAK0D,EAAqBA,qBAAA+C,UAEtB,OAAAlJ,EAAAiD,IAACnF,EAAA,CAECI,kBAAmBoK,EACnBhK,aACAC,aAAa,EACbC,aAAa,EACbJ,MAAO,CACLsK,aAAcC,EAAAA,eACZL,EAAW5I,OAAOkJ,WAAaC,eAAaM,cAG5CjC,EAEJ/I,SAAA6B,EAAAiD,IAACM,EAAA,CACCC,MAAO8E,EAAW5I,OAAO8D,MACzBC,QAAS6E,EAAW5I,OAAO+D,QAC3BC,MAAO4E,EAAW5I,OAAOqJ,aACzBhL,QACA4B,KAAM2I,EAAW5I,OAAOC,KACxBgE,QAAUxD,GAAMiI,EAAYjI,EAAGmI,MAlB5BA,EAAW7F,SAsBtB,KAAK0D,EAAqBA,qBAAAC,IAEtB,OAAApG,EAAAiD,IAACnF,EAAA,CAECQ,aACAJ,kBAAmBoK,EACnBjK,cAAe,EACfI,mBAAoBqH,EACpB1H,MAAO,CACLsK,aAAcC,EAAeA,eAAAL,EAAW5I,OAAOkJ,WAAaC,eAAaC,YAEvE5B,EAEH/I,SAACiL,GACApJ,EAAAiD,IAAC6B,EAAA,CACCtB,MAAQ4F,EAAyB5F,MACjCC,QAAU2F,EAAyB3F,QACnCsB,YAAcqE,EAAyBrE,YACvCC,QAAUoE,EAAyBpE,QACnCrF,KAAOyJ,EAAyBzJ,KAChC5B,QACA4F,QAAUxD,GAAMiI,EAAYjI,EAAGmI,MAlB9BA,EAAW7F,SAuBtB,QACS,OAAA,KAAA,KAKnB,CC/LO,SAAS4G,GAAWrL,UAAEA,EAAWD,MAAAA,gCACtC,MAAQY,SAAUwI,GAAsBC,4BAChCzI,SAAUC,GAAuBlB,KAClCgG,EAAO4F,GAAYrK,EAAAA,SAAsB,KACzCsK,EAAcC,GAAmBvK,EAAAA,SAAsB,OACvDwK,EAAYC,GAAiBzK,EAAAA,SAAqB,CAAE0K,WAAY,KAAMC,SAAU,OAmBnF,GAjBJ9J,EAAAA,WAAU,KACR,IAAKqH,EAAmB,OAMjB,OAJKA,EAAkB0C,mBAAkB,KACrCP,EAAAnC,EAAkB2C,yBAAyB9L,IACpCwL,EAAArC,EAAkB4C,uBAAuB/L,GAAU,GAE9D,GACN,CAACmJ,EAAmBnJ,IAEvB8B,EAAAA,WAAU,KACR,IAAKlB,EAAoB,OAGlB,OADKA,EAAmBoL,mBAAmBN,EAC3C,GACN,CAAC9K,KAEC2K,EAAqB,OAAA,KAE1B,OAAQE,EAAWE,YACjB,KAAKM,EAAeA,eAAA9D,EAAAA,qBAAqBsC,WAErC,OAAAzI,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsK,aAAcC,EAAeA,gBAAA,OAAA5H,EAAA0I,EAAWG,eAAU,EAAA7I,EAAA6H,YAAaC,eAAaC,QAC5EhG,cAAe,OACfJ,SAAU,WACVwH,MAAO,GAGT/L,SAAA6B,EAAAiD,IAACgB,EAAA,CACCT,MAAO,OAAA2G,EAAWV,EAAAG,eAAU,EAAAO,EAAA3G,MAC5BC,QAAS,OAAA2G,EAAWX,EAAAG,eAAU,EAAAQ,EAAA3G,QAC9BC,QACA3F,YAIR,KAAKkM,EAAeA,eAAA9D,EAAAA,qBAAqB+C,WAErC,OAAAlJ,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsK,aAAcC,EAAeA,gBAAA,OAAA0B,EAAAZ,EAAWG,eAAU,EAAAS,EAAAzB,YAAaC,eAAaM,UAC5ErG,cAAe,OACfJ,SAAU,WACVwH,MAAO,GAGT/L,SAAA6B,EAAAiD,IAACM,EAAA,CACCC,MAAO,OAAA8G,EAAWb,EAAAG,eAAU,EAAAU,EAAA9G,MAC5BC,QAAS,OAAA8G,EAAWd,EAAAG,eAAU,EAAAW,EAAA9G,QAC9BC,QACA3F,YAIR,KAAKkM,EAAeA,eAAA9D,EAAAA,qBAAqB6C,WAErC,OAAAhJ,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsK,aAAcC,EAAeA,gBAAA,OAAA6B,EAAAf,EAAWG,eAAU,EAAAY,EAAA5B,YAAaC,eAAaC,QAC5EhG,cAAe,OACfJ,SAAU,WACVwH,MAAO,GAGT/L,SAAA6B,EAAAiD,IAACmB,EAAA,CACCZ,MAAO,OAAAiH,EAAWhB,EAAAG,eAAU,EAAAa,EAAAjH,MAC5BC,QAAS,OAAAiH,EAAWjB,EAAAG,eAAU,EAAAc,EAAAjH,QAC9BC,QACA3F,YAIR,KAAKkM,EAAeA,eAAA9D,EAAAA,qBAAqB8C,UAErC,OAAAjJ,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsK,aAAcC,EAAeA,gBAAA,OAAAgC,EAAAlB,EAAWG,eAAU,EAAAe,EAAA/B,YAAaC,eAAaC,QAC5EhG,cAAe,OACfJ,SAAU,WACVwH,MAAO,GAGT/L,SAAA6B,EAAAiD,IAACqB,EAAA,CACCd,MAAO,OAAAoH,EAAWnB,EAAAG,eAAU,EAAAgB,EAAApH,MAC5BC,QAAS,OAAAoH,EAAWpB,EAAAG,eAAU,EAAAiB,EAAApH,QAC9BC,QACA3F,YAIR,QACS,OAAA,KAEb,CCpGA,MAOa+M,EAAW,EAAG9M,YAAWD,QAAOgN,YAAWC,2BAItD,MAAQrM,SAAUC,GAAuBlB,KAKlC+L,EAAYC,GAAiBzK,EAAAA,SAAqB,CAAE0K,WAAY,KAAMC,SAAU,OASnF,GAPJ9J,EAAAA,WAAU,KACR,IAAKlB,EAAoB,OAGlB,OADKA,EAAmBoL,mBAAmBN,EAC3C,GACN,CAAC9K,KAEC6K,EAAWG,SAAiB,OAAA,KACjC,GAAIH,EAAWG,SAASqB,UAAY9E,EAAAA,qBAAqBC,IAAY,OAAA,KAE/D,MAAA8E,GAAY,OAAAnK,EAAA0I,EAAWG,eAAX,EAAA7I,EAAqByC,QAAS,UAC1C2H,GAAc,OAAAhB,EAAAV,EAAWG,eAAX,EAAAO,EAAqB1G,UAAW,EAC9C2H,GAAkB,OAAAhB,EAAAX,EAAWG,eAAX,EAAAQ,EAAqBrF,cAAe,GAKtDwC,SAAEA,GAAaC,EAAAA,mBAAmB,CAAE6D,OAAQ,MAAOrN,cAKnDsN,EAAQ,CAACC,EAAW3E,EAAaF,IAAgBD,KAAKC,IAAIE,EAAKH,KAAKG,IAAIF,EAAK6E,KAK5EC,EAAgBC,GAAqBxM,EAAAA,SAA6B,KAClEyM,EAAWC,GAAgB1M,EAAAA,UAAS,GACrC2M,EAAW9M,SAA8B,MAGzC+M,EAAed,EAAYhN,EAC3B+N,EAAgBd,EAAajN,EAK7BgK,EAAW7C,EAAAA,SACf,KAAO,CACLhF,cAAe,CAAC6L,EAAKC,aACnB,MAAMC,EAAOX,EAAMS,EAAIpL,EAAG,EAAGkL,GACvBK,EAAOZ,EAAMS,EAAIlL,EAAG,EAAGiL,GAE7BH,GAAa,GAETC,EAAS5K,SAEXmL,aAAaP,EAAS5K,SACtB4K,EAAS5K,QAAU,KACnByK,GAAmBW,GAAS,IAAIA,EAAM,CAAEjH,OAAQ,CAAC,CAAExE,EAAGsL,EAAMpL,EAAGqL,SAG/DT,EAAkB,CAAC,CAAEtG,OAAQ,CAAC,CAAExE,EAAGsL,EAAMpL,EAAGqL,OAG7C,OAAA/B,EAAA,OAAApJ,EAAAiL,EAAI1L,aAAJ,EAAAS,EAA4BE,oBAA5BkJ,EAAAkC,KAAAtL,EAAgDiL,EAAI9K,UAAA,EAEvDC,cAAgB4K,IACd,IAAKL,EAAW,OAEhB,MAAMO,EAAOX,EAAMS,EAAIpL,EAAG,EAAGkL,GACvBK,EAAOZ,EAAMS,EAAIlL,EAAG,EAAGiL,GAG7BL,GAAmBW,IACb,IAACA,EAAKE,OAAe,OAAAF,EACzB,MACMG,EAAU,CAAEpH,OAAQ,IADbiH,EAAKA,EAAKE,OAAS,GACGnH,OAAQ,CAAExE,EAAGsL,EAAMpL,EAAGqL,KACzD,MAAO,IAAIE,EAAKI,MAAM,GAAG,GAAKD,EAAO,GACtC,EAEHnK,YAAa,CAAC4F,EAAGgE,aACfL,GAAa,GACZ,OAAAxB,EAAA,OAAApJ,EAAAiL,EAAI1L,aAAJ,EAAAS,EAA4BuB,wBAA5B6H,EAAAkC,KAAAtL,EAAoDiL,EAAI9K,WAGrD0K,EAAS5K,SAAsBmL,aAAAP,EAAS5K,SACnC4K,EAAA5K,QAAUyL,YAAW,KACxB,GAAAjB,EAAec,QAAU1N,EAAoB,CAC/C,MAAM8N,EAAYlB,EAAemB,SAASC,GAAMA,EAAEzH,SAC9C,IAACuH,EAAUJ,OAAQ,OAEjBO,MAMAC,EAAaC,GACbC,EAPOvG,KAAKG,OAAO8F,EAAU9I,KAAKkD,GAAMA,EAAEnG,KAOxBmM,EAClBG,EAPOxG,KAAKG,OAAO8F,EAAU9I,KAAKkD,GAAMA,EAAEjG,KAOxBiM,EAClBI,EAPOzG,KAAKC,OAAOgG,EAAU9I,KAAKkD,GAAMA,EAAEnG,KAOxBmM,EAClBK,EAPO1G,KAAKC,OAAOgG,EAAU9I,KAAKkD,GAAMA,EAAEjG,KAOxBiM,EAGxB,GAAII,EAAWF,EAAW,GAAKG,EAAWF,EAAW,EAAG,OAExD,MAAMtN,EAAa,CACjB8B,OAAQ,CAAEd,EAAGqM,EAAUnM,EAAGoM,GAC1BrL,KAAM,CAAEC,MAAOqL,EAAWF,EAAUjL,OAAQoL,EAAWF,IAGnDG,EAAyB,CAC7BlH,KAAMC,EAAqBA,qBAAAC,IAC3BzG,OACAqF,QAASwG,EACThI,MAAO0H,EACPzH,QAAS0H,EACTpG,YAAaqG,EACbpN,YACAH,GAAIwP,KAAKC,MAAQ7G,KAAK8G,UAGL3O,EAAA4O,iBAAiBxP,EAAWoP,GAC/CxO,EAAmB6O,iBAAiB,MACjB7O,EAAA2J,iBAAiBvK,EAAWoP,EAAKvP,GAAE,CAGxD4N,EAAkB,IAClBG,EAAS5K,QAAU,IAAA,GAClB,IAAI,EAET0M,gBAAiB,CAAC1F,EAAGgE,aACnBL,GAAa,GACZ,OAAAxB,EAAA,OAAApJ,EAAAiL,EAAI1L,aAAJ,EAAAS,EAA4BuB,wBAA5B6H,EAAAkC,KAAAtL,EAAoDiL,EAAI9K,WAGzDuK,EAAkB,IACdG,EAAS5K,UACXmL,aAAaP,EAAS5K,SACtB4K,EAAS5K,QAAU,KAAA,KAIzB,CACE6K,EACAC,EACAN,EACA5M,EACAZ,EACAkN,EACAC,EACAC,EACAM,IAoBA,GAfJ5L,EAAAA,WAAU,KACR,GAAKyH,EACL,OAAOA,EAASQ,EAAQ,GACvB,CAACR,EAAUQ,IAGdjI,EAAAA,WAAU,IACD,KACD8L,EAAS5K,SAAsBmL,aAAAP,EAAS5K,QAAO,GAEpD,KAKEwK,EAAec,OAAe,OAAA,KAEnC,MAAMI,EAAYlB,EAAemB,SAASC,GAAMA,EAAEzH,SAC9C,IAACuH,EAAUJ,OAAe,OAAA,KAExB,MAAAO,EAAOpG,KAAKG,OAAO8F,EAAU9I,KAAKkD,GAAMA,EAAEnG,KAC1CgN,EAAOlH,KAAKG,OAAO8F,EAAU9I,KAAKkD,GAAMA,EAAEjG,KAC1C+M,EAAOnH,KAAKC,OAAOgG,EAAU9I,KAAKkD,GAAMA,EAAEnG,KAC1CkN,EAAOpH,KAAKC,OAAOgG,EAAU9I,KAAKkD,GAAMA,EAAEjG,KAI1CiN,EAAUjB,EADGE,GAEbgB,EAAUJ,EAFGZ,GAMbiB,EAHUJ,EAHGb,GAMEe,EACfG,EAHUJ,EAJGd,GAOEgB,EAEf9I,EAAQuG,EAAe5H,KAAI,EAAGuB,aAClC,IAAIC,EAAI,GAOR,OANAD,EAAOE,SAAQ,EAAG1E,IAAGE,KAAKiD,KAIxBsB,IAAY,IAANtB,EAAU,IAAM,MAFXnD,EAAImN,GAEmB,KADvBjN,EAAIkN,GAC8B,GAAA,IAExC3I,EAAEI,MAAK,IAId,OAAAxF,EAAAiD,IAAC,MAAA,CACC7E,MAAO,CACLsE,SAAU,WACVE,KAAMkL,EAAU/P,EAChB8E,IAAKkL,EAAUhQ,EACf8D,MAAOmM,EAAKjQ,EACZgE,OAAQkM,EAAKlQ,EACb+E,cAAe,OACfkB,OAAQ,GAEVnC,MAAOmM,EAAKjQ,EACZgE,OAAQkM,EAAKlQ,EACb0H,QAAS,OAAOuI,KAAMC,IAErB9P,SAAM8G,EAAArB,KAAI,CAACwB,EAAGtB,IACb9D,EAAAiD,IAAC,OAAA,CAECmC,IACAM,KAAK,OACLC,OAAQuF,EACRnG,YAAaqG,EACbxF,cAAc,QACdC,eAAe,QACfpC,QAAS0H,GAPJrH,MAUX,0BCpPG,UAAyB9F,UAC9BA,EAAAD,MACAA,EAAAgN,UACAA,EAAAC,WACAA,EAAA/M,SACAA,EAAAG,MACAA,KACGM,IAGD,OAAAsB,EAAAC,KAAC,MAAA,CACC7B,MAAO,IACFA,MAEDM,EAEJP,SAAA,GAAC8E,IAAAgE,EAAA,CAAYjJ,YAAsBD,QAAcE,eACjDgF,IAACoG,EAAW,CAAArL,YAAsBD,UACjCkF,EAAAA,IAAA6H,EAAA,CAAS9M,YAAsBD,QAAcgN,YAAsBC,iBAG1E,gEXhCmC,IAAMkD,YAA4BtQ,EAAAA,iBAAiBC"}
|
package/dist/preact/index.d.ts
CHANGED
|
@@ -1,28 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { AnnotationPlugin } from '@embedpdf/plugin-annotation';
|
|
3
|
-
import { JSX } from 'preact';
|
|
4
|
-
|
|
5
|
-
declare const useAnnotationPlugin: () => {
|
|
6
|
-
plugin: AnnotationPlugin | null;
|
|
7
|
-
isLoading: boolean;
|
|
8
|
-
ready: Promise<void>;
|
|
9
|
-
};
|
|
10
|
-
declare const useAnnotationCapability: () => {
|
|
11
|
-
provides: Readonly<_embedpdf_plugin_annotation.AnnotationCapability> | null;
|
|
12
|
-
isLoading: boolean;
|
|
13
|
-
ready: Promise<void>;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
/** @jsxImportSource preact */
|
|
17
|
-
|
|
18
|
-
type AnnotationLayerProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, 'style'> & {
|
|
19
|
-
pageIndex: number;
|
|
20
|
-
scale: number;
|
|
21
|
-
pageWidth: number;
|
|
22
|
-
pageHeight: number;
|
|
23
|
-
rotation: number;
|
|
24
|
-
style?: JSX.CSSProperties;
|
|
25
|
-
};
|
|
26
|
-
declare function AnnotationLayer({ pageIndex, scale, pageWidth, pageHeight, rotation, style, ...props }: AnnotationLayerProps): JSX.Element;
|
|
27
|
-
|
|
28
|
-
export { AnnotationLayer, useAnnotationCapability, useAnnotationPlugin };
|
|
1
|
+
export * from '../shared-preact';
|