@alfadocs/ui-kit-debug 0.69.0 → 0.70.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 (463) hide show
  1. package/dist/_chunks/{agenda-card-BxSFkqgY.js → agenda-card-BQ-IKAru.js} +2 -2
  2. package/dist/_chunks/{agenda-card-BxSFkqgY.js.map → agenda-card-BQ-IKAru.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-g0kg7HwB.js → agenda-tray-CGXRk58j.js} +2 -2
  4. package/dist/_chunks/{agenda-tray-g0kg7HwB.js.map → agenda-tray-CGXRk58j.js.map} +1 -1
  5. package/dist/_chunks/{ai-consent-banner-CXlsNX1c.js → ai-consent-banner-Be-h9mRI.js} +3 -3
  6. package/dist/_chunks/{ai-consent-banner-CXlsNX1c.js.map → ai-consent-banner-Be-h9mRI.js.map} +1 -1
  7. package/dist/_chunks/ai-tools-rail-B5NEghsp.js +511 -0
  8. package/dist/_chunks/ai-tools-rail-B5NEghsp.js.map +1 -0
  9. package/dist/_chunks/{alert-_mUKLmwA.js → alert-CHYZ96tR.js} +150 -96
  10. package/dist/_chunks/alert-CHYZ96tR.js.map +1 -0
  11. package/dist/_chunks/{anamnesis-card-DRmE24OQ.js → anamnesis-card-DvYCa16e.js} +2 -2
  12. package/dist/_chunks/{anamnesis-card-DRmE24OQ.js.map → anamnesis-card-DvYCa16e.js.map} +1 -1
  13. package/dist/_chunks/anatomy-scheme-CJB6dI6p.js +2445 -0
  14. package/dist/_chunks/anatomy-scheme-CJB6dI6p.js.map +1 -0
  15. package/dist/_chunks/annotation-marker-qt5R9WZX.js +120 -0
  16. package/dist/_chunks/annotation-marker-qt5R9WZX.js.map +1 -0
  17. package/dist/_chunks/{antenatal-schedule-timeline-35ebkcZT.js → antenatal-schedule-timeline-CwXrQRm1.js} +2 -2
  18. package/dist/_chunks/{antenatal-schedule-timeline-35ebkcZT.js.map → antenatal-schedule-timeline-CwXrQRm1.js.map} +1 -1
  19. package/dist/_chunks/appointment-card-C06aZqA7.js +310 -0
  20. package/dist/_chunks/appointment-card-C06aZqA7.js.map +1 -0
  21. package/dist/_chunks/appointment-timeline-BJM0S_Fg.js +386 -0
  22. package/dist/_chunks/appointment-timeline-BJM0S_Fg.js.map +1 -0
  23. package/dist/_chunks/appointment-tray-DRRw5ROi.js +193 -0
  24. package/dist/_chunks/appointment-tray-DRRw5ROi.js.map +1 -0
  25. package/dist/_chunks/{audio-recorder-DYXXnGug.js → audio-recorder-Cpdk5qpQ.js} +2 -2
  26. package/dist/_chunks/{audio-recorder-DYXXnGug.js.map → audio-recorder-Cpdk5qpQ.js.map} +1 -1
  27. package/dist/_chunks/{badge-CqGsX32l.js → badge-DCOqV9mI.js} +32 -27
  28. package/dist/_chunks/badge-DCOqV9mI.js.map +1 -0
  29. package/dist/_chunks/{bishop-score-PJI3AXzA.js → bishop-score-DnYWtZa_.js} +2 -2
  30. package/dist/_chunks/{bishop-score-PJI3AXzA.js.map → bishop-score-DnYWtZa_.js.map} +1 -1
  31. package/dist/_chunks/{bmi-calculator-BZtIJ53x.js → bmi-calculator-zjeY4E7J.js} +2 -2
  32. package/dist/_chunks/{bmi-calculator-BZtIJ53x.js.map → bmi-calculator-zjeY4E7J.js.map} +1 -1
  33. package/dist/_chunks/{booking-C3VqFReX.js → booking-DUBI0oqt.js} +4 -4
  34. package/dist/_chunks/{booking-C3VqFReX.js.map → booking-DUBI0oqt.js.map} +1 -1
  35. package/dist/_chunks/{care-plan-card-CvFGXa2z.js → care-plan-card-C5sTfY9G.js} +5 -5
  36. package/dist/_chunks/{care-plan-card-CvFGXa2z.js.map → care-plan-card-C5sTfY9G.js.map} +1 -1
  37. package/dist/_chunks/{care-plan-entry-card-C3E_gClk.js → care-plan-entry-card-CXnxGCWA.js} +5 -5
  38. package/dist/_chunks/{care-plan-entry-card-C3E_gClk.js.map → care-plan-entry-card-CXnxGCWA.js.map} +1 -1
  39. package/dist/_chunks/care-plan-header-BUwqDTtz.js +206 -0
  40. package/dist/_chunks/care-plan-header-BUwqDTtz.js.map +1 -0
  41. package/dist/_chunks/clinical-note-card-BUvNMNGL.js +436 -0
  42. package/dist/_chunks/clinical-note-card-BUvNMNGL.js.map +1 -0
  43. package/dist/_chunks/{contact-profile-card-Dramqa9C.js → contact-profile-card-DDPwRFiP.js} +2 -2
  44. package/dist/_chunks/{contact-profile-card-Dramqa9C.js.map → contact-profile-card-DDPwRFiP.js.map} +1 -1
  45. package/dist/_chunks/control-room-rail-Y8ryLYsP.js +229 -0
  46. package/dist/_chunks/control-room-rail-Y8ryLYsP.js.map +1 -0
  47. package/dist/_chunks/{cycle-calculator-DmRGJNaT.js → cycle-calculator-CCmPwcBl.js} +2 -2
  48. package/dist/_chunks/{cycle-calculator-DmRGJNaT.js.map → cycle-calculator-CCmPwcBl.js.map} +1 -1
  49. package/dist/_chunks/{dependent-selector-CG_FOHya.js → dependent-selector-DUV4thxX.js} +2 -2
  50. package/dist/_chunks/{dependent-selector-CG_FOHya.js.map → dependent-selector-DUV4thxX.js.map} +1 -1
  51. package/dist/_chunks/{document-scanner-CTubA0-N.js → document-scanner-C_AxLooF.js} +3 -3
  52. package/dist/_chunks/{document-scanner-CTubA0-N.js.map → document-scanner-C_AxLooF.js.map} +1 -1
  53. package/dist/_chunks/{due-date-calculator-BTmsIQqD.js → due-date-calculator-Brdj-euS.js} +3 -3
  54. package/dist/_chunks/{due-date-calculator-BTmsIQqD.js.map → due-date-calculator-Brdj-euS.js.map} +1 -1
  55. package/dist/_chunks/editable-currency-cell-renderer-C9twtALM.js +328 -0
  56. package/dist/_chunks/editable-currency-cell-renderer-C9twtALM.js.map +1 -0
  57. package/dist/_chunks/email-input-DJ7EXklP.js +397 -0
  58. package/dist/_chunks/{email-input-B_Y55f5G.js.map → email-input-DJ7EXklP.js.map} +1 -1
  59. package/dist/_chunks/{entity-card-COhmqHly.js → entity-card-9_62gY7l.js} +38 -20
  60. package/dist/_chunks/{entity-card-COhmqHly.js.map → entity-card-9_62gY7l.js.map} +1 -1
  61. package/dist/_chunks/entity-summary-BxRjFh_4.js +138 -0
  62. package/dist/_chunks/entity-summary-BxRjFh_4.js.map +1 -0
  63. package/dist/_chunks/{fetal-weight-CRz7KE2D.js → fetal-weight-DNCkyeVo.js} +2 -2
  64. package/dist/_chunks/{fetal-weight-CRz7KE2D.js.map → fetal-weight-DNCkyeVo.js.map} +1 -1
  65. package/dist/_chunks/field-value-NXYczdpO.js +415 -0
  66. package/dist/_chunks/field-value-NXYczdpO.js.map +1 -0
  67. package/dist/_chunks/{file-upload-5ScQd4fE.js → file-upload-DwZcAK8D.js} +2 -1
  68. package/dist/_chunks/{file-upload-5ScQd4fE.js.map → file-upload-DwZcAK8D.js.map} +1 -1
  69. package/dist/_chunks/{freemium-paywall-DZ2mBS3w.js → freemium-paywall-WYlNO7yT.js} +2 -2
  70. package/dist/_chunks/{freemium-paywall-DZ2mBS3w.js.map → freemium-paywall-WYlNO7yT.js.map} +1 -1
  71. package/dist/_chunks/{gestational-age-calculator-BleUdhbI.js → gestational-age-calculator-CF2ISaYQ.js} +3 -3
  72. package/dist/_chunks/{gestational-age-calculator-BleUdhbI.js.map → gestational-age-calculator-CF2ISaYQ.js.map} +1 -1
  73. package/dist/_chunks/hash-CysBBS_N.js +17 -0
  74. package/dist/_chunks/hash-CysBBS_N.js.map +1 -0
  75. package/dist/_chunks/{hcg-doubling-CnjDXX6U.js → hcg-doubling-C7bmuaU3.js} +2 -2
  76. package/dist/_chunks/{hcg-doubling-CnjDXX6U.js.map → hcg-doubling-C7bmuaU3.js.map} +1 -1
  77. package/dist/_chunks/{actions-cell-renderer-DrcaxB0w.js → link-cell-renderer-CTXqtXV-.js} +715 -592
  78. package/dist/_chunks/link-cell-renderer-CTXqtXV-.js.map +1 -0
  79. package/dist/_chunks/lock-CKOIn0IK.js +15 -0
  80. package/dist/_chunks/lock-CKOIn0IK.js.map +1 -0
  81. package/dist/_chunks/{marketplace-app-shell-6T9W4Knl.js → marketplace-app-shell-Skhfp6vK.js} +3 -3
  82. package/dist/_chunks/{marketplace-app-shell-6T9W4Knl.js.map → marketplace-app-shell-Skhfp6vK.js.map} +1 -1
  83. package/dist/_chunks/notes-panel-ay8_lPrA.js +158 -0
  84. package/dist/_chunks/notes-panel-ay8_lPrA.js.map +1 -0
  85. package/dist/_chunks/{notification-card-BiESdm8q.js → notification-card-D2jiKSJJ.js} +27 -23
  86. package/dist/_chunks/notification-card-D2jiKSJJ.js.map +1 -0
  87. package/dist/_chunks/{notification-tray-Btb9oQeZ.js → notification-tray-AEun6DN2.js} +2 -2
  88. package/dist/_chunks/{notification-tray-Btb9oQeZ.js.map → notification-tray-AEun6DN2.js.map} +1 -1
  89. package/dist/_chunks/{operator-hero-CP2Nhupm.js → operator-hero-CR0Rqh4-.js} +3 -3
  90. package/dist/_chunks/{operator-hero-CP2Nhupm.js.map → operator-hero-CR0Rqh4-.js.map} +1 -1
  91. package/dist/_chunks/patient-details-Dlhqb5ig.js +675 -0
  92. package/dist/_chunks/patient-details-Dlhqb5ig.js.map +1 -0
  93. package/dist/_chunks/{patient-search-CBC_ySF6.js → patient-search-Be6cLrHR.js} +2 -2
  94. package/dist/_chunks/{patient-search-CBC_ySF6.js.map → patient-search-Be6cLrHR.js.map} +1 -1
  95. package/dist/_chunks/patient-summary-card-WySCMwwA.js +437 -0
  96. package/dist/_chunks/patient-summary-card-WySCMwwA.js.map +1 -0
  97. package/dist/_chunks/patient-table-CHxf3Oqk.js +1110 -0
  98. package/dist/_chunks/patient-table-CHxf3Oqk.js.map +1 -0
  99. package/dist/_chunks/{payment-form-DvjwYVIT.js → payment-form-CxqIXqw7.js} +2 -2
  100. package/dist/_chunks/{payment-form-DvjwYVIT.js.map → payment-form-CxqIXqw7.js.map} +1 -1
  101. package/dist/_chunks/{payment-request-card-DioWKBUq.js → payment-request-card-BcZJwu9z.js} +125 -136
  102. package/dist/_chunks/payment-request-card-BcZJwu9z.js.map +1 -0
  103. package/dist/_chunks/{pdf-viewer-D6BPfW2D.js → pdf-viewer-QfebdLOd.js} +192 -214
  104. package/dist/_chunks/pdf-viewer-QfebdLOd.js.map +1 -0
  105. package/dist/_chunks/{periodontal-chart-card-BuDEMbHE.js → periodontal-chart-card-hRRJY1NN.js} +2 -2
  106. package/dist/_chunks/{periodontal-chart-card-BuDEMbHE.js.map → periodontal-chart-card-hRRJY1NN.js.map} +1 -1
  107. package/dist/_chunks/{practice-results-KrTHqZua.js → practice-results-C6qDfxos.js} +3 -3
  108. package/dist/_chunks/{practice-results-KrTHqZua.js.map → practice-results-C6qDfxos.js.map} +1 -1
  109. package/dist/_chunks/{pregnancy-dating-DORUAOHB.js → pregnancy-dating-CRVWswD-.js} +3 -3
  110. package/dist/_chunks/{pregnancy-dating-DORUAOHB.js.map → pregnancy-dating-CRVWswD-.js.map} +1 -1
  111. package/dist/_chunks/{pregnancy-weight-gain-DVz4rr7-.js → pregnancy-weight-gain-BUNpTsH-.js} +2 -2
  112. package/dist/_chunks/{pregnancy-weight-gain-DVz4rr7-.js.map → pregnancy-weight-gain-BUNpTsH-.js.map} +1 -1
  113. package/dist/_chunks/radiograph-panel.agent-CAX-C3g3.js +558 -0
  114. package/dist/_chunks/radiograph-panel.agent-CAX-C3g3.js.map +1 -0
  115. package/dist/_chunks/{rich-text-editor-BsV7zUdg.js → rich-text-editor-DlCqPixb.js} +410 -394
  116. package/dist/_chunks/{rich-text-editor-BsV7zUdg.js.map → rich-text-editor-DlCqPixb.js.map} +1 -1
  117. package/dist/_chunks/{sign-document-B4DeRhTe.js → sign-document-By6hMOra.js} +2 -2
  118. package/dist/_chunks/{sign-document-B4DeRhTe.js.map → sign-document-By6hMOra.js.map} +1 -1
  119. package/dist/_chunks/{stepper-accordion-Dki6r9ZE.js → stepper-accordion-DC-H-8v4.js} +38 -48
  120. package/dist/_chunks/stepper-accordion-DC-H-8v4.js.map +1 -0
  121. package/dist/_chunks/tab-bar-Bv9nGNdO.js +262 -0
  122. package/dist/_chunks/tab-bar-Bv9nGNdO.js.map +1 -0
  123. package/dist/_chunks/tooth-scheme-BhQoPNBD.js +2131 -0
  124. package/dist/_chunks/tooth-scheme-BhQoPNBD.js.map +1 -0
  125. package/dist/_chunks/{transaction-chip-DK84XCBU.js → transaction-chip-CscoQbxF.js} +88 -61
  126. package/dist/_chunks/transaction-chip-CscoQbxF.js.map +1 -0
  127. package/dist/_chunks/use-clamp-overflow-DQE2kwZ9.js +20 -0
  128. package/dist/_chunks/use-clamp-overflow-DQE2kwZ9.js.map +1 -0
  129. package/dist/_chunks/use-overflow-collapse-BIOzKbni.js +32 -0
  130. package/dist/_chunks/use-overflow-collapse-BIOzKbni.js.map +1 -0
  131. package/dist/_chunks/use-persistent-state-nZwZAnE9.js +24 -0
  132. package/dist/_chunks/use-persistent-state-nZwZAnE9.js.map +1 -0
  133. package/dist/_chunks/{warning-stack-BsgaEbL8.js → warning-stack--sTrrBDA.js} +86 -101
  134. package/dist/_chunks/warning-stack--sTrrBDA.js.map +1 -0
  135. package/dist/_chunks/{workflow-map-Bdam9pGp.js → workflow-map-Dy8mLCqF.js} +3 -3
  136. package/dist/_chunks/{workflow-map-Bdam9pGp.js.map → workflow-map-Dy8mLCqF.js.map} +1 -1
  137. package/dist/_chunks/zoom-out-CgVtf2Wx.js +29 -0
  138. package/dist/_chunks/zoom-out-CgVtf2Wx.js.map +1 -0
  139. package/dist/agent/index.js +5 -4
  140. package/dist/agent/index.js.map +1 -1
  141. package/dist/agent/types.d.ts +19 -2
  142. package/dist/agent/types.d.ts.map +1 -1
  143. package/dist/agent-catalog.json +1253 -86
  144. package/dist/agent-i18n/en.json +108 -6
  145. package/dist/components/_shared/entity-card/entity-card.d.ts +6 -0
  146. package/dist/components/_shared/entity-card/entity-card.d.ts.map +1 -1
  147. package/dist/components/_shared/entity-card/index.d.ts +1 -1
  148. package/dist/components/_shared/entity-card/index.d.ts.map +1 -1
  149. package/dist/components/_shared/field-value.d.ts +21 -0
  150. package/dist/components/_shared/field-value.d.ts.map +1 -0
  151. package/dist/components/_shared/field-visibility-cog.d.ts +20 -0
  152. package/dist/components/_shared/field-visibility-cog.d.ts.map +1 -0
  153. package/dist/components/_shared/field-visibility.d.ts +36 -0
  154. package/dist/components/_shared/field-visibility.d.ts.map +1 -0
  155. package/dist/components/_shared/patient-fields.d.ts +119 -0
  156. package/dist/components/_shared/patient-fields.d.ts.map +1 -0
  157. package/dist/components/agenda-card/index.js +1 -1
  158. package/dist/components/agenda-tray/index.js +1 -1
  159. package/dist/components/ai-consent-banner/index.js +1 -1
  160. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts +75 -0
  161. package/dist/components/ai-tools-rail/ai-tools-rail.d.ts.map +1 -1
  162. package/dist/components/ai-tools-rail/index.js +1 -1
  163. package/dist/components/alert/alert.d.ts +5 -0
  164. package/dist/components/alert/alert.d.ts.map +1 -1
  165. package/dist/components/alert/index.js +1 -1
  166. package/dist/components/anamnesis-card/index.js +1 -1
  167. package/dist/components/anatomy-scheme/anatomy-face-paths.d.ts +15 -0
  168. package/dist/components/anatomy-scheme/anatomy-face-paths.d.ts.map +1 -0
  169. package/dist/components/anatomy-scheme/anatomy-muscle-paths.d.ts +20 -0
  170. package/dist/components/anatomy-scheme/anatomy-muscle-paths.d.ts.map +1 -0
  171. package/dist/components/anatomy-scheme/anatomy-scheme-data.d.ts +121 -0
  172. package/dist/components/anatomy-scheme/anatomy-scheme-data.d.ts.map +1 -0
  173. package/dist/components/anatomy-scheme/anatomy-scheme.agent.d.ts +6 -0
  174. package/dist/components/anatomy-scheme/anatomy-scheme.agent.d.ts.map +1 -0
  175. package/dist/components/anatomy-scheme/anatomy-scheme.d.ts +69 -0
  176. package/dist/components/anatomy-scheme/anatomy-scheme.d.ts.map +1 -0
  177. package/dist/components/anatomy-scheme/index.d.ts +6 -0
  178. package/dist/components/anatomy-scheme/index.d.ts.map +1 -0
  179. package/dist/components/anatomy-scheme/index.js +17 -0
  180. package/dist/components/anatomy-scheme/index.js.map +1 -0
  181. package/dist/components/annotation-marker/annotation-marker.d.ts +33 -0
  182. package/dist/components/annotation-marker/annotation-marker.d.ts.map +1 -0
  183. package/dist/components/annotation-marker/index.d.ts +3 -0
  184. package/dist/components/annotation-marker/index.d.ts.map +1 -0
  185. package/dist/components/annotation-marker/index.js +7 -0
  186. package/dist/components/annotation-marker/index.js.map +1 -0
  187. package/dist/components/appointment-card/appointment-card.d.ts +25 -1
  188. package/dist/components/appointment-card/appointment-card.d.ts.map +1 -1
  189. package/dist/components/appointment-card/index.js +6 -5
  190. package/dist/components/appointment-card/index.js.map +1 -1
  191. package/dist/components/appointment-timeline/appointment-timeline.agent.d.ts +4 -0
  192. package/dist/components/appointment-timeline/appointment-timeline.agent.d.ts.map +1 -0
  193. package/dist/components/appointment-timeline/appointment-timeline.d.ts +66 -0
  194. package/dist/components/appointment-timeline/appointment-timeline.d.ts.map +1 -0
  195. package/dist/components/appointment-timeline/index.d.ts +4 -0
  196. package/dist/components/appointment-timeline/index.d.ts.map +1 -0
  197. package/dist/components/appointment-timeline/index.js +6 -0
  198. package/dist/components/appointment-timeline/index.js.map +1 -0
  199. package/dist/components/audio-recorder/index.js +1 -1
  200. package/dist/components/badge/badge.d.ts +6 -2
  201. package/dist/components/badge/badge.d.ts.map +1 -1
  202. package/dist/components/badge/index.js +1 -1
  203. package/dist/components/bishop-score/index.js +1 -1
  204. package/dist/components/bmi-calculator/index.js +1 -1
  205. package/dist/components/booking/index.js +1 -1
  206. package/dist/components/care-plan-card/index.js +1 -1
  207. package/dist/components/care-plan-entry-card/index.js +1 -1
  208. package/dist/components/care-plan-header/care-plan-header.agent.d.ts +4 -0
  209. package/dist/components/care-plan-header/care-plan-header.agent.d.ts.map +1 -0
  210. package/dist/components/care-plan-header/care-plan-header.d.ts +100 -0
  211. package/dist/components/care-plan-header/care-plan-header.d.ts.map +1 -0
  212. package/dist/components/care-plan-header/index.d.ts +4 -0
  213. package/dist/components/care-plan-header/index.d.ts.map +1 -0
  214. package/dist/components/care-plan-header/index.js +6 -0
  215. package/dist/components/care-plan-header/index.js.map +1 -0
  216. package/dist/components/clinical-note-card/clinical-note-card.d.ts +21 -1
  217. package/dist/components/clinical-note-card/clinical-note-card.d.ts.map +1 -1
  218. package/dist/components/clinical-note-card/index.js +1 -1
  219. package/dist/components/contact-profile-card/index.js +1 -1
  220. package/dist/components/control-room-rail/control-room-context.d.ts +53 -0
  221. package/dist/components/control-room-rail/control-room-context.d.ts.map +1 -0
  222. package/dist/components/control-room-rail/control-room-rail.d.ts +35 -0
  223. package/dist/components/control-room-rail/control-room-rail.d.ts.map +1 -0
  224. package/dist/components/control-room-rail/index.d.ts +5 -0
  225. package/dist/components/control-room-rail/index.d.ts.map +1 -0
  226. package/dist/components/control-room-rail/index.js +9 -0
  227. package/dist/components/control-room-rail/index.js.map +1 -0
  228. package/dist/components/cycle-calculator/index.js +1 -1
  229. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts +18 -0
  230. package/dist/components/data-table/cell-renderers/actions-cell-renderer.d.ts.map +1 -1
  231. package/dist/components/data-table/index.d.ts +1 -1
  232. package/dist/components/data-table/index.d.ts.map +1 -1
  233. package/dist/components/data-table/index.js +32 -31
  234. package/dist/components/dependent-selector/index.js +1 -1
  235. package/dist/components/document-scanner/index.js +1 -1
  236. package/dist/components/due-date-calculator/index.js +2 -2
  237. package/dist/components/email-input/email-input.d.ts.map +1 -1
  238. package/dist/components/email-input/index.js +1 -1
  239. package/dist/components/entity-summary/entity-summary.d.ts +43 -0
  240. package/dist/components/entity-summary/entity-summary.d.ts.map +1 -0
  241. package/dist/components/entity-summary/index.d.ts +3 -0
  242. package/dist/components/entity-summary/index.d.ts.map +1 -0
  243. package/dist/components/entity-summary/index.js +5 -0
  244. package/dist/components/entity-summary/index.js.map +1 -0
  245. package/dist/components/fetal-weight/index.js +1 -1
  246. package/dist/components/file-upload/index.js +1 -1
  247. package/dist/components/freemium-paywall/index.js +1 -1
  248. package/dist/components/gestational-age-calculator/index.js +1 -1
  249. package/dist/components/hcg-doubling/index.js +1 -1
  250. package/dist/components/index.d.ts +9 -0
  251. package/dist/components/index.d.ts.map +1 -1
  252. package/dist/components/notes-panel/index.d.ts +3 -0
  253. package/dist/components/notes-panel/index.d.ts.map +1 -0
  254. package/dist/components/notes-panel/index.js +5 -0
  255. package/dist/components/notes-panel/index.js.map +1 -0
  256. package/dist/components/notes-panel/notes-panel.d.ts +64 -0
  257. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -0
  258. package/dist/components/notification-card/index.js +1 -1
  259. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  260. package/dist/components/notification-tray/index.js +1 -1
  261. package/dist/components/operator-hero/index.js +1 -1
  262. package/dist/components/patient-details/index.d.ts +5 -0
  263. package/dist/components/patient-details/index.d.ts.map +1 -0
  264. package/dist/components/patient-details/index.js +6 -0
  265. package/dist/components/patient-details/index.js.map +1 -0
  266. package/dist/components/patient-details/patient-details.agent.d.ts +4 -0
  267. package/dist/components/patient-details/patient-details.agent.d.ts.map +1 -0
  268. package/dist/components/patient-details/patient-details.d.ts +96 -0
  269. package/dist/components/patient-details/patient-details.d.ts.map +1 -0
  270. package/dist/components/patient-search/index.js +1 -1
  271. package/dist/components/patient-summary-card/index.js +1 -1
  272. package/dist/components/patient-summary-card/patient-summary-card.agent.d.ts.map +1 -1
  273. package/dist/components/patient-summary-card/patient-summary-card.d.ts +40 -1
  274. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  275. package/dist/components/patient-table/columns.d.ts +69 -40
  276. package/dist/components/patient-table/columns.d.ts.map +1 -1
  277. package/dist/components/patient-table/index.d.ts +2 -6
  278. package/dist/components/patient-table/index.d.ts.map +1 -1
  279. package/dist/components/patient-table/index.js +8 -9
  280. package/dist/components/patient-table/patient-table.d.ts +38 -4
  281. package/dist/components/patient-table/patient-table.d.ts.map +1 -1
  282. package/dist/components/patient-table/types.d.ts +52 -2
  283. package/dist/components/patient-table/types.d.ts.map +1 -1
  284. package/dist/components/patient-table/use-responsive-columns.d.ts +8 -6
  285. package/dist/components/patient-table/use-responsive-columns.d.ts.map +1 -1
  286. package/dist/components/payment-card/index.js +1 -1
  287. package/dist/components/payment-form/index.js +1 -1
  288. package/dist/components/pdf-viewer/index.js +1 -1
  289. package/dist/components/periodontal-chart-card/index.js +1 -1
  290. package/dist/components/practice-results/index.js +1 -1
  291. package/dist/components/pregnancy-dating/index.js +1 -1
  292. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  293. package/dist/components/radiograph-panel/index.d.ts +4 -0
  294. package/dist/components/radiograph-panel/index.d.ts.map +1 -0
  295. package/dist/components/radiograph-panel/index.js +7 -0
  296. package/dist/components/radiograph-panel/index.js.map +1 -0
  297. package/dist/components/radiograph-panel/radiograph-panel.agent.d.ts +13 -0
  298. package/dist/components/radiograph-panel/radiograph-panel.agent.d.ts.map +1 -0
  299. package/dist/components/radiograph-panel/radiograph-panel.d.ts +36 -0
  300. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -0
  301. package/dist/components/rich-text-editor/index.js +1 -1
  302. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  303. package/dist/components/sidebar/index.js +1 -1
  304. package/dist/components/sign-document/index.js +1 -1
  305. package/dist/components/stepper-accordion/index.js +1 -1
  306. package/dist/components/tab-bar/index.js +1 -1
  307. package/dist/components/tab-bar/tab-bar.d.ts +18 -1
  308. package/dist/components/tab-bar/tab-bar.d.ts.map +1 -1
  309. package/dist/components/tooth-scheme/index.d.ts +2 -2
  310. package/dist/components/tooth-scheme/index.d.ts.map +1 -1
  311. package/dist/components/tooth-scheme/index.js +30 -23
  312. package/dist/components/tooth-scheme/tooth-data.d.ts +112 -1
  313. package/dist/components/tooth-scheme/tooth-data.d.ts.map +1 -1
  314. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts +2 -2
  315. package/dist/components/tooth-scheme/tooth-scheme.agent.d.ts.map +1 -1
  316. package/dist/components/tooth-scheme/tooth-scheme.d.ts +75 -11
  317. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
  318. package/dist/components/transaction-chip/index.js +1 -1
  319. package/dist/components/transaction-chip/transaction-chip.d.ts +2 -2
  320. package/dist/components/transaction-chip/transaction-chip.d.ts.map +1 -1
  321. package/dist/components/warning-stack/index.js +1 -1
  322. package/dist/components/warning-stack/warning-stack.d.ts +10 -7
  323. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  324. package/dist/components/workflow/index.js +1 -1
  325. package/dist/hooks/index.d.ts +1 -0
  326. package/dist/hooks/index.d.ts.map +1 -1
  327. package/dist/hooks/index.js +24 -22
  328. package/dist/hooks/index.js.map +1 -1
  329. package/dist/hooks/use-clamp-overflow.d.ts +19 -0
  330. package/dist/hooks/use-clamp-overflow.d.ts.map +1 -0
  331. package/dist/hooks/use-overflow-collapse.d.ts +46 -0
  332. package/dist/hooks/use-overflow-collapse.d.ts.map +1 -0
  333. package/dist/hooks/use-persistent-state.d.ts +7 -1
  334. package/dist/hooks/use-persistent-state.d.ts.map +1 -1
  335. package/dist/hooks/use-scroll-overflow.d.ts +36 -0
  336. package/dist/hooks/use-scroll-overflow.d.ts.map +1 -0
  337. package/dist/i18n/locales/ar.d.ts +308 -24
  338. package/dist/i18n/locales/ar.d.ts.map +1 -1
  339. package/dist/i18n/locales/ar.js +322 -27
  340. package/dist/i18n/locales/ar.js.map +1 -1
  341. package/dist/i18n/locales/de.d.ts +308 -24
  342. package/dist/i18n/locales/de.d.ts.map +1 -1
  343. package/dist/i18n/locales/de.js +322 -27
  344. package/dist/i18n/locales/de.js.map +1 -1
  345. package/dist/i18n/locales/el.d.ts +308 -24
  346. package/dist/i18n/locales/el.d.ts.map +1 -1
  347. package/dist/i18n/locales/el.js +322 -27
  348. package/dist/i18n/locales/el.js.map +1 -1
  349. package/dist/i18n/locales/en.d.ts +309 -32
  350. package/dist/i18n/locales/en.d.ts.map +1 -1
  351. package/dist/i18n/locales/en.js +323 -35
  352. package/dist/i18n/locales/en.js.map +1 -1
  353. package/dist/i18n/locales/es.d.ts +308 -24
  354. package/dist/i18n/locales/es.d.ts.map +1 -1
  355. package/dist/i18n/locales/es.js +322 -27
  356. package/dist/i18n/locales/es.js.map +1 -1
  357. package/dist/i18n/locales/fr.d.ts +308 -24
  358. package/dist/i18n/locales/fr.d.ts.map +1 -1
  359. package/dist/i18n/locales/fr.js +322 -27
  360. package/dist/i18n/locales/fr.js.map +1 -1
  361. package/dist/i18n/locales/hi.d.ts +308 -24
  362. package/dist/i18n/locales/hi.d.ts.map +1 -1
  363. package/dist/i18n/locales/hi.js +322 -27
  364. package/dist/i18n/locales/hi.js.map +1 -1
  365. package/dist/i18n/locales/it.d.ts +308 -24
  366. package/dist/i18n/locales/it.d.ts.map +1 -1
  367. package/dist/i18n/locales/it.js +322 -27
  368. package/dist/i18n/locales/it.js.map +1 -1
  369. package/dist/i18n/locales/ja.d.ts +308 -24
  370. package/dist/i18n/locales/ja.d.ts.map +1 -1
  371. package/dist/i18n/locales/ja.js +322 -27
  372. package/dist/i18n/locales/ja.js.map +1 -1
  373. package/dist/i18n/locales/nl.d.ts +308 -24
  374. package/dist/i18n/locales/nl.d.ts.map +1 -1
  375. package/dist/i18n/locales/nl.js +322 -27
  376. package/dist/i18n/locales/nl.js.map +1 -1
  377. package/dist/i18n/locales/pl.d.ts +308 -24
  378. package/dist/i18n/locales/pl.d.ts.map +1 -1
  379. package/dist/i18n/locales/pl.js +322 -27
  380. package/dist/i18n/locales/pl.js.map +1 -1
  381. package/dist/i18n/locales/pt.d.ts +308 -24
  382. package/dist/i18n/locales/pt.d.ts.map +1 -1
  383. package/dist/i18n/locales/pt.js +322 -27
  384. package/dist/i18n/locales/pt.js.map +1 -1
  385. package/dist/i18n/locales/ro.d.ts +308 -24
  386. package/dist/i18n/locales/ro.d.ts.map +1 -1
  387. package/dist/i18n/locales/ro.js +322 -27
  388. package/dist/i18n/locales/ro.js.map +1 -1
  389. package/dist/i18n/locales/ru.d.ts +308 -24
  390. package/dist/i18n/locales/ru.d.ts.map +1 -1
  391. package/dist/i18n/locales/ru.js +322 -27
  392. package/dist/i18n/locales/ru.js.map +1 -1
  393. package/dist/i18n/locales/sq.d.ts +308 -24
  394. package/dist/i18n/locales/sq.d.ts.map +1 -1
  395. package/dist/i18n/locales/sq.js +322 -27
  396. package/dist/i18n/locales/sq.js.map +1 -1
  397. package/dist/i18n/locales/sv.d.ts +308 -24
  398. package/dist/i18n/locales/sv.d.ts.map +1 -1
  399. package/dist/i18n/locales/sv.js +322 -27
  400. package/dist/i18n/locales/sv.js.map +1 -1
  401. package/dist/i18n/locales/tr.d.ts +308 -24
  402. package/dist/i18n/locales/tr.d.ts.map +1 -1
  403. package/dist/i18n/locales/tr.js +322 -27
  404. package/dist/i18n/locales/tr.js.map +1 -1
  405. package/dist/i18n/locales/zh.d.ts +308 -24
  406. package/dist/i18n/locales/zh.d.ts.map +1 -1
  407. package/dist/i18n/locales/zh.js +322 -27
  408. package/dist/i18n/locales/zh.js.map +1 -1
  409. package/dist/index.js +672 -623
  410. package/dist/index.js.map +1 -1
  411. package/dist/locales/ar.json +311 -27
  412. package/dist/locales/de.json +311 -27
  413. package/dist/locales/el.json +311 -27
  414. package/dist/locales/en.json +311 -27
  415. package/dist/locales/es.json +311 -27
  416. package/dist/locales/fr.json +311 -27
  417. package/dist/locales/hi.json +311 -27
  418. package/dist/locales/it.json +311 -27
  419. package/dist/locales/ja.json +311 -27
  420. package/dist/locales/nl.json +311 -27
  421. package/dist/locales/pl.json +311 -27
  422. package/dist/locales/pt.json +311 -27
  423. package/dist/locales/ro.json +311 -27
  424. package/dist/locales/ru.json +311 -27
  425. package/dist/locales/sq.json +311 -27
  426. package/dist/locales/sv.json +311 -27
  427. package/dist/locales/tr.json +311 -27
  428. package/dist/locales/zh.json +311 -27
  429. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  430. package/dist/tokens.css +1 -1
  431. package/package.json +37 -1
  432. package/dist/_chunks/actions-cell-renderer-DrcaxB0w.js.map +0 -1
  433. package/dist/_chunks/ai-tools-rail-BA_sqy1A.js +0 -373
  434. package/dist/_chunks/ai-tools-rail-BA_sqy1A.js.map +0 -1
  435. package/dist/_chunks/alert-_mUKLmwA.js.map +0 -1
  436. package/dist/_chunks/appointment-tray-CZtvtaH-.js +0 -431
  437. package/dist/_chunks/appointment-tray-CZtvtaH-.js.map +0 -1
  438. package/dist/_chunks/badge-CqGsX32l.js.map +0 -1
  439. package/dist/_chunks/clinical-note-card-DqQYf_D4.js +0 -333
  440. package/dist/_chunks/clinical-note-card-DqQYf_D4.js.map +0 -1
  441. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js +0 -448
  442. package/dist/_chunks/editable-currency-cell-renderer-kgqp_mIw.js.map +0 -1
  443. package/dist/_chunks/email-input-B_Y55f5G.js +0 -396
  444. package/dist/_chunks/notification-card-BiESdm8q.js.map +0 -1
  445. package/dist/_chunks/patient-summary-card-B836_fDB.js +0 -435
  446. package/dist/_chunks/patient-summary-card-B836_fDB.js.map +0 -1
  447. package/dist/_chunks/patient-table-CDuosVru.js +0 -889
  448. package/dist/_chunks/patient-table-CDuosVru.js.map +0 -1
  449. package/dist/_chunks/payment-request-card-DioWKBUq.js.map +0 -1
  450. package/dist/_chunks/pdf-viewer-D6BPfW2D.js.map +0 -1
  451. package/dist/_chunks/stepper-accordion-Dki6r9ZE.js.map +0 -1
  452. package/dist/_chunks/tab-bar-B1ovILzh.js +0 -105
  453. package/dist/_chunks/tab-bar-B1ovILzh.js.map +0 -1
  454. package/dist/_chunks/tooth-scheme-yBr53cvv.js +0 -1330
  455. package/dist/_chunks/tooth-scheme-yBr53cvv.js.map +0 -1
  456. package/dist/_chunks/transaction-chip-DK84XCBU.js.map +0 -1
  457. package/dist/_chunks/use-persistent-state-i23OWy6G.js +0 -24
  458. package/dist/_chunks/use-persistent-state-i23OWy6G.js.map +0 -1
  459. package/dist/_chunks/warning-stack-BsgaEbL8.js.map +0 -1
  460. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts +0 -45
  461. package/dist/components/patient-table/cell-renderers/contact-cell.d.ts.map +0 -1
  462. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts +0 -26
  463. package/dist/components/patient-table/cell-renderers/patient-identity-cell.d.ts.map +0 -1
