@embedpdf/react 3.0.0-next.13 → 3.0.0-next.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnnotationList-CkijRHet-HEFNUIZe.d.cts +877 -0
- package/dist/AnnotationList-CkijRHet-HEFNUIZe.d.ts +877 -0
- package/dist/actions.cjs +25 -5
- package/dist/actions.cjs.map +1 -1
- package/dist/actions.d.cts +18 -5
- package/dist/actions.d.ts +18 -5
- package/dist/actions.js +22 -6
- package/dist/actions.js.map +1 -1
- package/dist/anchored-DeX95xSd.d.ts +85 -0
- package/dist/anchored-DzN3JywS.d.cts +85 -0
- package/dist/anchored.cjs +71 -28
- package/dist/anchored.cjs.map +1 -1
- package/dist/anchored.d.cts +2 -45
- package/dist/anchored.d.ts +2 -45
- package/dist/anchored.js +56 -19
- package/dist/anchored.js.map +1 -1
- package/dist/annotation-B48UT2ln.d.ts +302 -0
- package/dist/annotation-C1ttM8Wj.js +708 -0
- package/dist/annotation-C1ttM8Wj.js.map +1 -0
- package/dist/annotation-C9dVwo9b.d.cts +302 -0
- package/dist/annotation-Dex5EBda.cjs +830 -0
- package/dist/annotation-Dex5EBda.cjs.map +1 -0
- package/dist/annotation.cjs +20 -783
- package/dist/annotation.d.cts +2 -2
- package/dist/annotation.d.ts +2 -2
- package/dist/annotation.js +2 -768
- package/dist/commands.cjs +68 -28
- package/dist/commands.cjs.map +1 -1
- package/dist/commands.d.cts +37 -10
- package/dist/commands.d.ts +37 -10
- package/dist/commands.js +68 -31
- package/dist/commands.js.map +1 -1
- package/dist/form-55izw0jS.js +511 -0
- package/dist/form-55izw0jS.js.map +1 -0
- package/dist/form-BNqQfGGH.cjs +548 -0
- package/dist/form-BNqQfGGH.cjs.map +1 -0
- package/dist/form.cjs +5 -5
- package/dist/form.d.cts +32 -25
- package/dist/form.d.ts +32 -25
- package/dist/form.js +2 -3
- package/dist/history.cjs +38 -0
- package/dist/history.cjs.map +1 -0
- package/dist/history.d.cts +27 -0
- package/dist/history.d.ts +27 -0
- package/dist/history.js +27 -0
- package/dist/history.js.map +1 -0
- package/dist/i18n.cjs +26 -30
- package/dist/i18n.cjs.map +1 -1
- package/dist/i18n.d.cts +24 -21
- package/dist/i18n.d.ts +24 -21
- package/dist/i18n.js +24 -31
- package/dist/i18n.js.map +1 -1
- package/dist/index.cjs +213 -57
- package/dist/index.d.cts +32 -31
- package/dist/index.d.ts +32 -31
- package/dist/index.js +33 -29
- package/dist/inert-CmBEbKCn.cjs +19 -0
- package/dist/inert-CmBEbKCn.cjs.map +1 -0
- package/dist/inert-D8fkennb.js +14 -0
- package/dist/inert-D8fkennb.js.map +1 -0
- package/dist/interaction.cjs +48 -102
- package/dist/interaction.cjs.map +1 -1
- package/dist/interaction.d.cts +23 -32
- package/dist/interaction.d.ts +23 -32
- package/dist/interaction.js +33 -102
- package/dist/interaction.js.map +1 -1
- package/dist/link.cjs +65 -104
- package/dist/link.cjs.map +1 -1
- package/dist/link.d.cts +21 -16
- package/dist/link.d.ts +22 -17
- package/dist/link.js +67 -107
- package/dist/link.js.map +1 -1
- package/dist/measurement.cjs +56 -0
- package/dist/measurement.cjs.map +1 -0
- package/dist/measurement.d.cts +38 -0
- package/dist/measurement.d.ts +38 -0
- package/dist/measurement.js +42 -0
- package/dist/measurement.js.map +1 -0
- package/dist/metadata.cjs +20 -7
- package/dist/metadata.cjs.map +1 -1
- package/dist/metadata.d.cts +22 -7
- package/dist/metadata.d.ts +22 -7
- package/dist/metadata.js +20 -10
- package/dist/metadata.js.map +1 -1
- package/dist/page-edit.cjs +7 -3
- package/dist/page-edit.cjs.map +1 -1
- package/dist/page-edit.d.cts +6 -2
- package/dist/page-edit.d.ts +6 -2
- package/dist/page-edit.js +7 -4
- package/dist/page-edit.js.map +1 -1
- package/dist/page-layers-Bkaaz8Zf.js +26 -0
- package/dist/page-layers-Bkaaz8Zf.js.map +1 -0
- package/dist/page-layers-BloZDoOV.cjs +37 -0
- package/dist/page-layers-BloZDoOV.cjs.map +1 -0
- package/dist/page-view.cjs +89 -82
- package/dist/page-view.cjs.map +1 -1
- package/dist/page-view.d.cts +14 -7
- package/dist/page-view.d.ts +18 -11
- package/dist/page-view.js +86 -81
- package/dist/page-view.js.map +1 -1
- package/dist/redaction.cjs +30 -15
- package/dist/redaction.cjs.map +1 -1
- package/dist/redaction.d.cts +27 -9
- package/dist/redaction.d.ts +27 -9
- package/dist/redaction.js +29 -18
- package/dist/redaction.js.map +1 -1
- package/dist/render.cjs +71 -46
- package/dist/render.cjs.map +1 -1
- package/dist/render.d.cts +17 -5
- package/dist/render.d.ts +17 -5
- package/dist/render.js +70 -49
- package/dist/render.js.map +1 -1
- package/dist/runtime-B6xcPsEb.js +398 -0
- package/dist/runtime-B6xcPsEb.js.map +1 -0
- package/dist/runtime-DBEBlpQV.d.cts +237 -0
- package/dist/runtime-V3MVMb91.d.ts +237 -0
- package/dist/runtime-fzpGv78v.cjs +555 -0
- package/dist/runtime-fzpGv78v.cjs.map +1 -0
- package/dist/runtime.cjs +45 -324
- package/dist/runtime.d.cts +2 -2
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.js +2 -306
- package/dist/search.cjs +81 -50
- package/dist/search.cjs.map +1 -1
- package/dist/search.d.cts +36 -24
- package/dist/search.d.ts +36 -24
- package/dist/search.js +81 -53
- package/dist/search.js.map +1 -1
- package/dist/selection.cjs +105 -108
- package/dist/selection.cjs.map +1 -1
- package/dist/selection.d.cts +54 -26
- package/dist/selection.d.ts +56 -28
- package/dist/selection.js +103 -110
- package/dist/selection.js.map +1 -1
- package/dist/shell.cjs +36 -21
- package/dist/shell.cjs.map +1 -1
- package/dist/shell.d.cts +32 -17
- package/dist/shell.d.ts +32 -17
- package/dist/shell.js +36 -24
- package/dist/shell.js.map +1 -1
- package/dist/signature.cjs +29 -48
- package/dist/signature.cjs.map +1 -1
- package/dist/signature.d.cts +26 -26
- package/dist/signature.d.ts +26 -26
- package/dist/signature.js +30 -48
- package/dist/signature.js.map +1 -1
- package/dist/stage-BIG6aeVd.cjs +369 -0
- package/dist/stage-BIG6aeVd.cjs.map +1 -0
- package/dist/stage-ByFPD-Fv.d.cts +117 -0
- package/dist/stage-DaboaheR.d.ts +117 -0
- package/dist/stage-DoVekb83.js +302 -0
- package/dist/stage-DoVekb83.js.map +1 -0
- package/dist/stage-scope-CQgCuf1w.cjs +46 -0
- package/dist/stage-scope-CQgCuf1w.cjs.map +1 -0
- package/dist/stage-scope-D7ZeNduT.js +23 -0
- package/dist/stage-scope-D7ZeNduT.js.map +1 -0
- package/dist/stage.cjs +12 -235
- package/dist/stage.d.cts +2 -116
- package/dist/stage.d.ts +2 -116
- package/dist/stage.js +3 -228
- package/dist/stamp.cjs +41 -35
- package/dist/stamp.cjs.map +1 -1
- package/dist/stamp.d.cts +25 -18
- package/dist/stamp.d.ts +25 -18
- package/dist/stamp.js +40 -37
- package/dist/stamp.js.map +1 -1
- package/dist/state-0K1I5cM4.d.cts +29 -0
- package/dist/state-0K1I5cM4.d.ts +29 -0
- package/dist/state-CbgxhwLA.js +62 -0
- package/dist/state-CbgxhwLA.js.map +1 -0
- package/dist/state-CsfZy_Eq.cjs +73 -0
- package/dist/state-CsfZy_Eq.cjs.map +1 -0
- package/dist/svg-shapes-Dm1yTR1b.js +40 -0
- package/dist/svg-shapes-Dm1yTR1b.js.map +1 -0
- package/dist/svg-shapes-zo0GNkc9.cjs +53 -0
- package/dist/svg-shapes-zo0GNkc9.cjs.map +1 -0
- package/dist/toolbar.cjs +297 -295
- package/dist/toolbar.cjs.map +1 -1
- package/dist/toolbar.d.cts +58 -68
- package/dist/toolbar.d.ts +67 -77
- package/dist/toolbar.js +271 -293
- package/dist/toolbar.js.map +1 -1
- package/dist/view-manager.cjs +34 -0
- package/dist/view-manager.cjs.map +1 -0
- package/dist/view-manager.d.cts +21 -0
- package/dist/view-manager.d.ts +21 -0
- package/dist/view-manager.js +23 -0
- package/dist/view-manager.js.map +1 -0
- package/package.json +41 -38
- package/dist/AnnotationListSnapshot-D3mFut1e-C_GMpK25.d.cts +0 -546
- package/dist/AnnotationListSnapshot-D3mFut1e-C_GMpK25.d.ts +0 -546
- package/dist/annotation-BCED_p9H.d.cts +0 -160
- package/dist/annotation-anchors-CetwM1g7.js +0 -15
- package/dist/annotation-anchors-CetwM1g7.js.map +0 -1
- package/dist/annotation-anchors-DuYRBJLl.cjs +0 -26
- package/dist/annotation-anchors-DuYRBJLl.cjs.map +0 -1
- package/dist/annotation-hooks-BB5ZhPpf.cjs +0 -16
- package/dist/annotation-hooks-BB5ZhPpf.cjs.map +0 -1
- package/dist/annotation-hooks-Df8EmzDO.js +0 -11
- package/dist/annotation-hooks-Df8EmzDO.js.map +0 -1
- package/dist/annotation-k38KDlIZ.d.ts +0 -160
- package/dist/annotation-menu.cjs +0 -64
- package/dist/annotation-menu.cjs.map +0 -1
- package/dist/annotation-menu.d.cts +0 -33
- package/dist/annotation-menu.d.ts +0 -33
- package/dist/annotation-menu.js +0 -48
- package/dist/annotation-menu.js.map +0 -1
- package/dist/annotation.cjs.map +0 -1
- package/dist/annotation.js.map +0 -1
- package/dist/form-BVumS7up.cjs +0 -926
- package/dist/form-BVumS7up.cjs.map +0 -1
- package/dist/form-CK3mp99m.js +0 -895
- package/dist/form-CK3mp99m.js.map +0 -1
- package/dist/rolldown-runtime-BBjsoOtd.js +0 -27
- package/dist/runtime-DE76hlnl.d.ts +0 -216
- package/dist/runtime-umHA_xHt.d.cts +0 -216
- package/dist/runtime.cjs.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/scrollbar.cjs +0 -241
- package/dist/scrollbar.cjs.map +0 -1
- package/dist/scrollbar.d.cts +0 -42
- package/dist/scrollbar.d.ts +0 -42
- package/dist/scrollbar.js +0 -213
- package/dist/scrollbar.js.map +0 -1
- package/dist/stage.cjs.map +0 -1
- package/dist/stage.js.map +0 -1
- package/dist/views.cjs +0 -35
- package/dist/views.cjs.map +0 -1
- package/dist/views.d.cts +0 -21
- package/dist/views.d.ts +0 -21
- package/dist/views.js +0 -27
- package/dist/views.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-CK3mp99m.js","names":[],"sources":["../src/form-focus-ring.tsx","../src/form-listbox.tsx","../src/form.tsx"],"sourcesContent":["import * as React from 'react';\n\nexport interface FormFocusRingProps {\n visible: boolean;\n}\n\n/**\n * Paint the form focus indicator above baked PDF appearances and transparent\n * native controls. Putting an inset outline on the widget wrapper lets an\n * opaque child cover it, which makes rectangular checkboxes and combo boxes\n * appear unfocused even though they are active in the native Tab order.\n */\nexport function FormFocusRing({ visible }: FormFocusRingProps) {\n if (!visible) return null;\n return (\n <span\n aria-hidden=\"true\"\n data-embedpdf-form-focus-ring=\"\"\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: 1,\n boxSizing: 'border-box',\n outline: '2px solid rgba(66, 133, 244, 0.8)',\n outlineOffset: -2,\n pointerEvents: 'none',\n }}\n />\n );\n}\n","import * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\n\nexport interface NativeListBoxOption {\n label: string;\n value: string;\n}\n\nexport interface NativeListBoxProps {\n ariaLabel: string;\n disabled: boolean;\n multi: boolean;\n options: NativeListBoxOption[];\n selected: string[];\n onSelect(values: string[]): void | Promise<void>;\n onFocus?: React.FocusEventHandler<HTMLSelectElement>;\n onBlur?: React.FocusEventHandler<HTMLSelectElement>;\n style?: React.CSSProperties;\n}\n\n/**\n * A PDF list box needs one owner for pixels, hit-testing, and scrolling. A\n * baked /AP picture with an invisible native select cannot provide that: the\n * browser and PDF each keep an independent top-visible row. This visible\n * native control keeps a local optimistic selection while the engine write is\n * pending and synchronizes when engine truth changes, without remounting the\n * DOM node or resetting its scroll position.\n */\nexport function NativeListBox({\n ariaLabel,\n disabled,\n multi,\n options,\n selected,\n onSelect,\n onFocus,\n onBlur,\n style,\n}: NativeListBoxProps) {\n const [draft, setDraft] = useState<string[]>(() => [...selected]);\n const controlRef = useRef<HTMLSelectElement>(null);\n const selectedRef = useRef(selected);\n selectedRef.current = selected;\n const selectedSignature = JSON.stringify(selected);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control) return;\n // The Stage's ambient wheel handler lives on an ancestor and\n // preventDefault()s to pan/zoom the page. Stop at the list box so the\n // browser can apply the same wheel event to this control's own scroll box.\n const isolateWheel = (event: WheelEvent) => event.stopPropagation();\n control.addEventListener('wheel', isolateWheel);\n return () => control.removeEventListener('wheel', isolateWheel);\n }, []);\n\n useEffect(() => {\n setDraft([...selectedRef.current]);\n }, [selectedSignature]);\n\n const rollback = () => setDraft([...selectedRef.current]);\n const choose = (values: string[]) => {\n setDraft(values);\n try {\n const result = onSelect(values);\n if (result) void result.catch(rollback);\n } catch {\n rollback();\n }\n };\n\n return (\n <select\n ref={controlRef}\n aria-label={ariaLabel}\n multiple={multi}\n size={Math.max(2, options.length)}\n disabled={disabled}\n value={multi ? draft : (draft[0] ?? '')}\n onFocus={onFocus}\n onBlur={onBlur}\n onChange={(event) =>\n choose(Array.from(event.currentTarget.selectedOptions).map((option) => option.value))\n }\n style={style}\n >\n {options.map((option, index) => (\n <option key={index} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n}\n","/**\n * The React view of @embedpdf/plugin-form.\n *\n * TWO fill surfaces, one plugin:\n *\n * 1. `formWidgetRenderer` — the full-viewer path. Widgets are annotations,\n * so the fill controls plug into the annotation stack:\n * `<AnnotationLayer renderers={[formWidgetRenderer]} />` routes every\n * ENGAGED widget here with its live box and its baked /AP raster. The\n * picture IS the resting control (the engine's own rendering of value,\n * check state, borders, fonts); these components add exactly the\n * interaction skin on top:\n *\n * text → picture at rest; click swaps in an <input>/<textarea> (the\n * focused element IS the draft store — the plugin model only\n * learns a value on commit); blur/Enter commits, the engine\n * re-bakes the /AP, the refreshed picture replaces the editor.\n * toggle → the picture is the whole control; click writes the toggled\n * value; the re-baked appearance shows the new check state.\n * combo → an invisible native <select> over the picture: the browser\n * owns the dropdown, the engine owns the resting pixels.\n * list → a visible native <select>: one surface owns pixels, row\n * hit-testing, keyboard selection, and scrolling.\n * button → native keyboard/click target over the picture; activation is\n * delegated to the form plugin's isolated scripting pipeline.\n *\n * 2. `<FormLayer />` — the annotation-less path (fill-only viewers with no\n * annotation plugin): synthetic HTML controls positioned from the form\n * model's own widget geometry. Do NOT mount it next to an AnnotationLayer\n * wired with `formWidgetRenderer` — the controls would double up.\n *\n * Every control isolates its pointerdown from the interaction hub with a\n * NATIVE listener (the FreeText precedent): the Stage listens natively on an\n * ancestor, so React's synthetic events would run too late.\n */\n\n// One-line-per-feature (ADAPTERS.md): registration travels with the UI.\nexport * from '@embedpdf/plugin-form';\nimport * as React from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { PdfAnnotationEventKind } from '@embedpdf/plugin-actions/contract';\nimport type { AnnotationRef } from '@embedpdf/plugin-annotation/contract';\nimport { FormToken } from '@embedpdf/plugin-form';\nimport { SignatureToken } from '@embedpdf/plugin-signature/contract';\nimport type { FormFieldRef, FillItem, FormFieldDTO } from '@embedpdf/plugin-form';\nimport { InteractionToken } from '@embedpdf/plugin-interaction/contract';\nimport { StageToken } from '@embedpdf/plugin-stage/contract';\nimport type { Rect } from '@embedpdf/core-annotation';\n\nimport { useAnnotationSelected } from './annotation-hooks';\nimport type { AnnotationRenderer, AnnotationRendererProps } from './annotation';\nimport {\n shallowArray,\n useCapability,\n useOptionalCapability,\n useOptionalSelector,\n usePage,\n useSelector,\n} from './runtime';\nimport type { PageContextValue } from './runtime';\nimport { FormFocusRing } from './form-focus-ring';\nimport { NativeListBox } from './form-listbox';\n\n/** Content rect → a view-px box (the page wrapper's own coordinate space). */\nfunction viewBox(r: Rect, page: PageContextValue) {\n const tl = page.transform.toPixels({ x: r.x, y: r.y });\n const br = page.transform.toPixels({ x: r.x + r.width, y: r.y + r.height });\n return { left: tl.x, top: tl.y, width: br.x - tl.x, height: br.y - tl.y };\n}\n\n/**\n * Keep the interaction hub out of gestures that begin inside a fill control.\n * Native listener (not React's) so it runs during real DOM bubbling, before\n * the Stage's own native listener on an ancestor — same trick as FreeText.\n */\nfunction useIsolated<T extends HTMLElement>() {\n const ref = useRef<T>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const stop = (e: Event) => e.stopPropagation();\n el.addEventListener('pointerdown', stop);\n return () => el.removeEventListener('pointerdown', stop);\n }, []);\n return ref;\n}\n\n/**\n * The widget DOM-event feed (Phase 2): wire one widget surface's pointer and\n * focus events to `form.notifyWidgetEvent` — the `/AA` E/X/D/U/Fo/Bl trigger\n * door. Handlers live on the ALWAYS-ACTIVE event surface, never the inner\n * control: \"may edit this field\" and \"may receive PDF action events\" are\n * different rights, and a read-only session (no `doc.forms.fill`) must still\n * see hover tooltips (session Hide needs no write authority).\n */\nfunction useWidgetEvents(\n key: string,\n annotationRef: AnnotationRef | null,\n): Pick<\n React.DOMAttributes<HTMLElement>,\n 'onPointerEnter' | 'onPointerLeave' | 'onPointerDown' | 'onPointerUp' | 'onFocus' | 'onBlur'\n> {\n const form = useCapability(FormToken);\n const refBox = useRef(annotationRef);\n refBox.current = annotationRef;\n return useMemo(() => {\n const notify = (event: PdfAnnotationEventKind) => {\n const target = refBox.current;\n if (target) form.notifyWidgetEvent(key, target, event);\n };\n return {\n onPointerEnter: () => notify('cursorEnter'),\n onPointerLeave: () => notify('cursorExit'),\n onPointerDown: () => notify('mouseDown'),\n onPointerUp: () => notify('mouseUp'),\n // React focus/blur bubble (focusin semantics), so the inner control's\n // focus reaches this surface; blur fires AFTER the control's own\n // commit handler, so a /Bl script always sees the committed value.\n onFocus: () => notify('focus'),\n onBlur: () => notify('blur'),\n };\n }, [form, key]);\n}\n\n/**\n * Widget ACTIVATION: a click on ANY widget runs its `/A`. ISO puts the\n * activate action on the annotation dictionary — any subtype, any field\n * type — so activation is a WIDGET behavior, not a push-button behavior:\n * real-world producers ship \"buttons\" as read-only text fields carrying an\n * `/A` (the Test Lab's Reset/Next/Hide controls), and Acrobat runs them.\n * A widget without an `/A` resolves inert — dispatching is the cheap,\n * honest way to ask (the dispatcher owns `/A`-vs-`/AA U` precedence).\n * Push buttons keep their own gated door: `disabled` still blocks\n * activation there — unchanged shipped semantics.\n */\nfunction useWidgetActivation(key: string, annotationRef: AnnotationRef | null): () => void {\n const form = useCapability(FormToken);\n const refBox = useRef(annotationRef);\n refBox.current = annotationRef;\n return useCallback(() => {\n const target = refBox.current;\n if (target) void form.activateWidget(key, target);\n }, [form, key]);\n}\n\n/* ══════════════════════════ behavior widgets ══════════════════════════ */\n\n/** The baked /AP raster, blitted by its OWN box (exactly like BakedImage). */\nfunction Picture({\n page,\n appearance,\n apBox,\n frame,\n hidden,\n}: {\n page: PageContextValue;\n appearance: { url: string; box: Rect } | null;\n /** The item's live AP box — wins over the fetched box when present. */\n apBox?: Rect;\n /** The positioned wrapper this renders INSIDE (its view box) — the blit is\n * page-frame, so subtract the wrapper's origin. Omit when rendering\n * directly in the layer container. */\n frame?: { left: number; top: number };\n hidden?: boolean;\n}) {\n if (!appearance) return null;\n const b = viewBox(apBox ?? appearance.box, page);\n return (\n <img\n src={appearance.url}\n alt=\"\"\n draggable={false}\n style={{\n position: 'absolute',\n left: b.left - (frame?.left ?? 0),\n top: b.top - (frame?.top ?? 0),\n width: b.width,\n height: b.height,\n // Content-unit sizing; a global `img { max-width: 100% }` reset would\n // otherwise clamp it to the containing block and distort the blit.\n maxWidth: 'none',\n pointerEvents: 'none',\n visibility: hidden ? 'hidden' : 'visible',\n }}\n />\n );\n}\n\ninterface WidgetProps<C extends FillItem['control']> {\n fill: Extract<FillItem, { control: C }>;\n item: AnnotationRendererProps['item'];\n page: PageContextValue;\n appearance: AnnotationRendererProps['appearance'];\n}\n\n/**\n * Dispatch one engaged widget to its fill control. The FIELD plane (value,\n * behavior, disabled) comes from the form plugin's single-widget projection;\n * the WIDGET plane (live box, /DA font, baked raster) rides in on the\n * renderer props — no geometry is read from the form model here.\n */\nfunction FormWidget({ item, page, appearance }: AnnotationRendererProps) {\n const annot = item.ref?.kind === 'objectNumber' ? item.ref.annotObjectNumber : 0;\n // Reference-stable per model change, so the default Object.is equality holds.\n const fill = useSelector(FormToken, (c) => (annot > 0 ? c.fillItem(annot) : null));\n // Field plane not loaded (or no fill control for this family) → picture only.\n if (!fill) return <Picture page={page} appearance={appearance} apBox={item.apBox} />;\n switch (fill.control) {\n case 'text':\n return <TextWidget fill={fill} item={item} page={page} appearance={appearance} />;\n case 'toggle':\n return <ToggleWidget fill={fill} item={item} page={page} appearance={appearance} />;\n case 'choice':\n return <ChoiceWidget fill={fill} item={item} page={page} appearance={appearance} />;\n case 'button':\n return <ButtonWidget fill={fill} item={item} page={page} appearance={appearance} />;\n case 'signature':\n return <SignatureWidget fill={fill} item={item} page={page} appearance={appearance} />;\n }\n}\n\n/** The form plugin's field key → the engine ref (the inverse of `fieldKeyOf`). */\nconst fieldRefOfKey = (key: string): FormFieldRef =>\n key.startsWith('obj:')\n ? { kind: 'objectNumber', fieldObjectNumber: Number(key.slice(4)) }\n : { kind: 'fqn', name: key.slice(4) };\n\n/**\n * A signature field's widget: the picture (the mark drawn into it, once\n * there is one) with a click target on top. Unsigned → \"sign here\": the\n * field becomes the signature plugin's TARGET, so the next mark picked\n * from a signatures panel goes into it. Signed → `inspect`: the chrome shows\n * what the signature says. Without the signature plugin the widget is\n * picture only — the field plane has no fill control of its own here.\n */\nfunction SignatureWidget({ fill, item, page, appearance }: WidgetProps<'signature'>) {\n const signature = useOptionalCapability(SignatureToken);\n const wrap = useIsolated<HTMLDivElement>();\n const events = useWidgetEvents(fill.key, item.ref);\n const b = viewBox(item.box, page);\n const ref = fieldRefOfKey(fill.key);\n // The signature plugin's snapshot is the authority on signed-ness (it\n // re-reads on every new version); the field plane's /V is the fallback.\n const signed = useOptionalSelector(\n SignatureToken,\n (c) => c.signatureOf(ref)?.signed ?? fill.signed,\n fill.signed,\n );\n const actionable = signature != null && (signed || !fill.disabled);\n return (\n <div\n ref={wrap}\n {...events}\n style={{ position: 'absolute', left: b.left, top: b.top, width: b.width, height: b.height }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n {actionable ? (\n <button\n type=\"button\"\n aria-label={fill.label}\n data-signed={signed ? '' : undefined}\n onClick={() => (signed ? signature.inspect(ref) : signature.setTarget(ref))}\n style={{\n ...fillControl,\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: 'pointer',\n }}\n />\n ) : null}\n </div>\n );\n}\n\nfunction ButtonWidget({ fill, item, page, appearance }: WidgetProps<'button'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\n const events = useWidgetEvents(fill.key, item.ref);\n const b = viewBox(item.box, page);\n // The OUTER div is the event surface — always pointer-active so /AA hover\n // and pointer triggers fire even for a disabled/read-only button; the\n // inner button keeps `disabled` as the ACTIVATION gate only.\n return (\n <div\n ref={wrap}\n {...events}\n style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n cursor: fill.disabled ? 'default' : 'pointer',\n pointerEvents: 'auto',\n }}\n >\n <button\n type=\"button\"\n aria-label={fill.label}\n disabled={fill.disabled}\n onClick={() => {\n if (item.ref) void form.activateWidget(fill.key, item.ref);\n }}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n boxSizing: 'border-box',\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: 'inherit',\n // The event surface is the wrapper; a disabled button must not\n // swallow the pointer stream before it bubbles.\n pointerEvents: fill.disabled ? 'none' : 'auto',\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n </button>\n </div>\n );\n}\n\nfunction TextWidget({ fill, item, page, appearance }: WidgetProps<'text'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\n const events = useWidgetEvents(fill.key, item.ref);\n const activate = useWidgetActivation(fill.key, item.ref);\n // The editor is ALWAYS MOUNTED (v2's pattern): transparent over the picture\n // at rest, visible while focused. That makes the DOM the focus manager —\n // native Tab order reaches every field, focus enters edit, blur commits —\n // with zero focus machinery of our own. The focused element holds the\n // draft; the plugin model only learns a value on commit (see model.ts).\n const [focused, setFocused] = useState(false);\n const [draft, setDraft] = useState(fill.value);\n const cancelled = useRef(false);\n // Adopt engine truth whenever it changes under us — but never mid-edit.\n useEffect(() => {\n if (!focused) setDraft(fill.value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fill.value, focused]);\n\n const b = viewBox(item.box, page);\n const scale = item.box.width > 0 ? b.width / item.box.width : 1;\n\n // /DA font, scaled to view px. Size 0 means \"auto\" in PDF: approximate with\n // the box height for a single line, Acrobat's 12pt default for multiline.\n const fontSize =\n item.text && item.text.fontSize > 0\n ? item.text.fontSize * scale\n : fill.multiline\n ? 12 * scale\n : Math.max(6, b.height * 0.72);\n const editorStyle: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n boxSizing: 'border-box',\n border: 'none',\n outline: focused ? '2px solid rgba(66, 133, 244, 0.8)' : 'none',\n outlineOffset: -2,\n padding: '0 2px',\n margin: 0,\n background: item.style.interiorColor ?? '#fff',\n color: item.text?.fontColor ?? '#000',\n fontFamily: item.text?.fontFamily ?? 'Helvetica, Arial, sans-serif',\n fontSize,\n textAlign: item.text?.textAlign ?? 'left',\n resize: 'none',\n cursor: 'text',\n opacity: focused ? 1 : 0, // rest: the engine's picture IS the field\n // A DISABLED control suppresses click events entirely — it must not\n // swallow the stream before it reaches the wrapper, which owns /A\n // activation (the read-only \"fake button\" pattern) and the /AA feed.\n ...(fill.disabled ? { pointerEvents: 'none' as const } : {}),\n };\n const editorProps = {\n value: draft,\n maxLength: fill.maxLength ?? undefined,\n 'aria-label': fill.label,\n disabled: fill.disabled,\n onFocus: () => setFocused(true),\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n setDraft(e.target.value),\n onBlur: () => {\n setFocused(false);\n if (cancelled.current) {\n cancelled.current = false;\n setDraft(fill.value);\n return;\n }\n if (draft !== fill.value) void form.setText(fill.key, draft);\n },\n style: editorStyle,\n };\n const onKeys = (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n cancelled.current = true;\n e.currentTarget.blur();\n }\n if (e.key === 'Enter' && !fill.multiline) e.currentTarget.blur(); // blur commits\n };\n\n return (\n <div\n ref={wrap}\n {...events}\n // ANY widget click runs its /A (see useWidgetActivation): an editable\n // field's focus click bubbles here (Acrobat runs /A on that click\n // too); a read-only field's click lands here directly (the disabled\n // editor is pointer-transparent) — the fake-button pattern.\n onClick={activate}\n style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n // Always the event surface (see useWidgetEvents); the editor's own\n // `disabled` keeps read-only fields uneditable and unfocusable.\n pointerEvents: 'auto',\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} hidden={focused} />\n {fill.multiline ? (\n <textarea {...editorProps} onKeyDown={onKeys} />\n ) : (\n <input {...editorProps} type={fill.password ? 'password' : 'text'} onKeyDown={onKeys} />\n )}\n </div>\n );\n}\n\nfunction ToggleWidget({ fill, item, page, appearance }: WidgetProps<'toggle'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\n const events = useWidgetEvents(fill.key, item.ref);\n const activate = useWidgetActivation(fill.key, item.ref);\n const [focused, setFocused] = useState(false);\n const b = viewBox(item.box, page);\n const press = () => {\n // Checkbox: click toggles on/off (null clears). Radio: click always\n // selects its own on-state — no untoggle, per PDF/Acrobat convention.\n // Acrobat's order: the VALUE change first, THEN the /A — so an /A\n // script reads the post-toggle state. A read-only toggle still\n // activates (it just doesn't flip).\n const flipped = fill.disabled\n ? undefined\n : form.toggle(fill.key, fill.kind === 'checkbox' && fill.checked ? null : fill.onState);\n void Promise.resolve(flipped).then(activate, activate);\n };\n return (\n <div\n ref={wrap}\n role={fill.kind === 'checkbox' ? 'checkbox' : 'radio'}\n aria-checked={fill.checked}\n aria-label={fill.label}\n tabIndex={fill.disabled ? -1 : 0}\n {...events}\n onClick={press}\n onFocus={(e) => {\n setFocused(true);\n events.onFocus?.(e);\n }}\n onBlur={(e) => {\n setFocused(false);\n events.onBlur?.(e);\n }}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n press();\n }\n }}\n style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n cursor: fill.disabled ? 'default' : 'pointer',\n pointerEvents: 'auto', // always the event surface; toggle() self-gates\n outline: 'none', // the top-layer FormFocusRing owns focus indication\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n <FormFocusRing visible={focused} />\n </div>\n );\n}\n\nfunction ChoiceWidget(props: WidgetProps<'choice'>) {\n return props.fill.kind === 'list' ? <ListBoxWidget {...props} /> : <ComboBoxWidget {...props} />;\n}\n\nfunction ChoiceFrame({\n fill,\n item,\n page,\n focused,\n innerRef,\n children,\n}: Pick<WidgetProps<'choice'>, 'fill' | 'item' | 'page'> & {\n focused: boolean;\n innerRef: React.RefObject<HTMLDivElement>;\n children: React.ReactNode;\n}) {\n const events = useWidgetEvents(fill.key, item.ref);\n const activate = useWidgetActivation(fill.key, item.ref);\n const b = viewBox(item.box, page);\n return (\n <div\n ref={innerRef}\n {...events}\n onClick={activate}\n style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n pointerEvents: 'auto',\n outline: 'none', // the top-layer FormFocusRing owns focus indication\n }}\n >\n {children}\n <FormFocusRing visible={focused} />\n </div>\n );\n}\n\nfunction ComboBoxWidget({ fill, item, page, appearance }: WidgetProps<'choice'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\n const [focused, setFocused] = useState(false);\n const b = viewBox(item.box, page);\n return (\n <ChoiceFrame fill={fill} item={item} page={page} focused={focused} innerRef={wrap}>\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n {/* A combo's popup is separate from its resting box, so the baked\n appearance and transparent native trigger do not maintain competing\n in-place row geometry or scroll state. */}\n <select\n key={fill.selected.join('\\0')}\n defaultValue={fill.selected[0] ?? ''}\n aria-label={fill.label}\n disabled={fill.disabled}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onChange={(e) => {\n const values = Array.from(e.currentTarget.selectedOptions).map((o) => o.value);\n void form.choose(fill.key, values);\n }}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n opacity: 0,\n cursor: fill.disabled ? 'default' : 'pointer',\n // A disabled control suppresses clicks — the frame owns /A\n // activation and must still receive them.\n ...(fill.disabled ? { pointerEvents: 'none' as const } : {}),\n }}\n >\n {fill.options.map((o, i) => (\n <option key={i} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </ChoiceFrame>\n );\n}\n\nfunction ListBoxWidget({ fill, item, page }: WidgetProps<'choice'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\n const [focused, setFocused] = useState(false);\n const b = viewBox(item.box, page);\n const scale = item.box.width > 0 ? b.width / item.box.width : 1;\n const strokeWidth = item.style.strokeWidth * scale;\n const borderStyle = item.style.border.kind === 'dashed' ? 'dashed' : 'solid';\n return (\n <ChoiceFrame fill={fill} item={item} page={page} focused={focused} innerRef={wrap}>\n <NativeListBox\n ariaLabel={fill.label}\n disabled={fill.disabled}\n multi={fill.multi}\n options={fill.options}\n selected={fill.selected}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onSelect={(values) => form.choose(fill.key, values)}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n boxSizing: 'border-box',\n margin: 0,\n padding: 0,\n borderWidth: strokeWidth,\n borderStyle,\n borderColor: item.style.color,\n borderRadius: 0,\n outline: 'none',\n background: item.style.interiorColor ?? '#fff',\n color: item.text?.fontColor ?? '#000',\n fontFamily: item.text?.fontFamily ?? 'Helvetica, Arial, sans-serif',\n fontSize: (item.text?.fontSize || 12) * scale,\n textAlign: item.text?.textAlign ?? 'left',\n cursor: fill.disabled ? 'default' : 'pointer',\n // A disabled control suppresses clicks — the frame owns /A\n // activation and must still receive them.\n ...(fill.disabled ? { pointerEvents: 'none' as const } : {}),\n }}\n />\n </ChoiceFrame>\n );\n}\n\n/**\n * The form plugin's renderer entry, ready for\n * `<AnnotationLayer renderers={[formWidgetRenderer]} />`. It answers for the\n * PLUGIN-registered 'form-widgets' Behavior — the form plugin decides when\n * widgets are fill controls vs. editable annotations, never the app.\n */\nexport const formWidgetRenderer: AnnotationRenderer = {\n behavior: 'form-widgets',\n component: FormWidget,\n};\n\n/* ══════════════════════ standalone layer (no annotations) ══════════════════ */\n\nconst controlBase: React.CSSProperties = {\n position: 'absolute',\n boxSizing: 'border-box',\n border: '1px solid rgba(56, 88, 233, 0.55)',\n background: 'rgba(255, 255, 255, 0.92)',\n borderRadius: 2,\n font: 'inherit',\n};\n\nconst fillBox = (item: FillItem, page: PageContextValue) => viewBox(item.box, page);\n\n/** The standalone layer's event surface: positions ONE control's box and\n * carries the /AA DOM-event feed — always pointer-active (see\n * useWidgetEvents); the control inside fills it and self-gates edits.\n * With `activate`, a click on the box runs the widget's /A (see\n * useWidgetActivation — activation is a WIDGET behavior); push buttons\n * keep their own gated inner door and do NOT set it. */\nfunction FillEventBox({\n item,\n page,\n cursor,\n activate,\n children,\n}: {\n item: FillItem;\n page: PageContextValue;\n cursor?: string;\n activate?: boolean;\n children: React.ReactNode;\n}) {\n const events = useWidgetEvents(item.key, {\n kind: 'objectNumber',\n pageObjectNumber: page.pon,\n annotObjectNumber: item.annotObjectNumber,\n });\n const onActivate = useWidgetActivation(item.key, {\n kind: 'objectNumber',\n pageObjectNumber: page.pon,\n annotObjectNumber: item.annotObjectNumber,\n });\n const css = fillBox(item, page);\n return (\n <div\n {...events}\n onClick={activate ? onActivate : undefined}\n style={{ position: 'absolute', ...css, pointerEvents: 'auto', ...(cursor ? { cursor } : {}) }}\n >\n {children}\n </div>\n );\n}\n\nconst fillControl: React.CSSProperties = {\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n};\n\n/** Text control: keystrokes stay LOCAL (the input is the draft store);\n * the engine write happens on blur or Enter. */\nfunction FillText({\n item,\n page,\n}: {\n item: Extract<FillItem, { control: 'text' }>;\n page: PageContextValue;\n}) {\n const form = useCapability(FormToken);\n const [draft, setDraft] = useState(item.value);\n // Adopt engine truth whenever it changes under us (remote edit, reset).\n useEffect(() => setDraft(item.value), [item.value]);\n\n const css = fillBox(item, page);\n const fontSize = Math.max(9, Math.min(css.height * 0.62, 24));\n const commit = () => {\n if (draft !== item.value) void form.setText(item.key, draft).catch(() => setDraft(item.value));\n };\n const shared: React.CSSProperties = {\n ...controlBase,\n ...fillControl,\n fontSize,\n padding: '0 3px',\n ...(item.comb ? { letterSpacing: css.width / Math.max(1, item.maxLength ?? 1) / 2 } : {}),\n };\n // A disabled control suppresses clicks — the box owns /A activation and\n // must still receive them (the read-only \"fake button\" pattern).\n const editorGate = item.disabled ? ({ pointerEvents: 'none' } as const) : {};\n return (\n <FillEventBox item={item} page={page} activate>\n {item.multiline ? (\n <textarea\n aria-label={item.label}\n value={draft}\n disabled={item.disabled}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n style={{ ...shared, resize: 'none', ...editorGate }}\n />\n ) : (\n <input\n aria-label={item.label}\n type={item.password ? 'password' : 'text'}\n value={draft}\n maxLength={item.maxLength ?? undefined}\n disabled={item.disabled}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n }}\n style={{ ...shared, ...editorGate }}\n />\n )}\n </FillEventBox>\n );\n}\n\nfunction FillToggle({\n item,\n page,\n}: {\n item: Extract<FillItem, { control: 'toggle' }>;\n page: PageContextValue;\n}) {\n const form = useCapability(FormToken);\n const activate = useWidgetActivation(item.key, {\n kind: 'objectNumber',\n pageObjectNumber: page.pon,\n annotObjectNumber: item.annotObjectNumber,\n });\n const css = fillBox(item, page);\n const glyphSize = Math.min(css.width, css.height) * 0.72;\n return (\n // `activate` covers the DISABLED path (pointer-transparent button → the\n // box click activates without toggling — a read-only toggle's /A still\n // runs); the enabled button below chains toggle-then-/A itself and\n // stops propagation so the click never double-activates.\n <FillEventBox item={item} page={page} cursor={item.disabled ? 'default' : 'pointer'} activate>\n <button\n role={item.kind}\n aria-checked={item.checked}\n aria-label={item.label}\n disabled={item.disabled}\n onClick={(e) => {\n e.stopPropagation();\n // Checkbox re-click clears; radio click always selects its state.\n // Acrobat's order: the VALUE change first, THEN the /A.\n void Promise.resolve(\n form.toggle(item.key, item.kind === 'checkbox' && item.checked ? null : item.onState),\n ).then(activate, activate);\n }}\n style={{\n ...controlBase,\n ...fillControl,\n cursor: 'inherit',\n display: 'grid',\n placeItems: 'center',\n padding: 0,\n borderRadius: item.kind === 'radio' ? '50%' : 2,\n fontSize: glyphSize,\n lineHeight: 1,\n color: '#1f2a44',\n // A disabled control suppresses clicks — the box must receive them.\n ...(item.disabled ? { pointerEvents: 'none' as const } : {}),\n }}\n >\n {item.checked ? (item.kind === 'radio' ? '●' : '✓') : ''}\n </button>\n </FillEventBox>\n );\n}\n\nfunction FillChoice({\n item,\n page,\n}: {\n item: Extract<FillItem, { control: 'choice' }>;\n page: PageContextValue;\n}) {\n const form = useCapability(FormToken);\n const css = fillBox(item, page);\n // A disabled control suppresses clicks — the box owns /A activation and\n // must still receive them.\n const controlGate = item.disabled ? ({ pointerEvents: 'none' } as const) : {};\n if (item.kind === 'list') {\n return (\n <FillEventBox item={item} page={page} activate>\n <NativeListBox\n ariaLabel={item.label}\n disabled={item.disabled}\n multi={item.multi}\n options={item.options}\n selected={item.selected}\n onSelect={(values) => form.choose(item.key, values)}\n style={{\n ...controlBase,\n ...fillControl,\n fontSize: Math.max(9, Math.min(css.height * 0.55, 18)),\n ...controlGate,\n }}\n />\n </FillEventBox>\n );\n }\n return (\n <FillEventBox item={item} page={page} activate>\n <select\n aria-label={item.label}\n disabled={item.disabled}\n value={item.selected[0] ?? ''}\n onChange={(e) => void form.choose(item.key, [e.target.value])}\n style={{\n ...controlBase,\n ...fillControl,\n fontSize: Math.max(9, Math.min(css.height * 0.55, 18)),\n ...controlGate,\n }}\n >\n {item.selected.length === 0 && <option value=\"\" />}\n {item.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </FillEventBox>\n );\n}\n\nfunction FillButton({\n item,\n page,\n}: {\n item: Extract<FillItem, { control: 'button' }>;\n page: PageContextValue;\n}) {\n const form = useCapability(FormToken);\n return (\n <FillEventBox item={item} page={page} cursor={item.disabled ? 'default' : 'pointer'}>\n <button\n type=\"button\"\n aria-label={item.label}\n disabled={item.disabled}\n onClick={() =>\n void form.activateWidget(item.key, {\n kind: 'objectNumber',\n pageObjectNumber: page.pon,\n annotObjectNumber: item.annotObjectNumber,\n })\n }\n style={{\n ...controlBase,\n ...fillControl,\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: 'inherit',\n // Events live on the box; a disabled button must not swallow them.\n pointerEvents: item.disabled ? 'none' : 'auto',\n }}\n />\n </FillEventBox>\n );\n}\n\n/** The standalone layer's signature control: the same target/inspect\n * hand-off as {@link SignatureWidget}, over the page raster. */\nfunction FillSignature({\n item,\n page,\n}: {\n item: Extract<FillItem, { control: 'signature' }>;\n page: PageContextValue;\n}) {\n const signature = useOptionalCapability(SignatureToken);\n const ref = fieldRefOfKey(item.key);\n const signed = useOptionalSelector(\n SignatureToken,\n (c) => c.signatureOf(ref)?.signed ?? item.signed,\n item.signed,\n );\n const actionable = signature != null && (signed || !item.disabled);\n return (\n <FillEventBox item={item} page={page} cursor={actionable ? 'pointer' : 'default'}>\n {actionable ? (\n <button\n type=\"button\"\n aria-label={item.label}\n data-signed={signed ? '' : undefined}\n onClick={() => (signed ? signature.inspect(ref) : signature.setTarget(ref))}\n style={{\n ...fillControl,\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: 'inherit',\n }}\n />\n ) : null}\n </FillEventBox>\n );\n}\n\n/**\n * Fill-mode form controls for one page, positioned from the form model's own\n * widget geometry — the ANNOTATION-LESS path (a fill-only viewer whose page\n * pixels come from an annotated RenderLayer raster). Active whenever the\n * active tool carries the 'form-fill' tag (the built-in pointer/pan tools\n * do); any other tool stands the controls down. Do not mount next to an\n * AnnotationLayer wired with `formWidgetBehaviors`.\n */\nexport function FormLayer() {\n const page = usePage();\n const form = useCapability(FormToken);\n const active = useSelector(InteractionToken, (c) => c.activeTool().enables.has('form-fill'));\n\n useEffect(() => {\n if (active) form.ensureGeom(page.pon);\n }, [active, form, page.pon]);\n\n const items = useSelector(FormToken, (c) => c.fillItems(page.pon), shallowArray);\n if (!active) return null;\n\n return (\n <div style={{ position: 'absolute', inset: 0 }}>\n {items.map((item) =>\n item.control === 'text' ? (\n <FillText key={`${item.key}:${item.annotObjectNumber}`} item={item} page={page} />\n ) : item.control === 'toggle' ? (\n <FillToggle key={`${item.key}:${item.annotObjectNumber}`} item={item} page={page} />\n ) : item.control === 'choice' ? (\n <FillChoice key={`${item.key}:${item.annotObjectNumber}`} item={item} page={page} />\n ) : item.control === 'button' ? (\n <FillButton key={`${item.key}:${item.annotObjectNumber}`} item={item} page={page} />\n ) : item.control === 'signature' ? (\n <FillSignature key={`${item.key}:${item.annotObjectNumber}`} item={item} page={page} />\n ) : null,\n )}\n </div>\n );\n}\n\n/* ═══════════════════════════════ hooks ═══════════════════════════════ */\n\n/** The form capability — values, interchange, design-mode verbs. */\nexport function useForm() {\n return useCapability(FormToken);\n}\n\n/** The reconciled form snapshot (null until the first load lands),\n * re-rendering on every form model change. */\nexport function useFormSnapshot() {\n return useSelector(FormToken, (c) => c.snapshot());\n}\n\n/**\n * The FIELD behind the currently selected widget annotation (single\n * selection), or null. The design-mode join: widget selection lives in the\n * annotation plane, field properties live here.\n */\nexport function useFormField(): FormFieldDTO | null {\n const selected = useAnnotationSelected();\n const widget = selected.length === 1 && selected[0]!.subtype === 'widget' ? selected[0]! : null;\n const objnum = widget && widget.ref.kind === 'objectNumber' ? widget.ref.annotObjectNumber : 0;\n return useSelector(FormToken, (c) => (objnum > 0 ? c.fieldForWidget(objnum) : null));\n}\n"],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
//#region \0rolldown/runtime.js
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __exportAll = (all, no_symbols) => {
|
|
7
|
-
let target = {};
|
|
8
|
-
for (var name in all) __defProp(target, name, {
|
|
9
|
-
get: all[name],
|
|
10
|
-
enumerable: true
|
|
11
|
-
});
|
|
12
|
-
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
13
|
-
return target;
|
|
14
|
-
};
|
|
15
|
-
var __copyProps = (to, from, except, desc) => {
|
|
16
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
17
|
-
key = keys[i];
|
|
18
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
19
|
-
get: ((k) => from[k]).bind(null, key),
|
|
20
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
return to;
|
|
24
|
-
};
|
|
25
|
-
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
26
|
-
//#endregion
|
|
27
|
-
export { __reExport as n, __exportAll as t };
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { AnyPlugin, CapabilityToken, Engine, EngineFactory, EventHook, InitialDocument, Kernel } from "@embedpdf/core";
|
|
2
|
-
import * as React from "react";
|
|
3
|
-
import { PageFrame, PageTransform, Point, Rect } from "@embedpdf/core-geometry";
|
|
4
|
-
import { PageViewDemand } from "@embedpdf/plugin-render/contract";
|
|
5
|
-
declare namespace runtime_d_exports {
|
|
6
|
-
export { DocumentGate, DocumentGateProps, DocumentScope, DocumentScopeProps, EmbedPDF, PageContextValue, PageProvider, Viewer, ViewerProps, makePageContext, shallowArray, useActiveDocumentId, useCapability, useCapabilityEvent, useDocumentId, useDocumentStatus, useDocuments, useKernel, useKernelValue, useOptionalCapability, useOptionalSelector, usePage, useSelector };
|
|
7
|
-
}
|
|
8
|
-
import * as import__embedpdf_core from "@embedpdf/core";
|
|
9
|
-
declare function useKernel(): Kernel;
|
|
10
|
-
declare const shallowArray: <T>(a: readonly T[], b: readonly T[]) => boolean;
|
|
11
|
-
/** Read a value derived from the kernel, cached by equality (no tearing loop). */
|
|
12
|
-
declare function useKernelValue<R>(select: (k: Kernel) => R, isEqual?: (a: R, b: R) => boolean): R;
|
|
13
|
-
declare function useActiveDocumentId(): string | null;
|
|
14
|
-
/** The document id for this subtree: the nearest <DocumentScope>, else the active doc. */
|
|
15
|
-
declare function useDocumentId(): string | null;
|
|
16
|
-
interface DocumentScopeProps {
|
|
17
|
-
id: string;
|
|
18
|
-
children: React.ReactNode;
|
|
19
|
-
}
|
|
20
|
-
/** Bind a subtree to a specific document (panes, comparison). */
|
|
21
|
-
declare function DocumentScope({ id, children }: DocumentScopeProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
interface DocumentGateProps {
|
|
23
|
-
/** Shown while this subtree has NO document (empty workspace, docs still opening). */
|
|
24
|
-
fallback?: React.ReactNode;
|
|
25
|
-
children: React.ReactNode;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Render children only while this subtree has a READY document — the
|
|
29
|
-
* structural way to say "this UI is defined over a document". An empty
|
|
30
|
-
* workspace is a legitimate, designable state (the Viewer no longer blocks on
|
|
31
|
-
* documents so chrome can render at t≈0): workspace-scoped UI (toolbars,
|
|
32
|
-
* commands, i18n) lives OUTSIDE the gate; document-scoped UI (Stage, panels,
|
|
33
|
-
* page chrome) lives inside it, or reads through `useOptionalSelector`.
|
|
34
|
-
* A `loading`/`locked`/`error` tab renders `fallback` — so the gate's
|
|
35
|
-
* fallback doubles as the per-tab boot state; richer chrome (a password
|
|
36
|
-
* prompt, an error pane) branches on `useDocumentStatus()` beside the gate.
|
|
37
|
-
* Sibling of <DocumentScope>, which picks WHICH document; this one handles
|
|
38
|
-
* WHETHER.
|
|
39
|
-
*/
|
|
40
|
-
declare function DocumentGate({ fallback, children }: DocumentGateProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
-
/** Lifecycle status of this subtree's document (loading/locked/ready/error),
|
|
42
|
-
* or null with no document. The password prompt and error panes key off it. */
|
|
43
|
-
declare function useDocumentStatus(): import("@embedpdf/core").DocStatus | null;
|
|
44
|
-
/**
|
|
45
|
-
* Resolve a capability by token, binding document-scoped ones to this
|
|
46
|
-
* subtree's document. Resolution is a REACTIVE read (`tryCapability` through
|
|
47
|
-
* the kernel's one change stream), not a memoized call — under the
|
|
48
|
-
* request-time lifecycle a document can become resolvable while its id stays
|
|
49
|
-
* the same, so any id-keyed cache goes stale; subscribing makes staleness
|
|
50
|
-
* structurally impossible. Fail-fast: while unresolvable, this re-runs the
|
|
51
|
-
* strict resolver so the kernel's truthful reason (`no capability` / `no
|
|
52
|
-
* document` / `document is loading|locked`) is what throws.
|
|
53
|
-
*/
|
|
54
|
-
declare function useCapability<T>(token: CapabilityToken<T>): T;
|
|
55
|
-
/** Like `useCapability`, but null while the token can't resolve (no plugin,
|
|
56
|
-
* no document, or a document that isn't ready yet). */
|
|
57
|
-
declare function useOptionalCapability<T>(token: CapabilityToken<T>): T | null;
|
|
58
|
-
/** Subscribe to a selector over a (document-resolved) capability. */
|
|
59
|
-
declare function useSelector<C, R>(token: CapabilityToken<C>, select: (cap: C) => R, isEqual?: (a: R, b: R) => boolean): R;
|
|
60
|
-
/**
|
|
61
|
-
* Null-safe `useSelector`: `fallback` whenever the token can't resolve — no
|
|
62
|
-
* provider, or a document-scoped token with no document. For chrome that stays
|
|
63
|
-
* mounted across the empty-workspace state (a zoom readout, a mode band).
|
|
64
|
-
* `useSelector` stays strict (fail-fast) for code that KNOWS a document exists
|
|
65
|
-
* — e.g. anything inside a <DocumentGate>.
|
|
66
|
-
*
|
|
67
|
-
* The `select` guard also swallows reads through a capability whose document
|
|
68
|
-
* closed between the store notification and this render — that teardown race
|
|
69
|
-
* resolves to `fallback` for one frame, then re-renders against the new state.
|
|
70
|
-
*/
|
|
71
|
-
declare function useOptionalSelector<C, R>(token: CapabilityToken<C>, select: (cap: C) => R, fallback: R, isEqual?: (a: R, b: R) => boolean): R;
|
|
72
|
-
/**
|
|
73
|
-
* Subscribe to a capability's {@link EventHook} for the mounted lifetime —
|
|
74
|
-
* `useCapabilityEvent(ActionsToken, (c) => c.onAction, handler)`. Events
|
|
75
|
-
* carry occurrences, never state (a late subscriber that needs the current
|
|
76
|
-
* value uses `useSelector`). The handler rides a ref, so a fresh closure per
|
|
77
|
-
* render never resubscribes. Null-safe: no plugin/document → no subscription.
|
|
78
|
-
*/
|
|
79
|
-
declare function useCapabilityEvent<C, T>(token: CapabilityToken<C>, select: (cap: C) => EventHook<T>, handler: (event: T) => void): void;
|
|
80
|
-
/** The document registry (open/close/active/list), reactive. */
|
|
81
|
-
declare function useDocuments(): {
|
|
82
|
-
docs: import("@embedpdf/core").DocInfo[];
|
|
83
|
-
activeId: string | null;
|
|
84
|
-
open: (input: import("@embedpdf/core").OpenSource, options?: import("@embedpdf/core").OpenDocumentOptions) => Promise<string>;
|
|
85
|
-
unlock: (id: string, input: {
|
|
86
|
-
password: string;
|
|
87
|
-
}) => Promise<void>;
|
|
88
|
-
close: (id: string) => Promise<void>;
|
|
89
|
-
setActive: (id: string) => void;
|
|
90
|
-
move: (id: string, toIndex: number) => void;
|
|
91
|
-
swap: (a: string, b: string) => void;
|
|
92
|
-
download: (id?: string, opts?: {
|
|
93
|
-
mode?: import("@embedpdf/core").PdfSaveMode;
|
|
94
|
-
}) => Promise<Uint8Array>;
|
|
95
|
-
downloadLayer: (id?: string) => Promise<Uint8Array>;
|
|
96
|
-
};
|
|
97
|
-
interface ViewerProps {
|
|
98
|
-
/**
|
|
99
|
-
* The engine, as an instance or a thunk. Engines construct synchronously and
|
|
100
|
-
* boot lazily (`localEngine()` allocates nothing until first use), so
|
|
101
|
-
* ownership follows the SHAPE of what you pass:
|
|
102
|
-
*
|
|
103
|
-
* - An **instance** (`engine={engine}`) is BORROWED: the Viewer uses it and
|
|
104
|
-
* never destroys it, because you acquired it and therefore own it. The
|
|
105
|
-
* common path — a module-scope `const engine = localEngine()` shared
|
|
106
|
-
* across viewers and route changes. The Viewer calls `engine.warmup?.()`
|
|
107
|
-
* on mount so the boot overlaps app initialization.
|
|
108
|
-
* - A **thunk** (`engine={() => localEngine()}`) is VIEWER-OWNED: the
|
|
109
|
-
* Viewer calls it on mount and `destroy()`s the result on unmount. Use it
|
|
110
|
-
* for per-mount isolation (StrictMode/HMR-clean teardown, independent
|
|
111
|
-
* multi-viewer engines).
|
|
112
|
-
*
|
|
113
|
-
* Init-only: captured on first render; later identity changes are ignored (dev warns).
|
|
114
|
-
*/
|
|
115
|
-
engine: Engine | EngineFactory;
|
|
116
|
-
/** Init-only: captured on first render; later identity changes are ignored (dev warns). */
|
|
117
|
-
plugins: AnyPlugin[];
|
|
118
|
-
/** Documents to open on startup (with optional tab names). Init-only. */
|
|
119
|
-
initialDocuments?: InitialDocument[];
|
|
120
|
-
fallback?: React.ReactNode;
|
|
121
|
-
/** Rendered when kernel construction or `start()` fails. Without it a boot
|
|
122
|
-
* failure renders nothing — but never a silent forever-fallback. */
|
|
123
|
-
renderError?: (error: unknown) => React.ReactNode;
|
|
124
|
-
children: React.ReactNode;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Owns the kernel as an EFFECT-scoped resource: each effect setup creates and
|
|
128
|
-
* starts exactly one kernel; each cleanup destroys exactly that one. That is
|
|
129
|
-
* the contract StrictMode exercises (two kernels in dev, the first fully
|
|
130
|
-
* destroyed) — the kernel itself is never restarted after destroy.
|
|
131
|
-
*
|
|
132
|
-
* The kernel is published to context the moment it exists — before `start()`
|
|
133
|
-
* resolves — so the `fallback` can use workspace capabilities (i18n copy on a
|
|
134
|
-
* loading screen) exactly as before. The one exception is the very first
|
|
135
|
-
* render, which happens before the effect: it renders nothing. Children mount
|
|
136
|
-
* once `start()` resolves — which never touches the engine, so the shell is
|
|
137
|
-
* alive while WASM compiles or the transport connects. `initialDocuments`
|
|
138
|
-
* open in the BACKGROUND and stream into the registry (`useDocuments()` is
|
|
139
|
-
* reactive); per-document loading UI is the Stage's job, not a root gate.
|
|
140
|
-
*
|
|
141
|
-
* ENGINE OWNERSHIP. When `engine` is a thunk, the Viewer OWNS it: each effect
|
|
142
|
-
* setup constructs one engine (construction is synchronous and inert — boot
|
|
143
|
-
* happens lazily inside the engine) and each cleanup destroys exactly that one
|
|
144
|
-
* — after the kernel, so handles close first. When `engine` is an instance it
|
|
145
|
-
* is BORROWED and never destroyed here; the Viewer only calls `warmup?.()` so
|
|
146
|
-
* the WASM/transport boot overlaps plugin initialization. StrictMode's
|
|
147
|
-
* double-mount therefore constructs two independent thunk engines and tears
|
|
148
|
-
* the first fully down, matching the kernel's own effect-scoped lifecycle.
|
|
149
|
-
* That means dev-only double resource use (two worker spawns, two font
|
|
150
|
-
* fetches, briefly overlapping) — deliberate, because it is exactly the
|
|
151
|
-
* leak-detection contract StrictMode exists to exercise; production mounts
|
|
152
|
-
* once and boots once.
|
|
153
|
-
*/
|
|
154
|
-
declare function Viewer({ engine, plugins, initialDocuments, fallback, renderError, children }: ViewerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
155
|
-
declare const EmbedPDF: typeof Viewer;
|
|
156
|
-
/**
|
|
157
|
-
* PageContext — the seam. A layer depends ONLY on this, never on the Stage. So the
|
|
158
|
-
* same layer works inside a virtualized Stage and in a standalone <PageView>.
|
|
159
|
-
*/
|
|
160
|
-
interface PageContextValue {
|
|
161
|
-
documentId: string;
|
|
162
|
-
/** Durable page identity (PDF object number) — use for keys / render / annotations. */
|
|
163
|
-
pon: number;
|
|
164
|
-
/** Display index (page N) — use for ordering / human-facing page numbers. */
|
|
165
|
-
pageIndex: number;
|
|
166
|
-
/**
|
|
167
|
-
* Reserved chrome bands around the page (screen px per side). The page-chrome
|
|
168
|
-
* slot renders into the outer box (content + frame); these thicknesses size
|
|
169
|
-
* the bands — a label in the bottom band is `bottom:0; height: frame.bottom`.
|
|
170
|
-
*/
|
|
171
|
-
frame: PageFrame;
|
|
172
|
-
/**
|
|
173
|
-
* The single bridge between PDF points, view px, and device px for this page.
|
|
174
|
-
* Layers do ALL coordinate work through it — `toPixels` to place content-
|
|
175
|
-
* space overlays, `renderScale`/`deviceWidth` to render, `contentWidth` for
|
|
176
|
-
* page-relative sizing. Never re-derive `x * scale` or `* dpr`.
|
|
177
|
-
*/
|
|
178
|
-
transform: PageTransform;
|
|
179
|
-
/** Client (screen) point → the viewer's coordinates (content point) — the
|
|
180
|
-
* one platform-bound hit-test. */
|
|
181
|
-
toContentPoint(clientX: number, clientY: number): Point;
|
|
182
|
-
/** Content point → client (screen) px — the exact inverse of `toContentPoint`
|
|
183
|
-
* (rotation applied). Lets viewport-space UI (e.g. a selection menu) anchor to a
|
|
184
|
-
* page point WITHOUT a Stage camera, so it works the same in `<PageView>`. */
|
|
185
|
-
toClientPoint(p: Point): Point;
|
|
186
|
-
/** Content rect → client (screen) px AABB. Rect analog of `toClientPoint`
|
|
187
|
-
* for upright viewport-space UI that frames a selected page region. */
|
|
188
|
-
toClientRect(rect: Rect): Rect;
|
|
189
|
-
/**
|
|
190
|
-
* The page-view DEMAND for raster planning uses dependency inversion:
|
|
191
|
-
* plugin-render defines the shape; the host that CREATED this
|
|
192
|
-
* context fills it — as a PULL. The Stage host's getter closes over the
|
|
193
|
-
* stage capability and reads `VisiblePage.visibleRect` live at call time
|
|
194
|
-
* (visibility is the STAGE's data; adapters never re-derive camera math or
|
|
195
|
-
* cache a copy). Three states, three meanings: a real sub-rect (visible),
|
|
196
|
-
* a ZERO rect (stage host, page currently off-screen — want nothing), and
|
|
197
|
-
* an undefined getter (stage-less `<PageView>` — whole page visible, which
|
|
198
|
-
* a thumbnail-sized demand turns into "never engages" by arithmetic).
|
|
199
|
-
*/
|
|
200
|
-
getViewDemand?: () => PageViewDemand;
|
|
201
|
-
/**
|
|
202
|
-
* The hosting VIEW's identity — the stage lens id (`stage.lensId()`) or a
|
|
203
|
-
* per-instance PageView id. IDENTITY, not an option: per-view raster
|
|
204
|
-
* planning (tiles) keys its state by this, so two views showing the SAME
|
|
205
|
-
* page never fight over one plan (a thumbnail rail's never-engaging demand
|
|
206
|
-
* must not disturb the main view's tiles). Every page context host must
|
|
207
|
-
* say which view it is.
|
|
208
|
-
*/
|
|
209
|
-
view: string;
|
|
210
|
-
}
|
|
211
|
-
declare const PageProvider: React.Provider<PageContextValue | null>;
|
|
212
|
-
declare function usePage(): PageContextValue;
|
|
213
|
-
declare function makePageContext(documentId: string, view: string, pon: number, pageIndex: number, frame: PageFrame, transform: PageTransform, getRect: () => DOMRect, getViewDemand?: () => PageViewDemand): PageContextValue;
|
|
214
|
-
//#endregion
|
|
215
|
-
export { usePage as C, useOptionalSelector as S, useDocumentStatus as _, EmbedPDF as a, useKernelValue as b, Viewer as c, runtime_d_exports as d, shallowArray as f, useDocumentId as g, useCapabilityEvent as h, DocumentScopeProps as i, ViewerProps as l, useCapability as m, DocumentGateProps as n, PageContextValue as o, useActiveDocumentId as p, DocumentScope as r, PageProvider as s, DocumentGate as t, makePageContext as u, useDocuments as v, useSelector as w, useOptionalCapability as x, useKernel as y };
|
|
216
|
-
//# sourceMappingURL=runtime-DE76hlnl.d.ts.map
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { AnyPlugin, CapabilityToken, Engine, EngineFactory, EventHook, InitialDocument, Kernel } from "@embedpdf/core";
|
|
3
|
-
import { PageFrame, PageTransform, Point, Rect } from "@embedpdf/core-geometry";
|
|
4
|
-
import { PageViewDemand } from "@embedpdf/plugin-render/contract";
|
|
5
|
-
declare namespace runtime_d_exports {
|
|
6
|
-
export { DocumentGate, DocumentGateProps, DocumentScope, DocumentScopeProps, EmbedPDF, PageContextValue, PageProvider, Viewer, ViewerProps, makePageContext, shallowArray, useActiveDocumentId, useCapability, useCapabilityEvent, useDocumentId, useDocumentStatus, useDocuments, useKernel, useKernelValue, useOptionalCapability, useOptionalSelector, usePage, useSelector };
|
|
7
|
-
}
|
|
8
|
-
import * as import__embedpdf_core from "@embedpdf/core";
|
|
9
|
-
declare function useKernel(): Kernel;
|
|
10
|
-
declare const shallowArray: <T>(a: readonly T[], b: readonly T[]) => boolean;
|
|
11
|
-
/** Read a value derived from the kernel, cached by equality (no tearing loop). */
|
|
12
|
-
declare function useKernelValue<R>(select: (k: Kernel) => R, isEqual?: (a: R, b: R) => boolean): R;
|
|
13
|
-
declare function useActiveDocumentId(): string | null;
|
|
14
|
-
/** The document id for this subtree: the nearest <DocumentScope>, else the active doc. */
|
|
15
|
-
declare function useDocumentId(): string | null;
|
|
16
|
-
interface DocumentScopeProps {
|
|
17
|
-
id: string;
|
|
18
|
-
children: React.ReactNode;
|
|
19
|
-
}
|
|
20
|
-
/** Bind a subtree to a specific document (panes, comparison). */
|
|
21
|
-
declare function DocumentScope({ id, children }: DocumentScopeProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
-
interface DocumentGateProps {
|
|
23
|
-
/** Shown while this subtree has NO document (empty workspace, docs still opening). */
|
|
24
|
-
fallback?: React.ReactNode;
|
|
25
|
-
children: React.ReactNode;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Render children only while this subtree has a READY document — the
|
|
29
|
-
* structural way to say "this UI is defined over a document". An empty
|
|
30
|
-
* workspace is a legitimate, designable state (the Viewer no longer blocks on
|
|
31
|
-
* documents so chrome can render at t≈0): workspace-scoped UI (toolbars,
|
|
32
|
-
* commands, i18n) lives OUTSIDE the gate; document-scoped UI (Stage, panels,
|
|
33
|
-
* page chrome) lives inside it, or reads through `useOptionalSelector`.
|
|
34
|
-
* A `loading`/`locked`/`error` tab renders `fallback` — so the gate's
|
|
35
|
-
* fallback doubles as the per-tab boot state; richer chrome (a password
|
|
36
|
-
* prompt, an error pane) branches on `useDocumentStatus()` beside the gate.
|
|
37
|
-
* Sibling of <DocumentScope>, which picks WHICH document; this one handles
|
|
38
|
-
* WHETHER.
|
|
39
|
-
*/
|
|
40
|
-
declare function DocumentGate({ fallback, children }: DocumentGateProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
-
/** Lifecycle status of this subtree's document (loading/locked/ready/error),
|
|
42
|
-
* or null with no document. The password prompt and error panes key off it. */
|
|
43
|
-
declare function useDocumentStatus(): import("@embedpdf/core").DocStatus | null;
|
|
44
|
-
/**
|
|
45
|
-
* Resolve a capability by token, binding document-scoped ones to this
|
|
46
|
-
* subtree's document. Resolution is a REACTIVE read (`tryCapability` through
|
|
47
|
-
* the kernel's one change stream), not a memoized call — under the
|
|
48
|
-
* request-time lifecycle a document can become resolvable while its id stays
|
|
49
|
-
* the same, so any id-keyed cache goes stale; subscribing makes staleness
|
|
50
|
-
* structurally impossible. Fail-fast: while unresolvable, this re-runs the
|
|
51
|
-
* strict resolver so the kernel's truthful reason (`no capability` / `no
|
|
52
|
-
* document` / `document is loading|locked`) is what throws.
|
|
53
|
-
*/
|
|
54
|
-
declare function useCapability<T>(token: CapabilityToken<T>): T;
|
|
55
|
-
/** Like `useCapability`, but null while the token can't resolve (no plugin,
|
|
56
|
-
* no document, or a document that isn't ready yet). */
|
|
57
|
-
declare function useOptionalCapability<T>(token: CapabilityToken<T>): T | null;
|
|
58
|
-
/** Subscribe to a selector over a (document-resolved) capability. */
|
|
59
|
-
declare function useSelector<C, R>(token: CapabilityToken<C>, select: (cap: C) => R, isEqual?: (a: R, b: R) => boolean): R;
|
|
60
|
-
/**
|
|
61
|
-
* Null-safe `useSelector`: `fallback` whenever the token can't resolve — no
|
|
62
|
-
* provider, or a document-scoped token with no document. For chrome that stays
|
|
63
|
-
* mounted across the empty-workspace state (a zoom readout, a mode band).
|
|
64
|
-
* `useSelector` stays strict (fail-fast) for code that KNOWS a document exists
|
|
65
|
-
* — e.g. anything inside a <DocumentGate>.
|
|
66
|
-
*
|
|
67
|
-
* The `select` guard also swallows reads through a capability whose document
|
|
68
|
-
* closed between the store notification and this render — that teardown race
|
|
69
|
-
* resolves to `fallback` for one frame, then re-renders against the new state.
|
|
70
|
-
*/
|
|
71
|
-
declare function useOptionalSelector<C, R>(token: CapabilityToken<C>, select: (cap: C) => R, fallback: R, isEqual?: (a: R, b: R) => boolean): R;
|
|
72
|
-
/**
|
|
73
|
-
* Subscribe to a capability's {@link EventHook} for the mounted lifetime —
|
|
74
|
-
* `useCapabilityEvent(ActionsToken, (c) => c.onAction, handler)`. Events
|
|
75
|
-
* carry occurrences, never state (a late subscriber that needs the current
|
|
76
|
-
* value uses `useSelector`). The handler rides a ref, so a fresh closure per
|
|
77
|
-
* render never resubscribes. Null-safe: no plugin/document → no subscription.
|
|
78
|
-
*/
|
|
79
|
-
declare function useCapabilityEvent<C, T>(token: CapabilityToken<C>, select: (cap: C) => EventHook<T>, handler: (event: T) => void): void;
|
|
80
|
-
/** The document registry (open/close/active/list), reactive. */
|
|
81
|
-
declare function useDocuments(): {
|
|
82
|
-
docs: import("@embedpdf/core").DocInfo[];
|
|
83
|
-
activeId: string | null;
|
|
84
|
-
open: (input: import("@embedpdf/core").OpenSource, options?: import("@embedpdf/core").OpenDocumentOptions) => Promise<string>;
|
|
85
|
-
unlock: (id: string, input: {
|
|
86
|
-
password: string;
|
|
87
|
-
}) => Promise<void>;
|
|
88
|
-
close: (id: string) => Promise<void>;
|
|
89
|
-
setActive: (id: string) => void;
|
|
90
|
-
move: (id: string, toIndex: number) => void;
|
|
91
|
-
swap: (a: string, b: string) => void;
|
|
92
|
-
download: (id?: string, opts?: {
|
|
93
|
-
mode?: import("@embedpdf/core").PdfSaveMode;
|
|
94
|
-
}) => Promise<Uint8Array>;
|
|
95
|
-
downloadLayer: (id?: string) => Promise<Uint8Array>;
|
|
96
|
-
};
|
|
97
|
-
interface ViewerProps {
|
|
98
|
-
/**
|
|
99
|
-
* The engine, as an instance or a thunk. Engines construct synchronously and
|
|
100
|
-
* boot lazily (`localEngine()` allocates nothing until first use), so
|
|
101
|
-
* ownership follows the SHAPE of what you pass:
|
|
102
|
-
*
|
|
103
|
-
* - An **instance** (`engine={engine}`) is BORROWED: the Viewer uses it and
|
|
104
|
-
* never destroys it, because you acquired it and therefore own it. The
|
|
105
|
-
* common path — a module-scope `const engine = localEngine()` shared
|
|
106
|
-
* across viewers and route changes. The Viewer calls `engine.warmup?.()`
|
|
107
|
-
* on mount so the boot overlaps app initialization.
|
|
108
|
-
* - A **thunk** (`engine={() => localEngine()}`) is VIEWER-OWNED: the
|
|
109
|
-
* Viewer calls it on mount and `destroy()`s the result on unmount. Use it
|
|
110
|
-
* for per-mount isolation (StrictMode/HMR-clean teardown, independent
|
|
111
|
-
* multi-viewer engines).
|
|
112
|
-
*
|
|
113
|
-
* Init-only: captured on first render; later identity changes are ignored (dev warns).
|
|
114
|
-
*/
|
|
115
|
-
engine: Engine | EngineFactory;
|
|
116
|
-
/** Init-only: captured on first render; later identity changes are ignored (dev warns). */
|
|
117
|
-
plugins: AnyPlugin[];
|
|
118
|
-
/** Documents to open on startup (with optional tab names). Init-only. */
|
|
119
|
-
initialDocuments?: InitialDocument[];
|
|
120
|
-
fallback?: React.ReactNode;
|
|
121
|
-
/** Rendered when kernel construction or `start()` fails. Without it a boot
|
|
122
|
-
* failure renders nothing — but never a silent forever-fallback. */
|
|
123
|
-
renderError?: (error: unknown) => React.ReactNode;
|
|
124
|
-
children: React.ReactNode;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Owns the kernel as an EFFECT-scoped resource: each effect setup creates and
|
|
128
|
-
* starts exactly one kernel; each cleanup destroys exactly that one. That is
|
|
129
|
-
* the contract StrictMode exercises (two kernels in dev, the first fully
|
|
130
|
-
* destroyed) — the kernel itself is never restarted after destroy.
|
|
131
|
-
*
|
|
132
|
-
* The kernel is published to context the moment it exists — before `start()`
|
|
133
|
-
* resolves — so the `fallback` can use workspace capabilities (i18n copy on a
|
|
134
|
-
* loading screen) exactly as before. The one exception is the very first
|
|
135
|
-
* render, which happens before the effect: it renders nothing. Children mount
|
|
136
|
-
* once `start()` resolves — which never touches the engine, so the shell is
|
|
137
|
-
* alive while WASM compiles or the transport connects. `initialDocuments`
|
|
138
|
-
* open in the BACKGROUND and stream into the registry (`useDocuments()` is
|
|
139
|
-
* reactive); per-document loading UI is the Stage's job, not a root gate.
|
|
140
|
-
*
|
|
141
|
-
* ENGINE OWNERSHIP. When `engine` is a thunk, the Viewer OWNS it: each effect
|
|
142
|
-
* setup constructs one engine (construction is synchronous and inert — boot
|
|
143
|
-
* happens lazily inside the engine) and each cleanup destroys exactly that one
|
|
144
|
-
* — after the kernel, so handles close first. When `engine` is an instance it
|
|
145
|
-
* is BORROWED and never destroyed here; the Viewer only calls `warmup?.()` so
|
|
146
|
-
* the WASM/transport boot overlaps plugin initialization. StrictMode's
|
|
147
|
-
* double-mount therefore constructs two independent thunk engines and tears
|
|
148
|
-
* the first fully down, matching the kernel's own effect-scoped lifecycle.
|
|
149
|
-
* That means dev-only double resource use (two worker spawns, two font
|
|
150
|
-
* fetches, briefly overlapping) — deliberate, because it is exactly the
|
|
151
|
-
* leak-detection contract StrictMode exists to exercise; production mounts
|
|
152
|
-
* once and boots once.
|
|
153
|
-
*/
|
|
154
|
-
declare function Viewer({ engine, plugins, initialDocuments, fallback, renderError, children }: ViewerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
155
|
-
declare const EmbedPDF: typeof Viewer;
|
|
156
|
-
/**
|
|
157
|
-
* PageContext — the seam. A layer depends ONLY on this, never on the Stage. So the
|
|
158
|
-
* same layer works inside a virtualized Stage and in a standalone <PageView>.
|
|
159
|
-
*/
|
|
160
|
-
interface PageContextValue {
|
|
161
|
-
documentId: string;
|
|
162
|
-
/** Durable page identity (PDF object number) — use for keys / render / annotations. */
|
|
163
|
-
pon: number;
|
|
164
|
-
/** Display index (page N) — use for ordering / human-facing page numbers. */
|
|
165
|
-
pageIndex: number;
|
|
166
|
-
/**
|
|
167
|
-
* Reserved chrome bands around the page (screen px per side). The page-chrome
|
|
168
|
-
* slot renders into the outer box (content + frame); these thicknesses size
|
|
169
|
-
* the bands — a label in the bottom band is `bottom:0; height: frame.bottom`.
|
|
170
|
-
*/
|
|
171
|
-
frame: PageFrame;
|
|
172
|
-
/**
|
|
173
|
-
* The single bridge between PDF points, view px, and device px for this page.
|
|
174
|
-
* Layers do ALL coordinate work through it — `toPixels` to place content-
|
|
175
|
-
* space overlays, `renderScale`/`deviceWidth` to render, `contentWidth` for
|
|
176
|
-
* page-relative sizing. Never re-derive `x * scale` or `* dpr`.
|
|
177
|
-
*/
|
|
178
|
-
transform: PageTransform;
|
|
179
|
-
/** Client (screen) point → the viewer's coordinates (content point) — the
|
|
180
|
-
* one platform-bound hit-test. */
|
|
181
|
-
toContentPoint(clientX: number, clientY: number): Point;
|
|
182
|
-
/** Content point → client (screen) px — the exact inverse of `toContentPoint`
|
|
183
|
-
* (rotation applied). Lets viewport-space UI (e.g. a selection menu) anchor to a
|
|
184
|
-
* page point WITHOUT a Stage camera, so it works the same in `<PageView>`. */
|
|
185
|
-
toClientPoint(p: Point): Point;
|
|
186
|
-
/** Content rect → client (screen) px AABB. Rect analog of `toClientPoint`
|
|
187
|
-
* for upright viewport-space UI that frames a selected page region. */
|
|
188
|
-
toClientRect(rect: Rect): Rect;
|
|
189
|
-
/**
|
|
190
|
-
* The page-view DEMAND for raster planning uses dependency inversion:
|
|
191
|
-
* plugin-render defines the shape; the host that CREATED this
|
|
192
|
-
* context fills it — as a PULL. The Stage host's getter closes over the
|
|
193
|
-
* stage capability and reads `VisiblePage.visibleRect` live at call time
|
|
194
|
-
* (visibility is the STAGE's data; adapters never re-derive camera math or
|
|
195
|
-
* cache a copy). Three states, three meanings: a real sub-rect (visible),
|
|
196
|
-
* a ZERO rect (stage host, page currently off-screen — want nothing), and
|
|
197
|
-
* an undefined getter (stage-less `<PageView>` — whole page visible, which
|
|
198
|
-
* a thumbnail-sized demand turns into "never engages" by arithmetic).
|
|
199
|
-
*/
|
|
200
|
-
getViewDemand?: () => PageViewDemand;
|
|
201
|
-
/**
|
|
202
|
-
* The hosting VIEW's identity — the stage lens id (`stage.lensId()`) or a
|
|
203
|
-
* per-instance PageView id. IDENTITY, not an option: per-view raster
|
|
204
|
-
* planning (tiles) keys its state by this, so two views showing the SAME
|
|
205
|
-
* page never fight over one plan (a thumbnail rail's never-engaging demand
|
|
206
|
-
* must not disturb the main view's tiles). Every page context host must
|
|
207
|
-
* say which view it is.
|
|
208
|
-
*/
|
|
209
|
-
view: string;
|
|
210
|
-
}
|
|
211
|
-
declare const PageProvider: React.Provider<PageContextValue | null>;
|
|
212
|
-
declare function usePage(): PageContextValue;
|
|
213
|
-
declare function makePageContext(documentId: string, view: string, pon: number, pageIndex: number, frame: PageFrame, transform: PageTransform, getRect: () => DOMRect, getViewDemand?: () => PageViewDemand): PageContextValue;
|
|
214
|
-
//#endregion
|
|
215
|
-
export { usePage as C, useOptionalSelector as S, useDocumentStatus as _, EmbedPDF as a, useKernelValue as b, Viewer as c, runtime_d_exports as d, shallowArray as f, useDocumentId as g, useCapabilityEvent as h, DocumentScopeProps as i, ViewerProps as l, useCapability as m, DocumentGateProps as n, PageContextValue as o, useActiveDocumentId as p, DocumentScope as r, PageProvider as s, DocumentGate as t, makePageContext as u, useDocuments as v, useSelector as w, useOptionalCapability as x, useKernel as y };
|
|
216
|
-
//# sourceMappingURL=runtime-umHA_xHt.d.cts.map
|