@embedpdf/plugin-form 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1789 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/actions.d.ts +33 -0
- package/dist/lib/form-plugin.d.ts +59 -0
- package/dist/lib/handlers/checkbox.handler.d.ts +3 -0
- package/dist/lib/handlers/combobox.handler.d.ts +3 -0
- package/dist/lib/handlers/index.d.ts +5 -0
- package/dist/lib/handlers/listbox.handler.d.ts +3 -0
- package/dist/lib/handlers/radio-button.handler.d.ts +3 -0
- package/dist/lib/handlers/text-field.handler.d.ts +3 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/manifest.d.ts +4 -0
- package/dist/lib/reducer.d.ts +6 -0
- package/dist/lib/tools.d.ts +457 -0
- package/dist/lib/types.d.ts +98 -0
- package/dist/preact/adapter.d.ts +13 -0
- package/dist/preact/annotation.d.ts +1 -0
- package/dist/preact/core.d.ts +1 -0
- package/dist/preact/index.cjs +2 -0
- package/dist/preact/index.cjs.map +1 -0
- package/dist/preact/index.d.ts +1 -0
- package/dist/preact/index.js +1359 -0
- package/dist/preact/index.js.map +1 -0
- package/dist/react/adapter.d.ts +6 -0
- package/dist/react/annotation.d.ts +1 -0
- package/dist/react/core.d.ts +1 -0
- package/dist/react/index.cjs +2 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +1358 -0
- package/dist/react/index.js.map +1 -0
- package/dist/shared/components/annotations/form-checkbox.d.ts +12 -0
- package/dist/shared/components/annotations/form-combobox.d.ts +12 -0
- package/dist/shared/components/annotations/form-listbox.d.ts +12 -0
- package/dist/shared/components/annotations/form-radio-button.d.ts +12 -0
- package/dist/shared/components/annotations/form-text-field.d.ts +12 -0
- package/dist/shared/components/fields/checkbox.d.ts +2 -0
- package/dist/shared/components/fields/combobox.d.ts +2 -0
- package/dist/shared/components/fields/listbox.d.ts +2 -0
- package/dist/shared/components/fields/push-button.d.ts +2 -0
- package/dist/shared/components/fields/radio-button.d.ts +2 -0
- package/dist/shared/components/fields/style.d.ts +6 -0
- package/dist/shared/components/fields/text.d.ts +2 -0
- package/dist/shared/components/fill-mode/combobox-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/listbox-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/push-button-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/radio-button-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/text-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/toggle-fill-mode.d.ts +3 -0
- package/dist/shared/components/form-renderer-registration.d.ts +5 -0
- package/dist/shared/components/form-renderers.d.ts +9 -0
- package/dist/shared/components/index.d.ts +2 -0
- package/dist/shared/components/render-widget.d.ts +12 -0
- package/dist/shared/components/types.d.ts +42 -0
- package/dist/shared/hooks/index.d.ts +1 -0
- package/dist/shared/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/shared/hooks/use-form.d.ts +16 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared-preact/components/annotations/form-checkbox.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-combobox.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-listbox.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-radio-button.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-text-field.d.ts +12 -0
- package/dist/shared-preact/components/fields/checkbox.d.ts +2 -0
- package/dist/shared-preact/components/fields/combobox.d.ts +2 -0
- package/dist/shared-preact/components/fields/listbox.d.ts +2 -0
- package/dist/shared-preact/components/fields/push-button.d.ts +2 -0
- package/dist/shared-preact/components/fields/radio-button.d.ts +2 -0
- package/dist/shared-preact/components/fields/style.d.ts +6 -0
- package/dist/shared-preact/components/fields/text.d.ts +2 -0
- package/dist/shared-preact/components/fill-mode/combobox-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/listbox-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/push-button-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/radio-button-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/text-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/toggle-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/form-renderer-registration.d.ts +5 -0
- package/dist/shared-preact/components/form-renderers.d.ts +9 -0
- package/dist/shared-preact/components/index.d.ts +2 -0
- package/dist/shared-preact/components/render-widget.d.ts +12 -0
- package/dist/shared-preact/components/types.d.ts +42 -0
- package/dist/shared-preact/hooks/index.d.ts +1 -0
- package/dist/shared-preact/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/shared-preact/hooks/use-form.d.ts +16 -0
- package/dist/shared-preact/index.d.ts +4 -0
- package/dist/shared-react/components/annotations/form-checkbox.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-combobox.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-listbox.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-radio-button.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-text-field.d.ts +12 -0
- package/dist/shared-react/components/fields/checkbox.d.ts +2 -0
- package/dist/shared-react/components/fields/combobox.d.ts +2 -0
- package/dist/shared-react/components/fields/listbox.d.ts +2 -0
- package/dist/shared-react/components/fields/push-button.d.ts +2 -0
- package/dist/shared-react/components/fields/radio-button.d.ts +2 -0
- package/dist/shared-react/components/fields/style.d.ts +6 -0
- package/dist/shared-react/components/fields/text.d.ts +2 -0
- package/dist/shared-react/components/fill-mode/combobox-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/listbox-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/push-button-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/radio-button-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/text-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/toggle-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/form-renderer-registration.d.ts +5 -0
- package/dist/shared-react/components/form-renderers.d.ts +9 -0
- package/dist/shared-react/components/index.d.ts +2 -0
- package/dist/shared-react/components/render-widget.d.ts +12 -0
- package/dist/shared-react/components/types.d.ts +42 -0
- package/dist/shared-react/hooks/index.d.ts +1 -0
- package/dist/shared-react/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/shared-react/hooks/use-form.d.ts +16 -0
- package/dist/shared-react/index.d.ts +4 -0
- package/dist/svelte/components/FormRendererRegistration.svelte.d.ts +18 -0
- package/dist/svelte/components/RenderWidget.svelte.d.ts +11 -0
- package/dist/svelte/components/annotations/FormCheckbox.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormCombobox.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormListbox.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormRadioButton.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormTextField.svelte.d.ts +5 -0
- package/dist/svelte/components/fields/ComboboxField.svelte.d.ts +4 -0
- package/dist/svelte/components/fields/ListboxField.svelte.d.ts +4 -0
- package/dist/svelte/components/fields/TextField.svelte.d.ts +4 -0
- package/dist/svelte/components/fill-mode/ComboboxFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/ListboxFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/RadioButtonFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/TextFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/ToggleFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/form-renderers.d.ts +9 -0
- package/dist/svelte/components/previews/CheckboxPreview.svelte.d.ts +9 -0
- package/dist/svelte/components/previews/ListboxPreview.svelte.d.ts +9 -0
- package/dist/svelte/components/previews/RadioButtonPreview.svelte.d.ts +9 -0
- package/dist/svelte/components/previews/TextFieldPreview.svelte.d.ts +9 -0
- package/dist/svelte/hooks/index.d.ts +2 -0
- package/dist/svelte/hooks/use-form-widget-state.svelte.d.ts +12 -0
- package/dist/svelte/hooks/use-form.svelte.d.ts +14 -0
- package/dist/svelte/index.cjs +2 -0
- package/dist/svelte/index.cjs.map +1 -0
- package/dist/svelte/index.d.ts +3 -0
- package/dist/svelte/index.js +1567 -0
- package/dist/svelte/index.js.map +1 -0
- package/dist/vue/components/annotations/form-checkbox.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-combobox.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-listbox.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-radio-button.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-text-field.vue.d.ts +6 -0
- package/dist/vue/components/fields/combobox-field.vue.d.ts +4 -0
- package/dist/vue/components/fields/listbox-field.vue.d.ts +4 -0
- package/dist/vue/components/fields/style.d.ts +6 -0
- package/dist/vue/components/fields/text-field.vue.d.ts +4 -0
- package/dist/vue/components/fill-mode/combobox-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/listbox-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/radio-button-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/text-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/toggle-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/form-renderer-registration.vue.d.ts +13 -0
- package/dist/vue/components/form-renderers.d.ts +3 -0
- package/dist/vue/components/previews/checkbox-preview.vue.d.ts +10 -0
- package/dist/vue/components/previews/listbox-preview.vue.d.ts +10 -0
- package/dist/vue/components/previews/radio-button-preview.vue.d.ts +10 -0
- package/dist/vue/components/previews/text-field-preview.vue.d.ts +10 -0
- package/dist/vue/components/render-widget.vue.d.ts +15 -0
- package/dist/vue/hooks/index.d.ts +2 -0
- package/dist/vue/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/vue/hooks/use-form.d.ts +12 -0
- package/dist/vue/index.cjs +2 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.ts +3 -0
- package/dist/vue/index.js +1643 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/handlers/text-field.handler.ts","../src/lib/handlers/checkbox.handler.ts","../src/lib/handlers/radio-button.handler.ts","../src/lib/handlers/combobox.handler.ts","../src/lib/handlers/listbox.handler.ts","../src/lib/tools.ts","../src/lib/form-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { FormPluginConfig } from './types';\n\nexport const FORM_PLUGIN_ID = 'form';\n\nexport const manifest: PluginManifest<FormPluginConfig> = {\n id: FORM_PLUGIN_ID,\n name: 'Form Plugin',\n version: '1.0.0',\n provides: ['form'],\n requires: ['interaction-manager'],\n optional: ['history', 'annotation'],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { FormDocumentState } from './types';\n\nexport const INIT_FORM_STATE = 'FORM/INIT_STATE';\nexport const CLEANUP_FORM_STATE = 'FORM/CLEANUP_STATE';\nexport const SELECT_FIELD = 'FORM/SELECT_FIELD';\nexport const DESELECT_FIELD = 'FORM/DESELECT_FIELD';\n\nexport interface InitFormStateAction extends Action {\n type: typeof INIT_FORM_STATE;\n payload: { documentId: string; state: FormDocumentState };\n}\n\nexport interface CleanupFormStateAction extends Action {\n type: typeof CLEANUP_FORM_STATE;\n payload: string;\n}\n\nexport interface SelectFieldAction extends Action {\n type: typeof SELECT_FIELD;\n payload: { documentId: string; annotationId: string };\n}\n\nexport interface DeselectFieldAction extends Action {\n type: typeof DESELECT_FIELD;\n payload: string;\n}\n\nexport type FormAction =\n | InitFormStateAction\n | CleanupFormStateAction\n | SelectFieldAction\n | DeselectFieldAction;\n\nexport function initFormState(documentId: string, state: FormDocumentState): InitFormStateAction {\n return { type: INIT_FORM_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupFormState(documentId: string): CleanupFormStateAction {\n return { type: CLEANUP_FORM_STATE, payload: documentId };\n}\n\nexport function selectField(documentId: string, annotationId: string): SelectFieldAction {\n return { type: SELECT_FIELD, payload: { documentId, annotationId } };\n}\n\nexport function deselectField(documentId: string): DeselectFieldAction {\n return { type: DESELECT_FIELD, payload: documentId };\n}\n","import { Reducer } from '@embedpdf/core';\nimport { FormDocumentState, FormState } from './types';\nimport {\n FormAction,\n INIT_FORM_STATE,\n CLEANUP_FORM_STATE,\n SELECT_FIELD,\n DESELECT_FIELD,\n} from './actions';\n\nexport const initialDocumentState: FormDocumentState = {\n selectedFieldId: null,\n};\n\nexport const initialState: FormState = {\n documents: {},\n};\n\nexport const reducer: Reducer<FormState, FormAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_FORM_STATE:\n return {\n ...state,\n documents: {\n ...state.documents,\n [action.payload.documentId]: action.payload.state,\n },\n };\n\n case CLEANUP_FORM_STATE: {\n const documentId = action.payload;\n const { [documentId]: _, ...remaining } = state.documents;\n return {\n ...state,\n documents: remaining,\n };\n }\n\n case SELECT_FIELD: {\n const { documentId, annotationId } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n selectedFieldId: annotationId,\n },\n },\n };\n }\n\n case DESELECT_FIELD: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n selectedFieldId: null,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfStandardFont,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const textFieldHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n fontSize: tool.defaults.fontSize ?? 12,\n fontColor: tool.defaults.fontColor ?? '#000000',\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `TextField_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n fontFamily: defaults.fontFamily,\n fontSize: defaults.fontSize,\n fontColor: defaults.fontColor,\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n field: {\n type: PDF_FORM_FIELD_TYPE.TEXTFIELD,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: '',\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const checkboxHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `Checkbox_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n exportValue: 'Yes',\n field: {\n type: PDF_FORM_FIELD_TYPE.CHECKBOX,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: 'Off',\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const radioButtonHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx < 0 ? -side : side;\n const sy = dy < 0 ? -side : side;\n const minX = Math.min(start.x, start.x + sx);\n const minY = Math.min(start.y, start.y + sy);\n return {\n origin: { x: minX, y: minY },\n size: { width: side, height: side },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `RadioButton_${uuidV4().slice(0, 8)}`;\n const id = uuidV4();\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id,\n pageIndex,\n rect,\n created: new Date(),\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n exportValue: id,\n field: {\n type: PDF_FORM_FIELD_TYPE.RADIOBUTTON,\n flag:\n defaults.field?.flag ??\n PDF_FORM_FIELD_FLAG.BUTTON_RADIO | PDF_FORM_FIELD_FLAG.BUTTON_NOTOGGLETOOFF,\n name: fieldName,\n alternateName: fieldName,\n value: 'Off',\n options: [],\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfStandardFont,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const comboboxHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n fontSize: tool.defaults.fontSize ?? 12,\n fontColor: tool.defaults.fontColor ?? '#000000',\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `Combobox_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n fontFamily: defaults.fontFamily,\n fontSize: defaults.fontSize,\n fontColor: defaults.fontColor,\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n field: {\n type: PDF_FORM_FIELD_TYPE.COMBOBOX,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: '',\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfStandardFont,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const listboxHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n fontSize: tool.defaults.fontSize ?? 12,\n fontColor: tool.defaults.fontColor ?? '#000000',\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `Listbox_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n fontFamily: defaults.fontFamily,\n fontSize: defaults.fontSize,\n fontColor: defaults.fontColor,\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n field: {\n type: PDF_FORM_FIELD_TYPE.LISTBOX,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: '',\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfWidgetAnnoObject,\n PdfStandardFont,\n} from '@embedpdf/models';\nimport { AnnotationTool, defineAnnotationTool } from '@embedpdf/plugin-annotation';\nimport {\n textFieldHandlerFactory,\n checkboxHandlerFactory,\n radioButtonHandlerFactory,\n comboboxHandlerFactory,\n listboxHandlerFactory,\n} from './handlers';\n\nexport const formTextFieldTool = defineAnnotationTool({\n id: 'formTextField' as const,\n name: 'Text Field',\n labelKey: 'form.textfield',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.TEXTFIELD ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n fontFamily: PdfStandardFont.Helvetica,\n fontSize: 12,\n fontColor: '#000000',\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'TextField',\n alternateName: 'TextField',\n value: '',\n type: PDF_FORM_FIELD_TYPE.TEXTFIELD,\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 150, height: 24 },\n },\n pointerHandler: textFieldHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formTextField'>);\n\nexport const formCheckboxTool = defineAnnotationTool({\n id: 'formCheckbox' as const,\n name: 'Checkbox',\n labelKey: 'form.checkbox',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.CHECKBOX ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'Checkbox',\n alternateName: 'Checkbox',\n value: 'Off',\n type: PDF_FORM_FIELD_TYPE.CHECKBOX,\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 20, height: 20 },\n },\n pointerHandler: checkboxHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formCheckbox'>);\n\nexport const formRadioButtonTool = defineAnnotationTool({\n id: 'formRadioButton' as const,\n name: 'Radio Button',\n labelKey: 'form.radiobutton',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n lockAspectRatio: true,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.BUTTON_RADIO | PDF_FORM_FIELD_FLAG.BUTTON_NOTOGGLETOOFF,\n name: 'RadioButton',\n alternateName: 'RadioButton',\n value: 'Off',\n type: PDF_FORM_FIELD_TYPE.RADIOBUTTON,\n options: [],\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 20, height: 20 },\n },\n pointerHandler: radioButtonHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formRadioButton'>);\n\nexport const formComboboxTool = defineAnnotationTool({\n id: 'formCombobox' as const,\n name: 'Combo Box',\n labelKey: 'form.combobox',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.COMBOBOX ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n fontFamily: PdfStandardFont.Helvetica,\n fontSize: 12,\n fontColor: '#000000',\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'ComboBox',\n alternateName: 'ComboBox',\n value: '',\n type: PDF_FORM_FIELD_TYPE.COMBOBOX,\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 200, height: 40 },\n },\n pointerHandler: comboboxHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formCombobox'>);\n\nexport const formListboxTool = defineAnnotationTool({\n id: 'formListbox' as const,\n name: 'List Box',\n labelKey: 'form.listbox',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.LISTBOX ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n fontFamily: PdfStandardFont.Helvetica,\n fontSize: 12,\n fontColor: '#000000',\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'ListBox',\n alternateName: 'ListBox',\n value: '',\n type: PDF_FORM_FIELD_TYPE.LISTBOX,\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 150, height: 150 },\n },\n pointerHandler: listboxHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formListbox'>);\n\nexport const formTools = [\n formTextFieldTool,\n formCheckboxTool,\n formRadioButtonTool,\n formComboboxTool,\n formListboxTool,\n];\n","import { BasePlugin, createScopedEmitter, PluginRegistry } from '@embedpdf/core';\nimport {\n FieldGroupEntry,\n FieldValueChangeEvent,\n FormCapability,\n FormDocumentState,\n FormFieldInfo,\n FormPluginConfig,\n FormReadyEvent,\n FormScope,\n FormState,\n FormStateChangeEvent,\n RenameFieldResult,\n RenderWidgetOptions,\n} from './types';\nimport {\n FormAction,\n initFormState,\n cleanupFormState,\n selectField as selectFieldAction,\n deselectField as deselectFieldAction,\n} from './actions';\nimport {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfCheckboxWidgetAnnoField,\n PdfDocumentObject,\n PdfErrorCode,\n PdfErrorReason,\n PDF_FORM_FIELD_FLAG,\n PDF_FORM_FIELD_TYPE,\n PdfRadioButtonWidgetAnnoField,\n PdfTask,\n PdfTaskHelper,\n PdfWidgetAnnoField,\n PdfWidgetAnnoObject,\n Task,\n TaskSequence,\n isWidgetChecked,\n} from '@embedpdf/models';\nimport {\n AnnotationCapability,\n AnnotationEvent,\n AnnotationPlugin,\n} from '@embedpdf/plugin-annotation';\nimport { Command, HistoryCapability, HistoryPlugin } from '@embedpdf/plugin-history';\nimport { initialDocumentState } from './reducer';\nimport { formTools } from './tools';\n\nexport class FormPlugin extends BasePlugin<\n FormPluginConfig,\n FormCapability,\n FormState,\n FormAction\n> {\n static readonly id = 'form' as const;\n\n private readonly FORM_HISTORY_TOPIC = 'form-fields';\n\n private annotation: AnnotationCapability | null = null;\n private history: HistoryCapability | null = null;\n\n private readonly state$ = createScopedEmitter<FormDocumentState, FormStateChangeEvent, string>(\n (documentId, state) => ({ documentId, state }),\n );\n private readonly fieldValueChange$ = createScopedEmitter<\n FieldValueChangeEvent,\n FieldValueChangeEvent,\n string\n >((_, event) => event, { cache: false });\n private readonly formReady$ = createScopedEmitter<FormFieldInfo[], FormReadyEvent, string>(\n (documentId, fields) => ({ documentId, fields }),\n { cache: false },\n );\n\n /** Per-document logical field index: documentId → (fieldKey → FieldGroupEntry[]) */\n private readonly fieldGroupIndex = new Map<string, Map<string, FieldGroupEntry[]>>();\n\n /** Per-document name-based index: documentId → (fieldName → FieldGroupEntry[]) */\n private readonly fieldNameIndex = new Map<string, Map<string, FieldGroupEntry[]>>();\n\n /** Per-document tab-order sorted widget list: documentId → FieldGroupEntry[] */\n private readonly orderedFieldIndex = new Map<string, FieldGroupEntry[]>();\n\n /** IDs currently being propagated to siblings; prevents recursive loops */\n private readonly propagationInProgress = new Set<string>();\n\n constructor(id: string, registry: PluginRegistry, _config: FormPluginConfig) {\n super(id, registry);\n\n this.annotation = registry.getPlugin<AnnotationPlugin>('annotation')?.provides() ?? null;\n this.history = registry.getPlugin<HistoryPlugin>(HistoryPlugin.id)?.provides() ?? null;\n\n if (this.annotation) {\n for (const tool of formTools) {\n this.annotation.addTool(tool);\n }\n this.annotation.onAnnotationEvent((event) => this.handleAnnotationEvent(event));\n }\n }\n\n async initialize(): Promise<void> {}\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n this.dispatch(initFormState(documentId, { ...initialDocumentState }));\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupFormState(documentId));\n this.fieldGroupIndex.delete(documentId);\n this.fieldNameIndex.delete(documentId);\n this.orderedFieldIndex.delete(documentId);\n\n // Cleanup scoped emitter caches and listeners\n this.state$.clearScope(documentId);\n this.fieldValueChange$.clearScope(documentId);\n this.formReady$.clearScope(documentId);\n }\n\n override onStoreUpdated(prev: FormState, next: FormState): void {\n for (const documentId in next.documents) {\n const prevDoc = prev.documents[documentId];\n const nextDoc = next.documents[documentId];\n if (prevDoc !== nextDoc) {\n this.state$.emit(documentId, nextDoc);\n }\n }\n }\n\n protected buildCapability(): FormCapability {\n return {\n getPageFormAnnoWidgets: (pageIndex, documentId?) =>\n this.getPageFormAnnoWidgets(pageIndex, documentId),\n setFormFieldValues: (pageIndex, annotation, newField, documentId?) =>\n this.setFormFieldValues(pageIndex, annotation, newField, documentId),\n renameField: (annotationId, name, documentId?) =>\n this.renameFieldMethod(annotationId, name, documentId),\n shareField: (annotationId, targetAnnotationId, documentId?) =>\n this.shareFieldMethod(annotationId, targetAnnotationId, documentId),\n renderWidget: (options, documentId?) => this.renderWidget(options, documentId),\n selectField: (annotationId, documentId?) => this.selectFieldMethod(annotationId, documentId),\n deselectField: (documentId?) => this.deselectFieldMethod(documentId),\n getSelectedFieldId: (documentId?) => this.getSelectedFieldId(documentId),\n selectNextField: (documentId?) => this.selectNextFieldMethod(documentId),\n selectPreviousField: (documentId?) => this.selectPreviousFieldMethod(documentId),\n activateField: (documentId?) => this.activateFieldMethod(documentId),\n getState: (documentId?) => this.getDocumentState(documentId),\n getFieldGroup: (annotationId, documentId?) => this.getFieldGroup(annotationId, documentId),\n getFieldSiblings: (annotationId, documentId?) =>\n this.getFieldSiblings(annotationId, documentId),\n getFormValues: (documentId?) => this.getFormValuesMethod(documentId),\n getFormFields: (documentId?) => this.getFormFieldsMethod(documentId),\n setFormValues: (values, documentId?) => this.setFormValuesMethod(values, documentId),\n forDocument: (documentId) => this.createFormScope(documentId),\n onStateChange: this.state$.onGlobal,\n onFieldValueChange: this.fieldValueChange$.onGlobal,\n onFormReady: this.formReady$.onGlobal,\n };\n }\n\n private createFormScope(documentId: string): FormScope {\n return {\n getPageFormAnnoWidgets: (pageIndex) => this.getPageFormAnnoWidgets(pageIndex, documentId),\n setFormFieldValues: (pageIndex, annotation, newField) =>\n this.setFormFieldValues(pageIndex, annotation, newField, documentId),\n renameField: (annotationId, name) => this.renameFieldMethod(annotationId, name, documentId),\n shareField: (annotationId, targetAnnotationId) =>\n this.shareFieldMethod(annotationId, targetAnnotationId, documentId),\n renderWidget: (options) => this.renderWidget(options, documentId),\n selectField: (annotationId) => this.selectFieldMethod(annotationId, documentId),\n deselectField: () => this.deselectFieldMethod(documentId),\n getSelectedFieldId: () => this.getSelectedFieldId(documentId),\n selectNextField: () => this.selectNextFieldMethod(documentId),\n selectPreviousField: () => this.selectPreviousFieldMethod(documentId),\n activateField: () => this.activateFieldMethod(documentId),\n getState: () => this.getDocumentState(documentId),\n getFieldGroup: (annotationId) => this.getFieldGroup(annotationId, documentId),\n getFieldSiblings: (annotationId) => this.getFieldSiblings(annotationId, documentId),\n getFormValues: () => this.getFormValuesMethod(documentId),\n getFormFields: () => this.getFormFieldsMethod(documentId),\n setFormValues: (values) => this.setFormValuesMethod(values, documentId),\n onStateChange: this.state$.forScope(documentId),\n onFieldValueChange: this.fieldValueChange$.forScope(documentId),\n onFormReady: this.formReady$.forScope(documentId),\n };\n }\n\n private handleAnnotationEvent(event: AnnotationEvent): void {\n switch (event.type) {\n case 'loaded':\n this.buildFieldGroupIndex(event.documentId);\n this.formReady$.emit(event.documentId, this.getFormFieldsMethod(event.documentId));\n break;\n\n case 'create':\n case 'delete': {\n if (event.annotation.type !== PdfAnnotationSubtype.WIDGET) break;\n this.buildFieldGroupIndex(event.documentId);\n break;\n }\n\n case 'update': {\n if (!event.committed) break;\n const anno = event.annotation;\n if (anno.type !== PdfAnnotationSubtype.WIDGET) break;\n\n if (this.propagationInProgress.has(anno.id)) {\n this.propagationInProgress.delete(anno.id);\n break;\n }\n\n const patch = event.patch as Partial<PdfWidgetAnnoObject>;\n\n this.buildFieldGroupIndex(event.documentId);\n this.propagateFieldLevelChanges(event.documentId, anno, patch);\n break;\n }\n }\n }\n\n private propagateFieldLevelChanges(\n documentId: string,\n annotation: PdfAnnotationObject,\n patch: Partial<PdfWidgetAnnoObject>,\n ): void {\n if (!this.annotation || !patch.field) return;\n\n const fieldPatch = patch.field;\n\n const siblings = this.getFieldSiblings(annotation.id, documentId);\n if (siblings.length === 0) return;\n\n const siblingPatches: Array<{\n pageIndex: number;\n id: string;\n patch: Partial<PdfAnnotationObject>;\n }> = [];\n\n for (const sibling of siblings) {\n this.propagationInProgress.add(sibling.annotationId);\n siblingPatches.push({\n pageIndex: sibling.pageIndex,\n id: sibling.annotationId,\n patch: { field: { ...fieldPatch } } as Partial<PdfAnnotationObject>,\n });\n }\n\n this.annotation.forDocument(documentId).updateAnnotations(siblingPatches);\n }\n\n private buildFieldGroupIndex(documentId: string): void {\n if (!this.annotation) return;\n const annoState = this.annotation.forDocument(documentId).getState();\n if (!annoState) return;\n\n const idx = new Map<string, FieldGroupEntry[]>();\n const allWidgets: { entry: FieldGroupEntry; widget: PdfWidgetAnnoObject }[] = [];\n\n for (const [pageStr, uids] of Object.entries(annoState.pages)) {\n const pageIndex = Number(pageStr);\n for (const uid of uids) {\n const tracked = annoState.byUid[uid];\n if (!tracked || tracked.object.type !== PdfAnnotationSubtype.WIDGET) continue;\n const widget = tracked.object as PdfWidgetAnnoObject;\n\n const entry: FieldGroupEntry = { annotationId: uid, pageIndex };\n allWidgets.push({ entry, widget });\n\n const fieldKey = this.getFieldKey(widget.field);\n if (!fieldKey) continue;\n\n const group = idx.get(fieldKey) ?? [];\n group.push(entry);\n idx.set(fieldKey, group);\n }\n }\n\n this.fieldGroupIndex.set(documentId, idx);\n\n const nameIdx = new Map<string, FieldGroupEntry[]>();\n for (const { entry, widget } of allWidgets) {\n const name = widget.field.name.trim();\n if (!name) continue;\n const group = nameIdx.get(name) ?? [];\n group.push(entry);\n nameIdx.set(name, group);\n }\n this.fieldNameIndex.set(documentId, nameIdx);\n\n const navigable = allWidgets.filter(\n ({ widget }) => !(widget.field.flag & PDF_FORM_FIELD_FLAG.READONLY),\n );\n this.orderedFieldIndex.set(\n documentId,\n navigable.map(({ entry }) => entry),\n );\n }\n\n private getDocumentState(documentId?: string): FormDocumentState {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? { ...initialDocumentState };\n }\n\n // ─────────────────────────────────────────────────────────\n // Field Group Index\n // ─────────────────────────────────────────────────────────\n\n private getDocIndex(documentId: string): Map<string, FieldGroupEntry[]> {\n let idx = this.fieldGroupIndex.get(documentId);\n if (!idx) {\n idx = new Map();\n this.fieldGroupIndex.set(documentId, idx);\n }\n return idx;\n }\n\n private getFieldKey(field: PdfWidgetAnnoField): string | null {\n if (typeof field.fieldObjectId === 'number' && field.fieldObjectId > 0) {\n return `field:${field.fieldObjectId}`;\n }\n\n const normalizedName = field.name.trim();\n if (!normalizedName) return null;\n\n return `legacy:${field.type}:${normalizedName}`;\n }\n\n private resolveWidgetAnnotation(\n annotationId: string,\n documentId: string,\n ): PdfWidgetAnnoObject | null {\n if (!this.annotation) return null;\n\n const annoState = this.annotation.forDocument(documentId).getState();\n const tracked = annoState?.byUid[annotationId];\n if (!tracked || tracked.object.type !== PdfAnnotationSubtype.WIDGET) {\n return null;\n }\n\n return tracked.object as PdfWidgetAnnoObject;\n }\n\n public getFieldGroup(annotationId: string, documentId?: string): FieldGroupEntry[] {\n const docId = documentId ?? this.getActiveDocumentId();\n const widget = this.resolveWidgetAnnotation(annotationId, docId);\n if (!widget) return [];\n\n const fieldKey = this.getFieldKey(widget.field);\n if (!fieldKey) {\n return [{ annotationId: widget.id, pageIndex: widget.pageIndex }];\n }\n\n return (\n this.getDocIndex(docId).get(fieldKey) ?? [\n { annotationId: widget.id, pageIndex: widget.pageIndex },\n ]\n );\n }\n\n public getFieldSiblings(annotationId: string, documentId?: string): FieldGroupEntry[] {\n return this.getFieldGroup(annotationId, documentId).filter(\n (e) => e.annotationId !== annotationId,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Form Values API\n // ─────────────────────────────────────────────────────────\n\n private getFormValuesMethod(documentId?: string): Record<string, string> {\n const docId = documentId ?? this.getActiveDocumentId();\n const nameIdx = this.fieldNameIndex.get(docId);\n if (!nameIdx) return {};\n\n const values: Record<string, string> = {};\n for (const [name, entries] of nameIdx) {\n const widget = this.resolveWidgetAnnotation(entries[0].annotationId, docId);\n if (widget) {\n values[name] = widget.field.value;\n }\n }\n return values;\n }\n\n private getFormFieldsMethod(documentId?: string): FormFieldInfo[] {\n const docId = documentId ?? this.getActiveDocumentId();\n const nameIdx = this.fieldNameIndex.get(docId);\n if (!nameIdx) return [];\n\n const fields: FormFieldInfo[] = [];\n for (const [name, entries] of nameIdx) {\n const widget = this.resolveWidgetAnnotation(entries[0].annotationId, docId);\n if (!widget) continue;\n\n fields.push({\n name,\n type: widget.field.type,\n value: widget.field.value,\n readOnly: !!(widget.field.flag & PDF_FORM_FIELD_FLAG.READONLY),\n ...('options' in widget.field && widget.field.options\n ? { options: widget.field.options }\n : {}),\n });\n }\n return fields;\n }\n\n private setFormValuesMethod(\n values: Record<string, string>,\n documentId?: string,\n ): PdfTask<boolean> {\n const docId = documentId ?? this.getActiveDocumentId();\n const nameIdx = this.fieldNameIndex.get(docId);\n if (!nameIdx) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'no form fields indexed for this document',\n });\n }\n\n const entries = Object.entries(values);\n if (entries.length === 0) {\n return PdfTaskHelper.resolve(true);\n }\n\n const resultTask = new Task<boolean, PdfErrorReason>();\n let pending = entries.length;\n let failed = false;\n\n const onComplete = () => {\n pending--;\n if (pending === 0 && !failed) {\n resultTask.resolve(true);\n }\n };\n\n const onError = (err: { code: PdfErrorCode; message: string }) => {\n if (!failed) {\n failed = true;\n resultTask.reject(err);\n }\n };\n\n for (const [name, value] of entries) {\n const fieldEntries = nameIdx.get(name);\n if (!fieldEntries || fieldEntries.length === 0) {\n onComplete();\n continue;\n }\n\n let targetEntry = fieldEntries[0];\n let widget = this.resolveWidgetAnnotation(targetEntry.annotationId, docId);\n if (!widget) {\n onComplete();\n continue;\n }\n\n if (\n widget.field.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON ||\n widget.field.type === PDF_FORM_FIELD_TYPE.CHECKBOX\n ) {\n for (const entry of fieldEntries) {\n const w = this.resolveWidgetAnnotation(entry.annotationId, docId);\n if (w && w.exportValue === value) {\n widget = w;\n targetEntry = entry;\n break;\n }\n }\n }\n\n this.setFormFieldValues(\n targetEntry.pageIndex,\n widget,\n this.buildImportField(widget, value),\n docId,\n ).wait(\n () => onComplete(),\n (error) => onError(error.reason),\n );\n }\n\n return resultTask;\n }\n\n private buildImportField(widget: PdfWidgetAnnoObject, value: string): PdfWidgetAnnoField {\n const field = widget.field;\n\n if (\n (field.type === PDF_FORM_FIELD_TYPE.COMBOBOX || field.type === PDF_FORM_FIELD_TYPE.LISTBOX) &&\n 'options' in field\n ) {\n return {\n ...field,\n value,\n options: field.options.map((opt) => ({\n ...opt,\n isSelected: opt.label === value,\n })),\n };\n }\n\n if (field.type === PDF_FORM_FIELD_TYPE.CHECKBOX) {\n const normalizedValue = value === 'Off' ? 'Off' : (widget.exportValue ?? 'Yes');\n return { ...field, value: normalizedValue };\n }\n\n return { ...field, value };\n }\n\n private isToggleField(\n field: PdfWidgetAnnoField,\n ): field is PdfCheckboxWidgetAnnoField | PdfRadioButtonWidgetAnnoField {\n return (\n field.type === PDF_FORM_FIELD_TYPE.CHECKBOX || field.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON\n );\n }\n\n private shouldRegenerateWidgetAppearances(field: PdfWidgetAnnoField): boolean {\n return !this.isToggleField(field);\n }\n\n private getFieldBatchTarget(\n batch: Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>,\n ): { widget: PdfWidgetAnnoObject; pageIndex: number } | undefined {\n const entries = [...batch.values()];\n const checkedToggleEntry = entries.find(\n (entry) => this.isToggleField(entry.widget.field) && isWidgetChecked(entry.widget),\n );\n return checkedToggleEntry ?? entries[0];\n }\n\n private async readFieldWidgets(\n doc: PdfDocumentObject,\n groupEntries: FieldGroupEntry[],\n seq: TaskSequence<PdfErrorReason, unknown>,\n regenerateAppearances: boolean,\n ): Promise<Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>> {\n const pageSet = new Set(groupEntries.map((entry) => entry.pageIndex));\n const memberIds = new Set(groupEntries.map((entry) => entry.annotationId));\n const batch = new Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>();\n\n for (const pageIndex of pageSet) {\n const page = doc.pages.find((entry) => entry.index === pageIndex);\n if (!page) continue;\n\n const pageMemberIds = groupEntries\n .filter((entry) => entry.pageIndex === pageIndex)\n .map((entry) => entry.annotationId);\n\n if (regenerateAppearances) {\n await seq.run(() => this.engine.regenerateWidgetAppearances(doc, page, pageMemberIds));\n }\n\n const widgets = await seq.run(() => this.engine.getPageAnnoWidgets(doc, page));\n for (const widget of widgets) {\n if (memberIds.has(widget.id)) {\n batch.set(widget.id, { widget, pageIndex });\n }\n }\n }\n\n return batch;\n }\n\n private syncFieldBatch(\n documentId: string,\n batch: Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>,\n options: { emitFieldValueChanges?: boolean } = {},\n ): void {\n if (!this.annotation) return;\n\n for (const [id, { widget, pageIndex }] of batch) {\n this.annotation.syncAnnotationObject(id, widget, documentId);\n this.annotation.invalidatePageAppearances(pageIndex, documentId);\n\n if (options.emitFieldValueChanges) {\n this.fieldValueChange$.emit(documentId, {\n documentId,\n pageIndex,\n annotationId: id,\n widget,\n });\n }\n }\n\n this.buildFieldGroupIndex(documentId);\n }\n\n private resolveWidgetPage(\n annotationId: string,\n documentId: string,\n doc: PdfDocumentObject,\n ): { widget: PdfWidgetAnnoObject; page: PdfDocumentObject['pages'][number] } | null {\n const widget = this.resolveWidgetAnnotation(annotationId, documentId);\n if (!widget) return null;\n\n const page = doc.pages.find((entry) => entry.index === widget.pageIndex);\n if (!page) return null;\n\n return { widget, page };\n }\n\n private getPageFormAnnoWidgets(\n pageIndex: number,\n documentId?: string,\n ): PdfTask<PdfWidgetAnnoObject[]> {\n const docState = this.getCoreDocumentOrThrow(documentId);\n const doc = docState.document;\n\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const page = doc.pages.find((p) => p.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'page does not exist',\n });\n }\n\n return this.engine.getPageAnnoWidgets(doc, page);\n }\n\n private setFormFieldValues(\n pageIndex: number,\n annotation: PdfWidgetAnnoObject,\n newField: PdfWidgetAnnoField,\n documentId?: string,\n ): PdfTask<boolean> {\n const docId = documentId ?? this.getActiveDocumentId();\n const coreDoc = this.getCoreDocumentOrThrow(docId);\n const doc = coreDoc.document;\n\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const page = doc.pages.find((p) => p.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'page does not exist',\n });\n }\n\n const resultTask = new Task<boolean, PdfErrorReason>();\n const seq = new TaskSequence(resultTask);\n\n seq.execute(\n async () => {\n // 1. Snapshot \"before\" state for the entire field group\n const groupEntries = this.getFieldGroup(annotation.id, docId);\n const beforeEntries = await this.readFieldWidgets(doc, groupEntries, seq, false);\n\n // 2. Apply field state change to the engine (PDFium propagates to all controls)\n await seq.run(() => this.engine.setFormFieldState(doc, page, annotation, newField));\n\n // 3. Re-read fresh state for all group members, regenerating AP only when needed\n const afterEntries = await this.readFieldWidgets(\n doc,\n groupEntries,\n seq,\n this.shouldRegenerateWidgetAppearances(newField),\n );\n\n // 5. Build and register history command\n let isFirstExecution = true;\n\n const applyToEngine = async (\n batch: Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>,\n ) => {\n const target = this.getFieldBatchTarget(batch);\n if (!target) return;\n const pg = doc.pages.find((p) => p.index === target.pageIndex);\n if (!pg) return;\n await new Promise<void>((resolve) => {\n this.engine.setFormFieldState(doc, pg, target.widget, target.widget.field).wait(\n () => resolve(),\n () => resolve(),\n );\n });\n\n if (this.shouldRegenerateWidgetAppearances(target.widget.field)) {\n for (const pi of new Set([...batch.values()].map((entry) => entry.pageIndex))) {\n const p = doc.pages.find((pp) => pp.index === pi);\n if (!p) continue;\n const ids = [...batch.entries()]\n .filter(([, entry]) => entry.pageIndex === pi)\n .map(([id]) => id);\n await new Promise<void>((resolve) => {\n this.engine.regenerateWidgetAppearances(doc, p, ids).wait(\n () => resolve(),\n () => resolve(),\n );\n });\n }\n }\n };\n\n const command: Command = {\n execute: () => {\n const skipEngine = isFirstExecution;\n isFirstExecution = false;\n\n if (skipEngine) {\n this.syncFieldBatch(docId, afterEntries, { emitFieldValueChanges: true });\n } else {\n applyToEngine(afterEntries).then(() =>\n this.syncFieldBatch(docId, afterEntries, { emitFieldValueChanges: true }),\n );\n }\n },\n\n undo: () => {\n applyToEngine(beforeEntries).then(() =>\n this.syncFieldBatch(docId, beforeEntries, { emitFieldValueChanges: true }),\n );\n },\n };\n\n if (this.history) {\n this.history.forDocument(docId).register(command, this.FORM_HISTORY_TOPIC);\n } else {\n command.execute();\n }\n\n resultTask.resolve(true);\n },\n (err) => ({ code: PdfErrorCode.Unknown, message: String(err) }),\n );\n\n return resultTask;\n }\n\n private findConflictingFieldGroups(\n normalizedName: string,\n sourceAnnotationId: string,\n documentId: string,\n ): Map<string, { entries: FieldGroupEntry[]; widget: PdfWidgetAnnoObject }> {\n const result = new Map<string, { entries: FieldGroupEntry[]; widget: PdfWidgetAnnoObject }>();\n if (!this.annotation) return result;\n\n const annoState = this.annotation.forDocument(documentId).getState();\n if (!annoState) return result;\n\n const sourceFieldKey = (() => {\n const w = this.resolveWidgetAnnotation(sourceAnnotationId, documentId);\n return w ? this.getFieldKey(w.field) : null;\n })();\n\n for (const [pageStr, uids] of Object.entries(annoState.pages)) {\n const pageIndex = Number(pageStr);\n for (const uid of uids) {\n const tracked = annoState.byUid[uid];\n if (!tracked || tracked.object.type !== PdfAnnotationSubtype.WIDGET) continue;\n const widget = tracked.object as PdfWidgetAnnoObject;\n if (widget.field.name.trim() !== normalizedName) continue;\n\n const fieldKey = this.getFieldKey(widget.field);\n if (!fieldKey || fieldKey === sourceFieldKey) continue;\n\n if (!result.has(fieldKey)) {\n result.set(fieldKey, { entries: [], widget });\n }\n result.get(fieldKey)!.entries.push({ annotationId: uid, pageIndex });\n }\n }\n\n return result;\n }\n\n private renameFieldMethod(\n annotationId: string,\n name: string,\n documentId?: string,\n ): PdfTask<RenameFieldResult> {\n const docId = documentId ?? this.getActiveDocumentId();\n const normalizedName = name.trim();\n if (!normalizedName) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'Field name must not be empty.',\n });\n }\n\n const coreDoc = this.getCoreDocumentOrThrow(docId);\n const doc = coreDoc.document;\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const source = this.resolveWidgetPage(annotationId, docId, doc);\n if (!source) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'widget annotation not found',\n });\n }\n\n if (source.widget.field.name.trim() === normalizedName) {\n return PdfTaskHelper.resolve<RenameFieldResult>({ outcome: 'no-op' });\n }\n\n const conflicts = this.findConflictingFieldGroups(normalizedName, annotationId, docId);\n\n if (conflicts.size > 0) {\n if (conflicts.size > 1) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'That field name is used by multiple fields. Choose a unique name.',\n });\n }\n\n const [, match] = [...conflicts.entries()][0];\n\n if (match.widget.field.type !== source.widget.field.type) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'That field name is already used by a different widget type.',\n });\n }\n\n return PdfTaskHelper.resolve<RenameFieldResult>({\n outcome: 'conflict',\n targetAnnotationId: match.entries[0].annotationId,\n fieldName: normalizedName,\n });\n }\n\n const resultTask = new Task<RenameFieldResult, PdfErrorReason>();\n const seq = new TaskSequence(resultTask);\n\n seq.execute(\n async () => {\n const groupEntries = this.getFieldGroup(annotationId, docId);\n await seq.run(() =>\n this.engine.renameWidgetField(doc, source.page, source.widget, normalizedName),\n );\n\n const syncedEntries = await this.readFieldWidgets(doc, groupEntries, seq, false);\n this.syncFieldBatch(docId, syncedEntries);\n resultTask.resolve({ outcome: 'renamed' });\n },\n (err) => ({ code: PdfErrorCode.Unknown, message: String(err) }),\n );\n\n return resultTask;\n }\n\n private shareFieldMethod(\n annotationId: string,\n targetAnnotationId: string,\n documentId?: string,\n ): PdfTask<boolean> {\n const docId = documentId ?? this.getActiveDocumentId();\n if (annotationId === targetAnnotationId) {\n return PdfTaskHelper.resolve(true);\n }\n\n const coreDoc = this.getCoreDocumentOrThrow(docId);\n const doc = coreDoc.document;\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const source = this.resolveWidgetPage(annotationId, docId, doc);\n const target = this.resolveWidgetPage(targetAnnotationId, docId, doc);\n if (!source || !target) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'widget annotation not found',\n });\n }\n\n if (source.widget.field.type !== target.widget.field.type) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'cannot share fields with different widget types',\n });\n }\n\n if (\n source.widget.field.fieldObjectId &&\n target.widget.field.fieldObjectId &&\n source.widget.field.fieldObjectId === target.widget.field.fieldObjectId\n ) {\n return PdfTaskHelper.resolve(true);\n }\n\n const affectedEntryMap = new Map<string, FieldGroupEntry>();\n for (const entry of this.getFieldGroup(annotationId, docId)) {\n affectedEntryMap.set(entry.annotationId, entry);\n }\n for (const entry of this.getFieldGroup(targetAnnotationId, docId)) {\n affectedEntryMap.set(entry.annotationId, entry);\n }\n\n const affectedEntries = [...affectedEntryMap.values()];\n const resultTask = new Task<boolean, PdfErrorReason>();\n const seq = new TaskSequence(resultTask);\n\n seq.execute(\n async () => {\n await seq.run(() =>\n this.engine.shareWidgetField(doc, source.page, source.widget, target.page, target.widget),\n );\n\n const syncedEntries = await this.readFieldWidgets(\n doc,\n affectedEntries,\n seq,\n this.shouldRegenerateWidgetAppearances(target.widget.field),\n );\n this.syncFieldBatch(docId, syncedEntries);\n resultTask.resolve(true);\n },\n (err) => ({ code: PdfErrorCode.Unknown, message: String(err) }),\n );\n\n return resultTask;\n }\n\n private selectFieldMethod(annotationId: string, documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n this.dispatch(selectFieldAction(docId, annotationId));\n }\n\n private deselectFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n this.dispatch(deselectFieldAction(docId));\n }\n\n private getSelectedFieldId(documentId?: string): string | null {\n return this.getDocumentState(documentId).selectedFieldId;\n }\n\n private selectNextFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const ordered = this.orderedFieldIndex.get(docId);\n if (!ordered || ordered.length === 0) return;\n\n const currentId = this.getSelectedFieldId(docId);\n let nextIndex = 0;\n if (currentId) {\n const currentIndex = ordered.findIndex((e) => e.annotationId === currentId);\n nextIndex = currentIndex >= 0 ? (currentIndex + 1) % ordered.length : 0;\n }\n\n const next = ordered[nextIndex];\n this.dispatch(selectFieldAction(docId, next.annotationId));\n }\n\n private selectPreviousFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const ordered = this.orderedFieldIndex.get(docId);\n if (!ordered || ordered.length === 0) return;\n\n const currentId = this.getSelectedFieldId(docId);\n let prevIndex = ordered.length - 1;\n if (currentId) {\n const currentIndex = ordered.findIndex((e) => e.annotationId === currentId);\n prevIndex =\n currentIndex >= 0\n ? (currentIndex - 1 + ordered.length) % ordered.length\n : ordered.length - 1;\n }\n\n const prev = ordered[prevIndex];\n this.dispatch(selectFieldAction(docId, prev.annotationId));\n }\n\n private activateFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const selectedId = this.getSelectedFieldId(docId);\n if (!selectedId) return;\n\n const widget = this.resolveWidgetAnnotation(selectedId, docId);\n if (!widget) return;\n\n const field = widget.field;\n if (field.type === PDF_FORM_FIELD_TYPE.CHECKBOX) {\n const checked = isWidgetChecked(widget);\n const newValue = checked ? 'Off' : (widget.exportValue ?? 'Yes');\n this.setFormFieldValues(widget.pageIndex, widget, { ...field, value: newValue }, docId);\n } else if (field.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON) {\n if (!isWidgetChecked(widget) && widget.exportValue) {\n this.setFormFieldValues(\n widget.pageIndex,\n widget,\n { ...field, value: widget.exportValue },\n docId,\n );\n }\n }\n }\n\n private renderWidget(\n options: RenderWidgetOptions,\n documentId?: string,\n ): Task<Blob, PdfErrorReason> {\n if (!this.annotation) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'annotation plugin not found',\n });\n }\n\n const id = documentId ?? this.getActiveDocumentId();\n return this.annotation.forDocument(id).renderAnnotation(options);\n }\n\n async destroy(): Promise<void> {\n this.state$.clear();\n this.fieldValueChange$.clear();\n this.formReady$.clear();\n super.destroy();\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, FORM_PLUGIN_ID } from './manifest';\nimport { FormPluginConfig, FormState } from './types';\nimport { FormPlugin } from './form-plugin';\nimport { initialState, reducer } from './reducer';\nimport { FormAction } from './actions';\n\nexport const FormPluginPackage: PluginPackage<FormPlugin, FormPluginConfig, FormState, FormAction> =\n {\n manifest,\n create: (registry, config) => new FormPlugin(FORM_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n };\n\nexport * from './form-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './tools';\nexport { initialState, initialDocumentState } from './reducer';\n"],"names":["selectFieldAction","deselectFieldAction"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Action } from '@embedpdf/core';
|
|
2
|
+
import { FormDocumentState } from './types';
|
|
3
|
+
export declare const INIT_FORM_STATE = "FORM/INIT_STATE";
|
|
4
|
+
export declare const CLEANUP_FORM_STATE = "FORM/CLEANUP_STATE";
|
|
5
|
+
export declare const SELECT_FIELD = "FORM/SELECT_FIELD";
|
|
6
|
+
export declare const DESELECT_FIELD = "FORM/DESELECT_FIELD";
|
|
7
|
+
export interface InitFormStateAction extends Action {
|
|
8
|
+
type: typeof INIT_FORM_STATE;
|
|
9
|
+
payload: {
|
|
10
|
+
documentId: string;
|
|
11
|
+
state: FormDocumentState;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export interface CleanupFormStateAction extends Action {
|
|
15
|
+
type: typeof CLEANUP_FORM_STATE;
|
|
16
|
+
payload: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SelectFieldAction extends Action {
|
|
19
|
+
type: typeof SELECT_FIELD;
|
|
20
|
+
payload: {
|
|
21
|
+
documentId: string;
|
|
22
|
+
annotationId: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface DeselectFieldAction extends Action {
|
|
26
|
+
type: typeof DESELECT_FIELD;
|
|
27
|
+
payload: string;
|
|
28
|
+
}
|
|
29
|
+
export type FormAction = InitFormStateAction | CleanupFormStateAction | SelectFieldAction | DeselectFieldAction;
|
|
30
|
+
export declare function initFormState(documentId: string, state: FormDocumentState): InitFormStateAction;
|
|
31
|
+
export declare function cleanupFormState(documentId: string): CleanupFormStateAction;
|
|
32
|
+
export declare function selectField(documentId: string, annotationId: string): SelectFieldAction;
|
|
33
|
+
export declare function deselectField(documentId: string): DeselectFieldAction;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BasePlugin, PluginRegistry } from '@embedpdf/core';
|
|
2
|
+
import { FieldGroupEntry, FormCapability, FormPluginConfig, FormState } from './types';
|
|
3
|
+
import { FormAction } from './actions';
|
|
4
|
+
export declare class FormPlugin extends BasePlugin<FormPluginConfig, FormCapability, FormState, FormAction> {
|
|
5
|
+
static readonly id: "form";
|
|
6
|
+
private readonly FORM_HISTORY_TOPIC;
|
|
7
|
+
private annotation;
|
|
8
|
+
private history;
|
|
9
|
+
private readonly state$;
|
|
10
|
+
private readonly fieldValueChange$;
|
|
11
|
+
private readonly formReady$;
|
|
12
|
+
/** Per-document logical field index: documentId → (fieldKey → FieldGroupEntry[]) */
|
|
13
|
+
private readonly fieldGroupIndex;
|
|
14
|
+
/** Per-document name-based index: documentId → (fieldName → FieldGroupEntry[]) */
|
|
15
|
+
private readonly fieldNameIndex;
|
|
16
|
+
/** Per-document tab-order sorted widget list: documentId → FieldGroupEntry[] */
|
|
17
|
+
private readonly orderedFieldIndex;
|
|
18
|
+
/** IDs currently being propagated to siblings; prevents recursive loops */
|
|
19
|
+
private readonly propagationInProgress;
|
|
20
|
+
constructor(id: string, registry: PluginRegistry, _config: FormPluginConfig);
|
|
21
|
+
initialize(): Promise<void>;
|
|
22
|
+
protected onDocumentLoadingStarted(documentId: string): void;
|
|
23
|
+
protected onDocumentClosed(documentId: string): void;
|
|
24
|
+
onStoreUpdated(prev: FormState, next: FormState): void;
|
|
25
|
+
protected buildCapability(): FormCapability;
|
|
26
|
+
private createFormScope;
|
|
27
|
+
private handleAnnotationEvent;
|
|
28
|
+
private propagateFieldLevelChanges;
|
|
29
|
+
private buildFieldGroupIndex;
|
|
30
|
+
private getDocumentState;
|
|
31
|
+
private getDocIndex;
|
|
32
|
+
private getFieldKey;
|
|
33
|
+
private resolveWidgetAnnotation;
|
|
34
|
+
getFieldGroup(annotationId: string, documentId?: string): FieldGroupEntry[];
|
|
35
|
+
getFieldSiblings(annotationId: string, documentId?: string): FieldGroupEntry[];
|
|
36
|
+
private getFormValuesMethod;
|
|
37
|
+
private getFormFieldsMethod;
|
|
38
|
+
private setFormValuesMethod;
|
|
39
|
+
private buildImportField;
|
|
40
|
+
private isToggleField;
|
|
41
|
+
private shouldRegenerateWidgetAppearances;
|
|
42
|
+
private getFieldBatchTarget;
|
|
43
|
+
private readFieldWidgets;
|
|
44
|
+
private syncFieldBatch;
|
|
45
|
+
private resolveWidgetPage;
|
|
46
|
+
private getPageFormAnnoWidgets;
|
|
47
|
+
private setFormFieldValues;
|
|
48
|
+
private findConflictingFieldGroups;
|
|
49
|
+
private renameFieldMethod;
|
|
50
|
+
private shareFieldMethod;
|
|
51
|
+
private selectFieldMethod;
|
|
52
|
+
private deselectFieldMethod;
|
|
53
|
+
private getSelectedFieldId;
|
|
54
|
+
private selectNextFieldMethod;
|
|
55
|
+
private selectPreviousFieldMethod;
|
|
56
|
+
private activateFieldMethod;
|
|
57
|
+
private renderWidget;
|
|
58
|
+
destroy(): Promise<void>;
|
|
59
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { textFieldHandlerFactory } from './text-field.handler';
|
|
2
|
+
export { checkboxHandlerFactory } from './checkbox.handler';
|
|
3
|
+
export { radioButtonHandlerFactory } from './radio-button.handler';
|
|
4
|
+
export { comboboxHandlerFactory } from './combobox.handler';
|
|
5
|
+
export { listboxHandlerFactory } from './listbox.handler';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PluginPackage } from '@embedpdf/core';
|
|
2
|
+
import { FormPluginConfig, FormState } from './types';
|
|
3
|
+
import { FormPlugin } from './form-plugin';
|
|
4
|
+
import { FormAction } from './actions';
|
|
5
|
+
export declare const FormPluginPackage: PluginPackage<FormPlugin, FormPluginConfig, FormState, FormAction>;
|
|
6
|
+
export * from './form-plugin';
|
|
7
|
+
export * from './types';
|
|
8
|
+
export * from './manifest';
|
|
9
|
+
export * from './tools';
|
|
10
|
+
export { initialState, initialDocumentState } from './reducer';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Reducer } from '@embedpdf/core';
|
|
2
|
+
import { FormDocumentState, FormState } from './types';
|
|
3
|
+
import { FormAction } from './actions';
|
|
4
|
+
export declare const initialDocumentState: FormDocumentState;
|
|
5
|
+
export declare const initialState: FormState;
|
|
6
|
+
export declare const reducer: Reducer<FormState, FormAction>;
|