@alfadocs/ui-kit-debug 0.52.0 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/_chunks/{otp-input-CMphfBxZ.js → otp-input-Chb9r5vf.js} +89 -87
  2. package/dist/_chunks/{otp-input-CMphfBxZ.js.map → otp-input-Chb9r5vf.js.map} +1 -1
  3. package/dist/_chunks/{public-header.agent-BY6FH71R.js → public-header.agent-DyVpPwmv.js} +72 -62
  4. package/dist/_chunks/public-header.agent-DyVpPwmv.js.map +1 -0
  5. package/dist/_chunks/{sign-document-Bzld9jVM.js → sign-document-BzHTjMVC.js} +2 -2
  6. package/dist/_chunks/{sign-document-Bzld9jVM.js.map → sign-document-BzHTjMVC.js.map} +1 -1
  7. package/dist/_chunks/{signature-capture-CpMBhqQ9.js → signature-capture-CHbrKoA_.js} +163 -152
  8. package/dist/_chunks/signature-capture-CHbrKoA_.js.map +1 -0
  9. package/dist/_chunks/signature-field-DhscKdgk.js +152 -0
  10. package/dist/_chunks/signature-field-DhscKdgk.js.map +1 -0
  11. package/dist/_chunks/use-signing-session-C5evzYmo.js +108 -0
  12. package/dist/_chunks/use-signing-session-C5evzYmo.js.map +1 -0
  13. package/dist/agent-catalog.json +1 -1
  14. package/dist/components/index.d.ts +3 -2
  15. package/dist/components/index.d.ts.map +1 -1
  16. package/dist/components/otp-input/index.js +1 -1
  17. package/dist/components/otp-input/otp-input.d.ts +6 -0
  18. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  19. package/dist/components/pdf-viewer/index.d.ts +1 -1
  20. package/dist/components/pdf-viewer/index.d.ts.map +1 -1
  21. package/dist/components/public-header/index.js +1 -1
  22. package/dist/components/public-header/public-header.d.ts +1 -1
  23. package/dist/components/public-header/public-header.d.ts.map +1 -1
  24. package/dist/components/sign-document/index.js +1 -1
  25. package/dist/components/signature-capture/index.js +1 -1
  26. package/dist/components/signature-capture/signature-capture.d.ts +7 -0
  27. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  28. package/dist/components/signature-field/index.d.ts +3 -0
  29. package/dist/components/signature-field/index.d.ts.map +1 -0
  30. package/dist/components/signature-field/index.js +6 -0
  31. package/dist/components/signature-field/index.js.map +1 -0
  32. package/dist/components/signature-field/signature-field.d.ts +35 -0
  33. package/dist/components/signature-field/signature-field.d.ts.map +1 -0
  34. package/dist/hooks/index.d.ts +1 -0
  35. package/dist/hooks/index.d.ts.map +1 -1
  36. package/dist/hooks/index.js +42 -41
  37. package/dist/hooks/use-signing-session.d.ts +36 -0
  38. package/dist/hooks/use-signing-session.d.ts.map +1 -0
  39. package/dist/i18n/locales/ar.d.ts +8 -0
  40. package/dist/i18n/locales/ar.d.ts.map +1 -1
  41. package/dist/i18n/locales/ar.js +8 -0
  42. package/dist/i18n/locales/ar.js.map +1 -1
  43. package/dist/i18n/locales/de.d.ts +8 -0
  44. package/dist/i18n/locales/de.d.ts.map +1 -1
  45. package/dist/i18n/locales/de.js +8 -0
  46. package/dist/i18n/locales/de.js.map +1 -1
  47. package/dist/i18n/locales/el.d.ts +8 -0
  48. package/dist/i18n/locales/el.d.ts.map +1 -1
  49. package/dist/i18n/locales/el.js +8 -0
  50. package/dist/i18n/locales/el.js.map +1 -1
  51. package/dist/i18n/locales/en.d.ts +8 -0
  52. package/dist/i18n/locales/en.d.ts.map +1 -1
  53. package/dist/i18n/locales/en.js +8 -0
  54. package/dist/i18n/locales/en.js.map +1 -1
  55. package/dist/i18n/locales/es.d.ts +8 -0
  56. package/dist/i18n/locales/es.d.ts.map +1 -1
  57. package/dist/i18n/locales/es.js +8 -0
  58. package/dist/i18n/locales/es.js.map +1 -1
  59. package/dist/i18n/locales/fr.d.ts +8 -0
  60. package/dist/i18n/locales/fr.d.ts.map +1 -1
  61. package/dist/i18n/locales/fr.js +8 -0
  62. package/dist/i18n/locales/fr.js.map +1 -1
  63. package/dist/i18n/locales/hi.d.ts +8 -0
  64. package/dist/i18n/locales/hi.d.ts.map +1 -1
  65. package/dist/i18n/locales/hi.js +8 -0
  66. package/dist/i18n/locales/hi.js.map +1 -1
  67. package/dist/i18n/locales/it.d.ts +8 -0
  68. package/dist/i18n/locales/it.d.ts.map +1 -1
  69. package/dist/i18n/locales/it.js +8 -0
  70. package/dist/i18n/locales/it.js.map +1 -1
  71. package/dist/i18n/locales/ja.d.ts +8 -0
  72. package/dist/i18n/locales/ja.d.ts.map +1 -1
  73. package/dist/i18n/locales/ja.js +8 -0
  74. package/dist/i18n/locales/ja.js.map +1 -1
  75. package/dist/i18n/locales/nl.d.ts +8 -0
  76. package/dist/i18n/locales/nl.d.ts.map +1 -1
  77. package/dist/i18n/locales/nl.js +8 -0
  78. package/dist/i18n/locales/nl.js.map +1 -1
  79. package/dist/i18n/locales/pl.d.ts +8 -0
  80. package/dist/i18n/locales/pl.d.ts.map +1 -1
  81. package/dist/i18n/locales/pl.js +8 -0
  82. package/dist/i18n/locales/pl.js.map +1 -1
  83. package/dist/i18n/locales/pt.d.ts +8 -0
  84. package/dist/i18n/locales/pt.d.ts.map +1 -1
  85. package/dist/i18n/locales/pt.js +8 -0
  86. package/dist/i18n/locales/pt.js.map +1 -1
  87. package/dist/i18n/locales/ro.d.ts +8 -0
  88. package/dist/i18n/locales/ro.d.ts.map +1 -1
  89. package/dist/i18n/locales/ro.js +8 -0
  90. package/dist/i18n/locales/ro.js.map +1 -1
  91. package/dist/i18n/locales/ru.d.ts +8 -0
  92. package/dist/i18n/locales/ru.d.ts.map +1 -1
  93. package/dist/i18n/locales/ru.js +8 -0
  94. package/dist/i18n/locales/ru.js.map +1 -1
  95. package/dist/i18n/locales/sq.d.ts +8 -0
  96. package/dist/i18n/locales/sq.d.ts.map +1 -1
  97. package/dist/i18n/locales/sq.js +8 -0
  98. package/dist/i18n/locales/sq.js.map +1 -1
  99. package/dist/i18n/locales/sv.d.ts +8 -0
  100. package/dist/i18n/locales/sv.d.ts.map +1 -1
  101. package/dist/i18n/locales/sv.js +8 -0
  102. package/dist/i18n/locales/sv.js.map +1 -1
  103. package/dist/i18n/locales/tr.d.ts +8 -0
  104. package/dist/i18n/locales/tr.d.ts.map +1 -1
  105. package/dist/i18n/locales/tr.js +8 -0
  106. package/dist/i18n/locales/tr.js.map +1 -1
  107. package/dist/i18n/locales/zh.d.ts +8 -0
  108. package/dist/i18n/locales/zh.d.ts.map +1 -1
  109. package/dist/i18n/locales/zh.js +8 -0
  110. package/dist/i18n/locales/zh.js.map +1 -1
  111. package/dist/index.js +701 -697
  112. package/dist/index.js.map +1 -1
  113. package/dist/locales/ar.json +8 -0
  114. package/dist/locales/de.json +8 -0
  115. package/dist/locales/el.json +8 -0
  116. package/dist/locales/en.json +8 -0
  117. package/dist/locales/es.json +8 -0
  118. package/dist/locales/fr.json +8 -0
  119. package/dist/locales/hi.json +8 -0
  120. package/dist/locales/it.json +8 -0
  121. package/dist/locales/ja.json +8 -0
  122. package/dist/locales/nl.json +8 -0
  123. package/dist/locales/pl.json +8 -0
  124. package/dist/locales/pt.json +8 -0
  125. package/dist/locales/ro.json +8 -0
  126. package/dist/locales/ru.json +8 -0
  127. package/dist/locales/sq.json +8 -0
  128. package/dist/locales/sv.json +8 -0
  129. package/dist/locales/tr.json +8 -0
  130. package/dist/locales/zh.json +8 -0
  131. package/dist/tokens.css +1 -1
  132. package/package.json +5 -1
  133. package/dist/_chunks/public-header.agent-BY6FH71R.js.map +0 -1
  134. package/dist/_chunks/signature-capture-CpMBhqQ9.js.map +0 -1
  135. package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js +0 -43
  136. package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-capture-CHbrKoA_.js","sources":["../../src/components/signature-capture/signature-capture.agent.ts","../../src/components/signature-capture/signature-capture.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { SignatureCaptureHandle } from './signature-capture';\n\nexport const signatureCaptureAgent: AgentAdapter<SignatureCaptureHandle> = {\n id: 'signature-capture',\n capabilities: ['edit_inline', 'submit'],\n state: {\n isEmpty: {\n type: 'boolean',\n description: 'True when no signature has been drawn or typed.',\n read: (handle) => handle.isEmpty(),\n },\n },\n actions: {\n clear: {\n safety: 'destructive',\n description: 'Erase the current signature. Loses unsaved input.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n undo: {\n safety: 'write',\n description: 'Undo the last stroke.',\n invoke: (handle) => {\n handle.undo();\n },\n },\n confirm: {\n safety: 'write',\n description: 'Commit the signature and return its serialised payload.',\n invoke: (handle) => handle.confirm(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'signature-capture' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* SignatureCapture — thin React wrapper over signature_pad. */\n/* */\n/* - Library: `signature_pad` (08-third-party §Signature Pad). We */\n/* instantiate one pad per mounted canvas and expose imperative */\n/* clear / undo / isEmpty / confirm verbs to the consumer. */\n/* - Colors: `penColor` / `backgroundColor` default to */\n/* `--foreground` / `--background` via `getComputedStyle()`. Theme */\n/* switches are observed via a MutationObserver on `<html class>` */\n/* so the ink recolours when the theme flips. */\n/* - DPR scaling: canvas attribute `width/height = cssSize * DPR`; the */\n/* 2D context is scaled by the same factor. A `ResizeObserver` */\n/* replays strokes via `fromData()` on re-scale so nothing is lost. */\n/* - Typed fallback: keyboard-only path renders a text input styled in */\n/* italic `var(--font-sans)` (per 23-constraints §10 — serif is */\n/* marketing only). On confirm we render the string to an offscreen */\n/* canvas for the PNG/SVG export. */\n/* - Confirm payload: `{ png, svg, widthMm, heightMm, capturedAt, */\n/* sha256, strokes? }`. `sha256` is the SubtleCrypto digest of the */\n/* PNG bytes — tamper-evident for audit trails. */\n/* - Security: no `fetch` / `XMLHttpRequest` / `localStorage` / */\n/* `sessionStorage` in this file — the consumer owns persistence. */\n/* */\n/* TODO: */\n/* - 3× DPI re-render for print: currently `toDataURL('image/png')` */\n/* exports the live canvas (already at DPR). A proper 300-DPI */\n/* pipeline would create an offscreen canvas at `cssSize × 3` and */\n/* replay strokes via `fromData()` — deferred pending the print */\n/* bridge landing. */\n/* - Typed-fallback canvas font can't read CSS variables directly */\n/* (Canvas2D resolves fonts at paint time and won't expand */\n/* `var(--font-size-2xl)`); we use a fixed `32px italic` + the */\n/* user's font stack, which is visually close but not */\n/* theme-reactive. Will migrate once the typography tokens expose */\n/* a resolved `font` shorthand. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport SignaturePad from 'signature_pad';\nimport type { PointGroup } from 'signature_pad';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { signatureCaptureAgent } from './signature-capture.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SignatureConfirmPayload {\n /** Data URL of the captured signature rendered as PNG. */\n png: string;\n /** SVG string trimmed to the stroke bounding box. */\n svg: string;\n /** Physical width in millimetres, derived from CSS px. */\n widthMm: number;\n /** Physical height in millimetres, derived from CSS px. */\n heightMm: number;\n /** ISO-8601 UTC timestamp for when `confirm()` resolved. */\n capturedAt: string;\n /** Hex-encoded SHA-256 digest of the PNG bytes. */\n sha256: string;\n /** Raw stroke data from `signature_pad.toData()` — optional for replays. */\n strokes?: PointGroup[];\n}\n\nexport interface SignatureCaptureProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Called with the export payload when the user confirms the signature. */\n onConfirm?: (payload: SignatureConfirmPayload) => void;\n /** Called after the pad is cleared (explicit user action). */\n onClear?: () => void;\n /** Called when the user starts drawing a new stroke. */\n onStart?: () => void;\n /** CSS width of the pad. Default 400. */\n width?: number | string;\n /** CSS height of the pad. Default 200. */\n height?: number | string;\n /** Pen colour override — defaults to `var(--foreground)`. */\n penColor?: string;\n /** Background override — defaults to `var(--background)`. */\n backgroundColor?: string;\n /** Show the typed-name fallback toggle. Default `true`. */\n allowTypedFallback?: boolean;\n /**\n * When set, on confirm() the captured PNG data URL is written into a hidden\n * `<input name={name}>` so consumers can POST the signature declaratively.\n * The PNG data URL satisfies the server's `data:image/png` prefix check.\n * Default off.\n */\n name?: string;\n /** Disable the entire component. */\n disabled?: boolean;\n /** Accessible label for the pad region. */\n ariaLabel?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport interface SignatureCaptureHandle {\n clear: () => void;\n undo: () => void;\n isEmpty: () => boolean;\n confirm: () => Promise<SignatureConfirmPayload | null>;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva(\n [\n 'ds:signature-capture-alfadocs ds:flex ds:flex-col',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:[.theme-accessible_&]:border-2',\n 'ds:p-[var(--spacing-sm)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst padFrameVariants = cva(\n [\n 'ds:relative ds:block',\n 'ds:inline-size-[var(--signature-width)]',\n 'ds:block-size-[var(--signature-height)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)]',\n 'ds:overflow-hidden',\n 'ds:touch-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst canvasVariants = cva(\n [\n 'ds:block',\n 'ds:inline-size-full',\n 'ds:block-size-full',\n 'ds:touch-none',\n 'ds:select-none',\n ].join(' '),\n);\n\nconst toolbarVariants = cva(\n ['ds:flex ds:items-stretch ds:flex-wrap ds:gap-[var(--spacing-sm)]'].join(\n ' ',\n ),\n);\n\n// Toolbar actions are sized for thumbs: they grow to fill the pad width\n// (`flex-1`), sit above the 44/48px floor, and use base-size text so they read\n// clearly on a phone.\nconst actionButtonVariants = cva(\n [\n 'ds:inline-flex ds:flex-1 ds:items-center ds:justify-center',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:[min-inline-size:var(--min-target-size)]',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-transparent ds:text-[var(--foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst confirmButtonVariants = cva(\n [\n 'ds:inline-flex ds:flex-1 ds:items-center ds:justify-center',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:[min-inline-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst typedInputVariants = cva(\n [\n 'ds:block ds:inline-size-full',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:font-[family-name:var(--font-sans)]',\n 'ds:italic',\n 'ds:tracking-[0.1em]',\n 'ds:text-[length:var(--font-size-lg)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst typedPreviewVariants = cva(\n [\n 'ds:flex ds:items-center ds:justify-center',\n 'ds:inline-size-[var(--signature-width)]',\n 'ds:block-size-[var(--signature-height)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:font-[family-name:var(--font-sans)]',\n 'ds:italic',\n 'ds:tracking-[0.1em]',\n 'ds:text-[length:var(--font-size-2xl)]',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\ntype SignatureState = 'empty' | 'drawing' | 'captured' | 'cleared';\n\n/**\n * Resolve a CSS custom property against `document.documentElement`. We\n * can't pass `var(--foreground)` to signature_pad directly — the lib\n * stamps the string straight into `ctx.strokeStyle`, which only accepts\n * concrete colour values. Looking the variable up at runtime keeps the\n * component in tokens-only compliance.\n */\nfunction resolveCssVar(name: string): string {\n if (typeof document === 'undefined') return '';\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n return value;\n}\n\nfunction toCssSize(v: number | string | undefined, fallback: string): string {\n if (typeof v === 'number') return `${v}px`;\n if (typeof v === 'string' && v.length > 0) return v;\n return fallback;\n}\n\n/**\n * Parse a pixel value, returning `null` for non-pixel strings (e.g.\n * \"100%\", \"50vw\") so the caller can fall back to the measured rect.\n * parseFloat(\"100%\") would silently return 100 — a 100mm-wide export\n * masquerading as 26mm. Allow only digits, dot, minus, whitespace, \"px\".\n */\nfunction parsePxValue(v: string): number | null {\n if (typeof v === 'string' && /[^0-9.\\s\\-px]/i.test(v)) return null;\n const n = parseFloat(v);\n if (!Number.isFinite(n)) return null;\n return n;\n}\n\n/** Hex-encode a Uint8Array. */\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 1) {\n const b = bytes[i];\n out += b.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/** Decode a base64 string into bytes without `atob` polyfills. */\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) bytes[i] = bin.charCodeAt(i);\n return bytes;\n }\n // Fallback — node-style Buffer, gated behind a runtime check.\n const g = globalThis as {\n Buffer?: { from: (s: string, enc: string) => Uint8Array };\n };\n if (g.Buffer) return g.Buffer.from(b64, 'base64');\n return new Uint8Array();\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const g = globalThis as { crypto?: Crypto };\n if (g.crypto?.subtle) {\n // Copy the bytes into a fresh ArrayBuffer so the slice is always an\n // ArrayBuffer (never a SharedArrayBuffer) — SubtleCrypto's BufferSource\n // narrowing doesn't accept the latter.\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n const digest = await g.crypto.subtle.digest('SHA-256', copy.buffer);\n return toHex(new Uint8Array(digest));\n }\n // No subtle crypto — return empty so callers can still use the rest\n // of the payload. Test env is expected to stub crypto.subtle.\n return '';\n}\n\n/**\n * Render the typed fallback string onto an offscreen canvas and return\n * it. Used by the confirm path when the user has typed their name\n * instead of drawing. Size is fixed at `32px italic` because Canvas2D\n * resolves fonts eagerly and can't expand `var(--font-size-*)`.\n */\nfunction renderTypedSignatureToCanvas(\n text: string,\n cssWidth: number,\n cssHeight: number,\n penColor: string,\n backgroundColor: string,\n): HTMLCanvasElement {\n const dpr = Math.max(\n 1,\n typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n );\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(cssWidth * dpr);\n canvas.height = Math.floor(cssHeight * dpr);\n const ctx = canvas.getContext('2d');\n if (!ctx) return canvas;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // Fill background with the token-resolved colour.\n ctx.fillStyle = backgroundColor || 'transparent';\n ctx.fillRect(0, 0, cssWidth, cssHeight);\n // Draw the typed signature centred.\n ctx.fillStyle = penColor || 'currentColor';\n ctx.font = '32px italic sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, cssWidth / 2, cssHeight / 2, cssWidth - 16);\n return canvas;\n}\n\n/* ------------------------------------------------------------------ */\n/* SignatureCapture */\n/* ------------------------------------------------------------------ */\n\nexport const SignatureCapture = forwardRef<\n SignatureCaptureHandle,\n SignatureCaptureProps\n>(\n (\n {\n id,\n onConfirm,\n onClear,\n onStart,\n width = 400,\n height = 200,\n penColor,\n backgroundColor,\n allowTypedFallback = true,\n name,\n disabled = false,\n ariaLabel,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const rawId = useId();\n const idSafe = useMemo(\n () => `sig-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const liveRegionId = `${idSafe}-live`;\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const padFrameRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const typedPreviewRef = useRef<HTMLDivElement>(null);\n const signaturePadRef = useRef<SignaturePad | null>(null);\n\n const [mode, setMode] = useState<'draw' | 'typed'>('draw');\n const [typedValue, setTypedValue] = useState('');\n // Mirrors the last confirmed PNG data URL into a hidden form field when\n // `name` is set, so consumers can POST the signature declaratively.\n const [boundValue, setBoundValue] = useState('');\n // Tracks whether the pad has any ink — gates the Confirm button.\n // signature_pad's isEmpty() is a sync ref read and won't trigger\n // re-renders; this state mirrors it so React sees the change.\n const [padHasInk, setPadHasInk] = useState(false);\n // Retained state — consumers may subscribe to the pad's lifecycle via\n // `onConfirm`/`onClear`/`onStart`; we still track the machine internally\n // so the live region + confirm button stay coherent.\n const signatureStateRef = useRef<SignatureState>('empty');\n const [announcement, setAnnouncement] = useState<string>('');\n const [resolvedPen, setResolvedPen] = useState<string>('');\n const [resolvedBg, setResolvedBg] = useState<string>('');\n\n // Stable callback refs so we can wire signature_pad once without\n // re-instantiating on every render.\n const onStartRef = useRef<SignatureCaptureProps['onStart']>(onStart);\n const onClearRef = useRef<SignatureCaptureProps['onClear']>(onClear);\n const onConfirmRef = useRef<SignatureCaptureProps['onConfirm']>(onConfirm);\n useEffect(() => {\n onStartRef.current = onStart;\n onClearRef.current = onClear;\n onConfirmRef.current = onConfirm;\n }, [onStart, onClear, onConfirm]);\n\n /* ---- Announce helper ---------------------------------------- */\n const announce = useCallback(\n (next: SignatureState) => {\n signatureStateRef.current = next;\n setAnnouncement(t(`signature.state.${next}`));\n },\n [t],\n );\n\n /* ---- Resolve tokens ----------------------------------------- */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n function resolveAll(): void {\n const pen = penColor ?? resolveCssVar('--foreground');\n const bg = backgroundColor ?? resolveCssVar('--background');\n // Fall back to `currentColor` / `transparent` — keyword literals\n // are token-neutral and honour the surrounding theme even when\n // the CSS variable is briefly unavailable (SSR, initial paint).\n setResolvedPen(pen || 'currentColor');\n setResolvedBg(bg || 'transparent');\n }\n resolveAll();\n // Watch for theme-class changes on <html>.\n const mo = new MutationObserver(() => {\n resolveAll();\n });\n mo.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => mo.disconnect();\n }, [penColor, backgroundColor]);\n\n /* ---- Apply colour changes to an existing pad ---------------- */\n useEffect(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n if (resolvedPen) pad.penColor = resolvedPen;\n if (resolvedBg) pad.backgroundColor = resolvedBg;\n }, [resolvedPen, resolvedBg]);\n\n /* ---- Instantiate signature_pad ------------------------------ */\n useEffect(() => {\n if (mode !== 'draw') return undefined;\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n\n const pad = new SignaturePad(canvas, {\n penColor: resolvedPen || 'currentColor',\n backgroundColor: resolvedBg || 'transparent',\n minWidth: 0.5,\n maxWidth: 2.5,\n velocityFilterWeight: 0.7,\n });\n signaturePadRef.current = pad;\n\n const handleBegin = (): void => {\n setPadHasInk(true);\n announce('drawing');\n onStartRef.current?.();\n };\n const handleEnd = (): void => {\n // Keep state as 'drawing' — transition to 'captured' on confirm.\n };\n pad.addEventListener('beginStroke', handleBegin);\n pad.addEventListener('endStroke', handleEnd);\n\n // Initial DPR scale + announcement.\n scaleCanvas(canvas);\n announce('empty');\n\n return () => {\n pad.removeEventListener('beginStroke', handleBegin);\n pad.removeEventListener('endStroke', handleEnd);\n // Clear strokes from memory; 08-third-party §Signature Pad.\n pad.clear();\n pad.off();\n signaturePadRef.current = null;\n };\n // We intentionally re-create the pad only when switching between\n // typed and draw modes. Color updates flow through the effect above.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode]);\n\n /* ---- Disabled state ----------------------------------------- */\n useEffect(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n if (disabled) pad.off();\n else pad.on();\n }, [disabled, mode]);\n\n /* ---- DPR + ResizeObserver ----------------------------------- */\n // Hard-cap backing-store dimensions to bound memory. 4096 px × 4096 px at\n // 4 bytes per pixel is ~67 MB — generous for any realistic signature, but\n // well under the multi-GB allocation a careless or malicious prop could\n // request on a high-DPR display. See security-hardening.mdx.\n const MAX_CANVAS_PX = 4096;\n const scaleCanvas = useCallback(\n (canvas: HTMLCanvasElement) => {\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.max(\n 1,\n typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n );\n const rawWidth = Math.max(1, Math.floor(rect.width * dpr));\n const rawHeight = Math.max(1, Math.floor(rect.height * dpr));\n const targetWidth = Math.min(rawWidth, MAX_CANVAS_PX);\n const targetHeight = Math.min(rawHeight, MAX_CANVAS_PX);\n if (\n import.meta.env.DEV &&\n (rawWidth !== targetWidth || rawHeight !== targetHeight)\n ) {\n // Silent in production; a consumer shipping 10k × 10k probably wants\n // the nudge.\n console.warn(\n `[SignatureCapture] clamped canvas backing store from ${rawWidth}x${rawHeight} to ${targetWidth}x${targetHeight} (cap = ${MAX_CANVAS_PX}px).`,\n );\n }\n if (canvas.width === targetWidth && canvas.height === targetHeight)\n return;\n\n const pad = signaturePadRef.current;\n const prior = pad ? pad.toData() : null;\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.scale(dpr, dpr);\n if (pad) {\n if (resolvedBg) pad.backgroundColor = resolvedBg;\n if (resolvedPen) pad.penColor = resolvedPen;\n pad.clear();\n if (prior && prior.length > 0) {\n pad.fromData(prior);\n }\n }\n },\n [resolvedBg, resolvedPen],\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n if (typeof ResizeObserver === 'undefined') {\n scaleCanvas(canvas);\n return undefined;\n }\n const ro = new ResizeObserver(() => {\n scaleCanvas(canvas);\n });\n ro.observe(canvas);\n return () => ro.disconnect();\n }, [scaleCanvas]);\n\n /* ---- Imperative handle -------------------------------------- */\n const clear = useCallback(() => {\n const pad = signaturePadRef.current;\n if (pad) pad.clear();\n setTypedValue('');\n setBoundValue('');\n setPadHasInk(false);\n announce('cleared');\n onClearRef.current?.();\n }, [announce]);\n\n const undo = useCallback(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n const data = pad.toData();\n if (!data || data.length === 0) return;\n data.pop();\n pad.fromData(data);\n if (data.length === 0) {\n setPadHasInk(false);\n announce('empty');\n }\n }, [announce]);\n\n const isEmpty = useCallback((): boolean => {\n if (mode === 'typed') return typedValue.trim().length === 0;\n const pad = signaturePadRef.current;\n return pad ? pad.isEmpty() : true;\n }, [mode, typedValue]);\n\n const confirm =\n useCallback(async (): Promise<SignatureConfirmPayload | null> => {\n // parsePxValue returns null for \"100%\" / \"50vw\" etc. — fall back\n // to the live rendered rect so widthMm reflects reality, not a\n // mis-parsed parseFloat(\"100%\") = 100.\n const widthParsed = parsePxValue(\n typeof width === 'number' ? `${width}` : String(width),\n );\n const heightParsed = parsePxValue(\n typeof height === 'number' ? `${height}` : String(height),\n );\n const measureEl =\n mode === 'draw'\n ? (canvasRef.current ?? padFrameRef.current ?? wrapperRef.current)\n : (typedPreviewRef.current ?? wrapperRef.current);\n const measuredRect = measureEl?.getBoundingClientRect();\n const cssWidth =\n widthParsed ?? (measuredRect ? measuredRect.width : 400);\n const cssHeight =\n heightParsed ?? (measuredRect ? measuredRect.height : 200);\n\n let pngDataUrl = '';\n let svgString = '';\n let strokes: PointGroup[] | undefined;\n\n if (mode === 'draw') {\n const pad = signaturePadRef.current;\n if (!pad || pad.isEmpty()) return null;\n pngDataUrl = pad.toDataURL('image/png');\n svgString = pad.toSVG();\n strokes = pad.toData();\n } else {\n const value = typedValue.trim();\n if (value.length === 0) return null;\n const offscreen = renderTypedSignatureToCanvas(\n value,\n cssWidth,\n cssHeight,\n resolvedPen || 'currentColor',\n resolvedBg || 'transparent',\n );\n pngDataUrl = offscreen.toDataURL('image/png');\n // Inline SVG — we can't call toSVG() because signature_pad isn't\n // driving the canvas. Build a minimal SVG with the rendered text.\n const safeText = value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n svgString =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${cssWidth} ${cssHeight}\" width=\"${cssWidth}\" height=\"${cssHeight}\">` +\n `<text x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\" font-family=\"sans-serif\" font-style=\"italic\" font-size=\"32\" fill=\"${resolvedPen || 'currentColor'}\" letter-spacing=\"3\">${safeText}</text>` +\n `</svg>`;\n }\n\n // 96 CSS px = 25.4 mm (per W3C CSS absolute length definition).\n const widthMm = (cssWidth * 25.4) / 96;\n const heightMm = (cssHeight * 25.4) / 96;\n const capturedAt = new Date().toISOString();\n\n // Compute SHA-256 of the PNG bytes.\n let sha256 = '';\n if (pngDataUrl) {\n const commaIx = pngDataUrl.indexOf(',');\n const b64 = commaIx >= 0 ? pngDataUrl.slice(commaIx + 1) : '';\n const bytes = base64ToBytes(b64);\n sha256 = await sha256Hex(bytes);\n }\n\n const payload: SignatureConfirmPayload = {\n png: pngDataUrl,\n svg: svgString,\n widthMm,\n heightMm,\n capturedAt,\n sha256,\n strokes,\n };\n\n announce('captured');\n if (name) setBoundValue(payload.png);\n onConfirmRef.current?.(payload);\n return payload;\n }, [\n mode,\n typedValue,\n width,\n height,\n resolvedPen,\n resolvedBg,\n announce,\n name,\n ]);\n\n const agentHandle = useMemo<SignatureCaptureHandle>(\n () => ({\n clear,\n undo,\n isEmpty,\n confirm,\n }),\n [clear, undo, isEmpty, confirm],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(signatureCaptureAgent, agentHandle, id);\n\n /* ---- Derived UI state --------------------------------------- */\n // Gate Confirm on React state, not the signature_pad ref — its\n // isEmpty() doesn't trigger re-renders, leaving the button stale.\n const hasContent =\n mode === 'typed' ? typedValue.trim().length > 0 : padHasInk;\n const confirmDisabled = disabled || !hasContent;\n // Inline style — permitted per 23-constraints §Runtime-computed\n // dimensions (CSS custom property setter for dynamic width/height\n // from consumer props; the width rule lives in Tailwind arbitrary\n // values that read --signature-width / --signature-height).\n const sizeStyle: CSSProperties = {\n ['--signature-width' as unknown as keyof CSSProperties]: toCssSize(\n width,\n 'var(--signature-default-width)',\n ),\n ['--signature-height' as unknown as keyof CSSProperties]: toCssSize(\n height,\n 'var(--signature-default-height)',\n ),\n } as CSSProperties;\n\n /* ---- Render -------------------------------------------------- */\n return (\n <div\n ref={wrapperRef}\n role=\"group\"\n aria-label={ariaLabel ?? t('signature.padLabel')}\n aria-disabled={disabled || undefined}\n className={[wrapperVariants(), className].filter(Boolean).join(' ')}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed pad dimensions\n style={sizeStyle}\n data-component=\"signature-capture\"\n data-component-id={id}\n >\n {name ? (\n <input type=\"hidden\" name={name} value={boundValue} readOnly />\n ) : null}\n {mode === 'draw' ? (\n <div ref={padFrameRef} className={padFrameVariants()}>\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={t('signature.padLabel')}\n className={canvasVariants()}\n data-testid=\"signature-canvas\"\n />\n </div>\n ) : (\n <label className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {t('signature.typedFallback.label')}\n </span>\n <input\n type=\"text\"\n value={typedValue}\n onChange={(e) => {\n setTypedValue(e.target.value);\n if (e.target.value.length > 0) announce('drawing');\n else announce('empty');\n }}\n placeholder={t('signature.typedFallback.placeholder')}\n aria-label={t('signature.typedFallback.label')}\n disabled={disabled}\n className={typedInputVariants()}\n data-testid=\"signature-typed-input\"\n />\n {typedValue ? (\n <div\n ref={typedPreviewRef}\n className={typedPreviewVariants()}\n aria-hidden=\"true\"\n >\n {typedValue}\n </div>\n ) : null}\n </label>\n )}\n\n {/* Live region — state transitions (empty, drawing, captured, cleared) */}\n <div\n id={liveRegionId}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n data-testid=\"signature-live\"\n >\n {announcement}\n </div>\n\n <div\n className={toolbarVariants()}\n role=\"group\"\n aria-label={t('signature.padLabel')}\n >\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n clear();\n }}\n aria-disabled={disabled || undefined}\n className={actionButtonVariants()}\n >\n {t('signature.clear')}\n </button>\n {allowTypedFallback ? (\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n setTypedValue('');\n setMode((m) => (m === 'draw' ? 'typed' : 'draw'));\n announce('cleared');\n }}\n aria-disabled={disabled || undefined}\n className={actionButtonVariants()}\n aria-pressed={mode === 'typed'}\n >\n {mode === 'draw'\n ? t('signature.typedFallback.toggle')\n : t('signature.typedFallback.toggleDraw')}\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => {\n if (confirmDisabled) return;\n void confirm();\n }}\n aria-disabled={confirmDisabled || undefined}\n aria-describedby={liveRegionId}\n className={confirmButtonVariants()}\n data-testid=\"signature-confirm\"\n >\n {t('signature.confirm')}\n </button>\n </div>\n </div>\n );\n },\n);\n\nSignatureCapture.displayName = 'SignatureCapture';\n\nexport {\n wrapperVariants as signatureWrapperVariants,\n actionButtonVariants as signatureActionButtonVariants,\n confirmButtonVariants as signatureConfirmButtonVariants,\n};\n"],"names":["signatureCaptureAgent","handle","wrapperVariants","cva","padFrameVariants","canvasVariants","toolbarVariants","actionButtonVariants","confirmButtonVariants","typedInputVariants","typedPreviewVariants","resolveCssVar","name","toCssSize","v","fallback","parsePxValue","toHex","bytes","out","i","b","base64ToBytes","b64","bin","g","sha256Hex","_a","copy","digest","renderTypedSignatureToCanvas","text","cssWidth","cssHeight","penColor","backgroundColor","dpr","canvas","ctx","SignatureCapture","forwardRef","id","onConfirm","onClear","onStart","width","height","allowTypedFallback","disabled","ariaLabel","className","ref","t","useTranslation","rawId","useId","liveRegionId","useMemo","wrapperRef","useRef","padFrameRef","canvasRef","typedPreviewRef","signaturePadRef","mode","setMode","useState","typedValue","setTypedValue","boundValue","setBoundValue","padHasInk","setPadHasInk","signatureStateRef","announcement","setAnnouncement","resolvedPen","setResolvedPen","resolvedBg","setResolvedBg","onStartRef","onClearRef","onConfirmRef","useEffect","announce","useCallback","next","resolveAll","pen","bg","mo","pad","SignaturePad","handleBegin","handleEnd","scaleCanvas","MAX_CANVAS_PX","rect","rawWidth","rawHeight","targetWidth","targetHeight","prior","ro","clear","undo","data","isEmpty","confirm","widthParsed","heightParsed","measureEl","measuredRect","pngDataUrl","svgString","strokes","value","safeText","widthMm","heightMm","capturedAt","sha256","commaIx","payload","agentHandle","useImperativeHandle","useAgentRegistration","hasContent","confirmDisabled","sizeStyle","jsxs","jsx","m"],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import { jsx as e, jsxs as g, Fragment as f } from "react/jsx-runtime";
2
+ import { forwardRef as k } from "react";
3
+ import { c as N } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as y } from "react-i18next";
5
+ import { S as C } from "./spinner-OjQNn8oN.js";
6
+ import { C as _ } from "./check-DPdL_Sm7.js";
7
+ import { c as T } from "./createLucideIcon-CrFbzy84.js";
8
+ /**
9
+ * @license lucide-react v1.8.0 - ISC
10
+ *
11
+ * This source code is licensed under the ISC license.
12
+ * See the LICENSE file in the root directory of this source tree.
13
+ */
14
+ const w = [
15
+ ["path", { d: "M13 21h8", key: "1jsn5i" }],
16
+ [
17
+ "path",
18
+ {
19
+ d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",
20
+ key: "1a8usu"
21
+ }
22
+ ]
23
+ ], S = T("pen-line", w), $ = N(
24
+ [
25
+ // Overlay fields are always absolutely positioned within the
26
+ // renderPageOverlay box; the percent geometry rides the inline style.
27
+ "ds:absolute",
28
+ "ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]",
29
+ "ds:[min-block-size:var(--min-target-size)] ds:[min-inline-size:var(--min-target-size)]",
30
+ "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
31
+ "ds:rounded-[var(--radius-sm)]",
32
+ "ds:text-[length:var(--font-size-sm)] ds:font-medium",
33
+ "ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
34
+ "ds:focus-visible:outline-[length:var(--focus-ring-width)]",
35
+ "ds:focus-visible:outline-solid",
36
+ "ds:focus-visible:outline-[var(--ring)]",
37
+ "ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
38
+ "ds:forced-colors:focus-visible:outline-[CanvasText]",
39
+ "ds:aria-disabled:cursor-not-allowed"
40
+ ].join(" "),
41
+ {
42
+ variants: {
43
+ state: {
44
+ unsigned: [
45
+ "ds:cursor-pointer",
46
+ "ds:border ds:border-dashed ds:border-[color:var(--ring)]",
47
+ "ds:bg-[color-mix(in_srgb,var(--info)_8%,transparent)]",
48
+ "ds:text-[var(--foreground)]",
49
+ "ds:hover:bg-[color-mix(in_srgb,var(--info)_16%,transparent)]",
50
+ "ds:forced-colors:border-[CanvasText]"
51
+ ].join(" "),
52
+ signing: [
53
+ "ds:cursor-progress",
54
+ "ds:border ds:border-dashed ds:border-[color:var(--border)]",
55
+ "ds:bg-[var(--muted)]",
56
+ "ds:text-[var(--muted-foreground)]",
57
+ "ds:forced-colors:border-[CanvasText]"
58
+ ].join(" "),
59
+ signed: [
60
+ "ds:cursor-pointer ds:overflow-hidden",
61
+ "ds:p-[var(--spacing-xs)]",
62
+ "ds:border ds:border-solid ds:border-[color:var(--success)]",
63
+ "ds:bg-[color-mix(in_srgb,var(--success)_8%,transparent)]",
64
+ "ds:text-[var(--foreground)]",
65
+ "ds:forced-colors:border-[CanvasText]"
66
+ ].join(" ")
67
+ }
68
+ },
69
+ defaultVariants: { state: "unsigned" }
70
+ }
71
+ ), L = k(
72
+ ({
73
+ state: s = "unsigned",
74
+ insetInlineStart: o,
75
+ insetBlockStart: a,
76
+ inlineSize: t,
77
+ blockSize: l,
78
+ onActivate: d,
79
+ signedImageSrc: c,
80
+ label: r,
81
+ disabled: m = !1,
82
+ id: v,
83
+ className: p,
84
+ ...b
85
+ }, h) => {
86
+ const { t: i } = y(), u = m || s === "signing", n = {};
87
+ o !== void 0 && (n.insetInlineStart = `${o}%`), a !== void 0 && (n.insetBlockStart = `${a}%`), t !== void 0 && (n.inlineSize = `${t}%`), l !== void 0 && (n.blockSize = `${l}%`);
88
+ const x = r ?? i("signatureField.prompt"), z = s === "signing" ? r ? i("signatureField.signingNamed", { label: r }) : i("signatureField.signing") : s === "signed" ? r ? i("signatureField.signedNamed", { label: r }) : i("signatureField.signed") : r ?? i("signatureField.unsigned");
89
+ function F(j) {
90
+ if (u) {
91
+ j.preventDefault();
92
+ return;
93
+ }
94
+ d == null || d();
95
+ }
96
+ return /* @__PURE__ */ e(
97
+ "button",
98
+ {
99
+ ref: h,
100
+ type: "button",
101
+ ...b,
102
+ "data-component": "signature-field",
103
+ "data-component-id": v,
104
+ "data-state": s,
105
+ "aria-label": z,
106
+ "aria-disabled": u || void 0,
107
+ "aria-busy": s === "signing" || void 0,
108
+ onClick: F,
109
+ className: [$({ state: s }), p].filter(Boolean).join(" "),
110
+ style: n,
111
+ children: s === "signing" ? (
112
+ // Decorative: the button's aria-label + aria-busy are the single
113
+ // source of the status announcement, so the Spinner's own
114
+ // role="status" live region is hidden from assistive tech.
115
+ /* @__PURE__ */ e("span", { "aria-hidden": "true", children: /* @__PURE__ */ e(C, { size: "sm", label: i("signatureField.signing") }) })
116
+ ) : s === "signed" ? c ? /* @__PURE__ */ e(
117
+ "img",
118
+ {
119
+ src: c,
120
+ alt: "",
121
+ "aria-hidden": "true",
122
+ className: "ds:block-size-full ds:inline-size-full ds:object-contain"
123
+ }
124
+ ) : /* @__PURE__ */ g(f, { children: [
125
+ /* @__PURE__ */ e(
126
+ _,
127
+ {
128
+ "aria-hidden": "true",
129
+ className: "ds:block-size-4 ds:inline-size-4 ds:text-[var(--success)]"
130
+ }
131
+ ),
132
+ /* @__PURE__ */ e("span", { children: i("signatureField.signed") })
133
+ ] }) : /* @__PURE__ */ g(f, { children: [
134
+ /* @__PURE__ */ e(
135
+ S,
136
+ {
137
+ "aria-hidden": "true",
138
+ className: "ds:block-size-4 ds:inline-size-4"
139
+ }
140
+ ),
141
+ /* @__PURE__ */ e("span", { children: x })
142
+ ] })
143
+ }
144
+ );
145
+ }
146
+ );
147
+ L.displayName = "SignatureField";
148
+ export {
149
+ L as S,
150
+ $ as s
151
+ };
152
+ //# sourceMappingURL=signature-field-DhscKdgk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-field-DhscKdgk.js","sources":["../../node_modules/lucide-react/dist/esm/icons/pen-line.js","../../src/components/signature-field/signature-field.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 21h8\", key: \"1jsn5i\" }],\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ]\n];\nconst PenLine = createLucideIcon(\"pen-line\", __iconNode);\n\nexport { __iconNode, PenLine as default };\n//# sourceMappingURL=pen-line.js.map\n","/* ------------------------------------------------------------------ */\n/* SignatureField — a single percent-positioned signature placeholder */\n/* rendered inside a PDFViewer page overlay (renderPageOverlay). */\n/* */\n/* Promoted from the story-only field demonstrated in */\n/* pdf-viewer.stories.tsx `WithSignatureFieldOverlays` (HTP-4889): the */\n/* sign.alfadocs.com rebuild needs N of these positioned over each PDF */\n/* page, each a real, keyboard-activatable control whose visual + a11y */\n/* state tracks unsigned → signing → signed. */\n/* */\n/* - Geometry: the consumer supplies percent coordinates */\n/* (insetInlineStart / insetBlockStart / inlineSize / blockSize) */\n/* relative to the overlay box. These are runtime-computed layout */\n/* values driven by consumer data, so they ride an inline `style` */\n/* per 23-constraints §Runtime-computed dimensions — the same */\n/* sanctioned exception PDFViewer/SignatureCapture use. All static */\n/* styling stays in CVA + tokens. Logical properties only, so the */\n/* field mirrors correctly over an RTL document. */\n/* - It IS an interactive control: a real <button>. The accessible name */\n/* reflects state (Sign here / Signing… / Signed); the 44/48px target */\n/* floor is enforced via --min-target-size. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Check, PenLine } from 'lucide-react';\nimport { Spinner } from '../spinner';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type SignatureFieldState = 'unsigned' | 'signing' | 'signed';\n\nexport interface SignatureFieldProps extends Omit<\n ComponentPropsWithoutRef<'button'>,\n 'onClick' | 'children' | 'aria-label' | 'disabled'\n> {\n /** Lifecycle state. Drives both the visual treatment and the accessible name. */\n state?: SignatureFieldState;\n /**\n * Percent offset of the field's logical start edge within the overlay box.\n * Applied as a runtime-computed `inset-inline-start: {n}%`.\n */\n insetInlineStart?: number;\n /** Percent offset of the field's logical top edge. `inset-block-start: {n}%`. */\n insetBlockStart?: number;\n /** Percent of the overlay's logical inline size — the field width. */\n inlineSize?: number;\n /** Percent of the overlay's logical block size — the field height. */\n blockSize?: number;\n /** Called when an unsigned (or signed) field is activated by click / keyboard. */\n onActivate?: () => void;\n /** Captured signature image (PNG data URL or URL) shown when `state=\"signed\"`. */\n signedImageSrc?: string;\n /**\n * Caption shown in the unsigned prompt and used as the accessible name\n * (e.g. \"Sign here\", \"Date\", \"Initial here\"). Falls back to the\n * translated default prompt.\n */\n label?: string;\n /** Hard-disable the field (non-activatable, dimmed). Distinct from `state=\"signing\"`. */\n disabled?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst signatureFieldVariants = cva(\n [\n // Overlay fields are always absolutely positioned within the\n // renderPageOverlay box; the percent geometry rides the inline style.\n 'ds:absolute',\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n 'ds:[min-block-size:var(--min-target-size)] ds:[min-inline-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n {\n variants: {\n state: {\n unsigned: [\n 'ds:cursor-pointer',\n 'ds:border ds:border-dashed ds:border-[color:var(--ring)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_8%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:hover:bg-[color-mix(in_srgb,var(--info)_16%,transparent)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n signing: [\n 'ds:cursor-progress',\n 'ds:border ds:border-dashed ds:border-[color:var(--border)]',\n 'ds:bg-[var(--muted)]',\n 'ds:text-[var(--muted-foreground)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n signed: [\n 'ds:cursor-pointer ds:overflow-hidden',\n 'ds:p-[var(--spacing-xs)]',\n 'ds:border ds:border-solid ds:border-[color:var(--success)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_8%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n },\n },\n defaultVariants: { state: 'unsigned' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* SignatureField */\n/* ------------------------------------------------------------------ */\n\nexport const SignatureField = forwardRef<\n HTMLButtonElement,\n SignatureFieldProps\n>(\n (\n {\n state = 'unsigned',\n insetInlineStart,\n insetBlockStart,\n inlineSize,\n blockSize,\n onActivate,\n signedImageSrc,\n label,\n disabled = false,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const inactive = disabled || state === 'signing';\n\n // Runtime-computed overlay geometry — consumer percent coordinates over\n // the PDF page. Inline style is the sanctioned exception here\n // (23-constraints §Runtime-computed dimensions); logical properties keep\n // the field mirrored over RTL documents.\n const geometry: CSSProperties = {};\n if (insetInlineStart !== undefined) {\n geometry.insetInlineStart = `${insetInlineStart}%`;\n }\n if (insetBlockStart !== undefined) {\n geometry.insetBlockStart = `${insetBlockStart}%`;\n }\n if (inlineSize !== undefined) {\n geometry.inlineSize = `${inlineSize}%`;\n }\n if (blockSize !== undefined) {\n geometry.blockSize = `${blockSize}%`;\n }\n\n // `prompt` is the visible caption fallback; `unsigned` is the\n // accessible-name fallback — intentionally distinct strings.\n const promptText = label ?? t('signatureField.prompt');\n // The signed/signing names compose the field's `label` with the status so\n // several signed fields on one page stay individually identifiable (signed\n // fields remain activatable for re-signing); falls back to the bare status\n // when no label is supplied.\n const accessibleName =\n state === 'signing'\n ? label\n ? t('signatureField.signingNamed', { label })\n : t('signatureField.signing')\n : state === 'signed'\n ? label\n ? t('signatureField.signedNamed', { label })\n : t('signatureField.signed')\n : (label ?? t('signatureField.unsigned'));\n\n function handleClick(event: ReactMouseEvent<HTMLButtonElement>): void {\n if (inactive) {\n event.preventDefault();\n return;\n }\n onActivate?.();\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n {...rest}\n data-component=\"signature-field\"\n data-component-id={id}\n data-state={state}\n aria-label={accessibleName}\n aria-disabled={inactive || undefined}\n aria-busy={state === 'signing' || undefined}\n onClick={handleClick}\n className={[signatureFieldVariants({ state }), className]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed overlay geometry: consumer percent coordinates over the PDF page (23-constraints §Runtime-computed dimensions)\n style={geometry}\n >\n {state === 'signing' ? (\n // Decorative: the button's aria-label + aria-busy are the single\n // source of the status announcement, so the Spinner's own\n // role=\"status\" live region is hidden from assistive tech.\n <span aria-hidden=\"true\">\n <Spinner size=\"sm\" label={t('signatureField.signing')} />\n </span>\n ) : state === 'signed' ? (\n signedImageSrc ? (\n <img\n src={signedImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"ds:block-size-full ds:inline-size-full ds:object-contain\"\n />\n ) : (\n <>\n <Check\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4 ds:text-[var(--success)]\"\n />\n <span>{t('signatureField.signed')}</span>\n </>\n )\n ) : (\n <>\n <PenLine\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n <span>{promptText}</span>\n </>\n )}\n </button>\n );\n },\n);\n\nSignatureField.displayName = 'SignatureField';\n\nexport { signatureFieldVariants };\n"],"names":["__iconNode","PenLine","createLucideIcon","signatureFieldVariants","cva","SignatureField","forwardRef","state","insetInlineStart","insetBlockStart","inlineSize","blockSize","onActivate","signedImageSrc","label","disabled","id","className","rest","ref","t","useTranslation","inactive","geometry","promptText","accessibleName","handleClick","event","jsx","Spinner","jsxs","Fragment","Check"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,108 @@
1
+ import { useRef as w, useEffect as C, useState as y, useMemo as F, useCallback as S } from "react";
2
+ function b(e) {
3
+ return e != null && e.current ? e.current : typeof document > "u" ? null : document;
4
+ }
5
+ function A(e, o) {
6
+ const r = typeof CSS < "u" && typeof CSS.escape == "function" ? CSS.escape(e) : (
7
+ // SSR / jsdom fallback — drop every character that's
8
+ // significant in a CSS attribute selector. Conservative but
9
+ // robust enough for the test environment.
10
+ e.replace(/["'\\[\]]/g, "")
11
+ ), s = `[data-error-anchor="${r}"], [name="${r}"], [name$="[${r}]"]`, i = Array.from(o.querySelectorAll(s));
12
+ return i.length === 0 ? null : i.find((c) => c.offsetParent !== null) ?? i[0];
13
+ }
14
+ function k(e, o, r = {}) {
15
+ const {
16
+ scope: s,
17
+ scrollOptions: i = { behavior: "smooth", block: "center" },
18
+ focus: u = !0,
19
+ skipInitialMount: c = !0
20
+ } = r, a = w(!1), d = w(null), l = o.find((f) => !!e[f]) ?? null;
21
+ C(() => {
22
+ if (c && !a.current) {
23
+ a.current = !0, d.current = l;
24
+ return;
25
+ }
26
+ if (!l) {
27
+ d.current = null;
28
+ return;
29
+ }
30
+ if (l === d.current || typeof window > "u") return;
31
+ const f = window.requestAnimationFrame(() => {
32
+ const m = b(s);
33
+ if (!m) return;
34
+ const g = A(l, m);
35
+ g && (g.scrollIntoView(i), u && g.focus({ preventScroll: !0 }), d.current = l);
36
+ });
37
+ return () => window.cancelAnimationFrame(f);
38
+ }, [l]);
39
+ }
40
+ function v(e, o = !1) {
41
+ const r = {};
42
+ for (const s of e)
43
+ r[s.id] = { signed: o ? !1 : !!s.signed };
44
+ return r;
45
+ }
46
+ function B(e) {
47
+ const [o, r] = y(
48
+ () => v(e)
49
+ ), [s, i] = y(null), u = F(
50
+ () => e.map((n) => {
51
+ const t = o[n.id];
52
+ return {
53
+ ...n,
54
+ signed: t ? t.signed : !!n.signed,
55
+ payload: t == null ? void 0 : t.payload
56
+ };
57
+ }),
58
+ [e, o]
59
+ ), c = F(
60
+ () => u.reduce((n, t) => t.signed ? n + 1 : n, 0),
61
+ [u]
62
+ ), a = u.length, d = a > 0 && c === a, l = S((n) => {
63
+ i(n);
64
+ }, []), f = S(() => {
65
+ i(null);
66
+ }, []), m = S((n, t) => {
67
+ r((p) => ({ ...p, [n]: { signed: !0, payload: t } })), i((p) => p === n ? null : p);
68
+ }, []), g = S(
69
+ (n) => {
70
+ var t;
71
+ return !!((t = o[n]) != null && t.signed);
72
+ },
73
+ [o]
74
+ ), h = S(() => {
75
+ r(v(e, !0)), i(null);
76
+ }, [e]);
77
+ return F(
78
+ () => ({
79
+ fields: u,
80
+ signedCount: c,
81
+ total: a,
82
+ isComplete: d,
83
+ activeFieldId: s,
84
+ openField: l,
85
+ closeField: f,
86
+ markSigned: m,
87
+ isFieldSigned: g,
88
+ reset: h
89
+ }),
90
+ [
91
+ u,
92
+ c,
93
+ a,
94
+ d,
95
+ s,
96
+ l,
97
+ f,
98
+ m,
99
+ g,
100
+ h
101
+ ]
102
+ );
103
+ }
104
+ export {
105
+ B as a,
106
+ k as u
107
+ };
108
+ //# sourceMappingURL=use-signing-session-C5evzYmo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-signing-session-C5evzYmo.js","sources":["../../src/hooks/use-scroll-to-first-error.ts","../../src/hooks/use-signing-session.ts"],"sourcesContent":["import { useEffect, useRef, type RefObject } from 'react';\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface UseScrollToFirstErrorOptions {\n /**\n * Limits the DOM query to this element. Useful when the page renders\n * more than one form, or when an unrelated component happens to share\n * a field name. Defaults to `document`.\n */\n scope?: RefObject<HTMLElement | null>;\n /**\n * Forwarded to `scrollIntoView`. Defaults to\n * `{ behavior: 'smooth', block: 'center' }`. Pass\n * `{ behavior: 'auto' }` (or omit `behavior`) on consumers that\n * respect `prefers-reduced-motion` upstream — the kit doesn't shadow\n * the user's motion preference inside the hook, since some consumers\n * deliberately keep a near-instant snap for power-user form flows.\n */\n scrollOptions?: ScrollIntoViewOptions;\n /**\n * Move keyboard focus to the errored field after scrolling. Default\n * `true`. The focus call uses `preventScroll: true` so the smooth\n * scroll the hook just did isn't replaced by a snap.\n *\n * Setting this `false` defeats the keyboard-user side of WCAG 3.3.1\n * — the viewport will scroll but the active element stays on the\n * submit button, forcing a Shift+Tab back into the form. Only flip\n * this off when an upstream concern (e.g. a custom error summary\n * panel that owns its own focus) is taking responsibility.\n */\n focus?: boolean;\n /**\n * On the very first render, do nothing even if `errors` already has\n * entries. Default `true`. Without this the hook would yank the\n * viewport whenever a form is hydrated with server-rendered errors\n * from a no-JS fallback path — bad UX, since the user landed on the\n * page and hasn't asked for any movement yet. Set `false` only when\n * the consumer explicitly wants the initial-mount scroll (rare).\n */\n skipInitialMount?: boolean;\n}\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nfunction getScopeRoot(\n scope: RefObject<HTMLElement | null> | undefined,\n): ParentNode | null {\n if (scope?.current) return scope.current;\n if (typeof document === 'undefined') return null;\n return document;\n}\n\n/**\n * Resolve the DOM element to scroll/focus for a given errored field\n * name. The match order is:\n *\n * 1. `[data-error-anchor=\"<name>\"]` — the consumer's explicit hook,\n * used for Radix-based fields (Checkbox / Select / Switch) where\n * the named `<input>` is hidden behind a visible `<button>`.\n * Consumers set this on the trigger.\n * 2. `[name=\"<name>\"]` — the literal field name.\n * 3. `[name$=\"[<name>]\"]` — Symfony form-prefixed names like\n * `privacy_generator[fiscal_code]`. Suffix match keeps the hook\n * consumer-agnostic; no need to thread the form prefix through.\n *\n * Returns the first visible element among the matches. \"Visible\" here\n * means `offsetParent !== null` — that's the cheap heuristic Radix's\n * hidden inputs (display:none-equivalent positioning) fail and the\n * visible triggers pass. Falls back to the first match if every match\n * is hidden, so a field can still be scrolled into view even when the\n * trigger uses a non-standard layout.\n */\nfunction findErrorElement(name: string, root: ParentNode): HTMLElement | null {\n // `CSS.escape` is load-bearing here, not cosmetic. The Symfony\n // suffix-match arm embeds `name` inside `[name$=\"[${safe}]\"]`, so a\n // field name containing `]` would otherwise close the attribute\n // selector early and turn the rest of the string into stray\n // selector tokens. We don't expect adversarial input in practice\n // (server-controlled field names), but a server returning a `]`\n // in a 422 payload shouldn't be able to break the query.\n const safe =\n typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n ? CSS.escape(name)\n : // SSR / jsdom fallback — drop every character that's\n // significant in a CSS attribute selector. Conservative but\n // robust enough for the test environment.\n name.replace(/[\"'\\\\[\\]]/g, '');\n const selector =\n `[data-error-anchor=\"${safe}\"], ` +\n `[name=\"${safe}\"], ` +\n `[name$=\"[${safe}]\"]`;\n\n const matches = Array.from(root.querySelectorAll<HTMLElement>(selector));\n if (matches.length === 0) return null;\n\n const visible = matches.find((el) => el.offsetParent !== null);\n return visible ?? matches[0];\n}\n\n/* -------------------------------------------------------------------- */\n/* Hook */\n/* -------------------------------------------------------------------- */\n\n/**\n * Scrolls the first errored field into view and (by default) focuses\n * it, after `errors` changes. Backs the standard AlfaDocs rebrand\n * validation-error UX: after a 422 with `{ errors: { field: message } }`\n * is rendered inline, the user shouldn't be left staring at red labels\n * they can't see. Implements WCAG 3.3.1 / 3.3.3.\n *\n * The hook is stateless and never mutates the DOM beyond the\n * `scrollIntoView` + `focus` calls.\n *\n * @example\n * const fieldOrder = ['firstName', 'email', 'fiscalCode'] as const;\n * const [errors, setErrors] = useState<Record<string, string>>({});\n * useScrollToFirstError(errors, fieldOrder);\n *\n * @example Radix-based field\n * <Checkbox data-error-anchor=\"consent\" name=\"consent\" />\n * // hook scrolls to the visible <button>, not Radix's hidden input.\n *\n * @example Scoped to one form\n * const formRef = useRef<HTMLFormElement>(null);\n * useScrollToFirstError(errors, fieldOrder, { scope: formRef });\n */\nexport function useScrollToFirstError(\n errors: Readonly<Record<string, string | undefined>>,\n fieldOrder: ReadonlyArray<string>,\n options: UseScrollToFirstErrorOptions = {},\n): void {\n const {\n scope,\n scrollOptions = { behavior: 'smooth', block: 'center' },\n focus = true,\n skipInitialMount = true,\n } = options;\n\n // Single ref guards the initial-mount skip across StrictMode's\n // mount/unmount/remount cycle — flipped inside the effect body, not\n // in cleanup, so the second run sees `true` and stays gated.\n const ranOnceRef = useRef(false);\n\n // Track the previous \"first errored field name\" so a re-render that\n // leaves the same field errored doesn't re-scroll. We intentionally\n // depend on the resolved name (not the whole errors object) — that\n // way callers can mutate `errors` shape freely as long as the head\n // of the validation list is stable, which is the typical pattern\n // after a server returns the same 422 twice in a row.\n const lastScrolledFieldRef = useRef<string | null>(null);\n\n // Resolve the first errored field by visual order. A field is\n // \"errored\" iff its key has a truthy string value — the kit's form\n // contract is `Record<string, string | undefined>` where `undefined`\n // / missing keys mean \"no error\".\n const firstErroredField =\n fieldOrder.find((name) => Boolean(errors[name])) ?? null;\n\n useEffect(() => {\n if (skipInitialMount && !ranOnceRef.current) {\n ranOnceRef.current = true;\n // Record what we skipped so the next render doesn't try to\n // scroll to a field that was already errored at mount.\n lastScrolledFieldRef.current = firstErroredField;\n return;\n }\n\n if (!firstErroredField) {\n lastScrolledFieldRef.current = null;\n return;\n }\n\n if (firstErroredField === lastScrolledFieldRef.current) return;\n\n if (typeof window === 'undefined') return;\n\n // rAF defers the scroll until after the browser has laid out the\n // freshly-rendered error labels. Calling scrollIntoView synchronously\n // inside useEffect would fire before the new DOM is painted on\n // some browsers, leaving the viewport pointing at the old layout.\n const handle = window.requestAnimationFrame(() => {\n const root = getScopeRoot(scope);\n if (!root) return;\n const el = findErrorElement(firstErroredField, root);\n if (!el) return;\n\n el.scrollIntoView(scrollOptions);\n if (focus) {\n // preventScroll: true so the browser doesn't override the\n // smooth scroll above with a snap to put the element at the\n // top of the viewport.\n el.focus({ preventScroll: true });\n }\n lastScrolledFieldRef.current = firstErroredField;\n });\n\n return () => window.cancelAnimationFrame(handle);\n // `scrollOptions` / `focus` / `scope` / `skipInitialMount` are\n // option bag values — re-running on their identity change would\n // be surprising. The hook re-fires only when the field at the\n // head of the errored list changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [firstErroredField]);\n}\n","import { useCallback, useMemo, useState } from 'react';\n\n/* ------------------------------------------------------------------ */\n/* useSigningSession */\n/* */\n/* Orchestration state for a multi-field signing flow: N signature */\n/* fields across M pages (and optionally multiple PDFs per envelope), */\n/* a live \"X of Y signed\" counter, and a completion gate. Pure state — */\n/* no I/O, no globals, no persistence. The consumer owns the documents, */\n/* the capture UI, and where signatures are sent. */\n/* */\n/* Generic over the field shape (so geometry / page / docIndex / label */\n/* ride along untouched and `fields` can map straight onto SignatureField)*/\n/* and over the captured payload type (typically SignatureConfirmPayload).*/\n/* */\n/* The SET of field ids and their initial `signed` flags are captured at */\n/* first render — an envelope's fields are fixed for the session. Field */\n/* geometry/label changes still flow through `fields` on every render. */\n/* ------------------------------------------------------------------ */\n\n/** Minimum shape a signing field must satisfy. */\nexport interface SigningFieldBase {\n /** Stable, unique id for the field within the session. */\n id: string;\n /** Initial signed state (default `false`). */\n signed?: boolean;\n}\n\ninterface SignedEntry<TPayload> {\n signed: boolean;\n payload?: TPayload;\n}\n\n/** A consumer field enriched with the session's live signed state + payload. */\nexport type SigningField<TField extends SigningFieldBase, TPayload> = TField & {\n signed: boolean;\n payload?: TPayload;\n};\n\nexport interface UseSigningSessionReturn<\n TField extends SigningFieldBase,\n TPayload,\n> {\n /** The input fields, each enriched with live `signed` + `payload`. */\n fields: SigningField<TField, TPayload>[];\n /** How many fields are currently signed. */\n signedCount: number;\n /** Total number of fields. */\n total: number;\n /** True when every field is signed (and there is at least one). */\n isComplete: boolean;\n /** The field whose capture UI is currently open, or `null`. */\n activeFieldId: string | null;\n /** Open a field's capture UI (sets `activeFieldId`). */\n openField: (id: string) => void;\n /** Close any open capture UI (clears `activeFieldId`). */\n closeField: () => void;\n /** Flip a field to signed, storing its payload, and close it if active. */\n markSigned: (id: string, payload?: TPayload) => void;\n /** Read a single field's signed state. */\n isFieldSigned: (id: string) => boolean;\n /** Clear all signatures and close any open field. */\n reset: () => void;\n}\n\nfunction seedSigned<TField extends SigningFieldBase, TPayload>(\n fields: TField[],\n forceUnsigned = false,\n): Record<string, SignedEntry<TPayload>> {\n const map: Record<string, SignedEntry<TPayload>> = {};\n for (const field of fields) {\n map[field.id] = { signed: forceUnsigned ? false : Boolean(field.signed) };\n }\n return map;\n}\n\nexport function useSigningSession<\n TField extends SigningFieldBase,\n TPayload = unknown,\n>(fields: TField[]): UseSigningSessionReturn<TField, TPayload> {\n const [signed, setSigned] = useState<Record<string, SignedEntry<TPayload>>>(\n () => seedSigned<TField, TPayload>(fields),\n );\n const [activeFieldId, setActiveFieldId] = useState<string | null>(null);\n\n const enriched = useMemo<SigningField<TField, TPayload>[]>(\n () =>\n fields.map((field) => {\n const entry = signed[field.id];\n return {\n ...field,\n signed: entry ? entry.signed : Boolean(field.signed),\n payload: entry?.payload,\n };\n }),\n [fields, signed],\n );\n\n const signedCount = useMemo(\n () =>\n enriched.reduce((count, field) => (field.signed ? count + 1 : count), 0),\n [enriched],\n );\n const total = enriched.length;\n const isComplete = total > 0 && signedCount === total;\n\n const openField = useCallback((id: string) => {\n setActiveFieldId(id);\n }, []);\n\n const closeField = useCallback(() => {\n setActiveFieldId(null);\n }, []);\n\n const markSigned = useCallback((id: string, payload?: TPayload) => {\n setSigned((prev) => ({ ...prev, [id]: { signed: true, payload } }));\n setActiveFieldId((current) => (current === id ? null : current));\n }, []);\n\n const isFieldSigned = useCallback(\n (id: string) => Boolean(signed[id]?.signed),\n [signed],\n );\n\n const reset = useCallback(() => {\n setSigned(seedSigned<TField, TPayload>(fields, true));\n setActiveFieldId(null);\n }, [fields]);\n\n return useMemo(\n () => ({\n fields: enriched,\n signedCount,\n total,\n isComplete,\n activeFieldId,\n openField,\n closeField,\n markSigned,\n isFieldSigned,\n reset,\n }),\n [\n enriched,\n signedCount,\n total,\n isComplete,\n activeFieldId,\n openField,\n closeField,\n markSigned,\n isFieldSigned,\n reset,\n ],\n );\n}\n"],"names":["getScopeRoot","scope","findErrorElement","name","root","safe","selector","matches","el","useScrollToFirstError","errors","fieldOrder","options","scrollOptions","focus","skipInitialMount","ranOnceRef","useRef","lastScrolledFieldRef","firstErroredField","useEffect","handle","seedSigned","fields","forceUnsigned","map","field","useSigningSession","signed","setSigned","useState","activeFieldId","setActiveFieldId","enriched","useMemo","entry","signedCount","count","total","isComplete","openField","useCallback","id","closeField","markSigned","payload","prev","current","isFieldSigned","_a","reset"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.52.0",
3
+ "packageVersion": "0.53.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -1,5 +1,5 @@
1
- export { usePrefersReducedMotion, useMediaQuery, useScrollToFirstError, useLocale, useTheme, resolveTheme, themeClassList, THEME_CLASS, THEME_STORAGE_KEY, ACCESSIBILITY_STORAGE_KEY, } from '../hooks';
2
- export type { LocaleDir, UseLocaleReturn, UseScrollToFirstErrorOptions, ThemePreference, AccessibilityPreference, ResolvedTheme, UseThemeReturn, } from '../hooks';
1
+ export { usePrefersReducedMotion, useMediaQuery, useScrollToFirstError, useLocale, useTheme, resolveTheme, themeClassList, THEME_CLASS, THEME_STORAGE_KEY, ACCESSIBILITY_STORAGE_KEY, useSigningSession, } from '../hooks';
2
+ export type { LocaleDir, UseLocaleReturn, UseScrollToFirstErrorOptions, ThemePreference, AccessibilityPreference, ResolvedTheme, UseThemeReturn, SigningField, SigningFieldBase, UseSigningSessionReturn, } from '../hooks';
3
3
  export * from './button';
4
4
  export * from './button-group';
5
5
  export * from './floating-action-button';
@@ -152,6 +152,7 @@ export * from './pdf-viewer';
152
152
  export * from './reviews-panel';
153
153
  export * from './rich-text-editor';
154
154
  export * from './signature-capture';
155
+ export * from './signature-field';
155
156
  export * from './sign-document';
156
157
  export * from './slot-grid';
157
158
  export * from './tooth-scheme';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { O as r } from "../../_chunks/otp-input-CMphfBxZ.js";
1
+ import { O as r } from "../../_chunks/otp-input-Chb9r5vf.js";
2
2
  export {
3
3
  r as OTPInput
4
4
  };
@@ -34,6 +34,12 @@ export interface OTPInputProps {
34
34
  * Default `false` so the listener stays opt-in.
35
35
  */
36
36
  webOtp?: boolean;
37
+ /**
38
+ * When set, renders a hidden `<input name={name}>` kept in sync with the
39
+ * packed code so consumers can POST the OTP declaratively, e.g.
40
+ * `sms_code_form[code]`. Default off — no behaviour change.
41
+ */
42
+ name?: string;
37
43
  }
38
44
  export declare const OTPInput: import("react").ForwardRefExoticComponent<OTPInputProps & import("react").RefAttributes<OTPInputHandle>>;
39
45
  //# sourceMappingURL=otp-input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"otp-input.d.ts","sourceRoot":"","sources":["../../../src/components/otp-input/otp-input.tsx"],"names":[],"mappings":"AAsBA,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,OAAO,CAAC;CAC3B;AA0BD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqBD,eAAO,MAAM,QAAQ,0GAsPpB,CAAC"}
1
+ {"version":3,"file":"otp-input.d.ts","sourceRoot":"","sources":["../../../src/components/otp-input/otp-input.tsx"],"names":[],"mappings":"AAsBA,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,OAAO,CAAC;CAC3B;AA0BD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqBD,eAAO,MAAM,QAAQ,0GA0PpB,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export { PDFViewer } from './pdf-viewer';
2
- export type { PDFViewerProps, PDFViewerHandle, PDFZoomPreset, } from './pdf-viewer';
2
+ export type { PDFViewerProps, PDFViewerHandle, PDFZoomPreset, PDFPageOverlayArgs, PDFPageRotation, } from './pdf-viewer';
3
3
  export { pdfViewerAgent } from './pdf-viewer.agent';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { P as r, p } from "../../_chunks/public-header.agent-BY6FH71R.js";
1
+ import { P as r, p } from "../../_chunks/public-header.agent-DyVpPwmv.js";
2
2
  export {
3
3
  r as PublicHeader,
4
4
  p as publicHeaderAgent
@@ -65,7 +65,7 @@ export interface PublicHeaderDropdownLinkProps extends Omit<AnchorHTMLAttributes
65
65
  children: ReactNode;
66
66
  }
67
67
  declare const rootVariants: (props?: ({
68
- variant?: "dark" | "pill" | "transparent" | null | undefined;
68
+ variant?: "dark" | "brand" | "pill" | "transparent" | null | undefined;
69
69
  sticky?: "none" | "top" | "scroll-up" | null | undefined;
70
70
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
71
71
  export declare const PublicHeader: import("react").ForwardRefExoticComponent<PublicHeaderProps & import("react").RefAttributes<HTMLElement>> & {
@@ -1 +1 @@
1
- {"version":3,"file":"public-header.d.ts","sourceRoot":"","sources":["../../../src/components/public-header/public-header.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAUL,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAE7B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWlE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBACf,SACE,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,EACpD,YAAY,CAAC,OAAO,YAAY,CAAC;IACnC,qFAAqF;IACrF,IAAI,EAAE,SAAS,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kEAAkE;IAClE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC;IACtC,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CACpD,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,CACX;IACC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,iDAAiD;IACjD,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,QAAQ,EAAE,SAAS,CAAC;IACpB,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,CACX;IACC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAqBD,QAAA,MAAM,YAAY;;;8EAiEjB,CAAC;AAysBF,eAAO,MAAM,YAAY;;;;;CAKvB,CAAC"}
1
+ {"version":3,"file":"public-header.d.ts","sourceRoot":"","sources":["../../../src/components/public-header/public-header.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAUL,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAE7B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWlE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBACf,SACE,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,EACpD,YAAY,CAAC,OAAO,YAAY,CAAC;IACnC,qFAAqF;IACrF,IAAI,EAAE,SAAS,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kEAAkE;IAClE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC;IACtC,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CACpD,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,CACX;IACC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,iDAAiD;IACjD,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,QAAQ,EAAE,SAAS,CAAC;IACpB,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CACzD,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,CACX;IACC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAqBD,QAAA,MAAM,YAAY;;;8EA2EjB,CAAC;AAysBF,eAAO,MAAM,YAAY;;;;;CAKvB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { S as o, s } from "../../_chunks/sign-document-Bzld9jVM.js";
1
+ import { S as o, s } from "../../_chunks/sign-document-BzHTjMVC.js";
2
2
  export {
3
3
  o as SignDocument,
4
4
  s as signDocumentAgent
@@ -1,4 +1,4 @@
1
- import { S as r, s as t } from "../../_chunks/signature-capture-CpMBhqQ9.js";
1
+ import { S as r, s as t } from "../../_chunks/signature-capture-CHbrKoA_.js";
2
2
  export {
3
3
  r as SignatureCapture,
4
4
  t as signatureCaptureAgent
@@ -34,6 +34,13 @@ export interface SignatureCaptureProps {
34
34
  backgroundColor?: string;
35
35
  /** Show the typed-name fallback toggle. Default `true`. */
36
36
  allowTypedFallback?: boolean;
37
+ /**
38
+ * When set, on confirm() the captured PNG data URL is written into a hidden
39
+ * `<input name={name}>` so consumers can POST the signature declaratively.
40
+ * The PNG data URL satisfies the server's `data:image/png` prefix check.
41
+ * Default off.
42
+ */
43
+ name?: string;
37
44
  /** Disable the entire component. */
38
45
  disabled?: boolean;
39
46
  /** Accessible label for the pad region. */