@alfadocs/ui-kit-debug 0.38.0 → 0.40.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 (266) hide show
  1. package/dist/_chunks/{accordion-bSU21uTV.js → accordion-9lJSMMsZ.js} +6 -6
  2. package/dist/_chunks/accordion-9lJSMMsZ.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-By_asPN9.js → agenda-tray-Dyj9ChHC.js} +22 -21
  4. package/dist/_chunks/agenda-tray-Dyj9ChHC.js.map +1 -0
  5. package/dist/_chunks/{bmi-calculator-BRUru9QX.js → bmi-calculator-DnEr513I.js} +2 -2
  6. package/dist/_chunks/{bmi-calculator-BRUru9QX.js.map → bmi-calculator-DnEr513I.js.map} +1 -1
  7. package/dist/_chunks/{booking-DK_BPHnQ.js → booking-4mCw3Mpl.js} +2 -2
  8. package/dist/_chunks/{booking-DK_BPHnQ.js.map → booking-4mCw3Mpl.js.map} +1 -1
  9. package/dist/_chunks/{chart-DnHvmiDX.js → chart-Cbt0_sKv.js} +46 -37
  10. package/dist/_chunks/chart-Cbt0_sKv.js.map +1 -0
  11. package/dist/_chunks/{collapsible-CERONory.js → collapsible-X3oaLPU3.js} +5 -5
  12. package/dist/_chunks/collapsible-X3oaLPU3.js.map +1 -0
  13. package/dist/_chunks/{document-scanner-CdHQ6lTN.js → document-scanner-CqS_klIr.js} +56 -55
  14. package/dist/_chunks/document-scanner-CqS_klIr.js.map +1 -0
  15. package/dist/_chunks/{editable-currency-cell-renderer-DGKuRNVG.js → editable-currency-cell-renderer-DgkCIIcO.js} +2 -2
  16. package/dist/_chunks/{editable-currency-cell-renderer-DGKuRNVG.js.map → editable-currency-cell-renderer-DgkCIIcO.js.map} +1 -1
  17. package/dist/_chunks/{file-upload-CnzRcErt.js → file-upload-BosbPDb1.js} +2 -2
  18. package/dist/_chunks/file-upload-BosbPDb1.js.map +1 -0
  19. package/dist/_chunks/{freemium-paywall-D1N02Oam.js → freemium-paywall-BAk3a6er.js} +7 -7
  20. package/dist/_chunks/{freemium-paywall-D1N02Oam.js.map → freemium-paywall-BAk3a6er.js.map} +1 -1
  21. package/dist/_chunks/header-settings-CBLwUK6t.js +244 -0
  22. package/dist/_chunks/header-settings-CBLwUK6t.js.map +1 -0
  23. package/dist/_chunks/{map-view-vD5pvWs9.js → map-view-qJLybrmN.js} +2 -2
  24. package/dist/_chunks/{map-view-vD5pvWs9.js.map → map-view-qJLybrmN.js.map} +1 -1
  25. package/dist/_chunks/marketplace-app-shell-BlxVizU4.js +296 -0
  26. package/dist/_chunks/marketplace-app-shell-BlxVizU4.js.map +1 -0
  27. package/dist/_chunks/{message-card-BbRhZkDI.js → message-card-DSPw5ghw.js} +20 -19
  28. package/dist/_chunks/message-card-DSPw5ghw.js.map +1 -0
  29. package/dist/_chunks/{message-tray-B762TKuv.js → message-tray-hSQff9u4.js} +3 -3
  30. package/dist/_chunks/message-tray-hSQff9u4.js.map +1 -0
  31. package/dist/_chunks/{notification-card-DMdO4g54.js → notification-card-CObnGdJu.js} +22 -21
  32. package/dist/_chunks/notification-card-CObnGdJu.js.map +1 -0
  33. package/dist/_chunks/{notification-tray-Dl3FTleW.js → notification-tray-BWHDIjgd.js} +2 -2
  34. package/dist/_chunks/{notification-tray-Dl3FTleW.js.map → notification-tray-BWHDIjgd.js.map} +1 -1
  35. package/dist/_chunks/{otp-input-CDTWT5EK.js → otp-input-CMphfBxZ.js} +70 -71
  36. package/dist/_chunks/otp-input-CMphfBxZ.js.map +1 -0
  37. package/dist/_chunks/{patient-shell-Bz3CdO84.js → patient-shell-DF81lALv.js} +36 -35
  38. package/dist/_chunks/{patient-shell-Bz3CdO84.js.map → patient-shell-DF81lALv.js.map} +1 -1
  39. package/dist/_chunks/{payment-form-D5rgnZu7.js → payment-form-Dy3WIIsC.js} +18 -18
  40. package/dist/_chunks/payment-form-Dy3WIIsC.js.map +1 -0
  41. package/dist/_chunks/{pdf-viewer-DvtEHcEP.js → pdf-viewer-Cy6Ul3hZ.js} +2 -2
  42. package/dist/_chunks/pdf-viewer-Cy6Ul3hZ.js.map +1 -0
  43. package/dist/_chunks/{practice-results-C8ciLQap.js → practice-results-C0d4IL5E.js} +2 -2
  44. package/dist/_chunks/{practice-results-C8ciLQap.js.map → practice-results-C0d4IL5E.js.map} +1 -1
  45. package/dist/_chunks/{public-footer.agent-zw1vFin_.js → public-footer.agent-okt8ZRc5.js} +2 -2
  46. package/dist/_chunks/{public-footer.agent-zw1vFin_.js.map → public-footer.agent-okt8ZRc5.js.map} +1 -1
  47. package/dist/_chunks/{reviews-panel-Dow8Dzoa.js → reviews-panel-CPrXu5TX.js} +2 -2
  48. package/dist/_chunks/{reviews-panel-Dow8Dzoa.js.map → reviews-panel-CPrXu5TX.js.map} +1 -1
  49. package/dist/_chunks/{sidebar-BbR8f6oe.js → sidebar-_vJXI9rB.js} +2 -2
  50. package/dist/_chunks/{sidebar-BbR8f6oe.js.map → sidebar-_vJXI9rB.js.map} +1 -1
  51. package/dist/_chunks/sign-document-CpLDZ6Db.js +316 -0
  52. package/dist/_chunks/sign-document-CpLDZ6Db.js.map +1 -0
  53. package/dist/_chunks/{signature-capture-C-fF71xI.js → signature-capture-DoiBd6i3.js} +138 -143
  54. package/dist/_chunks/signature-capture-DoiBd6i3.js.map +1 -0
  55. package/dist/_chunks/{sparkline-DEROcSl0.js → sparkline-DGhCSw8M.js} +55 -46
  56. package/dist/_chunks/sparkline-DGhCSw8M.js.map +1 -0
  57. package/dist/_chunks/{stepper-accordion-BfS6lUB9.js → stepper-accordion-Dki6r9ZE.js} +2 -2
  58. package/dist/_chunks/stepper-accordion-Dki6r9ZE.js.map +1 -0
  59. package/dist/_chunks/{tag-CyoaEmf_.js → tag-CdA0s_VV.js} +16 -16
  60. package/dist/_chunks/tag-CdA0s_VV.js.map +1 -0
  61. package/dist/_chunks/{task-card-BUVMh6HN.js → task-card-CPyQ5AXC.js} +6 -5
  62. package/dist/_chunks/task-card-CPyQ5AXC.js.map +1 -0
  63. package/dist/_chunks/{task-tray-DRK0b0Qb.js → task-tray-B8jFv5FV.js} +36 -35
  64. package/dist/_chunks/task-tray-B8jFv5FV.js.map +1 -0
  65. package/dist/_chunks/{transcript-panel-DyhTpAP7.js → transcript-panel-CR7VY1uw.js} +8 -7
  66. package/dist/_chunks/transcript-panel-CR7VY1uw.js.map +1 -0
  67. package/dist/_chunks/{warning-stack-bDicCvxs.js → warning-stack-DNR3-IbP.js} +17 -16
  68. package/dist/_chunks/warning-stack-DNR3-IbP.js.map +1 -0
  69. package/dist/_chunks/{workflow-map-uSiHbOWQ.js → workflow-map-C3gB0FvB.js} +3 -2
  70. package/dist/_chunks/{workflow-map-uSiHbOWQ.js.map → workflow-map-C3gB0FvB.js.map} +1 -1
  71. package/dist/agent-catalog.json +39 -1
  72. package/dist/brand/product-lockup/product-lockup.d.ts.map +1 -1
  73. package/dist/components/accordion/index.js +1 -1
  74. package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
  75. package/dist/components/agenda-tray/index.js +1 -1
  76. package/dist/components/bmi-calculator/index.js +1 -1
  77. package/dist/components/booking/index.js +1 -1
  78. package/dist/components/chart/chart.d.ts +1 -1
  79. package/dist/components/chart/chart.d.ts.map +1 -1
  80. package/dist/components/chart/index.js +1 -1
  81. package/dist/components/collapsible/index.js +1 -1
  82. package/dist/components/data-table/index.js +1 -1
  83. package/dist/components/document-scanner/document-scanner.d.ts.map +1 -1
  84. package/dist/components/document-scanner/index.js +1 -1
  85. package/dist/components/file-upload/index.js +1 -1
  86. package/dist/components/freemium-paywall/index.js +1 -1
  87. package/dist/components/header-settings/header-settings.agent.d.ts +4 -0
  88. package/dist/components/header-settings/header-settings.agent.d.ts.map +1 -0
  89. package/dist/components/header-settings/header-settings.d.ts +36 -0
  90. package/dist/components/header-settings/header-settings.d.ts.map +1 -0
  91. package/dist/components/header-settings/index.d.ts +2 -0
  92. package/dist/components/header-settings/index.d.ts.map +1 -0
  93. package/dist/components/header-settings/index.js +2 -241
  94. package/dist/components/header-settings/index.js.map +1 -1
  95. package/dist/components/index.d.ts +1 -0
  96. package/dist/components/index.d.ts.map +1 -1
  97. package/dist/components/locale-picker/locale-picker.agent.d.ts +4 -0
  98. package/dist/components/locale-picker/locale-picker.agent.d.ts.map +1 -0
  99. package/dist/components/locale-picker/locale-picker.d.ts +80 -0
  100. package/dist/components/locale-picker/locale-picker.d.ts.map +1 -0
  101. package/dist/components/map-view/index.js +1 -1
  102. package/dist/components/message-card/index.js +1 -1
  103. package/dist/components/message-card/message-card.d.ts.map +1 -1
  104. package/dist/components/message-tray/index.js +1 -1
  105. package/dist/components/notification-card/index.js +1 -1
  106. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  107. package/dist/components/notification-tray/index.js +1 -1
  108. package/dist/components/otp-input/index.d.ts +1 -1
  109. package/dist/components/otp-input/index.d.ts.map +1 -1
  110. package/dist/components/otp-input/index.js +1 -1
  111. package/dist/components/otp-input/otp-input.d.ts +1 -1
  112. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  113. package/dist/components/payment-form/index.js +1 -1
  114. package/dist/components/pdf-viewer/index.js +1 -1
  115. package/dist/components/practice-results/index.js +1 -1
  116. package/dist/components/public-footer/index.js +1 -1
  117. package/dist/components/reviews-panel/index.js +1 -1
  118. package/dist/components/sidebar/index.js +1 -1
  119. package/dist/components/sign-document/index.d.ts +4 -0
  120. package/dist/components/sign-document/index.d.ts.map +1 -0
  121. package/dist/components/sign-document/index.js +6 -0
  122. package/dist/components/sign-document/index.js.map +1 -0
  123. package/dist/components/sign-document/sign-document.agent.d.ts +4 -0
  124. package/dist/components/sign-document/sign-document.agent.d.ts.map +1 -0
  125. package/dist/components/sign-document/sign-document.d.ts +47 -0
  126. package/dist/components/sign-document/sign-document.d.ts.map +1 -0
  127. package/dist/components/signature-capture/index.js +1 -1
  128. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  129. package/dist/components/sparkline/index.js +1 -1
  130. package/dist/components/sparkline/sparkline.d.ts +1 -1
  131. package/dist/components/sparkline/sparkline.d.ts.map +1 -1
  132. package/dist/components/stepper-accordion/index.js +1 -1
  133. package/dist/components/tag/index.js +1 -1
  134. package/dist/components/task-card/index.js +1 -1
  135. package/dist/components/task-card/task-card.d.ts.map +1 -1
  136. package/dist/components/task-tray/index.js +1 -1
  137. package/dist/components/task-tray/task-tray.d.ts.map +1 -1
  138. package/dist/components/transcript-panel/index.js +1 -1
  139. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  140. package/dist/components/warning-stack/index.js +1 -1
  141. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  142. package/dist/components/workflow/index.js +1 -1
  143. package/dist/components/workflow/workflow-map.d.ts.map +1 -1
  144. package/dist/i18n/locale-meta.d.ts +56 -0
  145. package/dist/i18n/locale-meta.d.ts.map +1 -0
  146. package/dist/i18n/locales/ar.d.ts +22 -0
  147. package/dist/i18n/locales/ar.d.ts.map +1 -1
  148. package/dist/i18n/locales/ar.js +22 -0
  149. package/dist/i18n/locales/ar.js.map +1 -1
  150. package/dist/i18n/locales/de.d.ts +22 -0
  151. package/dist/i18n/locales/de.d.ts.map +1 -1
  152. package/dist/i18n/locales/de.js +22 -0
  153. package/dist/i18n/locales/de.js.map +1 -1
  154. package/dist/i18n/locales/el.d.ts +22 -0
  155. package/dist/i18n/locales/el.d.ts.map +1 -1
  156. package/dist/i18n/locales/el.js +22 -0
  157. package/dist/i18n/locales/el.js.map +1 -1
  158. package/dist/i18n/locales/en.d.ts +22 -0
  159. package/dist/i18n/locales/en.d.ts.map +1 -1
  160. package/dist/i18n/locales/en.js +22 -0
  161. package/dist/i18n/locales/en.js.map +1 -1
  162. package/dist/i18n/locales/es.d.ts +22 -0
  163. package/dist/i18n/locales/es.d.ts.map +1 -1
  164. package/dist/i18n/locales/es.js +22 -0
  165. package/dist/i18n/locales/es.js.map +1 -1
  166. package/dist/i18n/locales/fr.d.ts +22 -0
  167. package/dist/i18n/locales/fr.d.ts.map +1 -1
  168. package/dist/i18n/locales/fr.js +22 -0
  169. package/dist/i18n/locales/fr.js.map +1 -1
  170. package/dist/i18n/locales/hi.d.ts +22 -0
  171. package/dist/i18n/locales/hi.d.ts.map +1 -1
  172. package/dist/i18n/locales/hi.js +22 -0
  173. package/dist/i18n/locales/hi.js.map +1 -1
  174. package/dist/i18n/locales/it.d.ts +22 -0
  175. package/dist/i18n/locales/it.d.ts.map +1 -1
  176. package/dist/i18n/locales/it.js +22 -0
  177. package/dist/i18n/locales/it.js.map +1 -1
  178. package/dist/i18n/locales/ja.d.ts +22 -0
  179. package/dist/i18n/locales/ja.d.ts.map +1 -1
  180. package/dist/i18n/locales/ja.js +22 -0
  181. package/dist/i18n/locales/ja.js.map +1 -1
  182. package/dist/i18n/locales/nl.d.ts +22 -0
  183. package/dist/i18n/locales/nl.d.ts.map +1 -1
  184. package/dist/i18n/locales/nl.js +22 -0
  185. package/dist/i18n/locales/nl.js.map +1 -1
  186. package/dist/i18n/locales/pl.d.ts +22 -0
  187. package/dist/i18n/locales/pl.d.ts.map +1 -1
  188. package/dist/i18n/locales/pl.js +22 -0
  189. package/dist/i18n/locales/pl.js.map +1 -1
  190. package/dist/i18n/locales/pt.d.ts +22 -0
  191. package/dist/i18n/locales/pt.d.ts.map +1 -1
  192. package/dist/i18n/locales/pt.js +22 -0
  193. package/dist/i18n/locales/pt.js.map +1 -1
  194. package/dist/i18n/locales/ro.d.ts +22 -0
  195. package/dist/i18n/locales/ro.d.ts.map +1 -1
  196. package/dist/i18n/locales/ro.js +22 -0
  197. package/dist/i18n/locales/ro.js.map +1 -1
  198. package/dist/i18n/locales/ru.d.ts +22 -0
  199. package/dist/i18n/locales/ru.d.ts.map +1 -1
  200. package/dist/i18n/locales/ru.js +22 -0
  201. package/dist/i18n/locales/ru.js.map +1 -1
  202. package/dist/i18n/locales/sq.d.ts +22 -0
  203. package/dist/i18n/locales/sq.d.ts.map +1 -1
  204. package/dist/i18n/locales/sq.js +22 -0
  205. package/dist/i18n/locales/sq.js.map +1 -1
  206. package/dist/i18n/locales/sv.d.ts +22 -0
  207. package/dist/i18n/locales/sv.d.ts.map +1 -1
  208. package/dist/i18n/locales/sv.js +22 -0
  209. package/dist/i18n/locales/sv.js.map +1 -1
  210. package/dist/i18n/locales/tr.d.ts +22 -0
  211. package/dist/i18n/locales/tr.d.ts.map +1 -1
  212. package/dist/i18n/locales/tr.js +22 -0
  213. package/dist/i18n/locales/tr.js.map +1 -1
  214. package/dist/i18n/locales/zh.d.ts +22 -0
  215. package/dist/i18n/locales/zh.d.ts.map +1 -1
  216. package/dist/i18n/locales/zh.js +22 -0
  217. package/dist/i18n/locales/zh.js.map +1 -1
  218. package/dist/index.js +110 -107
  219. package/dist/index.js.map +1 -1
  220. package/dist/locales/ar.json +22 -0
  221. package/dist/locales/de.json +22 -0
  222. package/dist/locales/el.json +22 -0
  223. package/dist/locales/en.json +22 -0
  224. package/dist/locales/es.json +22 -0
  225. package/dist/locales/fr.json +22 -0
  226. package/dist/locales/hi.json +22 -0
  227. package/dist/locales/it.json +22 -0
  228. package/dist/locales/ja.json +22 -0
  229. package/dist/locales/nl.json +22 -0
  230. package/dist/locales/pl.json +22 -0
  231. package/dist/locales/pt.json +22 -0
  232. package/dist/locales/ro.json +22 -0
  233. package/dist/locales/ru.json +22 -0
  234. package/dist/locales/sq.json +22 -0
  235. package/dist/locales/sv.json +22 -0
  236. package/dist/locales/tr.json +22 -0
  237. package/dist/locales/zh.json +22 -0
  238. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  239. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +12 -8
  240. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  241. package/dist/patterns/patient-shell/index.js +1 -1
  242. package/dist/patterns/patient-shell/patient-shell.d.ts.map +1 -1
  243. package/dist/tokens.css +1 -1
  244. package/package.json +5 -1
  245. package/dist/_chunks/accordion-bSU21uTV.js.map +0 -1
  246. package/dist/_chunks/agenda-tray-By_asPN9.js.map +0 -1
  247. package/dist/_chunks/chart-DnHvmiDX.js.map +0 -1
  248. package/dist/_chunks/collapsible-CERONory.js.map +0 -1
  249. package/dist/_chunks/document-scanner-CdHQ6lTN.js.map +0 -1
  250. package/dist/_chunks/file-upload-CnzRcErt.js.map +0 -1
  251. package/dist/_chunks/marketplace-app-shell-BnClrL2B.js +0 -295
  252. package/dist/_chunks/marketplace-app-shell-BnClrL2B.js.map +0 -1
  253. package/dist/_chunks/message-card-BbRhZkDI.js.map +0 -1
  254. package/dist/_chunks/message-tray-B762TKuv.js.map +0 -1
  255. package/dist/_chunks/notification-card-DMdO4g54.js.map +0 -1
  256. package/dist/_chunks/otp-input-CDTWT5EK.js.map +0 -1
  257. package/dist/_chunks/payment-form-D5rgnZu7.js.map +0 -1
  258. package/dist/_chunks/pdf-viewer-DvtEHcEP.js.map +0 -1
  259. package/dist/_chunks/signature-capture-C-fF71xI.js.map +0 -1
  260. package/dist/_chunks/sparkline-DEROcSl0.js.map +0 -1
  261. package/dist/_chunks/stepper-accordion-BfS6lUB9.js.map +0 -1
  262. package/dist/_chunks/tag-CyoaEmf_.js.map +0 -1
  263. package/dist/_chunks/task-card-BUVMh6HN.js.map +0 -1
  264. package/dist/_chunks/task-tray-DRK0b0Qb.js.map +0 -1
  265. package/dist/_chunks/transcript-panel-DyhTpAP7.js.map +0 -1
  266. package/dist/_chunks/warning-stack-bDicCvxs.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { jsxs as X, jsx as h } from "react/jsx-runtime";
