@alfadocs/ui-kit-debug 1.56.0 → 1.57.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 (357) hide show
  1. package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js → ai-credits-notice-ktklr8fy.js} +2 -2
  2. package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js.map → ai-credits-notice-ktklr8fy.js.map} +1 -1
  3. package/dist/_chunks/ai-permission-notice-DyuEGwAt.js +206 -0
  4. package/dist/_chunks/ai-permission-notice-DyuEGwAt.js.map +1 -0
  5. package/dist/_chunks/alia-sidebar-BBKBJCv6.js +1284 -0
  6. package/dist/_chunks/alia-sidebar-BBKBJCv6.js.map +1 -0
  7. package/dist/_chunks/{anamnesis-summary-rows-CQ-XGr0T.js → anamnesis-summary-rows-CCQ62mMN.js} +4 -4
  8. package/dist/_chunks/{anamnesis-summary-rows-CQ-XGr0T.js.map → anamnesis-summary-rows-CCQ62mMN.js.map} +1 -1
  9. package/dist/_chunks/{appointment-peek-BIZaDeCi.js → appointment-peek-WvNbE4JG.js} +2 -2
  10. package/dist/_chunks/{appointment-peek-BIZaDeCi.js.map → appointment-peek-WvNbE4JG.js.map} +1 -1
  11. package/dist/_chunks/{appointment-timeline-DmqYEIT9.js → appointment-timeline-Z0494xO-.js} +2 -2
  12. package/dist/_chunks/{appointment-timeline-DmqYEIT9.js.map → appointment-timeline-Z0494xO-.js.map} +1 -1
  13. package/dist/_chunks/{balance-badge-cell-DmDcXw0c.js → balance-badge-cell-CII3SDmR.js} +3 -3
  14. package/dist/_chunks/{balance-badge-cell-DmDcXw0c.js.map → balance-badge-cell-CII3SDmR.js.map} +1 -1
  15. package/dist/_chunks/{booking-WyNGKPE2.js → booking-81WnKDsH.js} +3 -3
  16. package/dist/_chunks/{booking-WyNGKPE2.js.map → booking-81WnKDsH.js.map} +1 -1
  17. package/dist/_chunks/{calculator-dialog-pCPWta7h.js → calculator-dialog-CzQv03p0.js} +2 -2
  18. package/dist/_chunks/{calculator-dialog-pCPWta7h.js.map → calculator-dialog-CzQv03p0.js.map} +1 -1
  19. package/dist/_chunks/{calendar-workspace-Du2ryaI-.js → calendar-workspace-D5-k_9zE.js} +13 -13
  20. package/dist/_chunks/{calendar-workspace-Du2ryaI-.js.map → calendar-workspace-D5-k_9zE.js.map} +1 -1
  21. package/dist/_chunks/{care-plan-card-Ddjh5Doc.js → care-plan-card-DxrRLRdW.js} +2 -2
  22. package/dist/_chunks/{care-plan-card-Ddjh5Doc.js.map → care-plan-card-DxrRLRdW.js.map} +1 -1
  23. package/dist/_chunks/{care-plan-header-DUX_SVvF.js → care-plan-header-BMwZIgHJ.js} +2 -2
  24. package/dist/_chunks/{care-plan-header-DUX_SVvF.js.map → care-plan-header-BMwZIgHJ.js.map} +1 -1
  25. package/dist/_chunks/{chart-HsF1KHbx.js → chart-DQ5GxqgT.js} +347 -350
  26. package/dist/_chunks/chart-DQ5GxqgT.js.map +1 -0
  27. package/dist/_chunks/{clinical-note-card-14JIoUR0.js → clinical-note-card-hx939bvw.js} +2 -2
  28. package/dist/_chunks/{clinical-note-card-14JIoUR0.js.map → clinical-note-card-hx939bvw.js.map} +1 -1
  29. package/dist/_chunks/{color-picker-BRQ4Y9SO.js → color-picker-BsggJovx.js} +128 -123
  30. package/dist/_chunks/color-picker-BsggJovx.js.map +1 -0
  31. package/dist/_chunks/{contact-card-CmK05vNb.js → contact-card-fHBMwEsx.js} +2 -2
  32. package/dist/_chunks/{contact-card-CmK05vNb.js.map → contact-card-fHBMwEsx.js.map} +1 -1
  33. package/dist/_chunks/{contact-profile-card-Ci8lBQ6a.js → contact-profile-card-CMyBYgRR.js} +2 -2
  34. package/dist/_chunks/{contact-profile-card-Ci8lBQ6a.js.map → contact-profile-card-CMyBYgRR.js.map} +1 -1
  35. package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js → cycle-calculator-Cww9DzIa.js} +2 -2
  36. package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js.map → cycle-calculator-Cww9DzIa.js.map} +1 -1
  37. package/dist/_chunks/{data-table-D8fuhqO1.js → data-table-fAMTeAjM.js} +2 -2
  38. package/dist/_chunks/{data-table-D8fuhqO1.js.map → data-table-fAMTeAjM.js.map} +1 -1
  39. package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js → data-table-tabs-CHYAAeHy.js} +2 -2
  40. package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js.map → data-table-tabs-CHYAAeHy.js.map} +1 -1
  41. package/dist/_chunks/{date-picker-wRAcq2lt.js → date-picker-BSZuKo13.js} +69 -62
  42. package/dist/_chunks/date-picker-BSZuKo13.js.map +1 -0
  43. package/dist/_chunks/{date-range-picker-CtUOI38x.js → date-range-picker-CFk-5O3R.js} +176 -171
  44. package/dist/_chunks/date-range-picker-CFk-5O3R.js.map +1 -0
  45. package/dist/_chunks/{date-time-picker-CLeLKuv9.js → date-time-picker-CjxTkblD.js} +92 -85
  46. package/dist/_chunks/date-time-picker-CjxTkblD.js.map +1 -0
  47. package/dist/_chunks/{dialog-CUzbnKLw.js → dialog-Dn-iQ0Jp.js} +2 -2
  48. package/dist/_chunks/{dialog-CUzbnKLw.js.map → dialog-Dn-iQ0Jp.js.map} +1 -1
  49. package/dist/_chunks/{document-preview-uoTekVR7.js → document-preview-CHGGG0l_.js} +2 -2
  50. package/dist/_chunks/{document-preview-uoTekVR7.js.map → document-preview-CHGGG0l_.js.map} +1 -1
  51. package/dist/_chunks/{due-date-calculator-CSjklbyw.js → due-date-calculator-D_qFUiHp.js} +2 -2
  52. package/dist/_chunks/{due-date-calculator-CSjklbyw.js.map → due-date-calculator-D_qFUiHp.js.map} +1 -1
  53. package/dist/_chunks/{entity-summary-DcB0fIiv.js → entity-summary-CWcCSThK.js} +2 -2
  54. package/dist/_chunks/{entity-summary-DcB0fIiv.js.map → entity-summary-CWcCSThK.js.map} +1 -1
  55. package/dist/_chunks/{file-manager-Cc_uO8r2.js → file-manager-CFsL1KVt.js} +3 -3
  56. package/dist/_chunks/{file-manager-Cc_uO8r2.js.map → file-manager-CFsL1KVt.js.map} +1 -1
  57. package/dist/_chunks/{gestational-age-calculator-DqVeJke2.js → gestational-age-calculator-CZi43xKG.js} +2 -2
  58. package/dist/_chunks/{gestational-age-calculator-DqVeJke2.js.map → gestational-age-calculator-CZi43xKG.js.map} +1 -1
  59. package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js → hcg-doubling-Ccvh7OaU.js} +2 -2
  60. package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js.map → hcg-doubling-Ccvh7OaU.js.map} +1 -1
  61. package/dist/_chunks/{header-settings-ge_3gYEq.js → header-settings-BMcCx2LC.js} +2 -2
  62. package/dist/_chunks/{header-settings-ge_3gYEq.js.map → header-settings-BMcCx2LC.js.map} +1 -1
  63. package/dist/_chunks/{heatmap-Gf9r7Tn1.js → heatmap-BEeOThkW.js} +2 -2
  64. package/dist/_chunks/{heatmap-Gf9r7Tn1.js.map → heatmap-BEeOThkW.js.map} +1 -1
  65. package/dist/_chunks/{help-me-write-templates-fV-Apf72.js → help-me-write-templates-BUoYGo6f.js} +2 -2
  66. package/dist/_chunks/{help-me-write-templates-fV-Apf72.js.map → help-me-write-templates-BUoYGo6f.js.map} +1 -1
  67. package/dist/_chunks/{hover-card-BnTueNS2.js → hover-card-U_ZYoh1n.js} +201 -187
  68. package/dist/_chunks/hover-card-U_ZYoh1n.js.map +1 -0
  69. package/dist/_chunks/{icon-picker-DWrqmI1c.js → icon-picker-C86lQTIA.js} +2 -2
  70. package/dist/_chunks/{icon-picker-DWrqmI1c.js.map → icon-picker-C86lQTIA.js.map} +1 -1
  71. package/dist/_chunks/{info-tip-B0jmIt6M.js → info-tip-CJpNpzZe.js} +2 -2
  72. package/dist/_chunks/{info-tip-B0jmIt6M.js.map → info-tip-CJpNpzZe.js.map} +1 -1
  73. package/dist/_chunks/{kit-extensions-Byfxy6sy.js → kit-extensions-DYVxWcqv.js} +4 -4
  74. package/dist/_chunks/{kit-extensions-Byfxy6sy.js.map → kit-extensions-DYVxWcqv.js.map} +1 -1
  75. package/dist/_chunks/{link-cell-renderer-TeJNvymP.js → link-cell-renderer-CxW_oLa5.js} +2 -2
  76. package/dist/_chunks/{link-cell-renderer-TeJNvymP.js.map → link-cell-renderer-CxW_oLa5.js.map} +1 -1
  77. package/dist/_chunks/link-gRw3NtOt.js +137 -0
  78. package/dist/_chunks/link-gRw3NtOt.js.map +1 -0
  79. package/dist/_chunks/{locale-picker-DfNSdOpy.js → locale-picker-BGfrZyTw.js} +2 -2
  80. package/dist/_chunks/{locale-picker-DfNSdOpy.js.map → locale-picker-BGfrZyTw.js.map} +1 -1
  81. package/dist/_chunks/{marketplace-app-shell-Dcx-JEjg.js → marketplace-app-shell-BZcA9Z06.js} +143 -129
  82. package/dist/_chunks/marketplace-app-shell-BZcA9Z06.js.map +1 -0
  83. package/dist/_chunks/{message-tray-BB95DA82.js → message-tray-QKQutwxj.js} +76 -69
  84. package/dist/_chunks/message-tray-QKQutwxj.js.map +1 -0
  85. package/dist/_chunks/{nav-grid-BqCPH8sm.js → nav-grid-Byx8PxuB.js} +2 -2
  86. package/dist/_chunks/{nav-grid-BqCPH8sm.js.map → nav-grid-Byx8PxuB.js.map} +1 -1
  87. package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js +89 -0
  88. package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js.map +1 -0
  89. package/dist/_chunks/{note-attachment-I1NLoeRZ.js → note-attachment-Bt2cddsZ.js} +2 -2
  90. package/dist/_chunks/{note-attachment-I1NLoeRZ.js.map → note-attachment-Bt2cddsZ.js.map} +1 -1
  91. package/dist/_chunks/{note-timeline-CsY8YOE7.js → note-timeline-CX9nAgAR.js} +2 -2
  92. package/dist/_chunks/{note-timeline-CsY8YOE7.js.map → note-timeline-CX9nAgAR.js.map} +1 -1
  93. package/dist/_chunks/{notes-panel-DceRhthG.js → notes-panel-Cm4pttpl.js} +4 -4
  94. package/dist/_chunks/{notes-panel-DceRhthG.js.map → notes-panel-Cm4pttpl.js.map} +1 -1
  95. package/dist/_chunks/{notification-tray-__sJXnsz.js → notification-tray-C5VtbGjd.js} +83 -76
  96. package/dist/_chunks/notification-tray-C5VtbGjd.js.map +1 -0
  97. package/dist/_chunks/{patient-details-DsTtjpuX.js → patient-details-99kEdtc5.js} +2 -2
  98. package/dist/_chunks/{patient-details-DsTtjpuX.js.map → patient-details-99kEdtc5.js.map} +1 -1
  99. package/dist/_chunks/{patient-field-row-BvZ9luz-.js → patient-field-row-DkxY13T6.js} +5 -5
  100. package/dist/_chunks/{patient-field-row-BvZ9luz-.js.map → patient-field-row-DkxY13T6.js.map} +1 -1
  101. package/dist/_chunks/{patient-summary-card-9nQWTQf6.js → patient-summary-card-opdyfeW2.js} +4 -4
  102. package/dist/_chunks/{patient-summary-card-9nQWTQf6.js.map → patient-summary-card-opdyfeW2.js.map} +1 -1
  103. package/dist/_chunks/{payment-request-card-CwDpwXUC.js → payment-request-card-DAniJNLX.js} +2 -2
  104. package/dist/_chunks/{payment-request-card-CwDpwXUC.js.map → payment-request-card-DAniJNLX.js.map} +1 -1
  105. package/dist/_chunks/{pdf-viewer-C3minW5b.js → pdf-viewer-CNQxa4tv.js} +396 -391
  106. package/dist/_chunks/pdf-viewer-CNQxa4tv.js.map +1 -0
  107. package/dist/_chunks/{phone-input-DxkHMYmu.js → phone-input-O9camxkq.js} +156 -151
  108. package/dist/_chunks/phone-input-O9camxkq.js.map +1 -0
  109. package/dist/_chunks/popover-BG75rYjN.js +367 -0
  110. package/dist/_chunks/popover-BG75rYjN.js.map +1 -0
  111. package/dist/_chunks/{practice-results-Dhbo-fc_.js → practice-results-CfRkjzsI.js} +2 -2
  112. package/dist/_chunks/{practice-results-Dhbo-fc_.js.map → practice-results-CfRkjzsI.js.map} +1 -1
  113. package/dist/_chunks/{pregnancy-dating-Bfu0Cq4H.js → pregnancy-dating-BFzv9g1N.js} +2 -2
  114. package/dist/_chunks/{pregnancy-dating-Bfu0Cq4H.js.map → pregnancy-dating-BFzv9g1N.js.map} +1 -1
  115. package/dist/_chunks/{product-hub-panel-BSSiGGG4.js → product-hub-panel-DlVRK7Ue.js} +103 -96
  116. package/dist/_chunks/product-hub-panel-DlVRK7Ue.js.map +1 -0
  117. package/dist/_chunks/{public-footer-CxpG6J1M.js → public-footer-ZWTEG1Rq.js} +2 -2
  118. package/dist/_chunks/{public-footer-CxpG6J1M.js.map → public-footer-ZWTEG1Rq.js.map} +1 -1
  119. package/dist/_chunks/{public-header.agent-pr2hyiND.js → public-header.agent-BctevbuY.js} +2 -2
  120. package/dist/_chunks/{public-header.agent-pr2hyiND.js.map → public-header.agent-BctevbuY.js.map} +1 -1
  121. package/dist/_chunks/{radiograph-panel.agent-DkUokbEa.js → radiograph-panel.agent-DyqbTECc.js} +4 -4
  122. package/dist/_chunks/{radiograph-panel.agent-DkUokbEa.js.map → radiograph-panel.agent-DyqbTECc.js.map} +1 -1
  123. package/dist/_chunks/{registration-form-D7iNqMBF.js → registration-form-BlTzYywa.js} +2 -2
  124. package/dist/_chunks/{registration-form-D7iNqMBF.js.map → registration-form-BlTzYywa.js.map} +1 -1
  125. package/dist/_chunks/{rich-text-editor-CkFfmA3v.js → rich-text-editor-DTnNZ4Ff.js} +489 -484
  126. package/dist/_chunks/rich-text-editor-DTnNZ4Ff.js.map +1 -0
  127. package/dist/_chunks/{sheet-C7SwIxwB.js → sheet-8qsiMoUI.js} +2 -2
  128. package/dist/_chunks/{sheet-C7SwIxwB.js.map → sheet-8qsiMoUI.js.map} +1 -1
  129. package/dist/_chunks/{sign-document-B6HlyCGV.js → sign-document-D4iHS_Ug.js} +2 -2
  130. package/dist/_chunks/{sign-document-B6HlyCGV.js.map → sign-document-D4iHS_Ug.js.map} +1 -1
  131. package/dist/_chunks/{signature-request-DhbpB9N9.js → signature-request-DRuYAG5I.js} +2 -2
  132. package/dist/_chunks/{signature-request-DhbpB9N9.js.map → signature-request-DRuYAG5I.js.map} +1 -1
  133. package/dist/_chunks/{signed-out-frame-B2GTIeqA.js → signed-out-frame-AhMsNW1r.js} +2 -2
  134. package/dist/_chunks/{signed-out-frame-B2GTIeqA.js.map → signed-out-frame-AhMsNW1r.js.map} +1 -1
  135. package/dist/_chunks/{task-editor-ByyRu29Y.js → task-editor-NkcopDna.js} +3 -3
  136. package/dist/_chunks/{task-editor-ByyRu29Y.js.map → task-editor-NkcopDna.js.map} +1 -1
  137. package/dist/_chunks/{use-appointment-details-read-JsDM48tf.js → use-appointment-details-read-CfFQNOF_.js} +5 -5
  138. package/dist/_chunks/{use-appointment-details-read-JsDM48tf.js.map → use-appointment-details-read-CfFQNOF_.js.map} +1 -1
  139. package/dist/_chunks/{voice-control-panel-Bg1eklL0.js → voice-control-panel-BKbgb7FM.js} +2 -2
  140. package/dist/_chunks/{voice-control-panel-Bg1eklL0.js.map → voice-control-panel-BKbgb7FM.js.map} +1 -1
  141. package/dist/_chunks/{widget-picker-DXYBMTfe.js → widget-picker-rBA7MR5P.js} +2 -2
  142. package/dist/_chunks/{widget-picker-DXYBMTfe.js.map → widget-picker-rBA7MR5P.js.map} +1 -1
  143. package/dist/agent-catalog.json +2 -2
  144. package/dist/components/_shared/non-modal-tab-exit.d.ts +15 -4
  145. package/dist/components/_shared/non-modal-tab-exit.d.ts.map +1 -1
  146. package/dist/components/ai-credits-notice/index.js +1 -1
  147. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts +32 -0
  148. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts.map +1 -1
  149. package/dist/components/ai-permission-notice/index.d.ts +1 -1
  150. package/dist/components/ai-permission-notice/index.d.ts.map +1 -1
  151. package/dist/components/ai-permission-notice/index.js +1 -1
  152. package/dist/components/appointment-details-panel/index.js +1 -1
  153. package/dist/components/appointment-peek/index.js +1 -1
  154. package/dist/components/appointment-timeline/index.js +1 -1
  155. package/dist/components/booking/index.js +1 -1
  156. package/dist/components/calculator-dialog/index.js +1 -1
  157. package/dist/components/care-plan-card/index.js +1 -1
  158. package/dist/components/care-plan-header/index.js +1 -1
  159. package/dist/components/chart/chart.d.ts +5 -5
  160. package/dist/components/chart/chart.d.ts.map +1 -1
  161. package/dist/components/chart/index.js +1 -1
  162. package/dist/components/clinical-note-card/index.js +1 -1
  163. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  164. package/dist/components/color-picker/index.js +1 -1
  165. package/dist/components/contact-card/index.js +1 -1
  166. package/dist/components/contact-profile-card/index.js +1 -1
  167. package/dist/components/cycle-calculator/index.js +1 -1
  168. package/dist/components/data-table/index.js +2 -2
  169. package/dist/components/data-table-tabs/index.js +1 -1
  170. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  171. package/dist/components/date-picker/index.js +1 -1
  172. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  173. package/dist/components/date-range-picker/index.js +1 -1
  174. package/dist/components/date-time-picker/date-time-picker.d.ts.map +1 -1
  175. package/dist/components/date-time-picker/index.js +1 -1
  176. package/dist/components/dialog/index.js +1 -1
  177. package/dist/components/document-preview/index.js +1 -1
  178. package/dist/components/due-date-calculator/index.js +1 -1
  179. package/dist/components/entity-summary/index.js +1 -1
  180. package/dist/components/file-manager/index.js +1 -1
  181. package/dist/components/gestational-age-calculator/index.js +1 -1
  182. package/dist/components/hcg-doubling/index.js +1 -1
  183. package/dist/components/header-settings/index.js +1 -1
  184. package/dist/components/heatmap/index.js +1 -1
  185. package/dist/components/hover-card/hover-card.d.ts.map +1 -1
  186. package/dist/components/hover-card/index.js +1 -1
  187. package/dist/components/icon-picker/index.js +1 -1
  188. package/dist/components/info-tip/index.js +1 -1
  189. package/dist/components/link/index.js +1 -1
  190. package/dist/components/link/link.d.ts +5 -3
  191. package/dist/components/link/link.d.ts.map +1 -1
  192. package/dist/components/locale-picker/index.js +1 -1
  193. package/dist/components/message-tray/index.js +1 -1
  194. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  195. package/dist/components/nav-grid/index.js +1 -1
  196. package/dist/components/note-timeline/index.js +1 -1
  197. package/dist/components/notes-panel/index.js +1 -1
  198. package/dist/components/notification-tray/index.js +1 -1
  199. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  200. package/dist/components/patient-details/index.js +1 -1
  201. package/dist/components/patient-summary-card/index.js +1 -1
  202. package/dist/components/patient-table/index.js +1 -1
  203. package/dist/components/payment-card/index.js +1 -1
  204. package/dist/components/pdf-viewer/index.js +1 -1
  205. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  206. package/dist/components/phone-input/index.js +1 -1
  207. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  208. package/dist/components/popover/index.js +1 -1
  209. package/dist/components/popover/popover.d.ts +1 -1
  210. package/dist/components/popover/popover.d.ts.map +1 -1
  211. package/dist/components/practice-results/index.js +1 -1
  212. package/dist/components/pregnancy-dating/index.js +1 -1
  213. package/dist/components/product-hub-tray/index.js +1 -1
  214. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -1
  215. package/dist/components/public-footer/index.js +1 -1
  216. package/dist/components/public-header/index.js +1 -1
  217. package/dist/components/radiograph-panel/index.js +1 -1
  218. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  219. package/dist/components/rich-text-editor/index.js +2 -2
  220. package/dist/components/sheet/index.js +1 -1
  221. package/dist/components/sign-document/index.js +1 -1
  222. package/dist/components/task-editor/index.js +1 -1
  223. package/dist/components/voice-control-panel/index.js +1 -1
  224. package/dist/components/widget-picker/index.js +1 -1
  225. package/dist/i18n/locales/ar.d.ts +14 -0
  226. package/dist/i18n/locales/ar.d.ts.map +1 -1
  227. package/dist/i18n/locales/ar.js +15 -1
  228. package/dist/i18n/locales/ar.js.map +1 -1
  229. package/dist/i18n/locales/de.d.ts +14 -0
  230. package/dist/i18n/locales/de.d.ts.map +1 -1
  231. package/dist/i18n/locales/de.js +15 -1
  232. package/dist/i18n/locales/de.js.map +1 -1
  233. package/dist/i18n/locales/el.d.ts +14 -0
  234. package/dist/i18n/locales/el.d.ts.map +1 -1
  235. package/dist/i18n/locales/el.js +15 -1
  236. package/dist/i18n/locales/el.js.map +1 -1
  237. package/dist/i18n/locales/en.d.ts +14 -0
  238. package/dist/i18n/locales/en.d.ts.map +1 -1
  239. package/dist/i18n/locales/en.js +15 -1
  240. package/dist/i18n/locales/en.js.map +1 -1
  241. package/dist/i18n/locales/es.d.ts +14 -0
  242. package/dist/i18n/locales/es.d.ts.map +1 -1
  243. package/dist/i18n/locales/es.js +15 -1
  244. package/dist/i18n/locales/es.js.map +1 -1
  245. package/dist/i18n/locales/fr.d.ts +14 -0
  246. package/dist/i18n/locales/fr.d.ts.map +1 -1
  247. package/dist/i18n/locales/fr.js +15 -1
  248. package/dist/i18n/locales/fr.js.map +1 -1
  249. package/dist/i18n/locales/hi.d.ts +14 -0
  250. package/dist/i18n/locales/hi.d.ts.map +1 -1
  251. package/dist/i18n/locales/hi.js +15 -1
  252. package/dist/i18n/locales/hi.js.map +1 -1
  253. package/dist/i18n/locales/it.d.ts +14 -0
  254. package/dist/i18n/locales/it.d.ts.map +1 -1
  255. package/dist/i18n/locales/it.js +15 -1
  256. package/dist/i18n/locales/it.js.map +1 -1
  257. package/dist/i18n/locales/ja.d.ts +14 -0
  258. package/dist/i18n/locales/ja.d.ts.map +1 -1
  259. package/dist/i18n/locales/ja.js +15 -1
  260. package/dist/i18n/locales/ja.js.map +1 -1
  261. package/dist/i18n/locales/nl.d.ts +14 -0
  262. package/dist/i18n/locales/nl.d.ts.map +1 -1
  263. package/dist/i18n/locales/nl.js +15 -1
  264. package/dist/i18n/locales/nl.js.map +1 -1
  265. package/dist/i18n/locales/pl.d.ts +14 -0
  266. package/dist/i18n/locales/pl.d.ts.map +1 -1
  267. package/dist/i18n/locales/pl.js +15 -1
  268. package/dist/i18n/locales/pl.js.map +1 -1
  269. package/dist/i18n/locales/pt.d.ts +14 -0
  270. package/dist/i18n/locales/pt.d.ts.map +1 -1
  271. package/dist/i18n/locales/pt.js +15 -1
  272. package/dist/i18n/locales/pt.js.map +1 -1
  273. package/dist/i18n/locales/ro.d.ts +14 -0
  274. package/dist/i18n/locales/ro.d.ts.map +1 -1
  275. package/dist/i18n/locales/ro.js +15 -1
  276. package/dist/i18n/locales/ro.js.map +1 -1
  277. package/dist/i18n/locales/ru.d.ts +14 -0
  278. package/dist/i18n/locales/ru.d.ts.map +1 -1
  279. package/dist/i18n/locales/ru.js +15 -1
  280. package/dist/i18n/locales/ru.js.map +1 -1
  281. package/dist/i18n/locales/sq.d.ts +14 -0
  282. package/dist/i18n/locales/sq.d.ts.map +1 -1
  283. package/dist/i18n/locales/sq.js +15 -1
  284. package/dist/i18n/locales/sq.js.map +1 -1
  285. package/dist/i18n/locales/sv.d.ts +14 -0
  286. package/dist/i18n/locales/sv.d.ts.map +1 -1
  287. package/dist/i18n/locales/sv.js +15 -1
  288. package/dist/i18n/locales/sv.js.map +1 -1
  289. package/dist/i18n/locales/tr.d.ts +14 -0
  290. package/dist/i18n/locales/tr.d.ts.map +1 -1
  291. package/dist/i18n/locales/tr.js +15 -1
  292. package/dist/i18n/locales/tr.js.map +1 -1
  293. package/dist/i18n/locales/zh.d.ts +14 -0
  294. package/dist/i18n/locales/zh.d.ts.map +1 -1
  295. package/dist/i18n/locales/zh.js +15 -1
  296. package/dist/i18n/locales/zh.js.map +1 -1
  297. package/dist/index.js +194 -193
  298. package/dist/locales/ar.json +15 -1
  299. package/dist/locales/de.json +15 -1
  300. package/dist/locales/el.json +15 -1
  301. package/dist/locales/en.json +15 -1
  302. package/dist/locales/es.json +15 -1
  303. package/dist/locales/fr.json +15 -1
  304. package/dist/locales/hi.json +15 -1
  305. package/dist/locales/it.json +15 -1
  306. package/dist/locales/ja.json +15 -1
  307. package/dist/locales/nl.json +15 -1
  308. package/dist/locales/pl.json +15 -1
  309. package/dist/locales/pt.json +15 -1
  310. package/dist/locales/ro.json +15 -1
  311. package/dist/locales/ru.json +15 -1
  312. package/dist/locales/sq.json +15 -1
  313. package/dist/locales/sv.json +15 -1
  314. package/dist/locales/tr.json +15 -1
  315. package/dist/locales/zh.json +15 -1
  316. package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts +10 -13
  317. package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts.map +1 -1
  318. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  319. package/dist/patterns/alia-assistant/alia-popout.d.ts +5 -3
  320. package/dist/patterns/alia-assistant/alia-popout.d.ts.map +1 -1
  321. package/dist/patterns/alia-assistant/index.d.ts +2 -0
  322. package/dist/patterns/alia-assistant/index.d.ts.map +1 -1
  323. package/dist/patterns/alia-assistant/index.js +6 -5
  324. package/dist/patterns/anamnesis/index.js +1 -1
  325. package/dist/patterns/calendar/index.js +1 -1
  326. package/dist/patterns/help-me-write-templates/index.js +1 -1
  327. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  328. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +7 -2
  329. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  330. package/dist/patterns/registration-form/index.js +1 -1
  331. package/dist/patterns/signature-request/index.js +1 -1
  332. package/dist/patterns/signed-out-frame/index.js +1 -1
  333. package/dist/tokens.css +1 -1
  334. package/package.json +1 -1
  335. package/dist/_chunks/ai-permission-notice-5vpblPCx.js +0 -171
  336. package/dist/_chunks/ai-permission-notice-5vpblPCx.js.map +0 -1
  337. package/dist/_chunks/alia-sidebar-DOei4Iyu.js +0 -1183
  338. package/dist/_chunks/alia-sidebar-DOei4Iyu.js.map +0 -1
  339. package/dist/_chunks/chart-HsF1KHbx.js.map +0 -1
  340. package/dist/_chunks/color-picker-BRQ4Y9SO.js.map +0 -1
  341. package/dist/_chunks/date-picker-wRAcq2lt.js.map +0 -1
  342. package/dist/_chunks/date-range-picker-CtUOI38x.js.map +0 -1
  343. package/dist/_chunks/date-time-picker-CLeLKuv9.js.map +0 -1
  344. package/dist/_chunks/hover-card-BnTueNS2.js.map +0 -1
  345. package/dist/_chunks/link-2HokYuIi.js +0 -130
  346. package/dist/_chunks/link-2HokYuIi.js.map +0 -1
  347. package/dist/_chunks/marketplace-app-shell-Dcx-JEjg.js.map +0 -1
  348. package/dist/_chunks/message-tray-BB95DA82.js.map +0 -1
  349. package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js +0 -65
  350. package/dist/_chunks/non-modal-tab-exit-D2Bd93Bq.js.map +0 -1
  351. package/dist/_chunks/notification-tray-__sJXnsz.js.map +0 -1
  352. package/dist/_chunks/pdf-viewer-C3minW5b.js.map +0 -1
  353. package/dist/_chunks/phone-input-DxkHMYmu.js.map +0 -1
  354. package/dist/_chunks/popover-BI3oV3eY.js +0 -305
  355. package/dist/_chunks/popover-BI3oV3eY.js.map +0 -1
  356. package/dist/_chunks/product-hub-panel-BSSiGGG4.js.map +0 -1
  357. package/dist/_chunks/rich-text-editor-CkFfmA3v.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"notification-tray-__sJXnsz.js","sources":["../../node_modules/lucide-react/dist/esm/icons/bell.mjs","../../src/components/notification-tray/notification-tray.agent.ts","../../src/components/notification-tray/notification-tray.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\",\n key: \"11g9vi\"\n }\n ]\n];\nconst Bell = createLucideIcon(\"bell\", __iconNode);\n\nexport { __iconNode, Bell as default };\n//# sourceMappingURL=bell.mjs.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — NotificationTray. */\n/* */\n/* Tray-level surface: an agent can open / close the panel, read the */\n/* current items (id + read flag only — never PHI), and route per-item */\n/* operations (dismiss, mark_read, select) through the curated handle. */\n/* All actions are routed through the imperative handle; the adapter */\n/* never touches the DOM directly. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { NotificationTrayHandle } from './notification-tray';\n\nexport const notificationTrayAgent: AgentAdapter<NotificationTrayHandle> = {\n id: 'notification-tray',\n capabilities: ['open', 'close', 'select_single', 'dismiss', 'navigate'],\n state: {\n items: {\n type: 'Array<{ id: string; read: boolean }>',\n descriptionKey: 'ui.agent.notificationTray.state.items',\n description:\n 'Currently-displayed notifications. Ids + read flag only — no PHI.',\n read: (handle) => handle.getItems(),\n },\n unreadCount: {\n type: 'number',\n descriptionKey: 'ui.agent.notificationTray.state.unreadCount',\n description: 'Badge unread count surfaced by the host.',\n read: (handle) => handle.getUnreadCount(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.notificationTray.state.isOpen',\n description: 'Whether the dropdown panel is currently open.',\n read: (handle) => handle.isOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.open',\n description: 'Open the notification panel.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.close',\n description: 'Close the notification panel.',\n invoke: (handle) => {\n handle.close();\n },\n },\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.selectItem',\n description: 'Activate the notification with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n mark_read: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.markRead',\n description: 'Request the host to mark a notification as read.',\n invoke: (handle, args: { id: string }) => {\n handle.markRead(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: { id: { type: 'string' } },\n required: ['id'],\n },\n idempotent: true,\n errors: ['No notification matches the given id.'],\n examples: [{ args: { id: 'notif-1' } }],\n descriptionKey: 'ui.agent.notificationTray.actions.dismiss',\n description:\n 'Request the host to dismiss the notification with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n mark_all_read: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.markAllRead',\n description: 'Request the host to mark every notification as read.',\n invoke: (handle) => {\n handle.markAllRead();\n },\n },\n view_all: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.notificationTray.actions.viewAll',\n description: 'Navigate to the full notification list.',\n invoke: (handle) => {\n handle.viewAll();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'notification-tray',\n description: 'Marks the NotificationTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-notification-id',\n description:\n 'Stable notification id emitted on each rendered NotificationCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { Bell } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Button } from '../button/button';\nimport { Separator } from '../separator/separator';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { Counter } from '../counter/counter';\nimport { ScrollArea } from '../scroll-area/scroll-area';\nimport {\n NotificationCard,\n type NotificationItem,\n} from '../notification-card/notification-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { notificationTrayAgent } from './notification-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for NotificationTray. Exposed as the\n * forwardRef target so a future agent / MCP UI bridge can drive the\n * tray without touching the DOM. See `notification-tray.agent.ts`.\n */\nexport interface NotificationTrayHandle {\n open: () => void;\n close: () => void;\n isOpen: () => boolean;\n getItems: () => Array<{ id: string; read: boolean }>;\n getUnreadCount: () => number;\n selectItem: (id: string) => void;\n markRead: (id: string) => void;\n dismiss: (id: string) => void;\n /** Request the host to mark every notification as read (mirrors onMarkAllRead). */\n markAllRead: () => void;\n /** Navigate to the full notification list (mirrors onViewAll). */\n viewAll: () => void;\n}\n\nexport interface NotificationTrayProps\n extends\n Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick' | 'children' | 'role' | 'id'\n >,\n VariantProps<typeof notificationTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** Fires when the host should mark a single notification as read (used by agent integration). */\n onMarkRead?: (item: NotificationItem) => void;\n /** Notifications rendered in the dropdown panel. */\n items: NotificationItem[];\n /** Number of unseen notifications. Drives the badge count. */\n unseenCount?: number;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Fires when the user activates an item (click or Enter/Space). */\n onItemClick?: (item: NotificationItem) => void;\n /** Fires when the user dismisses a notification. */\n onDismiss?: (item: NotificationItem) => void;\n /** Fires when the user clicks the header \"Mark all as read\" action. */\n onMarkAllRead?: () => void;\n /** When true the panel shows skeleton placeholders. */\n loading?: boolean;\n /** Advisory item count before the list scrolls. Consumers override the cap\n * via the `--notification-tray-max-block-size` custom property. */\n maxVisible?: number;\n /** When set renders a footer link that invokes `onViewAll`. */\n viewAllLabel?: string;\n /** Fires when the footer \"View all\" link is clicked. */\n onViewAll?: () => void;\n /** Panel alignment relative to the trigger. Default `'end'`. */\n align?: 'start' | 'center' | 'end';\n /** Side of the trigger to open on. Default `'bottom'`. */\n side?: 'top' | 'bottom';\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst notificationTrayVariants = cva(\n 'ds:relative ds:inline-flex ds:items-center',\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst panelVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n // Subtle tokenized border pairs with the drop-shadow so the panel's\n // edge stays legible in dark themes (where the shadow alone reads as a\n // faint halo). `--card-border` is alpha-based (32% in dark, lighter in\n // light) so the edge cue stays soft rather than turning into a heavy\n // outline. The forced-colors override below upgrades the border to\n // `CanvasText` so HCM repaints a fully visible edge.\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:z-[var(--z-popover)]',\n // Width: fluid below the design cap so narrow viewports keep a visible\n // gutter on *both* sides of the panel (shadow included). The legacy\n // `min-w` approach clamped at 20rem, which flush-mounted the panel\n // against the inline-start viewport edge on phones.\n 'ds:w-[min(24rem,calc(100vw-2*var(--spacing-md)))]',\n // Height: below the `sm` breakpoint the panel takes a near-full-screen\n // sheet shape so the user gets room to triage messages / notifications\n // without scrolling a tiny popover. `6rem` reserves space for the\n // Header (≈4rem) plus the sideOffset + collisionPadding (≈2rem).\n // Above `sm` it returns to `h-auto` so the list's own\n // `--*-tray-max-block-size` cap governs the height.\n 'ds:h-[calc(100dvh-6rem)] ds:sm:h-auto',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:focus-visible:outline-none',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-xs)]',\n md: 'ds:p-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// The unread overlay is the kit `Counter` (variant `notification`, size\n// `md`) — a single source of truth for the red count badge. This tray only\n// owns the *placement*: anchored to the trigger's top-end corner, nudged\n// outward so the bell icon isn't covered.\nconst badgeOverlay =\n 'ds:absolute ds:-top-[var(--spacing-xs)] ds:-end-[var(--spacing-xs)] ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number, overflowLabel: string): string {\n return count > 99 ? overflowLabel : String(count);\n}\n\nfunction SkeletonRow() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\"\n >\n <Skeleton variant=\"circular\" size=\"sm\" />\n <div className=\"ds:flex-1 ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"70%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"90%\" />\n <Skeleton variant=\"text\" size=\"sm\" width=\"30%\" />\n </div>\n </div>\n );\n}\n\nfunction EmptyPanel() {\n const { t } = useTranslation('ui');\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:flex-col ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)] ds:p-[var(--spacing-lg)] ds:text-center\"\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:size-10 ds:rounded-[var(--radius-full)] ds:bg-[color:var(--muted)] ds:text-[color:var(--muted-foreground)] ds:[&>svg]:size-5\"\n >\n <Bell />\n </span>\n <p className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {t('notificationTray.noNotifications', 'No notifications')}\n </p>\n <p className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {t(\n 'notificationTray.noNotificationsDescription',\n \"You're all caught up.\",\n )}\n </p>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const NotificationTray = forwardRef<\n HTMLDivElement,\n NotificationTrayProps\n>(\n (\n {\n id,\n items,\n unseenCount,\n open,\n onOpenChange,\n onItemClick,\n onDismiss,\n onMarkRead,\n onMarkAllRead,\n loading = false,\n maxVisible,\n viewAllLabel,\n onViewAll,\n align = 'end',\n side = 'bottom',\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n\n const [isOpenRaw, handleOpenChange] = useControllableState<boolean>({\n value: open,\n defaultValue: false,\n onChange: onOpenChange,\n });\n const isOpen = isOpenRaw ?? false;\n\n /* Exit-animation list (AnimatePresence-style).\n * `displayed` holds an entry per card that's currently mounted, even\n * briefly after the consumer removes an item from `items`. When the\n * consumer drops an id from `items`, we flip that entry to\n * `leaving: true` for one animation cycle, then prune it. */\n type Displayed = { item: NotificationItem; leaving: boolean };\n const [displayed, setDisplayed] = useState<Displayed[]>(() =>\n items.map((item) => ({ item, leaving: false })),\n );\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n // `useLayoutEffect` so the `leaving=true` flip applies in the same paint\n // as the consumer's `items` update. With `useEffect` the browser paints\n // once with the dismissed card still at `leaving=false` (no animation)\n // before the flag flips — a visible lag before the exit animation starts.\n useIsomorphicLayoutEffect(() => {\n setDisplayed((prev) => {\n const nextIds = new Set(items.map((i) => i.id));\n const prevIds = new Set(prev.map((d) => d.item.id));\n\n const merged: Displayed[] = prev.map((d) => {\n if (nextIds.has(d.item.id)) {\n const fresh = items.find((i) => i.id === d.item.id);\n return fresh\n ? { item: fresh, leaving: false }\n : { ...d, leaving: true };\n }\n return { ...d, leaving: true };\n });\n\n for (const i of items) {\n if (!prevIds.has(i.id)) merged.push({ item: i, leaving: false });\n }\n return merged;\n });\n }, [items]);\n\n useEffect(() => {\n if (!displayed.some((d) => d.leaving)) return;\n const ms = animationDurationMs();\n const timer = setTimeout(() => {\n setDisplayed((prev) => prev.filter((d) => !d.leaving));\n }, ms);\n return () => clearTimeout(timer);\n }, [displayed, animationDurationMs]);\n\n /* Polite live region — announces when a new unread notification\n floats to the top of the list, even with the panel closed. */\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const lastTopIdRef = useRef<string | undefined>(items[0]?.id);\n\n useEffect(() => {\n const topId = items[0]?.id;\n const prev = lastTopIdRef.current;\n if (prev && topId && prev !== topId && liveRegionRef.current) {\n const newest = items[0];\n if (newest && !newest.read) {\n liveRegionRef.current.textContent = t(\n 'notificationTray.newNotification',\n {\n title: newest.title,\n defaultValue: 'New notification: {{title}}',\n },\n );\n }\n }\n lastTopIdRef.current = topId;\n }, [items, t]);\n\n const displayCount = unseenCount ?? 0;\n const triggerAriaLabel =\n displayCount > 0\n ? t('notificationTray.triggerLabel', {\n count: displayCount,\n defaultValue: 'Notifications, {{count}} unread',\n })\n : t('notificationTray.triggerLabelNone', 'Notifications, none unread');\n\n const badgeLabel = formatBadgeCount(\n displayCount,\n t('notificationTray.badgeCountOverflow', '99+'),\n );\n\n const panelClass = panelVariants({ size });\n\n /* Curated imperative handle for agent integration. Pure look-ups +\n * delegations into the consumer-supplied callbacks; never touches the\n * DOM. See notification-tray.agent.ts. */\n const itemsRef = useRef<NotificationItem[]>(items);\n itemsRef.current = items;\n const unseenRef = useRef<number | undefined>(unseenCount);\n unseenRef.current = unseenCount;\n const isOpenRef = useRef<boolean>(isOpen);\n isOpenRef.current = isOpen;\n\n const handle = useMemo<NotificationTrayHandle>(\n () => ({\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n isOpen: () => isOpenRef.current,\n getItems: () =>\n itemsRef.current.map((i) => ({ id: i.id, read: !!i.read })),\n getUnreadCount: () =>\n unseenRef.current ?? itemsRef.current.filter((i) => !i.read).length,\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onItemClick?.(found);\n },\n markRead: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onMarkRead?.(found);\n },\n dismiss: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onDismiss?.(found);\n },\n markAllRead: () => onMarkAllRead?.(),\n viewAll: () => onViewAll?.(),\n }),\n [\n handleOpenChange,\n onItemClick,\n onMarkRead,\n onDismiss,\n onMarkAllRead,\n onViewAll,\n ],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n useAgentRegistration(notificationTrayAgent, handle, id);\n\n return (\n <div\n ref={rootRef}\n data-component=\"notification-tray\"\n data-component-id={id}\n className={[notificationTrayVariants({ size }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <RadixPopover.Root open={isOpen} onOpenChange={handleOpenChange}>\n <RadixPopover.Trigger asChild>\n <IconButton\n icon={<Bell />}\n intent=\"outline\"\n size={size === 'sm' ? 'sm' : 'md'}\n aria-label={triggerAriaLabel}\n aria-haspopup=\"dialog\"\n />\n </RadixPopover.Trigger>\n {displayCount > 0 ? (\n <Counter\n variant=\"notification\"\n size=\"md\"\n aria-hidden=\"true\"\n data-testid=\"notification-tray-badge\"\n className={badgeOverlay}\n >\n {badgeLabel}\n </Counter>\n ) : null}\n {/* Live region sits outside the popover so it announces even\n while the panel is closed. */}\n <div\n ref={liveRegionRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <RadixPopover.Portal>\n <RadixPopover.Content\n role=\"dialog\"\n aria-label={t('notificationTray.panelTitle', 'Notifications')}\n side={side}\n align={align}\n sideOffset={8}\n // `spacing-md` (16px) keeps Radix's collision-avoidance from\n // flush-mounting the panel against the viewport edge when the\n // trigger is near the inline-end of a narrow screen.\n collisionPadding={16}\n className={panelClass}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)]\">\n <h3 className=\"ds:m-0 type-title-card ds:text-[color:var(--foreground)]\">\n {t('notificationTray.panelTitle', 'Notifications')}\n </h3>\n {onMarkAllRead && items.some((item) => !item.read) ? (\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onMarkAllRead}\n className=\"ds:text-[length:var(--font-size-xs)]\"\n >\n {t('notificationTray.markAllRead', 'Mark all as read')}\n </Button>\n ) : null}\n </div>\n <Separator />\n {/* Cap at ~24rem so ~5 items fit before the list scrolls.\n Consumers override via the --notification-tray-max-block-size\n custom property on the root element. */}\n {/* Below `sm` the panel is a near-full-screen sheet (see\n `panelVariants`) and the list expands to fill the remaining\n space with `flex-1`. Above `sm` the list caps at the\n `--notification-tray-max-block-size` custom property so the\n popover stays compact. ScrollArea owns the overflow + the\n token-styled 8px overlay scrollbar. */}\n <ScrollArea\n orientation=\"vertical\"\n className=\"ds:flex-1 ds:sm:flex-none ds:sm:[max-block-size:var(--notification-tray-max-block-size,24rem)]\"\n >\n <div\n // `role=\"list\"` requires `listitem` children — applied only\n // when we render NotificationCards. The empty / loading\n // states render a `role=\"status\"` panel which would violate\n // aria-required-children if the list role were always on.\n role={loading || displayed.length === 0 ? undefined : 'list'}\n data-max-visible={maxVisible}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)]\"\n >\n {loading ? (\n <>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </>\n ) : displayed.length === 0 ? (\n <EmptyPanel />\n ) : (\n displayed.map(({ item, leaving }) => (\n <NotificationCard\n key={item.id}\n item={item}\n variant=\"compact\"\n leaving={leaving}\n onActivate={onItemClick}\n onDismiss={onDismiss}\n data-notification-id={item.id}\n />\n ))\n )}\n </div>\n </ScrollArea>\n {viewAllLabel ? (\n <>\n <Separator />\n <div className=\"ds:pt-[var(--spacing-xs)]\">\n <Button\n intent=\"link\"\n size=\"sm\"\n onClick={onViewAll}\n className=\"ds:w-full ds:justify-center\"\n >\n {viewAllLabel}\n </Button>\n </div>\n </>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n </div>\n );\n },\n);\n\nNotificationTray.displayName = 'NotificationTray';\n"],"names":["__iconNode","Bell","createLucideIcon","notificationTrayAgent","handle","args","notificationTrayVariants","cva","panelVariants","badgeOverlay","formatBadgeCount","count","overflowLabel","SkeletonRow","jsxs","jsx","Skeleton","EmptyPanel","useTranslation","NotificationTray","forwardRef","id","items","unseenCount","open","onOpenChange","onItemClick","onDismiss","onMarkRead","onMarkAllRead","loading","maxVisible","viewAllLabel","onViewAll","align","side","size","className","rest","ref","t","isOpenRaw","handleOpenChange","useControllableState","isOpen","displayed","setDisplayed","useState","item","animationDurationMs","useCallback","raw","trimmed","n","useIsomorphicLayoutEffect","prev","nextIds","i","prevIds","d","merged","fresh","useEffect","ms","timer","liveRegionRef","useRef","lastTopIdRef","_a","topId","newest","displayCount","triggerAriaLabel","badgeLabel","panelClass","itemsRef","unseenRef","isOpenRef","useMemo","targetId","found","rootRef","useImperativeHandle","useAgentRegistration","RadixPopover","IconButton","Counter","Button","Separator","ScrollArea","Fragment","leaving","NotificationCard"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pdf-viewer-C3minW5b.js","sources":["../../src/components/pdf-viewer/pdf-viewer.agent.ts","../../src/components/pdf-viewer/pdf-viewer.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { PDFViewerHandle } from './pdf-viewer';\n\nexport const pdfViewerAgent: AgentAdapter<PDFViewerHandle> = {\n id: 'pdf-viewer',\n // `paginate` (go_to_page), `set_value` (zoom preset — ephemeral view state),\n // `filter` (in-document search/highlight). Zoom maps to `set_value` rather\n // than the old `view_change` per the agent-readiness capability vocabulary.\n capabilities: ['paginate', 'set_value', 'filter'],\n // Every action is a silent no-op until the document loads, and\n // `go_to_page` clamps into range without saying so. These slots are\n // how an agent range-checks before calling and verifies afterwards.\n // A9: page numbers, counts, a zoom enum and a match count are\n // structural. Extracted page text is NOT exposed, and neither is\n // `src` — it may be a signed / tokenised document URL, i.e. a\n // credential.\n state: {\n status: {\n type: \"'loading' | 'ready' | 'error'\",\n descriptionKey: 'ui.agent.pdfViewer.state.status',\n description:\n 'Whether the document has loaded. Read this first — every action is a silent no-op while the viewer is loading or has failed.',\n read: (handle) => handle.getStatus(),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.pdfViewer.state.currentPage',\n description:\n '1-indexed page currently in view. The read-back for `go_to_page`, which clamps out-of-range requests silently.',\n read: (handle) => handle.getCurrentPage(),\n },\n pageCount: {\n type: 'number',\n descriptionKey: 'ui.agent.pdfViewer.state.pageCount',\n description:\n 'Number of pages in the loaded document, or 0 before it loads. Range-check against this before calling `go_to_page` rather than discovering the clamp after the fact.',\n read: (handle) => handle.getPageCount(),\n },\n zoom: {\n type: \"'fit-width' | 'fit-page' | 'actual-size' | number\",\n descriptionKey: 'ui.agent.pdfViewer.state.zoom',\n description:\n 'Zoom preset or numeric scale factor currently applied. The read-back for `set_zoom`.',\n read: (handle) => handle.getZoom(),\n },\n searchMatchCount: {\n type: 'number',\n descriptionKey: 'ui.agent.pdfViewer.state.searchMatchCount',\n description:\n 'Number of matches for the active search query — 0 when nothing matched or no search is running. A count only; the matched text is never exposed.',\n read: (handle) => handle.getSearchMatchCount(),\n },\n },\n actions: {\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n argsSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'integer',\n minimum: 1,\n description: '1-indexed target page.',\n },\n },\n required: ['page'],\n },\n idempotent: true,\n errors: [\n 'No-op while `status` is not \"ready\" — the document has not loaded.',\n 'A page outside 1..`pageCount` is silently clamped into range; read `currentPage` back to see where it landed.',\n ],\n examples: [{ args: { page: 2 } }],\n descriptionKey: 'ui.agent.pdfViewer.actions.goToPage',\n description:\n 'Navigate to a specific 1-indexed page. Check `pageCount` first — an out-of-range page is clamped silently, and the call is a no-op until `status` is \"ready\".',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n set_zoom: {\n safety: 'read',\n argsType: '{ zoom: PDFZoomPreset }',\n argsSchema: {\n type: 'object',\n properties: {\n zoom: {\n description:\n \"Either a named preset ('fit-width' | 'fit-page' | 'actual-size') or a numeric scale factor (e.g. 1.5).\",\n oneOf: [\n { enum: ['fit-width', 'fit-page', 'actual-size'] },\n { type: 'number', exclusiveMinimum: 0 },\n ],\n },\n },\n required: ['zoom'],\n },\n idempotent: true,\n examples: [{ args: { zoom: 'fit-width' } }, { args: { zoom: 1.5 } }],\n descriptionKey: 'ui.agent.pdfViewer.actions.setZoom',\n description: 'Apply a zoom preset or numeric scale factor.',\n invoke: (\n handle,\n args: { zoom: Parameters<PDFViewerHandle['setZoom']>[0] },\n ) => {\n handle.setZoom(args.zoom);\n },\n },\n search: {\n safety: 'read',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Text to find and highlight in the loaded document.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n examples: [{ args: { query: 'consent' } }],\n descriptionKey: 'ui.agent.pdfViewer.actions.search',\n description:\n 'Search the document for the given query and highlight matches. Read the `searchMatchCount` slot afterwards — the action itself returns nothing.',\n invoke: (handle, args: { query: string }) => {\n handle.search(args.query);\n },\n },\n print: {\n safety: 'read',\n descriptionKey: 'ui.agent.pdfViewer.actions.print',\n description: 'Open the browser print dialog for the document.',\n invoke: (handle) => {\n handle.print();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'pdf-viewer' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* PDFViewer — thin React wrapper over Mozilla's pdfjs-dist. */\n/* */\n/* - Worker: loaded once at module scope via Vite's `?url` asset */\n/* import; consumers never configure it (08-third-party §PDF Viewer). */\n/* - Lazy rendering: an IntersectionObserver renders only visible + */\n/* ±1 buffer pages; off-screen pages release GPU memory by setting */\n/* `canvas.width = 0` while the wrapper <article> keeps its reserved */\n/* height so scroll position is stable. */\n/* - Toolbar: WAI-ARIA `role=\"toolbar\"` with roving tabindex (same */\n/* pattern as RichTextEditor — see 05-accessibility.mdx §42). */\n/* - Find bar: Radix Popover; Cmd/Ctrl+F opens; matches decorated in */\n/* the text layer with a `--warning`-tinted background. */\n/* - i18n: every string via `t('pdf.*')`. Icons flipped via `rtl:…`. */\n/* */\n/* TODO: */\n/* - Full PDF.js `printService` integration (A4 / US Letter, 150 DPI,*/\n/* hidden high-DPI canvas). For now `print()` calls `window.print()`*/\n/* which renders the viewer chrome — the `@media print` rule lives */\n/* in a future theme bridge. */\n/* - AnnotationLayer for form fields and links (08-third-party). */\n/* - Accessibility-tag surfacing via `aria-describedby` per the user */\n/* story's screen-reader acceptance row. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\n// Legacy build, not the default modern one: it bundles the polyfills\n// pdf.js relies on (e.g. Map.prototype.getOrInsertComputed), so PDFs\n// render on older browsers and headless capture engines, not just current Chrome.\nimport * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.min.mjs';\nimport type {\n PDFDocumentProxy,\n PDFPageProxy,\n} from 'pdfjs-dist/types/src/display/api';\nimport type { PageViewport } from 'pdfjs-dist/types/src/display/display_utils';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport {\n ChevronLeft,\n ChevronRight,\n ZoomIn,\n ZoomOut,\n Search,\n Printer,\n X,\n} from 'lucide-react';\n\n/* ------------------------------------------------------------------ */\n/* Worker setup — one-shot at module scope */\n/* ------------------------------------------------------------------ */\n\n// Vite resolves `?url` to a static URL string at build time. This keeps\n// PDF.js off the main bundle and lets the consumer not think about it.\nimport pdfjsWorkerUrl from 'pdfjs-dist/legacy/build/pdf.worker.min.mjs?url';\n\nimport { Spinner } from '../spinner';\nimport { Alert } from '../alert';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { pdfViewerAgent } from './pdf-viewer.agent';\n\npdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorkerUrl;\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type PDFZoomPreset = 'fit-width' | 'fit-page' | 'actual-size' | number;\n\nexport type PDFPageRotation = 0 | 90 | 180 | 270;\n\n/**\n * Arguments passed to `renderPageOverlay` for each rendered page.\n *\n * `pageWidthCss` and `pageHeightCss` are post-zoom, post-rotation CSS\n * pixel dimensions — exactly the rendered box the consumer is\n * positioning content over. They update on resize, zoom, and rotation\n * changes; the render-prop re-runs on every change so positioned\n * children stay in sync with the page geometry without the consumer\n * touching a `ResizeObserver`.\n */\nexport interface PDFPageOverlayArgs {\n /** 1-based page number. */\n pageNumber: number;\n /** CSS-pixel width of the rendered page (post-zoom, post-rotation). */\n pageWidthCss: number;\n /** CSS-pixel height of the rendered page. */\n pageHeightCss: number;\n /**\n * Effective rotation of the rendered viewport in degrees. Reflects\n * `pageRotation` (if set) overriding the page's intrinsic `/Rotate`,\n * otherwise the intrinsic rotation.\n */\n rotation: PDFPageRotation;\n}\n\nexport interface PDFViewerProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** PDF source — URL string, ArrayBuffer, or Uint8Array. */\n src: string | ArrayBuffer | Uint8Array;\n /** Initial page (1-based). Default 1. */\n initialPage?: number;\n /** Initial zoom preset. Default 'fit-width'. */\n initialZoom?: PDFZoomPreset;\n /**\n * Force every page to render at this rotation, overriding the page's\n * intrinsic `/Rotate` metadata. Useful for scanned PDFs that opened\n * sideways, and for the signing-flow consumer that lets users\n * straighten misrotated pages before placing signature fields.\n * `undefined` (default) honours each page's intrinsic rotation.\n */\n pageRotation?: PDFPageRotation;\n /**\n * Render a layer of arbitrary React content positioned over each\n * rendered PDF page — signature fields, redaction boxes, annotation\n * pins, anything that needs to live in PDF coordinate space.\n *\n * The render-prop is invoked **only for pages currently inside the\n * IntersectionObserver buffer** (visible ±1), and the returned tree\n * unmounts when the page leaves the buffer. Consumer-held timers /\n * fetches / subscriptions in overlay children therefore tear down\n * automatically with the page. The overlay container is absolutely\n * positioned, sized to the rendered page, and has\n * `pointer-events: auto` so consumer children can be interactive.\n * Consumers position children themselves (typically\n * `position: absolute; inset-inline-start: %; inset-block-start: %`).\n *\n * The render-prop re-runs on resize, zoom, and rotation changes so\n * positioned children stay aligned without the consumer wiring a\n * `ResizeObserver`. Pages already declare `data-page-number` on the\n * `<article>` ancestor; consumer-rendered children should be\n * keyboard-reachable per the kit's a11y contract.\n *\n * Composition note: PDF.js's `AnnotationLayer` (for native form\n * fields and link annotations) is not yet wired in — see the file\n * header TODO. When it lands, `renderPageOverlay` will compose\n * **above** the AnnotationLayer in z-order, since interactive\n * consumer content should sit on top of intrinsic page widgets.\n */\n renderPageOverlay?: (args: PDFPageOverlayArgs) => ReactNode;\n /** Emits when the currently-most-visible page changes. */\n onPageChange?: (page: number) => void;\n /** Emits once the PDF document has loaded. */\n onLoadComplete?: (info: { numPages: number; title?: string }) => void;\n /** Emits on any load / render error. */\n onError?: (error: Error) => void;\n /** Show the toolbar. Default `true`. */\n toolbar?: boolean;\n /**\n * Toolbar control set. `'full'` (default) is the editor toolbar (page nav,\n * page input, zoom, fit-width, search, print). `'minimal'` is a lean,\n * read-only control set — zoom out / in / preset only — for surfaces like\n * signing where a signer just reads, scrolls, and occasionally zooms.\n */\n toolbarVariant?: 'full' | 'minimal';\n /** Accessible label for the viewer region. */\n ariaLabel?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport interface PDFViewerHandle {\n goToPage: (page: number) => void;\n setZoom: (zoom: PDFZoomPreset) => void;\n search: (query: string) => void;\n print: () => void;\n /* ---- read-back ------------------------------------------------ */\n /** 1-indexed page currently in view. */\n getCurrentPage: () => number;\n /** Pages in the loaded document, or `0` before it loads. */\n getPageCount: () => number;\n /** Zoom preset or numeric scale currently applied. */\n getZoom: () => PDFZoomPreset;\n /**\n * Whether the document has loaded. Every action is a silent no-op\n * while this is `'loading'` or `'error'`.\n */\n getStatus: () => 'loading' | 'ready' | 'error';\n /** Number of matches for the active search query. */\n getSearchMatchCount: () => number;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva(\n [\n 'ds:pdf-viewer-alfadocs ds:flex ds:flex-col',\n // Allow the viewer to shrink below its content's intrinsic width when it\n // sits in a constrained flex/grid context (mobile signing flows): without\n // min-inline-size:0 the page canvas's natural width pins the flex item\n // open, fit-width then measures that inflated width and never scales down.\n 'ds:min-w-0',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:[:where(&)]:border-[length:var(--surface-border-width,var(--border-width-sm))] ds:border-[color:var(--card-border)]',\n 'ds:overflow-hidden',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst toolbarVariants = cva(\n [\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]',\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-[var(--background)]',\n 'ds:border-b ds:border-[color:var(--border)]',\n ].join(' '),\n);\n\nconst toolbarButtonVariants = cva(\n [\n 'ds:inline-flex 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-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)] ds:bg-transparent ds:text-[var(--foreground)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst pageInputVariants = cva(\n [\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:inline-size-[4rem] ds:text-center',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--control-border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst zoomSelectVariants = cva(\n [\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--control-border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst pagesContainerVariants = cva(\n [\n 'ds:relative ds:flex ds:flex-col ds:items-center',\n 'ds:gap-[var(--spacing-md)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:bg-[var(--muted)]',\n 'ds:overflow-auto',\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 // NB: `min-block-size-[…]` / `max-block-size-[…]` arbitrary utilities don't\n // generate any CSS in this Tailwind setup (silent no-op) — using them left\n // the container uncapped, so it rendered all pages at full height and never\n // scrolled, which froze the page tracker at 1 and broke SignDocument's\n // read-to-end gate. `min-h`/`max-h` are block-axis height (writing-mode\n // agnostic) and generate correctly.\n 'ds:min-h-[30rem]',\n 'ds:max-h-[80vh]',\n ].join(' '),\n);\n\nconst pageArticleVariants = cva(\n [\n 'ds:relative ds:flex ds:items-center ds:justify-center',\n 'ds:bg-[var(--background)]',\n 'ds:shadow-[var(--shadow-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nconst ZOOM_PRESETS: ReadonlyArray<PDFZoomPreset> = [\n 'fit-width',\n 'fit-page',\n 'actual-size',\n 0.5,\n 0.75,\n 1,\n 1.25,\n 1.5,\n 2,\n];\n\nfunction isNumberZoom(z: PDFZoomPreset): z is number {\n return typeof z === 'number';\n}\n\nfunction resolveScale(\n zoom: PDFZoomPreset,\n viewport: PageViewport,\n container: HTMLElement | null,\n): number {\n if (isNumberZoom(zoom)) return zoom;\n if (zoom === 'actual-size') return 1;\n if (!container) return 1;\n const style = window.getComputedStyle(container);\n const padX =\n parseFloat(style.paddingInlineStart || '0') +\n parseFloat(style.paddingInlineEnd || '0');\n const padY =\n parseFloat(style.paddingBlockStart || '0') +\n parseFloat(style.paddingBlockEnd || '0');\n const availW = Math.max(container.clientWidth - padX, 1);\n const availH = Math.max(container.clientHeight - padY, 1);\n const baseW = viewport.width;\n const baseH = viewport.height;\n if (zoom === 'fit-width') return availW / baseW;\n // fit-page\n return Math.min(availW / baseW, availH / baseH);\n}\n\ninterface LoadedDocument {\n doc: PDFDocumentProxy;\n numPages: number;\n title?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* PDFViewer */\n/* ------------------------------------------------------------------ */\n\nexport const PDFViewer = forwardRef<PDFViewerHandle, PDFViewerProps>(\n (\n {\n id,\n src,\n initialPage = 1,\n initialZoom = 'fit-width',\n pageRotation,\n renderPageOverlay,\n onPageChange,\n onLoadComplete,\n onError,\n toolbar = true,\n toolbarVariant = 'full',\n ariaLabel,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const rawId = useId();\n const viewerId = useMemo(\n () => `pdf-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n\n /* ---- RTL / reduced motion ------------------------------------ */\n const [isRtl, setIsRtl] = useState(false);\n const [reducedMotion, setReducedMotion] = useState(false);\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n setIsRtl(document.documentElement.dir === 'rtl');\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n const sync = (): void => setReducedMotion(mql.matches);\n sync();\n mql.addEventListener('change', sync);\n return () => mql.removeEventListener('change', sync);\n }, []);\n\n /* ---- Document state ------------------------------------------ */\n const [loaded, setLoaded] = useState<LoadedDocument | null>(null);\n const [loadError, setLoadError] = useState<Error | null>(null);\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [zoom, setZoomState] = useState<PDFZoomPreset>(initialZoom);\n const [visibleRange, setVisibleRange] = useState<{\n start: number;\n end: number;\n }>({ start: Math.max(1, initialPage - 1), end: initialPage + 1 });\n const [announcement, setAnnouncement] = useState<string>('');\n const [searchOpen, setSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [searchMatches, setSearchMatches] = useState<{\n current: number;\n total: number;\n }>({ current: 0, total: 0 });\n\n const onPageChangeRef =\n useRef<PDFViewerProps['onPageChange']>(onPageChange);\n const onLoadCompleteRef =\n useRef<PDFViewerProps['onLoadComplete']>(onLoadComplete);\n const onErrorRef = useRef<PDFViewerProps['onError']>(onError);\n useEffect(() => {\n onPageChangeRef.current = onPageChange;\n onLoadCompleteRef.current = onLoadComplete;\n onErrorRef.current = onError;\n }, [onPageChange, onLoadComplete, onError]);\n\n /* ---- Load the PDF document ----------------------------------- */\n // Ref tracking the currently-loaded document so the cleanup path sees\n // the latest proxy (state closed over in the effect would be stale).\n const loadedRef = useRef<LoadedDocument | null>(null);\n useEffect(() => {\n loadedRef.current = loaded;\n }, [loaded]);\n useEffect(() => {\n let cancelled = false;\n setLoaded(null);\n setLoadError(null);\n\n // `getDocument` accepts a URL string, Uint8Array, or an object with a\n // `data` field. Narrow to what pdfjs expects at runtime. We always pass\n // an options object so that `disableJavaScript` and `isEvalSupported`\n // flow through — patient-uploaded PDFs must not execute embedded JS.\n // See security-hardening.mdx.\n const baseOptions = {\n disableJavaScript: true,\n isEvalSupported: false,\n } as const;\n const task = pdfjsLib.getDocument(\n typeof src === 'string'\n ? { url: src, ...baseOptions }\n : src instanceof Uint8Array\n ? { data: src, ...baseOptions }\n : { data: new Uint8Array(src), ...baseOptions },\n );\n\n task.promise.then(\n async (doc) => {\n if (cancelled) return;\n let title: string | undefined;\n try {\n const meta = await doc.getMetadata();\n const info = meta?.info as { Title?: string } | undefined;\n title = info?.Title;\n } catch {\n title = undefined;\n }\n if (cancelled) {\n // Unmounted while metadata was resolving — destroy the doc we\n // just acquired so the worker channel and font resources are\n // released.\n try {\n await doc.destroy();\n } catch {\n /* ignore */\n }\n return;\n }\n const next: LoadedDocument = { doc, numPages: doc.numPages, title };\n setLoaded(next);\n onLoadCompleteRef.current?.({ numPages: doc.numPages, title });\n },\n (err: unknown) => {\n if (cancelled) return;\n const error = err instanceof Error ? err : new Error(String(err));\n setLoadError(error);\n onErrorRef.current?.(error);\n },\n );\n\n return () => {\n cancelled = true;\n task.destroy();\n // Release the previously-loaded PDFDocumentProxy when src changes\n // or the component unmounts. PDFDocumentProxy holds fonts, embedded\n // resources, and the worker channel — without this call, switching\n // PDFs progressively leaks memory in a long-running SPA.\n const prev = loadedRef.current;\n if (prev) {\n try {\n void prev.doc.destroy();\n } catch {\n /* ignore */\n }\n loadedRef.current = null;\n }\n };\n }, [src]);\n\n /* ---- Current-page announcement ------------------------------- */\n useEffect(() => {\n if (!loaded) return;\n setAnnouncement(\n t('pdf.pageOf', { current: currentPage, total: loaded.numPages }),\n );\n onPageChangeRef.current?.(currentPage);\n }, [currentPage, loaded, t]);\n\n /* ---- Imperative handle --------------------------------------- */\n const pagesContainerRef = useRef<HTMLDivElement>(null);\n const pageArticleRefs = useRef<Array<HTMLElement | null>>([]);\n\n const goToPage = useCallback(\n (page: number) => {\n if (!loaded) return;\n const clamped = Math.max(1, Math.min(page, loaded.numPages));\n setCurrentPage(clamped);\n const article = pageArticleRefs.current[clamped - 1];\n if (article) {\n article.scrollIntoView({\n behavior: reducedMotion ? 'auto' : 'auto',\n block: 'start',\n });\n }\n },\n [loaded, reducedMotion],\n );\n\n const setZoom = useCallback((next: PDFZoomPreset) => {\n setZoomState(next);\n }, []);\n\n const internalPrint = useCallback(() => {\n // TODO: wire PDF.js printService for accurate, chrome-free output.\n if (typeof window !== 'undefined') window.print();\n }, []);\n\n const search = useCallback((query: string) => {\n setSearchQuery(query);\n setSearchOpen(query.length > 0);\n }, []);\n\n // Mirror of the render-time state the agent surface reads back.\n // Assigned during render (same pattern as `loadedRef`) so a read\n // immediately after an action sees the settled value. Structural\n // only — page numbers, counts, a zoom enum, a match count. Never\n // extracted page text, and never `src`, which may be a signed or\n // tokenised document URL (i.e. a credential).\n const agentStateRef = useRef({\n currentPage,\n pageCount: 0,\n zoom,\n status: 'loading' as 'loading' | 'ready' | 'error',\n searchMatchCount: 0,\n });\n agentStateRef.current = {\n currentPage,\n pageCount: loaded?.numPages ?? 0,\n zoom,\n status: loadError ? 'error' : loaded ? 'ready' : 'loading',\n searchMatchCount: searchMatches.total,\n };\n\n const agentHandle = useMemo<PDFViewerHandle>(\n () => ({\n goToPage,\n setZoom,\n search,\n print: internalPrint,\n getCurrentPage: () => agentStateRef.current.currentPage,\n getPageCount: () => agentStateRef.current.pageCount,\n getZoom: () => agentStateRef.current.zoom,\n getStatus: () => agentStateRef.current.status,\n getSearchMatchCount: () => agentStateRef.current.searchMatchCount,\n }),\n [goToPage, setZoom, search, internalPrint],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(pdfViewerAgent, agentHandle, id);\n\n /* ---- Keyboard shortcuts on the viewer ------------------------ */\n const handleViewerKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (!loaded) return;\n const mod = event.metaKey || event.ctrlKey;\n\n if (event.key === 'PageDown') {\n event.preventDefault();\n goToPage(currentPage + 1);\n return;\n }\n if (event.key === 'PageUp') {\n event.preventDefault();\n goToPage(currentPage - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n goToPage(1);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n goToPage(loaded.numPages);\n return;\n }\n\n if (mod && event.key.toLowerCase() === 'f') {\n event.preventDefault();\n setSearchOpen(true);\n return;\n }\n if (mod && (event.key === '+' || event.key === '=')) {\n event.preventDefault();\n setZoomState((z) => (isNumberZoom(z) ? Math.min(z * 1.25, 4) : 1.25));\n return;\n }\n if (mod && event.key === '-') {\n event.preventDefault();\n setZoomState((z) =>\n isNumberZoom(z) ? Math.max(z / 1.25, 0.25) : 0.75,\n );\n return;\n }\n if (mod && event.key === '0') {\n event.preventDefault();\n setZoomState('fit-width');\n return;\n }\n if (mod && event.key.toLowerCase() === 'p') {\n event.preventDefault();\n internalPrint();\n }\n },\n [currentPage, goToPage, internalPrint, loaded],\n );\n\n /* ---- Intersection observer — visible page tracking ----------- */\n // `currentPage` is referenced only for a fallback inside the observer\n // callback. Including it in the effect deps would destroy and re-create\n // the observer every time the callback updates currentPage — on a\n // 100-page PDF that's O(n) observe() calls on every scroll tick.\n const currentPageRef = useRef<number>(currentPage);\n useEffect(() => {\n currentPageRef.current = currentPage;\n }, [currentPage]);\n useEffect(() => {\n if (!loaded) return undefined;\n const container = pagesContainerRef.current;\n if (!container) return undefined;\n\n const visibility = new Map<number, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const pageAttr = (entry.target as HTMLElement).dataset.pageNumber;\n if (!pageAttr) continue;\n const n = Number(pageAttr);\n visibility.set(n, entry.intersectionRatio);\n }\n // Compute new \"most visible\" page + visible range\n let best = currentPageRef.current;\n let bestRatio = 0;\n let minVisible = Infinity;\n let maxVisible = -Infinity;\n for (const [page, ratio] of visibility.entries()) {\n if (ratio > bestRatio) {\n best = page;\n bestRatio = ratio;\n }\n if (ratio > 0) {\n minVisible = Math.min(minVisible, page);\n maxVisible = Math.max(maxVisible, page);\n }\n }\n if (bestRatio > 0 && best !== currentPageRef.current) {\n setCurrentPage(best);\n }\n if (minVisible !== Infinity) {\n setVisibleRange({\n start: Math.max(1, minVisible - 1),\n end: Math.min(loaded.numPages, maxVisible + 1),\n });\n }\n },\n { root: container, threshold: [0, 0.25, 0.5, 0.75, 1] },\n );\n\n pageArticleRefs.current.forEach((el) => {\n if (el) observer.observe(el);\n });\n return () => observer.disconnect();\n }, [loaded]);\n\n /* ---- Resize observer — recompute scale on fit presets -------- */\n const [containerSizeTick, setContainerSizeTick] = useState(0);\n useEffect(() => {\n const container = pagesContainerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return undefined;\n const ro = new ResizeObserver(() => {\n if (zoom === 'fit-width' || zoom === 'fit-page') {\n setContainerSizeTick((v) => v + 1);\n }\n });\n ro.observe(container);\n return () => ro.disconnect();\n }, [zoom]);\n\n /* ---- Toolbar roving tabindex --------------------------------- */\n const toolbarButtonsRef = useRef<Array<HTMLElement | null>>([]);\n const [toolbarFocusIndex, setToolbarFocusIndex] = useState(0);\n const registerToolbarButton = useCallback(\n (index: number) => (el: HTMLElement | null) => {\n toolbarButtonsRef.current[index] = el;\n },\n [],\n );\n const focusToolbarButton = useCallback((index: number) => {\n const btn = toolbarButtonsRef.current[index];\n if (btn) btn.focus();\n }, []);\n // Roving-tabindex span. The minimal toolbar renders only the 3 zoom\n // controls (reindexed 0–2); the full toolbar has 8.\n const toolbarCount = toolbarVariant === 'minimal' ? 2 : 8;\n const handleToolbarKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLElement>) => {\n const forward = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const backward = isRtl ? 'ArrowRight' : 'ArrowLeft';\n let next: number | null = null;\n if (event.key === forward)\n next = (toolbarFocusIndex + 1) % toolbarCount;\n else if (event.key === backward)\n next = (toolbarFocusIndex - 1 + toolbarCount) % toolbarCount;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = toolbarCount - 1;\n if (next !== null) {\n event.preventDefault();\n setToolbarFocusIndex(next);\n focusToolbarButton(next);\n }\n },\n [focusToolbarButton, isRtl, toolbarFocusIndex],\n );\n\n /* ---- Render ---------------------------------------------------*/\n if (loadError) {\n return (\n <div\n className={[wrapperVariants(), className].filter(Boolean).join(' ')}\n aria-label={ariaLabel ?? t('pdf.error')}\n >\n <div className=\"ds:p-[var(--spacing-lg)]\">\n <Alert variant=\"error\" live=\"polite\">\n <Alert.Description>\n {t('pdf.error')}: {loadError.message}\n </Alert.Description>\n </Alert>\n </div>\n </div>\n );\n }\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- region-level keyboard shortcuts (search, zoom) intentionally captured at the wrapper for the entire PDF viewer\n <div\n id={viewerId}\n role=\"region\"\n aria-label={ariaLabel ?? t('pdf.toolbarLabel')}\n className={[wrapperVariants(), className].filter(Boolean).join(' ')}\n dir={isRtl ? 'rtl' : undefined}\n onKeyDown={handleViewerKeyDown}\n tabIndex={-1}\n data-component=\"pdf-viewer\"\n data-component-id={id}\n // Exposed for CI assertion (story `WorkerSameOrigin`) — the\n // worker URL must be same-origin so a strict CSP can block\n // cross-origin worker loads. Read by the play function via\n // `getAttribute('data-pdfjs-worker-src')`.\n data-pdfjs-worker-src={pdfjsWorkerUrl}\n >\n {toolbar ? (\n <PDFToolbar\n variant={toolbarVariant}\n currentPage={currentPage}\n numPages={loaded?.numPages ?? 0}\n zoom={zoom}\n onPrev={() => goToPage(currentPage - 1)}\n onNext={() => goToPage(currentPage + 1)}\n onJump={(p) => goToPage(p)}\n onZoomIn={() => {\n setZoomState((z) =>\n isNumberZoom(z) ? Math.min(z * 1.25, 4) : 1.25,\n );\n }}\n onZoomOut={() => {\n setZoomState((z) =>\n isNumberZoom(z) ? Math.max(z / 1.25, 0.25) : 0.75,\n );\n }}\n onZoomPreset={(v) => setZoomState(v)}\n onOpenSearch={() => setSearchOpen(true)}\n onPrint={internalPrint}\n searchOpen={searchOpen}\n onSearchOpenChange={setSearchOpen}\n searchQuery={searchQuery}\n onSearchQueryChange={(v) => {\n setSearchQuery(v);\n }}\n searchMatches={searchMatches}\n register={registerToolbarButton}\n focusIndex={toolbarFocusIndex}\n setFocusIndex={setToolbarFocusIndex}\n onToolbarKeyDown={handleToolbarKeyDown}\n isRtl={isRtl}\n />\n ) : null}\n\n {/* aria-live announcements for page / zoom changes */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"ds:sr-only\">\n {announcement}\n </div>\n\n <div\n ref={pagesContainerRef}\n className={pagesContainerVariants()}\n data-testid=\"pdf-pages-container\"\n // The pages list scrolls (overflow-auto + max-block-size cap), so it\n // must be reachable by keyboard alone — without a tab stop, a\n // keyboard-only user can't scroll a document whose overlays are\n // non-interactive (axe `scrollable-region-focusable`). `tabIndex={0}`\n // makes it focusable; the translated `aria-label` names it without\n // adding a second `role=\"region\"` landmark (which would break the\n // singular region lookups and landmark-uniqueness in consumers).\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- a scrollable region legitimately needs a keyboard tab stop (axe scrollable-region-focusable); role=\"region\" is deliberately avoided above.\n tabIndex={0}\n aria-label={t('pdf.pagesRegionLabel')}\n >\n {loaded ? (\n Array.from({ length: loaded.numPages }, (_, i) => i + 1).map(\n (pageNumber) => (\n <PDFPage\n key={pageNumber}\n pageNumber={pageNumber}\n totalPages={loaded.numPages}\n doc={loaded.doc}\n zoom={zoom}\n pageRotation={pageRotation}\n renderPageOverlay={renderPageOverlay}\n container={pagesContainerRef.current}\n resizeTick={containerSizeTick}\n shouldRender={\n pageNumber >= visibleRange.start &&\n pageNumber <= visibleRange.end\n }\n registerRef={(el) => {\n pageArticleRefs.current[pageNumber - 1] = el;\n }}\n searchQuery={searchQuery}\n onMatchCount={(count) => {\n // Aggregate simplistically: sum across visible pages.\n setSearchMatches((prev) => {\n if (count === 0 && prev.total === 0) return prev;\n return {\n current: Math.min(prev.current || 1, count || 1),\n total: Math.max(prev.total, count),\n };\n });\n }}\n />\n ),\n )\n ) : (\n <div className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:text-[var(--muted-foreground)] ds:p-[var(--spacing-lg)]\">\n <Spinner variant=\"pulse\" size=\"sm\" label={t('pdf.loading')} />\n <span>{t('pdf.loading')}</span>\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nPDFViewer.displayName = 'PDFViewer';\n\n/* ------------------------------------------------------------------ */\n/* PDFToolbar */\n/* ------------------------------------------------------------------ */\n\ninterface PDFToolbarProps {\n variant: 'full' | 'minimal';\n currentPage: number;\n numPages: number;\n zoom: PDFZoomPreset;\n onPrev: () => void;\n onNext: () => void;\n onJump: (page: number) => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onZoomPreset: (v: PDFZoomPreset) => void;\n onOpenSearch: () => void;\n onPrint: () => void;\n searchOpen: boolean;\n onSearchOpenChange: (v: boolean) => void;\n searchQuery: string;\n onSearchQueryChange: (v: string) => void;\n searchMatches: { current: number; total: number };\n register: (index: number) => (el: HTMLElement | null) => void;\n focusIndex: number;\n setFocusIndex: (n: number) => void;\n onToolbarKeyDown: (event: ReactKeyboardEvent<HTMLElement>) => void;\n isRtl: boolean;\n}\n\nfunction PDFToolbar(props: PDFToolbarProps): ReactNode {\n const { t } = useTranslation('ui');\n const {\n variant,\n currentPage,\n numPages,\n zoom,\n onPrev,\n onNext,\n onJump,\n onZoomIn,\n onZoomOut,\n onZoomPreset,\n onOpenSearch,\n onPrint,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n searchMatches,\n register,\n focusIndex,\n setFocusIndex,\n onToolbarKeyDown,\n } = props;\n\n // Minimal = zoom-only (read-only signing surface). The zoom cluster\n // reindexes to 0–2 so the roving tabindex stays contiguous.\n const minimal = variant === 'minimal';\n const zoomOutIndex = minimal ? 0 : 3;\n const zoomInIndex = minimal ? 1 : 4;\n // The zoom-preset select (Fit width / Fit page / Actual size / %) is dropped\n // in minimal — a signer just nudges zoom with − / +.\n const zoomSelectIndex = 5;\n\n const [pageInput, setPageInput] = useState(String(currentPage));\n useEffect(() => {\n setPageInput(String(currentPage));\n }, [currentPage]);\n\n const prevDisabled = currentPage <= 1;\n const nextDisabled = currentPage >= numPages;\n\n function commitPageInput(): void {\n const parsed = Number(pageInput);\n if (Number.isFinite(parsed) && parsed >= 1) {\n onJump(Math.min(parsed, numPages));\n } else {\n setPageInput(String(currentPage));\n }\n }\n\n function renderButton(opts: {\n index: number;\n label: string;\n disabled?: boolean;\n onActivate: () => void;\n icon: ReactNode;\n }): ReactNode {\n return (\n <button\n type=\"button\"\n ref={register(opts.index)}\n tabIndex={opts.index === focusIndex ? 0 : -1}\n onFocus={() => setFocusIndex(opts.index)}\n onKeyDown={onToolbarKeyDown}\n aria-label={opts.label}\n aria-disabled={opts.disabled || undefined}\n title={opts.label}\n onClick={(event) => {\n if (opts.disabled) {\n event.preventDefault();\n return;\n }\n opts.onActivate();\n }}\n className={toolbarButtonVariants()}\n >\n {opts.icon}\n </button>\n );\n }\n\n return (\n <div\n role=\"toolbar\"\n aria-label={t('pdf.toolbarLabel')}\n className={toolbarVariants()}\n >\n {!minimal && (\n <>\n {renderButton({\n index: 0,\n label: t('pdf.previousPage'),\n disabled: prevDisabled,\n onActivate: onPrev,\n icon: (\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4 ds:rtl:rotate-180\"\n />\n ),\n })}\n\n {renderButton({\n index: 1,\n label: t('pdf.nextPage'),\n disabled: nextDisabled,\n onActivate: onNext,\n icon: (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4 ds:rtl:rotate-180\"\n />\n ),\n })}\n\n <input\n type=\"number\"\n min={1}\n max={Math.max(numPages, 1)}\n value={pageInput}\n onChange={(e) => setPageInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitPageInput();\n }\n }}\n onBlur={commitPageInput}\n onFocus={() => setFocusIndex(2)}\n ref={register(2) as (el: HTMLInputElement | null) => void}\n tabIndex={focusIndex === 2 ? 0 : -1}\n aria-label={t('pdf.currentPageInput')}\n className={pageInputVariants()}\n />\n\n <span\n aria-hidden=\"true\"\n className=\"type-body-sm ds:text-[var(--muted-foreground)]\"\n >\n {t('pdf.pageOf', { current: currentPage, total: numPages || 0 })}\n </span>\n\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-block ds:block-size-6 ds:inline-size-px ds:bg-[var(--border)] ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)]\"\n />\n </>\n )}\n\n {renderButton({\n index: zoomOutIndex,\n label: t('pdf.zoom.out'),\n onActivate: onZoomOut,\n icon: (\n <ZoomOut\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n ),\n })}\n\n {renderButton({\n index: zoomInIndex,\n label: t('pdf.zoom.in'),\n onActivate: onZoomIn,\n icon: (\n <ZoomIn\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n ),\n })}\n\n {!minimal && (\n <select\n aria-label={t('pdf.zoom.preset')}\n value={typeof zoom === 'number' ? String(zoom) : zoom}\n onChange={(e) => {\n const v = e.target.value;\n if (v === 'fit-width' || v === 'fit-page' || v === 'actual-size') {\n onZoomPreset(v);\n } else {\n const parsed = Number(v);\n if (Number.isFinite(parsed)) onZoomPreset(parsed);\n }\n }}\n ref={\n register(zoomSelectIndex) as (el: HTMLSelectElement | null) => void\n }\n tabIndex={focusIndex === zoomSelectIndex ? 0 : -1}\n onFocus={() => setFocusIndex(zoomSelectIndex)}\n onKeyDown={onToolbarKeyDown}\n className={zoomSelectVariants()}\n >\n <option value=\"fit-width\">{t('pdf.zoom.fitWidth')}</option>\n <option value=\"fit-page\">{t('pdf.zoom.fitPage')}</option>\n <option value=\"actual-size\">{t('pdf.zoom.actualSize')}</option>\n {ZOOM_PRESETS.filter(isNumberZoom).map((n) => (\n <option key={n} value={String(n)}>\n {`${Math.round(n * 100)}%`}\n </option>\n ))}\n </select>\n )}\n\n {!minimal && (\n <>\n <RadixPopover.Root\n open={searchOpen}\n onOpenChange={onSearchOpenChange}\n >\n <RadixPopover.Trigger asChild>\n {renderButton({\n index: 6,\n label: t('pdf.search.open'),\n onActivate: onOpenSearch,\n icon: (\n <Search\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n ),\n })}\n </RadixPopover.Trigger>\n <RadixPopover.Portal>\n <RadixPopover.Content\n sideOffset={8}\n className={[\n 'ds:z-[var(--z-popover)]',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:p-[var(--spacing-sm)]',\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n ].join(' ')}\n >\n <input\n type=\"search\"\n // eslint-disable-next-line jsx-a11y/no-autofocus -- focuses the search input when the toolbar opens to capture immediate typing\n autoFocus\n value={searchQuery}\n onChange={(e) => onSearchQueryChange(e.target.value)}\n placeholder={t('pdf.search.placeholder')}\n aria-label={t('pdf.search.placeholder')}\n className={pageInputVariants({\n className: 'ds:inline-size-[16rem] ds:text-start',\n })}\n />\n <span\n aria-live=\"polite\"\n className=\"type-meta ds:text-[var(--muted-foreground)]\"\n >\n {searchMatches.total > 0\n ? t('pdf.search.countOfTotal', {\n current: searchMatches.current,\n total: searchMatches.total,\n })\n : searchQuery\n ? t('pdf.search.noResults')\n : ''}\n </span>\n <RadixPopover.Close asChild>\n <button\n type=\"button\"\n aria-label={t('pdf.search.close')}\n className={toolbarButtonVariants()}\n >\n <X\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n </button>\n </RadixPopover.Close>\n </RadixPopover.Content>\n </RadixPopover.Portal>\n </RadixPopover.Root>\n\n {renderButton({\n index: 7,\n label: t('pdf.print'),\n onActivate: onPrint,\n icon: (\n <Printer\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n ),\n })}\n </>\n )}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* PDFPage — renders one canvas + text layer */\n/* ------------------------------------------------------------------ */\n\ninterface PDFPageProps {\n pageNumber: number;\n totalPages: number;\n doc: PDFDocumentProxy;\n zoom: PDFZoomPreset;\n pageRotation: PDFPageRotation | undefined;\n renderPageOverlay: ((args: PDFPageOverlayArgs) => ReactNode) | undefined;\n container: HTMLElement | null;\n resizeTick: number;\n shouldRender: boolean;\n registerRef: (el: HTMLElement | null) => void;\n searchQuery: string;\n onMatchCount: (count: number) => void;\n}\n\nfunction PDFPage(props: PDFPageProps): ReactNode {\n const {\n pageNumber,\n totalPages,\n doc,\n zoom,\n pageRotation,\n renderPageOverlay,\n container,\n resizeTick,\n shouldRender,\n registerRef,\n searchQuery,\n onMatchCount,\n } = props;\n const { t } = useTranslation('ui');\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const [dims, setDims] = useState<{ width: number; height: number }>({\n width: 612,\n height: 792,\n });\n const [pageProxy, setPageProxy] = useState<PDFPageProxy | null>(null);\n\n /* Get the page proxy once */\n useEffect(() => {\n let cancelled = false;\n doc.getPage(pageNumber).then((p) => {\n if (!cancelled) setPageProxy(p);\n });\n return () => {\n cancelled = true;\n };\n }, [doc, pageNumber]);\n\n /* Compute dimensions from viewport + zoom (+ optional rotation override) */\n useEffect(() => {\n if (!pageProxy) return;\n // `getViewport` accepts an optional `rotation` that overrides the\n // page's intrinsic `/Rotate`. Pass it through only when the\n // consumer set `pageRotation` explicitly so the default path\n // matches the previous behaviour byte-for-byte.\n const viewportOpts = (scale: number) =>\n pageRotation === undefined\n ? { scale }\n : { scale, rotation: pageRotation };\n const baseViewport = pageProxy.getViewport(viewportOpts(1));\n const scale = resolveScale(zoom, baseViewport, container);\n const scaled = pageProxy.getViewport(viewportOpts(scale));\n setDims({\n width: Math.floor(scaled.width),\n height: Math.floor(scaled.height),\n });\n }, [pageProxy, zoom, container, resizeTick, pageRotation]);\n\n // Derived (not stored) so the overlay receives the correct rotation\n // on the first render that has `pageProxy` — storing it as state\n // would force a second pass through the reconciler before the\n // overlay arg caught up. `pageRotation` (consumer override) wins;\n // otherwise the page's intrinsic `/Rotate` (read from\n // `pageProxy.rotate`). The `as unknown as { rotate?: number }`\n // narrow is needed because `pdfjs-dist`'s public types don't yet\n // expose `.rotate` on `PDFPageProxy` — TODO: remove the cast once\n // upstream types ship it.\n const effectiveRotation: PDFPageRotation =\n pageRotation ??\n (((pageProxy as unknown as { rotate?: number } | null)?.rotate ??\n 0) as PDFPageRotation);\n\n /* Render the canvas + text layer when shouldRender flips on */\n useEffect(() => {\n if (!pageProxy || !shouldRender) {\n // Release GPU memory if we've been culled.\n const canvas = canvasRef.current;\n if (canvas && !shouldRender) {\n canvas.width = 0;\n }\n return undefined;\n }\n\n const canvas = canvasRef.current;\n const textLayerEl = textLayerRef.current;\n if (!canvas) return undefined;\n const ctx = canvas.getContext('2d');\n if (!ctx) return undefined;\n\n const viewportOpts = (scale: number) =>\n pageRotation === undefined\n ? { scale }\n : { scale, rotation: pageRotation };\n const baseViewport = pageProxy.getViewport(viewportOpts(1));\n const scale = resolveScale(zoom, baseViewport, container);\n const viewport = pageProxy.getViewport(viewportOpts(scale));\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n\n canvas.width = Math.floor(viewport.width * dpr);\n canvas.height = Math.floor(viewport.height * dpr);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n\n const renderTask = pageProxy.render({\n canvas,\n canvasContext: ctx,\n viewport,\n });\n\n let cancelled = false;\n let textLayer: pdfjsLib.TextLayer | null = null;\n\n renderTask.promise\n .then(async () => {\n if (cancelled || !textLayerEl) return;\n // Clear prior runs before layering.\n textLayerEl.textContent = '';\n const textContent = await pageProxy.getTextContent();\n if (cancelled) return;\n textLayer = new pdfjsLib.TextLayer({\n textContentSource: textContent,\n container: textLayerEl,\n viewport,\n });\n await textLayer.render();\n // Highlight matches if a search query is active.\n highlightMatches(textLayerEl, searchQuery, onMatchCount);\n })\n .catch(() => {\n // Render cancelled mid-flight — nothing actionable.\n });\n\n return () => {\n cancelled = true;\n try {\n renderTask.cancel();\n } catch {\n /* ignore */\n }\n if (textLayer) {\n try {\n textLayer.cancel();\n } catch {\n /* ignore */\n }\n }\n };\n }, [\n pageProxy,\n shouldRender,\n zoom,\n container,\n resizeTick,\n searchQuery,\n onMatchCount,\n pageRotation,\n ]);\n\n /* Re-run highlight when search query changes without re-rendering */\n useEffect(() => {\n if (!shouldRender) return;\n const textLayerEl = textLayerRef.current;\n if (!textLayerEl) return;\n highlightMatches(textLayerEl, searchQuery, onMatchCount);\n }, [searchQuery, shouldRender, onMatchCount]);\n\n // Inline style — permitted per 23-constraints §Runtime-computed\n // dimensions (PDF.js page viewport × devicePixelRatio). Wrapper height\n // mirrors the canvas so scroll position stays stable even when the\n // page is culled.\n const canvasStyle: CSSProperties = {\n width: dims.width,\n height: dims.height,\n };\n const articleStyle: CSSProperties = {\n width: dims.width,\n height: dims.height,\n };\n\n return (\n <article\n ref={(el) => {\n registerRef(el);\n }}\n data-page-number={pageNumber}\n aria-label={t('pdf.pageOf', { current: pageNumber, total: totalPages })}\n className={pageArticleVariants()}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed PDF page dimensions\n style={articleStyle}\n >\n {/* eslint-disable-next-line react/forbid-dom-props -- runtime-computed canvas dimensions */}\n <canvas ref={canvasRef} style={canvasStyle} />\n <div\n ref={textLayerRef}\n aria-hidden=\"false\"\n className={[\n 'ds:absolute ds:inset-0',\n 'ds:overflow-hidden',\n 'ds:select-text',\n 'ds:opacity-100',\n 'ds:[&>span]:absolute ds:[&>span]:whitespace-pre',\n 'ds:[&>span]:text-transparent ds:[&>span]:origin-[0_0]',\n 'ds:[&_[data-match=true]]:bg-[color-mix(in_srgb,var(--warning)_35%,transparent)]',\n 'ds:[&_[data-match=current]]:bg-[color-mix(in_srgb,var(--warning)_60%,transparent)]',\n ].join(' ')}\n />\n {/* Consumer overlay layer — sits above canvas + text layer. Only */}\n {/* mounted while the page is inside the IntersectionObserver */}\n {/* buffer; unmounting tears down consumer-held timers / fetches */}\n {/* the same way the canvas releases GPU memory. Sized via the */}\n {/* article's `width`/`height` style, so it tracks zoom + rotation */}\n {/* without a per-page ResizeObserver. `pointer-events: auto` is */}\n {/* on so consumer children can be interactive while the text */}\n {/* layer underneath remains selectable (transparent text spans). */}\n {shouldRender && renderPageOverlay ? (\n <div\n // `role=\"group\"` + a translated `aria-label` give screen-reader\n // users a stable landmark when interactive overlays exist on a\n // page — without this, consumers' Buttons announce naked, with\n // no cue that they belong to the page above. The label is\n // translation-managed via the existing `pdf.*` namespace.\n role=\"group\"\n aria-label={t('pdf.pageOverlay', { page: pageNumber })}\n className=\"ds:absolute ds:inset-0 ds:pointer-events-auto\"\n data-pdf-page-overlay=\"\"\n data-page-number={pageNumber}\n >\n {renderPageOverlay({\n pageNumber,\n pageWidthCss: dims.width,\n pageHeightCss: dims.height,\n rotation: effectiveRotation,\n })}\n </div>\n ) : null}\n </article>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Search-highlight helper */\n/* ------------------------------------------------------------------ */\n\n// Diacritic-insensitive, case-folding normaliser — mirrors the one in\n// command-palette so \"cafe\" matches \"café\" in the text layer.\nfunction normaliseForSearch(value: string): string {\n return value\n .normalize('NFKD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLowerCase();\n}\n\nfunction highlightMatches(\n container: HTMLElement,\n query: string,\n onCount: (count: number) => void,\n): void {\n // Wipe prior highlights.\n const prior = container.querySelectorAll('[data-match]');\n prior.forEach((el) => {\n (el as HTMLElement).removeAttribute('data-match');\n });\n if (!query) {\n onCount(0);\n return;\n }\n const normalisedQuery = normaliseForSearch(query);\n if (!normalisedQuery) {\n onCount(0);\n return;\n }\n // Join span text into one stream so a query spanning wrapped spans still\n // matches, then mark every span overlapping a match range.\n const spans = Array.from(container.querySelectorAll<HTMLSpanElement>('span'));\n const ranges: Array<{ start: number; end: number }> = [];\n const chunks: string[] = [];\n let cursor = 0;\n for (const span of spans) {\n const text = normaliseForSearch(span.textContent ?? '');\n ranges.push({ start: cursor, end: cursor + text.length });\n chunks.push(text);\n cursor += text.length;\n }\n const joined = chunks.join('');\n let matchCount = 0;\n const matched = new Set<number>();\n let from = 0;\n while (from <= joined.length - normalisedQuery.length) {\n const found = joined.indexOf(normalisedQuery, from);\n if (found === -1) break;\n matchCount += 1;\n const matchEnd = found + normalisedQuery.length;\n for (let i = 0; i < ranges.length; i++) {\n const { start, end } = ranges[i];\n if (start < matchEnd && end > found) matched.add(i);\n }\n from = matchEnd;\n }\n matched.forEach((i) => {\n spans[i].setAttribute('data-match', 'true');\n });\n onCount(matchCount);\n}\n\nexport { toolbarButtonVariants, toolbarVariants, wrapperVariants };\n"],"names":["pdfViewerAgent","handle","args","pdfjsLib","pdfjsWorkerUrl","wrapperVariants","cva","toolbarVariants","toolbarButtonVariants","pageInputVariants","zoomSelectVariants","pagesContainerVariants","pageArticleVariants","ZOOM_PRESETS","isNumberZoom","z","resolveScale","zoom","viewport","container","style","padX","padY","availW","availH","baseW","baseH","PDFViewer","forwardRef","id","src","initialPage","initialZoom","pageRotation","renderPageOverlay","onPageChange","onLoadComplete","onError","toolbar","toolbarVariant","ariaLabel","className","ref","t","useTranslation","rawId","useId","viewerId","useMemo","isRtl","setIsRtl","useState","reducedMotion","setReducedMotion","useEffect","mql","sync","loaded","setLoaded","loadError","setLoadError","currentPage","setCurrentPage","setZoomState","visibleRange","setVisibleRange","announcement","setAnnouncement","searchOpen","setSearchOpen","searchQuery","setSearchQuery","searchMatches","setSearchMatches","onPageChangeRef","useRef","onLoadCompleteRef","onErrorRef","loadedRef","cancelled","baseOptions","task","doc","title","meta","info","next","_a","err","error","prev","pagesContainerRef","pageArticleRefs","goToPage","useCallback","page","clamped","article","setZoom","internalPrint","search","query","agentStateRef","agentHandle","useImperativeHandle","useAgentRegistration","handleViewerKeyDown","event","mod","currentPageRef","visibility","observer","entries","entry","pageAttr","n","best","bestRatio","minVisible","maxVisible","ratio","el","containerSizeTick","setContainerSizeTick","ro","v","toolbarButtonsRef","toolbarFocusIndex","setToolbarFocusIndex","registerToolbarButton","index","focusToolbarButton","btn","toolbarCount","handleToolbarKeyDown","forward","backward","jsx","Alert","jsxs","PDFToolbar","p","_","i","pageNumber","PDFPage","count","Spinner","props","variant","numPages","onPrev","onNext","onJump","onZoomIn","onZoomOut","onZoomPreset","onOpenSearch","onPrint","onSearchOpenChange","onSearchQueryChange","register","focusIndex","setFocusIndex","onToolbarKeyDown","minimal","zoomOutIndex","zoomInIndex","zoomSelectIndex","pageInput","setPageInput","prevDisabled","nextDisabled","commitPageInput","parsed","renderButton","opts","Fragment","ChevronLeft","ChevronRight","e","ZoomOut","ZoomIn","RadixPopover","Search","X","Printer","totalPages","resizeTick","shouldRender","registerRef","onMatchCount","canvasRef","textLayerRef","dims","setDims","pageProxy","setPageProxy","viewportOpts","scale","baseViewport","scaled","effectiveRotation","canvas","textLayerEl","ctx","dpr","renderTask","textLayer","textContent","highlightMatches","canvasStyle","articleStyle","normaliseForSearch","value","onCount","normalisedQuery","spans","ranges","chunks","cursor","span","text","joined","matchCount","matched","from","found","matchEnd","start","end"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"phone-input-DxkHMYmu.js","sources":["../../src/components/phone-input/phone-input.agent.ts","../../src/components/phone-input/phone-input.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — PhoneInput. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { PhoneInputHandle } from './phone-input';\n\nexport const phoneInputAgent: AgentAdapter<PhoneInputHandle> = {\n id: 'phone-input',\n // A phone number is a single form value, not free-form rich text — `set_value`\n // (not `edit_inline`, which is reserved for in-place rich/cell editing).\n capabilities: ['set_value'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.phoneInput.state.value',\n description:\n 'Current E.164 phone number, or empty string when not yet valid.',\n read: (handle) => handle.getValue(),\n },\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.phoneInput.state.isEmpty',\n description: 'Whether the input has no value.',\n read: (handle) => handle.getValue() === '',\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description:\n 'Phone number in E.164 or national format; the parser infers the country.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.phoneInput.actions.setValue',\n description:\n 'Replace the phone number (E.164 or national format; parser will infer country).',\n examples: [\n { args: { value: '+393331234567' }, note: 'Set an Italian mobile.' },\n ],\n invoke: (handle, args: { value: string }) => {\n handle.setValue(args.value);\n },\n },\n clear: {\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.phoneInput.actions.clear',\n description: 'Empty the input. Loses any typed value.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n focus: {\n safety: 'read',\n descriptionKey: 'ui.agent.phoneInput.actions.focus',\n description: 'Move keyboard focus to the phone-number input.',\n invoke: (handle) => {\n handle.focus();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'phone-input',\n description: 'Marks the PhoneInput wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type FocusEvent,\n} from 'react';\nimport { useAgentRegistration } from '../../agent';\nimport { phoneInputAgent } from './phone-input.agent';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { useDomValue } from '../_shared/use-dom-value';\n\n/** Agent-readiness curated handle for PhoneInput. */\nexport interface PhoneInputHandle {\n getValue: () => string;\n setValue: (value: string) => void;\n clear: () => void;\n focus: () => void;\n}\nimport * as Popover from '@radix-ui/react-popover';\nimport { Command, defaultFilter } from 'cmdk';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport {\n AsYouType,\n getCountries,\n getCountryCallingCode,\n parsePhoneNumberFromString,\n type CountryCode,\n} from 'libphonenumber-js/min';\nimport {\n FormFieldContext,\n useFormField,\n useFormFieldControlId,\n} from '../form-field/form-field-context';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { normalizeDiacritics } from '../_shared/normalize-diacritics';\nimport { MENU_ROW_HIGHLIGHT } from '../_shared/menu-row';\nimport { Flag } from '../flag';\n\nexport interface PhoneInputChangeMeta {\n country: CountryCode;\n isValid: boolean;\n isPossible: boolean;\n type?: string;\n}\n\nexport interface PhoneInputProps {\n value?: string;\n defaultValue?: string;\n /**\n * Country pre-selected when no value is supplied. Defaults to `IT`\n * (AlfaDocs's dominant user base is Italian). Pass a different\n * `CountryCode` to override, or enable `detectBrowserCountry` to\n * derive it from the browser locale.\n */\n defaultCountry?: CountryCode;\n /**\n * When true, infer the default country from `navigator.language` /\n * `Intl.Locale` before falling back to `defaultCountry` (or `IT`).\n * Off by default — most AlfaDocs flows should stay on IT regardless\n * of the visitor's browser locale.\n */\n detectBrowserCountry?: boolean;\n onChange?: (e164: string, meta: PhoneInputChangeMeta) => void;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n popularCountries?: CountryCode[];\n /**\n * Restrict the country picker to this set (ISO 3166-1 alpha-2 codes), in\n * the order given. Unsupported or duplicate codes are dropped; an empty /\n * all-invalid list is ignored (every country stays selectable).\n * `popularCountries` is intersected with this set. When the list resolves\n * to a single country the picker collapses to a fixed, non-interactive\n * dial code — only the national-number field stays editable.\n */\n allowedCountries?: CountryCode[];\n className?: string;\n id?: string;\n name?: string;\n /**\n * What `name` posts in a native form. `national` (the default) posts the\n * number field's own text, e.g. `333 123 4567`. `e164` posts the full\n * number from a hidden field instead, e.g. `+393331234567`: the string\n * `onChange` reports, so it is empty while the text is not yet a number.\n */\n nameFormat?: 'national' | 'e164';\n required?: boolean;\n /**\n * Fires once when focus has left the whole control. Moving between the\n * country picker and the number field does not fire it. It takes no\n * event: the control has several parts, so there is no single target.\n */\n onBlur?: () => void;\n 'aria-label'?: string;\n}\n\nconst phoneInputWrapperVariants = cva(\n [\n 'ds:group ds:relative ds:inline-flex ds:items-stretch ds:w-full',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--control-border)] ds:bg-input',\n 'ds:shadow-[var(--shadow-input)]',\n 'ds:text-foreground',\n 'ds:transition-[colors,box-shadow] ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n /* The ring is for the number field only. The country button draws its\n own, and `focus-within` here would draw a second one around it. */\n 'ds:has-[input:focus]:outline-[length:var(--focus-ring-width)] ds:has-[input:focus]:outline-solid',\n 'ds:has-[input:focus]:outline-ring ds:has-[input:focus]:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:has-[input:focus]:outline-[CanvasText]',\n 'ds:has-[:disabled]:cursor-not-allowed ds:has-[:disabled]:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-8 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-[var(--min-target-size)] ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: '',\n error: 'ds:border-destructive ds:has-[input:focus]:outline-destructive',\n },\n },\n defaultVariants: {\n size: 'md',\n tone: 'default',\n },\n },\n);\n\nconst countryTriggerVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:bg-transparent ds:text-foreground',\n 'ds:border-0 ds:border-e ds:border-e-border',\n 'ds:rounded-s-[var(--radius-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted',\n 'ds:focus:outline-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:ps-3 ds:pe-2',\n md: 'ds:ps-3 ds:pe-2',\n lg: 'ds:ps-4 ds:pe-3',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst phoneNumberInputVariants = cva(\n [\n 'ds:flex-1 ds:min-w-0 ds:bg-transparent ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:border-0 ds:outline-none',\n 'ds:disabled:cursor-not-allowed',\n 'ds:read-only:cursor-default',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:ps-2 ds:pe-3 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:ps-2 ds:pe-3 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:ps-3 ds:pe-4 ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst pickerContentClasses = [\n 'ds:z-[var(--z-popover)] ds:overflow-hidden ds:w-72',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-background ds:text-foreground',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:data-[state=closed]:zoom-out-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2',\n 'ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:animate-none',\n].join(' ');\n\nconst pickerSearchClasses = [\n 'ds:w-full ds:bg-transparent ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:border-0 ds:border-b ds:border-b-border ds:outline-none',\n 'ds:ps-3 ds:pe-3 ds:py-2 ds:text-[var(--font-size-sm)]',\n 'ds:focus:outline-none',\n].join(' ');\n\nconst pickerListClasses =\n 'ds:max-h-72 ds:overflow-y-auto ds:p-[var(--spacing-xs)]';\n\nconst pickerItemClasses = [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)] ds:ps-3 ds:pe-3 ds:py-2 ds:text-[var(--font-size-sm)]',\n 'ds:text-foreground ds:outline-none ds:select-none',\n MENU_ROW_HIGHLIGHT.selected,\n].join(' ');\n\nconst pickerGroupHeadingClasses = [\n 'ds:ps-3 ds:pe-3 ds:py-1.5',\n 'type-eyebrow ds:text-muted-foreground',\n].join(' ');\n\nconst pickerEmptyClasses =\n 'ds:ps-3 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground';\n\nconst chevronSizeBySize = {\n sm: 'ds:size-3.5',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n} as const;\n\nconst flagSizeBySize = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n} as const satisfies Record<'sm' | 'md' | 'lg', 'sm' | 'md' | 'lg'>;\n\nfunction countDigitsBefore(str: string, position: number): number {\n let digits = 0;\n for (let i = 0; i < position && i < str.length; i++) {\n if (str[i] >= '0' && str[i] <= '9') digits++;\n }\n return digits;\n}\n\nfunction positionAfterDigits(str: string, targetDigits: number): number {\n if (targetDigits === 0) return 0;\n let count = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] >= '0' && str[i] <= '9') {\n count++;\n if (count === targetDigits) return i + 1;\n }\n }\n return str.length;\n}\n\nfunction resolveDefaultCountry(\n explicit: CountryCode | undefined,\n supported: Set<string>,\n detectBrowser: boolean,\n locale: string,\n allowedList: CountryCode[] | null,\n): CountryCode {\n const allowed =\n allowedList && allowedList.length ? new Set<string>(allowedList) : null;\n const ok = (code: string) =>\n supported.has(code) && (!allowed || allowed.has(code));\n\n if (explicit && ok(explicit)) return explicit;\n\n if (detectBrowser) {\n const fromNavigator =\n typeof navigator !== 'undefined' ? navigator.language : undefined;\n if (fromNavigator) {\n const match = fromNavigator.match(/-([A-Za-z]{2})/);\n if (match) {\n const candidate = match[1].toUpperCase();\n if (ok(candidate)) return candidate as CountryCode;\n }\n }\n\n try {\n const region = new Intl.Locale(locale).region;\n if (region && ok(region.toUpperCase())) {\n return region.toUpperCase() as CountryCode;\n }\n } catch {\n // Intl.Locale may throw on malformed BCP-47 — fall through.\n }\n }\n\n // A restricted list with no explicit / detected hit defaults to the\n // consumer's first listed country; otherwise AlfaDocs's Italian-first\n // fallback.\n if (allowed) return allowedList![0];\n return 'IT';\n}\n\ninterface CountryRow {\n code: CountryCode;\n name: string;\n dialCode: string;\n}\n\nfunction buildCountryRows(\n locale: string,\n countries: CountryCode[],\n): CountryRow[] {\n let displayNames: Intl.DisplayNames;\n try {\n displayNames = new Intl.DisplayNames([locale], { type: 'region' });\n } catch {\n displayNames = new Intl.DisplayNames(['en'], { type: 'region' });\n }\n const rows = countries.map<CountryRow>((code) => ({\n code,\n name: displayNames.of(code) ?? code,\n dialCode: getCountryCallingCode(code),\n }));\n const collator = new Intl.Collator(locale);\n return rows.sort((a, b) => collator.compare(a.name, b.name));\n}\n\nexport const PhoneInput = forwardRef<HTMLInputElement, PhoneInputProps>(\n function PhoneInput(\n {\n value,\n defaultValue,\n defaultCountry,\n detectBrowserCountry = false,\n onChange,\n size = 'md',\n tone = 'default',\n disabled,\n readOnly,\n placeholder,\n popularCountries,\n allowedCountries,\n className,\n id,\n name,\n nameFormat = 'national',\n required,\n onBlur,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t, i18n } = useTranslation('ui');\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n\n const supportedCountries = useMemo(\n () => new Set(getCountries() as string[]),\n [],\n );\n\n // Consumer-restricted country set, filtered to supported + deduped with\n // order preserved. `null` means \"no restriction\" (every country shown).\n const allowedList = useMemo<CountryCode[] | null>(() => {\n if (!allowedCountries || allowedCountries.length === 0) return null;\n const seen = new Set<string>();\n const filtered = allowedCountries.filter((code) => {\n if (!supportedCountries.has(code) || seen.has(code)) return false;\n seen.add(code);\n return true;\n });\n return filtered.length > 0 ? filtered : null;\n }, [allowedCountries, supportedCountries]);\n\n // A single allowed country has nothing to pick — render the dial code as a\n // fixed, non-interactive prefix instead of a one-item picker.\n const isCountryFixed = allowedList !== null && allowedList.length === 1;\n\n const initialState = useMemo(() => {\n const resolvedCountry = resolveDefaultCountry(\n defaultCountry,\n supportedCountries,\n detectBrowserCountry,\n i18n.language,\n allowedList,\n );\n const raw = value ?? defaultValue;\n if (raw) {\n const parsed = parsePhoneNumberFromString(raw);\n if (parsed?.country) {\n // Clamp the parsed country to `allowedCountries` so the rendered dial\n // code can never leave the allowed set — a single-country lock stays\n // on its country even when handed an off-set value.\n if (!allowedList || allowedList.includes(parsed.country)) {\n return {\n country: parsed.country,\n display: parsed.formatNational(),\n pinned: true,\n };\n }\n return {\n country: resolvedCountry,\n display: new AsYouType(resolvedCountry).input(\n parsed.nationalNumber,\n ),\n pinned: true,\n };\n }\n return { country: resolvedCountry, display: raw, pinned: false };\n }\n return { country: resolvedCountry, display: '', pinned: false };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [country, setCountry] = useState<CountryCode>(initialState.country);\n const [displayValue, setDisplayValue] = useState<string>(\n initialState.display,\n );\n const [pickerOpen, setPickerOpen] = useState(false);\n const [pickerSearch, setPickerSearch] = useState('');\n\n const isControlled = value !== undefined;\n const lastEmittedRef = useRef<string>('');\n const pendingCaretRef = useRef<number | null>(null);\n // Pins the country once the user (or an incoming value) selects one,\n // so the locale-flip effect below stops re-resolving.\n const userSelectedCountryRef = useRef(initialState.pinned);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const composedInputRef = composeRefs(ref, inputRef);\n // The number is written to the input's DOM property, never to its\n // `value` attribute, where a copied outerHTML or a session replay\n // could read it. Declared before the caret effect below, which places\n // the caret in the text this one writes.\n const syncDisplay = useDomValue(inputRef, displayValue);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const pickerContentRef = useRef<HTMLDivElement | null>(null);\n\n // Re-resolve the country when i18n.language flips from the bootstrap\n // fallback to the real locale on first paint, unless the user has\n // already pinned a country.\n useEffect(() => {\n if (userSelectedCountryRef.current) return;\n const next = resolveDefaultCountry(\n defaultCountry,\n supportedCountries,\n detectBrowserCountry,\n i18n.language,\n allowedList,\n );\n setCountry((prev) => (prev === next ? prev : next));\n }, [\n i18n.language,\n defaultCountry,\n supportedCountries,\n detectBrowserCountry,\n allowedList,\n ]);\n\n // Sync state back from a controlled `value` prop change that did not\n // originate from this component (e.g. parent reset). Skip the sync when\n // the incoming value matches what we just emitted.\n useEffect(() => {\n if (!isControlled) return;\n const current = value ?? '';\n if (current === lastEmittedRef.current) return;\n if (current === '') {\n setDisplayValue('');\n return;\n }\n const parsed = parsePhoneNumberFromString(current);\n if (\n parsed?.country &&\n (!allowedList || allowedList.includes(parsed.country))\n ) {\n userSelectedCountryRef.current = true;\n setCountry(parsed.country);\n setDisplayValue(parsed.formatNational());\n } else {\n // Off-set or unparseable controlled value — keep the country within the\n // allowed set; only sync the displayed digits.\n setDisplayValue(parsed ? parsed.formatNational() : current);\n }\n }, [value, isControlled, allowedList]);\n\n useIsomorphicLayoutEffect(() => {\n if (pendingCaretRef.current == null) return;\n const pos = pendingCaretRef.current;\n pendingCaretRef.current = null;\n const node = inputRef.current;\n if (node && document.activeElement === node) {\n node.setSelectionRange(pos, pos);\n }\n });\n\n const emit = useCallback(\n (nextDisplay: string, nextCountry: CountryCode) => {\n const parsed = parsePhoneNumberFromString(nextDisplay, nextCountry);\n const e164 = parsed?.number ?? '';\n lastEmittedRef.current = e164;\n onChange?.(e164, {\n country: nextCountry,\n isValid: parsed?.isValid() ?? false,\n isPossible: parsed?.isPossible() ?? false,\n type: parsed?.getType(),\n });\n },\n [onChange],\n );\n\n const controlId = useFormFieldControlId(ctx, id);\n const inputId = id ?? (inFormField ? controlId : undefined);\n const effectiveDisabled =\n (inFormField ? ctx.disabled : false) || Boolean(disabled);\n const effectiveRequired =\n (inFormField ? ctx.required : false) || Boolean(required);\n const effectiveInvalid = inFormField ? ctx.invalid : false;\n const effectiveTone = effectiveInvalid ? 'error' : tone;\n const describedBy =\n inFormField && ctx.describedBy ? ctx.describedBy : undefined;\n\n const resolvedPlaceholder =\n placeholder ?? t('inputs.phone.placeholder', 'Phone number');\n\n /* Focus leaving the whole control. The picker is portalled, so it is\n outside the wrapper in the DOM but still part of the control. */\n const onBlurRef = useRef(onBlur);\n onBlurRef.current = onBlur;\n const focusInsideRef = useRef(false);\n const pressInsideRef = useRef(false);\n const isInside = useCallback(\n (node: EventTarget | null) =>\n node instanceof Node &&\n Boolean(\n wrapperRef.current?.contains(node) ||\n pickerContentRef.current?.contains(node),\n ),\n [],\n );\n const leave = useCallback(() => {\n if (!focusInsideRef.current) return;\n focusInsideRef.current = false;\n onBlurRef.current?.();\n }, []);\n const handleFocus = () => {\n focusInsideRef.current = true;\n };\n const handleBlur = (event: FocusEvent<HTMLDivElement>) => {\n const next = event.relatedTarget;\n if (isInside(next)) return;\n /* Safari does not focus a button on click: pressing the country\n button blurs the number field to nowhere. */\n if (next === null && pressInsideRef.current) return;\n leave();\n };\n const listensForBlur = onBlur !== undefined;\n useEffect(() => {\n if (!listensForBlur) return;\n let check: number | undefined;\n const onPointerDown = (event: PointerEvent) => {\n pressInsideRef.current = isInside(event.target);\n if (pressInsideRef.current) return;\n /* A press outside closes the picker, and its focused search box\n can unmount without a blur event. */\n check = window.setTimeout(() => {\n if (!isInside(document.activeElement)) leave();\n }, 0);\n };\n const onPointerUp = () => {\n pressInsideRef.current = false;\n };\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('pointerup', onPointerUp, true);\n document.addEventListener('pointercancel', onPointerUp, true);\n return () => {\n window.clearTimeout(check);\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('pointerup', onPointerUp, true);\n document.removeEventListener('pointercancel', onPointerUp, true);\n };\n }, [listensForBlur, isInside, leave]);\n\n const postsE164 = nameFormat === 'e164' && name !== undefined;\n const e164Value = postsE164\n ? (parsePhoneNumberFromString(displayValue, country)?.number ?? '')\n : '';\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n // A keystroke the formatter drops (or a read-only field refuses)\n // leaves the text as it was, so no render follows: ask for one, to\n // take the refused character out.\n syncDisplay();\n if (readOnly) return;\n const target = event.target;\n const raw = target.value;\n const caret = target.selectionStart ?? raw.length;\n const digitsBefore = countDigitsBefore(raw, caret);\n\n const formatter = new AsYouType(country);\n const formatted = formatter.input(raw);\n\n pendingCaretRef.current = positionAfterDigits(formatted, digitsBefore);\n setDisplayValue(formatted);\n emit(formatted, country);\n };\n\n const lastEmittedRefForHandle = lastEmittedRef;\n const agentHandle = useMemo<PhoneInputHandle>(\n () => ({\n getValue: () => lastEmittedRefForHandle.current,\n setValue: (next) => {\n if (next === '') {\n setDisplayValue('');\n emit('', country);\n return;\n }\n const parsed = parsePhoneNumberFromString(next);\n if (parsed?.country) {\n userSelectedCountryRef.current = true;\n setCountry(parsed.country);\n setDisplayValue(parsed.formatNational());\n emit(parsed.formatNational(), parsed.country);\n } else {\n const formatter = new AsYouType(country);\n const formatted = formatter.input(next);\n setDisplayValue(formatted);\n emit(formatted, country);\n }\n },\n clear: () => {\n setDisplayValue('');\n emit('', country);\n },\n focus: () => inputRef.current?.focus(),\n }),\n [country, emit, lastEmittedRefForHandle],\n );\n useAgentRegistration(phoneInputAgent, agentHandle, id);\n\n const handleCountrySelect = (nextCountry: CountryCode) => {\n if (nextCountry === country) {\n setPickerOpen(false);\n return;\n }\n const digits = displayValue.replace(/\\D/g, '');\n const formatter = new AsYouType(nextCountry);\n const reformatted = digits ? formatter.input(digits) : '';\n userSelectedCountryRef.current = true;\n setCountry(nextCountry);\n setDisplayValue(reformatted);\n setPickerOpen(false);\n setPickerSearch('');\n emit(reformatted, nextCountry);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n };\n\n const countryRows = useMemo(\n () =>\n buildCountryRows(\n i18n.language,\n allowedList ?? (Array.from(supportedCountries) as CountryCode[]),\n ),\n [i18n.language, supportedCountries, allowedList],\n );\n\n const popularRows = useMemo(() => {\n if (!popularCountries || popularCountries.length === 0) return [];\n const byCode = new Map(countryRows.map((row) => [row.code, row]));\n return popularCountries\n .filter((code): code is CountryCode => supportedCountries.has(code))\n .map((code) => byCode.get(code))\n .filter((row): row is CountryRow => Boolean(row));\n }, [popularCountries, countryRows, supportedCountries]);\n\n const popularCodes = useMemo(\n () => new Set(popularRows.map((row) => row.code)),\n [popularRows],\n );\n\n const remainingRows = useMemo(\n () =>\n popularCodes.size > 0\n ? countryRows.filter((row) => !popularCodes.has(row.code))\n : countryRows,\n [countryRows, popularCodes],\n );\n\n const selected = useMemo(\n () => countryRows.find((row) => row.code === country),\n [countryRows, country],\n );\n const selectedDialCode = selected ? selected.dialCode : '';\n const selectedName = selected ? selected.name : country;\n\n const triggerLabel = t('inputs.phone.countryPickerLabel', 'Country');\n const triggerAccessibleName = `${triggerLabel}: ${selectedName}, +${selectedDialCode}`;\n\n const filterFn = useCallback(\n (candidate: string, searchStr: string, keywords?: string[]) => {\n const normalizedCandidate = normalizeDiacritics(candidate);\n const normalizedSearch = normalizeDiacritics(searchStr);\n const normalizedKeywords = keywords?.map(normalizeDiacritics);\n return defaultFilter(\n normalizedCandidate,\n normalizedSearch,\n normalizedKeywords,\n );\n },\n [],\n );\n\n const renderRow = (row: CountryRow) => {\n const accessibleLabel = `${row.name}, +${row.dialCode}`;\n return (\n <Command.Item\n key={row.code}\n value={row.code}\n keywords={[row.name, row.dialCode, `+${row.dialCode}`]}\n onSelect={() => handleCountrySelect(row.code)}\n className={pickerItemClasses}\n aria-label={accessibleLabel}\n >\n <Flag country={row.code} size={flagSizeBySize[size]} />\n <span className=\"ds:flex-1 ds:truncate\">{row.name}</span>\n <bdi dir=\"ltr\" className=\"ds:text-muted-foreground ds:tabular-nums\">\n +{row.dialCode}\n </bdi>\n </Command.Item>\n );\n };\n\n return (\n <div\n ref={wrapperRef}\n onFocus={handleFocus}\n onBlur={handleBlur}\n data-component=\"phone-input\"\n data-component-id={id}\n data-slot=\"phone-input\"\n className={phoneInputWrapperVariants({\n size,\n tone: effectiveTone,\n className,\n })}\n >\n {isCountryFixed ? (\n <span\n data-slot=\"phone-country-fixed\"\n className={`${countryTriggerVariants({ size })} ds:cursor-default ds:hover:bg-transparent`}\n >\n <span className=\"ds:sr-only\">{`${triggerLabel}: ${selectedName}`}</span>\n <Flag country={country} size={flagSizeBySize[size]} />\n <bdi dir=\"ltr\" className=\"ds:tabular-nums\">\n +{selectedDialCode}\n </bdi>\n </span>\n ) : (\n <Popover.Root open={pickerOpen} onOpenChange={setPickerOpen}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n disabled={effectiveDisabled}\n // What opens is a dialog: a search box over the list.\n aria-haspopup=\"dialog\"\n aria-expanded={pickerOpen}\n aria-label={triggerAccessibleName}\n className={countryTriggerVariants({ size })}\n >\n <Flag country={country} size={flagSizeBySize[size]} />\n <bdi dir=\"ltr\" className=\"ds:tabular-nums\">\n +{selectedDialCode}\n </bdi>\n <ChevronDown\n aria-hidden=\"true\"\n className={[\n chevronSizeBySize[size],\n 'ds:shrink-0 ds:text-muted-foreground',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n pickerOpen ? 'ds:rotate-180' : '',\n ].join(' ')}\n />\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n ref={pickerContentRef}\n sideOffset={6}\n align=\"start\"\n // Radix gives the content role=\"dialog\" with no name.\n aria-label={triggerLabel}\n className={pickerContentClasses}\n >\n <Command\n filter={filterFn}\n shouldFilter\n loop\n label={triggerLabel}\n >\n <Command.Input\n asChild\n value={pickerSearch}\n onValueChange={setPickerSearch}\n >\n <input\n data-phone-country-search=\"true\"\n type=\"text\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n placeholder={t(\n 'inputs.phone.searchCountry',\n 'Search countries…',\n )}\n className={pickerSearchClasses}\n />\n </Command.Input>\n <Command.List className={pickerListClasses}>\n <Command.Empty className={pickerEmptyClasses}>\n {t('inputs.phone.noCountryFound', 'No country found')}\n </Command.Empty>\n {popularRows.length > 0 ? (\n <Command.Group\n heading={\n <span className={pickerGroupHeadingClasses}>\n {t('inputs.phone.popularCountries', 'Popular')}\n </span>\n }\n >\n {popularRows.map(renderRow)}\n </Command.Group>\n ) : null}\n <Command.Group\n heading={\n popularRows.length > 0 ? (\n <span className={pickerGroupHeadingClasses}>\n {t('inputs.phone.allCountries', 'All countries')}\n </span>\n ) : undefined\n }\n >\n {remainingRows.map(renderRow)}\n </Command.Group>\n </Command.List>\n </Command>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )}\n <input\n ref={composedInputRef}\n id={inputId}\n name={postsE164 ? undefined : name}\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel-national\"\n placeholder={resolvedPlaceholder}\n disabled={effectiveDisabled}\n readOnly={readOnly}\n required={effectiveRequired}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n onChange={handleInputChange}\n className={phoneNumberInputVariants({ size })}\n />\n {postsE164 ? (\n <input\n type=\"hidden\"\n name={name}\n value={e164Value}\n disabled={effectiveDisabled}\n />\n ) : null}\n </div>\n );\n },\n);\n\nPhoneInput.displayName = 'PhoneInput';\n\nexport {\n phoneInputWrapperVariants,\n countryTriggerVariants,\n phoneNumberInputVariants,\n};\n"],"names":["phoneInputAgent","handle","args","phoneInputWrapperVariants","cva","countryTriggerVariants","phoneNumberInputVariants","pickerContentClasses","pickerSearchClasses","pickerListClasses","pickerItemClasses","MENU_ROW_HIGHLIGHT","pickerGroupHeadingClasses","pickerEmptyClasses","chevronSizeBySize","flagSizeBySize","countDigitsBefore","str","position","digits","i","positionAfterDigits","targetDigits","count","resolveDefaultCountry","explicit","supported","detectBrowser","locale","allowedList","allowed","ok","code","fromNavigator","match","candidate","region","buildCountryRows","countries","displayNames","rows","getCountryCallingCode","collator","a","b","PhoneInput","forwardRef","value","defaultValue","defaultCountry","detectBrowserCountry","onChange","size","tone","disabled","readOnly","placeholder","popularCountries","allowedCountries","className","id","name","nameFormat","required","onBlur","ariaLabel","ref","t","i18n","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","supportedCountries","useMemo","getCountries","seen","filtered","isCountryFixed","initialState","resolvedCountry","raw","parsed","parsePhoneNumberFromString","AsYouType","country","setCountry","useState","displayValue","setDisplayValue","pickerOpen","setPickerOpen","pickerSearch","setPickerSearch","isControlled","lastEmittedRef","useRef","pendingCaretRef","userSelectedCountryRef","inputRef","composedInputRef","composeRefs","syncDisplay","useDomValue","wrapperRef","pickerContentRef","useEffect","next","prev","current","useIsomorphicLayoutEffect","pos","node","emit","useCallback","nextDisplay","nextCountry","e164","controlId","useFormFieldControlId","inputId","effectiveDisabled","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","resolvedPlaceholder","onBlurRef","focusInsideRef","pressInsideRef","isInside","_a","_b","leave","handleFocus","handleBlur","event","listensForBlur","check","onPointerDown","onPointerUp","postsE164","e164Value","handleInputChange","target","caret","digitsBefore","formatted","lastEmittedRefForHandle","agentHandle","useAgentRegistration","handleCountrySelect","formatter","reformatted","countryRows","popularRows","byCode","row","popularCodes","remainingRows","selected","selectedDialCode","selectedName","triggerLabel","triggerAccessibleName","filterFn","searchStr","keywords","normalizedCandidate","normalizeDiacritics","normalizedSearch","normalizedKeywords","defaultFilter","renderRow","accessibleLabel","jsxs","Command","jsx","Flag","Popover","ChevronDown"],"mappings":"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"}