@embedpdf/react 3.0.0-next.10 → 3.0.0-next.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/{AnnotationListSnapshot-DDxHpJQU-BG32YXxG.d.ts → AnnotationListSnapshot-x6tKulNV-B799rYyi.d.cts} +223 -24
  2. package/dist/{AnnotationListSnapshot-DDxHpJQU-BG32YXxG.d.cts → AnnotationListSnapshot-x6tKulNV-B799rYyi.d.ts} +223 -24
  3. package/dist/actions.cjs +42 -0
  4. package/dist/actions.cjs.map +1 -0
  5. package/dist/actions.d.cts +18 -0
  6. package/dist/actions.d.ts +18 -0
  7. package/dist/actions.js +34 -0
  8. package/dist/actions.js.map +1 -0
  9. package/dist/annotation-BCED_p9H.d.cts +160 -0
  10. package/dist/annotation-anchors-CetwM1g7.js +15 -0
  11. package/dist/annotation-anchors-CetwM1g7.js.map +1 -0
  12. package/dist/annotation-anchors-DuYRBJLl.cjs +26 -0
  13. package/dist/annotation-anchors-DuYRBJLl.cjs.map +1 -0
  14. package/dist/annotation-hooks-BB5ZhPpf.cjs +16 -0
  15. package/dist/annotation-hooks-BB5ZhPpf.cjs.map +1 -0
  16. package/dist/annotation-hooks-Df8EmzDO.js +11 -0
  17. package/dist/annotation-hooks-Df8EmzDO.js.map +1 -0
  18. package/dist/annotation-k38KDlIZ.d.ts +160 -0
  19. package/dist/annotation-menu.cjs +5 -5
  20. package/dist/annotation-menu.cjs.map +1 -1
  21. package/dist/annotation-menu.js +2 -2
  22. package/dist/annotation-menu.js.map +1 -1
  23. package/dist/annotation.cjs +24 -29
  24. package/dist/annotation.cjs.map +1 -1
  25. package/dist/annotation.d.cts +2 -159
  26. package/dist/annotation.d.ts +2 -159
  27. package/dist/annotation.js +22 -27
  28. package/dist/annotation.js.map +1 -1
  29. package/dist/form-BwrLFpKN.js +805 -0
  30. package/dist/form-BwrLFpKN.js.map +1 -0
  31. package/dist/form-D-ZSfGmB.cjs +836 -0
  32. package/dist/form-D-ZSfGmB.cjs.map +1 -0
  33. package/dist/form.cjs +8 -551
  34. package/dist/form.d.cts +4 -21
  35. package/dist/form.d.ts +4 -21
  36. package/dist/form.js +3 -544
  37. package/dist/index.cjs +21 -11
  38. package/dist/index.d.cts +8 -7
  39. package/dist/index.d.ts +8 -7
  40. package/dist/index.js +9 -6
  41. package/dist/link.cjs +48 -8
  42. package/dist/link.cjs.map +1 -1
  43. package/dist/link.d.cts +2 -2
  44. package/dist/link.d.ts +2 -2
  45. package/dist/link.js +49 -9
  46. package/dist/link.js.map +1 -1
  47. package/dist/{runtime-Cvi0wQ4d.d.cts → runtime-DE76hlnl.d.ts} +13 -5
  48. package/dist/{runtime-DXxr8T4L.d.ts → runtime-umHA_xHt.d.cts} +13 -5
  49. package/dist/runtime.cjs +19 -0
  50. package/dist/runtime.cjs.map +1 -1
  51. package/dist/runtime.d.cts +2 -2
  52. package/dist/runtime.d.ts +2 -2
  53. package/dist/runtime.js +19 -1
  54. package/dist/runtime.js.map +1 -1
  55. package/dist/scrollbar.cjs +3 -3
  56. package/dist/scrollbar.cjs.map +1 -1
  57. package/dist/scrollbar.d.cts +1 -1
  58. package/dist/scrollbar.d.ts +1 -1
  59. package/dist/scrollbar.js +1 -1
  60. package/dist/scrollbar.js.map +1 -1
  61. package/dist/search.d.cts +1 -1
  62. package/dist/search.d.ts +1 -1
  63. package/dist/selection.cjs +2 -2
  64. package/dist/selection.cjs.map +1 -1
  65. package/dist/selection.d.cts +1 -1
  66. package/dist/selection.d.ts +1 -1
  67. package/dist/selection.js +1 -1
  68. package/dist/selection.js.map +1 -1
  69. package/dist/stage.cjs +2 -2
  70. package/dist/stage.cjs.map +1 -1
  71. package/dist/stage.d.cts +1 -1
  72. package/dist/stage.d.ts +1 -1
  73. package/dist/stage.js +1 -1
  74. package/dist/stage.js.map +1 -1
  75. package/dist/stamp.cjs +7 -0
  76. package/dist/stamp.cjs.map +1 -1
  77. package/dist/stamp.d.cts +2 -1
  78. package/dist/stamp.d.ts +2 -1
  79. package/dist/stamp.js +2 -1
  80. package/dist/stamp.js.map +1 -1
  81. package/dist/toolbar.cjs +4 -4
  82. package/dist/toolbar.cjs.map +1 -1
  83. package/dist/toolbar.d.cts +1 -1
  84. package/dist/toolbar.d.ts +1 -1
  85. package/dist/toolbar.js +1 -1
  86. package/dist/toolbar.js.map +1 -1
  87. package/package.json +30 -24
  88. package/dist/form.cjs.map +0 -1
  89. package/dist/form.js.map +0 -1