2
- import { forwardRef as ze, useId as Se, useMemo as ae, useRef as C, useState as N, useEffect as P, useCallback as T, useImperativeHandle as Re } from "react";
1
+ import { jsxs as W, jsx as k } from "react/jsx-runtime";
2
+ import { forwardRef as Ce, useId as Se, useMemo as se, useRef as z, useState as N, useEffect as P, useCallback as T, useImperativeHandle as Re } from "react";
3
3
  import Ae from "signature_pad";
4
4
  import { c as R } from "./index-D2ZczOXr.js";
5
5
  import { useTranslation as Me } from "react-i18next";
@@ -48,7 +48,9 @@ const Pe = {
48
48
  "ds:signature-capture-alfadocs ds:flex ds:flex-col",
49
49
  "ds:gap-[var(--spacing-sm)]",
50
50
  "ds:bg-[var(--background)] ds:text-[var(--foreground)]",
51
- "ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]",
51
+ "ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]",
52
+ "ds:shadow-[var(--shadow-card)]",
53
+ "ds:[.theme-accessible_&]:border-2",
52
54
  "ds:p-[var(--spacing-sm)]",
53
55
  "ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed"
54
56
  ].join(" ")
@@ -76,18 +78,21 @@ const Pe = {
76
78
  "ds:select-none"
77
79
  ].join(" ")
