@embedpdf/plugin-form 2.15.0 → 3.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +192 -21
  2. package/dist/index.cjs +1416 -2
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +277 -0
  5. package/dist/index.d.ts +277 -1
  6. package/dist/index.js +1398 -1779
  7. package/dist/index.js.map +1 -1
  8. package/package.json +24 -61
  9. package/dist/lib/actions.d.ts +0 -33
  10. package/dist/lib/form-plugin.d.ts +0 -59
  11. package/dist/lib/handlers/checkbox.handler.d.ts +0 -3
  12. package/dist/lib/handlers/combobox.handler.d.ts +0 -3
  13. package/dist/lib/handlers/index.d.ts +0 -5
  14. package/dist/lib/handlers/listbox.handler.d.ts +0 -3
  15. package/dist/lib/handlers/radio-button.handler.d.ts +0 -3
  16. package/dist/lib/handlers/text-field.handler.d.ts +0 -3
  17. package/dist/lib/index.d.ts +0 -10
  18. package/dist/lib/manifest.d.ts +0 -4
  19. package/dist/lib/reducer.d.ts +0 -6
  20. package/dist/lib/tools.d.ts +0 -457
  21. package/dist/lib/types.d.ts +0 -98
  22. package/dist/preact/adapter.d.ts +0 -13
  23. package/dist/preact/annotation.d.ts +0 -1
  24. package/dist/preact/core.d.ts +0 -1
  25. package/dist/preact/index.cjs +0 -2
  26. package/dist/preact/index.cjs.map +0 -1
  27. package/dist/preact/index.d.ts +0 -1
  28. package/dist/preact/index.js +0 -1359
  29. package/dist/preact/index.js.map +0 -1
  30. package/dist/react/adapter.d.ts +0 -6
  31. package/dist/react/annotation.d.ts +0 -1
  32. package/dist/react/core.d.ts +0 -1
  33. package/dist/react/index.cjs +0 -2
  34. package/dist/react/index.cjs.map +0 -1
  35. package/dist/react/index.d.ts +0 -1
  36. package/dist/react/index.js +0 -1358
  37. package/dist/react/index.js.map +0 -1
  38. package/dist/shared/components/annotations/form-checkbox.d.ts +0 -12
  39. package/dist/shared/components/annotations/form-combobox.d.ts +0 -12
  40. package/dist/shared/components/annotations/form-listbox.d.ts +0 -12
  41. package/dist/shared/components/annotations/form-radio-button.d.ts +0 -12
  42. package/dist/shared/components/annotations/form-text-field.d.ts +0 -12
  43. package/dist/shared/components/fields/checkbox.d.ts +0 -2
  44. package/dist/shared/components/fields/combobox.d.ts +0 -2
  45. package/dist/shared/components/fields/listbox.d.ts +0 -2
  46. package/dist/shared/components/fields/push-button.d.ts +0 -2
  47. package/dist/shared/components/fields/radio-button.d.ts +0 -2
  48. package/dist/shared/components/fields/style.d.ts +0 -6
  49. package/dist/shared/components/fields/text.d.ts +0 -2
  50. package/dist/shared/components/fill-mode/combobox-fill-mode.d.ts +0 -3
  51. package/dist/shared/components/fill-mode/listbox-fill-mode.d.ts +0 -3
  52. package/dist/shared/components/fill-mode/push-button-fill-mode.d.ts +0 -3
  53. package/dist/shared/components/fill-mode/radio-button-fill-mode.d.ts +0 -3
  54. package/dist/shared/components/fill-mode/text-fill-mode.d.ts +0 -3
  55. package/dist/shared/components/fill-mode/toggle-fill-mode.d.ts +0 -3
  56. package/dist/shared/components/form-renderer-registration.d.ts +0 -5
  57. package/dist/shared/components/form-renderers.d.ts +0 -9
  58. package/dist/shared/components/index.d.ts +0 -2
  59. package/dist/shared/components/render-widget.d.ts +0 -12
  60. package/dist/shared/components/types.d.ts +0 -42
  61. package/dist/shared/hooks/index.d.ts +0 -1
  62. package/dist/shared/hooks/use-form-widget-state.d.ts +0 -12
  63. package/dist/shared/hooks/use-form.d.ts +0 -16
  64. package/dist/shared/index.d.ts +0 -4
  65. package/dist/shared-preact/components/annotations/form-checkbox.d.ts +0 -12
  66. package/dist/shared-preact/components/annotations/form-combobox.d.ts +0 -12
  67. package/dist/shared-preact/components/annotations/form-listbox.d.ts +0 -12
  68. package/dist/shared-preact/components/annotations/form-radio-button.d.ts +0 -12
  69. package/dist/shared-preact/components/annotations/form-text-field.d.ts +0 -12
  70. package/dist/shared-preact/components/fields/checkbox.d.ts +0 -2
  71. package/dist/shared-preact/components/fields/combobox.d.ts +0 -2
  72. package/dist/shared-preact/components/fields/listbox.d.ts +0 -2
  73. package/dist/shared-preact/components/fields/push-button.d.ts +0 -2
  74. package/dist/shared-preact/components/fields/radio-button.d.ts +0 -2
  75. package/dist/shared-preact/components/fields/style.d.ts +0 -6
  76. package/dist/shared-preact/components/fields/text.d.ts +0 -2
  77. package/dist/shared-preact/components/fill-mode/combobox-fill-mode.d.ts +0 -3
  78. package/dist/shared-preact/components/fill-mode/listbox-fill-mode.d.ts +0 -3
  79. package/dist/shared-preact/components/fill-mode/push-button-fill-mode.d.ts +0 -3
  80. package/dist/shared-preact/components/fill-mode/radio-button-fill-mode.d.ts +0 -3
  81. package/dist/shared-preact/components/fill-mode/text-fill-mode.d.ts +0 -3
  82. package/dist/shared-preact/components/fill-mode/toggle-fill-mode.d.ts +0 -3
  83. package/dist/shared-preact/components/form-renderer-registration.d.ts +0 -5
  84. package/dist/shared-preact/components/form-renderers.d.ts +0 -9
  85. package/dist/shared-preact/components/index.d.ts +0 -2
  86. package/dist/shared-preact/components/render-widget.d.ts +0 -12
  87. package/dist/shared-preact/components/types.d.ts +0 -42
  88. package/dist/shared-preact/hooks/index.d.ts +0 -1
  89. package/dist/shared-preact/hooks/use-form-widget-state.d.ts +0 -12
  90. package/dist/shared-preact/hooks/use-form.d.ts +0 -16
  91. package/dist/shared-preact/index.d.ts +0 -4
  92. package/dist/shared-react/components/annotations/form-checkbox.d.ts +0 -12
  93. package/dist/shared-react/components/annotations/form-combobox.d.ts +0 -12
  94. package/dist/shared-react/components/annotations/form-listbox.d.ts +0 -12
  95. package/dist/shared-react/components/annotations/form-radio-button.d.ts +0 -12
  96. package/dist/shared-react/components/annotations/form-text-field.d.ts +0 -12
  97. package/dist/shared-react/components/fields/checkbox.d.ts +0 -2
  98. package/dist/shared-react/components/fields/combobox.d.ts +0 -2
  99. package/dist/shared-react/components/fields/listbox.d.ts +0 -2
  100. package/dist/shared-react/components/fields/push-button.d.ts +0 -2
  101. package/dist/shared-react/components/fields/radio-button.d.ts +0 -2
  102. package/dist/shared-react/components/fields/style.d.ts +0 -6
  103. package/dist/shared-react/components/fields/text.d.ts +0 -2
  104. package/dist/shared-react/components/fill-mode/combobox-fill-mode.d.ts +0 -3
  105. package/dist/shared-react/components/fill-mode/listbox-fill-mode.d.ts +0 -3
  106. package/dist/shared-react/components/fill-mode/push-button-fill-mode.d.ts +0 -3
  107. package/dist/shared-react/components/fill-mode/radio-button-fill-mode.d.ts +0 -3
  108. package/dist/shared-react/components/fill-mode/text-fill-mode.d.ts +0 -3
  109. package/dist/shared-react/components/fill-mode/toggle-fill-mode.d.ts +0 -3
  110. package/dist/shared-react/components/form-renderer-registration.d.ts +0 -5
  111. package/dist/shared-react/components/form-renderers.d.ts +0 -9
  112. package/dist/shared-react/components/index.d.ts +0 -2
  113. package/dist/shared-react/components/render-widget.d.ts +0 -12
  114. package/dist/shared-react/components/types.d.ts +0 -42
  115. package/dist/shared-react/hooks/index.d.ts +0 -1
  116. package/dist/shared-react/hooks/use-form-widget-state.d.ts +0 -12
  117. package/dist/shared-react/hooks/use-form.d.ts +0 -16
  118. package/dist/shared-react/index.d.ts +0 -4
  119. package/dist/svelte/components/FormRendererRegistration.svelte.d.ts +0 -18
  120. package/dist/svelte/components/RenderWidget.svelte.d.ts +0 -11
  121. package/dist/svelte/components/annotations/FormCheckbox.svelte.d.ts +0 -5
  122. package/dist/svelte/components/annotations/FormCombobox.svelte.d.ts +0 -5
  123. package/dist/svelte/components/annotations/FormListbox.svelte.d.ts +0 -5
  124. package/dist/svelte/components/annotations/FormRadioButton.svelte.d.ts +0 -5
  125. package/dist/svelte/components/annotations/FormTextField.svelte.d.ts +0 -5
  126. package/dist/svelte/components/fields/ComboboxField.svelte.d.ts +0 -4
  127. package/dist/svelte/components/fields/ListboxField.svelte.d.ts +0 -4
  128. package/dist/svelte/components/fields/TextField.svelte.d.ts +0 -4
  129. package/dist/svelte/components/fill-mode/ComboboxFillMode.svelte.d.ts +0 -5
  130. package/dist/svelte/components/fill-mode/ListboxFillMode.svelte.d.ts +0 -5
  131. package/dist/svelte/components/fill-mode/RadioButtonFillMode.svelte.d.ts +0 -5
  132. package/dist/svelte/components/fill-mode/TextFillMode.svelte.d.ts +0 -5
  133. package/dist/svelte/components/fill-mode/ToggleFillMode.svelte.d.ts +0 -5
  134. package/dist/svelte/components/form-renderers.d.ts +0 -9
  135. package/dist/svelte/components/previews/CheckboxPreview.svelte.d.ts +0 -9
  136. package/dist/svelte/components/previews/ListboxPreview.svelte.d.ts +0 -9
  137. package/dist/svelte/components/previews/RadioButtonPreview.svelte.d.ts +0 -9
  138. package/dist/svelte/components/previews/TextFieldPreview.svelte.d.ts +0 -9
  139. package/dist/svelte/hooks/index.d.ts +0 -2
  140. package/dist/svelte/hooks/use-form-widget-state.svelte.d.ts +0 -12
  141. package/dist/svelte/hooks/use-form.svelte.d.ts +0 -14
  142. package/dist/svelte/index.cjs +0 -2
  143. package/dist/svelte/index.cjs.map +0 -1
  144. package/dist/svelte/index.d.ts +0 -3
  145. package/dist/svelte/index.js +0 -1592
  146. package/dist/svelte/index.js.map +0 -1
  147. package/dist/vue/components/annotations/form-checkbox.vue.d.ts +0 -6
  148. package/dist/vue/components/annotations/form-combobox.vue.d.ts +0 -6
  149. package/dist/vue/components/annotations/form-listbox.vue.d.ts +0 -6
  150. package/dist/vue/components/annotations/form-radio-button.vue.d.ts +0 -6
  151. package/dist/vue/components/annotations/form-text-field.vue.d.ts +0 -6
  152. package/dist/vue/components/fields/combobox-field.vue.d.ts +0 -4
  153. package/dist/vue/components/fields/listbox-field.vue.d.ts +0 -4
  154. package/dist/vue/components/fields/style.d.ts +0 -6
  155. package/dist/vue/components/fields/text-field.vue.d.ts +0 -4
  156. package/dist/vue/components/fill-mode/combobox-fill-mode.vue.d.ts +0 -6
  157. package/dist/vue/components/fill-mode/listbox-fill-mode.vue.d.ts +0 -6
  158. package/dist/vue/components/fill-mode/radio-button-fill-mode.vue.d.ts +0 -6
  159. package/dist/vue/components/fill-mode/text-fill-mode.vue.d.ts +0 -6
  160. package/dist/vue/components/fill-mode/toggle-fill-mode.vue.d.ts +0 -6
  161. package/dist/vue/components/form-renderer-registration.vue.d.ts +0 -13
  162. package/dist/vue/components/form-renderers.d.ts +0 -3
  163. package/dist/vue/components/previews/checkbox-preview.vue.d.ts +0 -10
  164. package/dist/vue/components/previews/listbox-preview.vue.d.ts +0 -10
  165. package/dist/vue/components/previews/radio-button-preview.vue.d.ts +0 -10
  166. package/dist/vue/components/previews/text-field-preview.vue.d.ts +0 -10
  167. package/dist/vue/components/render-widget.vue.d.ts +0 -15
  168. package/dist/vue/hooks/index.d.ts +0 -2
  169. package/dist/vue/hooks/use-form-widget-state.d.ts +0 -12
  170. package/dist/vue/hooks/use-form.d.ts +0 -12
  171. package/dist/vue/index.cjs +0 -2
  172. package/dist/vue/index.cjs.map +0 -1
  173. package/dist/vue/index.d.ts +0 -3
  174. package/dist/vue/index.js +0 -1643
  175. package/dist/vue/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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":["FORM_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","enabled","INIT_FORM_STATE","CLEANUP_FORM_STATE","SELECT_FIELD","DESELECT_FIELD","selectField","documentId","annotationId","type","payload","initialDocumentState","selectedFieldId","initialState","documents","textFieldHandlerFactory","annotationType","PdfAnnotationSubtype","WIDGET","create","context","pageIndex","onCommit","onPreview","getTool","pageSize","getStart","setStart","useState","clampToPage","pos","x","clamp","width","y","height","getDefaults","tool","defaults","fontFamily","PdfStandardFont","Helvetica","fontSize","fontColor","strokeColor","color","strokeWidth","field","buildRect","start","end","origin","Math","min","size","abs","buildAnnotation","rect","fieldName","uuidV4","slice","created","Date","PDF_FORM_FIELD_TYPE","TEXTFIELD","flag","_a","PDF_FORM_FIELD_FLAG","NONE","alternateName","value","clickDetector","useClickDetector","onClickDetected","clickConfig","clickBehavior","defaultSize","getPreview","current","bounds","data","onPointerDown","evt","clampedPos","onStart","setPointerCapture","call","onPointerMove","onMove","hasMoved","onPointerUp","onEnd","reset","releasePointerCapture","onPointerLeave","_","onPointerCancel","checkboxHandlerFactory","exportValue","CHECKBOX","radioButtonHandlerFactory","dx","dy","side","max","sx","sy","RADIOBUTTON","BUTTON_RADIO","BUTTON_NOTOGGLETOOFF","options","comboboxHandlerFactory","COMBOBOX","label","isSelected","listboxHandlerFactory","LISTBOX","formTextFieldTool","defineAnnotationTool","labelKey","categories","matchScore","a","interaction","exclusive","cursor","isDraggable","isResizable","isRotatable","isGroupDraggable","isGroupResizable","isGroupRotatable","behavior","useAppearanceStream","pointerHandler","formCheckboxTool","formRadioButtonTool","lockAspectRatio","formComboboxTool","formListboxTool","formTools","_FormPlugin","BasePlugin","constructor","registry","_config","super","this","FORM_HISTORY_TOPIC","annotation","history","state$","createScopedEmitter","state","fieldValueChange$","event","cache","formReady$","fields","fieldGroupIndex","Map","fieldNameIndex","orderedFieldIndex","propagationInProgress","Set","getPlugin","_b","HistoryPlugin","addTool","onAnnotationEvent","handleAnnotationEvent","initialize","onDocumentLoadingStarted","dispatch","initFormState","onDocumentClosed","cleanupFormState","delete","clearScope","onStoreUpdated","prev","next","prevDoc","nextDoc","emit","buildCapability","getPageFormAnnoWidgets","setFormFieldValues","newField","renameField","renameFieldMethod","shareField","targetAnnotationId","shareFieldMethod","renderWidget","selectFieldMethod","deselectField","deselectFieldMethod","getSelectedFieldId","selectNextField","selectNextFieldMethod","selectPreviousField","selectPreviousFieldMethod","activateField","activateFieldMethod","getState","getDocumentState","getFieldGroup","getFieldSiblings","getFormValues","getFormValuesMethod","getFormFields","getFormFieldsMethod","setFormValues","values","setFormValuesMethod","forDocument","createFormScope","onStateChange","onGlobal","onFieldValueChange","onFormReady","forScope","buildFieldGroupIndex","committed","anno","has","patch","propagateFieldLevelChanges","fieldPatch","siblings","length","siblingPatches","sibling","add","push","updateAnnotations","annoState","idx","allWidgets","pageStr","uids","Object","entries","pages","Number","uid","tracked","byUid","object","widget","entry","fieldKey","getFieldKey","group","get","set","nameIdx","trim","navigable","filter","READONLY","map","getActiveDocumentId","getDocIndex","fieldObjectId","normalizedName","resolveWidgetAnnotation","docId","e","readOnly","PdfTaskHelper","reject","code","PdfErrorCode","NotFound","message","resolve","resultTask","Task","pending","failed","onComplete","fieldEntries","targetEntry","w","buildImportField","wait","error","onError","err","reason","opt","normalizedValue","isToggleField","shouldRegenerateWidgetAppearances","getFieldBatchTarget","batch","find","isWidgetChecked","readFieldWidgets","doc","groupEntries","seq","regenerateAppearances","pageSet","memberIds","page","index","pageMemberIds","run","engine","regenerateWidgetAppearances","widgets","getPageAnnoWidgets","syncFieldBatch","syncAnnotationObject","invalidatePageAppearances","emitFieldValueChanges","resolveWidgetPage","getCoreDocumentOrThrow","document","DocNotOpen","p","TaskSequence","execute","async","beforeEntries","setFormFieldState","afterEntries","isFirstExecution","applyToEngine","target","pg","Promise","pi","pp","ids","command","skipEngine","then","undo","register","Unknown","String","findConflictingFieldGroups","sourceAnnotationId","result","sourceFieldKey","source","outcome","conflicts","match","renameWidgetField","syncedEntries","affectedEntryMap","affectedEntries","shareWidgetField","selectFieldAction","deselectFieldAction","ordered","currentId","nextIndex","currentIndex","findIndex","prevIndex","selectedId","newValue","renderAnnotation","destroy","clear","FormPlugin","FormPluginPackage","config","reducer","action","remaining","docState"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["DEFAULT_SCRIPT_BUDGET","fillItems","coreFillItems","coreFillItemForWidget","AnnotationHostToken","coreFieldForWidget","MIN_DRAG","InteractionToken","AnnotationToken","AnnotationHostToken"],"sources":["../src/core/model.ts","../src/core/fill-items.ts","../src/mutationQueue.ts","../src/scripting.ts","../src/capability.ts","../src/effects.ts","../src/tools.ts","../src/handler.ts","../src/reducer.ts","../src/types.ts","../src/form.plugin.ts"],"sourcesContent":["/**\n * The pure heart of the form plugin — no DOM, no engine, no kernel imports.\n * Same discipline as `annotation-core`, folded in as a directory because the\n * model is small and has no consumer besides this plugin.\n *\n * The model mirrors ENGINE truth plus transient write status. Keystroke\n * drafts deliberately live in the framework controls (a focused `<input>` is\n * already the draft store); the model only learns about a value when it is\n * committed. That keeps typing synchronous and the model identical across\n * frameworks.\n */\nimport type { FormFieldDTO, FormSnapshot } from '@embedpdf/engine-core/runtime';\n\n/** A content-space box (top-left origin, y-down, PDF points). */\nexport interface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Stable client key for a field: object number when durable, else FQN. */\nexport type FieldKey = string;\n\nexport const fieldKeyOf = (field: { fieldObjectNumber: number; name: string }): FieldKey =>\n field.fieldObjectNumber > 0 ? `obj:${field.fieldObjectNumber}` : `fqn:${field.name}`;\n\nexport interface Model {\n /** Engine truth; replaced wholesale on refresh, patched on write-backs. */\n snapshot: FormSnapshot | null;\n /** fieldKey → index into snapshot.fields. */\n byKey: Record<FieldKey, number>;\n /** annotObjectNumber → index into snapshot.fields (widget → field join). */\n byWidget: Record<number, number>;\n /** Fields with an in-flight engine write (disables their controls). */\n writing: Record<FieldKey, true>;\n /**\n * Widget geometry per page: annotObjectNumber → content-space box. Fed by\n * the shell from the WIDGET plane (one annotations read per page); value\n * writes never move widgets, so this survives snapshot refreshes and is\n * only cleared on structural form events.\n */\n geom: Record<number, Record<number, Box> | undefined>;\n /** Bumped on every change — cheap equality for memoized projections. */\n seq: number;\n}\n\nexport const initialModel = (): Model => ({\n snapshot: null,\n byKey: {},\n byWidget: {},\n writing: {},\n geom: {},\n seq: 0,\n});\n\nexport type Msg =\n | { t: 'snapshot'; snapshot: FormSnapshot }\n | { t: 'writeStart'; key: FieldKey }\n | { t: 'writeDone'; key: FieldKey; field: FormFieldDTO }\n | { t: 'writeFailed'; key: FieldKey }\n | { t: 'pageGeom'; pageObjectNumber: number; boxes: Record<number, Box> }\n | { t: 'clearGeom'; pageObjectNumber?: number };\n\nfunction index(snapshot: FormSnapshot): Pick<Model, 'byKey' | 'byWidget'> {\n const byKey: Record<FieldKey, number> = {};\n const byWidget: Record<number, number> = {};\n snapshot.fields.forEach((field, i) => {\n byKey[fieldKeyOf(field)] = i;\n for (const w of field.widgets) {\n if (w.annotObjectNumber > 0) byWidget[w.annotObjectNumber] = i;\n }\n });\n return { byKey, byWidget };\n}\n\nexport function update(model: Model, msg: Msg): Model {\n switch (msg.t) {\n case 'snapshot':\n return {\n ...model,\n snapshot: msg.snapshot,\n ...index(msg.snapshot),\n writing: {},\n seq: model.seq + 1,\n };\n case 'writeStart':\n return { ...model, writing: { ...model.writing, [msg.key]: true }, seq: model.seq + 1 };\n case 'writeDone': {\n if (!model.snapshot) return model;\n const i = model.byKey[msg.key];\n if (i === undefined) return model;\n const fields = model.snapshot.fields.slice();\n fields[i] = msg.field;\n const { [msg.key]: _done, ...writing } = model.writing;\n const snapshot = { ...model.snapshot, fields };\n return { ...model, snapshot, ...index(snapshot), writing, seq: model.seq + 1 };\n }\n case 'writeFailed': {\n const { [msg.key]: _failed, ...writing } = model.writing;\n return { ...model, writing, seq: model.seq + 1 };\n }\n case 'pageGeom':\n return {\n ...model,\n geom: { ...model.geom, [msg.pageObjectNumber]: msg.boxes },\n seq: model.seq + 1,\n };\n case 'clearGeom': {\n if (msg.pageObjectNumber === undefined) {\n return { ...model, geom: {}, seq: model.seq + 1 };\n }\n const geom = { ...model.geom };\n delete geom[msg.pageObjectNumber];\n return { ...model, geom, seq: model.seq + 1 };\n }\n }\n}\n\nexport const fieldByKey = (model: Model, key: FieldKey): FormFieldDTO | null => {\n const i = model.byKey[key];\n return i === undefined ? null : (model.snapshot?.fields[i] ?? null);\n};\n\nexport const fieldForWidget = (model: Model, annotObjectNumber: number): FormFieldDTO | null => {\n const i = model.byWidget[annotObjectNumber];\n return i === undefined ? null : (model.snapshot?.fields[i] ?? null);\n};\n","/**\n * The fill-mode projection: what a framework paints for one page. Pure data\n * in CONTENT space (top-left origin, y-down PDF points) — the same space\n * annotation RenderItems use, so layers position with the page transform\n * and never re-derive scale.\n *\n * Geometry comes from the WIDGET plane: the shell reads each page's\n * annotations once (widgets are annotations; their DTOs carry /Rect) and\n * feeds content-space boxes into the model via `pageGeom`. The field plane\n * (this snapshot) contributes identity, value, and behavior.\n */\nimport type { FormFieldDTO, FormFieldOption, FormSnapshot } from '@embedpdf/engine-core/runtime';\n\nimport { fieldForWidget, fieldKeyOf, type Box, type FieldKey, type Model } from './model';\n\nexport type { Box } from './model';\n\ninterface FillItemBase {\n key: FieldKey;\n /** Widget identity — joins to the annotation plane. */\n annotObjectNumber: number;\n box: Box;\n /** Read-only field or write in flight: render, don't accept input. */\n disabled: boolean;\n /** Accessible name: /TU when present, else the fully qualified name. */\n label: string;\n}\n\nexport type FillItem = FillItemBase &\n (\n | {\n control: 'text';\n value: string;\n multiline: boolean;\n password: boolean;\n maxLength: number | null;\n comb: boolean;\n }\n | { control: 'toggle'; kind: 'checkbox' | 'radio'; checked: boolean; onState: string }\n | {\n control: 'choice';\n kind: 'combo' | 'list';\n edit: boolean;\n multi: boolean;\n options: FormFieldOption[];\n selected: string[];\n }\n | { control: 'button' }\n );\n\nconst ZERO_BOX: Box = { x: 0, y: 0, width: 0, height: 0 };\n\n/**\n * Project ONE widget of a field into a fill control. `box` is supplied by the\n * caller: the page projection reads the model's widget geometry; a consumer\n * that already owns a live box (the annotation plane's RenderItem) passes it —\n * or nothing, when only the semantics matter. Null for families with no fill\n * control (signature/unknown: rendered by the annotation plane only).\n */\nexport function projectWidget(\n model: Model,\n field: FormFieldDTO,\n annotObjectNumber: number,\n box: Box = ZERO_BOX,\n): FillItem | null {\n const key = fieldKeyOf(field);\n const base: FillItemBase = {\n key,\n annotObjectNumber,\n box,\n disabled: field.flags.readOnly || model.writing[key] === true,\n label: field.alternateName ?? field.name,\n };\n switch (field.family) {\n case 'text':\n return {\n ...base,\n control: 'text',\n value: field.value,\n multiline: field.multiline,\n password: field.password,\n maxLength: field.maxLength,\n comb: field.comb,\n };\n case 'checkbox': {\n const toggle = field.widgets.find((w) => w.annotObjectNumber === annotObjectNumber);\n return {\n ...base,\n control: 'toggle',\n kind: 'checkbox',\n checked: field.checked,\n onState: toggle && 'onState' in toggle ? toggle.onState : 'Yes',\n };\n }\n case 'radio': {\n const toggle = field.widgets.find((w) => w.annotObjectNumber === annotObjectNumber);\n return {\n ...base,\n control: 'toggle',\n kind: 'radio',\n checked: toggle && 'checked' in toggle ? toggle.checked : false,\n onState: toggle && 'onState' in toggle ? toggle.onState : '',\n };\n }\n case 'combobox':\n return {\n ...base,\n control: 'choice',\n kind: 'combo',\n edit: field.edit,\n multi: false,\n options: field.options,\n selected: field.value === '' ? [] : [field.value],\n };\n case 'listbox':\n return {\n ...base,\n control: 'choice',\n kind: 'list',\n edit: false,\n multi: field.multiSelect,\n options: field.options,\n selected: field.selectedValues,\n };\n case 'pushbutton':\n return { ...base, control: 'button' };\n default:\n return null;\n }\n}\n\n/**\n * Project one page's widgets into fill controls. Widgets whose geometry has\n * not arrived yet (or that are direct objects with no join key) are skipped —\n * the shell re-runs the projection when `pageGeom` lands.\n */\nexport function fillItems(model: Model, pageObjectNumber: number): FillItem[] {\n const snapshot: FormSnapshot | null = model.snapshot;\n const geom = model.geom[pageObjectNumber];\n if (!snapshot || !geom) return [];\n const items: FillItem[] = [];\n\n for (const field of snapshot.fields) {\n for (const widget of field.widgets) {\n if (widget.pageObjectNumber !== pageObjectNumber) continue;\n const box = geom[widget.annotObjectNumber];\n if (!box) continue;\n const item = projectWidget(model, field, widget.annotObjectNumber, box);\n if (item) items.push(item);\n }\n }\n return items;\n}\n\n/**\n * Project a SINGLE widget by its annotation object number — the join the\n * annotation-plane render layer uses (it owns a live box already, so the\n * model's cached geometry is used only when it happens to be loaded; the\n * item's semantics never depend on it). Null while the snapshot hasn't\n * landed, or for families with no fill control.\n */\nexport function fillItemForWidget(model: Model, annotObjectNumber: number): FillItem | null {\n const field = fieldForWidget(model, annotObjectNumber);\n if (!field) return null;\n const widget = field.widgets.find((w) => w.annotObjectNumber === annotObjectNumber);\n if (!widget) return null;\n const box = model.geom[widget.pageObjectNumber]?.[annotObjectNumber];\n return projectWidget(model, field, annotObjectNumber, box);\n}\n","/** Small promise-tail queue: failures never poison later mutations. */\nexport function createSerialMutationQueue(): <T>(operation: () => Promise<T>) => Promise<T> {\n let tail: Promise<void> = Promise.resolve();\n return <T>(operation: () => Promise<T>): Promise<T> => {\n const result = tail.then(operation, operation);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n}\n","import type {\n DocumentHandle,\n FormEffect,\n FormEffectsResult,\n FormFieldDTO,\n FormFieldRef,\n FormFieldValue,\n FormSnapshot,\n PdfActionTree,\n} from '@embedpdf/engine-core/runtime';\nimport {\n DEFAULT_SCRIPT_BUDGET,\n javaScriptProgramFromActionTree,\n scriptFieldsFromSnapshot,\n type ScriptBudget,\n type ScriptDiagnostic,\n type ScriptExecutionError,\n type ScriptFieldInput,\n type ScriptIdentity,\n type ScriptInput,\n type ScriptOutput,\n type ScriptUiEffect,\n type ScriptValue,\n} from '@embedpdf/core-acrojs';\nimport type { ScriptSandbox, ScriptSandboxFactory } from '@embedpdf/core-js-sandbox';\nimport type { DocumentMeta } from '@embedpdf/core';\n\nimport type { FormCommitResult, FormScriptingOptions, FormUiEffect } from './types';\n\ninterface Overlay {\n original: ScriptFieldInput[];\n fields: ScriptFieldInput[];\n resetKeys: Set<string>;\n appearances: Map<string, { ref: FormFieldRef; text: string }>;\n}\n\nexport interface FormScriptingControllerOptions {\n doc: DocumentHandle;\n document(): DocumentMeta | null;\n config: FormScriptingOptions;\n sandboxFactory: ScriptSandboxFactory;\n}\n\nconst refKey = (ref: FormFieldRef): string =>\n ref.kind === 'objectNumber' ? `obj:${ref.fieldObjectNumber}` : `fqn:${ref.name}`;\n\nconst sameRef = (left: FormFieldRef, right: FormFieldRef): boolean =>\n refKey(left) === refKey(right);\n\nconst cloneValue = (value: ScriptValue): ScriptValue => (Array.isArray(value) ? [...value] : value);\n\nconst sameValue = (left: ScriptValue, right: ScriptValue): boolean =>\n Array.isArray(left) && Array.isArray(right)\n ? left.length === right.length && left.every((value, index) => value === right[index])\n : left === right;\n\nfunction cloneFields(fields: ScriptFieldInput[]): ScriptFieldInput[] {\n return fields.map((field) => ({\n ...field,\n ref: { ...field.ref },\n value: cloneValue(field.value),\n defaultValue: cloneValue(field.defaultValue),\n ...(field.options ? { options: field.options.map((option) => ({ ...option })) } : {}),\n }));\n}\n\nfunction fieldByRef<T extends { ref: FormFieldRef }>(\n fields: T[],\n ref: FormFieldRef,\n): T | undefined {\n return fields.find((field) => sameRef(field.ref, ref));\n}\n\nfunction snapshotField(snapshot: FormSnapshot, ref: FormFieldRef): FormFieldDTO | undefined {\n return snapshot.fields.find((field) => sameRef(field.ref, ref));\n}\n\nfunction scriptValueFromFormValue(field: ScriptFieldInput, value: FormFieldValue): ScriptValue {\n if (field.family === 'text' && value.type === 'text') return value.value;\n if ((field.family === 'checkbox' || field.family === 'radio') && value.type === 'toggle') {\n return value.state ?? 'Off';\n }\n if (field.family === 'combobox' && value.type === 'choice') return value.values[0] ?? '';\n if (field.family === 'listbox' && value.type === 'choice') return [...value.values];\n throw new Error(`Form value type '${value.type}' does not match field family '${field.family}'`);\n}\n\nfunction formValueFromScriptValue(field: ScriptFieldInput): FormFieldValue | null {\n switch (field.family) {\n case 'text':\n return { type: 'text', value: String(field.value ?? '') };\n case 'checkbox':\n case 'radio':\n return {\n type: 'toggle',\n state:\n field.value === null || field.value === undefined || String(field.value) === 'Off'\n ? null\n : String(field.value),\n };\n case 'combobox':\n return {\n type: 'choice',\n values: Array.isArray(field.value) ? field.value.slice(0, 1) : [String(field.value ?? '')],\n };\n case 'listbox':\n return {\n type: 'choice',\n values: Array.isArray(field.value) ? [...field.value] : [String(field.value ?? '')],\n };\n default:\n return null;\n }\n}\n\nfunction applyEffects(overlay: Overlay, effects: FormEffect[]): void {\n for (const effect of effects) {\n if (effect.kind === 'reset') {\n for (const ref of effect.refs) {\n const field = fieldByRef(overlay.fields, ref);\n if (!field) continue;\n field.value = cloneValue(field.defaultValue);\n overlay.resetKeys.add(refKey(ref));\n }\n continue;\n }\n\n const field = fieldByRef(overlay.fields, effect.ref);\n if (!field) continue;\n const key = refKey(effect.ref);\n if (effect.kind === 'setValue') {\n field.value = scriptValueFromFormValue(field, effect.value);\n overlay.resetKeys.delete(key);\n } else if (effect.kind === 'setDisplay') {\n field.display = effect.display;\n } else {\n overlay.appearances.set(key, { ref: effect.ref, text: effect.text });\n }\n }\n}\n\nfunction canonicalEffects(overlay: Overlay): FormEffect[] {\n const effects: FormEffect[] = [];\n const resets: FormFieldRef[] = [];\n for (const field of overlay.fields) {\n const original = fieldByRef(overlay.original, field.ref);\n if (!original) continue;\n if (!sameValue(original.value, field.value)) {\n const key = refKey(field.ref);\n if (overlay.resetKeys.has(key) && sameValue(field.value, field.defaultValue)) {\n resets.push(field.ref);\n } else {\n const value = formValueFromScriptValue(field);\n if (value) effects.push({ kind: 'setValue', ref: field.ref, value });\n }\n }\n if (original.display !== field.display) {\n effects.push({ kind: 'setDisplay', ref: field.ref, display: field.display });\n }\n }\n if (resets.length > 0) effects.unshift({ kind: 'reset', refs: resets });\n effects.push(\n ...Array.from(overlay.appearances.values(), ({ ref, text }) => ({\n kind: 'setAppearanceText' as const,\n ref,\n text,\n })),\n );\n return effects;\n}\n\nfunction scriptError(message: string): ScriptExecutionError {\n return { kind: 'invalid-output', message };\n}\n\nfunction utf8Length(value: string): number {\n let length = 0;\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code < 0x80) length += 1;\n else if (code < 0x800) length += 2;\n else if (code >= 0xd800 && code <= 0xdbff && index + 1 < value.length) {\n length += 4;\n index += 1;\n } else length += 3;\n }\n return length;\n}\n\nfunction seedFrom(documentId: string, sequence: number): number {\n let hash = 2166136261;\n for (const char of `${documentId}:${sequence}`) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction resolvedIdentity(doc: DocumentHandle, config: FormScriptingOptions): ScriptIdentity {\n const claims = doc.security.identity;\n const supplied =\n typeof config.identity === 'function' ? config.identity() : (config.identity ?? {});\n return {\n name: supplied.name ?? claims?.display_name ?? claims?.user_id ?? '',\n loginName: supplied.loginName ?? claims?.user_id ?? '',\n corporation: supplied.corporation ?? claims?.group_id ?? '',\n email: supplied.email ?? '',\n };\n}\n\nfunction pageNumberFor(meta: DocumentMeta | null, field: FormFieldDTO): number {\n const pon = field.widgets.find((widget) => widget.pageObjectNumber > 0)?.pageObjectNumber;\n if (!meta || pon === undefined) return 0;\n const index = meta.pages.findIndex((page) => page.pageObjectNumber === pon);\n return Math.max(0, index);\n}\n\nfunction statusFromEffects(result: FormEffectsResult): FormCommitResult['status'] {\n if (result.results.some(({ status }) => status === 'failed' || status === 'skipped')) {\n return 'failed';\n }\n if (result.results.some(({ status }) => status === 'rejected')) return 'failed';\n return result.results.some(({ status }) => status === 'applied') ? 'applied' : 'unchanged';\n}\n\nexport class FormScriptingController {\n private sandboxPromise: Promise<ScriptSandbox> | null = null;\n private booted = false;\n private disposed = false;\n private sequence = 0;\n\n constructor(private readonly options: FormScriptingControllerOptions) {}\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n void this.sandboxPromise?.then((sandbox) => sandbox.dispose()).catch(() => undefined);\n }\n\n async commit(\n snapshot: FormSnapshot,\n ref: FormFieldRef,\n proposed: FormFieldValue,\n ): Promise<FormCommitResult> {\n return this.transact(snapshot, ref, proposed);\n }\n\n /** Execute one originating widget's activation action (`/A`, including `/Next`). */\n async activate(\n snapshot: FormSnapshot,\n ref: FormFieldRef,\n action: PdfActionTree,\n ): Promise<FormCommitResult> {\n return this.transact(snapshot, ref, undefined, action);\n }\n\n /** Run lazy document boot plus the `/CO` chain without a user field change. */\n async recalculate(snapshot: FormSnapshot): Promise<FormCommitResult> {\n const target =\n snapshot.calculationOrder.find(\n (ref): ref is FormFieldRef => ref !== null && snapshotField(snapshot, ref) !== undefined,\n ) ?? snapshot.fields[0]?.ref;\n if (!target) {\n return {\n status: 'unchanged',\n scripted: true,\n effectsResult: null,\n uiEffects: [],\n diagnostics: [],\n };\n }\n return this.transact(snapshot, target);\n }\n\n private async transact(\n snapshot: FormSnapshot,\n ref: FormFieldRef,\n proposed?: FormFieldValue,\n activation?: PdfActionTree,\n ): Promise<FormCommitResult> {\n if (this.disposed) throw new Error('Form scripting controller is disposed');\n const target = snapshotField(snapshot, ref);\n if (!target) {\n return this.failed([], [], scriptError(`Form field '${refKey(ref)}' no longer exists`));\n }\n\n const original = scriptFieldsFromSnapshot(snapshot);\n const overlay: Overlay = {\n original,\n fields: cloneFields(original),\n resetKeys: new Set(),\n appearances: new Map(),\n };\n const targetInput = fieldByRef(overlay.fields, ref);\n if (!targetInput) {\n return this.failed([], [], scriptError(`Form field '${refKey(ref)}' has no script view`));\n }\n\n const hasProposedValue = proposed !== undefined;\n let proposedValue: ScriptValue = cloneValue(targetInput.value);\n if (proposed) {\n try {\n proposedValue = scriptValueFromFormValue(targetInput, proposed);\n } catch (error) {\n return this.failed(\n [],\n [],\n scriptError(error instanceof Error ? error.message : String(error)),\n );\n }\n }\n\n const uiEffects: FormUiEffect[] = [];\n const diagnostics: ScriptDiagnostic[] = [];\n const meta = this.options.document();\n const nowMs = this.options.config.now?.() ?? Date.now();\n const inputBase: Omit<ScriptInput, 'fields' | 'event'> = {\n document: {\n id: this.options.doc.id,\n fileName: this.options.config.fileName?.() ?? meta?.name ?? this.options.doc.id,\n pageCount: meta?.pageCount ?? 0,\n pageNumber: pageNumberFor(meta, target),\n },\n identity: resolvedIdentity(this.options.doc, this.options.config),\n environment: {\n nowMs,\n utcOffsetMinutes:\n this.options.config.utcOffsetMinutes?.() ?? -new Date(nowMs).getTimezoneOffset(),\n randomSeed:\n this.options.config.randomSeed?.() ?? seedFrom(this.options.doc.id, this.sequence++),\n },\n };\n const budget = this.options.config.budget ?? DEFAULT_SCRIPT_BUDGET;\n let executionMs = 0;\n let aggregateOutputSize = 0;\n\n const consume = (\n output: ScriptOutput,\n phase: FormUiEffect['phase'],\n ): ScriptExecutionError | null => {\n aggregateOutputSize += utf8Length(JSON.stringify(output));\n // Tag every UI request with WHO asked — embedders suppress boot-phase\n // nags (Adobe's version-check alert) but show user-phase validation.\n uiEffects.push(...output.uiEffects.map((effect) => ({ ...effect, phase })));\n diagnostics.push(...output.diagnostics);\n if (aggregateOutputSize > budget.maxOutputBytes) {\n return {\n kind: 'budget',\n message: `Form script transaction output exceeded ${budget.maxOutputBytes} bytes`,\n };\n }\n return output.error ?? null;\n };\n const remainingBudget = (): ScriptBudget | null => {\n const remaining = budget.maxExecutionMs - executionMs;\n return remaining <= 0 ? null : { ...budget, maxExecutionMs: remaining };\n };\n const run = async (\n kind: 'boot' | 'run',\n source: string[] | string,\n input: ScriptInput,\n ): Promise<{ output?: ScriptOutput; error?: ScriptExecutionError }> => {\n const remaining = remainingBudget();\n if (!remaining) {\n return { error: { kind: 'budget', message: 'Form script transaction timed out' } };\n }\n let output: ScriptOutput;\n try {\n const sandbox = await this.sandbox();\n const startedAt = Date.now();\n output =\n kind === 'boot'\n ? sandbox.boot(source as string[], input, remaining)\n : sandbox.run(source as string, input, remaining);\n executionMs += Date.now() - startedAt;\n } catch (error) {\n return {\n error: scriptError(error instanceof Error ? error.message : String(error)),\n };\n }\n const error = consume(output, kind === 'boot' ? 'boot' : 'user');\n return error ? { error } : { output };\n };\n\n if (!this.booted) {\n // Boot runs ONCE and can only ever degrade, never brick: document-open\n // scripts are Adobe version-check boilerplate and calculation seeds — a\n // failure there (an API we don't emulate, a broken script, a hostile\n // one) must NEVER disable interactive filling. On any boot problem we\n // surface a `script-error` diagnostic, DROP the partial boot state, and\n // continue this transaction with a clean overlay.\n this.booted = true;\n let sources: string[] = [];\n let bootError: ScriptExecutionError | null = null;\n try {\n const actions = this.options.doc.actions ? await this.options.doc.actions.read() : null;\n sources =\n actions?.nameTreeScripts.map(({ action }) => javaScriptProgramFromActionTree(action)) ??\n [];\n } catch (error) {\n bootError = scriptError(error instanceof Error ? error.message : String(error));\n }\n if (!bootError && sources.length > 0) {\n const boot = await run('boot', sources, {\n ...inputBase,\n fields: overlay.fields,\n event: { kind: 'name-tree-boot' },\n });\n if (boot.error) bootError = boot.error;\n else applyEffects(overlay, boot.output!.formEffects);\n }\n if (bootError) {\n // No overlay cleanup needed: effects only apply on SUCCESS, so a\n // failed boot never touched the overlay — the user's own commit\n // proceeds from pristine state.\n diagnostics.push({\n code: 'script-error',\n message: `Document boot script failed (continuing without it): ${bootError.message}`,\n });\n }\n }\n\n const bootEffects = canonicalEffects(overlay);\n\n if (activation) {\n let program: string;\n try {\n program = javaScriptProgramFromActionTree(activation);\n } catch (error) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError(error instanceof Error ? error.message : String(error)),\n );\n }\n if (program) {\n const activated = await run('run', program, {\n ...inputBase,\n fields: overlay.fields,\n event: {\n kind: 'widget-activate',\n target: ref,\n source: ref,\n value: targetInput.value,\n },\n });\n if (activated.error) return this.failed(uiEffects, diagnostics, activated.error);\n applyEffects(overlay, activated.output!.formEffects);\n }\n }\n\n if (!activation && hasProposedValue && target.actions?.keystroke && target.family === 'text') {\n let program: string;\n try {\n program = javaScriptProgramFromActionTree(target.actions.keystroke);\n } catch (error) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError(error instanceof Error ? error.message : String(error)),\n );\n }\n if (program) {\n const oldValue = String(targetInput.value ?? '');\n const key = await run('run', program, {\n ...inputBase,\n fields: overlay.fields,\n event: {\n kind: 'field-keystroke',\n target: ref,\n source: ref,\n value: oldValue,\n change: String(proposedValue ?? ''),\n selStart: 0,\n selEnd: oldValue.length,\n willCommit: true,\n },\n });\n if (key.error) return this.failed(uiEffects, diagnostics, key.error);\n if (!key.output!.event.rc) {\n return this.finishRejected(bootEffects, uiEffects, diagnostics);\n }\n applyEffects(overlay, key.output!.formEffects);\n const event = key.output!.event;\n const base = String(event.value ?? '');\n proposedValue =\n base.slice(0, event.selStart) +\n event.change +\n base.slice(Math.max(event.selStart, event.selEnd));\n }\n }\n\n if (!activation && hasProposedValue) {\n targetInput.value = cloneValue(proposedValue);\n overlay.resetKeys.delete(refKey(ref));\n }\n\n if (!activation && hasProposedValue && target.actions?.validate) {\n let program: string;\n try {\n program = javaScriptProgramFromActionTree(target.actions.validate);\n } catch (error) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError(error instanceof Error ? error.message : String(error)),\n );\n }\n if (program) {\n const validation = await run('run', program, {\n ...inputBase,\n fields: overlay.fields,\n event: {\n kind: 'field-validate',\n target: ref,\n source: ref,\n value: proposedValue,\n willCommit: true,\n },\n });\n if (validation.error) return this.failed(uiEffects, diagnostics, validation.error);\n if (!validation.output!.event.rc) {\n return this.finishRejected(bootEffects, uiEffects, diagnostics);\n }\n targetInput.value = cloneValue(validation.output!.event.value);\n applyEffects(overlay, validation.output!.formEffects);\n }\n }\n\n const formatRefs: FormFieldRef[] = !activation && hasProposedValue ? [ref] : [];\n for (const calculationRef of activation ? [] : snapshot.calculationOrder) {\n if (!calculationRef) continue;\n const calculated = snapshotField(snapshot, calculationRef);\n const tree = calculated?.actions?.calculate;\n if (!calculated || !tree) continue;\n let program: string;\n try {\n program = javaScriptProgramFromActionTree(tree);\n } catch (error) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError(error instanceof Error ? error.message : String(error)),\n );\n }\n const calculatedInput = fieldByRef(overlay.fields, calculationRef);\n if (program && calculatedInput) {\n const calculation = await run('run', program, {\n ...inputBase,\n fields: overlay.fields,\n event: {\n kind: 'field-calculate',\n target: calculationRef,\n ...(hasProposedValue ? { source: ref } : {}),\n value: calculatedInput.value,\n },\n });\n if (calculation.error) return this.failed(uiEffects, diagnostics, calculation.error);\n applyEffects(overlay, calculation.output!.formEffects);\n }\n if (!formatRefs.some((candidate) => sameRef(candidate, calculationRef))) {\n formatRefs.push(calculationRef);\n }\n }\n\n for (const formatRef of formatRefs) {\n const field = snapshotField(snapshot, formatRef);\n const tree = field?.actions?.format;\n const overlayField = fieldByRef(overlay.fields, formatRef);\n if (!field || !tree || !overlayField) continue;\n let program: string;\n try {\n program = javaScriptProgramFromActionTree(tree);\n } catch (error) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError(error instanceof Error ? error.message : String(error)),\n );\n }\n if (!program) continue;\n const format = await run('run', program, {\n ...inputBase,\n fields: overlay.fields,\n event: {\n kind: 'field-format',\n target: formatRef,\n ...(hasProposedValue ? { source: ref } : {}),\n value: overlayField.value,\n },\n });\n if (format.error) return this.failed(uiEffects, diagnostics, format.error);\n applyEffects(overlay, format.output!.formEffects);\n }\n\n const effects = canonicalEffects(overlay);\n if (effects.length + uiEffects.length > budget.maxEffects) {\n return this.failed(uiEffects, diagnostics, {\n kind: 'budget',\n message: `Form script transaction exceeded ${budget.maxEffects} effects`,\n });\n }\n if (effects.length === 0) {\n return { status: 'unchanged', scripted: true, effectsResult: null, uiEffects, diagnostics };\n }\n if (!this.options.doc.forms.applyEffects) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError('This engine does not support batched form effects'),\n );\n }\n\n const effectsResult = await this.options.doc.forms.applyEffects(effects);\n const status = statusFromEffects(effectsResult);\n return {\n status,\n scripted: true,\n effectsResult,\n uiEffects,\n diagnostics,\n ...(status === 'failed'\n ? { error: scriptError('One or more native form effects failed') }\n : {}),\n };\n }\n\n private async sandbox(): Promise<ScriptSandbox> {\n this.sandboxPromise ??= this.options.sandboxFactory().then((sandbox) => {\n if (this.disposed) sandbox.dispose();\n return sandbox;\n });\n return this.sandboxPromise;\n }\n\n private failed(\n uiEffects: FormUiEffect[],\n diagnostics: ScriptDiagnostic[],\n error: ScriptExecutionError,\n ): FormCommitResult {\n return {\n status: 'failed',\n scripted: true,\n effectsResult: null,\n uiEffects,\n diagnostics,\n error,\n };\n }\n\n private async finishRejected(\n bootEffects: FormEffect[],\n uiEffects: FormUiEffect[],\n diagnostics: ScriptDiagnostic[],\n ): Promise<FormCommitResult> {\n if (bootEffects.length === 0) {\n return {\n status: 'rejected',\n scripted: true,\n effectsResult: null,\n uiEffects,\n diagnostics,\n };\n }\n if (!this.options.doc.forms.applyEffects) {\n return this.failed(\n uiEffects,\n diagnostics,\n scriptError('Batched form effects are unavailable'),\n );\n }\n const effectsResult = await this.options.doc.forms.applyEffects(bootEffects);\n if (statusFromEffects(effectsResult) === 'failed') {\n return this.failed(uiEffects, diagnostics, scriptError('A name-tree boot effect failed'));\n }\n return {\n status: 'rejected',\n scripted: true,\n effectsResult,\n uiEffects,\n diagnostics,\n };\n }\n}\n\nexport function createFormScriptingController(\n options: FormScriptingControllerOptions,\n): FormScriptingController {\n return new FormScriptingController(options);\n}\n","import type {\n AnnotationRef,\n FormDataFormat,\n FormFieldDraft,\n FormFieldPatch,\n FormFieldRef,\n FormFieldValue,\n PdfRect,\n} from '@embedpdf/engine-core/runtime';\nimport type { PluginContext } from '@embedpdf/core';\nimport { AnnotationToken as AnnotationHostToken } from '@embedpdf/plugin-annotation/internal';\n\nimport {\n fillItemForWidget as coreFillItemForWidget,\n fillItems as coreFillItems,\n type FillItem,\n} from './core/fill-items';\nimport {\n fieldByKey,\n fieldForWidget as coreFieldForWidget,\n update,\n type Box,\n type FieldKey,\n type Model,\n type Msg,\n} from './core/model';\nimport { createSerialMutationQueue } from './mutationQueue';\nimport { createFormScriptingController } from './scripting';\nimport type {\n FormAction,\n FormCapability,\n FormCommitResult,\n FormPluginOptions,\n FormState,\n FormUiEffectProvider,\n PlacedField,\n PlaceFieldInput,\n} from './types';\n\n/** PDF user-space rect (y-up) → content-space box (y-down, crop-relative). */\nconst toBox = (rect: PdfRect, crop: PdfRect): Box => ({\n x: rect.left - crop.left,\n y: crop.top - rect.top,\n width: rect.right - rect.left,\n height: rect.top - rect.bottom,\n});\n\nconst sameAnnotationRef = (left: AnnotationRef, right: AnnotationRef): boolean => {\n if (left.kind !== right.kind || left.pageObjectNumber !== right.pageObjectNumber) return false;\n if (left.kind === 'objectNumber' && right.kind === 'objectNumber') {\n return left.annotObjectNumber === right.annotObjectNumber;\n }\n if (left.kind === 'nm' && right.kind === 'nm') return left.nm === right.nm;\n return (\n left.kind === 'index' &&\n right.kind === 'index' &&\n left.index === right.index &&\n left.revision === right.revision\n );\n};\n\n/**\n * The form shell. Pure `update` runs here; the resulting model is dispatched\n * to the store; engine calls happen around it. Every read the frameworks do\n * goes through memoized projections keyed on `model.seq`.\n */\nexport function createFormCapability(\n ctx: PluginContext<FormState, FormAction>,\n options: FormPluginOptions = {},\n): FormCapability {\n const model = (): Model => ctx.getState().model;\n const apply = (msg: Msg): void => {\n ctx.dispatch({ type: 'SET_MODEL', model: update(model(), msg) });\n };\n\n const refKeyOf = (key: FieldKey): FormFieldRef => {\n if (key.startsWith('obj:')) {\n return { kind: 'objectNumber', fieldObjectNumber: Number(key.slice(4)) };\n }\n return { kind: 'fqn', name: key.slice(4) };\n };\n const enqueueMutation = createSerialMutationQueue();\n\n const scripting =\n options.scripting?.enabled && ctx.doc\n ? createFormScriptingController({\n doc: ctx.doc,\n document: () => ctx.document(),\n config: options.scripting,\n sandboxFactory:\n options.scripting.sandboxFactory ??\n (() =>\n import('@embedpdf/core-js-sandbox').then(({ createQuickJsSandbox }) =>\n createQuickJsSandbox(),\n )),\n })\n : null;\n if (scripting) ctx.cleanup(() => scripting.dispose());\n\n let uiEffectProvider: FormUiEffectProvider | null = null;\n\n const surfaceScriptingResult = (result: FormCommitResult): void => {\n const observe = (callback: (() => void) | undefined): void => {\n if (!callback) return;\n try {\n callback();\n } catch (error) {\n globalThis.console?.error('[form] scripting observer failed:', error);\n }\n };\n for (const effect of result.uiEffects) {\n observe(\n options.scripting?.onUiEffect ? () => options.scripting!.onUiEffect!(effect) : undefined,\n );\n observe(uiEffectProvider ? () => uiEffectProvider!(effect) : undefined);\n }\n for (const diagnostic of result.diagnostics) {\n observe(\n options.scripting?.onDiagnostic\n ? () => options.scripting!.onDiagnostic!(diagnostic)\n : undefined,\n );\n }\n if (result.error) {\n observe(\n options.scripting?.onError ? () => options.scripting!.onError!(result.error!) : undefined,\n );\n }\n };\n\n // ── snapshot loading ────────────────────────────────────────────────────\n let refreshPromise: Promise<void> | null = null;\n const refresh = async (force = false): Promise<void> => {\n const doc = ctx.doc;\n if (!doc) return;\n if (refreshPromise) {\n await refreshPromise;\n if (!force) return;\n }\n refreshPromise = doc.forms\n .list()\n .then((snapshot) => apply({ t: 'snapshot', snapshot }))\n .finally(() => {\n refreshPromise = null;\n });\n return refreshPromise;\n };\n\n // ── widget geometry (from the WIDGET plane: one annotations read/page) ──\n const geomLoading = new Set<number>();\n const ensureGeom = (pon: number): void => {\n const doc = ctx.doc;\n if (!doc || geomLoading.has(pon) || model().geom[pon]) return;\n const crop = ctx.document()?.pages.find((p) => p.pageObjectNumber === pon)?.boxes.crop;\n if (!crop) return;\n geomLoading.add(pon);\n void doc\n .page(pon)\n .annotations.list()\n .then(({ annotations }) => {\n const boxes: Record<number, Box> = {};\n for (const dto of annotations) {\n if (dto.subtype !== 'widget') continue;\n const objectNumber = dto.ref.kind === 'objectNumber' ? dto.ref.annotObjectNumber : 0;\n if (objectNumber > 0) boxes[objectNumber] = toBox(dto.rect, crop);\n }\n apply({ t: 'pageGeom', pageObjectNumber: pon, boxes });\n })\n .finally(() => {\n geomLoading.delete(pon);\n });\n };\n\n // ── memoized fill projection ────────────────────────────────────────────\n const fillCache = new Map<number, { seq: number; items: FillItem[] }>();\n const fillItems = (pon: number): FillItem[] => {\n const m = model();\n const hit = fillCache.get(pon);\n if (hit && hit.seq === m.seq) return hit.items;\n const items = coreFillItems(m, pon);\n fillCache.set(pon, { seq: m.seq, items });\n return items;\n };\n\n // Single-widget projection — reference-stable per model.seq so framework\n // selectors can use plain identity equality.\n const fillItemCache = new Map<number, { seq: number; item: FillItem | null }>();\n const fillItem = (annotObjectNumber: number): FillItem | null => {\n const m = model();\n const hit = fillItemCache.get(annotObjectNumber);\n if (hit && hit.seq === m.seq) return hit.item;\n const item = coreFillItemForWidget(m, annotObjectNumber);\n fillItemCache.set(annotObjectNumber, { seq: m.seq, item });\n return item;\n };\n\n // ── typed writes: writeStart → engine → writeDone/writeFailed ──────────\n const commitValueNow = async (\n ref: FormFieldRef,\n value: FormFieldValue,\n ): Promise<FormCommitResult> => {\n const doc = ctx.doc;\n if (!doc) throw new Error('no document');\n if (scripting) {\n const result = await scripting.commit(await doc.forms.list(), ref, value);\n surfaceScriptingResult(result);\n // A native partial/failed effects result can still have mutated state.\n if (result.effectsResult !== null) await refresh(true);\n return result;\n }\n\n const result = await doc.forms.setValue(ref, value);\n await refresh(true);\n return {\n status: result.changedWidgets.length > 0 ? 'applied' : 'unchanged',\n scripted: false,\n effectsResult: null,\n uiEffects: [],\n diagnostics: [],\n };\n };\n\n const write = (key: FieldKey, value: FormFieldValue): Promise<void> =>\n enqueueMutation(async () => {\n const doc = ctx.doc;\n if (!doc) return;\n apply({ t: 'writeStart', key });\n try {\n const result = await commitValueNow(refKeyOf(key), value);\n if (result.status === 'rejected' || result.status === 'failed') {\n apply({ t: 'writeFailed', key });\n } else if (result.effectsResult === null && result.scripted) {\n // A scripted no-op has no engine read-back to clear the spinner.\n apply({ t: 'writeFailed', key });\n }\n } catch (err) {\n apply({ t: 'writeFailed', key });\n throw err;\n }\n });\n\n const can = (cap: 'doc.forms.fill' | 'doc.forms.modify'): boolean =>\n ctx.doc?.security.allows(cap) ?? false;\n\n // ── design mode ──────────────────────────────────────────────────────────\n // The annotation plane must re-read pages whose widget population changed\n // underneath it (created/deleted widgets); optional — fill-only setups\n // simply have no annotation plugin to nudge.\n const annotationHost = ctx.tryGet(AnnotationHostToken);\n\n const annotationActivation = async (ref: AnnotationRef) => {\n const doc = ctx.doc;\n if (!doc) return null;\n const loaded = annotationHost?.get(ref);\n if (loaded?.subtype === 'widget') return loaded.actions?.activate ?? null;\n const { annotations } = await doc.page(ref.pageObjectNumber).annotations.list();\n const annotation = annotations.find((candidate) => sameAnnotationRef(candidate.ref, ref));\n return annotation?.subtype === 'widget' ? (annotation.actions?.activate ?? null) : null;\n };\n\n const activateWidgetNow = async (\n key: FieldKey,\n annotationRef: AnnotationRef,\n ): Promise<FormCommitResult> => {\n const doc = ctx.doc;\n if (!doc) throw new Error('no document');\n if (!scripting) {\n return {\n status: 'unchanged',\n scripted: false,\n effectsResult: null,\n uiEffects: [],\n diagnostics: [],\n };\n }\n const action = await annotationActivation(annotationRef);\n if (!action) {\n return {\n status: 'unchanged',\n scripted: true,\n effectsResult: null,\n uiEffects: [],\n diagnostics: [],\n };\n }\n const result = await scripting.activate(await doc.forms.list(), refKeyOf(key), action);\n surfaceScriptingResult(result);\n if (result.effectsResult !== null) await refresh(true);\n return result;\n };\n\n const nudgeAnnotations = (pons: Iterable<number>): void => {\n if (!annotationHost) return;\n for (const pon of new Set(pons)) void annotationHost.reloadPage(pon);\n };\n\n /** Content-space box → PDF rect (inverse of `toBox`). */\n const toPdfRect = (\n box: { x: number; y: number; width: number; height: number },\n crop: PdfRect,\n ): PdfRect => ({\n left: box.x + crop.left,\n top: crop.top - box.y,\n right: box.x + crop.left + box.width,\n bottom: crop.top - box.y - box.height,\n });\n\n /** The page's content box (`{0,0,w,h}`), for page-bound placement math. */\n const pageBox = (pon: number): Box | null => {\n const crop = ctx.document()?.pages.find((p) => p.pageObjectNumber === pon)?.boxes.crop;\n return crop\n ? { x: 0, y: 0, width: crop.right - crop.left, height: crop.top - crop.bottom }\n : null;\n };\n\n /** Deterministic, collision-free auto-name: `text_1`, `text_2`, … counted\n * against the CURRENT snapshot (rename in the field panel). */\n const autoName = (family: string): string => {\n const names = new Set((model().snapshot?.fields ?? []).map((f) => f.name));\n let n = 1;\n while (names.has(`${family}_${n}`)) n++;\n return `${family}_${n}`;\n };\n\n const placeFieldNow = async (input: PlaceFieldInput): Promise<PlacedField> => {\n const doc = ctx.doc;\n const pon = input.pageObjectNumber;\n const crop = ctx.document()?.pages.find((p) => p.pageObjectNumber === pon)?.boxes.crop;\n if (!doc || !crop) throw new Error('[form] placeField: document/page not ready');\n // Placement is page-bound: intersect a (possibly overshooting) drag box\n // with the page. Sizing policy is the CALLER's job (the place handler's\n // click policy / drag rect) — a degenerate result is a caller bug.\n const page = pageBox(pon)!;\n const x = Math.max(page.x, Math.min(input.box.x, page.width));\n const y = Math.max(page.y, Math.min(input.box.y, page.height));\n const box: Box = {\n x,\n y,\n width: Math.max(0, Math.min(input.box.x + input.box.width, page.width) - x),\n height: Math.max(0, Math.min(input.box.y + input.box.height, page.height) - y),\n };\n if (box.width < 1 || box.height < 1) {\n throw new Error('[form] placeField: degenerate box (size the box before placing)');\n }\n const { family, appearance } = input;\n const name = autoName(family);\n const placement = {\n pageObjectNumber: pon,\n rect: toPdfRect(box, crop),\n ...(appearance ? { appearance } : {}),\n };\n const draft: FormFieldDraft =\n family === 'radio'\n ? { family, name, widgets: [{ ...placement, onState: 'option1' }] }\n : family === 'combobox' || family === 'listbox'\n ? {\n family,\n name,\n widget: placement,\n options: [\n { label: 'Option 1', value: 'Option 1' },\n { label: 'Option 2', value: 'Option 2' },\n ],\n }\n : { family, name, widget: placement };\n const result = await doc.forms.createField(draft);\n await refresh(true);\n apply({ t: 'clearGeom', pageObjectNumber: pon });\n // AWAIT the annotation-plane reload so the returned widget ref is already\n // selectable — the caller's auto-select needs the model to know it.\n if (annotationHost) await annotationHost.reloadPage(pon);\n const widget = result.field.widgets.find((w) => w.pageObjectNumber === pon) ?? null;\n return { field: result.field, widget };\n };\n\n const updateFieldNow = async (key: FieldKey, patch: FormFieldPatch): Promise<void> => {\n const doc = ctx.doc;\n if (!doc) return;\n await doc.forms.updateField(refKeyOf(key), patch);\n await refresh(true);\n };\n\n const deleteFieldNow = async (key: FieldKey): Promise<void> => {\n const doc = ctx.doc;\n if (!doc) return;\n const field = fieldByKey(model(), key);\n const pons = field?.widgets.map((w) => w.pageObjectNumber).filter((p) => p > 0) ?? [];\n await doc.forms.deleteField(refKeyOf(key));\n await refresh(true);\n for (const pon of new Set(pons)) apply({ t: 'clearGeom', pageObjectNumber: pon });\n nudgeAnnotations(pons);\n };\n\n const detachWidgetNow = async (key: FieldKey, annotObjectNumber: number): Promise<void> => {\n const doc = ctx.doc;\n if (!doc) return;\n const field = fieldByKey(model(), key);\n const widget = field?.widgets.find((w) => w.annotObjectNumber === annotObjectNumber);\n await doc.forms.detachWidget(refKeyOf(key), {\n annotObjectNumber,\n pageObjectNumber: widget?.pageObjectNumber ?? 0,\n });\n await refresh(true);\n if (widget && widget.pageObjectNumber > 0) {\n apply({ t: 'clearGeom', pageObjectNumber: widget.pageObjectNumber });\n nudgeAnnotations([widget.pageObjectNumber]);\n }\n };\n\n void refresh();\n\n return {\n snapshot: () => model().snapshot,\n refresh,\n fillItems,\n fillItem,\n ensureGeom,\n field: (key) => fieldByKey(model(), key),\n fieldForWidget: (annotObjectNumber) => coreFieldForWidget(model(), annotObjectNumber),\n setText: (key, value) => write(key, { type: 'text', value }),\n toggle: (key, onState) => write(key, { type: 'toggle', state: onState }),\n choose: (key, values) => write(key, { type: 'choice', values }),\n reset: (key) =>\n enqueueMutation(async () => {\n const doc = ctx.doc;\n if (!doc) return;\n apply({ t: 'writeStart', key });\n try {\n const result = await doc.forms.reset(refKeyOf(key));\n apply({ t: 'writeDone', key, field: result.field });\n } catch (err) {\n apply({ t: 'writeFailed', key });\n throw err;\n }\n }),\n commitValue: (ref, value) => enqueueMutation(() => commitValueNow(ref, value)),\n activateWidget: (key, annotationRef) =>\n enqueueMutation(() => activateWidgetNow(key, annotationRef)),\n setUiEffectProvider: (provider) => {\n uiEffectProvider = provider;\n },\n setValue: (ref, value) =>\n enqueueMutation(async () => {\n const doc = ctx.doc;\n if (!doc) throw new Error('no document');\n const result = await doc.forms.setValue(ref, value);\n await refresh(true);\n return result;\n }),\n exportData: async (format: FormDataFormat = 'xfdf') => {\n const doc = ctx.doc;\n if (!doc) throw new Error('no document');\n return doc.forms.exportData(format);\n },\n importData: (data, format) =>\n enqueueMutation(async () => {\n const doc = ctx.doc;\n if (!doc) throw new Error('no document');\n const result = await doc.forms.importData(data, format);\n apply({ t: 'snapshot', snapshot: result.snapshot });\n return result;\n }),\n repair: (repairOptions) =>\n enqueueMutation(async () => {\n const doc = ctx.doc;\n if (!doc) throw new Error('no document');\n const result = await doc.forms.repair(repairOptions);\n await refresh(true);\n return result;\n }),\n placeField: (input) => enqueueMutation(() => placeFieldNow(input)),\n pageBox,\n updateField: (key, patch) => enqueueMutation(() => updateFieldNow(key, patch)),\n deleteField: (key) => enqueueMutation(() => deleteFieldNow(key)),\n detachWidget: (key, annotObjectNumber) =>\n enqueueMutation(() => detachWidgetNow(key, annotObjectNumber)),\n canFill: () => can('doc.forms.fill'),\n canModify: () => can('doc.forms.modify'),\n };\n}\n","/**\n * Makes the form REACTIVE beyond this session's own writes — the same\n * pattern the metadata and annotation plugins use.\n *\n * Own value writes flow through the capability (writeDone patches one\n * field). This effect folds in everything else: remote collaborators'\n * `form.*` events (SSE on cloud), and structural events that can move or\n * add widgets (field created/deleted, repair) — those also invalidate the\n * cached widget geometry, because the widget PLANE changed.\n */\nimport type { DocumentEvent, EffectContext } from '@embedpdf/core';\n\nimport { update } from './core/model';\nimport type { FormAction, FormState } from './types';\n\nconst STRUCTURAL = new Set<DocumentEvent['type']>([\n 'form.fieldCreated',\n 'form.fieldUpdated',\n 'form.fieldDeleted',\n 'form.widgetAttached',\n 'form.widgetDetached',\n 'form.repaired',\n]);\n\nexport function registerFormEffects(ctx: EffectContext<FormState, FormAction>): void {\n const doc = ctx.doc;\n if (!doc) return;\n\n let refreshing = false;\n const refresh = async (): Promise<void> => {\n if (refreshing) return;\n refreshing = true;\n try {\n const snapshot = await doc.forms.list();\n ctx.dispatch({\n type: 'SET_MODEL',\n model: update(ctx.getState().model, { t: 'snapshot', snapshot }),\n });\n } finally {\n refreshing = false;\n }\n };\n\n const unsubscribe = doc.events.subscribe((event) => {\n if (!event.type.startsWith('form.')) return;\n const structural = STRUCTURAL.has(event.type);\n // Own non-structural writes already landed via the capability.\n if (event.origin.kind !== 'remote' && !structural) return;\n if (structural) {\n ctx.dispatch({\n type: 'SET_MODEL',\n model: update(ctx.getState().model, { t: 'clearGeom' }),\n });\n }\n void refresh();\n });\n ctx.cleanup(unsubscribe);\n}\n","/**\n * THE form-tool table — the single source of truth for the palette. Every\n * derivation reads this one list: interaction registration (annotation-less),\n * annotation tool/style registration (full viewer), active-tool → field\n * family lookup, click placement, and default appearance.\n *\n * \"One tool system, two commit planes\": the tools live in the ANNOTATION\n * registry when that plugin is present (defaults, style panel, click-create —\n * the shared authoring infrastructure), but the COMMIT always goes\n * through `doc.forms.createField` via the form place handler. The tags make\n * that structural: these tools enable `form-place`, never `annotation-draw`,\n * so the annotation draw handler can't wake up for them.\n */\nimport type { FormFieldFamily } from '@embedpdf/engine-core/runtime';\nimport type { AnnotationPropsPatch, ClickCreate } from '@embedpdf/plugin-annotation';\n\n/** The families the palette can author (no pushbutton/signature tools). */\nexport type AuthorableFormFamily = Exclude<FormFieldFamily, 'pushbutton' | 'signature' | 'unknown'>;\n\nexport interface FormToolDef {\n id: string;\n /** The field family `placeField` commits (the FORM plane's vocabulary). */\n family: AuthorableFormFamily;\n /** The client kind the ANNOTATION registry routes on (props panel).\n * Not a PDF subtype — every widget is PDF `widget`; this is the view. */\n visualKind: 'widget-text' | 'widget-choice' | 'widget-toggle';\n /** What a bare click places (box policies only — fields are boxes). */\n clickCreate: Extract<ClickCreate, { width: number }>;\n /** Seed drawing defaults: a placed field is VISIBLE (white box, gray\n * border) and restylable per tool through the shared style panel. */\n defaults: AnnotationPropsPatch;\n cursor: string;\n}\n\n/** Palette tools keep widgets editable right after placement. */\nexport const PLACE_TAGS = ['form-place', 'annotation-edit'] as const;\n\nconst FIELD_CHROME: AnnotationPropsPatch = {\n interiorColor: '#ffffff',\n color: '#6b7280',\n strokeWidth: 1,\n};\n\nexport const FORM_TOOLS: readonly FormToolDef[] = [\n {\n id: 'form-text',\n family: 'text',\n visualKind: 'widget-text',\n clickCreate: { width: 160, height: 24 },\n defaults: { ...FIELD_CHROME, fontSize: 12 },\n cursor: 'crosshair',\n },\n {\n id: 'form-checkbox',\n family: 'checkbox',\n visualKind: 'widget-toggle',\n clickCreate: { width: 18, height: 18 },\n defaults: FIELD_CHROME,\n cursor: 'crosshair',\n },\n {\n id: 'form-radio',\n family: 'radio',\n visualKind: 'widget-toggle',\n clickCreate: { width: 18, height: 18 },\n defaults: FIELD_CHROME,\n cursor: 'crosshair',\n },\n {\n id: 'form-combobox',\n family: 'combobox',\n visualKind: 'widget-choice',\n clickCreate: { width: 140, height: 24 },\n defaults: { ...FIELD_CHROME, fontSize: 12 },\n cursor: 'crosshair',\n },\n {\n id: 'form-listbox',\n family: 'listbox',\n visualKind: 'widget-choice',\n clickCreate: { width: 140, height: 72 },\n defaults: { ...FIELD_CHROME, fontSize: 12 },\n cursor: 'crosshair',\n },\n];\n\nexport const FORM_TOOL_BY_ID: ReadonlyMap<string, FormToolDef> = new Map(\n FORM_TOOLS.map((t) => [t.id, t]),\n);\n","import {\n MIN_DRAG,\n resolveClickPlacement,\n widgetAppearanceFromProps,\n} from '@embedpdf/plugin-annotation';\nimport type { AnnotationHostCapability } from '@embedpdf/plugin-annotation/internal';\nimport {\n samplePointOn,\n type InteractionCapability,\n type InteractionHandler,\n} from '@embedpdf/plugin-interaction';\n\nimport type { Box } from './core/model';\nimport { FORM_TOOL_BY_ID } from './tools';\nimport type { FormCapability } from './types';\n\ntype Vec = { x: number; y: number };\n\nconst rectFrom = (a: Vec, b: Vec): Box => ({\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n width: Math.abs(b.x - a.x),\n height: Math.abs(b.y - a.y),\n});\n\n/**\n * Draw-to-place: drag a box (live placement preview through the annotation\n * plane's ghost pipeline) or just click (the tool's `clickCreate` policy,\n * resolved by the SAME `resolveClickPlacement` the annotation core uses) —\n * the commit creates field + widget through `doc.forms.placeField`, styled\n * from the tool's live defaults. The tool stays active for repeat placement\n * (v2 rubber-stamp feel) and the fresh widget is auto-selected.\n *\n * Gesture rules match the annotation handlers: page-anchored via the sample\n * projection (the box keeps sizing along the edge when the cursor overshoots\n * or crosses a gap), the UP sample is the final point, and a CLICK means\n * width AND height under the shared threshold — a thin 100×2 drag is a drag.\n */\nexport function createPlaceHandler(\n form: FormCapability,\n interaction: InteractionCapability,\n annotation: AnnotationHostCapability | null,\n): InteractionHandler {\n let origin: { pon: number; start: Vec; last: Vec } | null = null;\n return {\n id: 'form-place',\n // Above the annotation edit handler (100): while a palette tool is\n // active, a drag on empty page means \"place a field\", not \"marquee\".\n priority: 95,\n enabledFor: (t) => t.enables.has('form-place'),\n onDown: (s) => {\n // No capture without a page, a known palette tool, or write permission —\n // declining lets edit/pan/text-selection act on the gesture instead.\n if (!s.page || !FORM_TOOL_BY_ID.has(interaction.activeToolId())) return false;\n if (!form.canModify()) return false;\n origin = { pon: s.page.pon, start: s.page.point, last: s.page.point };\n return true;\n },\n onMove: (s) => {\n if (!origin) return;\n const point = samplePointOn(s, origin.pon);\n if (!point) return;\n origin.last = point;\n const box = rectFrom(origin.start, point);\n // Live preview once the gesture reads as a drag — the WYSIWYG white box\n // (tool defaults) through the annotation ghost pipeline. Never dispatch\n // into the annotation store directly; this is its typed seam.\n if (annotation) {\n if (Math.max(box.width, box.height) >= MIN_DRAG) {\n annotation.setPlacementPreview(interaction.activeToolId(), origin.pon, box);\n } else {\n annotation.clearPlacementPreview();\n }\n }\n },\n onUp: (s) => {\n if (!origin) return;\n const o = origin;\n origin = null;\n annotation?.clearPlacementPreview();\n const toolId = interaction.activeToolId();\n const tool = FORM_TOOL_BY_ID.get(toolId);\n if (!tool) return;\n // The UP sample is the final point (projection first, like every\n // page-anchored gesture); a release over the gap falls back to the\n // last resolved point.\n const end = samplePointOn(s, o.pon) ?? o.last;\n const dragged = rectFrom(o.start, end);\n const isClick = dragged.width < MIN_DRAG && dragged.height < MIN_DRAG;\n const pageBox = form.pageBox(o.pon);\n const box = isClick ? boxOfClick(o.start, tool.clickCreate, pageBox) : dragged; // placeField clamps a drag to the page\n form\n .placeField({\n family: tool.family,\n pageObjectNumber: o.pon,\n box,\n // Style from the tool's LIVE defaults when the annotation plane is\n // here to hold them (the user restyled the tool in the panel);\n // annotation-less placement uses the table's static seed — a field\n // is never invisible. One conversion, the exported boundary util.\n appearance: widgetAppearanceFromProps(\n annotation ? annotation.currentDefaults(toolId) : tool.defaults,\n ),\n })\n .then((placed) => {\n // Auto-select the fresh widget — placeField resolves AFTER the\n // annotation page reload, so the ref is selectable. Skip when the\n // world moved on (tool changed) while the engine write ran.\n if (!annotation || interaction.activeToolId() !== toolId) return;\n const widget = placed.widget;\n if (!widget || widget.annotObjectNumber <= 0) return;\n annotation.select({\n kind: 'objectNumber',\n annotObjectNumber: widget.annotObjectNumber,\n pageObjectNumber: o.pon,\n });\n })\n .catch((err) => {\n globalThis.console?.error('[form] placeField failed:', err);\n });\n },\n };\n}\n\n/** The click-create box through the SHARED placement layer (fields are boxes;\n * the policy anchor + page clamp are exactly the annotation click's). */\nfunction boxOfClick(\n point: Vec,\n policy: { width: number; height: number; anchor?: 'center' | 'top-left' },\n pageBox: Box | null,\n): Box {\n const placement = resolveClickPlacement(point, policy, { pageBox: pageBox ?? undefined });\n return placement.kind === 'box'\n ? placement.rect\n : { x: point.x, y: point.y, width: policy.width, height: policy.height };\n}\n","import { initialModel } from './core/model';\nimport type { FormAction, FormState } from './types';\n\nexport const initialFormState = (): FormState => ({ model: initialModel() });\n\n/** Dumb store: the pure core computes the next model; the shell dispatches it. */\nexport const formReducer = (state: FormState, action: FormAction): FormState =>\n action.type === 'SET_MODEL' ? { model: action.model } : state;\n","import type {\n AnnotationRef,\n FormDataExport,\n FormDataFormat,\n FormFieldDTO,\n FormFieldFamily,\n FormFieldPatch,\n FormFieldRef,\n FormFieldValue,\n FormImportResult,\n FormRepairOptions,\n FormRepairResult,\n FormSetValueResult,\n FormEffectsResult,\n FormSnapshot,\n WidgetAppearance,\n} from '@embedpdf/engine-core/runtime';\nimport type {\n ScriptBudget,\n ScriptDiagnostic,\n ScriptExecutionError,\n ScriptIdentity,\n ScriptUiEffect,\n} from '@embedpdf/core-acrojs';\nimport type { ScriptSandboxFactory } from '@embedpdf/core-js-sandbox';\nimport { createCapabilityToken } from '@embedpdf/core';\n\nimport type { FillItem } from './core/fill-items';\nimport type { Box, FieldKey, Model } from './core/model';\n\nexport interface FormState {\n model: Model;\n}\n\nexport interface FormScriptingOptions {\n /** Explicit opt-in. PDF JavaScript remains inert when false/omitted. */\n enabled: boolean;\n /** Override the lazy QuickJS factory (tests or another isolated VM). */\n sandboxFactory?: ScriptSandboxFactory;\n /** Optional embedder identity fields layered over engine/JWT identity. */\n identity?: Partial<ScriptIdentity> | (() => Partial<ScriptIdentity>);\n /** Target document filename exposed as `this.documentFileName`. */\n fileName?: () => string;\n /** Injected deterministic transaction environment. */\n now?: () => number;\n utcOffsetMinutes?: () => number;\n randomSeed?: () => number;\n budget?: ScriptBudget;\n /** Framework/application port for app.alert, print, and page navigation. */\n onUiEffect?: (effect: ScriptUiEffect) => void;\n onDiagnostic?: (diagnostic: ScriptDiagnostic) => void;\n onError?: (error: ScriptExecutionError) => void;\n}\n\nexport interface FormPluginOptions {\n scripting?: FormScriptingOptions;\n}\n\nexport type FormCommitStatus = 'applied' | 'unchanged' | 'rejected' | 'failed';\n\nexport interface FormCommitResult {\n status: FormCommitStatus;\n scripted: boolean;\n effectsResult: FormEffectsResult | null;\n uiEffects: FormUiEffect[];\n diagnostics: ScriptDiagnostic[];\n error?: ScriptExecutionError;\n}\n\n/**\n * One DOM-free UI request produced by the curated Acrobat scripting surface.\n * `phase` says WHO asked: `'boot'` = a document-open script (Adobe's\n * version-check boilerplate lives here — embedders typically suppress these\n * nags), `'user'` = a script triggered by the user's own interaction (a\n * validation alert — show it).\n */\nexport type FormUiEffect = ScriptUiEffect & { phase: 'boot' | 'user' };\n\n/** Runtime adapter for alerts, print requests, and zero-based page navigation. */\nexport type FormUiEffectProvider = (effect: FormUiEffect) => void;\n\n/** Input for {@link FormCapability.placeField}. */\nexport interface PlaceFieldInput {\n family: Exclude<FormFieldFamily, 'pushbutton' | 'signature' | 'unknown'>;\n pageObjectNumber: number;\n /** Content-space LOGICAL field box (no visual padding semantics). */\n box: Box;\n /** Widget styling in the engine vocabulary (`WidgetAppearance`). Convert a\n * tool's flat CSS defaults with `widgetAppearanceFromProps` from\n * `@embedpdf/plugin-annotation`. Omitted → the engine's bare defaults. */\n appearance?: WidgetAppearance;\n}\n\n/** What {@link FormCapability.placeField} created. */\nexport interface PlacedField {\n field: FormFieldDTO;\n /** The widget placed on the requested page (join key to the annotation\n * plane for auto-selection), or null when the engine reported none. */\n widget: FormFieldDTO['widgets'][number] | null;\n}\n\nexport type FormAction = { type: 'SET_MODEL'; model: Model };\n\n/**\n * The form plugin's public capability: the FIELD plane. Widgets stay\n * annotations (geometry/appearance live there); this surface owns values,\n * interchange, and the fill-mode projection.\n */\nexport interface FormCapability {\n /** The current reconciled form state (null until the first load lands). */\n snapshot(): FormSnapshot | null;\n /** Re-read the form from the engine (imports/repair/remote bursts). */\n refresh(): Promise<void>;\n\n /** Fill controls for one page — content-space, framework-agnostic. */\n fillItems(pageObjectNumber: number): FillItem[];\n /**\n * The fill control for ONE widget, by annotation object number — the join\n * the annotation-plane render layer uses (its RenderItem carries the live\n * box, so this item's `box` is advisory). Reference-stable per model change.\n * Null until the snapshot lands, or for families with no fill control.\n */\n fillItem(annotObjectNumber: number): FillItem | null;\n /** Make sure a page's widget geometry is loaded (idempotent, lazy). */\n ensureGeom(pageObjectNumber: number): void;\n\n field(key: FieldKey): FormFieldDTO | null;\n fieldForWidget(annotObjectNumber: number): FormFieldDTO | null;\n\n /** Commit a text value (call on blur/Enter — keystrokes stay local). */\n setText(key: FieldKey, value: string): Promise<void>;\n /** Toggle a checkbox/radio widget by its on-state; null clears the group. */\n toggle(key: FieldKey, onState: string | null): Promise<void>;\n /** Select choice options by export value. */\n choose(key: FieldKey, values: string[]): Promise<void>;\n /** Commit one originating-client value transaction, including K/V/C/F scripts when enabled. */\n commitValue(ref: FormFieldRef, value: FormFieldValue): Promise<FormCommitResult>;\n /** Execute one widget's `/A` activation action (and `/Next`) when scripting is enabled. */\n activateWidget(key: FieldKey, annotationRef: AnnotationRef): Promise<FormCommitResult>;\n /** Install the framework/application adapter for script-produced UI requests. */\n setUiEffectProvider(provider: FormUiEffectProvider | null): void;\n /** Restore a field to its /DV default. */\n reset(key: FieldKey): Promise<void>;\n /** Raw engine passthrough for anything the sugar above doesn't cover. */\n setValue(ref: FormFieldRef, value: FormFieldValue): Promise<FormSetValueResult>;\n\n exportData(format?: FormDataFormat): Promise<FormDataExport>;\n importData(data: Uint8Array | ArrayBuffer, format?: FormDataFormat): Promise<FormImportResult>;\n repair(options?: FormRepairOptions): Promise<FormRepairResult>;\n\n // ── design mode (doc.forms.modify) ─────────────────────────────────────\n /**\n * Create a field of `family` with one styled widget at a content-space box\n * — the palette tools' commit, and the programmatic authoring entry (works\n * with NO annotation plugin: a pure `doc.forms` call). The box is clamped\n * to the page; sizing policy (click default vs drag rect) is the caller's.\n * The field gets a deterministic auto-name (`text_1`, …; rename in the\n * field panel). Resolves AFTER the annotation plane (when present) has\n * re-read the page, so the returned widget is immediately selectable.\n */\n placeField(input: PlaceFieldInput): Promise<PlacedField>;\n /** The page's content box (`{0,0,w,h}`) — page-bound placement math. */\n pageBox(pageObjectNumber: number): Box | null;\n /** Field-plane properties: name, required, options, default value. */\n updateField(key: FieldKey, patch: FormFieldPatch): Promise<void>;\n /** Delete the field and every widget of it (cascades on the page). */\n deleteField(key: FieldKey): Promise<void>;\n /** Unlink one widget: it stays as an inert annotation, the field survives. */\n detachWidget(key: FieldKey, annotObjectNumber: number): Promise<void>;\n\n /** UI mirror of the engine gates (`doc.forms.fill` / `doc.forms.modify`). */\n canFill(): boolean;\n canModify(): boolean;\n}\n\nexport const FormToken = createCapabilityToken<FormCapability>('form');\n\nexport type { FillItem } from './core/fill-items';\nexport type { Box, FieldKey } from './core/model';\n","import { definePlugin } from '@embedpdf/core';\nimport { AnnotationToken } from '@embedpdf/plugin-annotation';\n// Behavior registration lives on the HOST capability (framework/plugin\n// surface) — same runtime token, wider type.\nimport { AnnotationToken as AnnotationHostToken } from '@embedpdf/plugin-annotation/internal';\nimport { InteractionToken } from '@embedpdf/plugin-interaction';\n\nimport { createFormCapability } from './capability';\nimport { registerFormEffects } from './effects';\nimport { createPlaceHandler } from './handler';\nimport { formReducer, initialFormState } from './reducer';\nimport { FORM_TOOLS, PLACE_TAGS } from './tools';\nimport { FormToken } from './types';\nimport type { FormAction, FormCapability, FormPluginOptions, FormState } from './types';\n\n/**\n * The form plugin: the FIELD plane. Document-scoped; requires the\n * interaction hub. Fill mode works with no annotation plugin at all —\n * geometry is read from the engine's widget DTOs. When the annotation\n * plugin IS present, a Behavior keeps widgets geometry-inert while the\n * active tool carries 'form-fill' (the built-in pointer/pan tools do, so\n * filling is the resting state) and stands the fill controls down under\n * every other tool — the single-active-tool hub IS the mode switch.\n * Design mode = the 'form-edit' / palette tools: no 'form-fill' tag, so\n * widgets become ordinary editable annotations.\n */\nexport const formPlugin = (options: FormPluginOptions = {}) =>\n definePlugin<FormState, FormAction, FormCapability>({\n id: 'form',\n token: FormToken,\n scope: 'document',\n requires: [InteractionToken],\n optional: [AnnotationToken],\n initialState: initialFormState,\n reduce: formReducer,\n capability: (ctx) => createFormCapability(ctx, options),\n effects: registerFormEffects,\n init: (ctx) => {\n const interaction = ctx.get(InteractionToken);\n const form = ctx.get(FormToken);\n // Fill-ONLY mode: forms fillable, no annotation editing at all. The\n // DEFAULT fill experience doesn't need this tool — the built-in\n // pointer/pan tools carry the 'form-fill' tag themselves.\n interaction.registerTool({\n id: 'form-fill',\n cursor: 'default',\n // `link-nav` rides along: links keep navigating while a form is being\n // filled (Acrobat behaviour) — inert without the link plugin.\n enables: new Set(['form-fill', 'link-nav']),\n });\n // Design mode's resting state (the Form tab): no 'form-fill', so the\n // widget Behavior disengages and widgets select/move/resize like any\n // annotation. Palette tools layer drag-to-place on top of this.\n interaction.registerTool({\n id: 'form-edit',\n cursor: 'default',\n enables: new Set(['annotation-edit', 'annotation-marquee']),\n });\n // Field palette: ONE tool table, two registration paths. With the\n // annotation plugin, palette tools join ITS registry — they gain live\n // defaults, the schema style panel (`propsForTool`), click-create — all\n // the shared authoring infrastructure. Without it,\n // the same table registers plain hub tools: drag/click placement and\n // programmatic authoring still work (`placeField` is a pure `doc.forms`\n // call); only INTERACTIVE styling/moving needs the annotation plane.\n // Either way the commit goes through the form place handler — these\n // tools enable 'form-place', never 'annotation-draw', so the two commit\n // planes can't cross structurally.\n const annotation = ctx.tryGet(AnnotationHostToken);\n for (const t of FORM_TOOLS) {\n if (annotation) {\n annotation.registerTool({\n id: t.id,\n subtype: t.visualKind,\n cursor: t.cursor,\n enables: [...PLACE_TAGS],\n clickCreate: t.clickCreate,\n defaults: t.defaults,\n });\n } else {\n interaction.registerTool({\n id: t.id,\n cursor: t.cursor,\n enables: new Set(PLACE_TAGS),\n });\n }\n }\n interaction.registerHandler(createPlaceHandler(form, interaction, annotation));\n\n if (annotation) {\n annotation.registerBehavior({\n id: 'form-widgets',\n matches: (a) => a.subtype.startsWith('widget'),\n engaged: () => interaction.activeTool()?.enables.has('form-fill') ?? false,\n });\n }\n },\n });\n"],"mappings":"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"}