@@ -2,7 +2,7 @@ import { jsxs as c, jsx as n } from "react/jsx-runtime";
2
2
  import { forwardRef as ce, useId as le, useMemo as M, useRef as R, useState as x, useEffect as V, useCallback as l, useImperativeHandle as ue } from "react";
3
3
  import { c as i } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as me } from "react-i18next";
5
- import { P as ge } from "./pdf-viewer-D6BPfW2D.js";
5
+ import { P as ge } from "./pdf-viewer-QfebdLOd.js";
6
6
  import { S as pe } from "./signature-capture-Ct_4Md4e.js";
7
7
  import { u as fe } from "./registry-DvAUVLHh.js";
8
8
  import { C as Z } from "./circle-check-9AeSgJD_.js";
@@ -367,4 +367,4 @@ export {
367
367
  je as S,
368
368
  ve as s
369
369
  };
370
- //# sourceMappingURL=sign-document-B4DeRhTe.js.map
370
+ //# sourceMappingURL=sign-document-By6hMOra.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sign-document-B4DeRhTe.js","sources":["../../src/components/sign-document/sign-document.agent.ts","../../src/components/sign-document/sign-document.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — SignDocument. */\n/* */\n/* State exposes only structural lifecycle info — never the signature */\n/* bytes (the signed consent is sensitive; persistence is the consumer's */\n/* concern). The single write action confirms the captured signature. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SignDocumentHandle } from './sign-document';\n\nexport const signDocumentAgent: AgentAdapter<SignDocumentHandle> = {\n id: 'sign-document',\n capabilities: ['submit'],\n state: {\n isReadComplete: {\n type: 'boolean',\n descriptionKey: 'signDocument.agent.state.isReadComplete',\n description:\n 'True when the reader has reached the last page (or read-gating is off).',\n read: (handle) => handle.isReadComplete(),\n },\n },\n actions: {\n submit: {\n // Persists intent: commits the captured signature and emits it via the\n // consumer's onSign callback. Reversible via reset() before persistence.\n safety: 'write',\n returns: 'SignatureConfirmPayload | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n description:\n 'The confirmed signature payload (PNG data URL + metadata).',\n properties: {\n dataUrl: {\n type: 'string',\n description: 'PNG data URL of the rendered signature.',\n },\n },\n required: ['dataUrl'],\n },\n {\n type: 'null',\n description: 'Returned when there is no signature to confirm.',\n },\n ],\n },\n // confirm() emits via onSign — calling twice re-emits the same payload,\n // so it is not flagged idempotent.\n descriptionKey: 'signDocument.agent.actions.confirm',\n description:\n 'Confirm the current signature, emitting it via onSign. No-op if unsigned.',\n invoke: (handle) => handle.confirm(),\n },\n reset: {\n // Discards the captured signature — destructive (loses drawn input).\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'signDocument.agent.actions.reset',\n description: 'Clear the captured signature and return to unsigned.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'sign-document',\n description: 'Marks the SignDocument wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* SignDocument — review a PDF document, then sign it. */\n/* */\n/* Fills the kit gap where consumers hand-composed PDFViewer + */\n/* SignatureCapture for consents (e.g. sign.alfadocs.com, HTP-4889). */\n/* This component owns the composition and the read-gate so the consent */\n/* flow is a single primitive: */\n/* */\n/* - PDFViewer (the document) renders above; the signing surface */\n/* renders below. */\n/* - When `requireReadToEnd` (default), the SignatureCapture pad and */\n/* the \"Confirm & sign\" button are gated until the reader reaches the */\n/* LAST page. We track this via PDFViewer's onLoadComplete (numPages) */\n/* + onPageChange (currentPage === numPages). NOTE: last-page-reached */\n/* is an APPROXIMATE read signal — a fit-page zoom can show the last */\n/* page without scrolling. That is acceptable for this gate; a */\n/* legal-grade \"read every page\" guarantee is the consumer's call. */\n/* - When `signedAt` is set the component renders an already-signed */\n/* read-only state (no pad) so re-sign-on-change consumers can show */\n/* signed status. */\n/* - Security: no fetch / XHR / storage / globals here. SignatureCapture */\n/* owns the export payload (PNG/SVG + sha256); the consumer owns */\n/* persistence via onSign. */\n/* - i18n: every authored string via `t('signDocument.*')` (bare keys */\n/* under the `ui` namespace). PDFViewer's `pdf.*` and */\n/* SignatureCapture's `signature.*` strings already exist. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CheckCircle2 } from 'lucide-react';\nimport { PDFViewer } from '../pdf-viewer';\nimport {\n SignatureCapture,\n type SignatureCaptureHandle,\n type SignatureConfirmPayload,\n} from '../signature-capture';\nimport { useAgentRegistration } from '../../agent';\nimport { signDocumentAgent } from './sign-document.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SignDocumentProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Document PDF — URL string, ArrayBuffer, or Uint8Array. Passed to PDFViewer. */\n src: string | ArrayBuffer | Uint8Array;\n /** Accessible name for the document region (also used as a heading). */\n documentTitle?: string;\n /**\n * Gate the signature + Confirm until the reader reaches the last page.\n * Default `true`. Last-page-reached is an approximate read signal (a\n * fit-page zoom can show the last page without scrolling) — adequate for\n * this gate; legal-grade read tracking is the consumer's concern.\n */\n requireReadToEnd?: boolean;\n /** Fired when the user captures a signature AND confirms. */\n onSign?: (payload: SignatureConfirmPayload) => void;\n /** Forwarded from PDFViewer on any load / render error. */\n onError?: (error: Error) => void;\n /**\n * When set, render the already-signed read-only state: shows \"Signed\" +\n * the signed date and hides the pad. Use for re-sign-on-change consumers\n * that surface signed status. `null` / `undefined` → unsigned.\n */\n signedAt?: string | null;\n /**\n * Optional on-behalf attribution. When both `signer` and `subject` are\n * given, a \"Signed by {signer} on behalf of {subject}\" note renders both\n * near the signature pad (so the signer sees who they're signing for) AND\n * inside the already-signed read-only banner. Omit (the default) and\n * nothing extra renders — the existing subject-agnostic API is unchanged.\n * Provide both to opt in; a lone `signer` or `subject` renders nothing.\n */\n signedByNote?: { signer: string; subject: string };\n /** Disable all controls (document still readable). */\n disabled?: boolean;\n /** Render read-only: the document is shown but the pad is suppressed. */\n readOnly?: boolean;\n /** Accessible label for the component's group region. */\n ariaLabel?: string;\n /** Extra class names merged onto the outermost wrapper. */\n className?: string;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface SignDocumentHandle {\n /** Clear the captured signature, returning to the unsigned state. */\n reset: () => void;\n /** Confirm the current signature; resolves the payload, or null if unsigned. */\n confirm: () => Promise<SignatureConfirmPayload | null>;\n /** True when the reader has reached the last page (or the gate is off). */\n isReadComplete: () => boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst headingVariants = cva(\n ['type-heading-sm ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst signSectionVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]'].join(' '),\n);\n\nconst sectionLabelVariants = cva(\n ['type-body-sm ds:font-medium ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst progressVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n ].join(' '),\n);\n\n// The \"scroll to the end to sign\" hint uses --info as a low-emphasis\n// informational tint — tokenised, logical-property insets, no accent over\n// arbitrary content.\nconst hintVariants = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-body-sm',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_10%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:border ds:border-[color:color-mix(in_srgb,var(--info)_40%,transparent)]',\n ].join(' '),\n);\n\nconst confirmButtonVariants = cva(\n [\n 'ds:inline-flex ds:inline-size-full 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: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:disabled:opacity-[var(--opacity-50)] ds:disabled:cursor-not-allowed',\n 'ds:disabled:hover:bg-[var(--primary)]',\n ].join(' '),\n);\n\n// The signed banner uses the semantic --success alias for the confirmed\n// state — never the raw ramp step (constraint §11).\nconst signedBannerVariants = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_12%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:border ds:border-[color:color-mix(in_srgb,var(--success)_45%,transparent)]',\n ].join(' '),\n);\n\n// The on-behalf attribution note. Low-emphasis muted text — it qualifies the\n// signature, it isn't an action. `placement` swaps the inset/spacing so the\n// same string reads correctly above the pad (a hint) and inside the signed\n// banner (a continuation of the signed copy).\nconst attributionVariants = cva(['type-body-sm'].join(' '), {\n variants: {\n placement: {\n pad: 'ds:text-[var(--muted-foreground)]',\n banner: 'ds:block ds:text-[var(--foreground)]',\n },\n },\n defaultVariants: { placement: 'pad' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Format an ISO timestamp using the active i18n locale. Falls back to the\n * raw string if it can't be parsed so a malformed `signedAt` never throws.\n */\nfunction formatSignedAt(iso: string, locale: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return iso;\n try {\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'long',\n timeStyle: 'short',\n }).format(date);\n } catch {\n return date.toISOString();\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* SignDocument */\n/* ------------------------------------------------------------------ */\n\nexport const SignDocument = forwardRef<SignDocumentHandle, SignDocumentProps>(\n (\n {\n id,\n src,\n documentTitle,\n requireReadToEnd = true,\n onSign,\n onError,\n signedAt = null,\n signedByNote,\n disabled = false,\n readOnly = false,\n ariaLabel,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const rawId = useId();\n const idSafe = useMemo(\n () => `sign-doc-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const docHeadingId = `${idSafe}-doc-heading`;\n const signLabelId = `${idSafe}-sign-label`;\n const liveRegionId = `${idSafe}-live`;\n // Stable, static describedby target for the sign section + Confirm —\n // kept separate from the polite live region so describedby points at\n // unchanging text, not the transition announcer (which only carries\n // gate-met / signed announcements).\n const gateHintId = `${idSafe}-gate-hint`;\n\n const signatureRef = useRef<SignatureCaptureHandle>(null);\n\n const [numPages, setNumPages] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n // True once the reader has reached the last page at least once. Sticky:\n // scrolling back up does not re-lock the signature.\n const [reachedEnd, setReachedEnd] = useState(false);\n // Mirrors the pad's ink state so the Confirm button re-renders when a\n // signature lands. SignatureCapture's isEmpty() is a sync ref read (no\n // re-render) and its onStart only fires on a DRAWN stroke — not on the\n // typed fallback. We poll the handle so both paths gate Confirm\n // identically; onStart/onClear below are immediate-feedback hints.\n const [hasSignature, setHasSignature] = useState(false);\n\n const isSigned = signedAt != null;\n const inert = disabled || readOnly || isSigned;\n\n // Latest callbacks via refs so the async confirm path never closes over\n // a stale prop.\n const onSignRef = useRef(onSign);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onSignRef.current = onSign;\n onErrorRef.current = onError;\n }, [onSign, onError]);\n\n /* ---- Per-document reset -------------------------------------- */\n // When the consumer swaps `src` to a NEW document, the previous \"read\n // complete\" state must NOT carry over — otherwise the new document\n // could be signed without being read. Reset the per-document state;\n // PDFViewer's onLoadComplete re-sets reachedEnd for single-page docs.\n useEffect(() => {\n setReachedEnd(false);\n setNumPages(0);\n setCurrentPage(1);\n setHasSignature(false);\n }, [src]);\n\n /* ---- Read-gate tracking -------------------------------------- */\n const handleLoadComplete = useCallback(\n (info: { numPages: number; title?: string }) => {\n setNumPages(info.numPages);\n // A single-page document is \"read to the end\" the moment it loads.\n if (info.numPages <= 1) setReachedEnd(true);\n },\n [],\n );\n\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page);\n setNumPages((total) => {\n if (total > 0 && page >= total) setReachedEnd(true);\n return total;\n });\n }, []);\n\n const handleError = useCallback((error: Error) => {\n onErrorRef.current?.(error);\n }, []);\n\n /* ---- Signature-presence polling ------------------------------ */\n // Poll the pad's isEmpty() while the signing surface is live so the\n // Confirm button reflects both drawn AND typed signatures. Cheap\n // (a single boolean ref read on an interval); torn down when signed,\n // read-only, or unmounted.\n const signLive = !isSigned && !readOnly;\n useEffect(() => {\n if (!signLive) return undefined;\n const tick = (): void => {\n const pad = signatureRef.current;\n if (!pad) return;\n setHasSignature(!pad.isEmpty());\n };\n tick();\n const interval = window.setInterval(tick, 200);\n return () => window.clearInterval(interval);\n }, [signLive]);\n\n // The gate is satisfied when reading isn't required, or the reader has\n // reached the last page at least once.\n const readComplete = !requireReadToEnd || reachedEnd;\n const canSign = !inert && readComplete;\n const confirmDisabled = !canSign || !hasSignature;\n\n /* ---- Confirm path -------------------------------------------- */\n // `onSign` fires from SignatureCapture's `onConfirm` (wired below) — the\n // single source of truth, so it fires once whether the user clicks the\n // pad's own Confirm or this component's \"Confirm & sign\". This handle\n // just proxies the pad's confirm() and returns its payload.\n const handleSigned = useCallback((payload: SignatureConfirmPayload) => {\n onSignRef.current?.(payload);\n }, []);\n\n const confirm =\n useCallback(async (): Promise<SignatureConfirmPayload | null> => {\n const pad = signatureRef.current;\n if (!pad) return null;\n return pad.confirm();\n }, []);\n\n const reset = useCallback(() => {\n signatureRef.current?.clear();\n setHasSignature(false);\n }, []);\n\n /* ---- Imperative handle + agent registration ------------------ */\n const agentHandle = useMemo<SignDocumentHandle>(\n () => ({\n reset,\n confirm,\n isReadComplete: () => readComplete,\n }),\n [reset, confirm, readComplete],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(signDocumentAgent, agentHandle, id);\n\n /* ---- Derived strings ----------------------------------------- */\n const regionLabel =\n ariaLabel ??\n (documentTitle\n ? t('signDocument.regionLabelNamed', { title: documentTitle })\n : t('signDocument.regionLabel'));\n const documentRegionLabel =\n documentTitle ?? t('signDocument.documentLabel');\n\n // Live region — ONLY transition announcements (gate met / signed).\n const liveText = isSigned\n ? t('signDocument.signedOn', {\n date: formatSignedAt(signedAt as string, i18n.language),\n })\n : readComplete\n ? t('signDocument.readyToSign')\n : '';\n\n // Static describedby target — always names WHY Confirm is unavailable\n // (or stays empty when it's actionable). Stable text, never live.\n const gateHintText = !readComplete\n ? t('signDocument.scrollToEnd')\n : !hasSignature\n ? t('signDocument.signToEnable')\n : '';\n\n // On-behalf attribution — only when BOTH signer and subject are present\n // (a lone half is meaningless). Rendered above the pad and in the signed\n // banner. Optional: undefined → no attribution, API unchanged.\n const attributionText =\n signedByNote?.signer && signedByNote?.subject\n ? t('signDocument.signedByOnBehalf', {\n signer: signedByNote.signer,\n subject: signedByNote.subject,\n })\n : null;\n\n return (\n <div\n role=\"group\"\n // Prefer labelling by the visible heading so the visible + accessible\n // names match; fall back to aria-label only when there's no heading.\n aria-labelledby={!ariaLabel && documentTitle ? docHeadingId : undefined}\n aria-label={ariaLabel || !documentTitle ? regionLabel : undefined}\n aria-disabled={disabled || undefined}\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n data-component=\"sign-document\"\n data-component-id={id}\n data-signed={isSigned || undefined}\n >\n {/* Polite live region — ONLY transition announcements (gate met /\n signed). Static describedby text lives in the gate-hint span. */}\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n data-testid=\"sign-document-live\"\n id={liveRegionId}\n >\n {liveText}\n </span>\n\n {/* Static, non-live describedby target for the sign group + Confirm:\n names why Confirm is unavailable (or empty when actionable). */}\n <span className=\"ds:sr-only\" id={gateHintId}>\n {gateHintText}\n </span>\n\n {documentTitle ? (\n <h2 id={docHeadingId} className={headingVariants()}>\n {documentTitle}\n </h2>\n ) : null}\n\n {/* The document. PDFViewer owns its own toolbar, a11y, and zoom. */}\n <PDFViewer\n src={src}\n ariaLabel={documentRegionLabel}\n onLoadComplete={handleLoadComplete}\n onPageChange={handlePageChange}\n onError={handleError}\n />\n\n {isSigned ? (\n /* ---- Already-signed, read-only ---- */\n <div\n className={signedBannerVariants()}\n data-testid=\"sign-document-signed\"\n >\n <CheckCircle2\n aria-hidden=\"true\"\n className=\"ds:size-5 ds:text-[var(--success)] ds:shrink-0\"\n />\n <span className=\"type-body-sm\">\n <strong className=\"ds:font-semibold\">\n {t('signDocument.signed')}\n </strong>\n {' — '}\n {t('signDocument.signedOn', {\n date: formatSignedAt(signedAt as string, i18n.language),\n })}\n {attributionText ? (\n <span\n className={attributionVariants({ placement: 'banner' })}\n data-testid=\"sign-document-attribution\"\n >\n {attributionText}\n </span>\n ) : null}\n </span>\n </div>\n ) : readOnly ? null : (\n /* ---- Sign surface ---- */\n <div\n className={signSectionVariants()}\n role=\"group\"\n aria-labelledby={signLabelId}\n aria-describedby={gateHintId}\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span id={signLabelId} className={sectionLabelVariants()}>\n {t('signDocument.signatureSection')}\n </span>\n {numPages > 0 ? (\n <span\n className={progressVariants()}\n data-testid=\"sign-document-progress\"\n >\n {t('signDocument.pageProgress', {\n current: currentPage,\n total: numPages,\n })}\n </span>\n ) : null}\n </div>\n\n {attributionText ? (\n <p\n className={attributionVariants({ placement: 'pad' })}\n data-testid=\"sign-document-attribution\"\n >\n {attributionText}\n </p>\n ) : null}\n\n {requireReadToEnd && !readComplete ? (\n <p className={hintVariants()} data-testid=\"sign-document-hint\">\n {t('signDocument.scrollToEnd')}\n </p>\n ) : null}\n\n {/* The pad is always mounted so a keyboard user can prepare a\n typed signature; the Confirm button is the gate. When the\n read-gate is unmet the pad is disabled so it can't accept\n ink prematurely. */}\n <SignatureCapture\n ref={signatureRef}\n ariaLabel={t('signDocument.signatureSection')}\n disabled={disabled || !readComplete}\n onStart={() => setHasSignature(true)}\n onClear={() => setHasSignature(false)}\n onConfirm={handleSigned}\n />\n\n {/* Native `disabled` (not aria-disabled) so a gated Confirm\n leaves the tab order entirely — mirrors how Button gates a\n primary action. describedby names WHY it's unavailable. */}\n <button\n type=\"button\"\n onClick={() => {\n if (confirmDisabled) return;\n void confirm();\n }}\n disabled={confirmDisabled}\n aria-describedby={gateHintId}\n className={confirmButtonVariants()}\n data-testid=\"sign-document-confirm\"\n >\n <CheckCircle2 aria-hidden=\"true\" className=\"ds:size-4\" />\n {t('signDocument.confirm')}\n </button>\n </div>\n )}\n </div>\n );\n },\n);\n\nSignDocument.displayName = 'SignDocument';\n\nexport { rootVariants as signDocumentRootVariants };\n"],"names":["signDocumentAgent","handle","rootVariants","cva","headingVariants","signSectionVariants","sectionLabelVariants","progressVariants","hintVariants","confirmButtonVariants","signedBannerVariants","attributionVariants","formatSignedAt","iso","locale","date","SignDocument","forwardRef","id","src","documentTitle","requireReadToEnd","onSign","onError","signedAt","signedByNote","disabled","readOnly","ariaLabel","className","ref","t","i18n","useTranslation","rawId","useId","idSafe","useMemo","docHeadingId","signLabelId","liveRegionId","gateHintId","signatureRef","useRef","numPages","setNumPages","useState","currentPage","setCurrentPage","reachedEnd","setReachedEnd","hasSignature","setHasSignature","isSigned","inert","onSignRef","onErrorRef","useEffect","handleLoadComplete","useCallback","info","handlePageChange","page","total","handleError","error","_a","signLive","tick","pad","interval","readComplete","confirmDisabled","handleSigned","payload","confirm","reset","agentHandle","useImperativeHandle","useAgentRegistration","regionLabel","documentRegionLabel","liveText","gateHintText","attributionText","jsxs","jsx","PDFViewer","CheckCircle2","SignatureCapture"],"mappings":"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"}
1
+ {"version":3,"file":"sign-document-By6hMOra.js","sources":["../../src/components/sign-document/sign-document.agent.ts","../../src/components/sign-document/sign-document.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — SignDocument. */\n/* */\n/* State exposes only structural lifecycle info — never the signature */\n/* bytes (the signed consent is sensitive; persistence is the consumer's */\n/* concern). The single write action confirms the captured signature. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { SignDocumentHandle } from './sign-document';\n\nexport const signDocumentAgent: AgentAdapter<SignDocumentHandle> = {\n id: 'sign-document',\n capabilities: ['submit'],\n state: {\n isReadComplete: {\n type: 'boolean',\n descriptionKey: 'signDocument.agent.state.isReadComplete',\n description:\n 'True when the reader has reached the last page (or read-gating is off).',\n read: (handle) => handle.isReadComplete(),\n },\n },\n actions: {\n submit: {\n // Persists intent: commits the captured signature and emits it via the\n // consumer's onSign callback. Reversible via reset() before persistence.\n safety: 'write',\n returns: 'SignatureConfirmPayload | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n description:\n 'The confirmed signature payload (PNG data URL + metadata).',\n properties: {\n dataUrl: {\n type: 'string',\n description: 'PNG data URL of the rendered signature.',\n },\n },\n required: ['dataUrl'],\n },\n {\n type: 'null',\n description: 'Returned when there is no signature to confirm.',\n },\n ],\n },\n // confirm() emits via onSign — calling twice re-emits the same payload,\n // so it is not flagged idempotent.\n descriptionKey: 'signDocument.agent.actions.confirm',\n description:\n 'Confirm the current signature, emitting it via onSign. No-op if unsigned.',\n invoke: (handle) => handle.confirm(),\n },\n reset: {\n // Discards the captured signature — destructive (loses drawn input).\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'signDocument.agent.actions.reset',\n description: 'Clear the captured signature and return to unsigned.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'sign-document',\n description: 'Marks the SignDocument wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* SignDocument — review a PDF document, then sign it. */\n/* */\n/* Fills the kit gap where consumers hand-composed PDFViewer + */\n/* SignatureCapture for consents (e.g. sign.alfadocs.com, HTP-4889). */\n/* This component owns the composition and the read-gate so the consent */\n/* flow is a single primitive: */\n/* */\n/* - PDFViewer (the document) renders above; the signing surface */\n/* renders below. */\n/* - When `requireReadToEnd` (default), the SignatureCapture pad and */\n/* the \"Confirm & sign\" button are gated until the reader reaches the */\n/* LAST page. We track this via PDFViewer's onLoadComplete (numPages) */\n/* + onPageChange (currentPage === numPages). NOTE: last-page-reached */\n/* is an APPROXIMATE read signal — a fit-page zoom can show the last */\n/* page without scrolling. That is acceptable for this gate; a */\n/* legal-grade \"read every page\" guarantee is the consumer's call. */\n/* - When `signedAt` is set the component renders an already-signed */\n/* read-only state (no pad) so re-sign-on-change consumers can show */\n/* signed status. */\n/* - Security: no fetch / XHR / storage / globals here. SignatureCapture */\n/* owns the export payload (PNG/SVG + sha256); the consumer owns */\n/* persistence via onSign. */\n/* - i18n: every authored string via `t('signDocument.*')` (bare keys */\n/* under the `ui` namespace). PDFViewer's `pdf.*` and */\n/* SignatureCapture's `signature.*` strings already exist. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { CheckCircle2 } from 'lucide-react';\nimport { PDFViewer } from '../pdf-viewer';\nimport {\n SignatureCapture,\n type SignatureCaptureHandle,\n type SignatureConfirmPayload,\n} from '../signature-capture';\nimport { useAgentRegistration } from '../../agent';\nimport { signDocumentAgent } from './sign-document.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SignDocumentProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Document PDF — URL string, ArrayBuffer, or Uint8Array. Passed to PDFViewer. */\n src: string | ArrayBuffer | Uint8Array;\n /** Accessible name for the document region (also used as a heading). */\n documentTitle?: string;\n /**\n * Gate the signature + Confirm until the reader reaches the last page.\n * Default `true`. Last-page-reached is an approximate read signal (a\n * fit-page zoom can show the last page without scrolling) — adequate for\n * this gate; legal-grade read tracking is the consumer's concern.\n */\n requireReadToEnd?: boolean;\n /** Fired when the user captures a signature AND confirms. */\n onSign?: (payload: SignatureConfirmPayload) => void;\n /** Forwarded from PDFViewer on any load / render error. */\n onError?: (error: Error) => void;\n /**\n * When set, render the already-signed read-only state: shows \"Signed\" +\n * the signed date and hides the pad. Use for re-sign-on-change consumers\n * that surface signed status. `null` / `undefined` → unsigned.\n */\n signedAt?: string | null;\n /**\n * Optional on-behalf attribution. When both `signer` and `subject` are\n * given, a \"Signed by {signer} on behalf of {subject}\" note renders both\n * near the signature pad (so the signer sees who they're signing for) AND\n * inside the already-signed read-only banner. Omit (the default) and\n * nothing extra renders — the existing subject-agnostic API is unchanged.\n * Provide both to opt in; a lone `signer` or `subject` renders nothing.\n */\n signedByNote?: { signer: string; subject: string };\n /** Disable all controls (document still readable). */\n disabled?: boolean;\n /** Render read-only: the document is shown but the pad is suppressed. */\n readOnly?: boolean;\n /** Accessible label for the component's group region. */\n ariaLabel?: string;\n /** Extra class names merged onto the outermost wrapper. */\n className?: string;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface SignDocumentHandle {\n /** Clear the captured signature, returning to the unsigned state. */\n reset: () => void;\n /** Confirm the current signature; resolves the payload, or null if unsigned. */\n confirm: () => Promise<SignatureConfirmPayload | null>;\n /** True when the reader has reached the last page (or the gate is off). */\n isReadComplete: () => boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst headingVariants = cva(\n ['type-heading-sm ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst signSectionVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]'].join(' '),\n);\n\nconst sectionLabelVariants = cva(\n ['type-body-sm ds:font-medium ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst progressVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n ].join(' '),\n);\n\n// The \"scroll to the end to sign\" hint uses --info as a low-emphasis\n// informational tint — tokenised, logical-property insets, no accent over\n// arbitrary content.\nconst hintVariants = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'type-body-sm',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_10%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:border ds:border-[color:color-mix(in_srgb,var(--info)_40%,transparent)]',\n ].join(' '),\n);\n\nconst confirmButtonVariants = cva(\n [\n 'ds:inline-flex ds:inline-size-full 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: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:disabled:opacity-[var(--opacity-50)] ds:disabled:cursor-not-allowed',\n 'ds:disabled:hover:bg-[var(--primary)]',\n ].join(' '),\n);\n\n// The signed banner uses the semantic --success alias for the confirmed\n// state — never the raw ramp step (constraint §11).\nconst signedBannerVariants = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_12%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:border ds:border-[color:color-mix(in_srgb,var(--success)_45%,transparent)]',\n ].join(' '),\n);\n\n// The on-behalf attribution note. Low-emphasis muted text — it qualifies the\n// signature, it isn't an action. `placement` swaps the inset/spacing so the\n// same string reads correctly above the pad (a hint) and inside the signed\n// banner (a continuation of the signed copy).\nconst attributionVariants = cva(['type-body-sm'].join(' '), {\n variants: {\n placement: {\n pad: 'ds:text-[var(--muted-foreground)]',\n banner: 'ds:block ds:text-[var(--foreground)]',\n },\n },\n defaultVariants: { placement: 'pad' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Format an ISO timestamp using the active i18n locale. Falls back to the\n * raw string if it can't be parsed so a malformed `signedAt` never throws.\n */\nfunction formatSignedAt(iso: string, locale: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return iso;\n try {\n return new Intl.DateTimeFormat(locale, {\n dateStyle: 'long',\n timeStyle: 'short',\n }).format(date);\n } catch {\n return date.toISOString();\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* SignDocument */\n/* ------------------------------------------------------------------ */\n\nexport const SignDocument = forwardRef<SignDocumentHandle, SignDocumentProps>(\n (\n {\n id,\n src,\n documentTitle,\n requireReadToEnd = true,\n onSign,\n onError,\n signedAt = null,\n signedByNote,\n disabled = false,\n readOnly = false,\n ariaLabel,\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const rawId = useId();\n const idSafe = useMemo(\n () => `sign-doc-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const docHeadingId = `${idSafe}-doc-heading`;\n const signLabelId = `${idSafe}-sign-label`;\n const liveRegionId = `${idSafe}-live`;\n // Stable, static describedby target for the sign section + Confirm —\n // kept separate from the polite live region so describedby points at\n // unchanging text, not the transition announcer (which only carries\n // gate-met / signed announcements).\n const gateHintId = `${idSafe}-gate-hint`;\n\n const signatureRef = useRef<SignatureCaptureHandle>(null);\n\n const [numPages, setNumPages] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n // True once the reader has reached the last page at least once. Sticky:\n // scrolling back up does not re-lock the signature.\n const [reachedEnd, setReachedEnd] = useState(false);\n // Mirrors the pad's ink state so the Confirm button re-renders when a\n // signature lands. SignatureCapture's isEmpty() is a sync ref read (no\n // re-render) and its onStart only fires on a DRAWN stroke — not on the\n // typed fallback. We poll the handle so both paths gate Confirm\n // identically; onStart/onClear below are immediate-feedback hints.\n const [hasSignature, setHasSignature] = useState(false);\n\n const isSigned = signedAt != null;\n const inert = disabled || readOnly || isSigned;\n\n // Latest callbacks via refs so the async confirm path never closes over\n // a stale prop.\n const onSignRef = useRef(onSign);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onSignRef.current = onSign;\n onErrorRef.current = onError;\n }, [onSign, onError]);\n\n /* ---- Per-document reset -------------------------------------- */\n // When the consumer swaps `src` to a NEW document, the previous \"read\n // complete\" state must NOT carry over — otherwise the new document\n // could be signed without being read. Reset the per-document state;\n // PDFViewer's onLoadComplete re-sets reachedEnd for single-page docs.\n useEffect(() => {\n setReachedEnd(false);\n setNumPages(0);\n setCurrentPage(1);\n setHasSignature(false);\n }, [src]);\n\n /* ---- Read-gate tracking -------------------------------------- */\n const handleLoadComplete = useCallback(\n (info: { numPages: number; title?: string }) => {\n setNumPages(info.numPages);\n // A single-page document is \"read to the end\" the moment it loads.\n if (info.numPages <= 1) setReachedEnd(true);\n },\n [],\n );\n\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page);\n setNumPages((total) => {\n if (total > 0 && page >= total) setReachedEnd(true);\n return total;\n });\n }, []);\n\n const handleError = useCallback((error: Error) => {\n onErrorRef.current?.(error);\n }, []);\n\n /* ---- Signature-presence polling ------------------------------ */\n // Poll the pad's isEmpty() while the signing surface is live so the\n // Confirm button reflects both drawn AND typed signatures. Cheap\n // (a single boolean ref read on an interval); torn down when signed,\n // read-only, or unmounted.\n const signLive = !isSigned && !readOnly;\n useEffect(() => {\n if (!signLive) return undefined;\n const tick = (): void => {\n const pad = signatureRef.current;\n if (!pad) return;\n setHasSignature(!pad.isEmpty());\n };\n tick();\n const interval = window.setInterval(tick, 200);\n return () => window.clearInterval(interval);\n }, [signLive]);\n\n // The gate is satisfied when reading isn't required, or the reader has\n // reached the last page at least once.\n const readComplete = !requireReadToEnd || reachedEnd;\n const canSign = !inert && readComplete;\n const confirmDisabled = !canSign || !hasSignature;\n\n /* ---- Confirm path -------------------------------------------- */\n // `onSign` fires from SignatureCapture's `onConfirm` (wired below) — the\n // single source of truth, so it fires once whether the user clicks the\n // pad's own Confirm or this component's \"Confirm & sign\". This handle\n // just proxies the pad's confirm() and returns its payload.\n const handleSigned = useCallback((payload: SignatureConfirmPayload) => {\n onSignRef.current?.(payload);\n }, []);\n\n const confirm =\n useCallback(async (): Promise<SignatureConfirmPayload | null> => {\n const pad = signatureRef.current;\n if (!pad) return null;\n return pad.confirm();\n }, []);\n\n const reset = useCallback(() => {\n signatureRef.current?.clear();\n setHasSignature(false);\n }, []);\n\n /* ---- Imperative handle + agent registration ------------------ */\n const agentHandle = useMemo<SignDocumentHandle>(\n () => ({\n reset,\n confirm,\n isReadComplete: () => readComplete,\n }),\n [reset, confirm, readComplete],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(signDocumentAgent, agentHandle, id);\n\n /* ---- Derived strings ----------------------------------------- */\n const regionLabel =\n ariaLabel ??\n (documentTitle\n ? t('signDocument.regionLabelNamed', { title: documentTitle })\n : t('signDocument.regionLabel'));\n const documentRegionLabel =\n documentTitle ?? t('signDocument.documentLabel');\n\n // Live region — ONLY transition announcements (gate met / signed).\n const liveText = isSigned\n ? t('signDocument.signedOn', {\n date: formatSignedAt(signedAt as string, i18n.language),\n })\n : readComplete\n ? t('signDocument.readyToSign')\n : '';\n\n // Static describedby target — always names WHY Confirm is unavailable\n // (or stays empty when it's actionable). Stable text, never live.\n const gateHintText = !readComplete\n ? t('signDocument.scrollToEnd')\n : !hasSignature\n ? t('signDocument.signToEnable')\n : '';\n\n // On-behalf attribution — only when BOTH signer and subject are present\n // (a lone half is meaningless). Rendered above the pad and in the signed\n // banner. Optional: undefined → no attribution, API unchanged.\n const attributionText =\n signedByNote?.signer && signedByNote?.subject\n ? t('signDocument.signedByOnBehalf', {\n signer: signedByNote.signer,\n subject: signedByNote.subject,\n })\n : null;\n\n return (\n <div\n role=\"group\"\n // Prefer labelling by the visible heading so the visible + accessible\n // names match; fall back to aria-label only when there's no heading.\n aria-labelledby={!ariaLabel && documentTitle ? docHeadingId : undefined}\n aria-label={ariaLabel || !documentTitle ? regionLabel : undefined}\n aria-disabled={disabled || undefined}\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n data-component=\"sign-document\"\n data-component-id={id}\n data-signed={isSigned || undefined}\n >\n {/* Polite live region — ONLY transition announcements (gate met /\n signed). Static describedby text lives in the gate-hint span. */}\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n data-testid=\"sign-document-live\"\n id={liveRegionId}\n >\n {liveText}\n </span>\n\n {/* Static, non-live describedby target for the sign group + Confirm:\n names why Confirm is unavailable (or empty when actionable). */}\n <span className=\"ds:sr-only\" id={gateHintId}>\n {gateHintText}\n </span>\n\n {documentTitle ? (\n <h2 id={docHeadingId} className={headingVariants()}>\n {documentTitle}\n </h2>\n ) : null}\n\n {/* The document. PDFViewer owns its own toolbar, a11y, and zoom. */}\n <PDFViewer\n src={src}\n ariaLabel={documentRegionLabel}\n onLoadComplete={handleLoadComplete}\n onPageChange={handlePageChange}\n onError={handleError}\n />\n\n {isSigned ? (\n /* ---- Already-signed, read-only ---- */\n <div\n className={signedBannerVariants()}\n data-testid=\"sign-document-signed\"\n >\n <CheckCircle2\n aria-hidden=\"true\"\n className=\"ds:size-5 ds:text-[var(--success)] ds:shrink-0\"\n />\n <span className=\"type-body-sm\">\n <strong className=\"ds:font-semibold\">\n {t('signDocument.signed')}\n </strong>\n {' — '}\n {t('signDocument.signedOn', {\n date: formatSignedAt(signedAt as string, i18n.language),\n })}\n {attributionText ? (\n <span\n className={attributionVariants({ placement: 'banner' })}\n data-testid=\"sign-document-attribution\"\n >\n {attributionText}\n </span>\n ) : null}\n </span>\n </div>\n ) : readOnly ? null : (\n /* ---- Sign surface ---- */\n <div\n className={signSectionVariants()}\n role=\"group\"\n aria-labelledby={signLabelId}\n aria-describedby={gateHintId}\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <span id={signLabelId} className={sectionLabelVariants()}>\n {t('signDocument.signatureSection')}\n </span>\n {numPages > 0 ? (\n <span\n className={progressVariants()}\n data-testid=\"sign-document-progress\"\n >\n {t('signDocument.pageProgress', {\n current: currentPage,\n total: numPages,\n })}\n </span>\n ) : null}\n </div>\n\n {attributionText ? (\n <p\n className={attributionVariants({ placement: 'pad' })}\n data-testid=\"sign-document-attribution\"\n >\n {attributionText}\n </p>\n ) : null}\n\n {requireReadToEnd && !readComplete ? (\n <p className={hintVariants()} data-testid=\"sign-document-hint\">\n {t('signDocument.scrollToEnd')}\n </p>\n ) : null}\n\n {/* The pad is always mounted so a keyboard user can prepare a\n typed signature; the Confirm button is the gate. When the\n read-gate is unmet the pad is disabled so it can't accept\n ink prematurely. */}\n <SignatureCapture\n ref={signatureRef}\n ariaLabel={t('signDocument.signatureSection')}\n disabled={disabled || !readComplete}\n onStart={() => setHasSignature(true)}\n onClear={() => setHasSignature(false)}\n onConfirm={handleSigned}\n />\n\n {/* Native `disabled` (not aria-disabled) so a gated Confirm\n leaves the tab order entirely — mirrors how Button gates a\n primary action. describedby names WHY it's unavailable. */}\n <button\n type=\"button\"\n onClick={() => {\n if (confirmDisabled) return;\n void confirm();\n }}\n disabled={confirmDisabled}\n aria-describedby={gateHintId}\n className={confirmButtonVariants()}\n data-testid=\"sign-document-confirm\"\n >\n <CheckCircle2 aria-hidden=\"true\" className=\"ds:size-4\" />\n {t('signDocument.confirm')}\n </button>\n </div>\n )}\n </div>\n );\n },\n);\n\nSignDocument.displayName = 'SignDocument';\n\nexport { rootVariants as signDocumentRootVariants };\n"],"names":["signDocumentAgent","handle","rootVariants","cva","headingVariants","signSectionVariants","sectionLabelVariants","progressVariants","hintVariants","confirmButtonVariants","signedBannerVariants","attributionVariants","formatSignedAt","iso","locale","date","SignDocument","forwardRef","id","src","documentTitle","requireReadToEnd","onSign","onError","signedAt","signedByNote","disabled","readOnly","ariaLabel","className","ref","t","i18n","useTranslation","rawId","useId","idSafe","useMemo","docHeadingId","signLabelId","liveRegionId","gateHintId","signatureRef","useRef","numPages","setNumPages","useState","currentPage","setCurrentPage","reachedEnd","setReachedEnd","hasSignature","setHasSignature","isSigned","inert","onSignRef","onErrorRef","useEffect","handleLoadComplete","useCallback","info","handlePageChange","page","total","handleError","error","_a","signLive","tick","pad","interval","readComplete","confirmDisabled","handleSigned","payload","confirm","reset","agentHandle","useImperativeHandle","useAgentRegistration","regionLabel","documentRegionLabel","liveText","gateHintText","attributionText","jsxs","jsx","PDFViewer","CheckCircle2","SignatureCapture"],"mappings":"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"}
@@ -4,26 +4,16 @@ import * as m from "@radix-ui/react-accordion";
4
4
  import { c as v } from "./index-D2ZczOXr.js";