78
80
  ), Ee = R(
79
- ["ds:flex ds:items-center ds:flex-wrap ds:gap-[var(--spacing-xs)]"].join(" ")
80
- ), q = R(
81
+ ["ds:flex ds:items-stretch ds:flex-wrap ds:gap-[var(--spacing-sm)]"].join(
82
+ " "
83
+ )
84
+ ), ae = R(
81
85
  [
82
- "ds:inline-flex ds:items-center ds:justify-center",
86
+ "ds:inline-flex ds:flex-1 ds:items-center ds:justify-center",
83
87
  "ds:min-block-size-[var(--min-target-size)]",
84
88
  "ds:min-inline-size-[var(--min-target-size)]",
85
89
  "ds:gap-[var(--spacing-xs)]",
86
- "ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]",
90
+ "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
91
+ "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]",
87
92
  "ds:rounded-[var(--radius-sm)]",
88
93
  "ds:border ds:border-[color:var(--border)]",
89
94
  "ds:bg-transparent ds:text-[var(--foreground)]",
90
- "ds:text-[length:var(--font-size-sm)] ds:font-medium",
95
+ "ds:text-[length:var(--font-size-base)] ds:font-medium",
91
96
  "ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
92
97
  "ds:hover:bg-[var(--muted)]",
93
98
  "ds:focus-visible:outline-[length:var(--focus-ring-width)]",
@@ -99,13 +104,14 @@ const Pe = {
99
104
  ].join(" ")
100
105
  ), Be = R(
101
106
  [
102
- "ds:inline-flex ds:items-center ds:justify-center",
107
+ "ds:inline-flex ds:flex-1 ds:items-center ds:justify-center",
103
108
  "ds:min-block-size-[var(--min-target-size)]",
104
109
  "ds:min-inline-size-[var(--min-target-size)]",
105
110
  "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
111
+ "ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]",
106
112
  "ds:rounded-[var(--radius-sm)]",
107
113
  "ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]",
108
- "ds:text-[length:var(--font-size-sm)] ds:font-medium",
114
+ "ds:text-[length:var(--font-size-base)] ds:font-medium",
109
115
  "ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none",
110
116
  "ds:hover:bg-[var(--primary-hover)]",
111
117
  "ds:focus-visible:outline-[length:var(--focus-ring-width)]",
@@ -138,7 +144,8 @@ const Pe = {
138
144
  "ds:inline-size-[var(--signature-width)]",
139
145
  "ds:block-size-[var(--signature-height)]",
140
146
  "ds:rounded-[var(--radius-sm)]",
141
- "ds:border ds:border-[color:var(--border)]",
147
+ "ds:border ds:border-[color:var(--card-border)]",
148
+ "ds:[.theme-accessible_&]:border-2",
142
149
  "ds:bg-[var(--background)] ds:text-[var(--foreground)]",
143
150
  "ds:font-[family-name:var(--font-sans)]",
144
151
  "ds:italic",
@@ -187,47 +194,47 @@ async function Ie(t) {
187
194
  return "";
188
195
  }
189
196
  function He(t, n, s, i, a) {
190
- const m = Math.max(
197
+ const v = Math.max(
191
198
  1,
192
199
  typeof window < "u" ? window.devicePixelRatio : 1
193
- ), z = document.createElement("canvas");
194
- z.width = Math.floor(n * m), z.height = Math.floor(s * m);
195
- const l = z.getContext("2d");
196
- return l && (l.setTransform(m, 0, 0, m, 0, 0), l.fillStyle = a, l.fillRect(0, 0, n, s), l.fillStyle = i, l.font = "32px italic sans-serif", l.textAlign = "center", l.textBaseline = "middle", l.fillText(t, n / 2, s / 2, n - 16)), z;
200
+ ), C = document.createElement("canvas");
201
+ C.width = Math.floor(n * v), C.height = Math.floor(s * v);
202
+ const d = C.getContext("2d");
203
+ return d && (d.setTransform(v, 0, 0, v, 0, 0), d.fillStyle = a, d.fillRect(0, 0, n, s), d.fillStyle = i, d.font = "32px italic sans-serif", d.textAlign = "center", d.textBaseline = "middle", d.fillText(t, n / 2, s / 2, n - 16)), C;
197
204
  }
198
- const Ue = ze(
205
+ const Ue = Ce(
199
206
  ({
200
207
  id: t,
201
208
  onConfirm: n,
202
209
  onClear: s,
203
210
  onStart: i,
204
211
  width: a = 400,
205
- height: m = 200,
206
- penColor: z,
207
- backgroundColor: l,
212
+ height: v = 200,
213
+ penColor: C,
214
+ backgroundColor: d,
208
215
  allowTypedFallback: ce = !0,
209
- disabled: f = !1,
216
+ disabled: b = !1,
210
217
  ariaLabel: le,
211
218
  className: ue
212
219
  }, fe) => {
213
- const { t: o } = Me(), G = Se(), Z = `${ae(
214
- () => `sig-${G.replace(/[^a-zA-Z0-9-_]/g, "")}`,
215
- [G]
216
- )}-live`, F = C(null), J = C(null), V = C(null), K = C(null), y = C(null), [d, ge] = N("draw"), [S, L] = N(""), [pe, I] = N(!1), ve = C("empty"), [me, be] = N(""), [b, he] = N(""), [w, ye] = N(""), j = C(i), E = C(s), B = C(n);
220
+ const { t: c } = Me(), X = Se(), q = `${se(
221
+ () => `sig-${X.replace(/[^a-zA-Z0-9-_]/g, "")}`,
222
+ [X]
223
+ )}-live`, F = z(null), G = z(null), V = z(null), Z = z(null), h = z(null), [l, ge] = N("draw"), [S, L] = N(""), [pe, I] = N(!1), ve = z("empty"), [me, be] = N(""), [m, he] = N(""), [y, ye] = N(""), j = z(i), E = z(s), B = z(n);
217
224
  P(() => {
218
225
  j.current = i, E.current = s, B.current = n;
219
226
  }, [i, s, n]);
220
- const g = T(
227
+ const f = T(
221
228
  (e) => {
222
- ve.current = e, be(o(`signature.state.${e}`));
229
+ ve.current = e, be(c(`signature.state.${e}`));
223
230
  },
224
- [o]
231
+ [c]
225
232
  );
226
233
  P(() => {
227
234
  if (typeof document > "u") return;
228
235
  function e() {
229
- const c = z ?? ie("--foreground"), p = l ?? ie("--background");
230
- he(c || "currentColor"), ye(p || "transparent");
236
+ const o = C ?? ie("--foreground"), g = d ?? ie("--background");
237
+ he(o || "currentColor"), ye(g || "transparent");
231
238
  }
232
239
  e();
233
240
  const r = new MutationObserver(() => {
@@ -237,47 +244,47 @@ const Ue = ze(
237
244
  attributes: !0,
238
245
  attributeFilter: ["class"]
239
246
  }), () => r.disconnect();
240
- }, [z, l]), P(() => {
241
- const e = y.current;
242
- e && (b && (e.penColor = b), w && (e.backgroundColor = w));
243
- }, [b, w]), P(() => {
244
- if (d !== "draw") return;
247
+ }, [C, d]), P(() => {
248
+ const e = h.current;
249
+ e && (m && (e.penColor = m), y && (e.backgroundColor = y));
250
+ }, [m, y]), P(() => {
251
+ if (l !== "draw") return;
245
252
  const e = V.current;
246
253
  if (!e) return;
247
254
  const r = new Ae(e, {
248
- penColor: b || "currentColor",
249
- backgroundColor: w || "transparent",
255
+ penColor: m || "currentColor",
256
+ backgroundColor: y || "transparent",
250
257
  minWidth: 0.5,
251
258
  maxWidth: 2.5,
252
259
  velocityFilterWeight: 0.7
253
260
  });
254
- y.current = r;
255
- const c = () => {
256
- var x;
257
- I(!0), g("drawing"), (x = j.current) == null || x.call(j);
258
- }, p = () => {
261
+ h.current = r;
262
+ const o = () => {
263
+ var w;
264
+ I(!0), f("drawing"), (w = j.current) == null || w.call(j);
265
+ }, g = () => {
259
266
  };
260
- return r.addEventListener("beginStroke", c), r.addEventListener("endStroke", p), $(e), g("empty"), () => {
261
- r.removeEventListener("beginStroke", c), r.removeEventListener("endStroke", p), r.clear(), r.off(), y.current = null;
267
+ return r.addEventListener("beginStroke", o), r.addEventListener("endStroke", g), $(e), f("empty"), () => {
268
+ r.removeEventListener("beginStroke", o), r.removeEventListener("endStroke", g), r.clear(), r.off(), h.current = null;
262
269
  };
263
- }, [d]), P(() => {
264
- const e = y.current;
265
- e && (f ? e.off() : e.on());
266
- }, [f, d]);
267
- const Q = 4096, $ = T(
270
+ }, [l]), P(() => {
271
+ const e = h.current;
272
+ e && (b ? e.off() : e.on());
273
+ }, [b, l]);
274
+ const J = 4096, $ = T(
268
275
  (e) => {
269
- const r = e.getBoundingClientRect(), c = Math.max(
276
+ const r = e.getBoundingClientRect(), o = Math.max(
270
277
  1,
271
278
  typeof window < "u" ? window.devicePixelRatio : 1
272
- ), p = Math.max(1, Math.floor(r.width * c)), x = Math.max(1, Math.floor(r.height * c)), A = Math.min(p, Q), k = Math.min(x, Q);
273
- if (e.width === A && e.height === k)
279
+ ), g = Math.max(1, Math.floor(r.width * o)), w = Math.max(1, Math.floor(r.height * o)), A = Math.min(g, J), x = Math.min(w, J);
280
+ if (e.width === A && e.height === x)
274
281
  return;
275
- const v = y.current, M = v ? v.toData() : null;
276
- e.width = A, e.height = k;
282
+ const p = h.current, M = p ? p.toData() : null;
283
+ e.width = A, e.height = x;
277
284
  const D = e.getContext("2d");
278
- D && D.scale(c, c), v && (w && (v.backgroundColor = w), b && (v.penColor = b), v.clear(), M && M.length > 0 && v.fromData(M));
285
+ D && D.scale(o, o), p && (y && (p.backgroundColor = y), m && (p.penColor = m), p.clear(), M && M.length > 0 && p.fromData(M));
279
286
  },
280
- [w, b]
287
+ [y, m]
281
288
  );
282
289
  P(() => {
283
290
  const e = V.current;
@@ -293,130 +300,130 @@ const Ue = ze(
293
300
  }, [$]);
294
301
  const H = T(() => {
295
302
  var r;
296
- const e = y.current;
297
- e && e.clear(), L(""), I(!1), g("cleared"), (r = E.current) == null || r.call(E);
298
- }, [g]), U = T(() => {
299
- const e = y.current;
303
+ const e = h.current;
304
+ e && e.clear(), L(""), I(!1), f("cleared"), (r = E.current) == null || r.call(E);
305
+ }, [f]), K = T(() => {
306
+ const e = h.current;
300
307
  if (!e) return;
301
308
  const r = e.toData();
302
- !r || r.length === 0 || (r.pop(), e.fromData(r), r.length === 0 && (I(!1), g("empty")));
303
- }, [g]), Y = T(() => {
304
- if (d === "typed") return S.trim().length === 0;
305
- const e = y.current;
309
+ !r || r.length === 0 || (r.pop(), e.fromData(r), r.length === 0 && (I(!1), f("empty")));
310
+ }, [f]), Q = T(() => {
311
+ if (l === "typed") return S.trim().length === 0;
312
+ const e = h.current;
306
313
  return e ? e.isEmpty() : !0;
307
- }, [d, S]), O = T(async () => {
308
- var ne;
314
+ }, [l, S]), U = T(async () => {
315
+ var re;
309
316
  const e = de(
310
317
  typeof a == "number" ? `${a}` : String(a)
311
318
  ), r = de(
312
- typeof m == "number" ? `${m}` : String(m)
313
- ), c = d === "draw" ? V.current ?? J.current ?? F.current : K.current ?? F.current, p = c == null ? void 0 : c.getBoundingClientRect(), x = e ?? (p ? p.width : 400), A = r ?? (p ? p.height : 200);
314
- let k = "", v = "", M;
315
- if (d === "draw") {
316
- const u = y.current;
319
+ typeof v == "number" ? `${v}` : String(v)
320
+ ), o = l === "draw" ? V.current ?? G.current ?? F.current : Z.current ?? F.current, g = o == null ? void 0 : o.getBoundingClientRect(), w = e ?? (g ? g.width : 400), A = r ?? (g ? g.height : 200);
321
+ let x = "", p = "", M;
322
+ if (l === "draw") {
323
+ const u = h.current;
317
324
  if (!u || u.isEmpty()) return null;
318
- k = u.toDataURL("image/png"), v = u.toSVG(), M = u.toData();
325
+ x = u.toDataURL("image/png"), p = u.toSVG(), M = u.toData();
319
326
  } else {
320
327
  const u = S.trim();
321
328
  if (u.length === 0) return null;
322
- k = He(
329
+ x = He(
323
330
  u,
324
- x,
331
+ w,
325
332
  A,
326
- b || "currentColor",
327
- w || "transparent"
333
+ m || "currentColor",
334
+ y || "transparent"
328
335
  ).toDataURL("image/png");
329
- const W = u.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
330
- v = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${x} ${A}" width="${x}" height="${A}"><text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-family="sans-serif" font-style="italic" font-size="32" fill="${b || "currentColor"}" letter-spacing="3">${W}</text></svg>`;
336
+ const O = u.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
337
+ p = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${w} ${A}" width="${w}" height="${A}"><text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-family="sans-serif" font-style="italic" font-size="32" fill="${m || "currentColor"}" letter-spacing="3">${O}</text></svg>`;
331
338
  }
332
- const D = x * 25.4 / 96, ke = A * 25.4 / 96, Ce = (/* @__PURE__ */ new Date()).toISOString();
333
- let te = "";
334
- if (k) {
335
- const u = k.indexOf(","), se = u >= 0 ? k.slice(u + 1) : "", W = Le(se);
336
- te = await Ie(W);
339
+ const D = w * 25.4 / 96, ke = A * 25.4 / 96, ze = (/* @__PURE__ */ new Date()).toISOString();
340
+ let ee = "";
341
+ if (x) {
342
+ const u = x.indexOf(","), ne = u >= 0 ? x.slice(u + 1) : "", O = Le(ne);
343
+ ee = await Ie(O);
337
344
  }
338
- const re = {
339
- png: k,
340
- svg: v,
345
+ const te = {
346
+ png: x,
347
+ svg: p,
341
348
  widthMm: D,
342
349
  heightMm: ke,
343
- capturedAt: Ce,
344
- sha256: te,
350
+ capturedAt: ze,
351
+ sha256: ee,
345
352
  strokes: M
346
353
  };
347
- return g("captured"), (ne = B.current) == null || ne.call(B, re), re;
348
- }, [d, S, a, m, b, w, g]), _ = ae(
354
+ return f("captured"), (re = B.current) == null || re.call(B, te), te;
355
+ }, [l, S, a, v, m, y, f]), _ = se(
349
356
  () => ({
350
357
  clear: H,
351
- undo: U,
352
- isEmpty: Y,
353
- confirm: O
358
+ undo: K,
359
+ isEmpty: Q,
360
+ confirm: U
354
361
  }),
355
- [H, U, Y, O]
362
+ [H, K, Q, U]
356
363
  );
357
364
  Re(fe, () => _, [_]), Ne(Pe, _, t);
358
- const we = d === "typed" ? S.trim().length > 0 : pe, ee = f || !we, xe = {
365
+ const we = l === "typed" ? S.trim().length > 0 : pe, Y = b || !we, xe = {
359
366
  "--signature-width": oe(
360
367
  a,
361
368
  "var(--signature-default-width)"
362
369
  ),
363
370
  "--signature-height": oe(
364
- m,
371
+ v,
365
372
  "var(--signature-default-height)"
366
373
  )
367
374
  };
368
- return /* @__PURE__ */ X(
375
+ return /* @__PURE__ */ W(
369
376
  "div",
370
377
  {
371
378
  ref: F,
372
379
  role: "group",
373
- "aria-label": le ?? o("signature.padLabel"),
374
- "aria-disabled": f || void 0,
380
+ "aria-label": le ?? c("signature.padLabel"),
381
+ "aria-disabled": b || void 0,
375
382
  className: [Te(), ue].filter(Boolean).join(" "),
376
383
  style: xe,
377
384
  "data-component": "signature-capture",
378
385
  "data-component-id": t,
379
386
  children: [
380
- d === "draw" ? /* @__PURE__ */ h("div", { ref: J, className: Ve(), children: /* @__PURE__ */ h(
387
+ l === "draw" ? /* @__PURE__ */ k("div", { ref: G, className: Ve(), children: /* @__PURE__ */ k(
381
388
  "canvas",
382
389
  {
383
390
  ref: V,
384
391
  role: "img",
385
- "aria-label": o("signature.padLabel"),
392
+ "aria-label": c("signature.padLabel"),
386
393
  className: je(),
387
394
  "data-testid": "signature-canvas"
388
395
  }
389
- ) }) : /* @__PURE__ */ X("label", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
390
- /* @__PURE__ */ h("span", { className: "type-body-sm ds:text-[var(--muted-foreground)]", children: o("signature.typedFallback.label") }),
391
- /* @__PURE__ */ h(
396
+ ) }) : /* @__PURE__ */ W("label", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
397
+ /* @__PURE__ */ k("span", { className: "type-body-sm ds:text-[var(--muted-foreground)]", children: c("signature.typedFallback.label") }),
398
+ /* @__PURE__ */ k(
392
399
  "input",
393
400
  {
394
401
  type: "text",
395
402
  value: S,
396
403
  onChange: (e) => {
397
- L(e.target.value), e.target.value.length > 0 ? g("drawing") : g("empty");
404
+ L(e.target.value), e.target.value.length > 0 ? f("drawing") : f("empty");
398
405
  },
399
- placeholder: o("signature.typedFallback.placeholder"),
400
- "aria-label": o("signature.typedFallback.label"),
401
- disabled: f,
406
+ placeholder: c("signature.typedFallback.placeholder"),
407
+ "aria-label": c("signature.typedFallback.label"),
408
+ disabled: b,
402
409
  className: $e(),
403
410
  "data-testid": "signature-typed-input"
404
411
  }
405
412
  ),
406
- S ? /* @__PURE__ */ h(
413
+ S ? /* @__PURE__ */ k(
407
414
  "div",
408
415
  {
409
- ref: K,
416
+ ref: Z,
410
417
  className: De(),
411
418
  "aria-hidden": "true",
412
419
  children: S
413
420
  }
414
421
  ) : null
415
422
  ] }),
416
- /* @__PURE__ */ h(
423
+ /* @__PURE__ */ k(
417
424
  "div",
418
425
  {
419
- id: Z,
426
+ id: q,
420
427
  "aria-live": "polite",
421
428
  "aria-atomic": "true",
422
429
  className: "ds:sr-only",
@@ -424,62 +431,50 @@ const Ue = ze(
424
431
  children: me
425
432
  }
426
433
  ),
427
- /* @__PURE__ */ X(
434
+ /* @__PURE__ */ W(
428
435
  "div",
429
436
  {
430
437
  className: Ee(),
431
438
  role: "group",
432
- "aria-label": o("signature.padLabel"),
439
+ "aria-label": c("signature.padLabel"),
433
440
  children: [
434
- /* @__PURE__ */ h(
441
+ /* @__PURE__ */ k(
435
442
  "button",
436
443
  {
437
444
  type: "button",
438
445
  onClick: () => {
439
- f || H();
446
+ b || H();
440
447
  },
441
- "aria-disabled": f || void 0,
442
- className: q(),
443
- children: o("signature.clear")
448
+ "aria-disabled": b || void 0,
449
+ className: ae(),
450
+ children: c("signature.clear")
444
451
  }
445
452
  ),
446
- d === "draw" ? /* @__PURE__ */ h(
447
- "button",
448
- {
449
- type: "button",
450
- onClick: () => {
451
- f || U();
452
- },
453
- "aria-disabled": f || void 0,
454
- className: q(),
455
- children: o("signature.undo")
456
- }
457
- ) : null,
458
- ce ? /* @__PURE__ */ h(
453
+ ce ? /* @__PURE__ */ k(
459
454
  "button",
460
455
  {
461
456
  type: "button",
462
457
  onClick: () => {
463
- f || (L(""), ge((e) => e === "draw" ? "typed" : "draw"), g("cleared"));
458
+ b || (L(""), ge((e) => e === "draw" ? "typed" : "draw"), f("cleared"));
464
459
  },
465
- "aria-disabled": f || void 0,
466
- className: q(),
467
- "aria-pressed": d === "typed",
468
- children: o(d === "draw" ? "signature.typedFallback.toggle" : "signature.typedFallback.toggleDraw")
460
+ "aria-disabled": b || void 0,
461
+ className: ae(),
462
+ "aria-pressed": l === "typed",
463
+ children: c(l === "draw" ? "signature.typedFallback.toggle" : "signature.typedFallback.toggleDraw")
469
464
  }
470
465
  ) : null,
471
- /* @__PURE__ */ h(
466
+ /* @__PURE__ */ k(
472
467
  "button",
473
468
  {
474
469
  type: "button",
475
470
  onClick: () => {
476
- ee || O();
471
+ Y || U();
477
472
  },
478
- "aria-disabled": ee || void 0,
479
- "aria-describedby": Z,
473
+ "aria-disabled": Y || void 0,
474
+ "aria-describedby": q,
480
475
  className: Be(),
481
476
  "data-testid": "signature-confirm",
482
- children: o("signature.confirm")
477
+ children: c("signature.confirm")
483
478
  }
484
479
  )
485
480
  ]
@@ -495,4 +490,4 @@ export {
495
490
  Ue as S,
496
491
  Pe as s
497
492
  };
498
- //# sourceMappingURL=signature-capture-C-fF71xI.js.map
493
+ //# sourceMappingURL=signature-capture-DoiBd6i3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-capture-DoiBd6i3.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 /** 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 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 // 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 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 onConfirmRef.current?.(payload);\n return payload;\n }, [mode, typedValue, width, height, resolvedPen, resolvedBg, announce]);\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 {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","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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"}