@signiphi/page-assembly 0.2.0-beta.12 → 0.2.0-beta.13

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/lib/ui/button.tsx","../src/lib/ui/card.tsx","../src/lib/ui/input.tsx","../src/lib/ui/label.tsx","../src/lib/ui/badge.tsx","../src/lib/ui/select.tsx","../src/lib/ui/alert-dialog.tsx","../src/lib/ui/dropdown-menu.tsx","../src/lib/ui/tooltip.tsx","../../pdf-crypto/src/pdf-decrypt.ts","../src/utils/pdf-decrypt.ts","../src/utils/pdf-helpers.ts","../src/utils/field-extraction.ts","../src/utils/add-form-fields.ts","../src/components/PageAssembler.tsx"],"names":["twMerge","clsx","cva","React","Slot","jsx","React2","React3","React4","LabelPrimitive","SelectPrimitive","React5","jsxs","ChevronDown","ChevronUp","Check","AlertDialogPrimitive","React6","DropdownMenuPrimitive","React7","ChevronRight","Circle","TooltipPrimitive","React8","i","PDFName","PDFNumber","PDFString","PDFHexString","PDFBool","PDFDict","filter","PDFArray","PDFInvalidObject","PDFObjectParser","PDFRawStream","PDFObjectStreamParser","PDFRef","PDFDocument","PdfPasswordRequiredError","UnsupportedPdfEncryptionError","decryptPdf","normalizePdfEncryption","pdfjsLib","PDFTextField","PDFCheckBox","PDFDropdown","PDFRadioGroup","FormFieldType","StandardFonts","pages","rgb","existingPageIds","useRef","useDrag","useDrop","useEffect","GripVertical","useCallback","useState","FileText","ImageIcon","X","MoreHorizontal","Trash2","forwardRef","useReducer","useMemo","useImperativeHandle","arrayBuffer","blob","pdfBytes","DndProvider","HTML5Backend","Fragment","Upload","FolderOpen"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import * as React from 'react';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils';\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\r\n outline:\r\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 rounded-md px-3',\r\n lg: 'h-11 md:h-12 rounded-md px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n);\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean;\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button';\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size }), className)}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nButton.displayName = 'Button';\r\n\r\nexport { Button, buttonVariants };\r\n","import * as React from 'react';\r\nimport { cn } from '../utils';\r\n\r\nconst Card = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'rounded-lg bg-card text-card-foreground shadow-sm',\r\n className\r\n )}\r\n style={{\r\n border: '1px solid hsl(var(--xpa-border))',\r\n ...((props.style || {}) as React.CSSProperties)\r\n }}\r\n {...props}\r\n />\r\n));\r\nCard.displayName = 'Card';\r\n\r\nconst CardHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('flex flex-col space-y-1.5 p-6', className)}\r\n {...props}\r\n />\r\n));\r\nCardHeader.displayName = 'CardHeader';\r\n\r\nconst CardTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h3\r\n ref={ref}\r\n className={cn(\r\n 'text-2xl font-semibold leading-none tracking-tight',\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nCardTitle.displayName = 'CardTitle';\r\n\r\nconst CardDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <p\r\n ref={ref}\r\n className={cn('text-sm text-muted-foreground', className)}\r\n {...props}\r\n />\r\n));\r\nCardDescription.displayName = 'CardDescription';\r\n\r\nconst CardContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\r\n));\r\nCardContent.displayName = 'CardContent';\r\n\r\nconst CardFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('flex items-center p-6 pt-0', className)}\r\n {...props}\r\n />\r\n));\r\nCardFooter.displayName = 'CardFooter';\r\n\r\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\r\n","import * as React from 'react';\r\nimport { cn } from '../utils';\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {}\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n 'flex h-10 w-full rounded-md border-2 border-input bg-background px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground transition-all duration-200 focus:outline-none focus:border-primary focus:ring-0 focus:shadow-[0_0_0_3px_rgba(0,153,205,0.15)] focus-visible:outline-none focus-visible:border-primary focus-visible:ring-0 focus-visible:shadow-[0_0_0_3px_rgba(0,153,205,0.15)] disabled:cursor-not-allowed disabled:opacity-50',\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nInput.displayName = 'Input';\r\n\r\nexport { Input };\r\n","import * as React from 'react';\r\nimport * as LabelPrimitive from '@radix-ui/react-label';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils';\r\n\r\nconst labelVariants = cva(\r\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\r\n);\r\n\r\nconst Label = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\r\n VariantProps<typeof labelVariants> & {\r\n children?: React.ReactNode;\r\n }\r\n>(({ className, ...props }, ref) => (\r\n <LabelPrimitive.Root\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nLabel.displayName = LabelPrimitive.Root.displayName;\r\n\r\nexport { Label };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils';\r\n\r\nconst badgeVariants = cva(\r\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n destructive:\r\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\r\n outline: 'text-foreground',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n },\r\n }\r\n);\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nfunction Badge({ className, variant, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\r\n );\r\n}\r\n\r\nexport { Badge, badgeVariants };\r\n","import * as React from 'react';\r\nimport * as SelectPrimitive from '@radix-ui/react-select';\r\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\r\nimport { cn } from '../utils';\r\n\r\nconst Select = SelectPrimitive.Root;\r\n\r\nconst SelectGroup = SelectPrimitive.Group;\r\n\r\nconst SelectValue = SelectPrimitive.Value;\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n));\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n 'flex cursor-default items-center justify-center py-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n));\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n 'flex cursor-default items-center justify-center py-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n));\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName;\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = 'popper', ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n 'relative max-h-96 min-w-[12rem] overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\r\n position === 'popper' &&\r\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\r\n className\r\n )}\r\n position={position}\r\n style={{ \r\n zIndex: 99999,\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #e2e8f0',\r\n borderRadius: '0.5rem',\r\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',\r\n marginTop: '4px',\r\n }}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n position === 'popper' &&\r\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\r\n )}\r\n style={{ padding: '6px' }}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n));\r\nSelectContent.displayName = SelectPrimitive.Content.displayName;\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\r\n {...props}\r\n />\r\n));\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => {\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n \r\n return (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n 'relative flex w-full cursor-pointer select-none items-center outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\r\n className\r\n )}\r\n style={{\r\n backgroundColor: isHovered ? '#f1f5f9' : 'transparent',\r\n color: '#1e293b',\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n marginBottom: '2px',\r\n }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n {...props}\r\n >\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n <SelectPrimitive.ItemIndicator \r\n style={{ \r\n marginLeft: 'auto',\r\n paddingLeft: '8px',\r\n color: '#0099cd',\r\n }}\r\n >\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </SelectPrimitive.Item>\r\n );\r\n});\r\nSelectItem.displayName = SelectPrimitive.Item.displayName;\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\r\n {...props}\r\n />\r\n));\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n};\r\n","import * as React from \"react\"\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\r\n\r\nimport { cn } from \"../utils\"\r\nimport { buttonVariants } from \"./button\"\r\n\r\nconst AlertDialog = AlertDialogPrimitive.Root\r\n\r\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\r\n\r\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\r\n\r\nconst AlertDialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-[9998] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\r\n\r\nconst AlertDialogContent = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPortal container={document.querySelector('.signiphi-page-assembly') as HTMLElement}>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-[9999] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AlertDialogPortal>\r\n))\r\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\r\n\r\nconst AlertDialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\r\n\r\nconst AlertDialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\r\n\r\nconst AlertDialogTitle = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\r\n\r\nconst AlertDialogDescription = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogDescription.displayName =\r\n AlertDialogPrimitive.Description.displayName\r\n\r\nconst AlertDialogAction = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Action\r\n ref={ref}\r\n className={cn(buttonVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\r\n\r\nconst AlertDialogCancel = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Cancel\r\n ref={ref}\r\n className={cn(\r\n buttonVariants({ variant: \"outline\" }),\r\n \"mt-2 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\r\n\r\nexport {\r\n AlertDialog,\r\n AlertDialogPortal,\r\n AlertDialogOverlay,\r\n AlertDialogTrigger,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n}\r\n","import * as React from \"react\"\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\r\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\r\n\r\nimport { cn } from \"../utils\"\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root\r\n\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\r\n\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\r\n\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\r\n\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\r\n\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n))\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(\r\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"min-w-[12rem] overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n style={{\r\n zIndex: 99999,\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #e2e8f0',\r\n borderRadius: '0.5rem',\r\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',\r\n padding: '6px',\r\n }}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n))\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => {\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n \r\n return (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-pointer select-none items-center gap-2 outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n style={{\r\n backgroundColor: isHovered ? '#f1f5f9' : 'transparent',\r\n color: '#1e293b',\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n marginBottom: '2px',\r\n }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n {...props}\r\n />\r\n );\r\n})\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n))\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n))\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn(\r\n \"px-2 py-1.5 text-sm font-semibold\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\r\n}\r\n","import * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"../utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","/**\r\n * Decrypts PDFs protected with the standard security handler and an EMPTY\r\n * user password (the common \"permission-restricted\" documents that open in\r\n * any viewer without a prompt but that pdf-lib refuses to load).\r\n *\r\n * pdf-lib's `ignoreEncryption` option parses the file structure but leaves\r\n * every stream and string encrypted — anything we then bake into the PDF is\r\n * written unencrypted into a file that still declares `/Encrypt`, which\r\n * renders as garbage. The only safe way to ingest these documents is to\r\n * actually decrypt them once, up front, and drop `/Encrypt`.\r\n *\r\n * Supported schemes (ISO 32000): RC4 40..128-bit (V1/V2, R2..R3),\r\n * crypt filters with RC4 or AES-128 (V4, R4), and AES-256 (V5, R5/R6).\r\n * WebCrypto supplies SHA-2/AES; MD5 and RC4 (absent from WebCrypto) are\r\n * implemented inline.\r\n *\r\n * PERMISSIONS: decrypting drops `/Encrypt`, and with it the author's\r\n * permission bits (`/P` — no-print, no-copy, no-modify). Any artifact derived\r\n * from a restricted source therefore carries no restrictions. That is a\r\n * deliberate, accepted trade, and a fact about the products built on this\r\n * module rather than an implementation detail: pdf-lib cannot write an\r\n * encrypted document, so the alternatives are an unrestricted output or no\r\n * output at all. Asserted as intended behaviour by consumers — see\r\n * `review-pdf-derivation.test.ts` in `@signiphi/pdf-signer`\r\n * (`out.isEncrypted === false`).\r\n *\r\n * THIS IS THE ONLY COPY. It previously existed as three hand-synced copies in\r\n * `@signiphi/pdf-signer`, `@signiphi/page-assembly` and\r\n * `@signiphi/document-prepare`, which had already drifted (different error\r\n * base classes, different loggers, `!` assertions in one of them) and made a\r\n * cipher fix three pull requests. Those packages now re-export from here.\r\n * Keep it that way: a fourth copy re-creates the drift this package exists to\r\n * end.\r\n *\r\n * `noUncheckedIndexedAccess` is ON in this package's tsconfig, so the `!`\r\n * assertions on typed-array reads below are load-bearing documentation. Every\r\n * asserted index is provably in bounds — fixed 16/64-entry tables and\r\n * `& 0xff`-masked RC4 state.\r\n *\r\n * CATCHING `PdfPasswordRequiredError` ACROSS PACKAGES: still do it by `code`,\r\n * not by `instanceof` — use {@link isPdfPasswordRequiredError}. One source copy\r\n * does NOT mean one runtime class. Each consuming package *bundles* this module\r\n * rather than importing it at runtime, and it has to: the parser below walks\r\n * pdf-lib objects created by the caller and dispatches on `instanceof PDFDict`\r\n * / `PDFRef` / `PDFRawStream`, so this module and its caller must share a\r\n * single pdf-lib instance. Consumers bundle their own pdf-lib, so bundling this\r\n * module with them is what guarantees that; leaving it external would hand it a\r\n * second pdf-lib whose classes match nothing it is given. The cost of that\r\n * choice is one copy of this class per consuming bundle, so `instanceof` stays\r\n * copy-specific — as does the `DocumentPrepareError` subclass that\r\n * `@signiphi/document-prepare` deliberately translates to at its own boundary,\r\n * to keep its documented error contract.\r\n *\r\n * What the single source copy buys is therefore maintenance, not identity: one\r\n * implementation, one test suite, one fixture, and a cipher fix that is one\r\n * pull request instead of three.\r\n */\r\nimport {\r\n PDFArray,\r\n PDFBool,\r\n PDFDict,\r\n PDFDocument,\r\n PDFHexString,\r\n PDFInvalidObject,\r\n PDFName,\r\n PDFNumber,\r\n PDFObject,\r\n PDFObjectParser,\r\n PDFObjectStreamParser,\r\n PDFRawStream,\r\n PDFRef,\r\n PDFString,\r\n} from 'pdf-lib';\r\n\r\n/**\r\n * Minimal sink for the one informational message this module emits. Each\r\n * consuming package passes its own logger so the line lands in that package's\r\n * log stream with its own prefix and level gating.\r\n */\r\nexport interface PdfCryptoLogger {\r\n info(message: string, ...args: unknown[]): void;\r\n}\r\n\r\nexport interface PdfDecryptOptions {\r\n /** Where to report that an encrypted document was detected. Default: silent. */\r\n logger?: PdfCryptoLogger;\r\n}\r\n\r\nexport class PdfPasswordRequiredError extends Error {\r\n code = 'PDF_PASSWORD_REQUIRED';\r\n recoverable = true;\r\n userMessage: string;\r\n constructor() {\r\n const message = 'This PDF is password-protected. Please remove the password and upload it again.';\r\n super(message);\r\n this.name = 'PdfPasswordRequiredError';\r\n this.userMessage = message;\r\n }\r\n}\r\n\r\nexport class UnsupportedPdfEncryptionError extends Error {\r\n /**\r\n * The scheme that is not supported, e.g. `'V5 /R6'` — the same string that is\r\n * interpolated into `message`. Kept as its own field so a package boundary\r\n * that re-wraps this error in its own type (`@signiphi/document-prepare`\r\n * does, to keep everything it throws a `DocumentPrepareError`) can rebuild it\r\n * without regex-parsing the message back apart.\r\n */\r\n readonly detail: string;\r\n constructor(detail: string) {\r\n super(`This PDF uses an unsupported encryption scheme (${detail}).`);\r\n this.name = 'UnsupportedPdfEncryptionError';\r\n this.detail = detail;\r\n }\r\n}\r\n\r\n/**\r\n * The portable \"does this PDF need a password?\" check.\r\n *\r\n * Prefer this over `instanceof PdfPasswordRequiredError` in any code that\r\n * spans package boundaries: `@signiphi/document-prepare` re-throws a\r\n * `DocumentPrepareError` subclass to preserve its own error contract, and a\r\n * host app may have more than one copy of this package resolved. The `code`\r\n * field is stable across all of them.\r\n */\r\nexport function isPdfPasswordRequiredError(error: unknown): boolean {\r\n return (\r\n typeof error === 'object' &&\r\n error !== null &&\r\n (error as { code?: unknown }).code === 'PDF_PASSWORD_REQUIRED'\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Crypto primitives\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction concatBytes(...parts: Uint8Array[]): Uint8Array {\r\n let total = 0;\r\n for (const p of parts) total += p.length;\r\n const out = new Uint8Array(total);\r\n let offset = 0;\r\n for (const p of parts) {\r\n out.set(p, offset);\r\n offset += p.length;\r\n }\r\n return out;\r\n}\r\n\r\nconst MD5_S = [\r\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\r\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\r\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\r\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\r\n];\r\n\r\nconst MD5_K = (() => {\r\n const k = new Uint32Array(64);\r\n for (let i = 0; i < 64; i++) k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 0x100000000);\r\n return k;\r\n})();\r\n\r\n/** WebCrypto has no MD5, but the standard security handler requires it. */\r\nfunction md5(input: Uint8Array): Uint8Array {\r\n const bitLen = input.length * 8;\r\n const paddedLen = (((input.length + 8) >> 6) + 1) << 6;\r\n const buf = new Uint8Array(paddedLen);\r\n buf.set(input);\r\n buf[input.length] = 0x80;\r\n const dv = new DataView(buf.buffer);\r\n dv.setUint32(paddedLen - 8, bitLen >>> 0, true);\r\n dv.setUint32(paddedLen - 4, Math.floor(bitLen / 0x100000000), true);\r\n\r\n let a0 = 0x67452301;\r\n let b0 = 0xefcdab89;\r\n let c0 = 0x98badcfe;\r\n let d0 = 0x10325476;\r\n const M = new Uint32Array(16);\r\n\r\n for (let offset = 0; offset < paddedLen; offset += 64) {\r\n for (let i = 0; i < 16; i++) M[i] = dv.getUint32(offset + i * 4, true);\r\n let A = a0;\r\n let B = b0;\r\n let C = c0;\r\n let D = d0;\r\n for (let i = 0; i < 64; i++) {\r\n let F: number;\r\n let g: number;\r\n if (i < 16) {\r\n F = (B & C) | (~B & D);\r\n g = i;\r\n } else if (i < 32) {\r\n F = (D & B) | (~D & C);\r\n g = (5 * i + 1) & 15;\r\n } else if (i < 48) {\r\n F = B ^ C ^ D;\r\n g = (3 * i + 5) & 15;\r\n } else {\r\n F = C ^ (B | ~D);\r\n g = (7 * i) & 15;\r\n }\r\n const tmp = D;\r\n D = C;\r\n C = B;\r\n const x = (A + F + MD5_K[i]! + M[g]!) | 0;\r\n const s = MD5_S[i]!;\r\n B = (B + ((x << s) | (x >>> (32 - s)))) | 0;\r\n A = tmp;\r\n }\r\n a0 = (a0 + A) | 0;\r\n b0 = (b0 + B) | 0;\r\n c0 = (c0 + C) | 0;\r\n d0 = (d0 + D) | 0;\r\n }\r\n\r\n const out = new Uint8Array(16);\r\n const ov = new DataView(out.buffer);\r\n ov.setUint32(0, a0 >>> 0, true);\r\n ov.setUint32(4, b0 >>> 0, true);\r\n ov.setUint32(8, c0 >>> 0, true);\r\n ov.setUint32(12, d0 >>> 0, true);\r\n return out;\r\n}\r\n\r\nfunction rc4(key: Uint8Array, data: Uint8Array): Uint8Array {\r\n const S = new Uint8Array(256);\r\n for (let i = 0; i < 256; i++) S[i] = i;\r\n let j = 0;\r\n for (let i = 0; i < 256; i++) {\r\n j = (j + S[i]! + key[i % key.length]!) & 0xff;\r\n const t = S[i]!;\r\n S[i] = S[j]!;\r\n S[j] = t;\r\n }\r\n const out = new Uint8Array(data.length);\r\n let i = 0;\r\n j = 0;\r\n for (let k = 0; k < data.length; k++) {\r\n i = (i + 1) & 0xff;\r\n j = (j + S[i]!) & 0xff;\r\n const t = S[i]!;\r\n S[i] = S[j]!;\r\n S[j] = t;\r\n out[k] = data[k]! ^ S[(S[i]! + S[j]!) & 0xff]!;\r\n }\r\n return out;\r\n}\r\n\r\nfunction getSubtle(): SubtleCrypto {\r\n const subtle = globalThis.crypto?.subtle;\r\n if (!subtle) throw new UnsupportedPdfEncryptionError('WebCrypto is unavailable in this environment');\r\n return subtle;\r\n}\r\n\r\nasync function sha2(algorithm: 'SHA-256' | 'SHA-384' | 'SHA-512', data: Uint8Array): Promise<Uint8Array> {\r\n return new Uint8Array(await getSubtle().digest(algorithm, data as BufferSource));\r\n}\r\n\r\nasync function importAesKey(rawKey: Uint8Array, usages: KeyUsage[]): Promise<CryptoKey> {\r\n return getSubtle().importKey('raw', rawKey as BufferSource, 'AES-CBC', false, usages);\r\n}\r\n\r\n/** AES-CBC encrypt without padding: WebCrypto appends a PKCS#7 block; drop it. */\r\nasync function aesCbcEncryptNoPad(rawKey: Uint8Array, iv: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\r\n const key = await importAesKey(rawKey, ['encrypt']);\r\n const out = new Uint8Array(await getSubtle().encrypt({ name: 'AES-CBC', iv: iv as BufferSource }, key, data as BufferSource));\r\n return out.slice(0, data.length);\r\n}\r\n\r\n/**\r\n * AES-CBC decrypt without padding. WebCrypto insists on valid PKCS#7, so we\r\n * append one deliberately-valid padding block (the encryption, chained off\r\n * the final ciphertext block, of an empty plaintext) and let WebCrypto strip\r\n * exactly that block — recovering all `data.length` plaintext bytes.\r\n */\r\nasync function aesCbcDecryptNoPad(rawKey: Uint8Array, iv: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\r\n const key = await importAesKey(rawKey, ['encrypt', 'decrypt']);\r\n const lastBlock = data.slice(data.length - 16);\r\n const padBlock = new Uint8Array(\r\n await getSubtle().encrypt({ name: 'AES-CBC', iv: lastBlock as BufferSource }, key, new Uint8Array(0)),\r\n );\r\n const joined = concatBytes(data, padBlock);\r\n return new Uint8Array(await getSubtle().decrypt({ name: 'AES-CBC', iv: iv as BufferSource }, key, joined as BufferSource));\r\n}\r\n\r\n/** Decrypt AESV2/AESV3 payload data: 16-byte IV prefix + CBC ciphertext + PKCS#7. */\r\nasync function aesDecryptPdfData(rawKey: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\r\n if (data.length < 32) return new Uint8Array(0); // no room for IV + one block\r\n const iv = data.slice(0, 16);\r\n let ct = data.slice(16);\r\n if (ct.length % 16 !== 0) ct = ct.slice(0, ct.length - (ct.length % 16));\r\n try {\r\n const key = await importAesKey(rawKey, ['decrypt']);\r\n return new Uint8Array(await getSubtle().decrypt({ name: 'AES-CBC', iv: iv as BufferSource }, key, ct as BufferSource));\r\n } catch {\r\n // Some producers write broken PKCS#7 padding; decrypt raw and strip manually.\r\n const plain = await aesCbcDecryptNoPad(rawKey, iv, ct);\r\n const padLen = plain[plain.length - 1]!;\r\n return padLen >= 1 && padLen <= 16 ? plain.slice(0, plain.length - padLen) : plain;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Standard security handler — password verification & key derivation\r\n// ---------------------------------------------------------------------------\r\n\r\nconst PAD = new Uint8Array([\r\n 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56,\r\n 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,\r\n 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a,\r\n]);\r\n\r\n/** Constant-time comparison (XOR-accumulate, no early exit) so unequal bytes\r\n * don't leak a timing signal. Defence-in-depth — not exploitable here. */\r\nconst bytesEqual = (a: Uint8Array, b: Uint8Array): boolean => {\r\n if (a.length !== b.length) return false;\r\n let diff = 0;\r\n for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;\r\n return diff === 0;\r\n};\r\n\r\ninterface LegacyEncryptParams {\r\n revision: number;\r\n keyLen: number;\r\n O: Uint8Array;\r\n U: Uint8Array;\r\n P: number;\r\n id0: Uint8Array;\r\n encryptMetadata: boolean;\r\n}\r\n\r\n/** Algorithm 2: file key from a padded password. */\r\nfunction legacyFileKey(paddedPwd: Uint8Array, params: LegacyEncryptParams): Uint8Array {\r\n const { revision, keyLen, O, P, id0, encryptMetadata } = params;\r\n const pBytes = new Uint8Array(4);\r\n new DataView(pBytes.buffer).setInt32(0, P | 0, true);\r\n const parts = [paddedPwd, O.slice(0, 32), pBytes, id0];\r\n if (revision >= 4 && !encryptMetadata) parts.push(new Uint8Array([0xff, 0xff, 0xff, 0xff]));\r\n let h = md5(concatBytes(...parts));\r\n if (revision >= 3) for (let i = 0; i < 50; i++) h = md5(h.slice(0, keyLen));\r\n return h.slice(0, keyLen);\r\n}\r\n\r\n/** Algorithms 4/5: the /U value that a given file key implies. */\r\nfunction legacyComputeU(fileKey: Uint8Array, revision: number, id0: Uint8Array): Uint8Array {\r\n if (revision === 2) return rc4(fileKey, PAD);\r\n let d = md5(concatBytes(PAD, id0));\r\n d = rc4(fileKey, d);\r\n for (let i = 1; i <= 19; i++) d = rc4(fileKey.map((b) => b ^ i), d);\r\n return d;\r\n}\r\n\r\nfunction legacyUMatches(fileKey: Uint8Array, params: LegacyEncryptParams): boolean {\r\n const computed = legacyComputeU(fileKey, params.revision, params.id0);\r\n return params.revision === 2\r\n ? bytesEqual(computed, params.U.slice(0, 32))\r\n : bytesEqual(computed.slice(0, 16), params.U.slice(0, 16));\r\n}\r\n\r\n/**\r\n * Verify the EMPTY user password (Algorithm 6) and return the file\r\n * encryption key. Anything else — including files whose owner password\r\n * happens to be empty while the user password is not — throws\r\n * {@link PdfPasswordRequiredError}: those documents prompt in viewers, and\r\n * opening them via owner-password recovery would exceed this module's\r\n * documented no-prompt scope.\r\n */\r\nfunction legacyAuthenticateEmptyPassword(params: LegacyEncryptParams): Uint8Array {\r\n const userKey = legacyFileKey(PAD, params);\r\n if (legacyUMatches(userKey, params)) return userKey;\r\n throw new PdfPasswordRequiredError();\r\n}\r\n\r\n/** ISO 32000-2 Algorithm 2.B iterated hash (revision 6). */\r\nasync function hash2B(password: Uint8Array, salt: Uint8Array, udata: Uint8Array): Promise<Uint8Array> {\r\n let k = await sha2('SHA-256', concatBytes(password, salt, udata));\r\n let e: Uint8Array = new Uint8Array(0);\r\n let i = 0;\r\n do {\r\n const block = concatBytes(password, k, udata);\r\n const k1 = new Uint8Array(block.length * 64);\r\n for (let rep = 0; rep < 64; rep++) k1.set(block, rep * block.length);\r\n e = await aesCbcEncryptNoPad(k.slice(0, 16), k.slice(16, 32), k1);\r\n let sum = 0;\r\n for (let b = 0; b < 16; b++) sum += e[b]!;\r\n const mod = sum % 3;\r\n k = await sha2(mod === 0 ? 'SHA-256' : mod === 1 ? 'SHA-384' : 'SHA-512', e);\r\n i++;\r\n } while (i < 64 || e[e.length - 1]! > i - 32);\r\n return k.slice(0, 32);\r\n}\r\n\r\n/**\r\n * AES-256 (V5, R5/R6) empty USER password authentication per Algorithm 2.A.\r\n * Returns the 32-byte file encryption key from /UE.\r\n */\r\nasync function v5AuthenticateEmptyPassword(\r\n revision: number,\r\n U: Uint8Array,\r\n UE: Uint8Array,\r\n): Promise<Uint8Array> {\r\n const pwd = new Uint8Array(0);\r\n const zeroIv = new Uint8Array(16);\r\n const hash = async (salt: Uint8Array, udata: Uint8Array) =>\r\n revision === 5 ? sha2('SHA-256', concatBytes(pwd, salt, udata)) : hash2B(pwd, salt, udata);\r\n\r\n const userHash = await hash(U.slice(32, 40), new Uint8Array(0));\r\n if (bytesEqual(userHash, U.slice(0, 32))) {\r\n const intermediate = await hash(U.slice(40, 48), new Uint8Array(0));\r\n return aesCbcDecryptNoPad(intermediate, zeroIv, UE.slice(0, 32));\r\n }\r\n\r\n // No owner-password recovery: a file that fails empty USER password\r\n // validation prompts in viewers and is out of this module's no-prompt\r\n // scope, even when its owner password happens to be empty.\r\n throw new PdfPasswordRequiredError();\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Cipher selection\r\n// ---------------------------------------------------------------------------\r\n\r\ntype ObjectCipher = (data: Uint8Array, ref: PDFRef) => Promise<Uint8Array>;\r\n\r\ninterface DocumentCiphers {\r\n stringCipher: ObjectCipher;\r\n streamCipher: ObjectCipher;\r\n encryptMetadata: boolean;\r\n}\r\n\r\nconst identityCipher: ObjectCipher = async (data) => data;\r\n\r\nfunction rc4ObjectCipher(fileKey: Uint8Array): ObjectCipher {\r\n return async (data, ref) => {\r\n const ext = new Uint8Array([\r\n ref.objectNumber & 0xff,\r\n (ref.objectNumber >> 8) & 0xff,\r\n (ref.objectNumber >> 16) & 0xff,\r\n ref.generationNumber & 0xff,\r\n (ref.generationNumber >> 8) & 0xff,\r\n ]);\r\n const key = md5(concatBytes(fileKey, ext)).slice(0, Math.min(fileKey.length + 5, 16));\r\n return rc4(key, data);\r\n };\r\n}\r\n\r\nconst AES_SALT = new Uint8Array([0x73, 0x41, 0x6c, 0x54]); // 'sAlT'\r\n\r\nfunction aes128ObjectCipher(fileKey: Uint8Array): ObjectCipher {\r\n return async (data, ref) => {\r\n const ext = new Uint8Array([\r\n ref.objectNumber & 0xff,\r\n (ref.objectNumber >> 8) & 0xff,\r\n (ref.objectNumber >> 16) & 0xff,\r\n ref.generationNumber & 0xff,\r\n (ref.generationNumber >> 8) & 0xff,\r\n ]);\r\n const key = md5(concatBytes(fileKey, ext, AES_SALT)).slice(0, 16);\r\n return aesDecryptPdfData(key, data);\r\n };\r\n}\r\n\r\nfunction aes256ObjectCipher(fileKey: Uint8Array): ObjectCipher {\r\n return async (data) => aesDecryptPdfData(fileKey, data);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// /Encrypt dictionary parsing\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction dictNumber(dict: PDFDict, key: string): number | undefined {\r\n const value = dict.lookup(PDFName.of(key));\r\n return value instanceof PDFNumber ? value.asNumber() : undefined;\r\n}\r\n\r\nfunction dictBytes(dict: PDFDict, key: string): Uint8Array | undefined {\r\n const value = dict.lookup(PDFName.of(key));\r\n return value instanceof PDFString || value instanceof PDFHexString ? value.asBytes() : undefined;\r\n}\r\n\r\nasync function buildDocumentCiphers(encDict: PDFDict, id0: Uint8Array): Promise<DocumentCiphers> {\r\n const filter = encDict.lookup(PDFName.of('Filter'));\r\n if (filter !== PDFName.of('Standard')) {\r\n throw new UnsupportedPdfEncryptionError(`security handler ${String(filter)}`);\r\n }\r\n\r\n const V = dictNumber(encDict, 'V') ?? 0;\r\n const R = dictNumber(encDict, 'R') ?? 0;\r\n const O = dictBytes(encDict, 'O');\r\n const U = dictBytes(encDict, 'U');\r\n const P = dictNumber(encDict, 'P') ?? -1;\r\n const metadataValue = encDict.lookup(PDFName.of('EncryptMetadata'));\r\n const encryptMetadata = metadataValue instanceof PDFBool ? metadataValue.asBoolean() : true;\r\n if (!O || !U) throw new UnsupportedPdfEncryptionError('missing /O or /U');\r\n\r\n if (V === 1 || V === 2) {\r\n const keyLen = V === 1 ? 5 : (dictNumber(encDict, 'Length') ?? 40) / 8;\r\n const fileKey = legacyAuthenticateEmptyPassword({ revision: R, keyLen, O, U, P, id0, encryptMetadata });\r\n const cipher = rc4ObjectCipher(fileKey);\r\n return { stringCipher: cipher, streamCipher: cipher, encryptMetadata };\r\n }\r\n\r\n if (V === 4 || V === 5) {\r\n const cf = encDict.lookup(PDFName.of('CF'));\r\n const cfmOf = (filterKey: string): PDFName | undefined => {\r\n const streamFilter = encDict.lookup(PDFName.of(filterKey));\r\n if (!(streamFilter instanceof PDFName) || streamFilter === PDFName.of('Identity')) return undefined;\r\n if (!(cf instanceof PDFDict)) throw new UnsupportedPdfEncryptionError('missing /CF');\r\n const cfDict = cf.lookup(streamFilter);\r\n if (!(cfDict instanceof PDFDict)) throw new UnsupportedPdfEncryptionError(`missing crypt filter ${streamFilter.toString()}`);\r\n const cfm = cfDict.lookup(PDFName.of('CFM'));\r\n return cfm instanceof PDFName ? cfm : undefined;\r\n };\r\n\r\n let fileKey: Uint8Array;\r\n if (V === 5) {\r\n const UE = dictBytes(encDict, 'UE');\r\n if (!UE) throw new UnsupportedPdfEncryptionError('missing /UE');\r\n fileKey = await v5AuthenticateEmptyPassword(R, U, UE);\r\n } else {\r\n // V4: the file key length is declared by the standard crypt filter's\r\n // /Length (bytes per spec, bits from some producers), falling back to\r\n // the top-level /Length, then to the V4 default of 128-bit. Defaulting\r\n // to 40-bit here would derive a wrong key and misreport a perfectly\r\n // openable document as password-protected.\r\n const cryptFilterLengthBits = (): number | undefined => {\r\n if (!(cf instanceof PDFDict)) return undefined;\r\n for (const filterKey of ['StmF', 'StrF']) {\r\n const filter = encDict.lookup(PDFName.of(filterKey));\r\n if (!(filter instanceof PDFName) || filter === PDFName.of('Identity')) continue;\r\n const cfDict = cf.lookup(filter);\r\n if (!(cfDict instanceof PDFDict)) continue;\r\n const len = dictNumber(cfDict, 'Length');\r\n if (len === undefined) continue;\r\n return len < 40 ? len * 8 : len;\r\n }\r\n return undefined;\r\n };\r\n const keyLenBits = cryptFilterLengthBits() ?? dictNumber(encDict, 'Length') ?? 128;\r\n fileKey = legacyAuthenticateEmptyPassword({\r\n revision: R,\r\n keyLen: keyLenBits / 8,\r\n O,\r\n U,\r\n P,\r\n id0,\r\n encryptMetadata,\r\n });\r\n }\r\n\r\n const cipherFor = (cfm: PDFName | undefined): ObjectCipher => {\r\n if (!cfm || cfm === PDFName.of('Identity')) return identityCipher;\r\n if (cfm === PDFName.of('V2')) return rc4ObjectCipher(fileKey);\r\n if (cfm === PDFName.of('AESV2')) return aes128ObjectCipher(fileKey);\r\n if (cfm === PDFName.of('AESV3')) return aes256ObjectCipher(fileKey);\r\n throw new UnsupportedPdfEncryptionError(`crypt filter method ${cfm.toString()}`);\r\n };\r\n\r\n return {\r\n streamCipher: cipherFor(cfmOf('StmF')),\r\n stringCipher: cipherFor(cfmOf('StrF')),\r\n encryptMetadata,\r\n };\r\n }\r\n\r\n throw new UnsupportedPdfEncryptionError(`/V ${V}`);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Document walk\r\n// ---------------------------------------------------------------------------\r\n\r\nconst toHexString = (bytes: Uint8Array): PDFHexString => {\r\n let hex = '';\r\n for (let i = 0; i < bytes.length; i++) hex += bytes[i]!.toString(16).padStart(2, '0');\r\n return new PDFHexString(hex.toUpperCase());\r\n};\r\n\r\nfunction filterIncludesCrypt(dict: PDFDict): boolean {\r\n const filter = dict.lookup(PDFName.of('Filter'));\r\n if (filter === PDFName.of('Crypt')) return true;\r\n if (filter instanceof PDFArray) {\r\n for (let i = 0; i < filter.size(); i++) {\r\n if (filter.get(i) === PDFName.of('Crypt')) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Whether a /Crypt-filtered stream names the Identity filter (the default\r\n * when /DecodeParms carries no /Name) — i.e. the stream bytes are NOT\r\n * encrypted and must pass through untouched. Any other named filter means\r\n * selective encryption, which this module does not implement.\r\n */\r\nfunction cryptFilterIsIdentity(dict: PDFDict): boolean {\r\n const parms =\r\n dict.lookup(PDFName.of('DecodeParms')) ?? dict.lookup(PDFName.of('DP'));\r\n const identityParms = (p: unknown): boolean => {\r\n if (!(p instanceof PDFDict)) return true;\r\n const name = p.lookup(PDFName.of('Name'));\r\n return !(name instanceof PDFName) || name === PDFName.of('Identity');\r\n };\r\n if (parms instanceof PDFArray) {\r\n for (let i = 0; i < parms.size(); i++) {\r\n if (!identityParms(parms.lookup(i))) return false;\r\n }\r\n return true;\r\n }\r\n return identityParms(parms);\r\n}\r\n\r\n/** Decrypt every string reachable through direct children of `obj`. */\r\nasync function decryptStringsWithin(\r\n obj: PDFObject,\r\n ref: PDFRef,\r\n stringCipher: ObjectCipher,\r\n): Promise<void> {\r\n if (obj instanceof PDFDict) {\r\n // Signature /Contents values are excluded from encryption by spec.\r\n const isSignature = obj.lookup(PDFName.of('Type')) === PDFName.of('Sig');\r\n for (const [key, value] of obj.entries()) {\r\n if (value instanceof PDFString || value instanceof PDFHexString) {\r\n if (isSignature && key === PDFName.of('Contents')) continue;\r\n obj.set(key, toHexString(await stringCipher(value.asBytes(), ref)));\r\n } else {\r\n await decryptStringsWithin(value, ref, stringCipher);\r\n }\r\n }\r\n } else if (obj instanceof PDFArray) {\r\n for (let i = 0; i < obj.size(); i++) {\r\n const value = obj.get(i);\r\n if (value instanceof PDFString || value instanceof PDFHexString) {\r\n obj.set(i, toHexString(await stringCipher(value.asBytes(), ref)));\r\n } else {\r\n await decryptStringsWithin(value, ref, stringCipher);\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function decryptLoadedDocument(doc: PDFDocument): Promise<Uint8Array> {\r\n const context = doc.context;\r\n const encryptRef = context.trailerInfo.Encrypt;\r\n const encDict = context.lookup(encryptRef);\r\n if (!(encDict instanceof PDFDict)) {\r\n throw new UnsupportedPdfEncryptionError('malformed /Encrypt dictionary');\r\n }\r\n\r\n const idArray = context.lookup(context.trailerInfo.ID);\r\n const idFirst = idArray instanceof PDFArray ? idArray.get(0) : undefined;\r\n const id0 =\r\n idFirst instanceof PDFString || idFirst instanceof PDFHexString\r\n ? idFirst.asBytes()\r\n : new Uint8Array(0);\r\n\r\n const { stringCipher, streamCipher, encryptMetadata } = await buildDocumentCiphers(encDict, id0);\r\n\r\n // Object streams (/Type /ObjStm) hold compressed member objects (typically\r\n // the catalog, page tree and info dict in Acrobat/Office output). pdf-lib's\r\n // load expands them eagerly, fails on the still-encrypted bytes, and its\r\n // recovery keeps each container only as a PDFInvalidObject blob (dict +\r\n // ciphertext, header stripped) while silently dropping every member.\r\n // Re-parse those blobs into proper raw streams so the decryption walk can\r\n // process them, then expand the decrypted members back into the context.\r\n for (const [ref, obj] of context.enumerateIndirectObjects()) {\r\n if (!(obj instanceof PDFInvalidObject)) continue;\r\n const raw = new Uint8Array(obj.sizeInBytes());\r\n obj.copyBytesInto(raw, 0);\r\n try {\r\n const parsed = PDFObjectParser.forBytes(raw, context).parseObject();\r\n if (\r\n parsed instanceof PDFRawStream &&\r\n parsed.dict.lookup(PDFName.of('Type')) === PDFName.of('ObjStm')\r\n ) {\r\n context.assign(ref, parsed);\r\n }\r\n } catch {\r\n // Not a recoverable stream object — leave the blob untouched.\r\n }\r\n }\r\n\r\n const decryptedObjectStreams: Array<[PDFRef, PDFRawStream]> = [];\r\n const structuralStreamRefs: PDFRef[] = [];\r\n\r\n for (const [ref, obj] of context.enumerateIndirectObjects()) {\r\n if (ref === encryptRef || obj === encDict) continue;\r\n\r\n if (obj instanceof PDFRawStream) {\r\n const type = obj.dict.lookup(PDFName.of('Type'));\r\n if (type === PDFName.of('XRef')) {\r\n // Cross-reference streams are never encrypted (ISO 32000 7.5.8.2),\r\n // including the /ID strings in their dict — leave them untouched and\r\n // drop the stale container below (the save rebuilds the xref).\r\n structuralStreamRefs.push(ref);\r\n continue;\r\n }\r\n const isSkippedMetadata = !encryptMetadata && type === PDFName.of('Metadata');\r\n if (filterIncludesCrypt(obj.dict)) {\r\n // Identity /Crypt streams are unencrypted by definition — pass them\r\n // through. Any OTHER named crypt filter is selective encryption we\r\n // do not implement; skipping it silently and then deleting /Encrypt\r\n // would emit permanently corrupt output, so fail loudly instead.\r\n if (!cryptFilterIsIdentity(obj.dict)) {\r\n throw new UnsupportedPdfEncryptionError('stream-specific /Crypt filter');\r\n }\r\n } else if (!isSkippedMetadata) {\r\n const decrypted = await streamCipher(obj.contents, ref);\r\n const replacement = PDFRawStream.of(obj.dict, decrypted);\r\n context.assign(ref, replacement);\r\n if (type === PDFName.of('ObjStm')) {\r\n decryptedObjectStreams.push([ref, replacement]);\r\n }\r\n }\r\n await decryptStringsWithin(obj.dict, ref, stringCipher);\r\n } else if (obj instanceof PDFString || obj instanceof PDFHexString) {\r\n context.assign(ref, toHexString(await stringCipher(obj.asBytes(), ref)));\r\n } else {\r\n await decryptStringsWithin(obj, ref, stringCipher);\r\n }\r\n }\r\n\r\n // Expand decrypted object streams. Members are already plaintext (an object\r\n // stream is encrypted only as a whole; ISO 32000 7.5.7 forbids encrypting\r\n // its contents individually), so no further decryption is applied to them.\r\n for (const [ref, stream] of decryptedObjectStreams) {\r\n await PDFObjectStreamParser.forStream(stream).parseIntoContext();\r\n context.delete(ref);\r\n }\r\n for (const ref of structuralStreamRefs) context.delete(ref);\r\n\r\n delete context.trailerInfo.Encrypt;\r\n if (encryptRef instanceof PDFRef) context.delete(encryptRef);\r\n\r\n // Plain context serialization: `addDefaultPage`/`updateFieldAppearances`\r\n // walk `doc.catalog`, which was captured as undefined when the catalog\r\n // still lived in an encrypted object stream — and a decryptor must not\r\n // mutate the document anyway.\r\n return doc.save({\r\n useObjectStreams: false,\r\n addDefaultPage: false,\r\n updateFieldAppearances: false,\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Public API\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Decrypt an encrypted PDF that opens with an empty user password.\r\n * Returns re-saved, fully decrypted bytes with `/Encrypt` removed.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport async function decryptPdf(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n const doc = await PDFDocument.load(pdfBytes.slice(), {\r\n ignoreEncryption: true,\r\n updateMetadata: false,\r\n });\r\n if (!doc.isEncrypted) return pdfBytes;\r\n return decryptLoadedDocument(doc);\r\n}\r\n\r\nconst SLASH = 0x2f; // '/'\r\nconst HASH = 0x23; // '#'\r\nconst ENCRYPT_NAME = 'Encrypt';\r\n\r\n/** Hex digit value, or -1 for anything that is not one. */\r\nfunction hexDigit(byte: number | undefined): number {\r\n if (byte === undefined) return -1;\r\n if (byte >= 0x30 && byte <= 0x39) return byte - 0x30; // 0-9\r\n if (byte >= 0x41 && byte <= 0x46) return byte - 0x41 + 10; // A-F\r\n if (byte >= 0x61 && byte <= 0x66) return byte - 0x61 + 10; // a-f\r\n return -1;\r\n}\r\n\r\n/**\r\n * Matches the name `Encrypt` starting at `start` (just past the `/`), treating\r\n * `#hh` as the character it encodes.\r\n *\r\n * ISO 32000 §7.3.5 lets any character in a name be written as `#` followed by\r\n * two hex digits, so `/Encryp#74`, `/#45ncrypt` and `/#45#6e#63#72#79#70#74`\r\n * are all the same key as `/Encrypt`. A literal byte-substring search misses\r\n * those spellings, and since this function is only a pre-filter, a miss means\r\n * `normalizePdfEncryption` returns the document untouched and the caller's\r\n * `PDFDocument.load` throws `EncryptedPDFError` — precisely the failure the\r\n * gate exists to prevent. Rare from real producers, cheap to be correct about.\r\n */\r\nfunction matchesEncryptNameAt(bytes: Uint8Array, start: number): boolean {\r\n let at = start;\r\n for (let k = 0; k < ENCRYPT_NAME.length; k++) {\r\n const want = ENCRYPT_NAME.charCodeAt(k);\r\n const byte = bytes[at];\r\n if (byte === want) {\r\n at += 1;\r\n continue;\r\n }\r\n if (byte === HASH) {\r\n const high = hexDigit(bytes[at + 1]);\r\n const low = hexDigit(bytes[at + 2]);\r\n if (high >= 0 && low >= 0 && ((high << 4) | low) === want) {\r\n at += 3;\r\n continue;\r\n }\r\n }\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction containsEncryptMarker(bytes: Uint8Array): boolean {\r\n for (let i = 0; i < bytes.length; i++) {\r\n // Cheap reject for the overwhelming majority of bytes.\r\n if (bytes[i] !== SLASH) continue;\r\n if (matchesEncryptNameAt(bytes, i + 1)) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Ingestion gate: returns the bytes untouched for regular PDFs, and a\r\n * decrypted re-save for encrypted ones so every downstream `PDFDocument.load`\r\n * (page assembly, review derivation, markup embedding, field extraction,\r\n * signing) sees a normal document.\r\n *\r\n * Permission-restricted PDFs (standard handler, empty user password) render\r\n * fine in every viewer and in PDF.js, so they reach a workflow looking\r\n * completely ordinary — but pdf-lib throws `EncryptedPDFError` on load. Gating\r\n * at ingestion keeps that failure from surfacing deep inside a bake, where it\r\n * aborts the operation after the user has already committed to it.\r\n *\r\n * Returns the *same reference* when there is nothing to do, so callers can use\r\n * `result === input` to detect that no re-save happened.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport async function normalizePdfEncryption(\r\n pdfBytes: Uint8Array,\r\n options?: PdfDecryptOptions\r\n): Promise<Uint8Array> {\r\n // Cheap pre-filter: files with no '/Encrypt' key cannot be encrypted.\r\n if (!containsEncryptMarker(pdfBytes)) return pdfBytes;\r\n\r\n const doc = await PDFDocument.load(pdfBytes.slice(), {\r\n ignoreEncryption: true,\r\n updateMetadata: false,\r\n });\r\n if (!doc.isEncrypted) return pdfBytes;\r\n\r\n options?.logger?.info('[PDF_DECRYPT] Encrypted PDF detected during ingestion; decrypting');\r\n return decryptLoadedDocument(doc);\r\n}\r\n","/**\r\n * Re-export of `@signiphi/pdf-crypto`, which owns the PDF decryption\r\n * implementation (standard security handler, empty user password).\r\n *\r\n * This file used to hold a hand-synced copy of that module, one of three across\r\n * this monorepo. They had already drifted — different error base classes,\r\n * different loggers, `!` assertions in one of them — so a cipher fix was three\r\n * pull requests. The implementation now lives in one package; this module exists\r\n * only to bind it to this package's logging convention and to keep the import\r\n * paths and public API of `@signiphi/page-assembly` unchanged.\r\n *\r\n * The pdf.js cross-check that used to live in this package's\r\n * `__tests__/pdf-decrypt.test.ts` moved with the implementation. It is still the\r\n * only independent oracle proving the fixture encrypts spec-correctly — it just\r\n * runs in `@signiphi/pdf-crypto` now, in a `node` environment, against the one\r\n * remaining copy of the fixture.\r\n *\r\n * One source copy is NOT one runtime class: `@signiphi/pdf-crypto` is bundled\r\n * into this package rather than imported at runtime (it has to be — it walks\r\n * pdf-lib objects with `instanceof`, so it must share this package's pdf-lib\r\n * instance). A host app holding both this package and `@signiphi/pdf-signer`\r\n * therefore still has two `PdfPasswordRequiredError` classes, so\r\n * `isPdfPasswordRequiredError(err)` — an `err.code` check — remains the\r\n * comparison that holds across packages. `PageAssembler.tsx` catches its own\r\n * copy and is correct either way.\r\n *\r\n * DECLARATIONS: nothing below is written as `export … from\r\n * '@signiphi/pdf-crypto'`, and that is the point. Declaration emit preserves\r\n * module specifiers verbatim — `tsc` does, and so does the `dts: true` rollup\r\n * this package builds with — so a re-export puts `from '@signiphi/pdf-crypto'`\r\n * into the shipped `dist/index.d.ts`, at the entry point. That package is\r\n * deliberately unpublished, so a consumer's `node_modules` has nothing to\r\n * resolve it to. Without `skipLibCheck` that is a hard TS2307; with it the\r\n * error is suppressed and every symbol reached through that specifier quietly\r\n * degrades instead. The runtime is unaffected either way — tsup inlines the\r\n * implementation — so the leak is invisible until a consumer's editor stops\r\n * knowing what `decryptPdf` returns.\r\n *\r\n * So the public surface is re-declared locally and bound to the real\r\n * implementation through annotated `const`s. Those annotations are the drift\r\n * guard: if `@signiphi/pdf-crypto` ever changes a signature, drops\r\n * `userMessage`, or adds a required constructor argument, the assignment stops\r\n * compiling here rather than shipping a declaration that lies. Note the guard\r\n * reads `@signiphi/pdf-crypto`'s *built* `dist/index.d.ts`, not its source, so\r\n * it only fires once that package has been rebuilt — which is why every build\r\n * and publish path has to be topological (`--filter \"<pkg>...\"`).\r\n *\r\n * DO NOT move `@signiphi/pdf-crypto` from `devDependencies` to `dependencies`\r\n * on its own. tsup externalizes everything in `dependencies` and bundles\r\n * everything else, so that one-line move would turn this into a runtime import\r\n * resolving its own `pdf-lib` — a second set of `PDFDict`/`PDFRef` classes that\r\n * match none of the objects it is handed. Decryption would then silently skip\r\n * every object it should decrypt and emit a document with `/Encrypt` deleted\r\n * but the contents still enciphered: permanently corrupt output, no error\r\n * raised. The move is safe only alongside `noExternal:\r\n * ['@signiphi/pdf-crypto']` in `tsup.config.ts`, which restores the bundling,\r\n * and only once the package is actually published — an unresolvable\r\n * `dependencies` entry breaks `npm install` outright. Until someone decides to\r\n * publish it, the local declarations below are what keeps the shipped types\r\n * honest.\r\n */\r\nimport {\r\n decryptPdf as coreDecryptPdf,\r\n isPdfPasswordRequiredError as coreIsPdfPasswordRequiredError,\r\n normalizePdfEncryption as coreNormalizePdfEncryption,\r\n PdfPasswordRequiredError as CorePdfPasswordRequiredError,\r\n UnsupportedPdfEncryptionError as CoreUnsupportedPdfEncryptionError,\r\n} from '@signiphi/pdf-crypto';\r\n\r\n/** Sink for the one line the decryptor emits when it detects an encrypted document. */\r\nexport interface PdfCryptoLogger {\r\n info(message: string, ...args: unknown[]): void;\r\n}\r\n\r\nexport interface PdfDecryptOptions {\r\n /** Where to report that an encrypted document was detected. Default: silent. */\r\n logger?: PdfCryptoLogger;\r\n}\r\n\r\n/**\r\n * Thrown when the PDF needs a non-empty user password, which this package\r\n * cannot supply. Match it with {@link isPdfPasswordRequiredError} rather than\r\n * `instanceof` — see the header note on copies.\r\n */\r\nexport interface PdfPasswordRequiredError extends Error {\r\n /** Always `'PDF_PASSWORD_REQUIRED'`. The check that survives package boundaries. */\r\n code: string;\r\n recoverable: boolean;\r\n userMessage: string;\r\n}\r\ninterface PdfPasswordRequiredErrorConstructor {\r\n new (): PdfPasswordRequiredError;\r\n readonly prototype: PdfPasswordRequiredError;\r\n}\r\nexport const PdfPasswordRequiredError: PdfPasswordRequiredErrorConstructor =\r\n CorePdfPasswordRequiredError;\r\n\r\n/** Thrown for security handlers this decryptor does not implement. */\r\nexport interface UnsupportedPdfEncryptionError extends Error {\r\n /** Always `'UnsupportedPdfEncryptionError'`. */\r\n name: string;\r\n /** The scheme that is not supported, e.g. `'V5 /R6'`. */\r\n readonly detail: string;\r\n}\r\ninterface UnsupportedPdfEncryptionErrorConstructor {\r\n new (detail: string): UnsupportedPdfEncryptionError;\r\n readonly prototype: UnsupportedPdfEncryptionError;\r\n}\r\nexport const UnsupportedPdfEncryptionError: UnsupportedPdfEncryptionErrorConstructor =\r\n CoreUnsupportedPdfEncryptionError;\r\n\r\n/**\r\n * Decrypt an encrypted PDF that opens with an empty user password.\r\n * Returns re-saved, fully decrypted bytes with `/Encrypt` removed.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport const decryptPdf: (pdfBytes: Uint8Array) => Promise<Uint8Array> = coreDecryptPdf;\r\n\r\n/** The portable \"does this PDF need a password?\" check — an `err.code` test. */\r\nexport const isPdfPasswordRequiredError: (error: unknown) => boolean =\r\n coreIsPdfPasswordRequiredError;\r\n\r\n/**\r\n * This package has no logger module; it reports through `console` and silences\r\n * itself in production, which is what the copied implementation did inline.\r\n */\r\nconst consoleLogger: PdfCryptoLogger = {\r\n info(message: string, ...args: unknown[]): void {\r\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\r\n // Keeps this package's original `[PageAssembler]` marker greppable\r\n // alongside the shared `[PDF_DECRYPT]` one the message now carries.\r\n console.info(`[PageAssembler] ${message}`, ...args);\r\n }\r\n },\r\n};\r\n\r\n/**\r\n * Ingestion gate — see `@signiphi/pdf-crypto`'s `normalizePdfEncryption`.\r\n * Returns the bytes untouched (same reference) for ordinary PDFs; decrypts and\r\n * re-saves encrypted ones so every downstream `PDFDocument.load` (page\r\n * assembly, field extraction) sees a normal document.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport function normalizePdfEncryption(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n return coreNormalizePdfEncryption(pdfBytes, { logger: consoleLogger });\r\n}\r\n","import * as pdfjsLib from 'pdfjs-dist';\r\nimport { PDFDocument } from 'pdf-lib';\r\nimport type { PageImage } from '../types';\r\nimport { normalizePdfEncryption, PdfPasswordRequiredError } from './pdf-decrypt';\r\n\r\n// Set up PDF.js worker - use the self-hosted PDF.js worker\r\nif (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n}\r\n\r\n/**\r\n * Converts a PDF document to an array of rendered page images\r\n *\r\n * @param pdfBytes - The PDF document as a Uint8Array\r\n * @param options - Optional configuration\r\n * @param options.hideFormFields - If true, hides existing form fields during rendering\r\n * @returns Promise resolving to array of PageImage objects with rendered images\r\n * @throws {Error} If PDF is invalid or rendering fails\r\n *\r\n * @example\r\n * ```ts\r\n * const pages = await pdfToImages(pdfBytes, { hideFormFields: true });\r\n * console.log(`Rendered ${pages.length} pages`);\r\n * ```\r\n */\r\nexport async function pdfToImages(\r\n pdfBytes: Uint8Array,\r\n options?: { hideFormFields?: boolean }\r\n): Promise<PageImage[]> {\r\n try {\r\n // Check if it starts with PDF header\r\n const header = new TextDecoder().decode(pdfBytes.slice(0, 10));\r\n\r\n if (!header.startsWith('%PDF-')) {\r\n console.error('Invalid PDF: Does not start with %PDF- header');\r\n throw new Error('Invalid PDF format: Missing PDF header');\r\n }\r\n\r\n // Set up PDF.js worker\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n }\r\n\r\n // Load PDF with PDF.js\r\n const loadingTask = pdfjsLib.getDocument({\r\n data: pdfBytes,\r\n verbosity: 0,\r\n });\r\n const pdfDoc = await loadingTask.promise;\r\n\r\n const pages: PageImage[] = [];\r\n\r\n // Try to load with pdf-lib for dimension comparison (optional)\r\n let pdfLibDoc = null;\r\n try {\r\n pdfLibDoc = await PDFDocument.load(pdfBytes);\r\n } catch {\r\n // PDF.js dimensions will be used instead\r\n }\r\n\r\n for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) {\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 2.0 });\r\n\r\n // Get actual PDF dimensions (for coordinate conversion)\r\n let pdfWidth = viewport.width / 2.0;\r\n let pdfHeight = viewport.height / 2.0;\r\n\r\n // Use pdf-lib dimensions if available for consistency\r\n if (pdfLibDoc) {\r\n try {\r\n const pdfLibPage = pdfLibDoc.getPage(pageNum - 1);\r\n const pdfLibWidth = pdfLibPage.getWidth();\r\n const pdfLibHeight = pdfLibPage.getHeight();\r\n\r\n // Use pdf-lib dimensions for consistency\r\n pdfWidth = pdfLibWidth;\r\n pdfHeight = pdfLibHeight;\r\n } catch {\r\n // Use PDF.js dimensions as fallback\r\n }\r\n }\r\n\r\n // Create canvas at the scaled size for high quality rendering\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n\r\n // Render PDF page to canvas\r\n const hideFormFields = options?.hideFormFields ?? false;\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport: viewport,\r\n // Hide annotations/form fields when specified\r\n renderInteractiveForms: !hideFormFields,\r\n // Additional options to ensure form fields are hidden\r\n ...(hideFormFields && {\r\n annotationMode: 0, // Disable annotations\r\n renderAnnotations: false,\r\n renderForms: false,\r\n }),\r\n };\r\n\r\n await page.render(renderContext).promise;\r\n\r\n // Convert canvas to data URL\r\n const imageUrl = canvas.toDataURL('image/png');\r\n\r\n pages.push({\r\n imageUrl,\r\n width: pdfWidth,\r\n height: pdfHeight,\r\n });\r\n }\r\n\r\n return pages;\r\n } catch (error) {\r\n console.error('Error converting PDF to images with PDF.js:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Last-resort rebuild for encrypted PDFs whose structure pdf-lib cannot\r\n * parse even with `ignoreEncryption`: render every page with PDF.js (which\r\n * has full decryption support) and re-emit them as an image-based PDF.\r\n *\r\n * @param pdfBytes - The source PDF as a Uint8Array\r\n * @returns Promise resolving to rebuilt (unencrypted, image-based) PDF bytes\r\n */\r\n/**\r\n * Rasterization ceilings. The fallback runs on untrusted uploads, and a tiny\r\n * PDF can legally declare hundreds of thousands of pages or a page far larger\r\n * than any canvas — either would OOM the tab without these caps.\r\n */\r\nexport const MAX_RASTER_PAGE_COUNT = 500;\r\nexport const MAX_RASTER_CANVAS_PIXELS = 4096 * 4096;\r\nconst PREFERRED_RASTER_SCALE = 2.0;\r\n\r\n/**\r\n * Render scale for a page of the given size (PDF points): the preferred\r\n * scale, reduced as needed so the canvas stays within the pixel budget.\r\n */\r\nexport function computeRasterScale(width: number, height: number): number {\r\n const area = width * height;\r\n if (!Number.isFinite(area) || area <= 0) return PREFERRED_RASTER_SCALE;\r\n const preferredPixels = area * PREFERRED_RASTER_SCALE * PREFERRED_RASTER_SCALE;\r\n if (preferredPixels <= MAX_RASTER_CANVAS_PIXELS) return PREFERRED_RASTER_SCALE;\r\n return Math.sqrt(MAX_RASTER_CANVAS_PIXELS / area);\r\n}\r\n\r\nexport async function rasterizePdfToPdf(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n }\r\n let sourceDoc;\r\n try {\r\n sourceDoc = await pdfjsLib.getDocument({ data: pdfBytes.slice(0), verbosity: 0 }).promise;\r\n } catch (error) {\r\n if ((error as { name?: string })?.name === 'PasswordException') {\r\n throw new PdfPasswordRequiredError();\r\n }\r\n throw error;\r\n }\r\n try {\r\n if (sourceDoc.numPages > MAX_RASTER_PAGE_COUNT) {\r\n throw new Error(\r\n `Cannot rebuild PDF: ${sourceDoc.numPages} pages exceeds the ${MAX_RASTER_PAGE_COUNT}-page limit`,\r\n );\r\n }\r\n const outDoc = await PDFDocument.create();\r\n for (let pageNum = 1; pageNum <= sourceDoc.numPages; pageNum++) {\r\n const page = await sourceDoc.getPage(pageNum);\r\n const base = page.getViewport({ scale: 1.0 });\r\n const scale = computeRasterScale(base.width, base.height);\r\n const viewport = page.getViewport({ scale });\r\n const canvas = document.createElement('canvas');\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n const context = canvas.getContext('2d')!;\r\n await page.render({ canvasContext: context, viewport }).promise;\r\n const png = await outDoc.embedPng(canvas.toDataURL('image/png'));\r\n const outPage = outDoc.addPage([base.width, base.height]);\r\n outPage.drawImage(png, { x: 0, y: 0, width: base.width, height: base.height });\r\n }\r\n return new Uint8Array(await outDoc.save({ useObjectStreams: false }));\r\n } finally {\r\n await sourceDoc.destroy();\r\n }\r\n}\r\n\r\n/**\r\n * Prepares uploaded PDF bytes for the pdf-lib based assembly pipeline.\r\n * Regular PDFs pass through untouched. Encrypted PDFs (typically\r\n * permission-restricted documents that open without a password) are\r\n * decrypted once here so every downstream `PDFDocument.load` — assembly,\r\n * field extraction — sees a normal document. When structural decryption is\r\n * impossible the document is rebuilt from rendered pages as a last resort.\r\n *\r\n * @throws {PdfPasswordRequiredError} when the PDF needs a real password\r\n */\r\nexport async function normalizeUploadedPdfBytes(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n try {\r\n const normalized = await normalizePdfEncryption(pdfBytes);\r\n return normalized === pdfBytes ? pdfBytes : new Uint8Array(normalized);\r\n } catch (error) {\r\n if (error instanceof PdfPasswordRequiredError) throw error;\r\n console.warn(\r\n '[PageAssembler] Structural decryption failed; rebuilding document from rendered pages:',\r\n error,\r\n );\r\n return rasterizePdfToPdf(pdfBytes);\r\n }\r\n}\r\n\r\n/**\r\n * Converts an image file to a PDF document with a single page\r\n *\r\n * @param imageFile - The image file to convert (supports common image formats)\r\n * @returns Promise resolving to PDF bytes as Uint8Array\r\n * @throws {Error} If image fails to load or convert\r\n *\r\n * @example\r\n * ```ts\r\n * const pdfBytes = await imageToPdf(imageFile);\r\n * ```\r\n */\r\nexport async function imageToPdf(imageFile: File): Promise<Uint8Array> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d')!;\r\n\r\n img.onload = async () => {\r\n try {\r\n // Set canvas size to image size\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n // Draw image on canvas\r\n ctx.drawImage(img, 0, 0);\r\n\r\n // Convert canvas to PNG image data (canvas.toBlob defaults to PNG)\r\n canvas.toBlob(\r\n async (blob) => {\r\n if (!blob) {\r\n reject(new Error('Failed to convert image to blob'));\r\n return;\r\n }\r\n\r\n const imageBytes = new Uint8Array(await blob.arrayBuffer());\r\n\r\n // Create PDF with the image\r\n const pdfDoc = await PDFDocument.create();\r\n\r\n // Always embed as PNG since canvas.toBlob() produces PNG data\r\n const embeddedImage = await pdfDoc.embedPng(imageBytes);\r\n\r\n // Calculate dimensions to fit page while maintaining aspect ratio\r\n const { width, height } = embeddedImage.scale(1);\r\n const maxWidth = 595; // A4 width in points\r\n const maxHeight = 842; // A4 height in points\r\n\r\n let pageWidth = width;\r\n let pageHeight = height;\r\n\r\n // Scale down if image is larger than A4\r\n if (width > maxWidth || height > maxHeight) {\r\n const scale = Math.min(maxWidth / width, maxHeight / height);\r\n pageWidth = width * scale;\r\n pageHeight = height * scale;\r\n }\r\n\r\n // Create page with calculated dimensions\r\n const page = pdfDoc.addPage([\r\n Math.max(pageWidth, 100),\r\n Math.max(pageHeight, 100),\r\n ]);\r\n\r\n // Draw image centered on page\r\n const x = (page.getWidth() - pageWidth) / 2;\r\n const y = (page.getHeight() - pageHeight) / 2;\r\n\r\n page.drawImage(embeddedImage, {\r\n x: Math.max(x, 0),\r\n y: Math.max(y, 0),\r\n width: pageWidth,\r\n height: pageHeight,\r\n });\r\n\r\n const pdfBytes = await pdfDoc.save();\r\n resolve(pdfBytes);\r\n },\r\n 'image/png',\r\n 0.95\r\n ); // Explicitly specify PNG format with high quality\r\n } catch (error) {\r\n reject(error);\r\n }\r\n };\r\n\r\n img.onerror = () => {\r\n reject(new Error('Failed to load image'));\r\n };\r\n\r\n // Create object URL from file and set as image source\r\n const objectUrl = URL.createObjectURL(imageFile);\r\n img.src = objectUrl;\r\n });\r\n}\r\n\r\n/**\r\n * Create a blob URL from PDF bytes for preview\r\n *\r\n * @param pdfBytes - The PDF document as Uint8Array\r\n * @returns Blob URL string\r\n *\r\n * @example\r\n * ```ts\r\n * const url = createPdfBlobUrl(pdfBytes);\r\n * // Remember to revoke: URL.revokeObjectURL(url);\r\n * ```\r\n */\r\nexport function createPdfBlobUrl(pdfBytes: Uint8Array): string {\r\n const blob = new Blob([pdfBytes as unknown as BlobPart], {\r\n type: 'application/pdf',\r\n });\r\n return URL.createObjectURL(blob);\r\n}\r\n\r\n/**\r\n * Triggers a browser download of a PDF file\r\n *\r\n * @param pdfBytes - The PDF document as Uint8Array\r\n * @param filename - The filename for the downloaded file (e.g., 'document.pdf')\r\n *\r\n * @example\r\n * ```ts\r\n * downloadPdf(pdfBytes, 'assembled-document.pdf');\r\n * ```\r\n */\r\nexport function downloadPdf(pdfBytes: Uint8Array, filename: string): void {\r\n const blob = new Blob([pdfBytes as unknown as BlobPart], {\r\n type: 'application/pdf',\r\n });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n","/**\r\n * PDF Field Extraction Utilities\r\n * Extract form fields from PDFs with metadata support for preserving field properties\r\n */\r\n\r\nimport { PDFDocument, PDFName, PDFString, PDFTextField, PDFCheckBox, PDFDropdown, PDFRadioGroup } from 'pdf-lib';\r\n\r\n/**\r\n * Extracted field information\r\n */\r\nexport interface ExtractedField {\r\n name: string;\r\n type: 'text' | 'signature' | 'initials' | 'date' | 'checkbox' | 'radio' | 'dropdown' | 'text_label';\r\n page: number;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n required: boolean;\r\n label?: string;\r\n placeholder?: string;\r\n options?: string[];\r\n fieldId?: string;\r\n signer?: string;\r\n}\r\n\r\n/**\r\n * SigniphiMetadata structure stored in PDF Info dictionary\r\n */\r\ninterface SigniphiMetadata {\r\n version: string;\r\n fields: Record<string, {\r\n fieldId?: string;\r\n label?: string;\r\n signer?: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n options?: string[];\r\n acknowledgements?: Array<{ id: string; title: string; description: string }>;\r\n }>;\r\n fieldIdIndex?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Extract SigniphiMetadata from a PDF document\r\n */\r\nexport function getSigniphiMetadata(pdfDoc: PDFDocument): SigniphiMetadata | null {\r\n try {\r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n if (!infoRef) {\r\n return null;\r\n }\r\n\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n if (!infoObj || typeof (infoObj as any).get !== 'function') {\r\n return null;\r\n }\r\n\r\n const infoDict = infoObj as any;\r\n const metadataObj = infoDict.get(PDFName.of('SigniphiMetadata'));\r\n\r\n if (!metadataObj) {\r\n return null;\r\n }\r\n\r\n // PDFString objects are encoded as \"(content)\" in their toString() representation\r\n const metadataStr = metadataObj.toString();\r\n\r\n // Extract content from PDF string format: (content)\r\n let jsonStr = metadataStr;\r\n if (metadataStr.startsWith('(') && metadataStr.endsWith(')')) {\r\n jsonStr = metadataStr.slice(1, -1);\r\n } else if (metadataStr.startsWith('<') && metadataStr.endsWith('>')) {\r\n jsonStr = metadataStr.slice(1, -1);\r\n }\r\n\r\n const metadata = JSON.parse(jsonStr);\r\n return metadata;\r\n } catch (error) {\r\n console.error('Failed to load Signiphi metadata:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Parse an encoded field name to extract base name (without __LABEL__, __SIGNER__, __PLACEHOLDER__)\r\n */\r\nfunction getBaseFieldName(encodedName: string): string {\r\n let baseName = encodedName;\r\n\r\n // Remove __SIGNER__ and everything after\r\n if (baseName.includes('__SIGNER__')) {\r\n baseName = baseName.split('__SIGNER__')[0];\r\n }\r\n\r\n // Remove __LABEL__ and everything after\r\n if (baseName.includes('__LABEL__')) {\r\n baseName = baseName.split('__LABEL__')[0];\r\n }\r\n\r\n // Remove __PLACEHOLDER__ and everything after\r\n if (baseName.includes('__PLACEHOLDER__')) {\r\n baseName = baseName.split('__PLACEHOLDER__')[0];\r\n }\r\n\r\n return baseName;\r\n}\r\n\r\n/**\r\n * Strip the field-type suffix that document-prepare's `ensureFieldSuffix` appends\r\n * to the WHOLE encoded name at bake time, which lands it after the trailing\r\n * segment: `fld__SIGNER__buyer@x.com` bakes to\r\n * `fld__SIGNER__buyer@x.com_signature`.\r\n *\r\n * Note this package's own producer (`add-form-fields.ts`) gets the order right —\r\n * it suffixes the base name before encoding — so only PDFs that came through\r\n * document-prepare are affected. Those do reach here: a previously baked PDF\r\n * re-uploaded into the assembler is a normal flow.\r\n *\r\n * Single strip, anchored, case-insensitive — deliberately narrower than\r\n * `ensureFieldSuffix`, which cascades three strips. Safe for every signer value in\r\n * this system: emails end in a TLD and role tokens are hyphenated\r\n * (`to-recipients`, `additional-signer-1`), so none can legitimately end in a type\r\n * suffix. Falls back to the original when stripping would empty the value, so a\r\n * malformed name never decays into a falsy \"unassigned\" signer.\r\n */\r\nfunction stripFieldTypeSuffix(value: string): string {\r\n const stripped = value.replace(/_(signature|initials|date)$/i, '');\r\n return stripped || value;\r\n}\r\n\r\n/**\r\n * Extract signer email from encoded field name\r\n *\r\n * @internal Exported for unit testing only — deliberately not re-exported from\r\n * the package's `index.ts`, so this is not part of the public API.\r\n */\r\nexport function getSignerFromFieldName(encodedName: string): string | undefined {\r\n if (encodedName.includes('__SIGNER__')) {\r\n const parts = encodedName.split('__SIGNER__');\r\n if (parts[1]) {\r\n const segment = parts[1].split('__')[0] || parts[1];\r\n // Only the LAST segment can carry the baked type suffix. When another marker\r\n // follows, the suffix landed there instead and the signer is already clean —\r\n // stripping anyway would corrupt a signer value that legitimately ends in a\r\n // type word, and would make this package disagree with pdf-signer about who\r\n // a field belongs to.\r\n const isTerminal = segment === parts[1];\r\n return isTerminal ? stripFieldTypeSuffix(segment) : segment;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Determine field type from field name or widget type\r\n * Uses base name (without __SIGNER__, __LABEL__ encoding) to prevent false matches\r\n */\r\nfunction determineFieldType(fieldName: string, widgetType?: string): ExtractedField['type'] {\r\n // IMPORTANT: Use base name to prevent \"__SIGNER__\" from matching \"sign\" patterns\r\n const baseName = getBaseFieldName(fieldName);\r\n const nameLower = baseName.toLowerCase();\r\n\r\n // Check for specific suffixes/patterns\r\n if (nameLower.includes('_signature') || nameLower.includes('signature')) {\r\n return 'signature';\r\n }\r\n if (nameLower.includes('_initials') || nameLower.includes('initials')) {\r\n return 'initials';\r\n }\r\n if (nameLower.includes('_date') || nameLower.includes('date')) {\r\n return 'date';\r\n }\r\n if (widgetType === 'checkbox' || nameLower.includes('checkbox')) {\r\n return 'checkbox';\r\n }\r\n if (widgetType === 'radio' || nameLower.includes('radio')) {\r\n return 'radio';\r\n }\r\n if (widgetType === 'dropdown' || widgetType === 'select' || nameLower.includes('dropdown')) {\r\n return 'dropdown';\r\n }\r\n\r\n return 'text';\r\n}\r\n\r\n/**\r\n * Extract form fields from a PDF document\r\n * @param pdfBytes - PDF bytes\r\n * @returns Array of extracted fields with all properties\r\n */\r\nexport async function extractFieldsFromPdf(pdfBytes: Uint8Array): Promise<ExtractedField[]> {\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const fields: ExtractedField[] = [];\r\n\r\n // Get SigniphiMetadata for field properties\r\n const metadata = getSigniphiMetadata(pdfDoc);\r\n\r\n // Get form and fields from pdf-lib\r\n const form = pdfDoc.getForm();\r\n const pdfFields = form.getFields();\r\n\r\n for (const field of pdfFields) {\r\n const fieldName = field.getName();\r\n const widgets = field.acroField.getWidgets();\r\n\r\n // Parse encoded field name to extract base name and signer\r\n const baseName = getBaseFieldName(fieldName);\r\n const signerFromName = getSignerFromFieldName(fieldName);\r\n\r\n // Get field-specific properties\r\n let required = false;\r\n let options: string[] | undefined;\r\n let widgetType: string | undefined;\r\n\r\n // Determine required flag and options based on field type\r\n if (field instanceof PDFTextField) {\r\n required = field.isRequired();\r\n console.log(`[field-extraction] PDFTextField \"${fieldName}\" isRequired=${required}`);\r\n } else if (field instanceof PDFCheckBox) {\r\n widgetType = 'checkbox';\r\n required = field.isRequired();\r\n console.log(`[field-extraction] PDFCheckBox \"${fieldName}\" isRequired=${required}`);\r\n } else if (field instanceof PDFDropdown) {\r\n widgetType = 'dropdown';\r\n required = field.isRequired();\r\n options = field.getOptions();\r\n console.log(`[field-extraction] PDFDropdown \"${fieldName}\" isRequired=${required}`);\r\n } else if (field instanceof PDFRadioGroup) {\r\n widgetType = 'radio';\r\n required = field.isRequired();\r\n options = field.getOptions();\r\n console.log(`[field-extraction] PDFRadioGroup \"${fieldName}\" isRequired=${required}`);\r\n } else {\r\n console.log(`[field-extraction] Unknown field type \"${fieldName}\" - defaulting required=false`);\r\n }\r\n\r\n // Process each widget (field can appear on multiple pages)\r\n for (const widget of widgets) {\r\n const rect = widget.getRectangle();\r\n const pageRef = widget.P();\r\n\r\n // Find page number\r\n let pageNumber = 1;\r\n if (pageRef) {\r\n const pages = pdfDoc.getPages();\r\n for (let i = 0; i < pages.length; i++) {\r\n if (pages[i].ref === pageRef) {\r\n pageNumber = i + 1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Get metadata for this field - try page-qualified key first (for combined PDFs),\r\n // then full name, then base name\r\n const pageQualifiedKey = `${baseName}_p${pageNumber}`;\r\n let fieldMetadata = metadata?.fields?.[pageQualifiedKey];\r\n if (!fieldMetadata) {\r\n fieldMetadata = metadata?.fields?.[fieldName];\r\n }\r\n if (!fieldMetadata && baseName !== fieldName) {\r\n fieldMetadata = metadata?.fields?.[baseName];\r\n }\r\n\r\n // Determine required and options, with metadata overrides\r\n let fieldRequired = required;\r\n let fieldOptions = options;\r\n if (fieldMetadata?.required !== undefined) {\r\n fieldRequired = fieldMetadata.required;\r\n }\r\n if (fieldMetadata?.options?.length) {\r\n fieldOptions = fieldMetadata.options;\r\n }\r\n\r\n const page = pdfDoc.getPage(pageNumber - 1);\r\n const pageHeight = page.getHeight();\r\n\r\n const extractedField: ExtractedField = {\r\n name: baseName, // Use clean base name without __SIGNER__ encoding (signer stored in signer property)\r\n type: determineFieldType(fieldName, widgetType), // Uses base name internally\r\n page: pageNumber,\r\n x: rect.x,\r\n y: pageHeight - rect.y - rect.height, // Convert from PDF coords (bottom-left) to top-left\r\n width: rect.width,\r\n height: rect.height,\r\n required: fieldRequired,\r\n options: fieldOptions,\r\n signer: signerFromName, // Extract signer from encoded name\r\n };\r\n\r\n // Apply metadata properties\r\n if (fieldMetadata) {\r\n if (fieldMetadata.fieldId) {\r\n extractedField.fieldId = fieldMetadata.fieldId;\r\n }\r\n if (fieldMetadata.label) {\r\n extractedField.label = fieldMetadata.label;\r\n }\r\n // Prefer signer from name encoding over metadata\r\n if (!extractedField.signer && fieldMetadata.signer) {\r\n extractedField.signer = fieldMetadata.signer;\r\n }\r\n if (fieldMetadata.placeholder) {\r\n extractedField.placeholder = fieldMetadata.placeholder;\r\n }\r\n }\r\n\r\n fields.push(extractedField);\r\n }\r\n }\r\n\r\n // Deduplicate fields by BASE name AND page\r\n // This consolidates signer-encoded variants (e.g., checkbox_123__SIGNER__aa@bb.cc)\r\n // into a single field with the signer assignment preserved\r\n // This matches dm-web's behavior where multi-signer PDFs show clean, deduplicated fields\r\n const deduplicatedFields = fields.reduce((acc, field) => {\r\n const newBaseName = getBaseFieldName(field.name);\r\n const existingIndex = acc.findIndex(f => {\r\n const existingBaseName = getBaseFieldName(f.name);\r\n return existingBaseName === newBaseName && f.page === field.page;\r\n });\r\n\r\n if (existingIndex === -1) {\r\n // No existing field with this base name on this page - add it\r\n acc.push(field);\r\n } else {\r\n // Found existing field with same base name - MERGE properties from both\r\n // This ensures we don't lose metadata when consolidating signer variants\r\n const existing = acc[existingIndex];\r\n acc[existingIndex] = {\r\n ...existing,\r\n // Prefer non-empty values from either field\r\n label: existing.label || field.label,\r\n placeholder: existing.placeholder || field.placeholder,\r\n required: existing.required || field.required,\r\n options: existing.options?.length ? existing.options : field.options,\r\n fieldId: existing.fieldId || field.fieldId,\r\n // Prefer signer from the field that has it\r\n signer: existing.signer || field.signer,\r\n };\r\n }\r\n return acc;\r\n }, [] as ExtractedField[]);\r\n\r\n return deduplicatedFields;\r\n}\r\n\r\n/**\r\n * Set SigniphiMetadata in a PDF document\r\n */\r\nexport function setSigniphiMetadata(pdfDoc: PDFDocument, metadata: SigniphiMetadata): void {\r\n try {\r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n if (!infoObj || typeof (infoObj as any).set !== 'function') {\r\n throw new Error('Info object is not a PDFDict or does not have set method');\r\n }\r\n const infoDict = infoObj as any;\r\n const metadataString = JSON.stringify(metadata);\r\n\r\n infoDict.set(PDFName.of('SigniphiMetadata'), PDFString.of(metadataString));\r\n } catch (error) {\r\n console.error('Failed to set Signiphi metadata:', error);\r\n throw error;\r\n }\r\n}\r\n","/**\r\n * Add Form Fields to PDF\r\n * Re-adds form fields to a PDF after page assembly operations\r\n * This is the key to preserving form fields - don't try to preserve during copyPages,\r\n * instead extract fields first, copy pages, then re-add fields with adjusted positions.\r\n */\r\n\r\nimport { PDFDocument, PDFName, PDFString, rgb, StandardFonts } from 'pdf-lib';\r\n\r\n/**\r\n * Form field type enum matching document-prepare\r\n */\r\nexport enum FormFieldType {\r\n TEXT = 'text',\r\n SIGNATURE = 'signature',\r\n INITIALS = 'initials',\r\n DATE = 'date',\r\n CHECKBOX = 'checkbox',\r\n RADIO = 'radio',\r\n DROPDOWN = 'dropdown',\r\n TEXT_LABEL = 'text_label',\r\n}\r\n\r\n/**\r\n * Form field position\r\n */\r\nexport interface FormFieldPosition {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n page: number; // 1-indexed\r\n}\r\n\r\n/**\r\n * Form field for adding to PDF\r\n */\r\nexport interface FormFieldForPdf {\r\n name: string;\r\n type: FormFieldType | string;\r\n position: FormFieldPosition;\r\n label?: string;\r\n required?: boolean;\r\n options?: string[];\r\n defaultValue?: string;\r\n placeholder?: string;\r\n fontSize?: number;\r\n multiline?: boolean;\r\n maxLength?: number;\r\n assignedSignerEmail?: string;\r\n}\r\n\r\n/**\r\n * Parse an encoded field name to extract base name, label, and signer\r\n * Handles names like: \"checkbox_123__LABEL__My Label__SIGNER__aa@bb.cc\"\r\n * @public - exported for use in field extraction\r\n */\r\nexport function parseEncodedFieldName(encodedName: string): {\r\n baseName: string;\r\n label?: string;\r\n signer?: string;\r\n} {\r\n let baseName = encodedName;\r\n let label: string | undefined;\r\n let signer: string | undefined;\r\n\r\n // Extract signer if present\r\n if (baseName.includes('__SIGNER__')) {\r\n const parts = baseName.split('__SIGNER__');\r\n baseName = parts[0];\r\n signer = parts[1];\r\n }\r\n\r\n // Extract label if present\r\n if (baseName.includes('__LABEL__')) {\r\n const parts = baseName.split('__LABEL__');\r\n baseName = parts[0];\r\n label = parts[1];\r\n }\r\n\r\n // Extract placeholder if present (just remove it from base name)\r\n if (baseName.includes('__PLACEHOLDER__')) {\r\n const parts = baseName.split('__PLACEHOLDER__');\r\n baseName = parts[0];\r\n }\r\n\r\n return { baseName, label, signer };\r\n}\r\n\r\n/**\r\n * Encode field name with signer info (for multi-signer documents)\r\n * Prevents double-encoding by parsing the name first\r\n */\r\nfunction encodeFieldNameWithSigner(fieldName: string, signerEmail?: string): string {\r\n // Parse the name to check if it's already encoded\r\n const { baseName, signer: existingSigner } = parseEncodedFieldName(fieldName);\r\n\r\n // Use existing signer if present, otherwise use provided signerEmail\r\n const finalSigner = existingSigner || signerEmail;\r\n\r\n if (!finalSigner) return baseName;\r\n return `${baseName}__SIGNER__${finalSigner}`;\r\n}\r\n\r\n/**\r\n * Encode field name with label and signer\r\n * Prevents double-encoding by parsing the name first\r\n */\r\nfunction encodeFieldNameWithLabelAndSigner(fieldName: string, label?: string, signerEmail?: string): string {\r\n // Parse the name to check if it's already encoded\r\n const { baseName, label: existingLabel, signer: existingSigner } = parseEncodedFieldName(fieldName);\r\n\r\n // Use existing values if present, otherwise use provided values\r\n const finalLabel = existingLabel || label;\r\n const finalSigner = existingSigner || signerEmail;\r\n\r\n let name = baseName;\r\n if (finalLabel && finalLabel.trim()) {\r\n name = `${name}__LABEL__${finalLabel.trim()}`;\r\n }\r\n if (finalSigner) {\r\n name = `${name}__SIGNER__${finalSigner}`;\r\n }\r\n return name;\r\n}\r\n\r\n/**\r\n * Add form fields to a PDF document\r\n *\r\n * @param pdfBytes - The PDF document bytes\r\n * @param formFields - Array of form fields to add\r\n * @param options - Options for field addition\r\n * @returns Modified PDF bytes with form fields added\r\n */\r\nexport async function addFormFieldsToPdf(\r\n pdfBytes: Uint8Array,\r\n formFields: FormFieldForPdf[],\r\n options: {\r\n removeExistingFields?: boolean;\r\n drawLabels?: boolean;\r\n } = {}\r\n): Promise<Uint8Array> {\r\n const { removeExistingFields = false, drawLabels = false } = options;\r\n\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const pages = pdfDoc.getPages();\r\n\r\n // Remove existing fields if requested\r\n if (removeExistingFields) {\r\n const existingFields = form.getFields();\r\n for (const field of existingFields) {\r\n try {\r\n // Robust widget cleanup\r\n const acroField = (field as any).acroField;\r\n if (acroField && typeof acroField.getWidgets === 'function') {\r\n let widgets = acroField.getWidgets();\r\n let safetyCounter = 0;\r\n const maxIterations = widgets.length + 5;\r\n\r\n while (widgets.length > 0 && safetyCounter < maxIterations) {\r\n try {\r\n acroField.removeWidget(widgets.length - 1);\r\n widgets = acroField.getWidgets();\r\n } catch {\r\n break;\r\n }\r\n safetyCounter++;\r\n }\r\n }\r\n form.removeField(field);\r\n } catch (error) {\r\n console.warn(`Failed to remove field ${field.getName()}:`, error);\r\n try {\r\n form.removeField(field);\r\n } catch {\r\n // Ignore fallback failure\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Embed font for labels\r\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\r\n\r\n // Detect which field names appear on multiple pages (need unique suffixes)\r\n const fieldNamePages = new Map<string, Set<number>>();\r\n for (const field of formFields) {\r\n const baseName = field.name;\r\n if (!fieldNamePages.has(baseName)) {\r\n fieldNamePages.set(baseName, new Set());\r\n }\r\n fieldNamePages.get(baseName)!.add(field.position.page);\r\n }\r\n // Field names that need _p{page} suffix (appear on multiple pages)\r\n const conflictingNames = new Set<string>();\r\n for (const [name, pages] of fieldNamePages) {\r\n if (pages.size > 1) {\r\n conflictingNames.add(name);\r\n }\r\n }\r\n\r\n // Add each field\r\n for (const field of formFields) {\r\n const pageIndex = field.position.page - 1;\r\n\r\n if (pageIndex < 0 || pageIndex >= pages.length) {\r\n console.warn(`Field ${field.name} references page ${field.position.page} but PDF only has ${pages.length} pages`);\r\n continue;\r\n }\r\n\r\n const page = pages[pageIndex];\r\n const { height: pageHeight } = page.getSize();\r\n\r\n // Convert coordinates from top-left (UI) to bottom-left (PDF)\r\n const pdfX = field.position.x;\r\n const pdfY = pageHeight - field.position.y - field.position.height;\r\n\r\n // Only add _p{page} suffix when field name appears on multiple pages\r\n // This preserves per-page properties (required, etc.) for conflicting names\r\n const uniqueFieldName = conflictingNames.has(field.name)\r\n ? `${field.name}_p${field.position.page}`\r\n : field.name;\r\n\r\n try {\r\n const fieldType = typeof field.type === 'string' ? field.type : field.type;\r\n\r\n switch (fieldType) {\r\n case FormFieldType.TEXT: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const textField = form.createTextField(encodedName);\r\n textField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n // Store label in TU metadata\r\n if (field.label && field.label.trim()) {\r\n textField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n\r\n if (drawLabels) {\r\n const fontSize = Math.min(10, field.position.height * 0.4);\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, { x: pdfX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n\r\n if (field.defaultValue && field.defaultValue.trim()) {\r\n textField.setText(field.defaultValue);\r\n }\r\n\r\n if (field.fontSize && field.fontSize >= 8 && field.fontSize <= 72) {\r\n try { textField.setFontSize(field.fontSize); } catch { /* ignore */ }\r\n }\r\n\r\n if (field.multiline) {\r\n try { textField.enableMultiline(); } catch { /* ignore */ }\r\n }\r\n\r\n if (field.maxLength && field.maxLength > 0) {\r\n try { textField.setMaxLength(field.maxLength); } catch { /* ignore */ }\r\n }\r\n\r\n if (field.required) {\r\n textField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.CHECKBOX: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const checkBox = form.createCheckBox(encodedName);\r\n checkBox.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.defaultValue === 'true' || field.defaultValue === 'checked') {\r\n checkBox.check();\r\n }\r\n\r\n if (field.required) {\r\n checkBox.enableRequired();\r\n }\r\n\r\n if (field.label && field.label.trim()) {\r\n try { checkBox.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label)); } catch { /* ignore */ }\r\n\r\n if (drawLabels) {\r\n const fontSize = Math.min(12, field.position.height * 0.6);\r\n const labelX = pdfX + field.position.width + 5;\r\n const labelY = pdfY + (field.position.height - fontSize) / 2;\r\n page.drawText(field.label, { x: labelX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.SIGNATURE: {\r\n const baseWithSuffix = field.name.endsWith('_signature') ? field.name : `${field.name}_signature`;\r\n const finalName = conflictingNames.has(field.name) ? `${baseWithSuffix}_p${field.position.page}` : baseWithSuffix;\r\n const encodedName = encodeFieldNameWithLabelAndSigner(finalName, field.label, field.assignedSignerEmail);\r\n const sigField = form.createTextField(encodedName);\r\n sigField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0, 0, 1),\r\n backgroundColor: rgb(0.9, 0.9, 1),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n sigField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n }\r\n\r\n sigField.enableReadOnly();\r\n\r\n if (field.required) {\r\n sigField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.INITIALS: {\r\n const baseWithSuffix = field.name.endsWith('_initials') ? field.name : `${field.name}_initials`;\r\n const finalName = conflictingNames.has(field.name) ? `${baseWithSuffix}_p${field.position.page}` : baseWithSuffix;\r\n const encodedName = encodeFieldNameWithLabelAndSigner(finalName, field.label, field.assignedSignerEmail);\r\n const initField = form.createTextField(encodedName);\r\n initField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0, 0.5),\r\n backgroundColor: rgb(1, 0.95, 1),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n initField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n }\r\n\r\n initField.enableReadOnly();\r\n\r\n if (field.required) {\r\n initField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.DATE: {\r\n const baseWithSuffix = field.name.endsWith('_date') ? field.name : `${field.name}_date`;\r\n const finalName = conflictingNames.has(field.name) ? `${baseWithSuffix}_p${field.position.page}` : baseWithSuffix;\r\n const encodedName = encodeFieldNameWithLabelAndSigner(finalName, field.label, field.assignedSignerEmail);\r\n const dateField = form.createTextField(encodedName);\r\n dateField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0, 0.5, 0),\r\n backgroundColor: rgb(0.95, 1, 0.95),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n dateField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n }\r\n\r\n if (field.required) {\r\n dateField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.DROPDOWN: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const dropdown = form.createDropdown(encodedName);\r\n dropdown.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.options && field.options.length > 0) {\r\n dropdown.addOptions(field.options);\r\n if (field.defaultValue && field.options.includes(field.defaultValue)) {\r\n dropdown.select(field.defaultValue);\r\n }\r\n }\r\n\r\n if (field.label && field.label.trim()) {\r\n try { dropdown.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label)); } catch { /* ignore */ }\r\n\r\n if (drawLabels) {\r\n const fontSize = Math.min(10, field.position.height * 0.4);\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, { x: pdfX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n\r\n if (field.required) {\r\n dropdown.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.RADIO: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const radioGroup = form.createRadioGroup(encodedName);\r\n\r\n if (field.options && field.options.length > 0) {\r\n // Calculate spacing for radio buttons\r\n const optionHeight = Math.min(20, field.position.height / field.options.length);\r\n const spacing = field.position.height / field.options.length;\r\n\r\n field.options.forEach((option, index) => {\r\n const optionY = pdfY + field.position.height - (index + 1) * spacing + (spacing - optionHeight) / 2;\r\n radioGroup.addOptionToPage(option, page, {\r\n x: pdfX,\r\n y: optionY,\r\n width: optionHeight,\r\n height: optionHeight,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n // Draw option label\r\n if (drawLabels) {\r\n const labelX = pdfX + optionHeight + 5;\r\n const labelY = optionY + optionHeight / 4;\r\n page.drawText(option, { x: labelX, y: labelY, size: 10, font, color: rgb(0, 0, 0) });\r\n }\r\n });\r\n\r\n if (field.defaultValue && field.options.includes(field.defaultValue)) {\r\n radioGroup.select(field.defaultValue);\r\n }\r\n }\r\n\r\n if (field.label && field.label.trim()) {\r\n try { radioGroup.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label)); } catch { /* ignore */ }\r\n\r\n if (drawLabels) {\r\n const fontSize = 10;\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, { x: pdfX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n\r\n if (field.required) {\r\n radioGroup.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n console.warn(`Unknown field type: ${fieldType} for field ${field.name}`);\r\n }\r\n } catch (error) {\r\n console.error(`Error adding field ${field.name}:`, error);\r\n }\r\n }\r\n\r\n return await pdfDoc.save();\r\n}\r\n\r\n/**\r\n * Map field positions after page assembly\r\n * Updates field page numbers based on the final page arrangement\r\n *\r\n * @param fields - Original fields with positions\r\n * @param pageMapping - Map of \"originalFileId_originalPageIndex\" -> newPageNumber\r\n * @returns Fields with updated page positions\r\n */\r\nexport function mapFieldPositionsAfterAssembly<T extends { position: FormFieldPosition }>(\r\n fields: T[],\r\n pageMapping: Map<string, number>\r\n): T[] {\r\n return fields.map(field => {\r\n // Try to find new page number from mapping\r\n // This requires the caller to track originalFileId and originalPageIndex\r\n // For simple cases where mapping key is just the page number, use that\r\n const mappingKey = String(field.position.page - 1); // 0-indexed for mapping\r\n const newPageNumber = pageMapping.get(mappingKey);\r\n\r\n if (newPageNumber !== undefined) {\r\n return {\r\n ...field,\r\n position: { ...field.position, page: newPageNumber }\r\n };\r\n }\r\n\r\n return field;\r\n }).filter(field => {\r\n // Filter out fields whose pages no longer exist\r\n const mappingKey = String(field.position.page - 1);\r\n return pageMapping.has(mappingKey) || pageMapping.size === 0;\r\n });\r\n}\r\n","import React, { \r\n useState, \r\n useCallback, \r\n useEffect, \r\n useRef, \r\n forwardRef, \r\n useImperativeHandle, \r\n useReducer,\r\n useMemo\r\n} from 'react';\r\nimport { DndProvider, useDrag, useDrop } from 'react-dnd';\r\nimport { HTML5Backend } from 'react-dnd-html5-backend';\r\nimport { \r\n Upload, \r\n FileText, \r\n Image as ImageIcon, \r\n Trash2, \r\n MoreHorizontal,\r\n GripVertical,\r\n Check,\r\n X,\r\n FolderOpen\r\n} from 'lucide-react';\r\n\r\nimport {\r\n Button,\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n CardTitle,\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n AlertDialog,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n AlertDialogContent,\r\n AlertDialogDescription,\r\n AlertDialogFooter,\r\n AlertDialogHeader,\r\n AlertDialogTitle,\r\n Badge,\r\n Input,\r\n Label,\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger\r\n} from '../lib/ui';\r\n\r\nimport { pdfToImages, imageToPdf, normalizeUploadedPdfBytes } from '../utils/pdf-helpers';\r\nimport { PdfPasswordRequiredError } from '../utils/pdf-decrypt';\r\nimport { extractFieldsFromPdf } from '../utils/field-extraction';\r\nimport { addFormFieldsToPdf, type FormFieldForPdf } from '../utils/add-form-fields';\r\nimport { cn } from '../lib/utils';\r\nimport type { PageInfo, FileInfo, PageAssemblerState, PageAssemblerProps, PageAssemblerHandle, TrackedFormField } from '../types';\r\n\r\n// Multi-select utilities\r\nconst isMultiSelectModifier = (event: React.MouseEvent): boolean => {\r\n return event.ctrlKey || event.metaKey;\r\n};\r\n\r\nconst isRangeSelectModifier = (event: React.MouseEvent): boolean => {\r\n return event.shiftKey;\r\n};\r\n\r\nconst handleContextMenu = (event: React.MouseEvent): void => {\r\n if (event.ctrlKey && /Mac|iPod|iPhone|iPad/.test(navigator.userAgent)) {\r\n event.preventDefault();\r\n }\r\n};\r\n\r\nconst getPageRange = (files: FileInfo[], startPageId: string, endPageId: string): string[] => {\r\n const allPages: { id: string; fileId: string }[] = [];\r\n files.forEach(file => {\r\n file.pages.forEach(page => {\r\n allPages.push({ id: page.id, fileId: file.id });\r\n });\r\n });\r\n\r\n const startIndex = allPages.findIndex(p => p.id === startPageId);\r\n const endIndex = allPages.findIndex(p => p.id === endPageId);\r\n\r\n if (startIndex === -1 || endIndex === -1) return [];\r\n\r\n const start = Math.min(startIndex, endIndex);\r\n const end = Math.max(startIndex, endIndex);\r\n\r\n return allPages.slice(start, end + 1).map(p => p.id);\r\n};\r\n\r\n// Action types for reducer\r\ntype AssemblerAction = \r\n | { type: 'ADD_FILE'; payload: FileInfo }\r\n | { type: 'REMOVE_FILE'; payload: string }\r\n | { type: 'UPDATE_FILE'; payload: { fileId: string; updates: Partial<FileInfo> } }\r\n | { type: 'REORDER_PAGES'; payload: { fileId: string; newOrder: PageInfo[] } }\r\n | { type: 'REORDER_FILES'; payload: { newOrder: FileInfo[] } }\r\n | { type: 'MOVE_PAGES'; payload: { pageIds: string[]; targetFileId: string } }\r\n | { type: 'DELETE_PAGES'; payload: string[] }\r\n | { type: 'SET_SELECTION'; payload: string[] }\r\n | { type: 'TOGGLE_PAGE_SELECTION'; payload: { pageId: string; files: FileInfo[] } }\r\n | { type: 'RANGE_SELECT_PAGES'; payload: { pageId: string; files: FileInfo[] } }\r\n | { type: 'SINGLE_SELECT_PAGE'; payload: string }\r\n | { type: 'CLEAR_SELECTION' }\r\n | { type: 'RENAME_FILE'; payload: { fileId: string; name: string } }\r\n | { type: 'RESET'; payload?: PageAssemblerState };\r\n\r\n// Reducer\r\nfunction assemblerReducer(state: PageAssemblerState, action: AssemblerAction): PageAssemblerState {\r\n switch (action.type) {\r\n case 'ADD_FILE': {\r\n const existingFileById = state.files.find(f => f.id === action.payload.id);\r\n if (existingFileById) return state;\r\n \r\n return {\r\n ...state,\r\n files: [...state.files, action.payload]\r\n };\r\n }\r\n \r\n case 'REMOVE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.filter(f => f.id !== action.payload),\r\n selection: state.selection.filter(pageId => \r\n !state.files.find(f => f.id === action.payload)?.pages.some(p => p.id === pageId)\r\n )\r\n };\r\n \r\n case 'UPDATE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.map(f => \r\n f.id === action.payload.fileId \r\n ? { ...f, ...action.payload.updates }\r\n : f\r\n )\r\n };\r\n \r\n case 'REORDER_PAGES':\r\n return {\r\n ...state,\r\n files: state.files.map(f =>\r\n f.id === action.payload.fileId\r\n ? { ...f, pages: action.payload.newOrder }\r\n : f\r\n )\r\n };\r\n \r\n case 'REORDER_FILES':\r\n return {\r\n ...state,\r\n files: action.payload.newOrder\r\n };\r\n \r\n case 'MOVE_PAGES': {\r\n const { pageIds, targetFileId } = action.payload;\r\n const existingPageIds = state.files.flatMap(f => f.pages.map(p => p.id));\r\n const pagesToActuallyMove = pageIds.filter(id => existingPageIds.includes(id));\r\n \r\n if (pagesToActuallyMove.length === 0) return state;\r\n \r\n const pagesToMove: PageInfo[] = [];\r\n \r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n if (pagesToActuallyMove.includes(page.id)) {\r\n pagesToMove.push(page);\r\n }\r\n }\r\n }\r\n \r\n const updatedFiles = state.files.map(file => {\r\n if (file.id === targetFileId) {\r\n const existingPageIds = file.pages.map(p => p.id);\r\n const newPages = pagesToMove.filter(p => !existingPageIds.includes(p.id));\r\n \r\n return {\r\n ...file,\r\n pages: [...file.pages, ...newPages]\r\n };\r\n } else {\r\n return {\r\n ...file,\r\n pages: file.pages.filter(page => !pagesToActuallyMove.includes(page.id))\r\n };\r\n }\r\n });\r\n \r\n return {\r\n ...state,\r\n files: updatedFiles,\r\n selection: []\r\n };\r\n }\r\n \r\n case 'DELETE_PAGES': {\r\n const pageIdsToDelete = action.payload;\r\n const existingPageIds = state.files.flatMap(f => f.pages.map(p => p.id));\r\n const pagesToActuallyDelete = pageIdsToDelete.filter(id => existingPageIds.includes(id));\r\n \r\n if (pagesToActuallyDelete.length === 0) return state;\r\n \r\n const updatedFiles = state.files.map(file => {\r\n const remainingPages = file.pages.filter(page => !pagesToActuallyDelete.includes(page.id));\r\n return {\r\n ...file,\r\n pages: remainingPages\r\n };\r\n }).filter(file => file.pages.length > 0);\r\n \r\n return {\r\n ...state,\r\n files: updatedFiles,\r\n selection: state.selection.filter(id => !pagesToActuallyDelete.includes(id))\r\n };\r\n }\r\n \r\n case 'SET_SELECTION':\r\n return {\r\n ...state,\r\n selection: action.payload\r\n };\r\n \r\n case 'TOGGLE_PAGE_SELECTION': {\r\n const { pageId } = action.payload;\r\n const isSelected = state.selection.includes(pageId);\r\n \r\n if (isSelected) {\r\n return {\r\n ...state,\r\n selection: state.selection.filter(id => id !== pageId),\r\n lastSelectedPageId: pageId\r\n };\r\n } else {\r\n return {\r\n ...state,\r\n selection: [...state.selection, pageId],\r\n lastSelectedPageId: pageId\r\n };\r\n }\r\n }\r\n \r\n case 'RANGE_SELECT_PAGES': {\r\n const { pageId, files } = action.payload;\r\n \r\n if (!state.lastSelectedPageId) {\r\n return {\r\n ...state,\r\n selection: [pageId],\r\n lastSelectedPageId: pageId\r\n };\r\n }\r\n \r\n const rangePageIds = getPageRange(files, state.lastSelectedPageId, pageId);\r\n const newSelection = [...new Set([...state.selection, ...rangePageIds])];\r\n \r\n return {\r\n ...state,\r\n selection: newSelection,\r\n lastSelectedPageId: pageId\r\n };\r\n }\r\n \r\n case 'SINGLE_SELECT_PAGE': {\r\n return {\r\n ...state,\r\n selection: [action.payload],\r\n lastSelectedPageId: action.payload\r\n };\r\n }\r\n \r\n case 'CLEAR_SELECTION':\r\n return {\r\n ...state,\r\n selection: [],\r\n lastSelectedPageId: undefined\r\n };\r\n \r\n case 'RENAME_FILE':\r\n return {\r\n ...state,\r\n files: state.files.map(f =>\r\n f.id === action.payload.fileId\r\n ? { ...f, name: action.payload.name }\r\n : f\r\n )\r\n };\r\n \r\n case 'RESET':\r\n return action.payload || { files: [], selection: [], lastSelectedPageId: undefined };\r\n \r\n default:\r\n return state;\r\n }\r\n}\r\n\r\n// Drag and drop types\r\nconst DND_TYPES = {\r\n PAGE: 'page',\r\n FILE: 'file'\r\n} as const;\r\n\r\n// DraggablePageThumbnail Component\r\ninterface DraggablePageThumbnailProps {\r\n page: PageInfo;\r\n fileId: string;\r\n index: number;\r\n isSelected: boolean;\r\n onSingleSelect: (pageId: string) => void;\r\n onToggleSelect: (pageId: string) => void;\r\n onRangeSelect: (pageId: string) => void;\r\n movePageInFile: (dragIndex: number, hoverIndex: number) => void;\r\n isDraggingPageRef?: React.MutableRefObject<boolean>;\r\n}\r\n\r\nconst DraggablePageThumbnail: React.FC<DraggablePageThumbnailProps> = ({\r\n page,\r\n fileId,\r\n index,\r\n isSelected,\r\n onSingleSelect,\r\n onToggleSelect,\r\n onRangeSelect,\r\n movePageInFile,\r\n isDraggingPageRef\r\n}) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const [{ isDragging }, drag] = useDrag({\r\n type: DND_TYPES.PAGE,\r\n item: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = true;\r\n }\r\n return { pageId: page.id, fileId, index };\r\n },\r\n collect: (monitor) => ({\r\n isDragging: monitor.isDragging(),\r\n }),\r\n end: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = false;\r\n }\r\n }\r\n });\r\n\r\n const [{ handlerId }, drop] = useDrop<\r\n { pageId: string; fileId: string; index: number },\r\n void,\r\n { handlerId: string | symbol | null }\r\n >({\r\n accept: DND_TYPES.PAGE,\r\n collect(monitor) {\r\n return {\r\n handlerId: monitor.getHandlerId(),\r\n };\r\n },\r\n hover(item, monitor) {\r\n if (!ref.current) return;\r\n if (item.fileId !== fileId) return;\r\n\r\n const dragIndex = item.index;\r\n const hoverIndex = index;\r\n\r\n if (dragIndex === hoverIndex) return;\r\n\r\n const hoverBoundingRect = ref.current?.getBoundingClientRect();\r\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\r\n const clientOffset = monitor.getClientOffset();\r\n const hoverClientY = clientOffset!.y - hoverBoundingRect.top;\r\n\r\n if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) return;\r\n if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) return;\r\n\r\n movePageInFile(dragIndex, hoverIndex);\r\n item.index = hoverIndex;\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n drag(drop(ref));\r\n }, [drag, drop]);\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n handleContextMenu(e);\r\n \r\n if (isRangeSelectModifier(e)) {\r\n onRangeSelect(page.id);\r\n } else if (isMultiSelectModifier(e)) {\r\n onToggleSelect(page.id);\r\n } else {\r\n onSingleSelect(page.id);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-handler-id={handlerId}\r\n className={cn(\r\n \"relative group cursor-pointer border-2 rounded-lg overflow-hidden bg-white transition-all\",\r\n isDragging && \"opacity-50 scale-95\",\r\n isSelected ? \"border-primary shadow-md\" : \"border-gray-200 hover:border-gray-300\"\r\n )}\r\n onClick={handleClick}\r\n >\r\n <div className=\"absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity bg-black/50 rounded p-1 z-10\">\r\n <GripVertical className=\"h-3 w-3 text-white\" />\r\n </div>\r\n \r\n <div\r\n className=\"absolute top-2 left-2 z-10\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={(e) => {\r\n const nativeEvent = e.nativeEvent;\r\n if (nativeEvent && 'shiftKey' in nativeEvent && nativeEvent.shiftKey) {\r\n onRangeSelect(page.id);\r\n } else if (nativeEvent && (('ctrlKey' in nativeEvent && nativeEvent.ctrlKey) || ('metaKey' in nativeEvent && nativeEvent.metaKey))) {\r\n onToggleSelect(page.id);\r\n } else {\r\n onSingleSelect(page.id);\r\n }\r\n }}\r\n onContextMenu={handleContextMenu}\r\n className=\"h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary focus:ring-2 bg-white/90 cursor-pointer\"\r\n />\r\n </div>\r\n \r\n <div className=\"aspect-[3/4] relative\">\r\n <img\r\n src={page.thumbUrl}\r\n alt={`Page ${index + 1}`}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n \r\n <Badge\r\n variant=\"secondary\"\r\n className=\"absolute bottom-1 right-1 text-xs px-1 py-0\"\r\n >\r\n {index + 1}\r\n </Badge>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ReorderablePageGrid Component\r\ninterface ReorderablePageGridProps {\r\n file: FileInfo;\r\n selectedPageIds: string[];\r\n onSingleSelectPage: (pageId: string) => void;\r\n onTogglePageSelect: (pageId: string) => void;\r\n onRangeSelectPage: (pageId: string) => void;\r\n onReorderPages: (fileId: string, newOrder: PageInfo[]) => void;\r\n isDraggingPageRef?: React.MutableRefObject<boolean>;\r\n}\r\n\r\nconst ReorderablePageGrid: React.FC<ReorderablePageGridProps> = ({\r\n file,\r\n selectedPageIds,\r\n onSingleSelectPage,\r\n onTogglePageSelect,\r\n onRangeSelectPage,\r\n onReorderPages,\r\n isDraggingPageRef\r\n}) => {\r\n const movePageInFile = useCallback((dragIndex: number, hoverIndex: number) => {\r\n const newPages = [...file.pages];\r\n const draggedPage = newPages[dragIndex];\r\n \r\n newPages.splice(dragIndex, 1);\r\n newPages.splice(hoverIndex, 0, draggedPage);\r\n \r\n onReorderPages(file.id, newPages);\r\n }, [file.id, file.pages, onReorderPages]);\r\n\r\n return (\r\n <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4\">\r\n {file.pages.map((page, index) => (\r\n <DraggablePageThumbnail\r\n key={page.id}\r\n page={page}\r\n fileId={file.id}\r\n index={index}\r\n isSelected={selectedPageIds.includes(page.id)}\r\n onSingleSelect={onSingleSelectPage}\r\n onToggleSelect={onTogglePageSelect}\r\n onRangeSelect={onRangeSelectPage}\r\n movePageInFile={movePageInFile}\r\n isDraggingPageRef={isDraggingPageRef}\r\n />\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\n// File drop zone component\r\ninterface FileDropZoneProps {\r\n targetIndex: number;\r\n onReorderFiles: (newOrder: FileInfo[]) => void;\r\n files: FileInfo[];\r\n}\r\n\r\nconst FileDropZone: React.FC<FileDropZoneProps> = ({\r\n targetIndex,\r\n onReorderFiles,\r\n files\r\n}) => {\r\n const [{ isOver, canDrop }, drop] = useDrop<\r\n { fileId: string; file: FileInfo },\r\n void,\r\n { isOver: boolean; canDrop: boolean }\r\n >({\r\n accept: DND_TYPES.FILE,\r\n drop: (item) => {\r\n const currentIndex = files.findIndex(f => f.id === item.fileId);\r\n if (currentIndex === -1) return;\r\n \r\n let newIndex = targetIndex;\r\n if (currentIndex < targetIndex) {\r\n newIndex = targetIndex - 1;\r\n }\r\n \r\n if (currentIndex === newIndex) return;\r\n \r\n const newFiles = [...files];\r\n const [movedFile] = newFiles.splice(currentIndex, 1);\r\n newFiles.splice(newIndex, 0, movedFile);\r\n \r\n onReorderFiles(newFiles);\r\n },\r\n collect: (monitor) => ({\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n }),\r\n });\r\n\r\n const isActive = isOver && canDrop;\r\n\r\n return (\r\n <div\r\n ref={drop as unknown as React.Ref<HTMLDivElement>}\r\n className={cn(\r\n \"h-2 transition-all duration-200 mx-4\",\r\n isActive ? \"h-8 bg-primary/20 border-2 border-dashed border-primary rounded-lg\" : \"\"\r\n )}\r\n >\r\n {isActive && (\r\n <div className=\"flex items-center justify-center h-full text-primary text-sm font-medium\">\r\n Drop here to reorder\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// FileCard component\r\ninterface FileCardProps {\r\n file: FileInfo;\r\n selectedPageIds: string[];\r\n onSingleSelectPage: (pageId: string) => void;\r\n onTogglePageSelect: (pageId: string) => void;\r\n onRangeSelectPage: (pageId: string) => void;\r\n onSelectAllInFile: (fileId: string) => void;\r\n onRemoveFile: (fileId: string) => void;\r\n onRenameFile: (fileId: string, name: string) => void;\r\n onReorderPages: (fileId: string, newOrder: PageInfo[]) => void;\r\n isDraggingPageRef?: React.MutableRefObject<boolean>;\r\n}\r\n\r\nconst FileCard: React.FC<FileCardProps> = ({\r\n file,\r\n selectedPageIds,\r\n onSingleSelectPage,\r\n onTogglePageSelect,\r\n onRangeSelectPage,\r\n onSelectAllInFile,\r\n onRemoveFile,\r\n onRenameFile,\r\n onReorderPages,\r\n isDraggingPageRef\r\n}) => {\r\n const [isRenaming, setIsRenaming] = useState(false);\r\n const [newName, setNewName] = useState(file.name);\r\n const fileSelectedPages = file.pages.filter(p => selectedPageIds.includes(p.id));\r\n const allPagesSelected = file.pages.length > 0 && fileSelectedPages.length === file.pages.length;\r\n\r\n // Stores an action to run after the dropdown menu fully closes,\r\n // so that focus cleanup completes before we unmount the card or open a dialog.\r\n const pendingDropdownAction = useRef<(() => void) | null>(null);\r\n\r\n const [{ isDraggingFile }, dragFile] = useDrag({\r\n type: DND_TYPES.FILE,\r\n item: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = true;\r\n }\r\n return { fileId: file.id, file };\r\n },\r\n collect: (monitor) => ({\r\n isDraggingFile: monitor.isDragging(),\r\n }),\r\n end: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = false;\r\n }\r\n }\r\n });\r\n\r\n const [, drop] = useDrop<\r\n { pageId: string; fileId: string; index: number },\r\n void,\r\n object\r\n >({\r\n accept: DND_TYPES.PAGE,\r\n drop: (_item) => {\r\n // Moving between files handled in parent\r\n },\r\n });\r\n\r\n const handleRename = () => {\r\n if (newName.trim() && newName !== file.name) {\r\n onRenameFile(file.id, newName.trim());\r\n }\r\n setIsRenaming(false);\r\n };\r\n\r\n const combineRefs = useCallback((el: HTMLDivElement | null) => {\r\n drop(el);\r\n dragFile(el);\r\n }, [drop, dragFile]);\r\n\r\n return (\r\n <Card \r\n className={cn(\r\n \"mb-6 transition-all cursor-move\",\r\n isDraggingFile ? \"opacity-50 rotate-2 scale-105 shadow-2xl z-50\" : \"opacity-100\"\r\n )} \r\n ref={combineRefs}\r\n >\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n {file.type === 'pdf' ? (\r\n <FileText className=\"h-5 w-5 text-red-500\" />\r\n ) : (\r\n <ImageIcon className=\"h-5 w-5 text-blue-500\" />\r\n )}\r\n \r\n {isRenaming ? (\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n value={newName}\r\n onChange={(e) => setNewName(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') handleRename();\r\n if (e.key === 'Escape') {\r\n setIsRenaming(false);\r\n setNewName(file.name);\r\n }\r\n }}\r\n className=\"h-8 text-sm\"\r\n autoFocus\r\n />\r\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleRename}>\r\n <Check className=\"h-3 w-3\" />\r\n </Button>\r\n <Button \r\n type=\"button\"\r\n size=\"sm\" \r\n variant=\"ghost\" \r\n onClick={() => {\r\n setIsRenaming(false);\r\n setNewName(file.name);\r\n }}\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <div>\r\n <CardTitle className=\"text-base\">{file.name}</CardTitle>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {file.pages.length} page{file.pages.length !== 1 ? 's' : ''}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n \r\n <div className=\"flex items-center gap-2\">\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onSelectAllInFile(file.id)}\r\n disabled={file.pages.length === 0}\r\n >\r\n {allPagesSelected && <Check className=\"h-3 w-3 mr-2\" />}\r\n Select All\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n Select all pages in this file\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n \r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"hover:bg-gray-100 rounded-lg\">\r\n <MoreHorizontal className=\"h-4 w-4\" />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n align=\"end\"\r\n className=\"w-52\"\r\n onCloseAutoFocus={() => {\r\n pendingDropdownAction.current?.();\r\n pendingDropdownAction.current = null;\r\n }}\r\n >\r\n <DropdownMenuItem onSelect={() => {\r\n pendingDropdownAction.current = () => setIsRenaming(true);\r\n }}>\r\n <svg className=\"h-4 w-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\r\n </svg>\r\n Rename File\r\n </DropdownMenuItem>\r\n <DropdownMenuItem\r\n onSelect={() => {\r\n pendingDropdownAction.current = () => onRemoveFile(file.id);\r\n }}\r\n className=\"text-red-600 hover:text-red-700 hover:bg-red-50 focus:text-red-700 focus:bg-red-50\"\r\n >\r\n <Trash2 className=\"h-4 w-4 mr-2\" />\r\n Remove File\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n \r\n <CardContent>\r\n <ReorderablePageGrid\r\n file={file}\r\n selectedPageIds={selectedPageIds}\r\n onSingleSelectPage={onSingleSelectPage}\r\n onTogglePageSelect={onTogglePageSelect}\r\n onRangeSelectPage={onRangeSelectPage}\r\n onReorderPages={onReorderPages}\r\n isDraggingPageRef={isDraggingPageRef}\r\n />\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\n// Bulk action bar\r\ninterface BulkActionBarProps {\r\n selectedCount: number;\r\n files: FileInfo[];\r\n onMovePages: (targetFileId: string) => void;\r\n onDeletePages: () => void;\r\n onClearSelection: () => void;\r\n}\r\n\r\nconst BulkActionBar: React.FC<BulkActionBarProps> = ({\r\n selectedCount,\r\n files,\r\n onMovePages,\r\n onDeletePages,\r\n onClearSelection\r\n}) => {\r\n if (selectedCount === 0) return null;\r\n\r\n return (\r\n <div className=\"sticky top-4 z-10 mb-4\">\r\n <Card className=\"p-4 shadow-lg border-primary/20 bg-blue-50\">\r\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\r\n <div className=\"flex items-center gap-4 flex-wrap\">\r\n <span \r\n className=\"inline-flex items-center text-sm font-medium text-white rounded-full\"\r\n style={{ \r\n backgroundColor: '#0099cd',\r\n padding: '6px 14px',\r\n }}\r\n >\r\n {selectedCount} page{selectedCount !== 1 ? 's' : ''} selected\r\n </span>\r\n \r\n {files.length > 1 && (\r\n <div className=\"flex items-center gap-2\">\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Label htmlFor=\"move-select\" className=\"text-sm font-medium text-gray-700\">\r\n Move to file:\r\n </Label>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>Move selected pages to another file</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n <Select onValueChange={onMovePages}>\r\n <SelectTrigger id=\"move-select\" className=\"w-48 bg-white\">\r\n <SelectValue placeholder=\"Choose file...\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {files.map((file) => (\r\n <SelectItem key={file.id} value={file.id}>\r\n <div className=\"flex items-center gap-2\">\r\n {file.type === 'pdf' ? (\r\n <FileText className=\"h-4 w-4\" />\r\n ) : (\r\n <ImageIcon className=\"h-4 w-4\" />\r\n )}\r\n <span className=\"truncate\">{file.name}</span>\r\n </div>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n )}\r\n </div>\r\n \r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"destructive\"\r\n size=\"sm\"\r\n onClick={onDeletePages}\r\n >\r\n <Trash2 className=\"h-4 w-4 mr-2\" />\r\n Delete Selected\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onClearSelection}\r\n className=\"bg-white\"\r\n >\r\n Clear Selection\r\n </Button>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n );\r\n};\r\n\r\n// Main PageAssembler component\r\nexport const PageAssembler = forwardRef<PageAssemblerHandle, PageAssemblerProps>(\r\n (props, ref) => {\r\n const { \r\n initialPdf, \r\n initialState, \r\n onChange, \r\n onValidityChange, \r\n limits, \r\n disableFileUpload = false,\r\n className \r\n } = props;\r\n \r\n const [state, dispatch] = useReducer(assemblerReducer, \r\n initialState || { \r\n files: [], \r\n selection: [], \r\n lastSelectedPageId: undefined\r\n });\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [processingStatus, setProcessingStatus] = useState<string>('');\r\n const [uploadError, setUploadError] = useState<string | null>(null);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [showRemoveFileConfirm, setShowRemoveFileConfirm] = useState(false);\r\n const [fileToRemove, setFileToRemove] = useState<{ id: string; name: string; pageCount: number } | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n \r\n const processedInitialPdfRef = useRef<string | null>(null);\r\n const isDraggingPage = useRef<boolean>(false);\r\n const onChangeRef = useRef(onChange);\r\n\r\n // Store original bytes for all files ever added, so pages moved from deleted files can still be copied\r\n const originalBytesCache = useRef<Map<string, Uint8Array>>(new Map());\r\n \r\n const summary = useMemo(() => ({\r\n totalFiles: state.files.length,\r\n totalPages: state.files.reduce((sum, file) => sum + file.pages.length, 0)\r\n }), [state.files]);\r\n \r\n const isValid = summary.totalPages > 0;\r\n\r\n useEffect(() => {\r\n onChangeRef.current = onChange;\r\n }, [onChange]);\r\n\r\n const debouncedOnChange = useMemo(\r\n () => debounce((newState: PageAssemblerState) => {\r\n onChangeRef.current?.(newState);\r\n }, 200),\r\n []\r\n );\r\n\r\n useEffect(() => {\r\n debouncedOnChange(state);\r\n }, [state, debouncedOnChange]);\r\n\r\n useEffect(() => {\r\n onValidityChange?.(isValid);\r\n }, [isValid, onValidityChange]);\r\n\r\n // Process initial PDF\r\n const processInitialPdf = useCallback(async (pdf: File | Blob | ArrayBuffer | Uint8Array) => {\r\n setIsLoading(true);\r\n setProcessingStatus('Processing initial PDF...');\r\n \r\n try {\r\n let pdfBytes: Uint8Array;\r\n \r\n if (pdf instanceof Blob) {\r\n const arrayBuffer = await pdf.arrayBuffer();\r\n pdfBytes = new Uint8Array(arrayBuffer);\r\n } else if (pdf instanceof ArrayBuffer) {\r\n pdfBytes = new Uint8Array(pdf);\r\n } else {\r\n pdfBytes = new Uint8Array(pdf);\r\n }\r\n\r\n // Decrypt permission-restricted (empty-password) PDFs up front so\r\n // every later pdf-lib load (assembly, field extraction) succeeds.\r\n pdfBytes = await normalizeUploadedPdfBytes(pdfBytes);\r\n\r\n const defensiveCopy = new Uint8Array(pdfBytes);\r\n const pages = await pdfToImages(defensiveCopy, { hideFormFields: true });\r\n \r\n if (pages.length === 0) {\r\n throw new Error('Failed to process PDF pages');\r\n }\r\n\r\n let originalBytes: Uint8Array;\r\n let originalFile: File;\r\n \r\n try {\r\n new Uint8Array(pdfBytes.buffer || pdfBytes, 0, 1);\r\n originalBytes = new Uint8Array(pdfBytes);\r\n originalFile = new File([pdfBytes.buffer as ArrayBuffer], 'Initial Document.pdf', { type: 'application/pdf' });\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n if (errorMessage.includes('detached') || errorMessage.includes('ArrayBuffer')) {\r\n throw new Error('Initial PDF data is no longer available. Please try refreshing the page.');\r\n }\r\n throw error;\r\n }\r\n\r\n const fileName = (pdf instanceof File) ? pdf.name : 'Initial Document.pdf';\r\n const fileId = generateId();\r\n \r\n const file: FileInfo = {\r\n id: fileId,\r\n name: fileName,\r\n type: 'pdf',\r\n originalFile,\r\n originalBytes,\r\n pages: pages.map((page, index) => ({\r\n id: generateId(),\r\n srcIndex: index,\r\n thumbUrl: page.imageUrl,\r\n width: page.width,\r\n height: page.height,\r\n mime: 'application/pdf',\r\n originalFileId: fileId\r\n }))\r\n };\r\n\r\n // Cache original bytes so pages can be copied even if file is later deleted\r\n originalBytesCache.current.set(fileId, originalBytes);\r\n\r\n dispatch({ type: 'ADD_FILE', payload: file });\r\n } catch (error) {\r\n console.error('Error processing initial PDF:', error);\r\n } finally {\r\n setIsLoading(false);\r\n setProcessingStatus('');\r\n }\r\n }, []);\r\n\r\n // Initialize with initial PDF if provided.\r\n //\r\n // Seed whenever there's an initialPdf, the assembler currently has no\r\n // pages, and there's no meaningful `initialState` to restore. We do NOT\r\n // bail merely because `initialState` is truthy: a consumer that echoes\r\n // state back via `onChange` (e.g. document-prepare's edit flow) can hand\r\n // us an EMPTY initialState before the async PDF load finishes, which\r\n // previously shadowed `initialPdf` forever and left the step stuck on\r\n // \"No files added\". But a NON-empty initialState (a saved page\r\n // arrangement, e.g. restored on step navigation) must win — letting it be\r\n // restored by the effect below instead of re-seeding the raw PDF, which\r\n // would race the RESET and duplicate pages. The pdfIdentifier dedup still\r\n // prevents reprocessing the same PDF.\r\n const hasRestorableState = !!initialState && initialState.files.length > 0;\r\n useEffect(() => {\r\n if (initialPdf && state.files.length === 0 && !hasRestorableState) {\r\n const pdfIdentifier = initialPdf instanceof Uint8Array\r\n ? `uint8array-${initialPdf.length}-${initialPdf[0]}-${initialPdf[initialPdf.length-1]}`\r\n : `${initialPdf.constructor.name}-${(initialPdf as File | Blob).size || (initialPdf as ArrayBuffer).byteLength}`;\r\n\r\n if (processedInitialPdfRef.current === pdfIdentifier) {\r\n return;\r\n }\r\n\r\n processedInitialPdfRef.current = pdfIdentifier;\r\n processInitialPdf(initialPdf);\r\n }\r\n }, [initialPdf, state.files.length, hasRestorableState, processInitialPdf]);\r\n\r\n // Handle initialState changes. Only restore a state that actually has\r\n // files — an empty initialState is treated as \"no state\" so it can't wipe\r\n // a PDF that was just seeded from `initialPdf` (see above).\r\n useEffect(() => {\r\n if (initialState && initialState.files.length > 0) {\r\n dispatch({ type: 'RESET', payload: initialState });\r\n }\r\n }, [initialState]);\r\n\r\n // File processing\r\n const processFiles = useCallback(async (files: FileList | File[]) => {\r\n const fileArray = Array.from(files);\r\n const maxFileSize = (limits?.maxFileSizeMB || 10) * 1024 * 1024;\r\n\r\n setUploadError(null);\r\n setIsLoading(true);\r\n setProcessingStatus(`Processing ${fileArray.length} file${fileArray.length !== 1 ? 's' : ''}...`);\r\n\r\n for (const file of fileArray) {\r\n try {\r\n if (file.size > maxFileSize) {\r\n console.error(`File ${file.name} is too large`);\r\n continue;\r\n }\r\n\r\n const validTypes = ['application/pdf', 'image/png', 'image/jpeg', 'image/jpg', 'image/webp'];\r\n if (!validTypes.includes(file.type)) {\r\n console.error(`Unsupported file type: ${file.name}`);\r\n continue;\r\n }\r\n\r\n const fileInfo: FileInfo = {\r\n id: generateId(),\r\n name: file.name,\r\n type: file.type === 'application/pdf' ? 'pdf' : 'image',\r\n originalFile: file,\r\n originalBytes: new Uint8Array(),\r\n pages: []\r\n };\r\n\r\n if (file.type === 'application/pdf') {\r\n setProcessingStatus(`Processing PDF: ${file.name}`);\r\n const arrayBuffer = await file.arrayBuffer();\r\n // Decrypt permission-restricted (empty-password) PDFs up front so\r\n // every later pdf-lib load (assembly, field extraction) succeeds.\r\n const pdfBytes = await normalizeUploadedPdfBytes(new Uint8Array(arrayBuffer));\r\n fileInfo.originalBytes = new Uint8Array(pdfBytes);\r\n\r\n // Cache original bytes so pages can be copied even if file is later deleted\r\n originalBytesCache.current.set(fileInfo.id, fileInfo.originalBytes);\r\n\r\n const defensiveCopy = new Uint8Array(pdfBytes);\r\n const pages = await pdfToImages(defensiveCopy, { hideFormFields: true });\r\n fileInfo.pages = pages.map((page, index) => ({\r\n id: generateId(),\r\n srcIndex: index,\r\n thumbUrl: page.imageUrl,\r\n width: page.width,\r\n height: page.height,\r\n mime: file.type,\r\n originalFileId: fileInfo.id\r\n }));\r\n } else {\r\n setProcessingStatus(`Processing image: ${file.name}`);\r\n\r\n const arrayBuffer = await file.arrayBuffer();\r\n const imageBytes = new Uint8Array(arrayBuffer);\r\n fileInfo.originalBytes = new Uint8Array(imageBytes);\r\n\r\n // Cache original bytes so pages can be copied even if file is later deleted\r\n originalBytesCache.current.set(fileInfo.id, fileInfo.originalBytes);\r\n\r\n const thumbUrl = URL.createObjectURL(file);\r\n\r\n const img = new Image();\r\n const dimensions = await new Promise<{ width: number; height: number }>((resolve) => {\r\n img.onload = () => resolve({ width: img.width, height: img.height });\r\n img.src = thumbUrl;\r\n });\r\n\r\n const maxWidth = 595;\r\n const maxHeight = 842;\r\n\r\n let pdfWidth = dimensions.width;\r\n let pdfHeight = dimensions.height;\r\n\r\n if (dimensions.width > maxWidth || dimensions.height > maxHeight) {\r\n const scaleX = maxWidth / dimensions.width;\r\n const scaleY = maxHeight / dimensions.height;\r\n const scale = Math.min(scaleX, scaleY);\r\n\r\n pdfWidth = dimensions.width * scale;\r\n pdfHeight = dimensions.height * scale;\r\n }\r\n\r\n fileInfo.pages = [{\r\n id: generateId(),\r\n srcIndex: 0,\r\n thumbUrl,\r\n width: Math.max(pdfWidth, 100),\r\n height: Math.max(pdfHeight, 100),\r\n mime: file.type,\r\n originalFileId: fileInfo.id\r\n }];\r\n }\r\n\r\n dispatch({ type: 'ADD_FILE', payload: fileInfo });\r\n } catch (error) {\r\n console.error(`Error processing file ${file.name}:`, error);\r\n if (error instanceof PdfPasswordRequiredError) {\r\n setUploadError(`${file.name}: ${error.userMessage}`);\r\n } else {\r\n setUploadError(`Failed to process \"${file.name}\". The file may be corrupted or unsupported.`);\r\n }\r\n }\r\n }\r\n\r\n setIsLoading(false);\r\n setProcessingStatus('');\r\n }, [limits]);\r\n\r\n // File upload handlers\r\n const handleFileUpload = useCallback(() => {\r\n fileInputRef.current?.click();\r\n }, []);\r\n\r\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n if (files) {\r\n processFiles(files);\r\n }\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n }, [processFiles]);\r\n\r\n const handleDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n \r\n const files = e.dataTransfer.files;\r\n if (files && files.length > 0) {\r\n if (isDraggingPage.current) {\r\n return;\r\n }\r\n processFiles(files);\r\n }\r\n }, [processFiles]);\r\n\r\n const handleDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n }, []);\r\n\r\n // Selection handlers\r\n const handleSingleSelectPage = useCallback((pageId: string) => {\r\n dispatch({ type: 'SINGLE_SELECT_PAGE', payload: pageId });\r\n }, []);\r\n\r\n const handleTogglePageSelect = useCallback((pageId: string) => {\r\n dispatch({ type: 'TOGGLE_PAGE_SELECTION', payload: { pageId, files: state.files } });\r\n }, [state.files]);\r\n\r\n const handleRangeSelectPage = useCallback((pageId: string) => {\r\n dispatch({ type: 'RANGE_SELECT_PAGES', payload: { pageId, files: state.files } });\r\n }, [state.files]);\r\n\r\n const handleSelectAllInFile = useCallback((fileId: string) => {\r\n const file = state.files.find(f => f.id === fileId);\r\n if (!file) return;\r\n \r\n const filePageIds = file.pages.map(p => p.id);\r\n const allSelected = filePageIds.every(id => state.selection.includes(id));\r\n \r\n if (allSelected) {\r\n dispatch({ \r\n type: 'SET_SELECTION', \r\n payload: state.selection.filter(id => !filePageIds.includes(id)) \r\n });\r\n } else {\r\n const newSelection = [...new Set([...state.selection, ...filePageIds])];\r\n dispatch({ type: 'SET_SELECTION', payload: newSelection });\r\n }\r\n }, [state.files, state.selection]);\r\n\r\n // Bulk operations\r\n const handleMovePages = useCallback((targetFileId: string) => {\r\n if (state.selection.length === 0) return;\r\n \r\n dispatch({ type: 'MOVE_PAGES', payload: { pageIds: state.selection, targetFileId } });\r\n }, [state.selection]);\r\n\r\n const handleDeletePages = useCallback(() => {\r\n setShowDeleteConfirm(true);\r\n }, []);\r\n\r\n const confirmDeletePages = useCallback(() => {\r\n dispatch({ type: 'DELETE_PAGES', payload: state.selection });\r\n setShowDeleteConfirm(false);\r\n }, [state.selection]);\r\n\r\n const handleRemoveFile = useCallback((fileId: string) => {\r\n const file = state.files.find(f => f.id === fileId);\r\n if (!file) return;\r\n\r\n if (file.pages.length > 0) {\r\n setFileToRemove({\r\n id: file.id,\r\n name: file.name,\r\n pageCount: file.pages.length\r\n });\r\n setShowRemoveFileConfirm(true);\r\n } else {\r\n dispatch({ type: 'REMOVE_FILE', payload: fileId });\r\n }\r\n }, [state.files]);\r\n\r\n const confirmRemoveFile = useCallback(() => {\r\n if (fileToRemove) {\r\n dispatch({ type: 'REMOVE_FILE', payload: fileToRemove.id });\r\n setFileToRemove(null);\r\n }\r\n setShowRemoveFileConfirm(false);\r\n }, [fileToRemove]);\r\n\r\n const handleRenameFile = useCallback((fileId: string, name: string) => {\r\n dispatch({ type: 'RENAME_FILE', payload: { fileId, name } });\r\n }, []);\r\n \r\n const handleReorderFiles = useCallback((newOrder: FileInfo[]) => {\r\n dispatch({ type: 'REORDER_FILES', payload: { newOrder } });\r\n }, []);\r\n\r\n // Imperative API\r\n useImperativeHandle(ref, () => ({\r\n assemble: async () => {\r\n setIsLoading(true);\r\n setProcessingStatus('Assembling PDF...');\r\n\r\n try {\r\n const { PDFDocument, PDFName, PDFString } = await import('pdf-lib');\r\n\r\n const loadedPdfs = new Map<string, import('pdf-lib').PDFDocument>();\r\n const fileMap = new Map<string, FileInfo>();\r\n\r\n // Count PDF files and check if we can preserve form fields\r\n const pdfFiles = state.files.filter(f => f.type === 'pdf' && f.originalBytes?.length > 0);\r\n const imageFiles = state.files.filter(f => f.type === 'image');\r\n\r\n // Check if this is a single-PDF scenario\r\n const isSinglePdfScenario = pdfFiles.length === 1 && imageFiles.length === 0;\r\n\r\n for (const file of state.files) {\r\n fileMap.set(file.id, file);\r\n\r\n if (file.type === 'pdf' && file.originalBytes && file.originalBytes.length > 0) {\r\n try {\r\n const sourcePdf = await PDFDocument.load(file.originalBytes);\r\n loadedPdfs.set(file.id, sourcePdf);\r\n } catch (error) {\r\n console.error(`Error loading PDF for file ${file.id}:`, error);\r\n }\r\n }\r\n }\r\n\r\n // Also load PDFs for any pages that reference deleted files (from cache)\r\n // This handles the case where pages were moved from file B to file A, then file B was deleted\r\n const referencedFileIds = new Set<string>();\r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n const originalFileId = page.originalFileId || file.id;\r\n if (!loadedPdfs.has(originalFileId)) {\r\n referencedFileIds.add(originalFileId);\r\n }\r\n }\r\n }\r\n\r\n // Load PDFs from cache for referenced but deleted files\r\n for (const fileId of referencedFileIds) {\r\n const cachedBytes = originalBytesCache.current.get(fileId);\r\n if (cachedBytes && cachedBytes.length > 0) {\r\n try {\r\n console.log(`[PageAssembler] Loading PDF from cache for deleted file ${fileId}`);\r\n const sourcePdf = await PDFDocument.load(cachedBytes);\r\n loadedPdfs.set(fileId, sourcePdf);\r\n } catch (error) {\r\n console.error(`Error loading cached PDF for file ${fileId}:`, error);\r\n }\r\n }\r\n }\r\n\r\n // Single PDF scenario: check if we can return original bytes\r\n console.log('[PageAssembler] Checking single PDF scenario:', {\r\n isSinglePdfScenario,\r\n pdfFilesCount: pdfFiles.length,\r\n imageFilesCount: imageFiles.length,\r\n });\r\n\r\n if (isSinglePdfScenario && pdfFiles[0]) {\r\n const sourceFile = pdfFiles[0];\r\n const sourcePdf = loadedPdfs.get(sourceFile.id);\r\n\r\n console.log('[PageAssembler] Single PDF check:', {\r\n sourcePdfLoaded: !!sourcePdf,\r\n pagesCount: sourceFile.pages.length,\r\n originalBytesLength: sourceFile.originalBytes?.length,\r\n });\r\n\r\n if (sourcePdf) {\r\n const desiredPageIndices = sourceFile.pages.map(p => p.srcIndex);\r\n const originalPageCount = sourcePdf.getPageCount();\r\n\r\n const allPagesFromSameFile = sourceFile.pages.every(\r\n p => (p.originalFileId || sourceFile.id) === sourceFile.id\r\n );\r\n\r\n const isOriginalOrder = desiredPageIndices.length === originalPageCount &&\r\n desiredPageIndices.every((idx, i) => idx === i);\r\n\r\n console.log('[PageAssembler] Original bytes check:', {\r\n allPagesFromSameFile,\r\n isOriginalOrder,\r\n desiredPageIndices,\r\n originalPageCount,\r\n });\r\n\r\n if (allPagesFromSameFile && isOriginalOrder) {\r\n // No changes - return original bytes to preserve EVERYTHING\r\n console.log('[PageAssembler] ✅ Returning ORIGINAL bytes (form fields preserved)');\r\n const arrayBuffer = sourceFile.originalBytes.buffer.slice(\r\n sourceFile.originalBytes.byteOffset,\r\n sourceFile.originalBytes.byteOffset + sourceFile.originalBytes.byteLength\r\n ) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer], { type: 'application/pdf' });\r\n return blob;\r\n } else {\r\n console.log('[PageAssembler] ⚠️ Pages modified, will use copyPages (form fields may be lost)');\r\n }\r\n }\r\n }\r\n\r\n // ===== MULTI-PDF FIELD PRESERVATION APPROACH =====\r\n // 1. Extract fields from ALL source PDFs BEFORE copyPages\r\n // 2. Build page mapping (original page -> new page in combined doc)\r\n // 3. Copy pages (which loses widget annotations)\r\n // 4. Re-add ALL extracted fields with adjusted page numbers\r\n\r\n console.log('[PageAssembler] Starting multi-PDF assembly with field preservation');\r\n\r\n // Step 1: Extract fields from all source PDFs and collect metadata\r\n const allExtractedFields: TrackedFormField[] = [];\r\n const mergedMetadata: {\r\n version: string;\r\n fields: Record<string, any>;\r\n fieldIdIndex: Record<string, string>;\r\n } = {\r\n version: '1.0',\r\n fields: {},\r\n fieldIdIndex: {}\r\n };\r\n\r\n // Build a map of fileId -> { srcPageIndex -> pages in state that use this srcPageIndex }\r\n // This helps us track which pages from each source PDF are included and where they end up\r\n const filePageUsage = new Map<string, Map<number, PageInfo[]>>();\r\n\r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n const originalFileId = page.originalFileId || file.id;\r\n if (!filePageUsage.has(originalFileId)) {\r\n filePageUsage.set(originalFileId, new Map());\r\n }\r\n const pageUsage = filePageUsage.get(originalFileId)!;\r\n if (!pageUsage.has(page.srcIndex)) {\r\n pageUsage.set(page.srcIndex, []);\r\n }\r\n pageUsage.get(page.srcIndex)!.push(page);\r\n }\r\n }\r\n\r\n // Calculate what page number each page will end up at in the combined document\r\n // We need to iterate in the order pages will be added to combined doc\r\n let combinedPageIndex = 0;\r\n const pageIdToNewPageNumber = new Map<string, number>();\r\n\r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n combinedPageIndex++;\r\n pageIdToNewPageNumber.set(page.id, combinedPageIndex); // 1-indexed\r\n }\r\n }\r\n\r\n console.log('[PageAssembler] Page mapping:', Object.fromEntries(pageIdToNewPageNumber));\r\n\r\n // Helper function to extract fields from a PDF and map to new page numbers\r\n const extractAndMapFields = async (\r\n fileId: string,\r\n fileName: string,\r\n pdfBytes: Uint8Array,\r\n sourcePdf: import('pdf-lib').PDFDocument | undefined\r\n ) => {\r\n // Extract SigniphiMetadata from source PDF (we'll merge it per-field below)\r\n let sourceMetadata: { fields?: Record<string, any>; fieldIdIndex?: Record<string, string> } | null = null;\r\n if (sourcePdf) {\r\n try {\r\n const sourceInfoRef = sourcePdf.context.trailerInfo.Info;\r\n if (sourceInfoRef) {\r\n const sourceInfoDict = sourcePdf.context.lookup(sourceInfoRef);\r\n if (sourceInfoDict && typeof (sourceInfoDict as any).get === 'function') {\r\n const metadataObj = (sourceInfoDict as any).get(PDFName.of('SigniphiMetadata'));\r\n if (metadataObj) {\r\n const metadataStr = metadataObj.toString();\r\n let jsonStr = metadataStr;\r\n if (metadataStr.startsWith('(') && metadataStr.endsWith(')')) {\r\n jsonStr = metadataStr.slice(1, -1);\r\n }\r\n sourceMetadata = JSON.parse(jsonStr);\r\n }\r\n }\r\n }\r\n } catch (metadataError) {\r\n console.warn(`Could not read metadata from PDF ${fileName}:`, metadataError);\r\n }\r\n }\r\n\r\n // Extract form fields using pdf-lib\r\n console.log(`[PageAssembler] Extracting fields from \"${fileName}\"`);\r\n const extractedFields = await extractFieldsFromPdf(pdfBytes);\r\n console.log(`[PageAssembler] Found ${extractedFields.length} fields in \"${fileName}\"`);\r\n\r\n // Get which pages from this file are being used\r\n const pageUsageForFile = filePageUsage.get(fileId) || new Map();\r\n\r\n // Map extracted fields to their new page numbers\r\n for (const field of extractedFields) {\r\n const originalPage = field.page; // 1-indexed page in source PDF\r\n const srcIndex = originalPage - 1; // Convert to 0-indexed\r\n\r\n // Find all page instances that use this srcIndex from this file\r\n const pageInstances = pageUsageForFile.get(srcIndex) || [];\r\n\r\n for (const pageInstance of pageInstances) {\r\n const newPageNumber = pageIdToNewPageNumber.get(pageInstance.id);\r\n\r\n if (newPageNumber !== undefined) {\r\n // Create a tracked field with updated page number (keep original field name)\r\n const trackedField: TrackedFormField = {\r\n name: field.name,\r\n type: field.type,\r\n position: {\r\n x: field.x,\r\n y: field.y,\r\n width: field.width,\r\n height: field.height,\r\n page: newPageNumber, // Updated to new page number\r\n },\r\n pageId: pageInstance.id,\r\n originalFileId: fileId,\r\n label: field.label,\r\n required: field.required,\r\n options: field.options,\r\n placeholder: field.placeholder,\r\n fieldId: field.fieldId,\r\n assignedSignerEmail: field.signer,\r\n };\r\n\r\n allExtractedFields.push(trackedField);\r\n console.log(`[PageAssembler] Mapped field \"${field.name}\" from page ${originalPage} to page ${newPageNumber}`);\r\n\r\n // Merge metadata using page-qualified key to prevent overwrites\r\n // when combining PDFs with same field names but different properties\r\n const metadataKey = `${field.name}_p${newPageNumber}`;\r\n if (sourceMetadata?.fields?.[field.name]) {\r\n mergedMetadata.fields[metadataKey] = sourceMetadata.fields[field.name];\r\n }\r\n if (sourceMetadata?.fieldIdIndex?.[field.name]) {\r\n mergedMetadata.fieldIdIndex[metadataKey] = sourceMetadata.fieldIdIndex[field.name];\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Extract fields from current PDF files in state\r\n const processedFileIds = new Set<string>();\r\n for (const file of state.files) {\r\n if (file.type !== 'pdf' || !file.originalBytes || file.originalBytes.length === 0) continue;\r\n\r\n try {\r\n await extractAndMapFields(file.id, file.name, file.originalBytes, loadedPdfs.get(file.id));\r\n processedFileIds.add(file.id);\r\n } catch (extractError) {\r\n console.error(`Error extracting fields from ${file.name}:`, extractError);\r\n }\r\n }\r\n\r\n // Also extract fields from cached PDFs (deleted files that still have pages in use)\r\n for (const fileId of referencedFileIds) {\r\n if (processedFileIds.has(fileId)) continue;\r\n\r\n const cachedBytes = originalBytesCache.current.get(fileId);\r\n if (cachedBytes && cachedBytes.length > 0) {\r\n try {\r\n console.log(`[PageAssembler] Extracting fields from cached file ${fileId}`);\r\n await extractAndMapFields(fileId, `Cached file ${fileId}`, cachedBytes, loadedPdfs.get(fileId));\r\n } catch (extractError) {\r\n console.error(`Error extracting fields from cached file ${fileId}:`, extractError);\r\n }\r\n }\r\n }\r\n\r\n console.log(`[PageAssembler] Total extracted fields: ${allExtractedFields.length}`);\r\n console.log(`[PageAssembler] Field names:`, allExtractedFields.map(f => `${f.name} (page ${f.position.page})`));\r\n\r\n // Step 2: Create combined document and copy pages\r\n const combinedDoc = await PDFDocument.create();\r\n\r\n for (const file of state.files) {\r\n if (file.pages.length === 0) continue;\r\n\r\n for (const page of file.pages) {\r\n const originalFileId = page.originalFileId || file.id;\r\n const sourceFile = fileMap.get(originalFileId);\r\n\r\n if (!sourceFile) {\r\n console.warn(`Source file not found for page ${page.id}`);\r\n continue;\r\n }\r\n\r\n if (sourceFile.type === 'pdf') {\r\n const sourcePdf = loadedPdfs.get(originalFileId);\r\n if (!sourcePdf) {\r\n console.warn(`Source PDF not loaded for page ${page.id}`);\r\n continue;\r\n }\r\n\r\n const sourcePageCount = sourcePdf.getPageCount();\r\n\r\n if (page.srcIndex >= 0 && page.srcIndex < sourcePageCount) {\r\n try {\r\n const copiedPages = await combinedDoc.copyPages(sourcePdf, [page.srcIndex]);\r\n copiedPages.forEach(copiedPage => {\r\n // Remove widget annotations from copied page to prevent duplicates\r\n // Widget annotations are form field visuals that get copied but orphaned\r\n // We'll re-add proper form fields later via addFormFieldsToPdf\r\n try {\r\n const annotsRef = copiedPage.node.get(PDFName.of('Annots'));\r\n if (annotsRef) {\r\n copiedPage.node.delete(PDFName.of('Annots'));\r\n }\r\n } catch (annotError) {\r\n console.warn('Could not remove annotations from copied page:', annotError);\r\n }\r\n combinedDoc.addPage(copiedPage);\r\n });\r\n } catch (copyError) {\r\n console.error(`Error copying page ${page.srcIndex}:`, copyError);\r\n throw new Error(`Failed to copy page: ${copyError instanceof Error ? copyError.message : String(copyError)}`);\r\n }\r\n }\r\n } else if (sourceFile.type === 'image' && sourceFile.originalFile) {\r\n try {\r\n const imagePdfBytes = await imageToPdf(sourceFile.originalFile);\r\n const imagePdf = await PDFDocument.load(imagePdfBytes);\r\n const copiedPages = await combinedDoc.copyPages(imagePdf, [0]);\r\n copiedPages.forEach(copiedPage => combinedDoc.addPage(copiedPage));\r\n } catch (imageError) {\r\n console.error(`Error converting image page:`, imageError);\r\n throw new Error(`Failed to convert image: ${imageError instanceof Error ? imageError.message : String(imageError)}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Step 3: Write merged SigniphiMetadata to combined document\r\n if (Object.keys(mergedMetadata.fields).length > 0) {\r\n try {\r\n const newInfoRef = combinedDoc.context.trailerInfo.Info;\r\n if (newInfoRef) {\r\n const newInfoDict = combinedDoc.context.lookup(newInfoRef);\r\n if (newInfoDict && typeof (newInfoDict as any).set === 'function') {\r\n (newInfoDict as any).set(\r\n PDFName.of('SigniphiMetadata'),\r\n PDFString.of(JSON.stringify(mergedMetadata))\r\n );\r\n }\r\n }\r\n } catch (metadataError) {\r\n console.warn('Could not write merged metadata:', metadataError);\r\n }\r\n }\r\n\r\n // Save the combined document (without form fields - copyPages loses them)\r\n let pdfBytes = await combinedDoc.save();\r\n\r\n // Step 4: Re-add all extracted fields to the combined document\r\n if (allExtractedFields.length > 0) {\r\n console.log(`[PageAssembler] Re-adding ${allExtractedFields.length} fields to combined document`);\r\n\r\n // Convert TrackedFormField to FormFieldForPdf format\r\n const fieldsForPdf: FormFieldForPdf[] = allExtractedFields.map(field => ({\r\n name: field.name,\r\n type: field.type,\r\n position: field.position,\r\n label: field.label,\r\n required: field.required,\r\n options: field.options,\r\n placeholder: field.placeholder,\r\n assignedSignerEmail: field.assignedSignerEmail,\r\n }));\r\n\r\n try {\r\n pdfBytes = await addFormFieldsToPdf(pdfBytes, fieldsForPdf, {\r\n removeExistingFields: true, // Remove any orphaned field references\r\n drawLabels: false,\r\n });\r\n console.log('[PageAssembler] ✅ Successfully re-added form fields to combined PDF');\r\n } catch (addFieldsError) {\r\n console.error('[PageAssembler] Error re-adding fields:', addFieldsError);\r\n // Continue with the PDF without fields rather than failing completely\r\n }\r\n }\r\n\r\n // Create ArrayBuffer from Uint8Array (TypeScript 5.9+ has stricter typing)\r\n const arrayBuffer = pdfBytes.buffer.slice(pdfBytes.byteOffset, pdfBytes.byteOffset + pdfBytes.byteLength) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer], { type: 'application/pdf' });\r\n\r\n return blob;\r\n } catch (error) {\r\n console.error('Error assembling PDF:', error);\r\n throw error;\r\n } finally {\r\n setIsLoading(false);\r\n setProcessingStatus('');\r\n }\r\n },\r\n \r\n getSummary: () => summary,\r\n \r\n isBusy: () => isLoading,\r\n \r\n getState: () => state,\r\n }), [state, summary, isLoading]);\r\n\r\n return (\r\n <TooltipProvider>\r\n <DndProvider backend={HTML5Backend}>\r\n <div className={cn(\"space-y-3\", className)}>\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"text-lg font-medium\">Page Assembly</h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n Upload, arrange, and combine pages into a single PDF document\r\n </p>\r\n </div>\r\n \r\n <div className=\"flex items-center gap-4\">\r\n {summary.totalPages > 0 && (\r\n <span className=\"text-sm text-gray-500\">\r\n {summary.totalFiles} file{summary.totalFiles !== 1 ? 's' : ''}, {summary.totalPages} page{summary.totalPages !== 1 ? 's' : ''}\r\n </span>\r\n )}\r\n \r\n {!disableFileUpload && (\r\n <>\r\n <Button type=\"button\" onClick={handleFileUpload} disabled={isLoading}>\r\n <Upload className=\"h-4 w-4 mr-2\" />\r\n Add Files\r\n </Button>\r\n \r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n accept=\".pdf,image/*\"\r\n onChange={handleFileChange}\r\n className=\"hidden\"\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Loading indicator */}\r\n {isLoading && (\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-primary\"></div>\r\n <span className=\"text-sm\">{processingStatus}</span>\r\n </div>\r\n </Card>\r\n )}\r\n\r\n {/* Upload error */}\r\n {uploadError && !isLoading && (\r\n <Card className=\"p-4 border-destructive/50 bg-destructive/5\">\r\n <div className=\"flex items-center gap-3\">\r\n <X className=\"h-4 w-4 text-destructive flex-shrink-0\" />\r\n <span className=\"text-sm text-destructive\">{uploadError}</span>\r\n </div>\r\n </Card>\r\n )}\r\n\r\n {/* Bulk actions */}\r\n <BulkActionBar\r\n selectedCount={state.selection.length}\r\n files={state.files}\r\n onMovePages={handleMovePages}\r\n onDeletePages={handleDeletePages}\r\n onClearSelection={() => dispatch({ type: 'CLEAR_SELECTION' })}\r\n />\r\n\r\n {/* Files */}\r\n {state.files.length > 0 ? (\r\n <div\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n >\r\n <FileDropZone\r\n targetIndex={0}\r\n onReorderFiles={handleReorderFiles}\r\n files={state.files}\r\n />\r\n \r\n {state.files.map((file, index) => (\r\n <div key={file.id}>\r\n <FileCard\r\n file={file}\r\n selectedPageIds={state.selection}\r\n onSingleSelectPage={handleSingleSelectPage}\r\n onTogglePageSelect={handleTogglePageSelect}\r\n onRangeSelectPage={handleRangeSelectPage}\r\n onSelectAllInFile={handleSelectAllInFile}\r\n onRemoveFile={handleRemoveFile}\r\n onRenameFile={handleRenameFile}\r\n onReorderPages={(fileId, newOrder) => \r\n dispatch({ type: 'REORDER_PAGES', payload: { fileId, newOrder } })\r\n }\r\n isDraggingPageRef={isDraggingPage}\r\n />\r\n \r\n <FileDropZone\r\n targetIndex={index + 1}\r\n onReorderFiles={handleReorderFiles}\r\n files={state.files}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n !disableFileUpload && (\r\n <div \r\n className=\"p-12 rounded-lg bg-card text-card-foreground cursor-pointer transition-all border-2 border-dashed border-border hover:border-primary/60 hover:bg-primary/10\"\r\n onClick={handleFileUpload}\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n >\r\n <div className=\"text-center\">\r\n <FolderOpen className=\"h-12 w-12 mx-auto text-gray-400 mb-4\" />\r\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">No files added</h3>\r\n <p className=\"text-gray-500 mb-4\">\r\n Upload PDF files and images to start building your document\r\n </p>\r\n <Button type=\"button\" variant=\"outline\">\r\n <Upload className=\"h-4 w-4 mr-2\" />\r\n Choose Files\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n )}\r\n\r\n {/* Delete confirmation dialog */}\r\n <AlertDialog open={showDeleteConfirm} onOpenChange={setShowDeleteConfirm}>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>\r\n <AlertDialogTitle>Delete Pages</AlertDialogTitle>\r\n <AlertDialogDescription>\r\n Are you sure you want to delete {state.selection.length} selected page\r\n {state.selection.length !== 1 ? 's' : ''}? This action cannot be undone.\r\n </AlertDialogDescription>\r\n </AlertDialogHeader>\r\n <AlertDialogFooter>\r\n <AlertDialogCancel>Cancel</AlertDialogCancel>\r\n <AlertDialogAction \r\n className=\"bg-destructive text-white hover:bg-destructive/90\"\r\n onClick={confirmDeletePages}\r\n >\r\n Delete\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n\r\n {/* Remove file confirmation dialog */}\r\n <AlertDialog open={showRemoveFileConfirm} onOpenChange={setShowRemoveFileConfirm}>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>\r\n <AlertDialogTitle>Remove File</AlertDialogTitle>\r\n <AlertDialogDescription>\r\n Are you sure you want to remove \"{fileToRemove?.name}\" and all its {fileToRemove?.pageCount} page\r\n {fileToRemove?.pageCount !== 1 ? 's' : ''}? This action cannot be undone.\r\n </AlertDialogDescription>\r\n </AlertDialogHeader>\r\n <AlertDialogFooter>\r\n <AlertDialogCancel onClick={() => {\r\n setFileToRemove(null);\r\n setShowRemoveFileConfirm(false);\r\n }}>Cancel</AlertDialogCancel>\r\n <AlertDialogAction \r\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\r\n onClick={confirmRemoveFile}\r\n >\r\n Remove File\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n </div>\r\n </DndProvider>\r\n </TooltipProvider>\r\n );\r\n }\r\n);\r\n\r\nPageAssembler.displayName = 'PageAssembler';\r\n\r\n// Utility functions\r\nfunction generateId(): string {\r\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n\r\nfunction debounce<T extends (...args: never[]) => unknown>(\r\n func: T,\r\n wait: number\r\n): T {\r\n let timeout: NodeJS.Timeout | undefined;\r\n return ((...args: Parameters<T>) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func(...args), wait);\r\n }) as T;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/lib/ui/button.tsx","../src/lib/ui/card.tsx","../src/lib/ui/input.tsx","../src/lib/ui/label.tsx","../src/lib/ui/badge.tsx","../src/lib/ui/select.tsx","../src/lib/ui/alert-dialog.tsx","../src/lib/ui/dropdown-menu.tsx","../src/lib/ui/tooltip.tsx","../../pdf-crypto/src/pdf-decrypt.ts","../src/utils/pdf-decrypt.ts","../src/utils/pdf-helpers.ts","../src/utils/field-extraction.ts","../src/utils/add-form-fields.ts","../src/components/PageAssembler.tsx"],"names":["twMerge","clsx","cva","React","Slot","jsx","React2","React3","React4","LabelPrimitive","SelectPrimitive","React5","jsxs","ChevronDown","ChevronUp","Check","AlertDialogPrimitive","React6","DropdownMenuPrimitive","React7","ChevronRight","Circle","TooltipPrimitive","React8","i","PDFName","PDFNumber","PDFString","PDFHexString","PDFBool","PDFDict","filter","PDFArray","PDFInvalidObject","PDFObjectParser","PDFRawStream","PDFObjectStreamParser","PDFRef","PDFDocument","PdfPasswordRequiredError","UnsupportedPdfEncryptionError","decryptPdf","normalizePdfEncryption","pdfjsLib","PDFTextField","PDFCheckBox","PDFDropdown","PDFRadioGroup","FormFieldType","StandardFonts","pages","rgb","existingPageIds","useRef","useDrag","useDrop","useEffect","GripVertical","useCallback","useState","FileText","ImageIcon","X","MoreHorizontal","Trash2","forwardRef","useReducer","useMemo","useImperativeHandle","arrayBuffer","blob","pdfBytes","DndProvider","HTML5Backend","Fragment","Upload","FolderOpen"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import * as React from 'react';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils';\r\n\r\nconst buttonVariants = cva(\r\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\r\n outline:\r\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\r\n secondary:\r\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n },\r\n size: {\r\n default: 'h-10 px-4 py-2',\r\n sm: 'h-9 rounded-md px-3',\r\n lg: 'h-11 md:h-12 rounded-md px-8',\r\n icon: 'h-10 w-10',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n }\r\n);\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean;\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button';\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size }), className)}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nButton.displayName = 'Button';\r\n\r\nexport { Button, buttonVariants };\r\n","import * as React from 'react';\r\nimport { cn } from '../utils';\r\n\r\nconst Card = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'rounded-lg bg-card text-card-foreground shadow-sm',\r\n className\r\n )}\r\n style={{\r\n border: '1px solid hsl(var(--xpa-border))',\r\n ...((props.style || {}) as React.CSSProperties)\r\n }}\r\n {...props}\r\n />\r\n));\r\nCard.displayName = 'Card';\r\n\r\nconst CardHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('flex flex-col space-y-1.5 p-6', className)}\r\n {...props}\r\n />\r\n));\r\nCardHeader.displayName = 'CardHeader';\r\n\r\nconst CardTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h3\r\n ref={ref}\r\n className={cn(\r\n 'text-2xl font-semibold leading-none tracking-tight',\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nCardTitle.displayName = 'CardTitle';\r\n\r\nconst CardDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <p\r\n ref={ref}\r\n className={cn('text-sm text-muted-foreground', className)}\r\n {...props}\r\n />\r\n));\r\nCardDescription.displayName = 'CardDescription';\r\n\r\nconst CardContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\r\n));\r\nCardContent.displayName = 'CardContent';\r\n\r\nconst CardFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('flex items-center p-6 pt-0', className)}\r\n {...props}\r\n />\r\n));\r\nCardFooter.displayName = 'CardFooter';\r\n\r\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\r\n","import * as React from 'react';\r\nimport { cn } from '../utils';\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {}\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n 'flex h-10 w-full rounded-md border-2 border-input bg-background px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground transition-all duration-200 focus:outline-none focus:border-primary focus:ring-0 focus:shadow-[0_0_0_3px_rgba(0,153,205,0.15)] focus-visible:outline-none focus-visible:border-primary focus-visible:ring-0 focus-visible:shadow-[0_0_0_3px_rgba(0,153,205,0.15)] disabled:cursor-not-allowed disabled:opacity-50',\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nInput.displayName = 'Input';\r\n\r\nexport { Input };\r\n","import * as React from 'react';\r\nimport * as LabelPrimitive from '@radix-ui/react-label';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils';\r\n\r\nconst labelVariants = cva(\r\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\r\n);\r\n\r\nconst Label = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\r\n VariantProps<typeof labelVariants> & {\r\n children?: React.ReactNode;\r\n }\r\n>(({ className, ...props }, ref) => (\r\n <LabelPrimitive.Root\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nLabel.displayName = LabelPrimitive.Root.displayName;\r\n\r\nexport { Label };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '../utils';\r\n\r\nconst badgeVariants = cva(\r\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\r\n secondary:\r\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\r\n destructive:\r\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\r\n outline: 'text-foreground',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n },\r\n }\r\n);\r\n\r\nexport interface BadgeProps\r\n extends React.HTMLAttributes<HTMLDivElement>,\r\n VariantProps<typeof badgeVariants> {}\r\n\r\nfunction Badge({ className, variant, ...props }: BadgeProps) {\r\n return (\r\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\r\n );\r\n}\r\n\r\nexport { Badge, badgeVariants };\r\n","import * as React from 'react';\r\nimport * as SelectPrimitive from '@radix-ui/react-select';\r\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\r\nimport { cn } from '../utils';\r\n\r\nconst Select = SelectPrimitive.Root;\r\n\r\nconst SelectGroup = SelectPrimitive.Group;\r\n\r\nconst SelectValue = SelectPrimitive.Value;\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n));\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n 'flex cursor-default items-center justify-center py-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n));\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n 'flex cursor-default items-center justify-center py-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n));\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName;\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = 'popper', ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n 'relative max-h-96 min-w-[12rem] overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\r\n position === 'popper' &&\r\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\r\n className\r\n )}\r\n position={position}\r\n style={{ \r\n zIndex: 99999,\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #e2e8f0',\r\n borderRadius: '0.5rem',\r\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',\r\n marginTop: '4px',\r\n }}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n position === 'popper' &&\r\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\r\n )}\r\n style={{ padding: '6px' }}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n));\r\nSelectContent.displayName = SelectPrimitive.Content.displayName;\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\r\n {...props}\r\n />\r\n));\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => {\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n \r\n return (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n 'relative flex w-full cursor-pointer select-none items-center outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\r\n className\r\n )}\r\n style={{\r\n backgroundColor: isHovered ? '#f1f5f9' : 'transparent',\r\n color: '#1e293b',\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n marginBottom: '2px',\r\n }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n {...props}\r\n >\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n <SelectPrimitive.ItemIndicator \r\n style={{ \r\n marginLeft: 'auto',\r\n paddingLeft: '8px',\r\n color: '#0099cd',\r\n }}\r\n >\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </SelectPrimitive.Item>\r\n );\r\n});\r\nSelectItem.displayName = SelectPrimitive.Item.displayName;\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\r\n {...props}\r\n />\r\n));\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n};\r\n","import * as React from \"react\"\r\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\r\n\r\nimport { cn } from \"../utils\"\r\nimport { buttonVariants } from \"./button\"\r\n\r\nconst AlertDialog = AlertDialogPrimitive.Root\r\n\r\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\r\n\r\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\r\n\r\nconst AlertDialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Overlay\r\n className={cn(\r\n \"fixed inset-0 z-[9998] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\r\n className\r\n )}\r\n {...props}\r\n ref={ref}\r\n />\r\n))\r\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\r\n\r\nconst AlertDialogContent = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPortal container={document.querySelector('.signiphi-page-assembly') as HTMLElement}>\r\n <AlertDialogOverlay />\r\n <AlertDialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-[9999] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n </AlertDialogPortal>\r\n))\r\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\r\n\r\nconst AlertDialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-2 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\r\n\r\nconst AlertDialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\r\n\r\nconst AlertDialogTitle = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\"text-lg font-semibold\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\r\n\r\nconst AlertDialogDescription = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogDescription.displayName =\r\n AlertDialogPrimitive.Description.displayName\r\n\r\nconst AlertDialogAction = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Action\r\n ref={ref}\r\n className={cn(buttonVariants(), className)}\r\n {...props}\r\n />\r\n))\r\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\r\n\r\nconst AlertDialogCancel = React.forwardRef<\r\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\r\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\r\n>(({ className, ...props }, ref) => (\r\n <AlertDialogPrimitive.Cancel\r\n ref={ref}\r\n className={cn(\r\n buttonVariants({ variant: \"outline\" }),\r\n \"mt-2 sm:mt-0\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\r\n\r\nexport {\r\n AlertDialog,\r\n AlertDialogPortal,\r\n AlertDialogOverlay,\r\n AlertDialogTrigger,\r\n AlertDialogContent,\r\n AlertDialogHeader,\r\n AlertDialogFooter,\r\n AlertDialogTitle,\r\n AlertDialogDescription,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n}\r\n","import * as React from \"react\"\r\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\r\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\r\n\r\nimport { cn } from \"../utils\"\r\n\r\nconst DropdownMenu = DropdownMenuPrimitive.Root\r\n\r\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\r\n\r\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\r\n\r\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\r\n\r\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\r\n\r\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\r\n\r\nconst DropdownMenuSubTrigger = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubTrigger\r\n ref={ref}\r\n className={cn(\r\n \"flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRight className=\"ml-auto\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n))\r\nDropdownMenuSubTrigger.displayName =\r\n DropdownMenuPrimitive.SubTrigger.displayName\r\n\r\nconst DropdownMenuSubContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.SubContent\r\n ref={ref}\r\n className={cn(\r\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSubContent.displayName =\r\n DropdownMenuPrimitive.SubContent.displayName\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"min-w-[12rem] overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n style={{\r\n zIndex: 99999,\r\n backgroundColor: '#ffffff',\r\n border: '1px solid #e2e8f0',\r\n borderRadius: '0.5rem',\r\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',\r\n padding: '6px',\r\n }}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n))\r\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\r\n\r\nconst DropdownMenuItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => {\r\n const [isHovered, setIsHovered] = React.useState(false);\r\n \r\n return (\r\n <DropdownMenuPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-pointer select-none items-center gap-2 outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n style={{\r\n backgroundColor: isHovered ? '#f1f5f9' : 'transparent',\r\n color: '#1e293b',\r\n padding: '8px 12px',\r\n borderRadius: '6px',\r\n fontSize: '14px',\r\n marginBottom: '2px',\r\n }}\r\n onMouseEnter={() => setIsHovered(true)}\r\n onMouseLeave={() => setIsHovered(false)}\r\n {...props}\r\n />\r\n );\r\n})\r\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\r\n\r\nconst DropdownMenuCheckboxItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\r\n>(({ className, children, checked, ...props }, ref) => (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n))\r\nDropdownMenuCheckboxItem.displayName =\r\n DropdownMenuPrimitive.CheckboxItem.displayName\r\n\r\nconst DropdownMenuRadioItem = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\r\n>(({ className, children, ...props }, ref) => (\r\n <DropdownMenuPrimitive.RadioItem\r\n ref={ref}\r\n className={cn(\r\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <Circle className=\"h-2 w-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n))\r\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\r\n\r\nconst DropdownMenuLabel = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean\r\n }\r\n>(({ className, inset, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Label\r\n ref={ref}\r\n className={cn(\r\n \"px-2 py-1.5 text-sm font-semibold\",\r\n inset && \"pl-8\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\r\n\r\nconst DropdownMenuSeparator = React.forwardRef<\r\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <DropdownMenuPrimitive.Separator\r\n ref={ref}\r\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\r\n {...props}\r\n />\r\n))\r\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\r\n\r\nconst DropdownMenuShortcut = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLSpanElement>) => {\r\n return (\r\n <span\r\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuGroup,\r\n DropdownMenuPortal,\r\n DropdownMenuSub,\r\n DropdownMenuSubContent,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuRadioGroup,\r\n}\r\n","import * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\n\r\nimport { cn } from \"../utils\"\r\n\r\nconst TooltipProvider = TooltipPrimitive.Provider\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, ...props }, ref) => (\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","/**\r\n * Decrypts PDFs protected with the standard security handler and an EMPTY\r\n * user password (the common \"permission-restricted\" documents that open in\r\n * any viewer without a prompt but that pdf-lib refuses to load).\r\n *\r\n * pdf-lib's `ignoreEncryption` option parses the file structure but leaves\r\n * every stream and string encrypted — anything we then bake into the PDF is\r\n * written unencrypted into a file that still declares `/Encrypt`, which\r\n * renders as garbage. The only safe way to ingest these documents is to\r\n * actually decrypt them once, up front, and drop `/Encrypt`.\r\n *\r\n * Supported schemes (ISO 32000): RC4 40..128-bit (V1/V2, R2..R3),\r\n * crypt filters with RC4 or AES-128 (V4, R4), and AES-256 (V5, R5/R6).\r\n * WebCrypto supplies SHA-2/AES; MD5 and RC4 (absent from WebCrypto) are\r\n * implemented inline.\r\n *\r\n * PERMISSIONS: decrypting drops `/Encrypt`, and with it the author's\r\n * permission bits (`/P` — no-print, no-copy, no-modify). Any artifact derived\r\n * from a restricted source therefore carries no restrictions. That is a\r\n * deliberate, accepted trade, and a fact about the products built on this\r\n * module rather than an implementation detail: pdf-lib cannot write an\r\n * encrypted document, so the alternatives are an unrestricted output or no\r\n * output at all. Asserted as intended behaviour by consumers — see\r\n * `review-pdf-derivation.test.ts` in `@signiphi/pdf-signer`\r\n * (`out.isEncrypted === false`).\r\n *\r\n * THIS IS THE ONLY COPY. It previously existed as three hand-synced copies in\r\n * `@signiphi/pdf-signer`, `@signiphi/page-assembly` and\r\n * `@signiphi/document-prepare`, which had already drifted (different error\r\n * base classes, different loggers, `!` assertions in one of them) and made a\r\n * cipher fix three pull requests. Those packages now re-export from here.\r\n * Keep it that way: a fourth copy re-creates the drift this package exists to\r\n * end.\r\n *\r\n * `noUncheckedIndexedAccess` is ON in this package's tsconfig, so the `!`\r\n * assertions on typed-array reads below are load-bearing documentation. Every\r\n * asserted index is provably in bounds — fixed 16/64-entry tables and\r\n * `& 0xff`-masked RC4 state.\r\n *\r\n * CATCHING `PdfPasswordRequiredError` ACROSS PACKAGES: still do it by `code`,\r\n * not by `instanceof` — use {@link isPdfPasswordRequiredError}. One source copy\r\n * does NOT mean one runtime class. Each consuming package *bundles* this module\r\n * rather than importing it at runtime, and it has to: the parser below walks\r\n * pdf-lib objects created by the caller and dispatches on `instanceof PDFDict`\r\n * / `PDFRef` / `PDFRawStream`, so this module and its caller must share a\r\n * single pdf-lib instance. Consumers bundle their own pdf-lib, so bundling this\r\n * module with them is what guarantees that; leaving it external would hand it a\r\n * second pdf-lib whose classes match nothing it is given. The cost of that\r\n * choice is one copy of this class per consuming bundle, so `instanceof` stays\r\n * copy-specific — as does the `DocumentPrepareError` subclass that\r\n * `@signiphi/document-prepare` deliberately translates to at its own boundary,\r\n * to keep its documented error contract.\r\n *\r\n * What the single source copy buys is therefore maintenance, not identity: one\r\n * implementation, one test suite, one fixture, and a cipher fix that is one\r\n * pull request instead of three.\r\n */\r\nimport {\r\n PDFArray,\r\n PDFBool,\r\n PDFDict,\r\n PDFDocument,\r\n PDFHexString,\r\n PDFInvalidObject,\r\n PDFName,\r\n PDFNumber,\r\n PDFObject,\r\n PDFObjectParser,\r\n PDFObjectStreamParser,\r\n PDFRawStream,\r\n PDFRef,\r\n PDFString,\r\n} from 'pdf-lib';\r\n\r\n/**\r\n * Minimal sink for the one informational message this module emits. Each\r\n * consuming package passes its own logger so the line lands in that package's\r\n * log stream with its own prefix and level gating.\r\n */\r\nexport interface PdfCryptoLogger {\r\n info(message: string, ...args: unknown[]): void;\r\n}\r\n\r\nexport interface PdfDecryptOptions {\r\n /** Where to report that an encrypted document was detected. Default: silent. */\r\n logger?: PdfCryptoLogger;\r\n}\r\n\r\nexport class PdfPasswordRequiredError extends Error {\r\n code = 'PDF_PASSWORD_REQUIRED';\r\n recoverable = true;\r\n userMessage: string;\r\n constructor() {\r\n const message = 'This PDF is password-protected. Please remove the password and upload it again.';\r\n super(message);\r\n this.name = 'PdfPasswordRequiredError';\r\n this.userMessage = message;\r\n }\r\n}\r\n\r\nexport class UnsupportedPdfEncryptionError extends Error {\r\n /**\r\n * The scheme that is not supported, e.g. `'V5 /R6'` — the same string that is\r\n * interpolated into `message`. Kept as its own field so a package boundary\r\n * that re-wraps this error in its own type (`@signiphi/document-prepare`\r\n * does, to keep everything it throws a `DocumentPrepareError`) can rebuild it\r\n * without regex-parsing the message back apart.\r\n */\r\n readonly detail: string;\r\n constructor(detail: string) {\r\n super(`This PDF uses an unsupported encryption scheme (${detail}).`);\r\n this.name = 'UnsupportedPdfEncryptionError';\r\n this.detail = detail;\r\n }\r\n}\r\n\r\n/**\r\n * The portable \"does this PDF need a password?\" check.\r\n *\r\n * Prefer this over `instanceof PdfPasswordRequiredError` in any code that\r\n * spans package boundaries: `@signiphi/document-prepare` re-throws a\r\n * `DocumentPrepareError` subclass to preserve its own error contract, and a\r\n * host app may have more than one copy of this package resolved. The `code`\r\n * field is stable across all of them.\r\n */\r\nexport function isPdfPasswordRequiredError(error: unknown): boolean {\r\n return (\r\n typeof error === 'object' &&\r\n error !== null &&\r\n (error as { code?: unknown }).code === 'PDF_PASSWORD_REQUIRED'\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Crypto primitives\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction concatBytes(...parts: Uint8Array[]): Uint8Array {\r\n let total = 0;\r\n for (const p of parts) total += p.length;\r\n const out = new Uint8Array(total);\r\n let offset = 0;\r\n for (const p of parts) {\r\n out.set(p, offset);\r\n offset += p.length;\r\n }\r\n return out;\r\n}\r\n\r\nconst MD5_S = [\r\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\r\n 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\r\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\r\n 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\r\n];\r\n\r\nconst MD5_K = (() => {\r\n const k = new Uint32Array(64);\r\n for (let i = 0; i < 64; i++) k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 0x100000000);\r\n return k;\r\n})();\r\n\r\n/** WebCrypto has no MD5, but the standard security handler requires it. */\r\nfunction md5(input: Uint8Array): Uint8Array {\r\n const bitLen = input.length * 8;\r\n const paddedLen = (((input.length + 8) >> 6) + 1) << 6;\r\n const buf = new Uint8Array(paddedLen);\r\n buf.set(input);\r\n buf[input.length] = 0x80;\r\n const dv = new DataView(buf.buffer);\r\n dv.setUint32(paddedLen - 8, bitLen >>> 0, true);\r\n dv.setUint32(paddedLen - 4, Math.floor(bitLen / 0x100000000), true);\r\n\r\n let a0 = 0x67452301;\r\n let b0 = 0xefcdab89;\r\n let c0 = 0x98badcfe;\r\n let d0 = 0x10325476;\r\n const M = new Uint32Array(16);\r\n\r\n for (let offset = 0; offset < paddedLen; offset += 64) {\r\n for (let i = 0; i < 16; i++) M[i] = dv.getUint32(offset + i * 4, true);\r\n let A = a0;\r\n let B = b0;\r\n let C = c0;\r\n let D = d0;\r\n for (let i = 0; i < 64; i++) {\r\n let F: number;\r\n let g: number;\r\n if (i < 16) {\r\n F = (B & C) | (~B & D);\r\n g = i;\r\n } else if (i < 32) {\r\n F = (D & B) | (~D & C);\r\n g = (5 * i + 1) & 15;\r\n } else if (i < 48) {\r\n F = B ^ C ^ D;\r\n g = (3 * i + 5) & 15;\r\n } else {\r\n F = C ^ (B | ~D);\r\n g = (7 * i) & 15;\r\n }\r\n const tmp = D;\r\n D = C;\r\n C = B;\r\n const x = (A + F + MD5_K[i]! + M[g]!) | 0;\r\n const s = MD5_S[i]!;\r\n B = (B + ((x << s) | (x >>> (32 - s)))) | 0;\r\n A = tmp;\r\n }\r\n a0 = (a0 + A) | 0;\r\n b0 = (b0 + B) | 0;\r\n c0 = (c0 + C) | 0;\r\n d0 = (d0 + D) | 0;\r\n }\r\n\r\n const out = new Uint8Array(16);\r\n const ov = new DataView(out.buffer);\r\n ov.setUint32(0, a0 >>> 0, true);\r\n ov.setUint32(4, b0 >>> 0, true);\r\n ov.setUint32(8, c0 >>> 0, true);\r\n ov.setUint32(12, d0 >>> 0, true);\r\n return out;\r\n}\r\n\r\nfunction rc4(key: Uint8Array, data: Uint8Array): Uint8Array {\r\n const S = new Uint8Array(256);\r\n for (let i = 0; i < 256; i++) S[i] = i;\r\n let j = 0;\r\n for (let i = 0; i < 256; i++) {\r\n j = (j + S[i]! + key[i % key.length]!) & 0xff;\r\n const t = S[i]!;\r\n S[i] = S[j]!;\r\n S[j] = t;\r\n }\r\n const out = new Uint8Array(data.length);\r\n let i = 0;\r\n j = 0;\r\n for (let k = 0; k < data.length; k++) {\r\n i = (i + 1) & 0xff;\r\n j = (j + S[i]!) & 0xff;\r\n const t = S[i]!;\r\n S[i] = S[j]!;\r\n S[j] = t;\r\n out[k] = data[k]! ^ S[(S[i]! + S[j]!) & 0xff]!;\r\n }\r\n return out;\r\n}\r\n\r\nfunction getSubtle(): SubtleCrypto {\r\n const subtle = globalThis.crypto?.subtle;\r\n if (!subtle) throw new UnsupportedPdfEncryptionError('WebCrypto is unavailable in this environment');\r\n return subtle;\r\n}\r\n\r\nasync function sha2(algorithm: 'SHA-256' | 'SHA-384' | 'SHA-512', data: Uint8Array): Promise<Uint8Array> {\r\n return new Uint8Array(await getSubtle().digest(algorithm, data as BufferSource));\r\n}\r\n\r\nasync function importAesKey(rawKey: Uint8Array, usages: KeyUsage[]): Promise<CryptoKey> {\r\n return getSubtle().importKey('raw', rawKey as BufferSource, 'AES-CBC', false, usages);\r\n}\r\n\r\n/** AES-CBC encrypt without padding: WebCrypto appends a PKCS#7 block; drop it. */\r\nasync function aesCbcEncryptNoPad(rawKey: Uint8Array, iv: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\r\n const key = await importAesKey(rawKey, ['encrypt']);\r\n const out = new Uint8Array(await getSubtle().encrypt({ name: 'AES-CBC', iv: iv as BufferSource }, key, data as BufferSource));\r\n return out.slice(0, data.length);\r\n}\r\n\r\n/**\r\n * AES-CBC decrypt without padding. WebCrypto insists on valid PKCS#7, so we\r\n * append one deliberately-valid padding block (the encryption, chained off\r\n * the final ciphertext block, of an empty plaintext) and let WebCrypto strip\r\n * exactly that block — recovering all `data.length` plaintext bytes.\r\n */\r\nasync function aesCbcDecryptNoPad(rawKey: Uint8Array, iv: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\r\n const key = await importAesKey(rawKey, ['encrypt', 'decrypt']);\r\n const lastBlock = data.slice(data.length - 16);\r\n const padBlock = new Uint8Array(\r\n await getSubtle().encrypt({ name: 'AES-CBC', iv: lastBlock as BufferSource }, key, new Uint8Array(0)),\r\n );\r\n const joined = concatBytes(data, padBlock);\r\n return new Uint8Array(await getSubtle().decrypt({ name: 'AES-CBC', iv: iv as BufferSource }, key, joined as BufferSource));\r\n}\r\n\r\n/** Decrypt AESV2/AESV3 payload data: 16-byte IV prefix + CBC ciphertext + PKCS#7. */\r\nasync function aesDecryptPdfData(rawKey: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\r\n if (data.length < 32) return new Uint8Array(0); // no room for IV + one block\r\n const iv = data.slice(0, 16);\r\n let ct = data.slice(16);\r\n if (ct.length % 16 !== 0) ct = ct.slice(0, ct.length - (ct.length % 16));\r\n try {\r\n const key = await importAesKey(rawKey, ['decrypt']);\r\n return new Uint8Array(await getSubtle().decrypt({ name: 'AES-CBC', iv: iv as BufferSource }, key, ct as BufferSource));\r\n } catch {\r\n // Some producers write broken PKCS#7 padding; decrypt raw and strip manually.\r\n const plain = await aesCbcDecryptNoPad(rawKey, iv, ct);\r\n const padLen = plain[plain.length - 1]!;\r\n return padLen >= 1 && padLen <= 16 ? plain.slice(0, plain.length - padLen) : plain;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Standard security handler — password verification & key derivation\r\n// ---------------------------------------------------------------------------\r\n\r\nconst PAD = new Uint8Array([\r\n 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56,\r\n 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,\r\n 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a,\r\n]);\r\n\r\n/** Constant-time comparison (XOR-accumulate, no early exit) so unequal bytes\r\n * don't leak a timing signal. Defence-in-depth — not exploitable here. */\r\nconst bytesEqual = (a: Uint8Array, b: Uint8Array): boolean => {\r\n if (a.length !== b.length) return false;\r\n let diff = 0;\r\n for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!;\r\n return diff === 0;\r\n};\r\n\r\ninterface LegacyEncryptParams {\r\n revision: number;\r\n keyLen: number;\r\n O: Uint8Array;\r\n U: Uint8Array;\r\n P: number;\r\n id0: Uint8Array;\r\n encryptMetadata: boolean;\r\n}\r\n\r\n/** Algorithm 2: file key from a padded password. */\r\nfunction legacyFileKey(paddedPwd: Uint8Array, params: LegacyEncryptParams): Uint8Array {\r\n const { revision, keyLen, O, P, id0, encryptMetadata } = params;\r\n const pBytes = new Uint8Array(4);\r\n new DataView(pBytes.buffer).setInt32(0, P | 0, true);\r\n const parts = [paddedPwd, O.slice(0, 32), pBytes, id0];\r\n if (revision >= 4 && !encryptMetadata) parts.push(new Uint8Array([0xff, 0xff, 0xff, 0xff]));\r\n let h = md5(concatBytes(...parts));\r\n if (revision >= 3) for (let i = 0; i < 50; i++) h = md5(h.slice(0, keyLen));\r\n return h.slice(0, keyLen);\r\n}\r\n\r\n/** Algorithms 4/5: the /U value that a given file key implies. */\r\nfunction legacyComputeU(fileKey: Uint8Array, revision: number, id0: Uint8Array): Uint8Array {\r\n if (revision === 2) return rc4(fileKey, PAD);\r\n let d = md5(concatBytes(PAD, id0));\r\n d = rc4(fileKey, d);\r\n for (let i = 1; i <= 19; i++) d = rc4(fileKey.map((b) => b ^ i), d);\r\n return d;\r\n}\r\n\r\nfunction legacyUMatches(fileKey: Uint8Array, params: LegacyEncryptParams): boolean {\r\n const computed = legacyComputeU(fileKey, params.revision, params.id0);\r\n return params.revision === 2\r\n ? bytesEqual(computed, params.U.slice(0, 32))\r\n : bytesEqual(computed.slice(0, 16), params.U.slice(0, 16));\r\n}\r\n\r\n/**\r\n * Verify the EMPTY user password (Algorithm 6) and return the file\r\n * encryption key. Anything else — including files whose owner password\r\n * happens to be empty while the user password is not — throws\r\n * {@link PdfPasswordRequiredError}: those documents prompt in viewers, and\r\n * opening them via owner-password recovery would exceed this module's\r\n * documented no-prompt scope.\r\n */\r\nfunction legacyAuthenticateEmptyPassword(params: LegacyEncryptParams): Uint8Array {\r\n const userKey = legacyFileKey(PAD, params);\r\n if (legacyUMatches(userKey, params)) return userKey;\r\n throw new PdfPasswordRequiredError();\r\n}\r\n\r\n/** ISO 32000-2 Algorithm 2.B iterated hash (revision 6). */\r\nasync function hash2B(password: Uint8Array, salt: Uint8Array, udata: Uint8Array): Promise<Uint8Array> {\r\n let k = await sha2('SHA-256', concatBytes(password, salt, udata));\r\n let e: Uint8Array = new Uint8Array(0);\r\n let i = 0;\r\n do {\r\n const block = concatBytes(password, k, udata);\r\n const k1 = new Uint8Array(block.length * 64);\r\n for (let rep = 0; rep < 64; rep++) k1.set(block, rep * block.length);\r\n e = await aesCbcEncryptNoPad(k.slice(0, 16), k.slice(16, 32), k1);\r\n let sum = 0;\r\n for (let b = 0; b < 16; b++) sum += e[b]!;\r\n const mod = sum % 3;\r\n k = await sha2(mod === 0 ? 'SHA-256' : mod === 1 ? 'SHA-384' : 'SHA-512', e);\r\n i++;\r\n } while (i < 64 || e[e.length - 1]! > i - 32);\r\n return k.slice(0, 32);\r\n}\r\n\r\n/**\r\n * AES-256 (V5, R5/R6) empty USER password authentication per Algorithm 2.A.\r\n * Returns the 32-byte file encryption key from /UE.\r\n */\r\nasync function v5AuthenticateEmptyPassword(\r\n revision: number,\r\n U: Uint8Array,\r\n UE: Uint8Array,\r\n): Promise<Uint8Array> {\r\n const pwd = new Uint8Array(0);\r\n const zeroIv = new Uint8Array(16);\r\n const hash = async (salt: Uint8Array, udata: Uint8Array) =>\r\n revision === 5 ? sha2('SHA-256', concatBytes(pwd, salt, udata)) : hash2B(pwd, salt, udata);\r\n\r\n const userHash = await hash(U.slice(32, 40), new Uint8Array(0));\r\n if (bytesEqual(userHash, U.slice(0, 32))) {\r\n const intermediate = await hash(U.slice(40, 48), new Uint8Array(0));\r\n return aesCbcDecryptNoPad(intermediate, zeroIv, UE.slice(0, 32));\r\n }\r\n\r\n // No owner-password recovery: a file that fails empty USER password\r\n // validation prompts in viewers and is out of this module's no-prompt\r\n // scope, even when its owner password happens to be empty.\r\n throw new PdfPasswordRequiredError();\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Cipher selection\r\n// ---------------------------------------------------------------------------\r\n\r\ntype ObjectCipher = (data: Uint8Array, ref: PDFRef) => Promise<Uint8Array>;\r\n\r\ninterface DocumentCiphers {\r\n stringCipher: ObjectCipher;\r\n streamCipher: ObjectCipher;\r\n encryptMetadata: boolean;\r\n}\r\n\r\nconst identityCipher: ObjectCipher = async (data) => data;\r\n\r\nfunction rc4ObjectCipher(fileKey: Uint8Array): ObjectCipher {\r\n return async (data, ref) => {\r\n const ext = new Uint8Array([\r\n ref.objectNumber & 0xff,\r\n (ref.objectNumber >> 8) & 0xff,\r\n (ref.objectNumber >> 16) & 0xff,\r\n ref.generationNumber & 0xff,\r\n (ref.generationNumber >> 8) & 0xff,\r\n ]);\r\n const key = md5(concatBytes(fileKey, ext)).slice(0, Math.min(fileKey.length + 5, 16));\r\n return rc4(key, data);\r\n };\r\n}\r\n\r\nconst AES_SALT = new Uint8Array([0x73, 0x41, 0x6c, 0x54]); // 'sAlT'\r\n\r\nfunction aes128ObjectCipher(fileKey: Uint8Array): ObjectCipher {\r\n return async (data, ref) => {\r\n const ext = new Uint8Array([\r\n ref.objectNumber & 0xff,\r\n (ref.objectNumber >> 8) & 0xff,\r\n (ref.objectNumber >> 16) & 0xff,\r\n ref.generationNumber & 0xff,\r\n (ref.generationNumber >> 8) & 0xff,\r\n ]);\r\n const key = md5(concatBytes(fileKey, ext, AES_SALT)).slice(0, 16);\r\n return aesDecryptPdfData(key, data);\r\n };\r\n}\r\n\r\nfunction aes256ObjectCipher(fileKey: Uint8Array): ObjectCipher {\r\n return async (data) => aesDecryptPdfData(fileKey, data);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// /Encrypt dictionary parsing\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction dictNumber(dict: PDFDict, key: string): number | undefined {\r\n const value = dict.lookup(PDFName.of(key));\r\n return value instanceof PDFNumber ? value.asNumber() : undefined;\r\n}\r\n\r\nfunction dictBytes(dict: PDFDict, key: string): Uint8Array | undefined {\r\n const value = dict.lookup(PDFName.of(key));\r\n return value instanceof PDFString || value instanceof PDFHexString ? value.asBytes() : undefined;\r\n}\r\n\r\nasync function buildDocumentCiphers(encDict: PDFDict, id0: Uint8Array): Promise<DocumentCiphers> {\r\n const filter = encDict.lookup(PDFName.of('Filter'));\r\n if (filter !== PDFName.of('Standard')) {\r\n throw new UnsupportedPdfEncryptionError(`security handler ${String(filter)}`);\r\n }\r\n\r\n const V = dictNumber(encDict, 'V') ?? 0;\r\n const R = dictNumber(encDict, 'R') ?? 0;\r\n const O = dictBytes(encDict, 'O');\r\n const U = dictBytes(encDict, 'U');\r\n const P = dictNumber(encDict, 'P') ?? -1;\r\n const metadataValue = encDict.lookup(PDFName.of('EncryptMetadata'));\r\n const encryptMetadata = metadataValue instanceof PDFBool ? metadataValue.asBoolean() : true;\r\n if (!O || !U) throw new UnsupportedPdfEncryptionError('missing /O or /U');\r\n\r\n if (V === 1 || V === 2) {\r\n const keyLen = V === 1 ? 5 : (dictNumber(encDict, 'Length') ?? 40) / 8;\r\n const fileKey = legacyAuthenticateEmptyPassword({ revision: R, keyLen, O, U, P, id0, encryptMetadata });\r\n const cipher = rc4ObjectCipher(fileKey);\r\n return { stringCipher: cipher, streamCipher: cipher, encryptMetadata };\r\n }\r\n\r\n if (V === 4 || V === 5) {\r\n const cf = encDict.lookup(PDFName.of('CF'));\r\n const cfmOf = (filterKey: string): PDFName | undefined => {\r\n const streamFilter = encDict.lookup(PDFName.of(filterKey));\r\n if (!(streamFilter instanceof PDFName) || streamFilter === PDFName.of('Identity')) return undefined;\r\n if (!(cf instanceof PDFDict)) throw new UnsupportedPdfEncryptionError('missing /CF');\r\n const cfDict = cf.lookup(streamFilter);\r\n if (!(cfDict instanceof PDFDict)) throw new UnsupportedPdfEncryptionError(`missing crypt filter ${streamFilter.toString()}`);\r\n const cfm = cfDict.lookup(PDFName.of('CFM'));\r\n return cfm instanceof PDFName ? cfm : undefined;\r\n };\r\n\r\n let fileKey: Uint8Array;\r\n if (V === 5) {\r\n const UE = dictBytes(encDict, 'UE');\r\n if (!UE) throw new UnsupportedPdfEncryptionError('missing /UE');\r\n fileKey = await v5AuthenticateEmptyPassword(R, U, UE);\r\n } else {\r\n // V4: the file key length is declared by the standard crypt filter's\r\n // /Length (bytes per spec, bits from some producers), falling back to\r\n // the top-level /Length, then to the V4 default of 128-bit. Defaulting\r\n // to 40-bit here would derive a wrong key and misreport a perfectly\r\n // openable document as password-protected.\r\n const cryptFilterLengthBits = (): number | undefined => {\r\n if (!(cf instanceof PDFDict)) return undefined;\r\n for (const filterKey of ['StmF', 'StrF']) {\r\n const filter = encDict.lookup(PDFName.of(filterKey));\r\n if (!(filter instanceof PDFName) || filter === PDFName.of('Identity')) continue;\r\n const cfDict = cf.lookup(filter);\r\n if (!(cfDict instanceof PDFDict)) continue;\r\n const len = dictNumber(cfDict, 'Length');\r\n if (len === undefined) continue;\r\n return len < 40 ? len * 8 : len;\r\n }\r\n return undefined;\r\n };\r\n const keyLenBits = cryptFilterLengthBits() ?? dictNumber(encDict, 'Length') ?? 128;\r\n fileKey = legacyAuthenticateEmptyPassword({\r\n revision: R,\r\n keyLen: keyLenBits / 8,\r\n O,\r\n U,\r\n P,\r\n id0,\r\n encryptMetadata,\r\n });\r\n }\r\n\r\n const cipherFor = (cfm: PDFName | undefined): ObjectCipher => {\r\n if (!cfm || cfm === PDFName.of('Identity')) return identityCipher;\r\n if (cfm === PDFName.of('V2')) return rc4ObjectCipher(fileKey);\r\n if (cfm === PDFName.of('AESV2')) return aes128ObjectCipher(fileKey);\r\n if (cfm === PDFName.of('AESV3')) return aes256ObjectCipher(fileKey);\r\n throw new UnsupportedPdfEncryptionError(`crypt filter method ${cfm.toString()}`);\r\n };\r\n\r\n return {\r\n streamCipher: cipherFor(cfmOf('StmF')),\r\n stringCipher: cipherFor(cfmOf('StrF')),\r\n encryptMetadata,\r\n };\r\n }\r\n\r\n throw new UnsupportedPdfEncryptionError(`/V ${V}`);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Document walk\r\n// ---------------------------------------------------------------------------\r\n\r\nconst toHexString = (bytes: Uint8Array): PDFHexString => {\r\n let hex = '';\r\n for (let i = 0; i < bytes.length; i++) hex += bytes[i]!.toString(16).padStart(2, '0');\r\n return new PDFHexString(hex.toUpperCase());\r\n};\r\n\r\nfunction filterIncludesCrypt(dict: PDFDict): boolean {\r\n const filter = dict.lookup(PDFName.of('Filter'));\r\n if (filter === PDFName.of('Crypt')) return true;\r\n if (filter instanceof PDFArray) {\r\n for (let i = 0; i < filter.size(); i++) {\r\n if (filter.get(i) === PDFName.of('Crypt')) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Whether a /Crypt-filtered stream names the Identity filter (the default\r\n * when /DecodeParms carries no /Name) — i.e. the stream bytes are NOT\r\n * encrypted and must pass through untouched. Any other named filter means\r\n * selective encryption, which this module does not implement.\r\n */\r\nfunction cryptFilterIsIdentity(dict: PDFDict): boolean {\r\n const parms =\r\n dict.lookup(PDFName.of('DecodeParms')) ?? dict.lookup(PDFName.of('DP'));\r\n const identityParms = (p: unknown): boolean => {\r\n if (!(p instanceof PDFDict)) return true;\r\n const name = p.lookup(PDFName.of('Name'));\r\n return !(name instanceof PDFName) || name === PDFName.of('Identity');\r\n };\r\n if (parms instanceof PDFArray) {\r\n for (let i = 0; i < parms.size(); i++) {\r\n if (!identityParms(parms.lookup(i))) return false;\r\n }\r\n return true;\r\n }\r\n return identityParms(parms);\r\n}\r\n\r\n/** Decrypt every string reachable through direct children of `obj`. */\r\nasync function decryptStringsWithin(\r\n obj: PDFObject,\r\n ref: PDFRef,\r\n stringCipher: ObjectCipher,\r\n): Promise<void> {\r\n if (obj instanceof PDFDict) {\r\n // Signature /Contents values are excluded from encryption by spec.\r\n const isSignature = obj.lookup(PDFName.of('Type')) === PDFName.of('Sig');\r\n for (const [key, value] of obj.entries()) {\r\n if (value instanceof PDFString || value instanceof PDFHexString) {\r\n if (isSignature && key === PDFName.of('Contents')) continue;\r\n obj.set(key, toHexString(await stringCipher(value.asBytes(), ref)));\r\n } else {\r\n await decryptStringsWithin(value, ref, stringCipher);\r\n }\r\n }\r\n } else if (obj instanceof PDFArray) {\r\n for (let i = 0; i < obj.size(); i++) {\r\n const value = obj.get(i);\r\n if (value instanceof PDFString || value instanceof PDFHexString) {\r\n obj.set(i, toHexString(await stringCipher(value.asBytes(), ref)));\r\n } else {\r\n await decryptStringsWithin(value, ref, stringCipher);\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function decryptLoadedDocument(doc: PDFDocument): Promise<Uint8Array> {\r\n const context = doc.context;\r\n const encryptRef = context.trailerInfo.Encrypt;\r\n const encDict = context.lookup(encryptRef);\r\n if (!(encDict instanceof PDFDict)) {\r\n throw new UnsupportedPdfEncryptionError('malformed /Encrypt dictionary');\r\n }\r\n\r\n const idArray = context.lookup(context.trailerInfo.ID);\r\n const idFirst = idArray instanceof PDFArray ? idArray.get(0) : undefined;\r\n const id0 =\r\n idFirst instanceof PDFString || idFirst instanceof PDFHexString\r\n ? idFirst.asBytes()\r\n : new Uint8Array(0);\r\n\r\n const { stringCipher, streamCipher, encryptMetadata } = await buildDocumentCiphers(encDict, id0);\r\n\r\n // Object streams (/Type /ObjStm) hold compressed member objects (typically\r\n // the catalog, page tree and info dict in Acrobat/Office output). pdf-lib's\r\n // load expands them eagerly, fails on the still-encrypted bytes, and its\r\n // recovery keeps each container only as a PDFInvalidObject blob (dict +\r\n // ciphertext, header stripped) while silently dropping every member.\r\n // Re-parse those blobs into proper raw streams so the decryption walk can\r\n // process them, then expand the decrypted members back into the context.\r\n for (const [ref, obj] of context.enumerateIndirectObjects()) {\r\n if (!(obj instanceof PDFInvalidObject)) continue;\r\n const raw = new Uint8Array(obj.sizeInBytes());\r\n obj.copyBytesInto(raw, 0);\r\n try {\r\n const parsed = PDFObjectParser.forBytes(raw, context).parseObject();\r\n if (\r\n parsed instanceof PDFRawStream &&\r\n parsed.dict.lookup(PDFName.of('Type')) === PDFName.of('ObjStm')\r\n ) {\r\n context.assign(ref, parsed);\r\n }\r\n } catch {\r\n // Not a recoverable stream object — leave the blob untouched.\r\n }\r\n }\r\n\r\n const decryptedObjectStreams: Array<[PDFRef, PDFRawStream]> = [];\r\n const structuralStreamRefs: PDFRef[] = [];\r\n\r\n for (const [ref, obj] of context.enumerateIndirectObjects()) {\r\n if (ref === encryptRef || obj === encDict) continue;\r\n\r\n if (obj instanceof PDFRawStream) {\r\n const type = obj.dict.lookup(PDFName.of('Type'));\r\n if (type === PDFName.of('XRef')) {\r\n // Cross-reference streams are never encrypted (ISO 32000 7.5.8.2),\r\n // including the /ID strings in their dict — leave them untouched and\r\n // drop the stale container below (the save rebuilds the xref).\r\n structuralStreamRefs.push(ref);\r\n continue;\r\n }\r\n const isSkippedMetadata = !encryptMetadata && type === PDFName.of('Metadata');\r\n if (filterIncludesCrypt(obj.dict)) {\r\n // Identity /Crypt streams are unencrypted by definition — pass them\r\n // through. Any OTHER named crypt filter is selective encryption we\r\n // do not implement; skipping it silently and then deleting /Encrypt\r\n // would emit permanently corrupt output, so fail loudly instead.\r\n if (!cryptFilterIsIdentity(obj.dict)) {\r\n throw new UnsupportedPdfEncryptionError('stream-specific /Crypt filter');\r\n }\r\n } else if (!isSkippedMetadata) {\r\n const decrypted = await streamCipher(obj.contents, ref);\r\n const replacement = PDFRawStream.of(obj.dict, decrypted);\r\n context.assign(ref, replacement);\r\n if (type === PDFName.of('ObjStm')) {\r\n decryptedObjectStreams.push([ref, replacement]);\r\n }\r\n }\r\n await decryptStringsWithin(obj.dict, ref, stringCipher);\r\n } else if (obj instanceof PDFString || obj instanceof PDFHexString) {\r\n context.assign(ref, toHexString(await stringCipher(obj.asBytes(), ref)));\r\n } else {\r\n await decryptStringsWithin(obj, ref, stringCipher);\r\n }\r\n }\r\n\r\n // Expand decrypted object streams. Members are already plaintext (an object\r\n // stream is encrypted only as a whole; ISO 32000 7.5.7 forbids encrypting\r\n // its contents individually), so no further decryption is applied to them.\r\n for (const [ref, stream] of decryptedObjectStreams) {\r\n await PDFObjectStreamParser.forStream(stream).parseIntoContext();\r\n context.delete(ref);\r\n }\r\n for (const ref of structuralStreamRefs) context.delete(ref);\r\n\r\n delete context.trailerInfo.Encrypt;\r\n if (encryptRef instanceof PDFRef) context.delete(encryptRef);\r\n\r\n // Plain context serialization: `addDefaultPage`/`updateFieldAppearances`\r\n // walk `doc.catalog`, which was captured as undefined when the catalog\r\n // still lived in an encrypted object stream — and a decryptor must not\r\n // mutate the document anyway.\r\n return doc.save({\r\n useObjectStreams: false,\r\n addDefaultPage: false,\r\n updateFieldAppearances: false,\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Public API\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Decrypt an encrypted PDF that opens with an empty user password.\r\n * Returns re-saved, fully decrypted bytes with `/Encrypt` removed.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport async function decryptPdf(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n const doc = await PDFDocument.load(pdfBytes.slice(), {\r\n ignoreEncryption: true,\r\n updateMetadata: false,\r\n });\r\n if (!doc.isEncrypted) return pdfBytes;\r\n return decryptLoadedDocument(doc);\r\n}\r\n\r\nconst SLASH = 0x2f; // '/'\r\nconst HASH = 0x23; // '#'\r\nconst ENCRYPT_NAME = 'Encrypt';\r\n\r\n/** Hex digit value, or -1 for anything that is not one. */\r\nfunction hexDigit(byte: number | undefined): number {\r\n if (byte === undefined) return -1;\r\n if (byte >= 0x30 && byte <= 0x39) return byte - 0x30; // 0-9\r\n if (byte >= 0x41 && byte <= 0x46) return byte - 0x41 + 10; // A-F\r\n if (byte >= 0x61 && byte <= 0x66) return byte - 0x61 + 10; // a-f\r\n return -1;\r\n}\r\n\r\n/**\r\n * Matches the name `Encrypt` starting at `start` (just past the `/`), treating\r\n * `#hh` as the character it encodes.\r\n *\r\n * ISO 32000 §7.3.5 lets any character in a name be written as `#` followed by\r\n * two hex digits, so `/Encryp#74`, `/#45ncrypt` and `/#45#6e#63#72#79#70#74`\r\n * are all the same key as `/Encrypt`. A literal byte-substring search misses\r\n * those spellings, and since this function is only a pre-filter, a miss means\r\n * `normalizePdfEncryption` returns the document untouched and the caller's\r\n * `PDFDocument.load` throws `EncryptedPDFError` — precisely the failure the\r\n * gate exists to prevent. Rare from real producers, cheap to be correct about.\r\n */\r\nfunction matchesEncryptNameAt(bytes: Uint8Array, start: number): boolean {\r\n let at = start;\r\n for (let k = 0; k < ENCRYPT_NAME.length; k++) {\r\n const want = ENCRYPT_NAME.charCodeAt(k);\r\n const byte = bytes[at];\r\n if (byte === want) {\r\n at += 1;\r\n continue;\r\n }\r\n if (byte === HASH) {\r\n const high = hexDigit(bytes[at + 1]);\r\n const low = hexDigit(bytes[at + 2]);\r\n if (high >= 0 && low >= 0 && ((high << 4) | low) === want) {\r\n at += 3;\r\n continue;\r\n }\r\n }\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction containsEncryptMarker(bytes: Uint8Array): boolean {\r\n for (let i = 0; i < bytes.length; i++) {\r\n // Cheap reject for the overwhelming majority of bytes.\r\n if (bytes[i] !== SLASH) continue;\r\n if (matchesEncryptNameAt(bytes, i + 1)) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Ingestion gate: returns the bytes untouched for regular PDFs, and a\r\n * decrypted re-save for encrypted ones so every downstream `PDFDocument.load`\r\n * (page assembly, review derivation, markup embedding, field extraction,\r\n * signing) sees a normal document.\r\n *\r\n * Permission-restricted PDFs (standard handler, empty user password) render\r\n * fine in every viewer and in PDF.js, so they reach a workflow looking\r\n * completely ordinary — but pdf-lib throws `EncryptedPDFError` on load. Gating\r\n * at ingestion keeps that failure from surfacing deep inside a bake, where it\r\n * aborts the operation after the user has already committed to it.\r\n *\r\n * Returns the *same reference* when there is nothing to do, so callers can use\r\n * `result === input` to detect that no re-save happened.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport async function normalizePdfEncryption(\r\n pdfBytes: Uint8Array,\r\n options?: PdfDecryptOptions\r\n): Promise<Uint8Array> {\r\n // Cheap pre-filter: files with no '/Encrypt' key cannot be encrypted.\r\n if (!containsEncryptMarker(pdfBytes)) return pdfBytes;\r\n\r\n const doc = await PDFDocument.load(pdfBytes.slice(), {\r\n ignoreEncryption: true,\r\n updateMetadata: false,\r\n });\r\n if (!doc.isEncrypted) return pdfBytes;\r\n\r\n options?.logger?.info('[PDF_DECRYPT] Encrypted PDF detected during ingestion; decrypting');\r\n return decryptLoadedDocument(doc);\r\n}\r\n","/**\r\n * Re-export of `@signiphi/pdf-crypto`, which owns the PDF decryption\r\n * implementation (standard security handler, empty user password).\r\n *\r\n * This file used to hold a hand-synced copy of that module, one of three across\r\n * this monorepo. They had already drifted — different error base classes,\r\n * different loggers, `!` assertions in one of them — so a cipher fix was three\r\n * pull requests. The implementation now lives in one package; this module exists\r\n * only to bind it to this package's logging convention and to keep the import\r\n * paths and public API of `@signiphi/page-assembly` unchanged.\r\n *\r\n * The pdf.js cross-check that used to live in this package's\r\n * `__tests__/pdf-decrypt.test.ts` moved with the implementation. It is still the\r\n * only independent oracle proving the fixture encrypts spec-correctly — it just\r\n * runs in `@signiphi/pdf-crypto` now, in a `node` environment, against the one\r\n * remaining copy of the fixture.\r\n *\r\n * One source copy is NOT one runtime class: `@signiphi/pdf-crypto` is bundled\r\n * into this package rather than imported at runtime (it has to be — it walks\r\n * pdf-lib objects with `instanceof`, so it must share this package's pdf-lib\r\n * instance). A host app holding both this package and `@signiphi/pdf-signer`\r\n * therefore still has two `PdfPasswordRequiredError` classes, so\r\n * `isPdfPasswordRequiredError(err)` — an `err.code` check — remains the\r\n * comparison that holds across packages. `PageAssembler.tsx` catches its own\r\n * copy and is correct either way.\r\n *\r\n * DECLARATIONS: nothing below is written as `export … from\r\n * '@signiphi/pdf-crypto'`, and that is the point. Declaration emit preserves\r\n * module specifiers verbatim — `tsc` does, and so does the `dts: true` rollup\r\n * this package builds with — so a re-export puts `from '@signiphi/pdf-crypto'`\r\n * into the shipped `dist/index.d.ts`, at the entry point. That package is\r\n * deliberately unpublished, so a consumer's `node_modules` has nothing to\r\n * resolve it to. Without `skipLibCheck` that is a hard TS2307; with it the\r\n * error is suppressed and every symbol reached through that specifier quietly\r\n * degrades instead. The runtime is unaffected either way — tsup inlines the\r\n * implementation — so the leak is invisible until a consumer's editor stops\r\n * knowing what `decryptPdf` returns.\r\n *\r\n * So the public surface is re-declared locally and bound to the real\r\n * implementation through annotated `const`s. Those annotations are the drift\r\n * guard: if `@signiphi/pdf-crypto` ever changes a signature, drops\r\n * `userMessage`, or adds a required constructor argument, the assignment stops\r\n * compiling here rather than shipping a declaration that lies. Note the guard\r\n * reads `@signiphi/pdf-crypto`'s *built* `dist/index.d.ts`, not its source, so\r\n * it only fires once that package has been rebuilt — which is why every build\r\n * and publish path has to be topological (`--filter \"<pkg>...\"`).\r\n *\r\n * DO NOT move `@signiphi/pdf-crypto` from `devDependencies` to `dependencies`\r\n * on its own. tsup externalizes everything in `dependencies` and bundles\r\n * everything else, so that one-line move would turn this into a runtime import\r\n * resolving its own `pdf-lib` — a second set of `PDFDict`/`PDFRef` classes that\r\n * match none of the objects it is handed. Decryption would then silently skip\r\n * every object it should decrypt and emit a document with `/Encrypt` deleted\r\n * but the contents still enciphered: permanently corrupt output, no error\r\n * raised. The move is safe only alongside `noExternal:\r\n * ['@signiphi/pdf-crypto']` in `tsup.config.ts`, which restores the bundling,\r\n * and only once the package is actually published — an unresolvable\r\n * `dependencies` entry breaks `npm install` outright. Until someone decides to\r\n * publish it, the local declarations below are what keeps the shipped types\r\n * honest.\r\n */\r\nimport {\r\n decryptPdf as coreDecryptPdf,\r\n isPdfPasswordRequiredError as coreIsPdfPasswordRequiredError,\r\n normalizePdfEncryption as coreNormalizePdfEncryption,\r\n PdfPasswordRequiredError as CorePdfPasswordRequiredError,\r\n UnsupportedPdfEncryptionError as CoreUnsupportedPdfEncryptionError,\r\n} from '@signiphi/pdf-crypto';\r\n\r\n/** Sink for the one line the decryptor emits when it detects an encrypted document. */\r\nexport interface PdfCryptoLogger {\r\n info(message: string, ...args: unknown[]): void;\r\n}\r\n\r\nexport interface PdfDecryptOptions {\r\n /** Where to report that an encrypted document was detected. Default: silent. */\r\n logger?: PdfCryptoLogger;\r\n}\r\n\r\n/**\r\n * Thrown when the PDF needs a non-empty user password, which this package\r\n * cannot supply. Match it with {@link isPdfPasswordRequiredError} rather than\r\n * `instanceof` — see the header note on copies.\r\n */\r\nexport interface PdfPasswordRequiredError extends Error {\r\n /** Always `'PDF_PASSWORD_REQUIRED'`. The check that survives package boundaries. */\r\n code: string;\r\n recoverable: boolean;\r\n userMessage: string;\r\n}\r\ninterface PdfPasswordRequiredErrorConstructor {\r\n new (): PdfPasswordRequiredError;\r\n readonly prototype: PdfPasswordRequiredError;\r\n}\r\nexport const PdfPasswordRequiredError: PdfPasswordRequiredErrorConstructor =\r\n CorePdfPasswordRequiredError;\r\n\r\n/** Thrown for security handlers this decryptor does not implement. */\r\nexport interface UnsupportedPdfEncryptionError extends Error {\r\n /** Always `'UnsupportedPdfEncryptionError'`. */\r\n name: string;\r\n /** The scheme that is not supported, e.g. `'V5 /R6'`. */\r\n readonly detail: string;\r\n}\r\ninterface UnsupportedPdfEncryptionErrorConstructor {\r\n new (detail: string): UnsupportedPdfEncryptionError;\r\n readonly prototype: UnsupportedPdfEncryptionError;\r\n}\r\nexport const UnsupportedPdfEncryptionError: UnsupportedPdfEncryptionErrorConstructor =\r\n CoreUnsupportedPdfEncryptionError;\r\n\r\n/**\r\n * Decrypt an encrypted PDF that opens with an empty user password.\r\n * Returns re-saved, fully decrypted bytes with `/Encrypt` removed.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport const decryptPdf: (pdfBytes: Uint8Array) => Promise<Uint8Array> = coreDecryptPdf;\r\n\r\n/** The portable \"does this PDF need a password?\" check — an `err.code` test. */\r\nexport const isPdfPasswordRequiredError: (error: unknown) => boolean =\r\n coreIsPdfPasswordRequiredError;\r\n\r\n/**\r\n * This package has no logger module; it reports through `console` and silences\r\n * itself in production, which is what the copied implementation did inline.\r\n */\r\nconst consoleLogger: PdfCryptoLogger = {\r\n info(message: string, ...args: unknown[]): void {\r\n if (typeof process === 'undefined' || process.env?.NODE_ENV !== 'production') {\r\n // Keeps this package's original `[PageAssembler]` marker greppable\r\n // alongside the shared `[PDF_DECRYPT]` one the message now carries.\r\n console.info(`[PageAssembler] ${message}`, ...args);\r\n }\r\n },\r\n};\r\n\r\n/**\r\n * Ingestion gate — see `@signiphi/pdf-crypto`'s `normalizePdfEncryption`.\r\n * Returns the bytes untouched (same reference) for ordinary PDFs; decrypts and\r\n * re-saves encrypted ones so every downstream `PDFDocument.load` (page\r\n * assembly, field extraction) sees a normal document.\r\n *\r\n * @throws {PdfPasswordRequiredError} when a non-empty password is required\r\n * @throws {UnsupportedPdfEncryptionError} for non-standard security handlers\r\n */\r\nexport function normalizePdfEncryption(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n return coreNormalizePdfEncryption(pdfBytes, { logger: consoleLogger });\r\n}\r\n","import * as pdfjsLib from 'pdfjs-dist';\r\nimport { PDFDocument } from 'pdf-lib';\r\nimport type { PageImage } from '../types';\r\nimport { normalizePdfEncryption, PdfPasswordRequiredError } from './pdf-decrypt';\r\n\r\n// Set up PDF.js worker - use the self-hosted PDF.js worker\r\nif (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n}\r\n\r\n/**\r\n * Converts a PDF document to an array of rendered page images\r\n *\r\n * @param pdfBytes - The PDF document as a Uint8Array\r\n * @param options - Optional configuration\r\n * @param options.hideFormFields - If true, hides existing form fields during rendering\r\n * @returns Promise resolving to array of PageImage objects with rendered images\r\n * @throws {Error} If PDF is invalid or rendering fails\r\n *\r\n * @example\r\n * ```ts\r\n * const pages = await pdfToImages(pdfBytes, { hideFormFields: true });\r\n * console.log(`Rendered ${pages.length} pages`);\r\n * ```\r\n */\r\nexport async function pdfToImages(\r\n pdfBytes: Uint8Array,\r\n options?: { hideFormFields?: boolean }\r\n): Promise<PageImage[]> {\r\n try {\r\n // Check if it starts with PDF header\r\n const header = new TextDecoder().decode(pdfBytes.slice(0, 10));\r\n\r\n if (!header.startsWith('%PDF-')) {\r\n console.error('Invalid PDF: Does not start with %PDF- header');\r\n throw new Error('Invalid PDF format: Missing PDF header');\r\n }\r\n\r\n // Set up PDF.js worker\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n }\r\n\r\n // Load PDF with PDF.js\r\n const loadingTask = pdfjsLib.getDocument({\r\n data: pdfBytes,\r\n verbosity: 0,\r\n });\r\n const pdfDoc = await loadingTask.promise;\r\n\r\n const pages: PageImage[] = [];\r\n\r\n // Try to load with pdf-lib for dimension comparison (optional)\r\n let pdfLibDoc = null;\r\n try {\r\n pdfLibDoc = await PDFDocument.load(pdfBytes);\r\n } catch {\r\n // PDF.js dimensions will be used instead\r\n }\r\n\r\n for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) {\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 2.0 });\r\n\r\n // Get actual PDF dimensions (for coordinate conversion)\r\n let pdfWidth = viewport.width / 2.0;\r\n let pdfHeight = viewport.height / 2.0;\r\n\r\n // Use pdf-lib dimensions if available for consistency\r\n if (pdfLibDoc) {\r\n try {\r\n const pdfLibPage = pdfLibDoc.getPage(pageNum - 1);\r\n const pdfLibWidth = pdfLibPage.getWidth();\r\n const pdfLibHeight = pdfLibPage.getHeight();\r\n\r\n // Use pdf-lib dimensions for consistency\r\n pdfWidth = pdfLibWidth;\r\n pdfHeight = pdfLibHeight;\r\n } catch {\r\n // Use PDF.js dimensions as fallback\r\n }\r\n }\r\n\r\n // Create canvas at the scaled size for high quality rendering\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n\r\n // Render PDF page to canvas\r\n const hideFormFields = options?.hideFormFields ?? false;\r\n const renderContext = {\r\n canvasContext: context,\r\n viewport: viewport,\r\n // Hide annotations/form fields when specified\r\n renderInteractiveForms: !hideFormFields,\r\n // Additional options to ensure form fields are hidden\r\n ...(hideFormFields && {\r\n annotationMode: 0, // Disable annotations\r\n renderAnnotations: false,\r\n renderForms: false,\r\n }),\r\n };\r\n\r\n await page.render(renderContext).promise;\r\n\r\n // Convert canvas to data URL\r\n const imageUrl = canvas.toDataURL('image/png');\r\n\r\n pages.push({\r\n imageUrl,\r\n width: pdfWidth,\r\n height: pdfHeight,\r\n });\r\n }\r\n\r\n return pages;\r\n } catch (error) {\r\n console.error('Error converting PDF to images with PDF.js:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Last-resort rebuild for encrypted PDFs whose structure pdf-lib cannot\r\n * parse even with `ignoreEncryption`: render every page with PDF.js (which\r\n * has full decryption support) and re-emit them as an image-based PDF.\r\n *\r\n * @param pdfBytes - The source PDF as a Uint8Array\r\n * @returns Promise resolving to rebuilt (unencrypted, image-based) PDF bytes\r\n */\r\n/**\r\n * Rasterization ceilings. The fallback runs on untrusted uploads, and a tiny\r\n * PDF can legally declare hundreds of thousands of pages or a page far larger\r\n * than any canvas — either would OOM the tab without these caps.\r\n */\r\nexport const MAX_RASTER_PAGE_COUNT = 500;\r\nexport const MAX_RASTER_CANVAS_PIXELS = 4096 * 4096;\r\nconst PREFERRED_RASTER_SCALE = 2.0;\r\n\r\n/**\r\n * Render scale for a page of the given size (PDF points): the preferred\r\n * scale, reduced as needed so the canvas stays within the pixel budget.\r\n */\r\nexport function computeRasterScale(width: number, height: number): number {\r\n const area = width * height;\r\n if (!Number.isFinite(area) || area <= 0) return PREFERRED_RASTER_SCALE;\r\n const preferredPixels = area * PREFERRED_RASTER_SCALE * PREFERRED_RASTER_SCALE;\r\n if (preferredPixels <= MAX_RASTER_CANVAS_PIXELS) return PREFERRED_RASTER_SCALE;\r\n return Math.sqrt(MAX_RASTER_CANVAS_PIXELS / area);\r\n}\r\n\r\nexport async function rasterizePdfToPdf(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n }\r\n let sourceDoc;\r\n try {\r\n sourceDoc = await pdfjsLib.getDocument({ data: pdfBytes.slice(0), verbosity: 0 }).promise;\r\n } catch (error) {\r\n if ((error as { name?: string })?.name === 'PasswordException') {\r\n throw new PdfPasswordRequiredError();\r\n }\r\n throw error;\r\n }\r\n try {\r\n if (sourceDoc.numPages > MAX_RASTER_PAGE_COUNT) {\r\n throw new Error(\r\n `Cannot rebuild PDF: ${sourceDoc.numPages} pages exceeds the ${MAX_RASTER_PAGE_COUNT}-page limit`,\r\n );\r\n }\r\n const outDoc = await PDFDocument.create();\r\n for (let pageNum = 1; pageNum <= sourceDoc.numPages; pageNum++) {\r\n const page = await sourceDoc.getPage(pageNum);\r\n const base = page.getViewport({ scale: 1.0 });\r\n const scale = computeRasterScale(base.width, base.height);\r\n const viewport = page.getViewport({ scale });\r\n const canvas = document.createElement('canvas');\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n const context = canvas.getContext('2d')!;\r\n await page.render({ canvasContext: context, viewport }).promise;\r\n const png = await outDoc.embedPng(canvas.toDataURL('image/png'));\r\n const outPage = outDoc.addPage([base.width, base.height]);\r\n outPage.drawImage(png, { x: 0, y: 0, width: base.width, height: base.height });\r\n }\r\n return new Uint8Array(await outDoc.save({ useObjectStreams: false }));\r\n } finally {\r\n await sourceDoc.destroy();\r\n }\r\n}\r\n\r\n/**\r\n * Prepares uploaded PDF bytes for the pdf-lib based assembly pipeline.\r\n * Regular PDFs pass through untouched. Encrypted PDFs (typically\r\n * permission-restricted documents that open without a password) are\r\n * decrypted once here so every downstream `PDFDocument.load` — assembly,\r\n * field extraction — sees a normal document. When structural decryption is\r\n * impossible the document is rebuilt from rendered pages as a last resort.\r\n *\r\n * @throws {PdfPasswordRequiredError} when the PDF needs a real password\r\n */\r\nexport async function normalizeUploadedPdfBytes(pdfBytes: Uint8Array): Promise<Uint8Array> {\r\n try {\r\n const normalized = await normalizePdfEncryption(pdfBytes);\r\n return normalized === pdfBytes ? pdfBytes : new Uint8Array(normalized);\r\n } catch (error) {\r\n if (error instanceof PdfPasswordRequiredError) throw error;\r\n console.warn(\r\n '[PageAssembler] Structural decryption failed; rebuilding document from rendered pages:',\r\n error,\r\n );\r\n return rasterizePdfToPdf(pdfBytes);\r\n }\r\n}\r\n\r\n/**\r\n * Converts an image file to a PDF document with a single page\r\n *\r\n * @param imageFile - The image file to convert (supports common image formats)\r\n * @returns Promise resolving to PDF bytes as Uint8Array\r\n * @throws {Error} If image fails to load or convert\r\n *\r\n * @example\r\n * ```ts\r\n * const pdfBytes = await imageToPdf(imageFile);\r\n * ```\r\n */\r\nexport async function imageToPdf(imageFile: File): Promise<Uint8Array> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d')!;\r\n\r\n img.onload = async () => {\r\n try {\r\n // Set canvas size to image size\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n // Draw image on canvas\r\n ctx.drawImage(img, 0, 0);\r\n\r\n // Convert canvas to PNG image data (canvas.toBlob defaults to PNG)\r\n canvas.toBlob(\r\n async (blob) => {\r\n if (!blob) {\r\n reject(new Error('Failed to convert image to blob'));\r\n return;\r\n }\r\n\r\n const imageBytes = new Uint8Array(await blob.arrayBuffer());\r\n\r\n // Create PDF with the image\r\n const pdfDoc = await PDFDocument.create();\r\n\r\n // Always embed as PNG since canvas.toBlob() produces PNG data\r\n const embeddedImage = await pdfDoc.embedPng(imageBytes);\r\n\r\n // Calculate dimensions to fit page while maintaining aspect ratio\r\n const { width, height } = embeddedImage.scale(1);\r\n const maxWidth = 595; // A4 width in points\r\n const maxHeight = 842; // A4 height in points\r\n\r\n let pageWidth = width;\r\n let pageHeight = height;\r\n\r\n // Scale down if image is larger than A4\r\n if (width > maxWidth || height > maxHeight) {\r\n const scale = Math.min(maxWidth / width, maxHeight / height);\r\n pageWidth = width * scale;\r\n pageHeight = height * scale;\r\n }\r\n\r\n // Create page with calculated dimensions\r\n const page = pdfDoc.addPage([\r\n Math.max(pageWidth, 100),\r\n Math.max(pageHeight, 100),\r\n ]);\r\n\r\n // Draw image centered on page\r\n const x = (page.getWidth() - pageWidth) / 2;\r\n const y = (page.getHeight() - pageHeight) / 2;\r\n\r\n page.drawImage(embeddedImage, {\r\n x: Math.max(x, 0),\r\n y: Math.max(y, 0),\r\n width: pageWidth,\r\n height: pageHeight,\r\n });\r\n\r\n const pdfBytes = await pdfDoc.save();\r\n resolve(pdfBytes);\r\n },\r\n 'image/png',\r\n 0.95\r\n ); // Explicitly specify PNG format with high quality\r\n } catch (error) {\r\n reject(error);\r\n }\r\n };\r\n\r\n img.onerror = () => {\r\n reject(new Error('Failed to load image'));\r\n };\r\n\r\n // Create object URL from file and set as image source\r\n const objectUrl = URL.createObjectURL(imageFile);\r\n img.src = objectUrl;\r\n });\r\n}\r\n\r\n/**\r\n * Create a blob URL from PDF bytes for preview\r\n *\r\n * @param pdfBytes - The PDF document as Uint8Array\r\n * @returns Blob URL string\r\n *\r\n * @example\r\n * ```ts\r\n * const url = createPdfBlobUrl(pdfBytes);\r\n * // Remember to revoke: URL.revokeObjectURL(url);\r\n * ```\r\n */\r\nexport function createPdfBlobUrl(pdfBytes: Uint8Array): string {\r\n const blob = new Blob([pdfBytes as unknown as BlobPart], {\r\n type: 'application/pdf',\r\n });\r\n return URL.createObjectURL(blob);\r\n}\r\n\r\n/**\r\n * Triggers a browser download of a PDF file\r\n *\r\n * @param pdfBytes - The PDF document as Uint8Array\r\n * @param filename - The filename for the downloaded file (e.g., 'document.pdf')\r\n *\r\n * @example\r\n * ```ts\r\n * downloadPdf(pdfBytes, 'assembled-document.pdf');\r\n * ```\r\n */\r\nexport function downloadPdf(pdfBytes: Uint8Array, filename: string): void {\r\n const blob = new Blob([pdfBytes as unknown as BlobPart], {\r\n type: 'application/pdf',\r\n });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n","/**\r\n * PDF Field Extraction Utilities\r\n * Extract form fields from PDFs with metadata support for preserving field properties\r\n */\r\n\r\nimport { PDFDocument, PDFName, PDFString, PDFTextField, PDFCheckBox, PDFDropdown, PDFRadioGroup } from 'pdf-lib';\r\n\r\n/**\r\n * Extracted field information\r\n */\r\nexport interface ExtractedField {\r\n name: string;\r\n type: 'text' | 'signature' | 'initials' | 'date' | 'checkbox' | 'radio' | 'dropdown' | 'text_label';\r\n page: number;\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n required: boolean;\r\n label?: string;\r\n placeholder?: string;\r\n options?: string[];\r\n fieldId?: string;\r\n signer?: string;\r\n}\r\n\r\n/**\r\n * SigniphiMetadata structure stored in PDF Info dictionary\r\n */\r\ninterface SigniphiMetadata {\r\n version: string;\r\n fields: Record<string, {\r\n fieldId?: string;\r\n label?: string;\r\n signer?: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n options?: string[];\r\n acknowledgements?: Array<{ id: string; title: string; description: string }>;\r\n }>;\r\n fieldIdIndex?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Extract SigniphiMetadata from a PDF document\r\n */\r\nexport function getSigniphiMetadata(pdfDoc: PDFDocument): SigniphiMetadata | null {\r\n try {\r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n if (!infoRef) {\r\n return null;\r\n }\r\n\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n if (!infoObj || typeof (infoObj as any).get !== 'function') {\r\n return null;\r\n }\r\n\r\n const infoDict = infoObj as any;\r\n const metadataObj = infoDict.get(PDFName.of('SigniphiMetadata'));\r\n\r\n if (!metadataObj) {\r\n return null;\r\n }\r\n\r\n // PDFString objects are encoded as \"(content)\" in their toString() representation\r\n const metadataStr = metadataObj.toString();\r\n\r\n // Extract content from PDF string format: (content)\r\n let jsonStr = metadataStr;\r\n if (metadataStr.startsWith('(') && metadataStr.endsWith(')')) {\r\n jsonStr = metadataStr.slice(1, -1);\r\n } else if (metadataStr.startsWith('<') && metadataStr.endsWith('>')) {\r\n jsonStr = metadataStr.slice(1, -1);\r\n }\r\n\r\n const metadata = JSON.parse(jsonStr);\r\n return metadata;\r\n } catch (error) {\r\n console.error('Failed to load Signiphi metadata:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Parse an encoded field name to extract base name (without __LABEL__, __SIGNER__, __PLACEHOLDER__)\r\n */\r\nfunction getBaseFieldName(encodedName: string): string {\r\n let baseName = encodedName;\r\n\r\n // Remove __SIGNER__ and everything after\r\n if (baseName.includes('__SIGNER__')) {\r\n baseName = baseName.split('__SIGNER__')[0];\r\n }\r\n\r\n // Remove __LABEL__ and everything after\r\n if (baseName.includes('__LABEL__')) {\r\n baseName = baseName.split('__LABEL__')[0];\r\n }\r\n\r\n // Remove __PLACEHOLDER__ and everything after\r\n if (baseName.includes('__PLACEHOLDER__')) {\r\n baseName = baseName.split('__PLACEHOLDER__')[0];\r\n }\r\n\r\n return baseName;\r\n}\r\n\r\n/**\r\n * Strip the field-type suffix that document-prepare's `ensureFieldSuffix` appends\r\n * to the WHOLE encoded name at bake time, which lands it after the trailing\r\n * segment: `fld__SIGNER__buyer@x.com` bakes to\r\n * `fld__SIGNER__buyer@x.com_signature`.\r\n *\r\n * Note this package's own producer (`add-form-fields.ts`) gets the order right —\r\n * it suffixes the base name before encoding — so only PDFs that came through\r\n * document-prepare are affected. Those do reach here: a previously baked PDF\r\n * re-uploaded into the assembler is a normal flow.\r\n *\r\n * Single strip, anchored, case-insensitive — deliberately narrower than\r\n * `ensureFieldSuffix`, which cascades three strips. Safe for every signer value in\r\n * this system: emails end in a TLD and role tokens are hyphenated\r\n * (`to-recipients`, `additional-signer-1`), so none can legitimately end in a type\r\n * suffix. Falls back to the original when stripping would empty the value, so a\r\n * malformed name never decays into a falsy \"unassigned\" signer.\r\n */\r\nfunction stripFieldTypeSuffix(value: string): string {\r\n const stripped = value.replace(/_(signature|initials|date)$/i, '');\r\n return stripped || value;\r\n}\r\n\r\n/**\r\n * Extract signer email from encoded field name\r\n *\r\n * @internal Exported for unit testing only — deliberately not re-exported from\r\n * the package's `index.ts`, so this is not part of the public API.\r\n */\r\nexport function getSignerFromFieldName(encodedName: string): string | undefined {\r\n if (encodedName.includes('__SIGNER__')) {\r\n const parts = encodedName.split('__SIGNER__');\r\n if (parts[1]) {\r\n const segment = parts[1].split('__')[0] || parts[1];\r\n // Only the LAST segment can carry the baked type suffix. When another marker\r\n // follows, the suffix landed there instead and the signer is already clean —\r\n // stripping anyway would corrupt a signer value that legitimately ends in a\r\n // type word, and would make this package disagree with pdf-signer about who\r\n // a field belongs to.\r\n const isTerminal = segment === parts[1];\r\n return isTerminal ? stripFieldTypeSuffix(segment) : segment;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Determine field type from field name or widget type\r\n * Uses base name (without __SIGNER__, __LABEL__ encoding) to prevent false matches\r\n */\r\nfunction determineFieldType(fieldName: string, widgetType?: string): ExtractedField['type'] {\r\n // IMPORTANT: Use base name to prevent \"__SIGNER__\" from matching \"sign\" patterns\r\n const baseName = getBaseFieldName(fieldName);\r\n const nameLower = baseName.toLowerCase();\r\n\r\n // Check for specific suffixes/patterns\r\n if (nameLower.includes('_signature') || nameLower.includes('signature')) {\r\n return 'signature';\r\n }\r\n if (nameLower.includes('_initials') || nameLower.includes('initials')) {\r\n return 'initials';\r\n }\r\n if (nameLower.includes('_date') || nameLower.includes('date')) {\r\n return 'date';\r\n }\r\n if (widgetType === 'checkbox' || nameLower.includes('checkbox')) {\r\n return 'checkbox';\r\n }\r\n if (widgetType === 'radio' || nameLower.includes('radio')) {\r\n return 'radio';\r\n }\r\n if (widgetType === 'dropdown' || widgetType === 'select' || nameLower.includes('dropdown')) {\r\n return 'dropdown';\r\n }\r\n\r\n return 'text';\r\n}\r\n\r\n/**\r\n * Extract form fields from a PDF document\r\n * @param pdfBytes - PDF bytes\r\n * @returns Array of extracted fields with all properties\r\n */\r\nexport async function extractFieldsFromPdf(pdfBytes: Uint8Array): Promise<ExtractedField[]> {\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const fields: ExtractedField[] = [];\r\n\r\n // Get SigniphiMetadata for field properties\r\n const metadata = getSigniphiMetadata(pdfDoc);\r\n\r\n // Get form and fields from pdf-lib\r\n const form = pdfDoc.getForm();\r\n const pdfFields = form.getFields();\r\n\r\n for (const field of pdfFields) {\r\n const fieldName = field.getName();\r\n const widgets = field.acroField.getWidgets();\r\n\r\n // Parse encoded field name to extract base name and signer\r\n const baseName = getBaseFieldName(fieldName);\r\n const signerFromName = getSignerFromFieldName(fieldName);\r\n\r\n // Get field-specific properties\r\n let required = false;\r\n let options: string[] | undefined;\r\n let widgetType: string | undefined;\r\n\r\n // Determine required flag and options based on field type\r\n if (field instanceof PDFTextField) {\r\n required = field.isRequired();\r\n console.log(`[field-extraction] PDFTextField \"${fieldName}\" isRequired=${required}`);\r\n } else if (field instanceof PDFCheckBox) {\r\n widgetType = 'checkbox';\r\n required = field.isRequired();\r\n console.log(`[field-extraction] PDFCheckBox \"${fieldName}\" isRequired=${required}`);\r\n } else if (field instanceof PDFDropdown) {\r\n widgetType = 'dropdown';\r\n required = field.isRequired();\r\n options = field.getOptions();\r\n console.log(`[field-extraction] PDFDropdown \"${fieldName}\" isRequired=${required}`);\r\n } else if (field instanceof PDFRadioGroup) {\r\n widgetType = 'radio';\r\n required = field.isRequired();\r\n options = field.getOptions();\r\n console.log(`[field-extraction] PDFRadioGroup \"${fieldName}\" isRequired=${required}`);\r\n } else {\r\n console.log(`[field-extraction] Unknown field type \"${fieldName}\" - defaulting required=false`);\r\n }\r\n\r\n // Process each widget (field can appear on multiple pages)\r\n for (const widget of widgets) {\r\n const rect = widget.getRectangle();\r\n const pageRef = widget.P();\r\n\r\n // Find page number\r\n let pageNumber = 1;\r\n if (pageRef) {\r\n const pages = pdfDoc.getPages();\r\n for (let i = 0; i < pages.length; i++) {\r\n if (pages[i].ref === pageRef) {\r\n pageNumber = i + 1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Get metadata for this field - try page-qualified key first (for combined PDFs),\r\n // then full name, then base name\r\n const pageQualifiedKey = `${baseName}_p${pageNumber}`;\r\n let fieldMetadata = metadata?.fields?.[pageQualifiedKey];\r\n if (!fieldMetadata) {\r\n fieldMetadata = metadata?.fields?.[fieldName];\r\n }\r\n if (!fieldMetadata && baseName !== fieldName) {\r\n fieldMetadata = metadata?.fields?.[baseName];\r\n }\r\n\r\n // Determine required and options, with metadata overrides\r\n let fieldRequired = required;\r\n let fieldOptions = options;\r\n if (fieldMetadata?.required !== undefined) {\r\n fieldRequired = fieldMetadata.required;\r\n }\r\n if (fieldMetadata?.options?.length) {\r\n fieldOptions = fieldMetadata.options;\r\n }\r\n\r\n const page = pdfDoc.getPage(pageNumber - 1);\r\n const pageHeight = page.getHeight();\r\n\r\n const extractedField: ExtractedField = {\r\n name: baseName, // Use clean base name without __SIGNER__ encoding (signer stored in signer property)\r\n type: determineFieldType(fieldName, widgetType), // Uses base name internally\r\n page: pageNumber,\r\n x: rect.x,\r\n y: pageHeight - rect.y - rect.height, // Convert from PDF coords (bottom-left) to top-left\r\n width: rect.width,\r\n height: rect.height,\r\n required: fieldRequired,\r\n options: fieldOptions,\r\n signer: signerFromName, // Extract signer from encoded name\r\n };\r\n\r\n // Apply metadata properties\r\n if (fieldMetadata) {\r\n if (fieldMetadata.fieldId) {\r\n extractedField.fieldId = fieldMetadata.fieldId;\r\n }\r\n if (fieldMetadata.label) {\r\n extractedField.label = fieldMetadata.label;\r\n }\r\n // Prefer signer from name encoding over metadata\r\n if (!extractedField.signer && fieldMetadata.signer) {\r\n extractedField.signer = fieldMetadata.signer;\r\n }\r\n if (fieldMetadata.placeholder) {\r\n extractedField.placeholder = fieldMetadata.placeholder;\r\n }\r\n }\r\n\r\n fields.push(extractedField);\r\n }\r\n }\r\n\r\n // Deduplicate fields by BASE name AND page\r\n // This consolidates signer-encoded variants (e.g., checkbox_123__SIGNER__aa@bb.cc)\r\n // into a single field with the signer assignment preserved\r\n // This matches dm-web's behavior where multi-signer PDFs show clean, deduplicated fields\r\n const deduplicatedFields = fields.reduce((acc, field) => {\r\n const newBaseName = getBaseFieldName(field.name);\r\n const existingIndex = acc.findIndex(f => {\r\n const existingBaseName = getBaseFieldName(f.name);\r\n return existingBaseName === newBaseName && f.page === field.page;\r\n });\r\n\r\n if (existingIndex === -1) {\r\n // No existing field with this base name on this page - add it\r\n acc.push(field);\r\n } else {\r\n // Found existing field with same base name - MERGE properties from both\r\n // This ensures we don't lose metadata when consolidating signer variants\r\n const existing = acc[existingIndex];\r\n acc[existingIndex] = {\r\n ...existing,\r\n // Prefer non-empty values from either field\r\n label: existing.label || field.label,\r\n placeholder: existing.placeholder || field.placeholder,\r\n required: existing.required || field.required,\r\n options: existing.options?.length ? existing.options : field.options,\r\n fieldId: existing.fieldId || field.fieldId,\r\n // Prefer signer from the field that has it\r\n signer: existing.signer || field.signer,\r\n };\r\n }\r\n return acc;\r\n }, [] as ExtractedField[]);\r\n\r\n return deduplicatedFields;\r\n}\r\n\r\n/**\r\n * Set SigniphiMetadata in a PDF document\r\n */\r\nexport function setSigniphiMetadata(pdfDoc: PDFDocument, metadata: SigniphiMetadata): void {\r\n try {\r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n if (!infoObj || typeof (infoObj as any).set !== 'function') {\r\n throw new Error('Info object is not a PDFDict or does not have set method');\r\n }\r\n const infoDict = infoObj as any;\r\n const metadataString = JSON.stringify(metadata);\r\n\r\n infoDict.set(PDFName.of('SigniphiMetadata'), PDFString.of(metadataString));\r\n } catch (error) {\r\n console.error('Failed to set Signiphi metadata:', error);\r\n throw error;\r\n }\r\n}\r\n","/**\r\n * Add Form Fields to PDF\r\n * Re-adds form fields to a PDF after page assembly operations\r\n * This is the key to preserving form fields - don't try to preserve during copyPages,\r\n * instead extract fields first, copy pages, then re-add fields with adjusted positions.\r\n */\r\n\r\nimport { PDFDocument, PDFName, PDFString, rgb, StandardFonts } from 'pdf-lib';\r\n\r\n/**\r\n * Form field type enum matching document-prepare\r\n */\r\nexport enum FormFieldType {\r\n TEXT = 'text',\r\n SIGNATURE = 'signature',\r\n INITIALS = 'initials',\r\n DATE = 'date',\r\n CHECKBOX = 'checkbox',\r\n RADIO = 'radio',\r\n DROPDOWN = 'dropdown',\r\n TEXT_LABEL = 'text_label',\r\n}\r\n\r\n/**\r\n * Form field position\r\n */\r\nexport interface FormFieldPosition {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n page: number; // 1-indexed\r\n}\r\n\r\n/**\r\n * Form field for adding to PDF\r\n */\r\nexport interface FormFieldForPdf {\r\n name: string;\r\n type: FormFieldType | string;\r\n position: FormFieldPosition;\r\n label?: string;\r\n required?: boolean;\r\n options?: string[];\r\n defaultValue?: string;\r\n placeholder?: string;\r\n fontSize?: number;\r\n multiline?: boolean;\r\n maxLength?: number;\r\n assignedSignerEmail?: string;\r\n}\r\n\r\n/**\r\n * Parse an encoded field name to extract base name, label, and signer\r\n * Handles names like: \"checkbox_123__LABEL__My Label__SIGNER__aa@bb.cc\"\r\n * @public - exported for use in field extraction\r\n */\r\nexport function parseEncodedFieldName(encodedName: string): {\r\n baseName: string;\r\n label?: string;\r\n signer?: string;\r\n} {\r\n let baseName = encodedName;\r\n let label: string | undefined;\r\n let signer: string | undefined;\r\n\r\n // Extract signer if present\r\n if (baseName.includes('__SIGNER__')) {\r\n const parts = baseName.split('__SIGNER__');\r\n baseName = parts[0];\r\n signer = parts[1];\r\n }\r\n\r\n // Extract label if present\r\n if (baseName.includes('__LABEL__')) {\r\n const parts = baseName.split('__LABEL__');\r\n baseName = parts[0];\r\n label = parts[1];\r\n }\r\n\r\n // Extract placeholder if present (just remove it from base name)\r\n if (baseName.includes('__PLACEHOLDER__')) {\r\n const parts = baseName.split('__PLACEHOLDER__');\r\n baseName = parts[0];\r\n }\r\n\r\n return { baseName, label, signer };\r\n}\r\n\r\n/**\r\n * Encode field name with signer info (for multi-signer documents)\r\n * Prevents double-encoding by parsing the name first\r\n */\r\nfunction encodeFieldNameWithSigner(fieldName: string, signerEmail?: string): string {\r\n // Parse the name to check if it's already encoded\r\n const { baseName, signer: existingSigner } = parseEncodedFieldName(fieldName);\r\n\r\n // Use existing signer if present, otherwise use provided signerEmail\r\n const finalSigner = existingSigner || signerEmail;\r\n\r\n if (!finalSigner) return baseName;\r\n return `${baseName}__SIGNER__${finalSigner}`;\r\n}\r\n\r\n/**\r\n * Encode field name with label and signer\r\n * Prevents double-encoding by parsing the name first\r\n */\r\nfunction encodeFieldNameWithLabelAndSigner(fieldName: string, label?: string, signerEmail?: string): string {\r\n // Parse the name to check if it's already encoded\r\n const { baseName, label: existingLabel, signer: existingSigner } = parseEncodedFieldName(fieldName);\r\n\r\n // Use existing values if present, otherwise use provided values\r\n const finalLabel = existingLabel || label;\r\n const finalSigner = existingSigner || signerEmail;\r\n\r\n let name = baseName;\r\n if (finalLabel && finalLabel.trim()) {\r\n name = `${name}__LABEL__${finalLabel.trim()}`;\r\n }\r\n if (finalSigner) {\r\n name = `${name}__SIGNER__${finalSigner}`;\r\n }\r\n return name;\r\n}\r\n\r\n/**\r\n * Add form fields to a PDF document\r\n *\r\n * @param pdfBytes - The PDF document bytes\r\n * @param formFields - Array of form fields to add\r\n * @param options - Options for field addition\r\n * @returns Modified PDF bytes with form fields added\r\n */\r\nexport async function addFormFieldsToPdf(\r\n pdfBytes: Uint8Array,\r\n formFields: FormFieldForPdf[],\r\n options: {\r\n removeExistingFields?: boolean;\r\n drawLabels?: boolean;\r\n } = {}\r\n): Promise<Uint8Array> {\r\n const { removeExistingFields = false, drawLabels = false } = options;\r\n\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const pages = pdfDoc.getPages();\r\n\r\n // Remove existing fields if requested\r\n if (removeExistingFields) {\r\n const existingFields = form.getFields();\r\n for (const field of existingFields) {\r\n try {\r\n // Robust widget cleanup\r\n const acroField = (field as any).acroField;\r\n if (acroField && typeof acroField.getWidgets === 'function') {\r\n let widgets = acroField.getWidgets();\r\n let safetyCounter = 0;\r\n const maxIterations = widgets.length + 5;\r\n\r\n while (widgets.length > 0 && safetyCounter < maxIterations) {\r\n try {\r\n acroField.removeWidget(widgets.length - 1);\r\n widgets = acroField.getWidgets();\r\n } catch {\r\n break;\r\n }\r\n safetyCounter++;\r\n }\r\n }\r\n form.removeField(field);\r\n } catch (error) {\r\n console.warn(`Failed to remove field ${field.getName()}:`, error);\r\n try {\r\n form.removeField(field);\r\n } catch {\r\n // Ignore fallback failure\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Embed font for labels\r\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\r\n\r\n // Detect which field names appear on multiple pages (need unique suffixes)\r\n const fieldNamePages = new Map<string, Set<number>>();\r\n for (const field of formFields) {\r\n const baseName = field.name;\r\n if (!fieldNamePages.has(baseName)) {\r\n fieldNamePages.set(baseName, new Set());\r\n }\r\n fieldNamePages.get(baseName)!.add(field.position.page);\r\n }\r\n // Field names that need _p{page} suffix (appear on multiple pages)\r\n const conflictingNames = new Set<string>();\r\n for (const [name, pages] of fieldNamePages) {\r\n if (pages.size > 1) {\r\n conflictingNames.add(name);\r\n }\r\n }\r\n\r\n // Add each field\r\n for (const field of formFields) {\r\n const pageIndex = field.position.page - 1;\r\n\r\n if (pageIndex < 0 || pageIndex >= pages.length) {\r\n console.warn(`Field ${field.name} references page ${field.position.page} but PDF only has ${pages.length} pages`);\r\n continue;\r\n }\r\n\r\n const page = pages[pageIndex];\r\n const { height: pageHeight } = page.getSize();\r\n\r\n // Convert coordinates from top-left (UI) to bottom-left (PDF)\r\n const pdfX = field.position.x;\r\n const pdfY = pageHeight - field.position.y - field.position.height;\r\n\r\n // Only add _p{page} suffix when field name appears on multiple pages\r\n // This preserves per-page properties (required, etc.) for conflicting names\r\n const uniqueFieldName = conflictingNames.has(field.name)\r\n ? `${field.name}_p${field.position.page}`\r\n : field.name;\r\n\r\n try {\r\n const fieldType = typeof field.type === 'string' ? field.type : field.type;\r\n\r\n switch (fieldType) {\r\n case FormFieldType.TEXT: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const textField = form.createTextField(encodedName);\r\n textField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n // Store label in TU metadata\r\n if (field.label && field.label.trim()) {\r\n textField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n\r\n if (drawLabels) {\r\n const fontSize = Math.min(10, field.position.height * 0.4);\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, { x: pdfX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n\r\n if (field.defaultValue && field.defaultValue.trim()) {\r\n textField.setText(field.defaultValue);\r\n }\r\n\r\n if (field.fontSize && field.fontSize >= 8 && field.fontSize <= 72) {\r\n try { textField.setFontSize(field.fontSize); } catch { /* ignore */ }\r\n }\r\n\r\n if (field.multiline) {\r\n try { textField.enableMultiline(); } catch { /* ignore */ }\r\n }\r\n\r\n if (field.maxLength && field.maxLength > 0) {\r\n try { textField.setMaxLength(field.maxLength); } catch { /* ignore */ }\r\n }\r\n\r\n if (field.required) {\r\n textField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.CHECKBOX: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const checkBox = form.createCheckBox(encodedName);\r\n checkBox.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.defaultValue === 'true' || field.defaultValue === 'checked') {\r\n checkBox.check();\r\n }\r\n\r\n if (field.required) {\r\n checkBox.enableRequired();\r\n }\r\n\r\n if (field.label && field.label.trim()) {\r\n try { checkBox.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label)); } catch { /* ignore */ }\r\n\r\n if (drawLabels) {\r\n const fontSize = Math.min(12, field.position.height * 0.6);\r\n const labelX = pdfX + field.position.width + 5;\r\n const labelY = pdfY + (field.position.height - fontSize) / 2;\r\n page.drawText(field.label, { x: labelX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.SIGNATURE: {\r\n const baseWithSuffix = field.name.endsWith('_signature') ? field.name : `${field.name}_signature`;\r\n const finalName = conflictingNames.has(field.name) ? `${baseWithSuffix}_p${field.position.page}` : baseWithSuffix;\r\n const encodedName = encodeFieldNameWithLabelAndSigner(finalName, field.label, field.assignedSignerEmail);\r\n const sigField = form.createTextField(encodedName);\r\n sigField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0, 0, 1),\r\n backgroundColor: rgb(0.9, 0.9, 1),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n sigField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n }\r\n\r\n sigField.enableReadOnly();\r\n\r\n if (field.required) {\r\n sigField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.INITIALS: {\r\n const baseWithSuffix = field.name.endsWith('_initials') ? field.name : `${field.name}_initials`;\r\n const finalName = conflictingNames.has(field.name) ? `${baseWithSuffix}_p${field.position.page}` : baseWithSuffix;\r\n const encodedName = encodeFieldNameWithLabelAndSigner(finalName, field.label, field.assignedSignerEmail);\r\n const initField = form.createTextField(encodedName);\r\n initField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0, 0.5),\r\n backgroundColor: rgb(1, 0.95, 1),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n initField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n }\r\n\r\n initField.enableReadOnly();\r\n\r\n if (field.required) {\r\n initField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.DATE: {\r\n const baseWithSuffix = field.name.endsWith('_date') ? field.name : `${field.name}_date`;\r\n const finalName = conflictingNames.has(field.name) ? `${baseWithSuffix}_p${field.position.page}` : baseWithSuffix;\r\n const encodedName = encodeFieldNameWithLabelAndSigner(finalName, field.label, field.assignedSignerEmail);\r\n const dateField = form.createTextField(encodedName);\r\n dateField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0, 0.5, 0),\r\n backgroundColor: rgb(0.95, 1, 0.95),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n dateField.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label));\r\n }\r\n\r\n if (field.required) {\r\n dateField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.DROPDOWN: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const dropdown = form.createDropdown(encodedName);\r\n dropdown.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: field.position.width,\r\n height: field.position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.options && field.options.length > 0) {\r\n dropdown.addOptions(field.options);\r\n if (field.defaultValue && field.options.includes(field.defaultValue)) {\r\n dropdown.select(field.defaultValue);\r\n }\r\n }\r\n\r\n if (field.label && field.label.trim()) {\r\n try { dropdown.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label)); } catch { /* ignore */ }\r\n\r\n if (drawLabels) {\r\n const fontSize = Math.min(10, field.position.height * 0.4);\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, { x: pdfX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n\r\n if (field.required) {\r\n dropdown.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.RADIO: {\r\n const encodedName = encodeFieldNameWithSigner(uniqueFieldName, field.assignedSignerEmail);\r\n const radioGroup = form.createRadioGroup(encodedName);\r\n\r\n if (field.options && field.options.length > 0) {\r\n // Calculate spacing for radio buttons\r\n const optionHeight = Math.min(20, field.position.height / field.options.length);\r\n const spacing = field.position.height / field.options.length;\r\n\r\n field.options.forEach((option, index) => {\r\n const optionY = pdfY + field.position.height - (index + 1) * spacing + (spacing - optionHeight) / 2;\r\n radioGroup.addOptionToPage(option, page, {\r\n x: pdfX,\r\n y: optionY,\r\n width: optionHeight,\r\n height: optionHeight,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n // Draw option label\r\n if (drawLabels) {\r\n const labelX = pdfX + optionHeight + 5;\r\n const labelY = optionY + optionHeight / 4;\r\n page.drawText(option, { x: labelX, y: labelY, size: 10, font, color: rgb(0, 0, 0) });\r\n }\r\n });\r\n\r\n if (field.defaultValue && field.options.includes(field.defaultValue)) {\r\n radioGroup.select(field.defaultValue);\r\n }\r\n }\r\n\r\n if (field.label && field.label.trim()) {\r\n try { radioGroup.acroField.dict.set(PDFName.of('TU'), PDFString.of(field.label)); } catch { /* ignore */ }\r\n\r\n if (drawLabels) {\r\n const fontSize = 10;\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, { x: pdfX, y: labelY, size: fontSize, font, color: rgb(0, 0, 0) });\r\n }\r\n }\r\n\r\n if (field.required) {\r\n radioGroup.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n console.warn(`Unknown field type: ${fieldType} for field ${field.name}`);\r\n }\r\n } catch (error) {\r\n console.error(`Error adding field ${field.name}:`, error);\r\n }\r\n }\r\n\r\n return await pdfDoc.save();\r\n}\r\n\r\n/**\r\n * Map field positions after page assembly\r\n * Updates field page numbers based on the final page arrangement\r\n *\r\n * @param fields - Original fields with positions\r\n * @param pageMapping - Map of \"originalFileId_originalPageIndex\" -> newPageNumber\r\n * @returns Fields with updated page positions\r\n */\r\nexport function mapFieldPositionsAfterAssembly<T extends { position: FormFieldPosition }>(\r\n fields: T[],\r\n pageMapping: Map<string, number>\r\n): T[] {\r\n return fields.map(field => {\r\n // Try to find new page number from mapping\r\n // This requires the caller to track originalFileId and originalPageIndex\r\n // For simple cases where mapping key is just the page number, use that\r\n const mappingKey = String(field.position.page - 1); // 0-indexed for mapping\r\n const newPageNumber = pageMapping.get(mappingKey);\r\n\r\n if (newPageNumber !== undefined) {\r\n return {\r\n ...field,\r\n position: { ...field.position, page: newPageNumber }\r\n };\r\n }\r\n\r\n return field;\r\n }).filter(field => {\r\n // Filter out fields whose pages no longer exist\r\n const mappingKey = String(field.position.page - 1);\r\n return pageMapping.has(mappingKey) || pageMapping.size === 0;\r\n });\r\n}\r\n","import React, { \r\n useState, \r\n useCallback, \r\n useEffect, \r\n useRef, \r\n forwardRef, \r\n useImperativeHandle, \r\n useReducer,\r\n useMemo\r\n} from 'react';\r\nimport { DndProvider, useDrag, useDrop } from 'react-dnd';\r\nimport { HTML5Backend } from 'react-dnd-html5-backend';\r\nimport { \r\n Upload, \r\n FileText, \r\n Image as ImageIcon, \r\n Trash2, \r\n MoreHorizontal,\r\n GripVertical,\r\n Check,\r\n X,\r\n FolderOpen\r\n} from 'lucide-react';\r\n\r\nimport {\r\n Button,\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n CardTitle,\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuTrigger,\r\n AlertDialog,\r\n AlertDialogAction,\r\n AlertDialogCancel,\r\n AlertDialogContent,\r\n AlertDialogDescription,\r\n AlertDialogFooter,\r\n AlertDialogHeader,\r\n AlertDialogTitle,\r\n Badge,\r\n Input,\r\n Label,\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger\r\n} from '../lib/ui';\r\n\r\nimport { pdfToImages, imageToPdf, normalizeUploadedPdfBytes } from '../utils/pdf-helpers';\r\nimport { PdfPasswordRequiredError } from '../utils/pdf-decrypt';\r\nimport { extractFieldsFromPdf } from '../utils/field-extraction';\r\nimport { addFormFieldsToPdf, type FormFieldForPdf } from '../utils/add-form-fields';\r\nimport { cn } from '../lib/utils';\r\nimport type { PageInfo, FileInfo, PageAssemblerState, PageAssemblerProps, PageAssemblerHandle, TrackedFormField } from '../types';\r\n\r\n/**\r\n * Rows of page thumbnails shown per file before the grid starts scrolling.\r\n * Two is enough to see that a file has pages and to drag between them, while\r\n * keeping a long upload from burying the files listed after it.\r\n */\r\nconst VISIBLE_PAGE_ROWS = 2;\r\n\r\n// Multi-select utilities\r\nconst isMultiSelectModifier = (event: React.MouseEvent): boolean => {\r\n return event.ctrlKey || event.metaKey;\r\n};\r\n\r\nconst isRangeSelectModifier = (event: React.MouseEvent): boolean => {\r\n return event.shiftKey;\r\n};\r\n\r\nconst handleContextMenu = (event: React.MouseEvent): void => {\r\n if (event.ctrlKey && /Mac|iPod|iPhone|iPad/.test(navigator.userAgent)) {\r\n event.preventDefault();\r\n }\r\n};\r\n\r\nconst getPageRange = (files: FileInfo[], startPageId: string, endPageId: string): string[] => {\r\n const allPages: { id: string; fileId: string }[] = [];\r\n files.forEach(file => {\r\n file.pages.forEach(page => {\r\n allPages.push({ id: page.id, fileId: file.id });\r\n });\r\n });\r\n\r\n const startIndex = allPages.findIndex(p => p.id === startPageId);\r\n const endIndex = allPages.findIndex(p => p.id === endPageId);\r\n\r\n if (startIndex === -1 || endIndex === -1) return [];\r\n\r\n const start = Math.min(startIndex, endIndex);\r\n const end = Math.max(startIndex, endIndex);\r\n\r\n return allPages.slice(start, end + 1).map(p => p.id);\r\n};\r\n\r\n// Action types for reducer\r\ntype AssemblerAction = \r\n | { type: 'ADD_FILE'; payload: FileInfo }\r\n | { type: 'REMOVE_FILE'; payload: string }\r\n | { type: 'UPDATE_FILE'; payload: { fileId: string; updates: Partial<FileInfo> } }\r\n | { type: 'REORDER_PAGES'; payload: { fileId: string; newOrder: PageInfo[] } }\r\n | { type: 'REORDER_FILES'; payload: { newOrder: FileInfo[] } }\r\n | { type: 'MOVE_PAGES'; payload: { pageIds: string[]; targetFileId: string } }\r\n | { type: 'DELETE_PAGES'; payload: string[] }\r\n | { type: 'SET_SELECTION'; payload: string[] }\r\n | { type: 'TOGGLE_PAGE_SELECTION'; payload: { pageId: string; files: FileInfo[] } }\r\n | { type: 'RANGE_SELECT_PAGES'; payload: { pageId: string; files: FileInfo[] } }\r\n | { type: 'SINGLE_SELECT_PAGE'; payload: string }\r\n | { type: 'CLEAR_SELECTION' }\r\n | { type: 'RENAME_FILE'; payload: { fileId: string; name: string } }\r\n | { type: 'RESET'; payload?: PageAssemblerState };\r\n\r\n// Reducer\r\nfunction assemblerReducer(state: PageAssemblerState, action: AssemblerAction): PageAssemblerState {\r\n switch (action.type) {\r\n case 'ADD_FILE': {\r\n const existingFileById = state.files.find(f => f.id === action.payload.id);\r\n if (existingFileById) return state;\r\n \r\n return {\r\n ...state,\r\n files: [...state.files, action.payload]\r\n };\r\n }\r\n \r\n case 'REMOVE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.filter(f => f.id !== action.payload),\r\n selection: state.selection.filter(pageId => \r\n !state.files.find(f => f.id === action.payload)?.pages.some(p => p.id === pageId)\r\n )\r\n };\r\n \r\n case 'UPDATE_FILE':\r\n return {\r\n ...state,\r\n files: state.files.map(f => \r\n f.id === action.payload.fileId \r\n ? { ...f, ...action.payload.updates }\r\n : f\r\n )\r\n };\r\n \r\n case 'REORDER_PAGES':\r\n return {\r\n ...state,\r\n files: state.files.map(f =>\r\n f.id === action.payload.fileId\r\n ? { ...f, pages: action.payload.newOrder }\r\n : f\r\n )\r\n };\r\n \r\n case 'REORDER_FILES':\r\n return {\r\n ...state,\r\n files: action.payload.newOrder\r\n };\r\n \r\n case 'MOVE_PAGES': {\r\n const { pageIds, targetFileId } = action.payload;\r\n const existingPageIds = state.files.flatMap(f => f.pages.map(p => p.id));\r\n const pagesToActuallyMove = pageIds.filter(id => existingPageIds.includes(id));\r\n \r\n if (pagesToActuallyMove.length === 0) return state;\r\n \r\n const pagesToMove: PageInfo[] = [];\r\n \r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n if (pagesToActuallyMove.includes(page.id)) {\r\n pagesToMove.push(page);\r\n }\r\n }\r\n }\r\n \r\n const updatedFiles = state.files.map(file => {\r\n if (file.id === targetFileId) {\r\n const existingPageIds = file.pages.map(p => p.id);\r\n const newPages = pagesToMove.filter(p => !existingPageIds.includes(p.id));\r\n \r\n return {\r\n ...file,\r\n pages: [...file.pages, ...newPages]\r\n };\r\n } else {\r\n return {\r\n ...file,\r\n pages: file.pages.filter(page => !pagesToActuallyMove.includes(page.id))\r\n };\r\n }\r\n });\r\n \r\n return {\r\n ...state,\r\n files: updatedFiles,\r\n selection: []\r\n };\r\n }\r\n \r\n case 'DELETE_PAGES': {\r\n const pageIdsToDelete = action.payload;\r\n const existingPageIds = state.files.flatMap(f => f.pages.map(p => p.id));\r\n const pagesToActuallyDelete = pageIdsToDelete.filter(id => existingPageIds.includes(id));\r\n \r\n if (pagesToActuallyDelete.length === 0) return state;\r\n \r\n const updatedFiles = state.files.map(file => {\r\n const remainingPages = file.pages.filter(page => !pagesToActuallyDelete.includes(page.id));\r\n return {\r\n ...file,\r\n pages: remainingPages\r\n };\r\n }).filter(file => file.pages.length > 0);\r\n \r\n return {\r\n ...state,\r\n files: updatedFiles,\r\n selection: state.selection.filter(id => !pagesToActuallyDelete.includes(id))\r\n };\r\n }\r\n \r\n case 'SET_SELECTION':\r\n return {\r\n ...state,\r\n selection: action.payload\r\n };\r\n \r\n case 'TOGGLE_PAGE_SELECTION': {\r\n const { pageId } = action.payload;\r\n const isSelected = state.selection.includes(pageId);\r\n \r\n if (isSelected) {\r\n return {\r\n ...state,\r\n selection: state.selection.filter(id => id !== pageId),\r\n lastSelectedPageId: pageId\r\n };\r\n } else {\r\n return {\r\n ...state,\r\n selection: [...state.selection, pageId],\r\n lastSelectedPageId: pageId\r\n };\r\n }\r\n }\r\n \r\n case 'RANGE_SELECT_PAGES': {\r\n const { pageId, files } = action.payload;\r\n \r\n if (!state.lastSelectedPageId) {\r\n return {\r\n ...state,\r\n selection: [pageId],\r\n lastSelectedPageId: pageId\r\n };\r\n }\r\n \r\n const rangePageIds = getPageRange(files, state.lastSelectedPageId, pageId);\r\n const newSelection = [...new Set([...state.selection, ...rangePageIds])];\r\n \r\n return {\r\n ...state,\r\n selection: newSelection,\r\n lastSelectedPageId: pageId\r\n };\r\n }\r\n \r\n case 'SINGLE_SELECT_PAGE': {\r\n return {\r\n ...state,\r\n selection: [action.payload],\r\n lastSelectedPageId: action.payload\r\n };\r\n }\r\n \r\n case 'CLEAR_SELECTION':\r\n return {\r\n ...state,\r\n selection: [],\r\n lastSelectedPageId: undefined\r\n };\r\n \r\n case 'RENAME_FILE':\r\n return {\r\n ...state,\r\n files: state.files.map(f =>\r\n f.id === action.payload.fileId\r\n ? { ...f, name: action.payload.name }\r\n : f\r\n )\r\n };\r\n \r\n case 'RESET':\r\n return action.payload || { files: [], selection: [], lastSelectedPageId: undefined };\r\n \r\n default:\r\n return state;\r\n }\r\n}\r\n\r\n// Drag and drop types\r\nconst DND_TYPES = {\r\n PAGE: 'page',\r\n FILE: 'file'\r\n} as const;\r\n\r\n// DraggablePageThumbnail Component\r\ninterface DraggablePageThumbnailProps {\r\n page: PageInfo;\r\n fileId: string;\r\n index: number;\r\n isSelected: boolean;\r\n onSingleSelect: (pageId: string) => void;\r\n onToggleSelect: (pageId: string) => void;\r\n onRangeSelect: (pageId: string) => void;\r\n movePageInFile: (dragIndex: number, hoverIndex: number) => void;\r\n isDraggingPageRef?: React.MutableRefObject<boolean>;\r\n}\r\n\r\nconst DraggablePageThumbnail: React.FC<DraggablePageThumbnailProps> = ({\r\n page,\r\n fileId,\r\n index,\r\n isSelected,\r\n onSingleSelect,\r\n onToggleSelect,\r\n onRangeSelect,\r\n movePageInFile,\r\n isDraggingPageRef\r\n}) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const [{ isDragging }, drag] = useDrag({\r\n type: DND_TYPES.PAGE,\r\n item: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = true;\r\n }\r\n return { pageId: page.id, fileId, index };\r\n },\r\n collect: (monitor) => ({\r\n isDragging: monitor.isDragging(),\r\n }),\r\n end: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = false;\r\n }\r\n }\r\n });\r\n\r\n const [{ handlerId }, drop] = useDrop<\r\n { pageId: string; fileId: string; index: number },\r\n void,\r\n { handlerId: string | symbol | null }\r\n >({\r\n accept: DND_TYPES.PAGE,\r\n collect(monitor) {\r\n return {\r\n handlerId: monitor.getHandlerId(),\r\n };\r\n },\r\n hover(item, monitor) {\r\n if (!ref.current) return;\r\n if (item.fileId !== fileId) return;\r\n\r\n const dragIndex = item.index;\r\n const hoverIndex = index;\r\n\r\n if (dragIndex === hoverIndex) return;\r\n\r\n const hoverBoundingRect = ref.current?.getBoundingClientRect();\r\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\r\n const clientOffset = monitor.getClientOffset();\r\n const hoverClientY = clientOffset!.y - hoverBoundingRect.top;\r\n\r\n if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) return;\r\n if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) return;\r\n\r\n movePageInFile(dragIndex, hoverIndex);\r\n item.index = hoverIndex;\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n drag(drop(ref));\r\n }, [drag, drop]);\r\n\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n handleContextMenu(e);\r\n \r\n if (isRangeSelectModifier(e)) {\r\n onRangeSelect(page.id);\r\n } else if (isMultiSelectModifier(e)) {\r\n onToggleSelect(page.id);\r\n } else {\r\n onSingleSelect(page.id);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n data-handler-id={handlerId}\r\n className={cn(\r\n \"relative group cursor-pointer border-2 rounded-lg overflow-hidden bg-white transition-all\",\r\n isDragging && \"opacity-50 scale-95\",\r\n isSelected ? \"border-primary shadow-md\" : \"border-gray-200 hover:border-gray-300\"\r\n )}\r\n onClick={handleClick}\r\n >\r\n <div className=\"absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity bg-black/50 rounded p-1 z-10\">\r\n <GripVertical className=\"h-3 w-3 text-white\" />\r\n </div>\r\n \r\n <div\r\n className=\"absolute top-2 left-2 z-10\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={(e) => {\r\n const nativeEvent = e.nativeEvent;\r\n if (nativeEvent && 'shiftKey' in nativeEvent && nativeEvent.shiftKey) {\r\n onRangeSelect(page.id);\r\n } else if (nativeEvent && (('ctrlKey' in nativeEvent && nativeEvent.ctrlKey) || ('metaKey' in nativeEvent && nativeEvent.metaKey))) {\r\n onToggleSelect(page.id);\r\n } else {\r\n onSingleSelect(page.id);\r\n }\r\n }}\r\n onContextMenu={handleContextMenu}\r\n className=\"h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary focus:ring-2 bg-white/90 cursor-pointer\"\r\n />\r\n </div>\r\n \r\n <div className=\"aspect-[3/4] relative\">\r\n <img\r\n src={page.thumbUrl}\r\n alt={`Page ${index + 1}`}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n \r\n <Badge\r\n variant=\"secondary\"\r\n className=\"absolute bottom-1 right-1 text-xs px-1 py-0\"\r\n >\r\n {index + 1}\r\n </Badge>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ReorderablePageGrid Component\r\ninterface ReorderablePageGridProps {\r\n file: FileInfo;\r\n selectedPageIds: string[];\r\n onSingleSelectPage: (pageId: string) => void;\r\n onTogglePageSelect: (pageId: string) => void;\r\n onRangeSelectPage: (pageId: string) => void;\r\n onReorderPages: (fileId: string, newOrder: PageInfo[]) => void;\r\n isDraggingPageRef?: React.MutableRefObject<boolean>;\r\n}\r\n\r\nconst ReorderablePageGrid: React.FC<ReorderablePageGridProps> = ({\r\n file,\r\n selectedPageIds,\r\n onSingleSelectPage,\r\n onTogglePageSelect,\r\n onRangeSelectPage,\r\n onReorderPages,\r\n isDraggingPageRef\r\n}) => {\r\n const movePageInFile = useCallback((dragIndex: number, hoverIndex: number) => {\r\n const newPages = [...file.pages];\r\n const draggedPage = newPages[dragIndex];\r\n\r\n newPages.splice(dragIndex, 1);\r\n newPages.splice(hoverIndex, 0, draggedPage);\r\n\r\n onReorderPages(file.id, newPages);\r\n }, [file.id, file.pages, onReorderPages]);\r\n\r\n // Cap the grid at two rows and scroll past that, so a 40-page upload does not\r\n // push every file below it off the screen.\r\n //\r\n // The height has to be measured rather than hardcoded: thumbnails are\r\n // `aspect-[3/4]` inside a 2/3/4/6-column responsive grid, so a row's height\r\n // depends on the breakpoint AND the container width. Measuring the first\r\n // thumbnail keeps the cap exact at every size; a fixed `max-h-*` would cut a\r\n // row in half at some widths and leave dead space at others.\r\n const gridRef = useRef<HTMLDivElement>(null);\r\n const [maxHeight, setMaxHeight] = useState<number | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n const grid = gridRef.current;\r\n if (!grid || typeof ResizeObserver === 'undefined') return;\r\n\r\n const measure = () => {\r\n const firstThumbnail = grid.firstElementChild as HTMLElement | null;\r\n if (!firstThumbnail) return;\r\n const rowHeight = firstThumbnail.getBoundingClientRect().height;\r\n // Images load after mount; a zero height here means \"not laid out yet\",\r\n // and the observer will call back once it is.\r\n if (rowHeight <= 0) return;\r\n const rowGap = parseFloat(getComputedStyle(grid).rowGap) || 0;\r\n // Ceil, or the cap lands a fraction below the height it is capping: a\r\n // fractional row (288.9px at six columns) doubles into a cap 0.2px short\r\n // of the natural two-row height, and a file with exactly two rows gets a\r\n // scrollbar it should never have.\r\n setMaxHeight(Math.ceil(rowHeight * VISIBLE_PAGE_ROWS + rowGap * (VISIBLE_PAGE_ROWS - 1)));\r\n };\r\n\r\n measure();\r\n const observer = new ResizeObserver(measure);\r\n // Both: the grid changes width on resize, the thumbnail changes height when\r\n // the column count changes underneath it.\r\n observer.observe(grid);\r\n if (grid.firstElementChild) observer.observe(grid.firstElementChild);\r\n return () => observer.disconnect();\r\n // `file.pages`, not its length: `firstElementChild` is captured above, so a\r\n // reorder — which keeps the count — has to re-run this, or the observer is\r\n // left watching a thumbnail that is no longer the one being measured.\r\n }, [file.pages]);\r\n\r\n return (\r\n <div\r\n ref={gridRef}\r\n // overflow-x-hidden is explicit: with only overflow-y set, CSS computes\r\n // the other axis to `auto` and a stray horizontal scrollbar appears.\r\n className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-4 overflow-y-auto overflow-x-hidden\"\r\n style={{ maxHeight }}\r\n >\r\n {file.pages.map((page, index) => (\r\n <DraggablePageThumbnail\r\n key={page.id}\r\n page={page}\r\n fileId={file.id}\r\n index={index}\r\n isSelected={selectedPageIds.includes(page.id)}\r\n onSingleSelect={onSingleSelectPage}\r\n onToggleSelect={onTogglePageSelect}\r\n onRangeSelect={onRangeSelectPage}\r\n movePageInFile={movePageInFile}\r\n isDraggingPageRef={isDraggingPageRef}\r\n />\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\n// File drop zone component\r\ninterface FileDropZoneProps {\r\n targetIndex: number;\r\n onReorderFiles: (newOrder: FileInfo[]) => void;\r\n files: FileInfo[];\r\n}\r\n\r\nconst FileDropZone: React.FC<FileDropZoneProps> = ({\r\n targetIndex,\r\n onReorderFiles,\r\n files\r\n}) => {\r\n const [{ isOver, canDrop }, drop] = useDrop<\r\n { fileId: string; file: FileInfo },\r\n void,\r\n { isOver: boolean; canDrop: boolean }\r\n >({\r\n accept: DND_TYPES.FILE,\r\n drop: (item) => {\r\n const currentIndex = files.findIndex(f => f.id === item.fileId);\r\n if (currentIndex === -1) return;\r\n \r\n let newIndex = targetIndex;\r\n if (currentIndex < targetIndex) {\r\n newIndex = targetIndex - 1;\r\n }\r\n \r\n if (currentIndex === newIndex) return;\r\n \r\n const newFiles = [...files];\r\n const [movedFile] = newFiles.splice(currentIndex, 1);\r\n newFiles.splice(newIndex, 0, movedFile);\r\n \r\n onReorderFiles(newFiles);\r\n },\r\n collect: (monitor) => ({\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n }),\r\n });\r\n\r\n const isActive = isOver && canDrop;\r\n\r\n return (\r\n <div\r\n ref={drop as unknown as React.Ref<HTMLDivElement>}\r\n className={cn(\r\n \"h-2 transition-all duration-200 mx-4\",\r\n isActive ? \"h-8 bg-primary/20 border-2 border-dashed border-primary rounded-lg\" : \"\"\r\n )}\r\n >\r\n {isActive && (\r\n <div className=\"flex items-center justify-center h-full text-primary text-sm font-medium\">\r\n Drop here to reorder\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// FileCard component\r\ninterface FileCardProps {\r\n file: FileInfo;\r\n selectedPageIds: string[];\r\n onSingleSelectPage: (pageId: string) => void;\r\n onTogglePageSelect: (pageId: string) => void;\r\n onRangeSelectPage: (pageId: string) => void;\r\n onSelectAllInFile: (fileId: string) => void;\r\n onRemoveFile: (fileId: string) => void;\r\n onRenameFile: (fileId: string, name: string) => void;\r\n onReorderPages: (fileId: string, newOrder: PageInfo[]) => void;\r\n isDraggingPageRef?: React.MutableRefObject<boolean>;\r\n}\r\n\r\nconst FileCard: React.FC<FileCardProps> = ({\r\n file,\r\n selectedPageIds,\r\n onSingleSelectPage,\r\n onTogglePageSelect,\r\n onRangeSelectPage,\r\n onSelectAllInFile,\r\n onRemoveFile,\r\n onRenameFile,\r\n onReorderPages,\r\n isDraggingPageRef\r\n}) => {\r\n const [isRenaming, setIsRenaming] = useState(false);\r\n const [newName, setNewName] = useState(file.name);\r\n const fileSelectedPages = file.pages.filter(p => selectedPageIds.includes(p.id));\r\n const allPagesSelected = file.pages.length > 0 && fileSelectedPages.length === file.pages.length;\r\n\r\n // Stores an action to run after the dropdown menu fully closes,\r\n // so that focus cleanup completes before we unmount the card or open a dialog.\r\n const pendingDropdownAction = useRef<(() => void) | null>(null);\r\n\r\n const [{ isDraggingFile }, dragFile] = useDrag({\r\n type: DND_TYPES.FILE,\r\n item: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = true;\r\n }\r\n return { fileId: file.id, file };\r\n },\r\n collect: (monitor) => ({\r\n isDraggingFile: monitor.isDragging(),\r\n }),\r\n end: () => {\r\n if (isDraggingPageRef?.current !== undefined) {\r\n isDraggingPageRef.current = false;\r\n }\r\n }\r\n });\r\n\r\n const [, drop] = useDrop<\r\n { pageId: string; fileId: string; index: number },\r\n void,\r\n object\r\n >({\r\n accept: DND_TYPES.PAGE,\r\n drop: (_item) => {\r\n // Moving between files handled in parent\r\n },\r\n });\r\n\r\n const handleRename = () => {\r\n if (newName.trim() && newName !== file.name) {\r\n onRenameFile(file.id, newName.trim());\r\n }\r\n setIsRenaming(false);\r\n };\r\n\r\n const combineRefs = useCallback((el: HTMLDivElement | null) => {\r\n drop(el);\r\n dragFile(el);\r\n }, [drop, dragFile]);\r\n\r\n return (\r\n <Card \r\n className={cn(\r\n \"mb-6 transition-all cursor-move\",\r\n isDraggingFile ? \"opacity-50 rotate-2 scale-105 shadow-2xl z-50\" : \"opacity-100\"\r\n )} \r\n ref={combineRefs}\r\n >\r\n <CardHeader className=\"pb-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-3\">\r\n {file.type === 'pdf' ? (\r\n <FileText className=\"h-5 w-5 text-red-500\" />\r\n ) : (\r\n <ImageIcon className=\"h-5 w-5 text-blue-500\" />\r\n )}\r\n \r\n {isRenaming ? (\r\n <div className=\"flex items-center gap-2\">\r\n <Input\r\n value={newName}\r\n onChange={(e) => setNewName(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') handleRename();\r\n if (e.key === 'Escape') {\r\n setIsRenaming(false);\r\n setNewName(file.name);\r\n }\r\n }}\r\n className=\"h-8 text-sm\"\r\n autoFocus\r\n />\r\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={handleRename}>\r\n <Check className=\"h-3 w-3\" />\r\n </Button>\r\n <Button \r\n type=\"button\"\r\n size=\"sm\" \r\n variant=\"ghost\" \r\n onClick={() => {\r\n setIsRenaming(false);\r\n setNewName(file.name);\r\n }}\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <div>\r\n <CardTitle className=\"text-base\">{file.name}</CardTitle>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {file.pages.length} page{file.pages.length !== 1 ? 's' : ''}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n \r\n <div className=\"flex items-center gap-2\">\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={() => onSelectAllInFile(file.id)}\r\n disabled={file.pages.length === 0}\r\n >\r\n {allPagesSelected && <Check className=\"h-3 w-3 mr-2\" />}\r\n Select All\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n Select all pages in this file\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n \r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"hover:bg-gray-100 rounded-lg\">\r\n <MoreHorizontal className=\"h-4 w-4\" />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n align=\"end\"\r\n className=\"w-52\"\r\n onCloseAutoFocus={() => {\r\n pendingDropdownAction.current?.();\r\n pendingDropdownAction.current = null;\r\n }}\r\n >\r\n <DropdownMenuItem onSelect={() => {\r\n pendingDropdownAction.current = () => setIsRenaming(true);\r\n }}>\r\n <svg className=\"h-4 w-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\r\n </svg>\r\n Rename File\r\n </DropdownMenuItem>\r\n <DropdownMenuItem\r\n onSelect={() => {\r\n pendingDropdownAction.current = () => onRemoveFile(file.id);\r\n }}\r\n className=\"text-red-600 hover:text-red-700 hover:bg-red-50 focus:text-red-700 focus:bg-red-50\"\r\n >\r\n <Trash2 className=\"h-4 w-4 mr-2\" />\r\n Remove File\r\n </DropdownMenuItem>\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n \r\n <CardContent>\r\n <ReorderablePageGrid\r\n file={file}\r\n selectedPageIds={selectedPageIds}\r\n onSingleSelectPage={onSingleSelectPage}\r\n onTogglePageSelect={onTogglePageSelect}\r\n onRangeSelectPage={onRangeSelectPage}\r\n onReorderPages={onReorderPages}\r\n isDraggingPageRef={isDraggingPageRef}\r\n />\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\n// Bulk action bar\r\ninterface BulkActionBarProps {\r\n selectedCount: number;\r\n files: FileInfo[];\r\n onMovePages: (targetFileId: string) => void;\r\n onDeletePages: () => void;\r\n onClearSelection: () => void;\r\n}\r\n\r\nconst BulkActionBar: React.FC<BulkActionBarProps> = ({\r\n selectedCount,\r\n files,\r\n onMovePages,\r\n onDeletePages,\r\n onClearSelection\r\n}) => {\r\n if (selectedCount === 0) return null;\r\n\r\n return (\r\n <div className=\"sticky top-4 z-10 mb-4\">\r\n <Card className=\"p-4 shadow-lg border-primary/20 bg-blue-50\">\r\n <div className=\"flex items-center justify-between flex-wrap gap-4\">\r\n <div className=\"flex items-center gap-4 flex-wrap\">\r\n <span \r\n className=\"inline-flex items-center text-sm font-medium text-white rounded-full\"\r\n style={{ \r\n backgroundColor: '#0099cd',\r\n padding: '6px 14px',\r\n }}\r\n >\r\n {selectedCount} page{selectedCount !== 1 ? 's' : ''} selected\r\n </span>\r\n \r\n {files.length > 1 && (\r\n <div className=\"flex items-center gap-2\">\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Label htmlFor=\"move-select\" className=\"text-sm font-medium text-gray-700\">\r\n Move to file:\r\n </Label>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>Move selected pages to another file</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n <Select onValueChange={onMovePages}>\r\n <SelectTrigger id=\"move-select\" className=\"w-48 bg-white\">\r\n <SelectValue placeholder=\"Choose file...\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {files.map((file) => (\r\n <SelectItem key={file.id} value={file.id}>\r\n <div className=\"flex items-center gap-2\">\r\n {file.type === 'pdf' ? (\r\n <FileText className=\"h-4 w-4\" />\r\n ) : (\r\n <ImageIcon className=\"h-4 w-4\" />\r\n )}\r\n <span className=\"truncate\">{file.name}</span>\r\n </div>\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n )}\r\n </div>\r\n \r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"destructive\"\r\n size=\"sm\"\r\n onClick={onDeletePages}\r\n >\r\n <Trash2 className=\"h-4 w-4 mr-2\" />\r\n Delete Selected\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={onClearSelection}\r\n className=\"bg-white\"\r\n >\r\n Clear Selection\r\n </Button>\r\n </div>\r\n </div>\r\n </Card>\r\n </div>\r\n );\r\n};\r\n\r\n// Main PageAssembler component\r\nexport const PageAssembler = forwardRef<PageAssemblerHandle, PageAssemblerProps>(\r\n (props, ref) => {\r\n const { \r\n initialPdf, \r\n initialState, \r\n onChange, \r\n onValidityChange, \r\n limits, \r\n disableFileUpload = false,\r\n className \r\n } = props;\r\n \r\n const [state, dispatch] = useReducer(assemblerReducer, \r\n initialState || { \r\n files: [], \r\n selection: [], \r\n lastSelectedPageId: undefined\r\n });\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [processingStatus, setProcessingStatus] = useState<string>('');\r\n const [uploadError, setUploadError] = useState<string | null>(null);\r\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\r\n const [showRemoveFileConfirm, setShowRemoveFileConfirm] = useState(false);\r\n const [fileToRemove, setFileToRemove] = useState<{ id: string; name: string; pageCount: number } | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n \r\n const processedInitialPdfRef = useRef<string | null>(null);\r\n const isDraggingPage = useRef<boolean>(false);\r\n const onChangeRef = useRef(onChange);\r\n\r\n // Store original bytes for all files ever added, so pages moved from deleted files can still be copied\r\n const originalBytesCache = useRef<Map<string, Uint8Array>>(new Map());\r\n \r\n const summary = useMemo(() => ({\r\n totalFiles: state.files.length,\r\n totalPages: state.files.reduce((sum, file) => sum + file.pages.length, 0)\r\n }), [state.files]);\r\n \r\n const isValid = summary.totalPages > 0;\r\n\r\n useEffect(() => {\r\n onChangeRef.current = onChange;\r\n }, [onChange]);\r\n\r\n const debouncedOnChange = useMemo(\r\n () => debounce((newState: PageAssemblerState) => {\r\n onChangeRef.current?.(newState);\r\n }, 200),\r\n []\r\n );\r\n\r\n useEffect(() => {\r\n debouncedOnChange(state);\r\n }, [state, debouncedOnChange]);\r\n\r\n useEffect(() => {\r\n onValidityChange?.(isValid);\r\n }, [isValid, onValidityChange]);\r\n\r\n // Process initial PDF\r\n const processInitialPdf = useCallback(async (pdf: File | Blob | ArrayBuffer | Uint8Array) => {\r\n setIsLoading(true);\r\n setProcessingStatus('Processing initial PDF...');\r\n \r\n try {\r\n let pdfBytes: Uint8Array;\r\n \r\n if (pdf instanceof Blob) {\r\n const arrayBuffer = await pdf.arrayBuffer();\r\n pdfBytes = new Uint8Array(arrayBuffer);\r\n } else if (pdf instanceof ArrayBuffer) {\r\n pdfBytes = new Uint8Array(pdf);\r\n } else {\r\n pdfBytes = new Uint8Array(pdf);\r\n }\r\n\r\n // Decrypt permission-restricted (empty-password) PDFs up front so\r\n // every later pdf-lib load (assembly, field extraction) succeeds.\r\n pdfBytes = await normalizeUploadedPdfBytes(pdfBytes);\r\n\r\n const defensiveCopy = new Uint8Array(pdfBytes);\r\n const pages = await pdfToImages(defensiveCopy, { hideFormFields: true });\r\n \r\n if (pages.length === 0) {\r\n throw new Error('Failed to process PDF pages');\r\n }\r\n\r\n let originalBytes: Uint8Array;\r\n let originalFile: File;\r\n \r\n try {\r\n new Uint8Array(pdfBytes.buffer || pdfBytes, 0, 1);\r\n originalBytes = new Uint8Array(pdfBytes);\r\n originalFile = new File([pdfBytes.buffer as ArrayBuffer], 'Initial Document.pdf', { type: 'application/pdf' });\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n if (errorMessage.includes('detached') || errorMessage.includes('ArrayBuffer')) {\r\n throw new Error('Initial PDF data is no longer available. Please try refreshing the page.');\r\n }\r\n throw error;\r\n }\r\n\r\n const fileName = (pdf instanceof File) ? pdf.name : 'Initial Document.pdf';\r\n const fileId = generateId();\r\n \r\n const file: FileInfo = {\r\n id: fileId,\r\n name: fileName,\r\n type: 'pdf',\r\n originalFile,\r\n originalBytes,\r\n pages: pages.map((page, index) => ({\r\n id: generateId(),\r\n srcIndex: index,\r\n thumbUrl: page.imageUrl,\r\n width: page.width,\r\n height: page.height,\r\n mime: 'application/pdf',\r\n originalFileId: fileId\r\n }))\r\n };\r\n\r\n // Cache original bytes so pages can be copied even if file is later deleted\r\n originalBytesCache.current.set(fileId, originalBytes);\r\n\r\n dispatch({ type: 'ADD_FILE', payload: file });\r\n } catch (error) {\r\n console.error('Error processing initial PDF:', error);\r\n } finally {\r\n setIsLoading(false);\r\n setProcessingStatus('');\r\n }\r\n }, []);\r\n\r\n // Initialize with initial PDF if provided.\r\n //\r\n // Seed whenever there's an initialPdf, the assembler currently has no\r\n // pages, and there's no meaningful `initialState` to restore. We do NOT\r\n // bail merely because `initialState` is truthy: a consumer that echoes\r\n // state back via `onChange` (e.g. document-prepare's edit flow) can hand\r\n // us an EMPTY initialState before the async PDF load finishes, which\r\n // previously shadowed `initialPdf` forever and left the step stuck on\r\n // \"No files added\". But a NON-empty initialState (a saved page\r\n // arrangement, e.g. restored on step navigation) must win — letting it be\r\n // restored by the effect below instead of re-seeding the raw PDF, which\r\n // would race the RESET and duplicate pages. The pdfIdentifier dedup still\r\n // prevents reprocessing the same PDF.\r\n const hasRestorableState = !!initialState && initialState.files.length > 0;\r\n useEffect(() => {\r\n if (initialPdf && state.files.length === 0 && !hasRestorableState) {\r\n const pdfIdentifier = initialPdf instanceof Uint8Array\r\n ? `uint8array-${initialPdf.length}-${initialPdf[0]}-${initialPdf[initialPdf.length-1]}`\r\n : `${initialPdf.constructor.name}-${(initialPdf as File | Blob).size || (initialPdf as ArrayBuffer).byteLength}`;\r\n\r\n if (processedInitialPdfRef.current === pdfIdentifier) {\r\n return;\r\n }\r\n\r\n processedInitialPdfRef.current = pdfIdentifier;\r\n processInitialPdf(initialPdf);\r\n }\r\n }, [initialPdf, state.files.length, hasRestorableState, processInitialPdf]);\r\n\r\n // Handle initialState changes. Only restore a state that actually has\r\n // files — an empty initialState is treated as \"no state\" so it can't wipe\r\n // a PDF that was just seeded from `initialPdf` (see above).\r\n useEffect(() => {\r\n if (initialState && initialState.files.length > 0) {\r\n dispatch({ type: 'RESET', payload: initialState });\r\n }\r\n }, [initialState]);\r\n\r\n // File processing\r\n const processFiles = useCallback(async (files: FileList | File[]) => {\r\n const fileArray = Array.from(files);\r\n const maxFileSize = (limits?.maxFileSizeMB || 10) * 1024 * 1024;\r\n\r\n setUploadError(null);\r\n setIsLoading(true);\r\n setProcessingStatus(`Processing ${fileArray.length} file${fileArray.length !== 1 ? 's' : ''}...`);\r\n\r\n for (const file of fileArray) {\r\n try {\r\n if (file.size > maxFileSize) {\r\n console.error(`File ${file.name} is too large`);\r\n continue;\r\n }\r\n\r\n const validTypes = ['application/pdf', 'image/png', 'image/jpeg', 'image/jpg', 'image/webp'];\r\n if (!validTypes.includes(file.type)) {\r\n console.error(`Unsupported file type: ${file.name}`);\r\n continue;\r\n }\r\n\r\n const fileInfo: FileInfo = {\r\n id: generateId(),\r\n name: file.name,\r\n type: file.type === 'application/pdf' ? 'pdf' : 'image',\r\n originalFile: file,\r\n originalBytes: new Uint8Array(),\r\n pages: []\r\n };\r\n\r\n if (file.type === 'application/pdf') {\r\n setProcessingStatus(`Processing PDF: ${file.name}`);\r\n const arrayBuffer = await file.arrayBuffer();\r\n // Decrypt permission-restricted (empty-password) PDFs up front so\r\n // every later pdf-lib load (assembly, field extraction) succeeds.\r\n const pdfBytes = await normalizeUploadedPdfBytes(new Uint8Array(arrayBuffer));\r\n fileInfo.originalBytes = new Uint8Array(pdfBytes);\r\n\r\n // Cache original bytes so pages can be copied even if file is later deleted\r\n originalBytesCache.current.set(fileInfo.id, fileInfo.originalBytes);\r\n\r\n const defensiveCopy = new Uint8Array(pdfBytes);\r\n const pages = await pdfToImages(defensiveCopy, { hideFormFields: true });\r\n fileInfo.pages = pages.map((page, index) => ({\r\n id: generateId(),\r\n srcIndex: index,\r\n thumbUrl: page.imageUrl,\r\n width: page.width,\r\n height: page.height,\r\n mime: file.type,\r\n originalFileId: fileInfo.id\r\n }));\r\n } else {\r\n setProcessingStatus(`Processing image: ${file.name}`);\r\n\r\n const arrayBuffer = await file.arrayBuffer();\r\n const imageBytes = new Uint8Array(arrayBuffer);\r\n fileInfo.originalBytes = new Uint8Array(imageBytes);\r\n\r\n // Cache original bytes so pages can be copied even if file is later deleted\r\n originalBytesCache.current.set(fileInfo.id, fileInfo.originalBytes);\r\n\r\n const thumbUrl = URL.createObjectURL(file);\r\n\r\n const img = new Image();\r\n const dimensions = await new Promise<{ width: number; height: number }>((resolve) => {\r\n img.onload = () => resolve({ width: img.width, height: img.height });\r\n img.src = thumbUrl;\r\n });\r\n\r\n const maxWidth = 595;\r\n const maxHeight = 842;\r\n\r\n let pdfWidth = dimensions.width;\r\n let pdfHeight = dimensions.height;\r\n\r\n if (dimensions.width > maxWidth || dimensions.height > maxHeight) {\r\n const scaleX = maxWidth / dimensions.width;\r\n const scaleY = maxHeight / dimensions.height;\r\n const scale = Math.min(scaleX, scaleY);\r\n\r\n pdfWidth = dimensions.width * scale;\r\n pdfHeight = dimensions.height * scale;\r\n }\r\n\r\n fileInfo.pages = [{\r\n id: generateId(),\r\n srcIndex: 0,\r\n thumbUrl,\r\n width: Math.max(pdfWidth, 100),\r\n height: Math.max(pdfHeight, 100),\r\n mime: file.type,\r\n originalFileId: fileInfo.id\r\n }];\r\n }\r\n\r\n dispatch({ type: 'ADD_FILE', payload: fileInfo });\r\n } catch (error) {\r\n console.error(`Error processing file ${file.name}:`, error);\r\n if (error instanceof PdfPasswordRequiredError) {\r\n setUploadError(`${file.name}: ${error.userMessage}`);\r\n } else {\r\n setUploadError(`Failed to process \"${file.name}\". The file may be corrupted or unsupported.`);\r\n }\r\n }\r\n }\r\n\r\n setIsLoading(false);\r\n setProcessingStatus('');\r\n }, [limits]);\r\n\r\n // File upload handlers\r\n const handleFileUpload = useCallback(() => {\r\n fileInputRef.current?.click();\r\n }, []);\r\n\r\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n if (files) {\r\n processFiles(files);\r\n }\r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n }, [processFiles]);\r\n\r\n const handleDrop = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n \r\n const files = e.dataTransfer.files;\r\n if (files && files.length > 0) {\r\n if (isDraggingPage.current) {\r\n return;\r\n }\r\n processFiles(files);\r\n }\r\n }, [processFiles]);\r\n\r\n const handleDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n }, []);\r\n\r\n // Selection handlers\r\n const handleSingleSelectPage = useCallback((pageId: string) => {\r\n dispatch({ type: 'SINGLE_SELECT_PAGE', payload: pageId });\r\n }, []);\r\n\r\n const handleTogglePageSelect = useCallback((pageId: string) => {\r\n dispatch({ type: 'TOGGLE_PAGE_SELECTION', payload: { pageId, files: state.files } });\r\n }, [state.files]);\r\n\r\n const handleRangeSelectPage = useCallback((pageId: string) => {\r\n dispatch({ type: 'RANGE_SELECT_PAGES', payload: { pageId, files: state.files } });\r\n }, [state.files]);\r\n\r\n const handleSelectAllInFile = useCallback((fileId: string) => {\r\n const file = state.files.find(f => f.id === fileId);\r\n if (!file) return;\r\n \r\n const filePageIds = file.pages.map(p => p.id);\r\n const allSelected = filePageIds.every(id => state.selection.includes(id));\r\n \r\n if (allSelected) {\r\n dispatch({ \r\n type: 'SET_SELECTION', \r\n payload: state.selection.filter(id => !filePageIds.includes(id)) \r\n });\r\n } else {\r\n const newSelection = [...new Set([...state.selection, ...filePageIds])];\r\n dispatch({ type: 'SET_SELECTION', payload: newSelection });\r\n }\r\n }, [state.files, state.selection]);\r\n\r\n // Bulk operations\r\n const handleMovePages = useCallback((targetFileId: string) => {\r\n if (state.selection.length === 0) return;\r\n \r\n dispatch({ type: 'MOVE_PAGES', payload: { pageIds: state.selection, targetFileId } });\r\n }, [state.selection]);\r\n\r\n const handleDeletePages = useCallback(() => {\r\n setShowDeleteConfirm(true);\r\n }, []);\r\n\r\n const confirmDeletePages = useCallback(() => {\r\n dispatch({ type: 'DELETE_PAGES', payload: state.selection });\r\n setShowDeleteConfirm(false);\r\n }, [state.selection]);\r\n\r\n const handleRemoveFile = useCallback((fileId: string) => {\r\n const file = state.files.find(f => f.id === fileId);\r\n if (!file) return;\r\n\r\n if (file.pages.length > 0) {\r\n setFileToRemove({\r\n id: file.id,\r\n name: file.name,\r\n pageCount: file.pages.length\r\n });\r\n setShowRemoveFileConfirm(true);\r\n } else {\r\n dispatch({ type: 'REMOVE_FILE', payload: fileId });\r\n }\r\n }, [state.files]);\r\n\r\n const confirmRemoveFile = useCallback(() => {\r\n if (fileToRemove) {\r\n dispatch({ type: 'REMOVE_FILE', payload: fileToRemove.id });\r\n setFileToRemove(null);\r\n }\r\n setShowRemoveFileConfirm(false);\r\n }, [fileToRemove]);\r\n\r\n const handleRenameFile = useCallback((fileId: string, name: string) => {\r\n dispatch({ type: 'RENAME_FILE', payload: { fileId, name } });\r\n }, []);\r\n \r\n const handleReorderFiles = useCallback((newOrder: FileInfo[]) => {\r\n dispatch({ type: 'REORDER_FILES', payload: { newOrder } });\r\n }, []);\r\n\r\n // Imperative API\r\n useImperativeHandle(ref, () => ({\r\n assemble: async () => {\r\n setIsLoading(true);\r\n setProcessingStatus('Assembling PDF...');\r\n\r\n try {\r\n const { PDFDocument, PDFName, PDFString } = await import('pdf-lib');\r\n\r\n const loadedPdfs = new Map<string, import('pdf-lib').PDFDocument>();\r\n const fileMap = new Map<string, FileInfo>();\r\n\r\n // Count PDF files and check if we can preserve form fields\r\n const pdfFiles = state.files.filter(f => f.type === 'pdf' && f.originalBytes?.length > 0);\r\n const imageFiles = state.files.filter(f => f.type === 'image');\r\n\r\n // Check if this is a single-PDF scenario\r\n const isSinglePdfScenario = pdfFiles.length === 1 && imageFiles.length === 0;\r\n\r\n for (const file of state.files) {\r\n fileMap.set(file.id, file);\r\n\r\n if (file.type === 'pdf' && file.originalBytes && file.originalBytes.length > 0) {\r\n try {\r\n const sourcePdf = await PDFDocument.load(file.originalBytes);\r\n loadedPdfs.set(file.id, sourcePdf);\r\n } catch (error) {\r\n console.error(`Error loading PDF for file ${file.id}:`, error);\r\n }\r\n }\r\n }\r\n\r\n // Also load PDFs for any pages that reference deleted files (from cache)\r\n // This handles the case where pages were moved from file B to file A, then file B was deleted\r\n const referencedFileIds = new Set<string>();\r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n const originalFileId = page.originalFileId || file.id;\r\n if (!loadedPdfs.has(originalFileId)) {\r\n referencedFileIds.add(originalFileId);\r\n }\r\n }\r\n }\r\n\r\n // Load PDFs from cache for referenced but deleted files\r\n for (const fileId of referencedFileIds) {\r\n const cachedBytes = originalBytesCache.current.get(fileId);\r\n if (cachedBytes && cachedBytes.length > 0) {\r\n try {\r\n console.log(`[PageAssembler] Loading PDF from cache for deleted file ${fileId}`);\r\n const sourcePdf = await PDFDocument.load(cachedBytes);\r\n loadedPdfs.set(fileId, sourcePdf);\r\n } catch (error) {\r\n console.error(`Error loading cached PDF for file ${fileId}:`, error);\r\n }\r\n }\r\n }\r\n\r\n // Single PDF scenario: check if we can return original bytes\r\n console.log('[PageAssembler] Checking single PDF scenario:', {\r\n isSinglePdfScenario,\r\n pdfFilesCount: pdfFiles.length,\r\n imageFilesCount: imageFiles.length,\r\n });\r\n\r\n if (isSinglePdfScenario && pdfFiles[0]) {\r\n const sourceFile = pdfFiles[0];\r\n const sourcePdf = loadedPdfs.get(sourceFile.id);\r\n\r\n console.log('[PageAssembler] Single PDF check:', {\r\n sourcePdfLoaded: !!sourcePdf,\r\n pagesCount: sourceFile.pages.length,\r\n originalBytesLength: sourceFile.originalBytes?.length,\r\n });\r\n\r\n if (sourcePdf) {\r\n const desiredPageIndices = sourceFile.pages.map(p => p.srcIndex);\r\n const originalPageCount = sourcePdf.getPageCount();\r\n\r\n const allPagesFromSameFile = sourceFile.pages.every(\r\n p => (p.originalFileId || sourceFile.id) === sourceFile.id\r\n );\r\n\r\n const isOriginalOrder = desiredPageIndices.length === originalPageCount &&\r\n desiredPageIndices.every((idx, i) => idx === i);\r\n\r\n console.log('[PageAssembler] Original bytes check:', {\r\n allPagesFromSameFile,\r\n isOriginalOrder,\r\n desiredPageIndices,\r\n originalPageCount,\r\n });\r\n\r\n if (allPagesFromSameFile && isOriginalOrder) {\r\n // No changes - return original bytes to preserve EVERYTHING\r\n console.log('[PageAssembler] ✅ Returning ORIGINAL bytes (form fields preserved)');\r\n const arrayBuffer = sourceFile.originalBytes.buffer.slice(\r\n sourceFile.originalBytes.byteOffset,\r\n sourceFile.originalBytes.byteOffset + sourceFile.originalBytes.byteLength\r\n ) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer], { type: 'application/pdf' });\r\n return blob;\r\n } else {\r\n console.log('[PageAssembler] ⚠️ Pages modified, will use copyPages (form fields may be lost)');\r\n }\r\n }\r\n }\r\n\r\n // ===== MULTI-PDF FIELD PRESERVATION APPROACH =====\r\n // 1. Extract fields from ALL source PDFs BEFORE copyPages\r\n // 2. Build page mapping (original page -> new page in combined doc)\r\n // 3. Copy pages (which loses widget annotations)\r\n // 4. Re-add ALL extracted fields with adjusted page numbers\r\n\r\n console.log('[PageAssembler] Starting multi-PDF assembly with field preservation');\r\n\r\n // Step 1: Extract fields from all source PDFs and collect metadata\r\n const allExtractedFields: TrackedFormField[] = [];\r\n const mergedMetadata: {\r\n version: string;\r\n fields: Record<string, any>;\r\n fieldIdIndex: Record<string, string>;\r\n } = {\r\n version: '1.0',\r\n fields: {},\r\n fieldIdIndex: {}\r\n };\r\n\r\n // Build a map of fileId -> { srcPageIndex -> pages in state that use this srcPageIndex }\r\n // This helps us track which pages from each source PDF are included and where they end up\r\n const filePageUsage = new Map<string, Map<number, PageInfo[]>>();\r\n\r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n const originalFileId = page.originalFileId || file.id;\r\n if (!filePageUsage.has(originalFileId)) {\r\n filePageUsage.set(originalFileId, new Map());\r\n }\r\n const pageUsage = filePageUsage.get(originalFileId)!;\r\n if (!pageUsage.has(page.srcIndex)) {\r\n pageUsage.set(page.srcIndex, []);\r\n }\r\n pageUsage.get(page.srcIndex)!.push(page);\r\n }\r\n }\r\n\r\n // Calculate what page number each page will end up at in the combined document\r\n // We need to iterate in the order pages will be added to combined doc\r\n let combinedPageIndex = 0;\r\n const pageIdToNewPageNumber = new Map<string, number>();\r\n\r\n for (const file of state.files) {\r\n for (const page of file.pages) {\r\n combinedPageIndex++;\r\n pageIdToNewPageNumber.set(page.id, combinedPageIndex); // 1-indexed\r\n }\r\n }\r\n\r\n console.log('[PageAssembler] Page mapping:', Object.fromEntries(pageIdToNewPageNumber));\r\n\r\n // Helper function to extract fields from a PDF and map to new page numbers\r\n const extractAndMapFields = async (\r\n fileId: string,\r\n fileName: string,\r\n pdfBytes: Uint8Array,\r\n sourcePdf: import('pdf-lib').PDFDocument | undefined\r\n ) => {\r\n // Extract SigniphiMetadata from source PDF (we'll merge it per-field below)\r\n let sourceMetadata: { fields?: Record<string, any>; fieldIdIndex?: Record<string, string> } | null = null;\r\n if (sourcePdf) {\r\n try {\r\n const sourceInfoRef = sourcePdf.context.trailerInfo.Info;\r\n if (sourceInfoRef) {\r\n const sourceInfoDict = sourcePdf.context.lookup(sourceInfoRef);\r\n if (sourceInfoDict && typeof (sourceInfoDict as any).get === 'function') {\r\n const metadataObj = (sourceInfoDict as any).get(PDFName.of('SigniphiMetadata'));\r\n if (metadataObj) {\r\n const metadataStr = metadataObj.toString();\r\n let jsonStr = metadataStr;\r\n if (metadataStr.startsWith('(') && metadataStr.endsWith(')')) {\r\n jsonStr = metadataStr.slice(1, -1);\r\n }\r\n sourceMetadata = JSON.parse(jsonStr);\r\n }\r\n }\r\n }\r\n } catch (metadataError) {\r\n console.warn(`Could not read metadata from PDF ${fileName}:`, metadataError);\r\n }\r\n }\r\n\r\n // Extract form fields using pdf-lib\r\n console.log(`[PageAssembler] Extracting fields from \"${fileName}\"`);\r\n const extractedFields = await extractFieldsFromPdf(pdfBytes);\r\n console.log(`[PageAssembler] Found ${extractedFields.length} fields in \"${fileName}\"`);\r\n\r\n // Get which pages from this file are being used\r\n const pageUsageForFile = filePageUsage.get(fileId) || new Map();\r\n\r\n // Map extracted fields to their new page numbers\r\n for (const field of extractedFields) {\r\n const originalPage = field.page; // 1-indexed page in source PDF\r\n const srcIndex = originalPage - 1; // Convert to 0-indexed\r\n\r\n // Find all page instances that use this srcIndex from this file\r\n const pageInstances = pageUsageForFile.get(srcIndex) || [];\r\n\r\n for (const pageInstance of pageInstances) {\r\n const newPageNumber = pageIdToNewPageNumber.get(pageInstance.id);\r\n\r\n if (newPageNumber !== undefined) {\r\n // Create a tracked field with updated page number (keep original field name)\r\n const trackedField: TrackedFormField = {\r\n name: field.name,\r\n type: field.type,\r\n position: {\r\n x: field.x,\r\n y: field.y,\r\n width: field.width,\r\n height: field.height,\r\n page: newPageNumber, // Updated to new page number\r\n },\r\n pageId: pageInstance.id,\r\n originalFileId: fileId,\r\n label: field.label,\r\n required: field.required,\r\n options: field.options,\r\n placeholder: field.placeholder,\r\n fieldId: field.fieldId,\r\n assignedSignerEmail: field.signer,\r\n };\r\n\r\n allExtractedFields.push(trackedField);\r\n console.log(`[PageAssembler] Mapped field \"${field.name}\" from page ${originalPage} to page ${newPageNumber}`);\r\n\r\n // Merge metadata using page-qualified key to prevent overwrites\r\n // when combining PDFs with same field names but different properties\r\n const metadataKey = `${field.name}_p${newPageNumber}`;\r\n if (sourceMetadata?.fields?.[field.name]) {\r\n mergedMetadata.fields[metadataKey] = sourceMetadata.fields[field.name];\r\n }\r\n if (sourceMetadata?.fieldIdIndex?.[field.name]) {\r\n mergedMetadata.fieldIdIndex[metadataKey] = sourceMetadata.fieldIdIndex[field.name];\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Extract fields from current PDF files in state\r\n const processedFileIds = new Set<string>();\r\n for (const file of state.files) {\r\n if (file.type !== 'pdf' || !file.originalBytes || file.originalBytes.length === 0) continue;\r\n\r\n try {\r\n await extractAndMapFields(file.id, file.name, file.originalBytes, loadedPdfs.get(file.id));\r\n processedFileIds.add(file.id);\r\n } catch (extractError) {\r\n console.error(`Error extracting fields from ${file.name}:`, extractError);\r\n }\r\n }\r\n\r\n // Also extract fields from cached PDFs (deleted files that still have pages in use)\r\n for (const fileId of referencedFileIds) {\r\n if (processedFileIds.has(fileId)) continue;\r\n\r\n const cachedBytes = originalBytesCache.current.get(fileId);\r\n if (cachedBytes && cachedBytes.length > 0) {\r\n try {\r\n console.log(`[PageAssembler] Extracting fields from cached file ${fileId}`);\r\n await extractAndMapFields(fileId, `Cached file ${fileId}`, cachedBytes, loadedPdfs.get(fileId));\r\n } catch (extractError) {\r\n console.error(`Error extracting fields from cached file ${fileId}:`, extractError);\r\n }\r\n }\r\n }\r\n\r\n console.log(`[PageAssembler] Total extracted fields: ${allExtractedFields.length}`);\r\n console.log(`[PageAssembler] Field names:`, allExtractedFields.map(f => `${f.name} (page ${f.position.page})`));\r\n\r\n // Step 2: Create combined document and copy pages\r\n const combinedDoc = await PDFDocument.create();\r\n\r\n for (const file of state.files) {\r\n if (file.pages.length === 0) continue;\r\n\r\n for (const page of file.pages) {\r\n const originalFileId = page.originalFileId || file.id;\r\n const sourceFile = fileMap.get(originalFileId);\r\n\r\n if (!sourceFile) {\r\n console.warn(`Source file not found for page ${page.id}`);\r\n continue;\r\n }\r\n\r\n if (sourceFile.type === 'pdf') {\r\n const sourcePdf = loadedPdfs.get(originalFileId);\r\n if (!sourcePdf) {\r\n console.warn(`Source PDF not loaded for page ${page.id}`);\r\n continue;\r\n }\r\n\r\n const sourcePageCount = sourcePdf.getPageCount();\r\n\r\n if (page.srcIndex >= 0 && page.srcIndex < sourcePageCount) {\r\n try {\r\n const copiedPages = await combinedDoc.copyPages(sourcePdf, [page.srcIndex]);\r\n copiedPages.forEach(copiedPage => {\r\n // Remove widget annotations from copied page to prevent duplicates\r\n // Widget annotations are form field visuals that get copied but orphaned\r\n // We'll re-add proper form fields later via addFormFieldsToPdf\r\n try {\r\n const annotsRef = copiedPage.node.get(PDFName.of('Annots'));\r\n if (annotsRef) {\r\n copiedPage.node.delete(PDFName.of('Annots'));\r\n }\r\n } catch (annotError) {\r\n console.warn('Could not remove annotations from copied page:', annotError);\r\n }\r\n combinedDoc.addPage(copiedPage);\r\n });\r\n } catch (copyError) {\r\n console.error(`Error copying page ${page.srcIndex}:`, copyError);\r\n throw new Error(`Failed to copy page: ${copyError instanceof Error ? copyError.message : String(copyError)}`);\r\n }\r\n }\r\n } else if (sourceFile.type === 'image' && sourceFile.originalFile) {\r\n try {\r\n const imagePdfBytes = await imageToPdf(sourceFile.originalFile);\r\n const imagePdf = await PDFDocument.load(imagePdfBytes);\r\n const copiedPages = await combinedDoc.copyPages(imagePdf, [0]);\r\n copiedPages.forEach(copiedPage => combinedDoc.addPage(copiedPage));\r\n } catch (imageError) {\r\n console.error(`Error converting image page:`, imageError);\r\n throw new Error(`Failed to convert image: ${imageError instanceof Error ? imageError.message : String(imageError)}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Step 3: Write merged SigniphiMetadata to combined document\r\n if (Object.keys(mergedMetadata.fields).length > 0) {\r\n try {\r\n const newInfoRef = combinedDoc.context.trailerInfo.Info;\r\n if (newInfoRef) {\r\n const newInfoDict = combinedDoc.context.lookup(newInfoRef);\r\n if (newInfoDict && typeof (newInfoDict as any).set === 'function') {\r\n (newInfoDict as any).set(\r\n PDFName.of('SigniphiMetadata'),\r\n PDFString.of(JSON.stringify(mergedMetadata))\r\n );\r\n }\r\n }\r\n } catch (metadataError) {\r\n console.warn('Could not write merged metadata:', metadataError);\r\n }\r\n }\r\n\r\n // Save the combined document (without form fields - copyPages loses them)\r\n let pdfBytes = await combinedDoc.save();\r\n\r\n // Step 4: Re-add all extracted fields to the combined document\r\n if (allExtractedFields.length > 0) {\r\n console.log(`[PageAssembler] Re-adding ${allExtractedFields.length} fields to combined document`);\r\n\r\n // Convert TrackedFormField to FormFieldForPdf format\r\n const fieldsForPdf: FormFieldForPdf[] = allExtractedFields.map(field => ({\r\n name: field.name,\r\n type: field.type,\r\n position: field.position,\r\n label: field.label,\r\n required: field.required,\r\n options: field.options,\r\n placeholder: field.placeholder,\r\n assignedSignerEmail: field.assignedSignerEmail,\r\n }));\r\n\r\n try {\r\n pdfBytes = await addFormFieldsToPdf(pdfBytes, fieldsForPdf, {\r\n removeExistingFields: true, // Remove any orphaned field references\r\n drawLabels: false,\r\n });\r\n console.log('[PageAssembler] ✅ Successfully re-added form fields to combined PDF');\r\n } catch (addFieldsError) {\r\n console.error('[PageAssembler] Error re-adding fields:', addFieldsError);\r\n // Continue with the PDF without fields rather than failing completely\r\n }\r\n }\r\n\r\n // Create ArrayBuffer from Uint8Array (TypeScript 5.9+ has stricter typing)\r\n const arrayBuffer = pdfBytes.buffer.slice(pdfBytes.byteOffset, pdfBytes.byteOffset + pdfBytes.byteLength) as ArrayBuffer;\r\n const blob = new Blob([arrayBuffer], { type: 'application/pdf' });\r\n\r\n return blob;\r\n } catch (error) {\r\n console.error('Error assembling PDF:', error);\r\n throw error;\r\n } finally {\r\n setIsLoading(false);\r\n setProcessingStatus('');\r\n }\r\n },\r\n \r\n getSummary: () => summary,\r\n \r\n isBusy: () => isLoading,\r\n \r\n getState: () => state,\r\n }), [state, summary, isLoading]);\r\n\r\n return (\r\n <TooltipProvider>\r\n <DndProvider backend={HTML5Backend}>\r\n <div className={cn(\"space-y-3\", className)}>\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h3 className=\"text-lg font-medium\">Page Assembly</h3>\r\n <p className=\"text-sm text-muted-foreground\">\r\n Upload, arrange, and combine pages into a single PDF document\r\n </p>\r\n </div>\r\n \r\n <div className=\"flex items-center gap-4\">\r\n {summary.totalPages > 0 && (\r\n <span className=\"text-sm text-gray-500\">\r\n {summary.totalFiles} file{summary.totalFiles !== 1 ? 's' : ''}, {summary.totalPages} page{summary.totalPages !== 1 ? 's' : ''}\r\n </span>\r\n )}\r\n \r\n {!disableFileUpload && (\r\n <>\r\n <Button type=\"button\" onClick={handleFileUpload} disabled={isLoading}>\r\n <Upload className=\"h-4 w-4 mr-2\" />\r\n Add Files\r\n </Button>\r\n \r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n accept=\".pdf,image/*\"\r\n onChange={handleFileChange}\r\n className=\"hidden\"\r\n />\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Loading indicator */}\r\n {isLoading && (\r\n <Card className=\"p-4\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-primary\"></div>\r\n <span className=\"text-sm\">{processingStatus}</span>\r\n </div>\r\n </Card>\r\n )}\r\n\r\n {/* Upload error */}\r\n {uploadError && !isLoading && (\r\n <Card className=\"p-4 border-destructive/50 bg-destructive/5\">\r\n <div className=\"flex items-center gap-3\">\r\n <X className=\"h-4 w-4 text-destructive flex-shrink-0\" />\r\n <span className=\"text-sm text-destructive\">{uploadError}</span>\r\n </div>\r\n </Card>\r\n )}\r\n\r\n {/* Bulk actions */}\r\n <BulkActionBar\r\n selectedCount={state.selection.length}\r\n files={state.files}\r\n onMovePages={handleMovePages}\r\n onDeletePages={handleDeletePages}\r\n onClearSelection={() => dispatch({ type: 'CLEAR_SELECTION' })}\r\n />\r\n\r\n {/* Files */}\r\n {state.files.length > 0 ? (\r\n <div\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n >\r\n <FileDropZone\r\n targetIndex={0}\r\n onReorderFiles={handleReorderFiles}\r\n files={state.files}\r\n />\r\n \r\n {state.files.map((file, index) => (\r\n <div key={file.id}>\r\n <FileCard\r\n file={file}\r\n selectedPageIds={state.selection}\r\n onSingleSelectPage={handleSingleSelectPage}\r\n onTogglePageSelect={handleTogglePageSelect}\r\n onRangeSelectPage={handleRangeSelectPage}\r\n onSelectAllInFile={handleSelectAllInFile}\r\n onRemoveFile={handleRemoveFile}\r\n onRenameFile={handleRenameFile}\r\n onReorderPages={(fileId, newOrder) => \r\n dispatch({ type: 'REORDER_PAGES', payload: { fileId, newOrder } })\r\n }\r\n isDraggingPageRef={isDraggingPage}\r\n />\r\n \r\n <FileDropZone\r\n targetIndex={index + 1}\r\n onReorderFiles={handleReorderFiles}\r\n files={state.files}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n ) : (\r\n !disableFileUpload && (\r\n <div \r\n className=\"p-12 rounded-lg bg-card text-card-foreground cursor-pointer transition-all border-2 border-dashed border-border hover:border-primary/60 hover:bg-primary/10\"\r\n onClick={handleFileUpload}\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n >\r\n <div className=\"text-center\">\r\n <FolderOpen className=\"h-12 w-12 mx-auto text-gray-400 mb-4\" />\r\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">No files added</h3>\r\n <p className=\"text-gray-500 mb-4\">\r\n Upload PDF files and images to start building your document\r\n </p>\r\n <Button type=\"button\" variant=\"outline\">\r\n <Upload className=\"h-4 w-4 mr-2\" />\r\n Choose Files\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n )}\r\n\r\n {/* Delete confirmation dialog */}\r\n <AlertDialog open={showDeleteConfirm} onOpenChange={setShowDeleteConfirm}>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>\r\n <AlertDialogTitle>Delete Pages</AlertDialogTitle>\r\n <AlertDialogDescription>\r\n Are you sure you want to delete {state.selection.length} selected page\r\n {state.selection.length !== 1 ? 's' : ''}? This action cannot be undone.\r\n </AlertDialogDescription>\r\n </AlertDialogHeader>\r\n <AlertDialogFooter>\r\n <AlertDialogCancel>Cancel</AlertDialogCancel>\r\n <AlertDialogAction \r\n className=\"bg-destructive text-white hover:bg-destructive/90\"\r\n onClick={confirmDeletePages}\r\n >\r\n Delete\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n\r\n {/* Remove file confirmation dialog */}\r\n <AlertDialog open={showRemoveFileConfirm} onOpenChange={setShowRemoveFileConfirm}>\r\n <AlertDialogContent>\r\n <AlertDialogHeader>\r\n <AlertDialogTitle>Remove File</AlertDialogTitle>\r\n <AlertDialogDescription>\r\n Are you sure you want to remove \"{fileToRemove?.name}\" and all its {fileToRemove?.pageCount} page\r\n {fileToRemove?.pageCount !== 1 ? 's' : ''}? This action cannot be undone.\r\n </AlertDialogDescription>\r\n </AlertDialogHeader>\r\n <AlertDialogFooter>\r\n <AlertDialogCancel onClick={() => {\r\n setFileToRemove(null);\r\n setShowRemoveFileConfirm(false);\r\n }}>Cancel</AlertDialogCancel>\r\n <AlertDialogAction \r\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\r\n onClick={confirmRemoveFile}\r\n >\r\n Remove File\r\n </AlertDialogAction>\r\n </AlertDialogFooter>\r\n </AlertDialogContent>\r\n </AlertDialog>\r\n </div>\r\n </DndProvider>\r\n </TooltipProvider>\r\n );\r\n }\r\n);\r\n\r\nPageAssembler.displayName = 'PageAssembler';\r\n\r\n// Utility functions\r\nfunction generateId(): string {\r\n return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n\r\nfunction debounce<T extends (...args: never[]) => unknown>(\r\n func: T,\r\n wait: number\r\n): T {\r\n let timeout: NodeJS.Timeout | undefined;\r\n return ((...args: Parameters<T>) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func(...args), wait);\r\n }) as T;\r\n}\r\n"]}