5
5
  import { useTranslation as B } from "react-i18next";
6
6
  import { C as D } from "./chevron-down-BX_NP2Yh.js";
7
- import { c as G } 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 H = [
15
- ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
16
- ["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
17
- ], U = G("lock", H);
18
- function W(a, c, r) {
7
+ import { L as G } from "./lock-CKOIn0IK.js";
8
+ function H(a, c, r) {
19
9
  return r === "error" ? "error" : a === c ? "current" : r === "completed" || a < c ? "completed" : "upcoming";
20
10
  }
21
- const k = "step-", y = (a) => `${k}${a}`, O = (a) => Number(a.slice(k.length)), p = [
11
+ const k = "step-", y = (a) => `${k}${a}`, U = (a) => Number(a.slice(k.length)), p = [
22
12
  "ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]",
23
13
  "ds:animate-[stepper-icon-draw_var(--animation-duration)_var(--ease-out)_forwards]",
24
14
  "ds:motion-reduce:animate-none ds:motion-reduce:[stroke-dashoffset:0]"
25
15
  ].join(" ");
26
- function X() {
16
+ function W() {
27
17
  return /* @__PURE__ */ e(
28
18
  "svg",
29
19
  {
@@ -39,7 +29,7 @@ function X() {
39
29
  }
40
30
  );
41
31
  }
42
- function q() {
32
+ function O() {
43
33
  return /* @__PURE__ */ i(
44
34
  "svg",
45
35
  {
@@ -58,7 +48,7 @@ function q() {
58
48
  }
59
49
  );
60
50
  }
61
- const J = [
51
+ const X = [
62
52
  "ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center",
63
53
  "ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]",
64
54
  "ds:size-[var(--min-target-size)]",
@@ -68,7 +58,7 @@ const J = [
68
58
  "ds:transition-[background-color,border-color,color]",
69
59
  "ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]",
70
60
  "ds:motion-reduce:transition-none"
71
- ].join(" "), K = v(J, {
61
+ ].join(" "), q = v(X, {
72
62
  variants: {
73
63
  state: {
74
64
  upcoming: "ds:bg-[var(--background)] ds:text-[var(--muted-foreground)]",
@@ -85,7 +75,7 @@ const J = [
85
75
  ].join(" ")
86
76
  }
87
77
  }
88
- }), Q = v(
78
+ }), J = v(
89
79
  [
90
80
  "ds:group/item ds:overflow-hidden ds:rounded-[var(--radius-md)]",
91
81
  "ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:bg-[var(--card)]",
@@ -102,7 +92,7 @@ const J = [
102
92
  },
103
93
  defaultVariants: { tone: "neutral" }
104
94
  }
105
- ), Y = [
95
+ ), K = [
106
96
  "ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-sm)]",
107
97
  "ds:min-h-[var(--min-target-size)]",
108
98
  "ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]",
@@ -114,48 +104,48 @@ const J = [
114
104
  "ds:transition-[background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]",
115
105
  "ds:motion-reduce:transition-none",
116
106
  "ds:hover:enabled:bg-[var(--muted)]/40"
117
- ].join(" "), Z = (a) => [
107
+ ].join(" "), Q = (a) => [
118
108
  "type-body-sm",
119
109
  a === "current" || a === "error" ? "ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]" : a === "completed" ? "ds:text-[var(--foreground)]" : "ds:text-[var(--muted-foreground)]"
120
- ].join(" "), S = [
110
+ ].join(" "), Y = [
121
111
  "type-meta ds:text-[var(--muted-foreground)]",
122
112
  "ds:mt-[var(--spacing-xs)]"
123
113
  ].join(" "), N = [
124
114
  "type-meta",
125
115
  "ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]",
126
116
  "ds:text-[var(--muted-foreground)]"
127
- ].join(" "), ee = [
117
+ ].join(" "), Z = [
128
118
  "ds:size-4 ds:shrink-0 ds:text-[var(--muted-foreground)]",
129
119
  "ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]",
130
120
  "ds:motion-reduce:transition-none",
131
121
  "ds:group-data-[state=open]/item:rotate-180"
132
- ].join(" "), re = [
122
+ ].join(" "), S = [
133
123
  "type-meta ds:text-[var(--muted-foreground)]",
134
124
  "ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
135
125
  "ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]",
136
126
  "ds:group-data-[state=open]/item:hidden"
137
- ].join(" "), se = [
127
+ ].join(" "), ee = [
138
128
  "ds:overflow-hidden",
139
129
  "ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]",
140
130
  "ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]"
141
- ].join(" "), ae = [
131
+ ].join(" "), re = [
142
132
  "ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]",
143
133
  "ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]"
144
- ].join(" "), te = v("ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", {
134
+ ].join(" "), se = v("ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]", {
145
135
  variants: {}
146
- }), ne = E(
136
+ }), ae = E(
147
137
  ({
148
138
  activeStep: a,
149
139
  steps: c,
150
140
  onStepChange: r,
151
- "aria-label": w,
141
+ "aria-label": j,
152
142
  id: f,
153
- className: j,
143
+ className: w,
154
144
  ..._
155
145
  }, C) => {
156
- const { t: d } = B(), l = c.length, o = Math.max(0, Math.min(a, l - 1)), z = w ?? d("navigation.stepper.label"), g = d("navigation.stepper.edit"), L = d("navigation.stepper.locked"), M = d("navigation.stepper.completed"), V = d("navigation.stepper.error"), A = (t) => {
146
+ const { t: d } = B(), l = c.length, o = Math.max(0, Math.min(a, l - 1)), z = j ?? d("navigation.stepper.label"), g = d("navigation.stepper.edit"), L = d("navigation.stepper.locked"), M = d("navigation.stepper.completed"), V = d("navigation.stepper.error"), A = (t) => {
157
147
  if (!t) return;
158
- const s = O(t);
148
+ const s = U(t);
159
149
  Number.isFinite(s) && s !== o && (r == null || r(s));
160
150
  }, h = P(
161
151
  () => ({
@@ -187,17 +177,17 @@ const J = [
187
177
  id: f,
188
178
  "data-component": "stepper-accordion",
189
179
  "data-component-id": f,
190
- className: te({ className: j }),
180
+ className: se({ className: w }),
191
181
  ..._,
192
182
  children: c.map((t, s) => {
193
- const n = W(s, o, t.status), u = n === "current" || n === "error", F = n === "upcoming", I = n === "error" ? "error" : "neutral", b = d("navigation.stepper.stepN", { n: s + 1 }), T = n === "completed" ? /* @__PURE__ */ i(x, { children: [
194
- /* @__PURE__ */ e(X, {}),
183
+ const n = H(s, o, t.status), u = n === "current" || n === "error", F = n === "upcoming", T = n === "error" ? "error" : "neutral", b = d("navigation.stepper.stepN", { n: s + 1 }), I = n === "completed" ? /* @__PURE__ */ i(x, { children: [
184
+ /* @__PURE__ */ e(W, {}),
195
185
  /* @__PURE__ */ e("span", { className: "ds:sr-only", children: M })
196
186
  ] }) : n === "error" ? /* @__PURE__ */ i(x, { children: [
197
- /* @__PURE__ */ e(q, {}),
187
+ /* @__PURE__ */ e(O, {}),
198
188
  /* @__PURE__ */ e("span", { className: "ds:sr-only", children: V })
199
189
  ] }) : /* @__PURE__ */ e("span", { children: s + 1 }), $ = n === "completed" ? /* @__PURE__ */ e("span", { className: N, children: g }) : n === "upcoming" ? /* @__PURE__ */ i("span", { className: N, children: [
200
- /* @__PURE__ */ e(U, { "aria-hidden": "true", className: "ds:size-3" }),
190
+ /* @__PURE__ */ e(G, { "aria-hidden": "true", className: "ds:size-3" }),
201
191
  L
202
192
  ] }) : null;
203
193
  return /* @__PURE__ */ i(
@@ -205,7 +195,7 @@ const J = [
205
195
  {
206
196
  value: y(s),
207
197
  "data-step-id": String(s),
208
- className: Q({ tone: I }),
198
+ className: J({ tone: T }),
209
199
  children: [
210
200
  /* @__PURE__ */ e(m.Header, { className: "ds:flex", children: /* @__PURE__ */ i(
211
201
  m.Trigger,
@@ -214,33 +204,33 @@ const J = [
214
204
  "aria-disabled": u || void 0,
215
205
  "aria-label": n === "completed" ? `${b}, ${g}` : b,
216
206
  "aria-current": u ? "step" : void 0,
217
- className: Y,
207
+ className: K,
218
208
  children: [
219
209
  /* @__PURE__ */ e(
220
210
  "span",
221
211
  {
222
212
  "aria-hidden": "true",
223
- className: K({ state: n }),
224
- children: T
213
+ className: q({ state: n }),
214
+ children: I
225
215
  }
226
216
  ),
227
217
  /* @__PURE__ */ i("span", { className: "ds:flex ds:min-w-0 ds:flex-1 ds:flex-col", children: [
228
- /* @__PURE__ */ e("span", { className: Z(n), children: t.label }),
229
- t.description ? /* @__PURE__ */ e("span", { className: S, children: t.description }) : null
218
+ /* @__PURE__ */ e("span", { className: Q(n), children: t.label }),
219
+ t.description ? /* @__PURE__ */ e("span", { className: Y, children: t.description }) : null
230
220
  ] }),
231
221
  $,
232
222
  u ? null : /* @__PURE__ */ e(
233
223
  D,
234
224
  {
235
225
  "aria-hidden": "true",
236
- className: ee
226
+ className: Z
237
227
  }
238
228
  )
239
229
  ]
240
230
  }
241
231
  ) }),
242
- t.summary && n === "completed" ? /* @__PURE__ */ e("div", { className: re, children: t.summary }) : null,
243
- /* @__PURE__ */ e(m.Content, { className: se, children: /* @__PURE__ */ e("div", { className: ae, children: t.content }) })
232
+ t.summary && n === "completed" ? /* @__PURE__ */ e("div", { className: S, children: t.summary }) : null,
233
+ /* @__PURE__ */ e(m.Content, { className: ee, children: /* @__PURE__ */ e("div", { className: re, children: t.content }) })
244
234
  ]
245
235
  },
246
236
  s
@@ -250,8 +240,8 @@ const J = [
250
240
  );
251
241
  }
252
242
  );
253
- ne.displayName = "StepperAccordion";
243
+ ae.displayName = "StepperAccordion";
254
244
  export {
255
- ne as S
245
+ ae as S
256
246
  };
257
- //# sourceMappingURL=stepper-accordion-Dki6r9ZE.js.map
247
+ //# sourceMappingURL=stepper-accordion-DC-H-8v4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-accordion-DC-H-8v4.js","sources":["../../src/components/_shared/stepper.ts","../../src/components/stepper-accordion/stepper-accordion.tsx"],"sourcesContent":["// Shared types + state machine for the two stepper variants:\n// - src/components/stepper-progress (lightweight progress bar + caption)\n// - src/components/stepper-accordion (vertical disclosure wizard)\n//\n// Both components consume `StepSpec` and the `stateForStep` helper so the\n// four-state machine (upcoming | current | completed | error) stays in one\n// place. Rename or removal is a MAJOR per src/docs/13-maintainability.mdx.\n\nexport type StepStatus = 'completed' | 'error';\n\nexport type StepState = 'upcoming' | 'current' | 'completed' | 'error';\n\nexport interface StepSpec {\n /** Visible step label — comes from the consumer, already translated. */\n label: string;\n /** Optional secondary line (kept short; shown in accordion + progress captions). */\n description?: string;\n /**\n * Consumer-explicit status override. `error` always wins; `completed` is\n * honoured only for steps at or beyond the active index so the active step\n * always keeps `current` (otherwise a consumer pre-setting `completed` on\n * every step would silently mask the current position).\n */\n status?: StepStatus;\n}\n\nexport function stateForStep(\n index: number,\n activeStep: number,\n status?: StepStatus,\n): StepState {\n if (status === 'error') return 'error';\n if (index === activeStep) return 'current';\n if (status === 'completed') return 'completed';\n if (index < activeStep) return 'completed';\n return 'upcoming';\n}\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n stateForStep,\n type StepSpec,\n type StepState,\n} from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperAccordion */\n/* */\n/* Vertical disclosure wizard. The current step is expanded inline; */\n/* completed steps collapse to a one-line summary with an \"Edit\" hint */\n/* that re-opens them; upcoming steps are locked. Built on Radix */\n/* Accordion in controlled-single mode with collapsible=false so the */\n/* current panel always stays open. */\n/* -------------------------------------------------------------------- */\n\nconst STEP_VALUE_PREFIX = 'step-';\nconst makeValue = (index: number) => `${STEP_VALUE_PREFIX}${index}`;\nconst indexFromValue = (value: string): number =>\n Number(value.slice(STEP_VALUE_PREFIX.length));\n\n/* -------------------------------------------------------------------- */\n/* Indicator — shared with progress bar visual tone but sized for the */\n/* vertical wizard's dense header row. */\n/* -------------------------------------------------------------------- */\n\nconst iconDrawClasses = [\n 'ds:[stroke-dasharray:1] ds:[stroke-dashoffset:1]',\n 'ds:animate-[stepper-icon-draw_var(--animation-duration)_var(--ease-out)_forwards]',\n 'ds:motion-reduce:animate-none ds:motion-reduce:[stroke-dashoffset:0]',\n].join(' ');\n\nfunction CheckGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nfunction CrossGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M6 6l12 12\" className={iconDrawClasses} />\n <path pathLength=\"1\" d=\"M18 6l-12 12\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nconst indicatorClasses = [\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:size-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:text-[var(--font-size-sm)] ds:font-[var(--font-weight-semibold)]',\n 'ds:border ds:border-[var(--border)]',\n 'ds:transition-[background-color,border-color,color]',\n 'ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n].join(' ');\n\nconst indicatorVariants = cva(indicatorClasses, {\n variants: {\n state: {\n upcoming: 'ds:bg-[var(--background)] ds:text-[var(--muted-foreground)]',\n current: [\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n completed:\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n error: [\n 'ds:border-[var(--destructive)] ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n },\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Item / trigger / content variants */\n/* -------------------------------------------------------------------- */\n\nconst itemVariants = cva(\n [\n 'ds:group/item ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2 ds:bg-[var(--card)]',\n 'ds:data-[state=open]:border-[var(--primary)]',\n 'ds:transition-[border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n neutral: '',\n error: 'ds:data-[state=open]:border-[var(--destructive)]',\n },\n },\n defaultVariants: { tone: 'neutral' },\n },\n);\n\nconst triggerClasses = [\n 'ds:flex ds:w-full ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:text-start',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed',\n 'ds:transition-[background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n].join(' ');\n\nconst labelClasses = (state: StepState) =>\n [\n 'type-body-sm',\n state === 'current' || state === 'error'\n ? 'ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]'\n : state === 'completed'\n ? 'ds:text-[var(--foreground)]'\n : 'ds:text-[var(--muted-foreground)]',\n ].join(' ');\n\nconst descriptionClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:mt-[var(--spacing-xs)]',\n].join(' ');\n\nconst hintClasses = [\n 'type-meta',\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:text-[var(--muted-foreground)]',\n].join(' ');\n\nconst chevronClasses = [\n 'ds:size-4 ds:shrink-0 ds:text-[var(--muted-foreground)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:group-data-[state=open]/item:rotate-180',\n].join(' ');\n\nconst summaryClasses = [\n 'type-meta ds:text-[var(--muted-foreground)]',\n 'ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-sm)]',\n 'ds:group-data-[state=open]/item:hidden',\n].join(' ');\n\nconst contentClasses = [\n 'ds:overflow-hidden',\n 'ds:data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]',\n 'ds:data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]',\n].join(' ');\n\nconst contentInnerClasses = [\n 'ds:ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-md)]',\n].join(' ');\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface AccordionStepSpec extends StepSpec {\n /** Form content rendered inside the expanded panel. */\n content: ReactNode;\n /**\n * One-line summary shown under the header when the step is completed\n * and its panel is collapsed. Typically a preview of the captured\n * data — \"Mario Rossi · 12/03/1985\".\n */\n summary?: ReactNode;\n}\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]', {\n variants: {},\n});\n\nexport interface StepperAccordionProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n 'type' | 'value' | 'defaultValue' | 'onValueChange' | 'collapsible'\n >,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). The matching panel is the one that is open. */\n activeStep: number;\n /** Step specs — each one provides its own content + optional summary. */\n steps: AccordionStepSpec[];\n /**\n * Fires when the user re-opens a completed step. Upcoming steps cannot\n * be activated — their triggers are disabled. The current step cannot\n * be collapsed (Radix `collapsible=false`).\n */\n onStepChange?: (index: number) => void;\n /** Override the default `aria-label` on the list wrapper. */\n 'aria-label'?: string;\n /**\n * Consumer-supplied instance id, surfaced as `data-component-id` so an\n * agent / UI bridge can address this instance.\n */\n id?: string;\n}\n\n/**\n * Imperative handle for agent-readiness. Routes state mutations through\n * the consumer's `onStepChange`, never mutating directly.\n */\nexport interface StepperAccordionHandle {\n getCurrentStep: () => number;\n getTotalSteps: () => number;\n /** Indices of currently-open panels — singleton under Radix `type=\"single\"`. */\n getOpenSteps: () => number[];\n gotoStep: (step: number) => void;\n next: () => void;\n previous: () => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperAccordion = forwardRef<\n StepperAccordionHandle,\n StepperAccordionProps\n>(\n (\n {\n activeStep,\n steps,\n onStepChange,\n 'aria-label': ariaLabel,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const label = ariaLabel ?? t('navigation.stepper.label');\n const editCopy = t('navigation.stepper.edit');\n const lockedCopy = t('navigation.stepper.locked');\n const completedCopy = t('navigation.stepper.completed');\n const errorCopy = t('navigation.stepper.error');\n\n const handleValueChange = (value: string) => {\n // `collapsible=false` prevents empty-string values in practice, but the\n // primitive's type still allows one — guard anyway.\n if (!value) return;\n const index = indexFromValue(value);\n if (Number.isFinite(index) && index !== clampedActive) {\n onStepChange?.(index);\n }\n };\n\n const handle = useMemo<StepperAccordionHandle>(\n () => ({\n getCurrentStep: () => clampedActive,\n getTotalSteps: () => total,\n getOpenSteps: () => [clampedActive],\n gotoStep: (step: number) => {\n if (!onStepChange) return;\n const clamped = Math.max(0, Math.min(step, Math.max(total - 1, 0)));\n if (clamped !== clampedActive) onStepChange(clamped);\n },\n next: () => {\n if (!onStepChange) return;\n if (clampedActive < total - 1) onStepChange(clampedActive + 1);\n },\n previous: () => {\n if (!onStepChange) return;\n if (clampedActive > 0) onStepChange(clampedActive - 1);\n },\n }),\n [clampedActive, total, onStepChange],\n );\n useImperativeHandle(ref, () => handle, [handle]);\n\n return (\n <AccordionPrimitive.Root\n type=\"single\"\n value={makeValue(clampedActive)}\n onValueChange={handleValueChange}\n collapsible={false}\n aria-label={label}\n id={id}\n data-component=\"stepper-accordion\"\n data-component-id={id}\n className={rootVariants({ className })}\n {...rest}\n >\n {steps.map((spec, index) => {\n const state = stateForStep(index, clampedActive, spec.status);\n const isCurrent = state === 'current' || state === 'error';\n const isUpcoming = state === 'upcoming';\n const itemTone = state === 'error' ? 'error' : 'neutral';\n const stepN = t('navigation.stepper.stepN', { n: index + 1 });\n\n const indicatorContent = (() => {\n if (state === 'completed') {\n return (\n <>\n <CheckGlyph />\n <span className=\"ds:sr-only\">{completedCopy}</span>\n </>\n );\n }\n if (state === 'error') {\n return (\n <>\n <CrossGlyph />\n <span className=\"ds:sr-only\">{errorCopy}</span>\n </>\n );\n }\n return <span>{index + 1}</span>;\n })();\n\n const hint = (() => {\n if (state === 'completed') {\n return <span className={hintClasses}>{editCopy}</span>;\n }\n if (state === 'upcoming') {\n return (\n <span className={hintClasses}>\n <Lock aria-hidden=\"true\" className=\"ds:size-3\" />\n {lockedCopy}\n </span>\n );\n }\n return null;\n })();\n\n return (\n <AccordionPrimitive.Item\n key={index}\n value={makeValue(index)}\n data-step-id={String(index)}\n className={itemVariants({ tone: itemTone })}\n >\n <AccordionPrimitive.Header className=\"ds:flex\">\n <AccordionPrimitive.Trigger\n // Upcoming steps are *HTML*-disabled — they must not be\n // reachable by Tab or by Radix's arrow-key navigation ring\n // (Radix filters `item.ref.current?.disabled`, which is\n // the HTML attribute). Current is only *ARIA*-disabled so\n // keyboard users can Tab to it as a heading anchor and\n // hear \"current step\"; Radix's `collapsible=false` makes\n // the click a no-op regardless. Setting `disabled` at the\n // Trigger rather than the Item because `...triggerProps`\n // spreads after Collapsible writes its own `disabled`\n // from context, so the Item-level disabled gets overridden.\n disabled={isUpcoming}\n aria-disabled={isCurrent || undefined}\n aria-label={\n state === 'completed' ? `${stepN}, ${editCopy}` : stepN\n }\n aria-current={isCurrent ? 'step' : undefined}\n className={triggerClasses}\n >\n <span\n aria-hidden=\"true\"\n className={indicatorVariants({ state })}\n >\n {indicatorContent}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className={labelClasses(state)}>{spec.label}</span>\n {spec.description ? (\n <span className={descriptionClasses}>\n {spec.description}\n </span>\n ) : null}\n </span>\n {hint}\n {isCurrent ? null : (\n <ChevronDown\n aria-hidden=\"true\"\n className={chevronClasses}\n />\n )}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n {spec.summary && state === 'completed' ? (\n <div className={summaryClasses}>{spec.summary}</div>\n ) : null}\n <AccordionPrimitive.Content className={contentClasses}>\n <div className={contentInnerClasses}>{spec.content}</div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n );\n })}\n </AccordionPrimitive.Root>\n );\n },\n);\nStepperAccordion.displayName = 'StepperAccordion';\n\nexport { StepperAccordion };\n"],"names":["stateForStep","index","activeStep","status","STEP_VALUE_PREFIX","makeValue","indexFromValue","value","iconDrawClasses","CheckGlyph","jsx","CrossGlyph","jsxs","indicatorClasses","indicatorVariants","cva","itemVariants","triggerClasses","labelClasses","state","descriptionClasses","hintClasses","chevronClasses","summaryClasses","contentClasses","contentInnerClasses","rootVariants","StepperAccordion","forwardRef","steps","onStepChange","ariaLabel","id","className","rest","ref","t","useTranslation","total","clampedActive","label","editCopy","lockedCopy","completedCopy","errorCopy","handleValueChange","handle","useMemo","step","clamped","useImperativeHandle","AccordionPrimitive","spec","isCurrent","isUpcoming","itemTone","stepN","indicatorContent","Fragment","hint","Lock","ChevronDown"],"mappings":"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"}