package/dist/form.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"form.cjs","names":["useOptionalCapability","FormToken","StageToken","useSelector","useCapability","usePage","InteractionToken","shallowArray","useAnnotationSelected"],"sources":["../src/form.tsx"],"sourcesContent":["/**\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 * choice → an invisible native <select> over the picture (v2's trick):\n * the browser owns the dropdown, the engine owns the pixels.\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 { useEffect, useRef, useState } from 'react';\nimport { FormToken } from '@embedpdf/plugin-form';\nimport type {\n FillItem,\n FormFieldDTO,\n FormUiEffect,\n FormUiEffectProvider,\n} from '@embedpdf/plugin-form';\nimport { InteractionToken } from '@embedpdf/plugin-interaction';\nimport { StageToken } from '@embedpdf/plugin-stage';\nimport type { Rect } from '@embedpdf/core-annotation';\n\nimport { useAnnotationSelected } from './annotation';\nimport type { AnnotationRenderer, AnnotationRendererProps } from './annotation';\nimport {\n shallowArray,\n useCapability,\n useOptionalCapability,\n usePage,\n useSelector,\n} from './runtime';\nimport type { PageContextValue } from './runtime';\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\nexport interface FormScriptingUiHandlers {\n alert?: (message: string, effect: Extract<FormUiEffect, { kind: 'alert' }>) => void;\n print?: (effect: Extract<FormUiEffect, { kind: 'print' }>) => void;\n gotoPage?: (page: number, effect: Extract<FormUiEffect, { kind: 'gotoPage' }>) => void;\n}\n\n/**\n * Fulfil form-script UI requests for the active document. By default alerts use\n * the browser dialog, page navigation uses the main Stage, and print delegates\n * to the browser. Pass handlers (or one raw provider) to replace that policy.\n */\nexport function useFormScriptingProvider(\n adapter?: FormScriptingUiHandlers | FormUiEffectProvider,\n): void {\n const form = useOptionalCapability(FormToken);\n const stage = useOptionalCapability(StageToken);\n const adapterRef = useRef(adapter);\n adapterRef.current = adapter;\n\n useEffect(() => {\n if (!form) return;\n const provider: FormUiEffectProvider = (effect) => {\n const current = adapterRef.current;\n if (typeof current === 'function') {\n current(effect);\n return;\n }\n switch (effect.kind) {\n case 'alert':\n if (current?.alert) current.alert(effect.message, effect);\n else if (typeof globalThis.alert === 'function') globalThis.alert(effect.message);\n break;\n case 'gotoPage':\n if (current?.gotoPage) current.gotoPage(effect.page, effect);\n else stage?.goToPage(effect.page);\n break;\n case 'print':\n if (current?.print) current.print(effect);\n else if (typeof globalThis.print === 'function') globalThis.print();\n break;\n }\n };\n form.setUiEffectProvider(provider);\n return () => form.setUiEffectProvider(null);\n }, [form, stage]);\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 }\n}\n\nfunction ButtonWidget({ fill, item, page, appearance }: WidgetProps<'button'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLButtonElement>();\n const b = viewBox(item.box, page);\n return (\n <button\n ref={wrap}\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 left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n boxSizing: 'border-box',\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: fill.disabled ? 'default' : 'pointer',\n pointerEvents: fill.disabled ? 'none' : 'auto',\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n </button>\n );\n}\n\nfunction TextWidget({ fill, item, page, appearance }: WidgetProps<'text'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\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 };\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 style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n pointerEvents: fill.disabled ? 'none' : '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 [focused, setFocused] = useState(false);\n const b = viewBox(item.box, page);\n const toggle = () => {\n if (fill.disabled) return;\n // Checkbox: click toggles on/off (null clears). Radio: click always\n // selects its own on-state — no untoggle, per PDF/Acrobat convention.\n void form.toggle(fill.key, fill.kind === 'checkbox' && fill.checked ? null : fill.onState);\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 onClick={toggle}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n toggle();\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: fill.disabled ? 'none' : 'auto',\n outline: focused ? '2px solid rgba(66, 133, 244, 0.8)' : 'none',\n outlineOffset: -2,\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n </div>\n );\n}\n\nfunction ChoiceWidget({ 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 const multiple = fill.kind === 'list' && fill.multi;\n return (\n <div\n ref={wrap}\n style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n pointerEvents: fill.disabled ? 'none' : 'auto',\n outline: focused ? '2px solid rgba(66, 133, 244, 0.8)' : 'none',\n outlineOffset: -2,\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n {/* v2's trick: an invisible NATIVE select owns the dropdown/keyboard;\n the engine's baked appearance stays the visible value. Keyed +\n uncontrolled so an in-flight write never snaps the selection back. */}\n <select\n key={fill.selected.join('\\0')}\n multiple={multiple}\n size={fill.kind === 'list' ? Math.max(2, fill.options.length) : undefined}\n defaultValue={multiple ? fill.selected : (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 }}\n >\n {fill.options.map((o, i) => (\n <option key={i} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\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/** 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 ...css,\n fontSize,\n padding: '0 3px',\n ...(item.comb ? { letterSpacing: css.width / Math.max(1, item.maxLength ?? 1) / 2 } : {}),\n };\n return 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' }}\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}\n />\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 css = fillBox(item, page);\n const glyphSize = Math.min(css.width, css.height) * 0.72;\n return (\n <button\n role={item.kind}\n aria-checked={item.checked}\n aria-label={item.label}\n disabled={item.disabled}\n onClick={() =>\n // Checkbox re-click clears; radio click always selects its state.\n void form.toggle(item.key, item.kind === 'checkbox' && item.checked ? null : item.onState)\n }\n style={{\n ...controlBase,\n ...css,\n cursor: item.disabled ? 'default' : 'pointer',\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 }}\n >\n {item.checked ? (item.kind === 'radio' ? '●' : '✓') : ''}\n </button>\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 return (\n <select\n aria-label={item.label}\n multiple={item.multi}\n disabled={item.disabled}\n value={item.multi ? item.selected : (item.selected[0] ?? '')}\n onChange={(e) => {\n const values = item.multi\n ? Array.from(e.target.selectedOptions).map((o) => o.value)\n : [e.target.value];\n void form.choose(item.key, values);\n }}\n style={{ ...controlBase, ...css, fontSize: Math.max(9, Math.min(css.height * 0.55, 18)) }}\n >\n {!item.multi && 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 );\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 const css = fillBox(item, page);\n return (\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 ...css,\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: item.disabled ? 'default' : 'pointer',\n }}\n />\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 ) : 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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"}
package/dist/form.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"form.js","names":[],"sources":["../src/form.tsx"],"sourcesContent":["/**\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 * choice → an invisible native <select> over the picture (v2's trick):\n * the browser owns the dropdown, the engine owns the pixels.\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 { useEffect, useRef, useState } from 'react';\nimport { FormToken } from '@embedpdf/plugin-form';\nimport type {\n FillItem,\n FormFieldDTO,\n FormUiEffect,\n FormUiEffectProvider,\n} from '@embedpdf/plugin-form';\nimport { InteractionToken } from '@embedpdf/plugin-interaction';\nimport { StageToken } from '@embedpdf/plugin-stage';\nimport type { Rect } from '@embedpdf/core-annotation';\n\nimport { useAnnotationSelected } from './annotation';\nimport type { AnnotationRenderer, AnnotationRendererProps } from './annotation';\nimport {\n shallowArray,\n useCapability,\n useOptionalCapability,\n usePage,\n useSelector,\n} from './runtime';\nimport type { PageContextValue } from './runtime';\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\nexport interface FormScriptingUiHandlers {\n alert?: (message: string, effect: Extract<FormUiEffect, { kind: 'alert' }>) => void;\n print?: (effect: Extract<FormUiEffect, { kind: 'print' }>) => void;\n gotoPage?: (page: number, effect: Extract<FormUiEffect, { kind: 'gotoPage' }>) => void;\n}\n\n/**\n * Fulfil form-script UI requests for the active document. By default alerts use\n * the browser dialog, page navigation uses the main Stage, and print delegates\n * to the browser. Pass handlers (or one raw provider) to replace that policy.\n */\nexport function useFormScriptingProvider(\n adapter?: FormScriptingUiHandlers | FormUiEffectProvider,\n): void {\n const form = useOptionalCapability(FormToken);\n const stage = useOptionalCapability(StageToken);\n const adapterRef = useRef(adapter);\n adapterRef.current = adapter;\n\n useEffect(() => {\n if (!form) return;\n const provider: FormUiEffectProvider = (effect) => {\n const current = adapterRef.current;\n if (typeof current === 'function') {\n current(effect);\n return;\n }\n switch (effect.kind) {\n case 'alert':\n if (current?.alert) current.alert(effect.message, effect);\n else if (typeof globalThis.alert === 'function') globalThis.alert(effect.message);\n break;\n case 'gotoPage':\n if (current?.gotoPage) current.gotoPage(effect.page, effect);\n else stage?.goToPage(effect.page);\n break;\n case 'print':\n if (current?.print) current.print(effect);\n else if (typeof globalThis.print === 'function') globalThis.print();\n break;\n }\n };\n form.setUiEffectProvider(provider);\n return () => form.setUiEffectProvider(null);\n }, [form, stage]);\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 }\n}\n\nfunction ButtonWidget({ fill, item, page, appearance }: WidgetProps<'button'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLButtonElement>();\n const b = viewBox(item.box, page);\n return (\n <button\n ref={wrap}\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 left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n boxSizing: 'border-box',\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: fill.disabled ? 'default' : 'pointer',\n pointerEvents: fill.disabled ? 'none' : 'auto',\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n </button>\n );\n}\n\nfunction TextWidget({ fill, item, page, appearance }: WidgetProps<'text'>) {\n const form = useCapability(FormToken);\n const wrap = useIsolated<HTMLDivElement>();\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 };\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 style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n pointerEvents: fill.disabled ? 'none' : '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 [focused, setFocused] = useState(false);\n const b = viewBox(item.box, page);\n const toggle = () => {\n if (fill.disabled) return;\n // Checkbox: click toggles on/off (null clears). Radio: click always\n // selects its own on-state — no untoggle, per PDF/Acrobat convention.\n void form.toggle(fill.key, fill.kind === 'checkbox' && fill.checked ? null : fill.onState);\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 onClick={toggle}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onKeyDown={(e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n toggle();\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: fill.disabled ? 'none' : 'auto',\n outline: focused ? '2px solid rgba(66, 133, 244, 0.8)' : 'none',\n outlineOffset: -2,\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n </div>\n );\n}\n\nfunction ChoiceWidget({ 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 const multiple = fill.kind === 'list' && fill.multi;\n return (\n <div\n ref={wrap}\n style={{\n position: 'absolute',\n left: b.left,\n top: b.top,\n width: b.width,\n height: b.height,\n pointerEvents: fill.disabled ? 'none' : 'auto',\n outline: focused ? '2px solid rgba(66, 133, 244, 0.8)' : 'none',\n outlineOffset: -2,\n }}\n >\n <Picture page={page} appearance={appearance} apBox={item.apBox} frame={b} />\n {/* v2's trick: an invisible NATIVE select owns the dropdown/keyboard;\n the engine's baked appearance stays the visible value. Keyed +\n uncontrolled so an in-flight write never snaps the selection back. */}\n <select\n key={fill.selected.join('\\0')}\n multiple={multiple}\n size={fill.kind === 'list' ? Math.max(2, fill.options.length) : undefined}\n defaultValue={multiple ? fill.selected : (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 }}\n >\n {fill.options.map((o, i) => (\n <option key={i} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\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/** 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 ...css,\n fontSize,\n padding: '0 3px',\n ...(item.comb ? { letterSpacing: css.width / Math.max(1, item.maxLength ?? 1) / 2 } : {}),\n };\n return 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' }}\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}\n />\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 css = fillBox(item, page);\n const glyphSize = Math.min(css.width, css.height) * 0.72;\n return (\n <button\n role={item.kind}\n aria-checked={item.checked}\n aria-label={item.label}\n disabled={item.disabled}\n onClick={() =>\n // Checkbox re-click clears; radio click always selects its state.\n void form.toggle(item.key, item.kind === 'checkbox' && item.checked ? null : item.onState)\n }\n style={{\n ...controlBase,\n ...css,\n cursor: item.disabled ? 'default' : 'pointer',\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 }}\n >\n {item.checked ? (item.kind === 'radio' ? '●' : '✓') : ''}\n </button>\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 return (\n <select\n aria-label={item.label}\n multiple={item.multi}\n disabled={item.disabled}\n value={item.multi ? item.selected : (item.selected[0] ?? '')}\n onChange={(e) => {\n const values = item.multi\n ? Array.from(e.target.selectedOptions).map((o) => o.value)\n : [e.target.value];\n void form.choose(item.key, values);\n }}\n style={{ ...controlBase, ...css, fontSize: Math.max(9, Math.min(css.height * 0.55, 18)) }}\n >\n {!item.multi && 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 );\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 const css = fillBox(item, page);\n return (\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 ...css,\n padding: 0,\n border: 0,\n background: 'transparent',\n cursor: item.disabled ? 'default' : 'pointer',\n }}\n />\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 ) : 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":";;;;;;;;;;AA6DA,SAAS,QAAQ,GAAS,MAAwB;CAChD,MAAM,KAAK,KAAK,UAAU,SAAS;EAAE,GAAG,EAAE;EAAG,GAAG,EAAE;CAAE,CAAC;CACrD,MAAM,KAAK,KAAK,UAAU,SAAS;EAAE,GAAG,EAAE,IAAI,EAAE;EAAO,GAAG,EAAE,IAAI,EAAE;CAAO,CAAC;CAC1E,OAAO;EAAE,MAAM,GAAG;EAAG,KAAK,GAAG;EAAG,OAAO,GAAG,IAAI,GAAG;EAAG,QAAQ,GAAG,IAAI,GAAG;CAAE;AAC1E;;;;;;AAOA,SAAS,cAAqC;CAC5C,MAAM,MAAM,OAAU,IAAI;CAC1B,gBAAgB;EACd,MAAM,KAAK,IAAI;EACf,IAAI,CAAC,IAAI;EACT,MAAM,QAAQ,MAAa,EAAE,gBAAgB;EAC7C,GAAG,iBAAiB,eAAe,IAAI;EACvC,aAAa,GAAG,oBAAoB,eAAe,IAAI;CACzD,GAAG,CAAC,CAAC;CACL,OAAO;AACT;;;;;;AAaA,SAAgB,yBACd,SACM;CACN,MAAM,OAAO,sBAAsB,SAAS;CAC5C,MAAM,QAAQ,sBAAsB,UAAU;CAC9C,MAAM,aAAa,OAAO,OAAO;CACjC,WAAW,UAAU;CAErB,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,YAAkC,WAAW;GACjD,MAAM,UAAU,WAAW;GAC3B,IAAI,OAAO,YAAY,YAAY;IACjC,QAAQ,MAAM;IACd;GACF;GACA,QAAQ,OAAO,MAAf;IACE,KAAK;KACH,IAAI,SAAS,OAAO,QAAQ,MAAM,OAAO,SAAS,MAAM;UACnD,IAAI,OAAO,WAAW,UAAU,YAAY,WAAW,MAAM,OAAO,OAAO;KAChF;IACF,KAAK;KACH,IAAI,SAAS,UAAU,QAAQ,SAAS,OAAO,MAAM,MAAM;UACtD,OAAO,SAAS,OAAO,IAAI;KAChC;IACF,KAAK;KACH,IAAI,SAAS,OAAO,QAAQ,MAAM,MAAM;UACnC,IAAI,OAAO,WAAW,UAAU,YAAY,WAAW,MAAM;KAClE;GACJ;EACF;EACA,KAAK,oBAAoB,QAAQ;EACjC,aAAa,KAAK,oBAAoB,IAAI;CAC5C,GAAG,CAAC,MAAM,KAAK,CAAC;AAClB;;AAKA,SAAS,QAAQ,EACf,MACA,YACA,OACA,OACA,UAWC;CACD,IAAI,CAAC,YAAY,OAAO;CACxB,MAAM,IAAI,QAAQ,SAAS,WAAW,KAAK,IAAI;CAC/C,OACE,oBAAC,OAAD;EACE,KAAK,WAAW;EAChB,KAAI;EACJ,WAAW;EACX,OAAO;GACL,UAAU;GACV,MAAM,EAAE,QAAQ,OAAO,QAAQ;GAC/B,KAAK,EAAE,OAAO,OAAO,OAAO;GAC5B,OAAO,EAAE;GACT,QAAQ,EAAE;GAGV,UAAU;GACV,eAAe;GACf,YAAY,SAAS,WAAW;EAClC;CACD,CAAA;AAEL;;;;;;;AAeA,SAAS,WAAW,EAAE,MAAM,MAAM,cAAuC;CACvE,MAAM,QAAQ,KAAK,KAAK,SAAS,iBAAiB,KAAK,IAAI,oBAAoB;CAE/E,MAAM,OAAO,YAAY,YAAY,MAAO,QAAQ,IAAI,EAAE,SAAS,KAAK,IAAI,IAAK;CAEjF,IAAI,CAAC,MAAM,OAAO,oBAAC,SAAD;EAAe;EAAkB;EAAY,OAAO,KAAK;CAAQ,CAAA;CACnF,QAAQ,KAAK,SAAb;EACE,KAAK,QACH,OAAO,oBAAC,YAAD;GAAkB;GAAY;GAAY;GAAkB;EAAa,CAAA;EAClF,KAAK,UACH,OAAO,oBAAC,cAAD;GAAoB;GAAY;GAAY;GAAkB;EAAa,CAAA;EACpF,KAAK,UACH,OAAO,oBAAC,cAAD;GAAoB;GAAY;GAAY;GAAkB;EAAa,CAAA;EACpF,KAAK,UACH,OAAO,oBAAC,cAAD;GAAoB;GAAY;GAAY;GAAkB;EAAa,CAAA;CACtF;AACF;AAEA,SAAS,aAAa,EAAE,MAAM,MAAM,MAAM,cAAqC;CAC7E,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,OAAO,YAA+B;CAC5C,MAAM,IAAI,QAAQ,KAAK,KAAK,IAAI;CAChC,OACE,oBAAC,UAAD;EACE,KAAK;EACL,MAAK;EACL,cAAY,KAAK;EACjB,UAAU,KAAK;EACf,eAAe;GACb,IAAI,KAAK,KAAK,KAAU,eAAe,KAAK,KAAK,KAAK,GAAG;EAC3D;EACA,OAAO;GACL,UAAU;GACV,MAAM,EAAE;GACR,KAAK,EAAE;GACP,OAAO,EAAE;GACT,QAAQ,EAAE;GACV,WAAW;GACX,SAAS;GACT,QAAQ;GACR,YAAY;GACZ,QAAQ,KAAK,WAAW,YAAY;GACpC,eAAe,KAAK,WAAW,SAAS;EAC1C;EAEA,UAAA,oBAAC,SAAD;GAAe;GAAkB;GAAY,OAAO,KAAK;GAAO,OAAO;EAAI,CAAA;CACrE,CAAA;AAEZ;AAEA,SAAS,WAAW,EAAE,MAAM,MAAM,MAAM,cAAmC;CACzE,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,OAAO,YAA4B;CAMzC,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAS,KAAK,KAAK;CAC7C,MAAM,YAAY,OAAO,KAAK;CAE9B,gBAAgB;EACd,IAAI,CAAC,SAAS,SAAS,KAAK,KAAK;CAEnC,GAAG,CAAC,KAAK,OAAO,OAAO,CAAC;CAExB,MAAM,IAAI,QAAQ,KAAK,KAAK,IAAI;CAChC,MAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,EAAE,QAAQ,KAAK,IAAI,QAAQ;CAI9D,MAAM,WACJ,KAAK,QAAQ,KAAK,KAAK,WAAW,IAC9B,KAAK,KAAK,WAAW,QACrB,KAAK,YACH,KAAK,QACL,KAAK,IAAI,GAAG,EAAE,SAAS,GAAI;CACnC,MAAM,cAAmC;EACvC,UAAU;EACV,OAAO;EACP,OAAO;EACP,QAAQ;EACR,WAAW;EACX,QAAQ;EACR,SAAS,UAAU,sCAAsC;EACzD,eAAe;EACf,SAAS;EACT,QAAQ;EACR,YAAY,KAAK,MAAM,iBAAiB;EACxC,OAAO,KAAK,MAAM,aAAa;EAC/B,YAAY,KAAK,MAAM,cAAc;EACrC;EACA,WAAW,KAAK,MAAM,aAAa;EACnC,QAAQ;EACR,QAAQ;EACR,SAAS,UAAU,IAAI;CACzB;CACA,MAAM,cAAc;EAClB,OAAO;EACP,WAAW,KAAK,aAAa,KAAA;EAC7B,cAAc,KAAK;EACnB,UAAU,KAAK;EACf,eAAe,WAAW,IAAI;EAC9B,WAAW,MACT,SAAS,EAAE,OAAO,KAAK;EACzB,cAAc;GACZ,WAAW,KAAK;GAChB,IAAI,UAAU,SAAS;IACrB,UAAU,UAAU;IACpB,SAAS,KAAK,KAAK;IACnB;GACF;GACA,IAAI,UAAU,KAAK,OAAO,KAAU,QAAQ,KAAK,KAAK,KAAK;EAC7D;EACA,OAAO;CACT;CACA,MAAM,UAAU,MAAmE;EACjF,IAAI,EAAE,QAAQ,UAAU;GACtB,UAAU,UAAU;GACpB,EAAE,cAAc,KAAK;EACvB;EACA,IAAI,EAAE,QAAQ,WAAW,CAAC,KAAK,WAAW,EAAE,cAAc,KAAK;CACjE;CAEA,OACE,qBAAC,OAAD;EACE,KAAK;EACL,OAAO;GACL,UAAU;GACV,MAAM,EAAE;GACR,KAAK,EAAE;GACP,OAAO,EAAE;GACT,QAAQ,EAAE;GACV,eAAe,KAAK,WAAW,SAAS;EAC1C;EATF,UAAA,CAWE,oBAAC,SAAD;GAAe;GAAkB;GAAY,OAAO,KAAK;GAAO,OAAO;GAAG,QAAQ;EAAU,CAAA,GAC3F,KAAK,YACJ,oBAAC,YAAD;GAAU,GAAI;GAAa,WAAW;EAAS,CAAA,IAE/C,oBAAC,SAAD;GAAO,GAAI;GAAa,MAAM,KAAK,WAAW,aAAa;GAAQ,WAAW;EAAS,CAAA,CAEtF;;AAET;AAEA,SAAS,aAAa,EAAE,MAAM,MAAM,MAAM,cAAqC;CAC7E,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,OAAO,YAA4B;CACzC,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,IAAI,QAAQ,KAAK,KAAK,IAAI;CAChC,MAAM,eAAe;EACnB,IAAI,KAAK,UAAU;EAGnB,KAAU,OAAO,KAAK,KAAK,KAAK,SAAS,cAAc,KAAK,UAAU,OAAO,KAAK,OAAO;CAC3F;CACA,OACE,oBAAC,OAAD;EACE,KAAK;EACL,MAAM,KAAK,SAAS,aAAa,aAAa;EAC9C,gBAAc,KAAK;EACnB,cAAY,KAAK;EACjB,UAAU,KAAK,WAAW,KAAK;EAC/B,SAAS;EACT,eAAe,WAAW,IAAI;EAC9B,cAAc,WAAW,KAAK;EAC9B,YAAY,MAAM;GAChB,IAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,SAAS;IACtC,EAAE,eAAe;IACjB,OAAO;GACT;EACF;EACA,OAAO;GACL,UAAU;GACV,MAAM,EAAE;GACR,KAAK,EAAE;GACP,OAAO,EAAE;GACT,QAAQ,EAAE;GACV,QAAQ,KAAK,WAAW,YAAY;GACpC,eAAe,KAAK,WAAW,SAAS;GACxC,SAAS,UAAU,sCAAsC;GACzD,eAAe;EACjB;EAEA,UAAA,oBAAC,SAAD;GAAe;GAAkB;GAAY,OAAO,KAAK;GAAO,OAAO;EAAI,CAAA;CACxE,CAAA;AAET;AAEA,SAAS,aAAa,EAAE,MAAM,MAAM,MAAM,cAAqC;CAC7E,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,OAAO,YAA4B;CACzC,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,IAAI,QAAQ,KAAK,KAAK,IAAI;CAChC,MAAM,WAAW,KAAK,SAAS,UAAU,KAAK;CAC9C,OACE,qBAAC,OAAD;EACE,KAAK;EACL,OAAO;GACL,UAAU;GACV,MAAM,EAAE;GACR,KAAK,EAAE;GACP,OAAO,EAAE;GACT,QAAQ,EAAE;GACV,eAAe,KAAK,WAAW,SAAS;GACxC,SAAS,UAAU,sCAAsC;GACzD,eAAe;EACjB;EAXF,UAAA,CAaE,oBAAC,SAAD;GAAe;GAAkB;GAAY,OAAO,KAAK;GAAO,OAAO;EAAI,CAAA,GAI3E,oBAAC,UAAD;GAEY;GACV,MAAM,KAAK,SAAS,SAAS,KAAK,IAAI,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAA;GAChE,cAAc,WAAW,KAAK,WAAY,KAAK,SAAS,MAAM;GAC9D,cAAY,KAAK;GACjB,UAAU,KAAK;GACf,eAAe,WAAW,IAAI;GAC9B,cAAc,WAAW,KAAK;GAC9B,WAAW,MAAM;IACf,MAAM,SAAS,MAAM,KAAK,EAAE,cAAc,eAAe,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;IAC7E,KAAU,OAAO,KAAK,KAAK,MAAM;GACnC;GACA,OAAO;IACL,UAAU;IACV,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ,KAAK,WAAW,YAAY;GACtC;GAEC,UAAA,KAAK,QAAQ,KAAK,GAAG,MACpB,oBAAC,UAAD;IAAgB,OAAO,EAAE;IACtB,UAAA,EAAE;GACG,GAFK,CAEL,CACT;EACK,GA1BD,KAAK,SAAS,KAAK,IAAI,CA0BtB,CACL;;AAET;;;;;;;AAQA,MAAa,qBAAyC;CACpD,UAAU;CACV,WAAW;AACb;AAIA,MAAM,cAAmC;CACvC,UAAU;CACV,WAAW;CACX,QAAQ;CACR,YAAY;CACZ,cAAc;CACd,MAAM;AACR;AAEA,MAAM,WAAW,MAAgB,SAA2B,QAAQ,KAAK,KAAK,IAAI;;;AAIlF,SAAS,SAAS,EAChB,MACA,QAIC;CACD,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,CAAC,OAAO,YAAY,SAAS,KAAK,KAAK;CAE7C,gBAAgB,SAAS,KAAK,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC;CAElD,MAAM,MAAM,QAAQ,MAAM,IAAI;CAC9B,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,KAAM,EAAE,CAAC;CAC5D,MAAM,eAAe;EACnB,IAAI,UAAU,KAAK,OAAO,KAAU,QAAQ,KAAK,KAAK,KAAK,CAAC,CAAC,YAAY,SAAS,KAAK,KAAK,CAAC;CAC/F;CACA,MAAM,SAA8B;EAClC,GAAG;EACH,GAAG;EACH;EACA,SAAS;EACT,GAAI,KAAK,OAAO,EAAE,eAAe,IAAI,QAAQ,KAAK,IAAI,GAAG,KAAK,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;CACzF;CACA,OAAO,KAAK,YACV,oBAAC,YAAD;EACE,cAAY,KAAK;EACjB,OAAO;EACP,UAAU,KAAK;EACf,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;EACxC,QAAQ;EACR,OAAO;GAAE,GAAG;GAAQ,QAAQ;EAAO;CACpC,CAAA,IAED,oBAAC,SAAD;EACE,cAAY,KAAK;EACjB,MAAM,KAAK,WAAW,aAAa;EACnC,OAAO;EACP,WAAW,KAAK,aAAa,KAAA;EAC7B,UAAU,KAAK;EACf,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;EACxC,QAAQ;EACR,YAAY,MAAM;GAChB,IAAI,EAAE,QAAQ,SAAS,EAAG,OAA4B,KAAK;EAC7D;EACA,OAAO;CACR,CAAA;AAEL;AAEA,SAAS,WAAW,EAClB,MACA,QAIC;CACD,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,MAAM,QAAQ,MAAM,IAAI;CAC9B,MAAM,YAAY,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI;CACpD,OACE,oBAAC,UAAD;EACE,MAAM,KAAK;EACX,gBAAc,KAAK;EACnB,cAAY,KAAK;EACjB,UAAU,KAAK;EACf,eAEE,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,SAAS,cAAc,KAAK,UAAU,OAAO,KAAK,OAAO;EAE3F,OAAO;GACL,GAAG;GACH,GAAG;GACH,QAAQ,KAAK,WAAW,YAAY;GACpC,SAAS;GACT,YAAY;GACZ,SAAS;GACT,cAAc,KAAK,SAAS,UAAU,QAAQ;GAC9C,UAAU;GACV,YAAY;GACZ,OAAO;EACT;EAEC,UAAA,KAAK,UAAW,KAAK,SAAS,UAAU,MAAM,MAAO;CAChD,CAAA;AAEZ;AAEA,SAAS,WAAW,EAClB,MACA,QAIC;CACD,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,MAAM,QAAQ,MAAM,IAAI;CAC9B,OACE,qBAAC,UAAD;EACE,cAAY,KAAK;EACjB,UAAU,KAAK;EACf,UAAU,KAAK;EACf,OAAO,KAAK,QAAQ,KAAK,WAAY,KAAK,SAAS,MAAM;EACzD,WAAW,MAAM;GACf,MAAM,SAAS,KAAK,QAChB,MAAM,KAAK,EAAE,OAAO,eAAe,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,IACvD,CAAC,EAAE,OAAO,KAAK;GACnB,KAAU,OAAO,KAAK,KAAK,MAAM;EACnC;EACA,OAAO;GAAE,GAAG;GAAa,GAAG;GAAK,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,KAAM,EAAE,CAAC;EAAE;EAX1F,UAAA,CAaG,CAAC,KAAK,SAAS,KAAK,SAAS,WAAW,KAAK,oBAAC,UAAD,EAAQ,OAAM,GAAI,CAAA,GAC/D,KAAK,QAAQ,KAAK,MACjB,oBAAC,UAAD;GAAsB,OAAO,EAAE;GAC5B,UAAA,EAAE;EACG,GAFK,EAAE,KAEP,CACT,CACK;;AAEZ;AAEA,SAAS,WAAW,EAClB,MACA,QAIC;CACD,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,MAAM,QAAQ,MAAM,IAAI;CAC9B,OACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAY,KAAK;EACjB,UAAU,KAAK;EACf,eACE,KAAK,KAAK,eAAe,KAAK,KAAK;GACjC,MAAM;GACN,kBAAkB,KAAK;GACvB,mBAAmB,KAAK;EAC1B,CAAC;EAEH,OAAO;GACL,GAAG;GACH,GAAG;GACH,SAAS;GACT,QAAQ;GACR,YAAY;GACZ,QAAQ,KAAK,WAAW,YAAY;EACtC;CACD,CAAA;AAEL;;;;;;;;;AAUA,SAAgB,YAAY;CAC1B,MAAM,OAAO,QAAQ;CACrB,MAAM,OAAO,cAAc,SAAS;CACpC,MAAM,SAAS,YAAY,mBAAmB,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC;CAE3F,gBAAgB;EACd,IAAI,QAAQ,KAAK,WAAW,KAAK,GAAG;CACtC,GAAG;EAAC;EAAQ;EAAM,KAAK;CAAG,CAAC;CAE3B,MAAM,QAAQ,YAAY,YAAY,MAAM,EAAE,UAAU,KAAK,GAAG,GAAG,YAAY;CAC/E,IAAI,CAAC,QAAQ,OAAO;CAEpB,OACE,oBAAC,OAAD;EAAK,OAAO;GAAE,UAAU;GAAY,OAAO;EAAE;EAC1C,UAAA,MAAM,KAAK,SACV,KAAK,YAAY,SACf,oBAAC,UAAD;GAA8D;GAAY;EAAO,GAAlE,GAAG,KAAK,IAAI,GAAG,KAAK,mBAA8C,IAC/E,KAAK,YAAY,WACnB,oBAAC,YAAD;GAAgE;GAAY;EAAO,GAAlE,GAAG,KAAK,IAAI,GAAG,KAAK,mBAA8C,IACjF,KAAK,YAAY,WACnB,oBAAC,YAAD;GAAgE;GAAY;EAAO,GAAlE,GAAG,KAAK,IAAI,GAAG,KAAK,mBAA8C,IACjF,KAAK,YAAY,WACnB,oBAAC,YAAD;GAAgE;GAAY;EAAO,GAAlE,GAAG,KAAK,IAAI,GAAG,KAAK,mBAA8C,IACjF,IACN;CACG,CAAA;AAET;;AAKA,SAAgB,UAAU;CACxB,OAAO,cAAc,SAAS;AAChC;;;AAIA,SAAgB,kBAAkB;CAChC,OAAO,YAAY,YAAY,MAAM,EAAE,SAAS,CAAC;AACnD;;;;;;AAOA,SAAgB,eAAoC;CAClD,MAAM,WAAW,sBAAsB;CACvC,MAAM,SAAS,SAAS,WAAW,KAAK,SAAS,EAAE,CAAE,YAAY,WAAW,SAAS,KAAM;CAC3F,MAAM,SAAS,UAAU,OAAO,IAAI,SAAS,iBAAiB,OAAO,IAAI,oBAAoB;CAC7F,OAAO,YAAY,YAAY,MAAO,SAAS,IAAI,EAAE,eAAe,MAAM,IAAI,IAAK;AACrF"}