@alfadocs/ui-kit-debug 0.31.0 → 0.31.3

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 (529) hide show
  1. package/dist/_chunks/{accordion-CNcodXuO.js → accordion-bSU21uTV.js} +3 -3
  2. package/dist/_chunks/{accordion-CNcodXuO.js.map → accordion-bSU21uTV.js.map} +1 -1
  3. package/dist/_chunks/{agenda-card-DO9_yogb.js → agenda-card-UJA6Arbs.js} +3 -3
  4. package/dist/_chunks/{agenda-card-DO9_yogb.js.map → agenda-card-UJA6Arbs.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-WLbfMip6.js → agenda-tray-1fAxNOMz.js} +4 -4
  6. package/dist/_chunks/{agenda-tray-WLbfMip6.js.map → agenda-tray-1fAxNOMz.js.map} +1 -1
  7. package/dist/_chunks/{ai-prompt-input-BXlwNnWe.js → ai-prompt-input-C6sCr1Vi.js} +11 -10
  8. package/dist/_chunks/ai-prompt-input-C6sCr1Vi.js.map +1 -0
  9. package/dist/_chunks/{alia-sidebar-C-232sD7.js → alia-sidebar-BEoMl6UL.js} +9 -9
  10. package/dist/_chunks/{alia-sidebar-C-232sD7.js.map → alia-sidebar-BEoMl6UL.js.map} +1 -1
  11. package/dist/_chunks/ar-CEpIJtcO.js +399 -0
  12. package/dist/_chunks/ar-CEpIJtcO.js.map +1 -0
  13. package/dist/_chunks/{audio-recorder-DL800PE_.js → audio-recorder-C1rhKhSN.js} +114 -114
  14. package/dist/_chunks/audio-recorder-C1rhKhSN.js.map +1 -0
  15. package/dist/_chunks/audio-visualiser-l6zPd0AG.js +162 -0
  16. package/dist/_chunks/audio-visualiser-l6zPd0AG.js.map +1 -0
  17. package/dist/_chunks/{autocomplete-CUh0f7Dj.js → autocomplete-DIgdhCGJ.js} +2 -2
  18. package/dist/_chunks/{autocomplete-CUh0f7Dj.js.map → autocomplete-DIgdhCGJ.js.map} +1 -1
  19. package/dist/_chunks/{avatar-D_H4emLo.js → avatar-BNQNhoyL.js} +19 -18
  20. package/dist/_chunks/avatar-BNQNhoyL.js.map +1 -0
  21. package/dist/_chunks/{badge-CIjQ1Us1.js → badge-CptERaHx.js} +2 -2
  22. package/dist/_chunks/{badge-CIjQ1Us1.js.map → badge-CptERaHx.js.map} +1 -1
  23. package/dist/_chunks/{booking-Bhk9IYm3.js → booking-A4o9xI2n.js} +160 -149
  24. package/dist/_chunks/booking-A4o9xI2n.js.map +1 -0
  25. package/dist/_chunks/{breadcrumb--YI7lcHA.js → breadcrumb-CLlhx7qo.js} +2 -2
  26. package/dist/_chunks/{breadcrumb--YI7lcHA.js.map → breadcrumb-CLlhx7qo.js.map} +1 -1
  27. package/dist/_chunks/{button-group-Bh2g_Ng-.js → button-group-Ciq6J4IW.js} +15 -14
  28. package/dist/_chunks/button-group-Ciq6J4IW.js.map +1 -0
  29. package/dist/_chunks/{calendar-WWNx448i.js → calendar-YHFknAGv.js} +22 -22
  30. package/dist/_chunks/{calendar-WWNx448i.js.map → calendar-YHFknAGv.js.map} +1 -1
  31. package/dist/_chunks/{carousel.agent-C2Icc9_T.js → carousel.agent-DrX96W-1.js} +2 -2
  32. package/dist/_chunks/{carousel.agent-C2Icc9_T.js.map → carousel.agent-DrX96W-1.js.map} +1 -1
  33. package/dist/_chunks/{chart-BLvFl169.js → chart-DLkVn_ex.js} +2 -2
  34. package/dist/_chunks/{chart-BLvFl169.js.map → chart-DLkVn_ex.js.map} +1 -1
  35. package/dist/_chunks/{chat-container-izziXViv.js → chat-container-ogB4OskO.js} +24 -23
  36. package/dist/_chunks/chat-container-ogB4OskO.js.map +1 -0
  37. package/dist/_chunks/{chat-input-cyl_y9bh.js → chat-input-CQe7nR_v.js} +132 -118
  38. package/dist/_chunks/chat-input-CQe7nR_v.js.map +1 -0
  39. package/dist/_chunks/{chat-message-fg221-yx.js → chat-message-D53_fH2w.js} +2 -2
  40. package/dist/_chunks/{chat-message-fg221-yx.js.map → chat-message-D53_fH2w.js.map} +1 -1
  41. package/dist/_chunks/{checkbox-Dgp_cfUr.js → checkbox-DRcOdmXv.js} +3 -3
  42. package/dist/_chunks/{checkbox-Dgp_cfUr.js.map → checkbox-DRcOdmXv.js.map} +1 -1
  43. package/dist/_chunks/{checkbox-group-eVowqKcT.js → checkbox-group-CpUwlHug.js} +3 -3
  44. package/dist/_chunks/{checkbox-group-eVowqKcT.js.map → checkbox-group-CpUwlHug.js.map} +1 -1
  45. package/dist/_chunks/{collapsible-hHiyZp0b.js → collapsible-CERONory.js} +2 -2
  46. package/dist/_chunks/{collapsible-hHiyZp0b.js.map → collapsible-CERONory.js.map} +1 -1
  47. package/dist/_chunks/{color-picker-Bm-gzpsh.js → color-picker-9tL7pz5y.js} +192 -181
  48. package/dist/_chunks/color-picker-9tL7pz5y.js.map +1 -0
  49. package/dist/_chunks/{combobox-Da9eq00i.js → combobox-BC-DFx8G.js} +31 -30
  50. package/dist/_chunks/combobox-BC-DFx8G.js.map +1 -0
  51. package/dist/_chunks/{command-palette-11BieSNq.js → command-palette-BiPAAno-.js} +125 -123
  52. package/dist/_chunks/command-palette-BiPAAno-.js.map +1 -0
  53. package/dist/_chunks/{copy-field-BAF4mt9h.js → copy-field-CCq7j6Zc.js} +2 -2
  54. package/dist/_chunks/{copy-field-BAF4mt9h.js.map → copy-field-CCq7j6Zc.js.map} +1 -1
  55. package/dist/_chunks/{date-picker-D0Ry1dMz.js → date-picker-B94HAV4A.js} +4 -4
  56. package/dist/_chunks/{date-picker-D0Ry1dMz.js.map → date-picker-B94HAV4A.js.map} +1 -1
  57. package/dist/_chunks/{date-range-picker-DYgHzMOo.js → date-range-picker-D4dgDlLU.js} +73 -73
  58. package/dist/_chunks/date-range-picker-D4dgDlLU.js.map +1 -0
  59. package/dist/_chunks/{date-time-picker-CGmGtcyc.js → date-time-picker-D1GEzf8p.js} +5 -5
  60. package/dist/_chunks/{date-time-picker-CGmGtcyc.js.map → date-time-picker-D1GEzf8p.js.map} +1 -1
  61. package/dist/_chunks/de-Dfbeau59.js +477 -0
  62. package/dist/_chunks/de-Dfbeau59.js.map +1 -0
  63. package/dist/_chunks/{description-list-CWjnaDGn.js → description-list-BEbK2g93.js} +2 -2
  64. package/dist/_chunks/{description-list-CWjnaDGn.js.map → description-list-BEbK2g93.js.map} +1 -1
  65. package/dist/_chunks/{dialog-C-lTGVkB.js → dialog-Cee13rHU.js} +3 -3
  66. package/dist/_chunks/{dialog-C-lTGVkB.js.map → dialog-Cee13rHU.js.map} +1 -1
  67. package/dist/_chunks/{dropdown-menu-DZxwF23X.js → dropdown-menu-BC5ZdOMo.js} +3 -3
  68. package/dist/_chunks/{dropdown-menu-DZxwF23X.js.map → dropdown-menu-BC5ZdOMo.js.map} +1 -1
  69. package/dist/_chunks/{editable-currency-cell-renderer-Od3Q-Y8J.js → editable-currency-cell-renderer-BpicmolK.js} +314 -317
  70. package/dist/_chunks/editable-currency-cell-renderer-BpicmolK.js.map +1 -0
  71. package/dist/_chunks/el-Dro3J7CP.js +373 -0
  72. package/dist/_chunks/el-Dro3J7CP.js.map +1 -0
  73. package/dist/_chunks/{email-input-DvJ_kPKL.js → email-input-lQivsFrw.js} +3 -3
  74. package/dist/_chunks/{email-input-DvJ_kPKL.js.map → email-input-lQivsFrw.js.map} +1 -1
  75. package/dist/_chunks/es-Dvg8u70B.js +373 -0
  76. package/dist/_chunks/es-Dvg8u70B.js.map +1 -0
  77. package/dist/_chunks/{file-upload-DxAQprcU.js → file-upload-CdozCPct.js} +226 -233
  78. package/dist/_chunks/file-upload-CdozCPct.js.map +1 -0
  79. package/dist/_chunks/fr-VOGjBSPP.js +338 -0
  80. package/dist/_chunks/fr-VOGjBSPP.js.map +1 -0
  81. package/dist/_chunks/{freemium-paywall-B9c8Ylww.js → freemium-paywall-D1N02Oam.js} +4 -4
  82. package/dist/_chunks/{freemium-paywall-B9c8Ylww.js.map → freemium-paywall-D1N02Oam.js.map} +1 -1
  83. package/dist/_chunks/{header-DDj7uGD-.js → header-CTZWX-tm.js} +2 -2
  84. package/dist/_chunks/{header-DDj7uGD-.js.map → header-CTZWX-tm.js.map} +1 -1
  85. package/dist/_chunks/hi-BSDxWU_y.js +433 -0
  86. package/dist/_chunks/hi-BSDxWU_y.js.map +1 -0
  87. package/dist/_chunks/{icon-button-DPEqBKBQ.js → icon-button-CKEOrN37.js} +2 -2
  88. package/dist/_chunks/{icon-button-DPEqBKBQ.js.map → icon-button-CKEOrN37.js.map} +1 -1
  89. package/dist/_chunks/{icon-button-group-DeV3FpNY.js → icon-button-group-C48khLE0.js} +23 -22
  90. package/dist/_chunks/icon-button-group-C48khLE0.js.map +1 -0
  91. package/dist/_chunks/{isSameDay-DHG8Xade.js → isSameDay-DUEiAT0G.js} +2 -2
  92. package/dist/_chunks/{isSameDay-DHG8Xade.js.map → isSameDay-DUEiAT0G.js.map} +1 -1
  93. package/dist/_chunks/isSameWeek-Dfzu29cW.js +14 -0
  94. package/dist/_chunks/isSameWeek-Dfzu29cW.js.map +1 -0
  95. package/dist/_chunks/it-CuonvcI_.js +401 -0
  96. package/dist/_chunks/it-CuonvcI_.js.map +1 -0
  97. package/dist/_chunks/ja-DO57gIOT.js +366 -0
  98. package/dist/_chunks/ja-DO57gIOT.js.map +1 -0
  99. package/dist/_chunks/{key-value-pair-BvDY3zuc.js → key-value-pair-C8DaR3Xs.js} +2 -2
  100. package/dist/_chunks/{key-value-pair-BvDY3zuc.js.map → key-value-pair-C8DaR3Xs.js.map} +1 -1
  101. package/dist/_chunks/{list-BdvDctBz.js → list-BOwqwy03.js} +44 -43
  102. package/dist/_chunks/list-BOwqwy03.js.map +1 -0
  103. package/dist/_chunks/{locale-picker-CY89MChR.js → locale-picker-D99UyZVJ.js} +4 -4
  104. package/dist/_chunks/{locale-picker-CY89MChR.js.map → locale-picker-D99UyZVJ.js.map} +1 -1
  105. package/dist/_chunks/{map-view-DyB8tr6c.js → map-view-WEWqXzof.js} +569 -557
  106. package/dist/_chunks/{map-view-DyB8tr6c.js.map → map-view-WEWqXzof.js.map} +1 -1
  107. package/dist/_chunks/{message-card-D6iyPacd.js → message-card-BbRhZkDI.js} +3 -3
  108. package/dist/_chunks/{message-card-D6iyPacd.js.map → message-card-BbRhZkDI.js.map} +1 -1
  109. package/dist/_chunks/{message-tray-Bh-0ra-Y.js → message-tray-B762TKuv.js} +11 -10
  110. package/dist/_chunks/message-tray-B762TKuv.js.map +1 -0
  111. package/dist/_chunks/{multi-select-dSe6Xtc4.js → multi-select-DOLO3K_z.js} +26 -25
  112. package/dist/_chunks/multi-select-DOLO3K_z.js.map +1 -0
  113. package/dist/_chunks/{navigation-menu-CyS1fBJ7.js → navigation-menu-C6lBYVv9.js} +3 -3
  114. package/dist/_chunks/{navigation-menu-CyS1fBJ7.js.map → navigation-menu-C6lBYVv9.js.map} +1 -1
  115. package/dist/_chunks/nl-DjPaaWaW.js +326 -0
  116. package/dist/_chunks/nl-DjPaaWaW.js.map +1 -0
  117. package/dist/_chunks/{notification-card-vaMaA7Wa.js → notification-card-DMdO4g54.js} +2 -2
  118. package/dist/_chunks/{notification-card-vaMaA7Wa.js.map → notification-card-DMdO4g54.js.map} +1 -1
  119. package/dist/_chunks/{notification-tray-Cnum6LwM.js → notification-tray-Dl3FTleW.js} +17 -16
  120. package/dist/_chunks/notification-tray-Dl3FTleW.js.map +1 -0
  121. package/dist/_chunks/{number-input-BZXu6bPY.js → number-input-Dj5L3pXK.js} +2 -2
  122. package/dist/_chunks/{number-input-BZXu6bPY.js.map → number-input-Dj5L3pXK.js.map} +1 -1
  123. package/dist/_chunks/{otp-input-BDF_iNpa.js → otp-input-BEg_sn8A.js} +2 -2
  124. package/dist/_chunks/{otp-input-BDF_iNpa.js.map → otp-input-BEg_sn8A.js.map} +1 -1
  125. package/dist/_chunks/{pagination-BWaXF7W0.js → pagination-DQOgnxxw.js} +2 -2
  126. package/dist/_chunks/{pagination-BWaXF7W0.js.map → pagination-DQOgnxxw.js.map} +1 -1
  127. package/dist/_chunks/{parseISO-Dk4xa7q6.js → parseISO-DEpUNwxZ.js} +2 -2
  128. package/dist/_chunks/{parseISO-Dk4xa7q6.js.map → parseISO-DEpUNwxZ.js.map} +1 -1
  129. package/dist/_chunks/{patient-search-ZpHN-pgJ.js → patient-search-hFiYbqcl.js} +8 -8
  130. package/dist/_chunks/{patient-search-ZpHN-pgJ.js.map → patient-search-hFiYbqcl.js.map} +1 -1
  131. package/dist/_chunks/{patient-shell-CYaNkbA1.js → patient-shell-CDvMw_Nk.js} +6 -6
  132. package/dist/_chunks/{patient-shell-CYaNkbA1.js.map → patient-shell-CDvMw_Nk.js.map} +1 -1
  133. package/dist/_chunks/{payment-form-Ds3rxvad.js → payment-form-D5rgnZu7.js} +2 -2
  134. package/dist/_chunks/{payment-form-Ds3rxvad.js.map → payment-form-D5rgnZu7.js.map} +1 -1
  135. package/dist/_chunks/{pdf-viewer-CIuaocnq.js → pdf-viewer-DvtEHcEP.js} +347 -320
  136. package/dist/_chunks/{pdf-viewer-CIuaocnq.js.map → pdf-viewer-DvtEHcEP.js.map} +1 -1
  137. package/dist/_chunks/{phone-input-DKSHX7NQ.js → phone-input-DfZbPPvh.js} +217 -201
  138. package/dist/_chunks/phone-input-DfZbPPvh.js.map +1 -0
  139. package/dist/_chunks/pl-Cl4lOx2N.js +514 -0
  140. package/dist/_chunks/pl-Cl4lOx2N.js.map +1 -0
  141. package/dist/_chunks/{popover-BfHSBEKq.js → popover-Devce-tT.js} +3 -3
  142. package/dist/_chunks/{popover-BfHSBEKq.js.map → popover-Devce-tT.js.map} +1 -1
  143. package/dist/_chunks/practice-results-RPL64j8E.js +1582 -0
  144. package/dist/_chunks/practice-results-RPL64j8E.js.map +1 -0
  145. package/dist/_chunks/{privacy-lock-C6Ra5m3p.js → privacy-lock-DD-wHxBg.js} +3 -3
  146. package/dist/_chunks/{privacy-lock-C6Ra5m3p.js.map → privacy-lock-DD-wHxBg.js.map} +1 -1
  147. package/dist/_chunks/{progress-B-PSO5OS.js → progress-kzIRcdaq.js} +11 -10
  148. package/dist/_chunks/progress-kzIRcdaq.js.map +1 -0
  149. package/dist/_chunks/pt-D7qO5CzD.js +370 -0
  150. package/dist/_chunks/pt-D7qO5CzD.js.map +1 -0
  151. package/dist/_chunks/{public-footer.agent-Bc99tE5Z.js → public-footer.agent-Bh0rnx4i.js} +21 -14
  152. package/dist/_chunks/public-footer.agent-Bh0rnx4i.js.map +1 -0
  153. package/dist/_chunks/{public-header.agent-B-B0WDAi.js → public-header.agent-B2dDg2_d.js} +3 -3
  154. package/dist/_chunks/{public-header.agent-B-B0WDAi.js.map → public-header.agent-B2dDg2_d.js.map} +1 -1
  155. package/dist/_chunks/{radio-i4ogu3cq.js → radio-TWf9Q-mp.js} +2 -2
  156. package/dist/_chunks/{radio-i4ogu3cq.js.map → radio-TWf9Q-mp.js.map} +1 -1
  157. package/dist/_chunks/{radio-group-CTlGc36r.js → radio-group-BcF92GEF.js} +4 -4
  158. package/dist/_chunks/{radio-group-CTlGc36r.js.map → radio-group-BcF92GEF.js.map} +1 -1
  159. package/dist/_chunks/{react-day-picker-D3yzgvDB.js → react-day-picker-DsjfS7uI.js} +662 -615
  160. package/dist/_chunks/{react-day-picker-D3yzgvDB.js.map → react-day-picker-DsjfS7uI.js.map} +1 -1
  161. package/dist/_chunks/recaptcha-widget-CFYyLSEX.js +221 -0
  162. package/dist/_chunks/recaptcha-widget-CFYyLSEX.js.map +1 -0
  163. package/dist/_chunks/registry-nPAVE19X.js +21 -0
  164. package/dist/_chunks/registry-nPAVE19X.js.map +1 -0
  165. package/dist/_chunks/{resizable-COV-cnth.js → resizable-3vzqDlg6.js} +29 -28
  166. package/dist/_chunks/resizable-3vzqDlg6.js.map +1 -0
  167. package/dist/_chunks/{reviews-panel-bKEUKSic.js → reviews-panel-yanuBZs-.js} +4 -4
  168. package/dist/_chunks/{reviews-panel-bKEUKSic.js.map → reviews-panel-yanuBZs-.js.map} +1 -1
  169. package/dist/_chunks/{rich-text-editor-J-wAz9eN.js → rich-text-editor-CHmr9Bz8.js} +2 -2
  170. package/dist/_chunks/{rich-text-editor-J-wAz9eN.js.map → rich-text-editor-CHmr9Bz8.js.map} +1 -1
  171. package/dist/_chunks/ro-CP2-VJ_O.js +361 -0
  172. package/dist/_chunks/ro-CP2-VJ_O.js.map +1 -0
  173. package/dist/_chunks/ru-RPn9_Lpq.js +561 -0
  174. package/dist/_chunks/ru-RPn9_Lpq.js.map +1 -0
  175. package/dist/_chunks/{scroll-area-DEDU-lp-.js → scroll-area-BWqCkEGz.js} +2 -2
  176. package/dist/_chunks/{scroll-area-DEDU-lp-.js.map → scroll-area-BWqCkEGz.js.map} +1 -1
  177. package/dist/_chunks/{search-bar-BRMW1-WG.js → search-bar-CP6wUJFY.js} +3 -3
  178. package/dist/_chunks/{search-bar-BRMW1-WG.js.map → search-bar-CP6wUJFY.js.map} +1 -1
  179. package/dist/_chunks/{search-input-CIA6pPfn.js → search-input-C1C3jQpD.js} +24 -23
  180. package/dist/_chunks/search-input-C1C3jQpD.js.map +1 -0
  181. package/dist/_chunks/{select-C92AT_OZ.js → select-hsCaJSX3.js} +3 -3
  182. package/dist/_chunks/{select-C92AT_OZ.js.map → select-hsCaJSX3.js.map} +1 -1
  183. package/dist/_chunks/{sheet-D8Yl0nKR.js → sheet-BV-yuLE2.js} +3 -3
  184. package/dist/_chunks/{sheet-D8Yl0nKR.js.map → sheet-BV-yuLE2.js.map} +1 -1
  185. package/dist/_chunks/{sidebar-DkyC6GvS.js → sidebar-BbR8f6oe.js} +3 -3
  186. package/dist/_chunks/{sidebar-DkyC6GvS.js.map → sidebar-BbR8f6oe.js.map} +1 -1
  187. package/dist/_chunks/{signature-capture-DjMlFOzS.js → signature-capture-C-fF71xI.js} +213 -205
  188. package/dist/_chunks/signature-capture-C-fF71xI.js.map +1 -0
  189. package/dist/_chunks/{slider-CfEzeseL.js → slider-BHWzXdjt.js} +3 -3
  190. package/dist/_chunks/{slider-CfEzeseL.js.map → slider-BHWzXdjt.js.map} +1 -1
  191. package/dist/_chunks/{slot-grid-Q94gVmhn.js → slot-grid-Dz13dH82.js} +4 -4
  192. package/dist/_chunks/{slot-grid-Q94gVmhn.js.map → slot-grid-Dz13dH82.js.map} +1 -1
  193. package/dist/_chunks/{sparkline-B5Ms55PZ.js → sparkline-DEROcSl0.js} +2 -2
  194. package/dist/_chunks/{sparkline-B5Ms55PZ.js.map → sparkline-DEROcSl0.js.map} +1 -1
  195. package/dist/_chunks/sq-AQvefouo.js +355 -0
  196. package/dist/_chunks/sq-AQvefouo.js.map +1 -0
  197. package/dist/_chunks/{stepper-progress-jFY8BSf7.js → stepper-progress-DDjq5nei.js} +16 -15
  198. package/dist/_chunks/stepper-progress-DDjq5nei.js.map +1 -0
  199. package/dist/_chunks/streaming-text-GH07yIYh.js +127 -0
  200. package/dist/_chunks/streaming-text-GH07yIYh.js.map +1 -0
  201. package/dist/_chunks/sv-zkx9eBtD.js +376 -0
  202. package/dist/_chunks/sv-zkx9eBtD.js.map +1 -0
  203. package/dist/_chunks/{switch-D916VW86.js → switch-BJ6HD3Mn.js} +2 -2
  204. package/dist/_chunks/{switch-D916VW86.js.map → switch-BJ6HD3Mn.js.map} +1 -1
  205. package/dist/_chunks/{tabs-aEQfQV3x.js → tabs-BpPYVme_.js} +4 -4
  206. package/dist/_chunks/{tabs-aEQfQV3x.js.map → tabs-BpPYVme_.js.map} +1 -1
  207. package/dist/_chunks/{tag-bBPAvXyh.js → tag-CyoaEmf_.js} +2 -2
  208. package/dist/_chunks/{tag-bBPAvXyh.js.map → tag-CyoaEmf_.js.map} +1 -1
  209. package/dist/_chunks/{task-tray-6NlryfMJ.js → task-tray-DRK0b0Qb.js} +3 -3
  210. package/dist/_chunks/{task-tray-6NlryfMJ.js.map → task-tray-DRK0b0Qb.js.map} +1 -1
  211. package/dist/_chunks/{text-area-D5GAe8pV.js → text-area-BIx0tZ05.js} +27 -26
  212. package/dist/_chunks/text-area-BIx0tZ05.js.map +1 -0
  213. package/dist/_chunks/{text-input-CakysYnD.js → text-input-BaClJL8Y.js} +2 -2
  214. package/dist/_chunks/{text-input-CakysYnD.js.map → text-input-BaClJL8Y.js.map} +1 -1
  215. package/dist/_chunks/{theme-toggle-JoeMs_ws.js → theme-toggle-DpC28kt5.js} +6 -6
  216. package/dist/_chunks/{theme-toggle-JoeMs_ws.js.map → theme-toggle-DpC28kt5.js.map} +1 -1
  217. package/dist/_chunks/{time-picker-DeVZkIY2.js → time-picker-B5umYwfv.js} +2 -2
  218. package/dist/_chunks/{time-picker-DeVZkIY2.js.map → time-picker-B5umYwfv.js.map} +1 -1
  219. package/dist/_chunks/{timeline-CR7HjZCK.js → timeline-D0Wo7v_o.js} +3 -3
  220. package/dist/_chunks/{timeline-CR7HjZCK.js.map → timeline-D0Wo7v_o.js.map} +1 -1
  221. package/dist/_chunks/{toast.agent-DVpKt38p.js → toast.agent-WHHfw5VX.js} +322 -320
  222. package/dist/_chunks/{toast.agent-DVpKt38p.js.map → toast.agent-WHHfw5VX.js.map} +1 -1
  223. package/dist/_chunks/{tooltip-ClJd0ciy.js → tooltip-DvmfrNvB.js} +29 -20
  224. package/dist/_chunks/tooltip-DvmfrNvB.js.map +1 -0
  225. package/dist/_chunks/{tooth-scheme-3mITSXiZ.js → tooth-scheme-CxlsLjfN.js} +2 -2
  226. package/dist/_chunks/{tooth-scheme-3mITSXiZ.js.map → tooth-scheme-CxlsLjfN.js.map} +1 -1
  227. package/dist/_chunks/tr-Dmr412Ac.js +378 -0
  228. package/dist/_chunks/tr-Dmr412Ac.js.map +1 -0
  229. package/dist/_chunks/{transcript-panel-QUQ9XJmf.js → transcript-panel-DyhTpAP7.js} +21 -20
  230. package/dist/_chunks/transcript-panel-DyhTpAP7.js.map +1 -0
  231. package/dist/_chunks/{use-direction-D6rvvG9G.js → use-direction-Dp8h70PP.js} +7 -6
  232. package/dist/_chunks/use-direction-Dp8h70PP.js.map +1 -0
  233. package/dist/_chunks/use-isomorphic-layout-effect-BGfaCOP1.js +6 -0
  234. package/dist/_chunks/use-isomorphic-layout-effect-BGfaCOP1.js.map +1 -0
  235. package/dist/_chunks/use-media-query-CcAx5SMM.js +16 -0
  236. package/dist/_chunks/use-media-query-CcAx5SMM.js.map +1 -0
  237. package/dist/_chunks/{use-password-requirements-E0sSfx5X.js → use-password-requirements-DsgduV1x.js} +3 -3
  238. package/dist/_chunks/{use-password-requirements-E0sSfx5X.js.map → use-password-requirements-DsgduV1x.js.map} +1 -1
  239. package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js +43 -0
  240. package/dist/_chunks/use-scroll-to-first-error-4Za-u5Nw.js.map +1 -0
  241. package/dist/_chunks/{workflow-map-DlWBJJBt.js → workflow-map-BSvQS3be.js} +6 -6
  242. package/dist/_chunks/{workflow-map-DlWBJJBt.js.map → workflow-map-BSvQS3be.js.map} +1 -1
  243. package/dist/_chunks/zh-CN-DxVt64Zk.js +388 -0
  244. package/dist/_chunks/zh-CN-DxVt64Zk.js.map +1 -0
  245. package/dist/agent/registry.d.ts +1 -6
  246. package/dist/agent/registry.d.ts.map +1 -1
  247. package/dist/agent-catalog.json +1 -1
  248. package/dist/components/_shared/date-locale.d.ts +7 -2
  249. package/dist/components/_shared/date-locale.d.ts.map +1 -1
  250. package/dist/components/_shared/index.d.ts +1 -1
  251. package/dist/components/_shared/index.d.ts.map +1 -1
  252. package/dist/components/accordion/index.js +1 -1
  253. package/dist/components/agenda-card/index.js +1 -1
  254. package/dist/components/agenda-tray/index.js +1 -1
  255. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  256. package/dist/components/ai-prompt-input/index.js +1 -1
  257. package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
  258. package/dist/components/audio-recorder/index.js +1 -1
  259. package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
  260. package/dist/components/audio-visualiser/index.js +1 -1
  261. package/dist/components/autocomplete/index.js +1 -1
  262. package/dist/components/avatar/avatar.d.ts.map +1 -1
  263. package/dist/components/avatar/index.js +1 -1
  264. package/dist/components/badge/index.js +1 -1
  265. package/dist/components/booking/index.js +1 -1
  266. package/dist/components/breadcrumb/index.js +1 -1
  267. package/dist/components/button/index.js +1 -1
  268. package/dist/components/button-group/button-group.d.ts.map +1 -1
  269. package/dist/components/button-group/index.js +1 -1
  270. package/dist/components/calendar/calendar.d.ts.map +1 -1
  271. package/dist/components/calendar/index.js +1 -1
  272. package/dist/components/carousel/index.js +1 -1
  273. package/dist/components/chart/index.js +1 -1
  274. package/dist/components/chat-container/chat-container.d.ts.map +1 -1
  275. package/dist/components/chat-container/index.js +1 -1
  276. package/dist/components/chat-input/chat-input.d.ts.map +1 -1
  277. package/dist/components/chat-input/index.js +1 -1
  278. package/dist/components/chat-message/index.js +1 -1
  279. package/dist/components/checkbox/index.js +1 -1
  280. package/dist/components/checkbox-group/index.js +1 -1
  281. package/dist/components/collapsible/index.js +1 -1
  282. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  283. package/dist/components/color-picker/index.js +1 -1
  284. package/dist/components/combobox/combobox.d.ts.map +1 -1
  285. package/dist/components/combobox/index.js +1 -1
  286. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  287. package/dist/components/command-palette/index.js +1 -1
  288. package/dist/components/copy-field/index.js +1 -1
  289. package/dist/components/data-table/cell-renderers/color-dot-cell-renderer.d.ts.map +1 -1
  290. package/dist/components/data-table/data-table.d.ts.map +1 -1
  291. package/dist/components/data-table/index.js +1 -1
  292. package/dist/components/date-picker/index.js +1 -1
  293. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  294. package/dist/components/date-range-picker/index.js +1 -1
  295. package/dist/components/date-time-picker/index.js +1 -1
  296. package/dist/components/description-list/index.js +1 -1
  297. package/dist/components/dialog/index.js +1 -1
  298. package/dist/components/dropdown-menu/index.js +1 -1
  299. package/dist/components/email-input/index.js +1 -1
  300. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  301. package/dist/components/file-upload/index.js +1 -1
  302. package/dist/components/freemium-paywall/index.js +1 -1
  303. package/dist/components/header/index.js +1 -1
  304. package/dist/components/header-settings/index.js +6 -6
  305. package/dist/components/icon-button/index.js +1 -1
  306. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  307. package/dist/components/icon-button-group/index.js +1 -1
  308. package/dist/components/key-value-pair/index.js +1 -1
  309. package/dist/components/list/index.js +1 -1
  310. package/dist/components/list/list.d.ts.map +1 -1
  311. package/dist/components/locale-picker/index.js +1 -1
  312. package/dist/components/map-view/index.js +1 -1
  313. package/dist/components/map-view/map-view.d.ts +10 -0
  314. package/dist/components/map-view/map-view.d.ts.map +1 -1
  315. package/dist/components/message-card/index.js +1 -1
  316. package/dist/components/message-tray/index.js +1 -1
  317. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  318. package/dist/components/multi-select/index.js +1 -1
  319. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  320. package/dist/components/navigation-menu/index.js +1 -1
  321. package/dist/components/notification-card/index.js +1 -1
  322. package/dist/components/notification-tray/index.js +1 -1
  323. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  324. package/dist/components/number-input/index.js +1 -1
  325. package/dist/components/otp-input/index.js +1 -1
  326. package/dist/components/pagination/index.js +1 -1
  327. package/dist/components/password-input/index.js +1 -1
  328. package/dist/components/patient-search/index.js +1 -1
  329. package/dist/components/payment-form/index.js +1 -1
  330. package/dist/components/pdf-viewer/index.js +1 -1
  331. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  332. package/dist/components/phone-input/index.js +1 -1
  333. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  334. package/dist/components/popover/index.js +1 -1
  335. package/dist/components/practice-results/index.js +1 -1
  336. package/dist/components/practice-results/practice-results.d.ts +23 -1
  337. package/dist/components/practice-results/practice-results.d.ts.map +1 -1
  338. package/dist/components/privacy-lock/index.js +1 -1
  339. package/dist/components/progress/index.js +1 -1
  340. package/dist/components/progress/progress.d.ts.map +1 -1
  341. package/dist/components/public-footer/index.js +1 -1
  342. package/dist/components/public-footer/public-footer.d.ts.map +1 -1
  343. package/dist/components/public-header/index.js +1 -1
  344. package/dist/components/radio/index.js +1 -1
  345. package/dist/components/radio-group/index.js +2 -2
  346. package/dist/components/recaptcha-widget/index.js +1 -1
  347. package/dist/components/recaptcha-widget/recaptcha-widget.d.ts.map +1 -1
  348. package/dist/components/resizable/index.js +1 -1
  349. package/dist/components/resizable/resizable.d.ts.map +1 -1
  350. package/dist/components/reviews-panel/index.js +1 -1
  351. package/dist/components/rich-text-editor/index.js +1 -1
  352. package/dist/components/scroll-area/index.js +1 -1
  353. package/dist/components/search-bar/index.js +1 -1
  354. package/dist/components/search-input/index.js +1 -1
  355. package/dist/components/select/index.js +1 -1
  356. package/dist/components/sheet/index.js +1 -1
  357. package/dist/components/sidebar/index.js +1 -1
  358. package/dist/components/signature-capture/index.js +1 -1
  359. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  360. package/dist/components/slider/index.js +1 -1
  361. package/dist/components/slot-grid/index.js +1 -1
  362. package/dist/components/sparkline/index.js +1 -1
  363. package/dist/components/stepper-progress/index.js +1 -1
  364. package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
  365. package/dist/components/streaming-text/index.js +1 -1
  366. package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
  367. package/dist/components/switch/index.js +1 -1
  368. package/dist/components/tabs/index.js +1 -1
  369. package/dist/components/tag/index.js +1 -1
  370. package/dist/components/task-tray/index.js +1 -1
  371. package/dist/components/text-area/index.js +1 -1
  372. package/dist/components/text-area/text-area.d.ts.map +1 -1
  373. package/dist/components/text-input/index.js +1 -1
  374. package/dist/components/theme-toggle/index.js +1 -1
  375. package/dist/components/time-picker/index.js +1 -1
  376. package/dist/components/timeline/index.js +1 -1
  377. package/dist/components/toast/index.js +1 -1
  378. package/dist/components/toast/toast.d.ts.map +1 -1
  379. package/dist/components/tooltip/index.js +1 -1
  380. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  381. package/dist/components/tooth-scheme/index.js +1 -1
  382. package/dist/components/transcript-panel/index.js +1 -1
  383. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  384. package/dist/components/workflow/index.js +1 -1
  385. package/dist/hooks/index.js +69 -66
  386. package/dist/hooks/index.js.map +1 -1
  387. package/dist/hooks/use-debounced-value.d.ts.map +1 -1
  388. package/dist/hooks/use-direction.d.ts.map +1 -1
  389. package/dist/hooks/use-focus-trap.d.ts.map +1 -1
  390. package/dist/hooks/use-scroll-to-first-error.d.ts.map +1 -1
  391. package/dist/i18n/locales/ar.d.ts +92 -0
  392. package/dist/i18n/locales/ar.d.ts.map +1 -1
  393. package/dist/i18n/locales/ar.js +82 -0
  394. package/dist/i18n/locales/ar.js.map +1 -1
  395. package/dist/i18n/locales/de.d.ts +92 -0
  396. package/dist/i18n/locales/de.d.ts.map +1 -1
  397. package/dist/i18n/locales/de.js +81 -0
  398. package/dist/i18n/locales/de.js.map +1 -1
  399. package/dist/i18n/locales/el.d.ts +92 -0
  400. package/dist/i18n/locales/el.d.ts.map +1 -1
  401. package/dist/i18n/locales/el.js +82 -0
  402. package/dist/i18n/locales/el.js.map +1 -1
  403. package/dist/i18n/locales/en.d.ts +27 -0
  404. package/dist/i18n/locales/en.d.ts.map +1 -1
  405. package/dist/i18n/locales/en.js +27 -0
  406. package/dist/i18n/locales/en.js.map +1 -1
  407. package/dist/i18n/locales/es.d.ts +92 -0
  408. package/dist/i18n/locales/es.d.ts.map +1 -1
  409. package/dist/i18n/locales/es.js +81 -0
  410. package/dist/i18n/locales/es.js.map +1 -1
  411. package/dist/i18n/locales/fr.d.ts +92 -0
  412. package/dist/i18n/locales/fr.d.ts.map +1 -1
  413. package/dist/i18n/locales/fr.js +81 -0
  414. package/dist/i18n/locales/fr.js.map +1 -1
  415. package/dist/i18n/locales/hi.d.ts +92 -0
  416. package/dist/i18n/locales/hi.d.ts.map +1 -1
  417. package/dist/i18n/locales/hi.js +82 -0
  418. package/dist/i18n/locales/hi.js.map +1 -1
  419. package/dist/i18n/locales/it.d.ts +92 -0
  420. package/dist/i18n/locales/it.d.ts.map +1 -1
  421. package/dist/i18n/locales/it.js +81 -0
  422. package/dist/i18n/locales/it.js.map +1 -1
  423. package/dist/i18n/locales/ja.d.ts +92 -0
  424. package/dist/i18n/locales/ja.d.ts.map +1 -1
  425. package/dist/i18n/locales/ja.js +82 -0
  426. package/dist/i18n/locales/ja.js.map +1 -1
  427. package/dist/i18n/locales/nl.d.ts +92 -0
  428. package/dist/i18n/locales/nl.d.ts.map +1 -1
  429. package/dist/i18n/locales/nl.js +81 -0
  430. package/dist/i18n/locales/nl.js.map +1 -1
  431. package/dist/i18n/locales/pl.d.ts +92 -0
  432. package/dist/i18n/locales/pl.d.ts.map +1 -1
  433. package/dist/i18n/locales/pl.js +82 -0
  434. package/dist/i18n/locales/pl.js.map +1 -1
  435. package/dist/i18n/locales/pt.d.ts +92 -0
  436. package/dist/i18n/locales/pt.d.ts.map +1 -1
  437. package/dist/i18n/locales/pt.js +83 -0
  438. package/dist/i18n/locales/pt.js.map +1 -1
  439. package/dist/i18n/locales/ro.d.ts +92 -0
  440. package/dist/i18n/locales/ro.d.ts.map +1 -1
  441. package/dist/i18n/locales/ro.js +82 -0
  442. package/dist/i18n/locales/ro.js.map +1 -1
  443. package/dist/i18n/locales/ru.d.ts +92 -0
  444. package/dist/i18n/locales/ru.d.ts.map +1 -1
  445. package/dist/i18n/locales/ru.js +82 -0
  446. package/dist/i18n/locales/ru.js.map +1 -1
  447. package/dist/i18n/locales/sq.d.ts +92 -0
  448. package/dist/i18n/locales/sq.d.ts.map +1 -1
  449. package/dist/i18n/locales/sq.js +82 -0
  450. package/dist/i18n/locales/sq.js.map +1 -1
  451. package/dist/i18n/locales/sv.d.ts +92 -0
  452. package/dist/i18n/locales/sv.d.ts.map +1 -1
  453. package/dist/i18n/locales/sv.js +82 -0
  454. package/dist/i18n/locales/sv.js.map +1 -1
  455. package/dist/i18n/locales/tr.d.ts +92 -0
  456. package/dist/i18n/locales/tr.d.ts.map +1 -1
  457. package/dist/i18n/locales/tr.js +82 -0
  458. package/dist/i18n/locales/tr.js.map +1 -1
  459. package/dist/i18n/locales/zh.d.ts +92 -0
  460. package/dist/i18n/locales/zh.d.ts.map +1 -1
  461. package/dist/i18n/locales/zh.js +82 -0
  462. package/dist/i18n/locales/zh.js.map +1 -1
  463. package/dist/index.js +541 -540
  464. package/dist/index.js.map +1 -1
  465. package/dist/locales/ar.json +92 -0
  466. package/dist/locales/de.json +92 -0
  467. package/dist/locales/el.json +92 -0
  468. package/dist/locales/en.json +27 -0
  469. package/dist/locales/es.json +92 -0
  470. package/dist/locales/fr.json +92 -0
  471. package/dist/locales/hi.json +92 -0
  472. package/dist/locales/it.json +92 -0
  473. package/dist/locales/ja.json +92 -0
  474. package/dist/locales/nl.json +92 -0
  475. package/dist/locales/pl.json +92 -0
  476. package/dist/locales/pt.json +92 -0
  477. package/dist/locales/ro.json +92 -0
  478. package/dist/locales/ru.json +92 -0
  479. package/dist/locales/sq.json +92 -0
  480. package/dist/locales/sv.json +92 -0
  481. package/dist/locales/tr.json +92 -0
  482. package/dist/locales/zh.json +92 -0
  483. package/dist/patterns/alia-assistant/index.js +1 -1
  484. package/dist/patterns/patient-shell/index.js +1 -1
  485. package/dist/tokens.css +1 -1
  486. package/package.json +2 -2
  487. package/dist/_chunks/ai-prompt-input-BXlwNnWe.js.map +0 -1
  488. package/dist/_chunks/audio-recorder-DL800PE_.js.map +0 -1
  489. package/dist/_chunks/audio-visualiser-I-T4Z7EU.js +0 -145
  490. package/dist/_chunks/audio-visualiser-I-T4Z7EU.js.map +0 -1
  491. package/dist/_chunks/avatar-D_H4emLo.js.map +0 -1
  492. package/dist/_chunks/booking-Bhk9IYm3.js.map +0 -1
  493. package/dist/_chunks/button-group-Bh2g_Ng-.js.map +0 -1
  494. package/dist/_chunks/chat-container-izziXViv.js.map +0 -1
  495. package/dist/_chunks/chat-input-cyl_y9bh.js.map +0 -1
  496. package/dist/_chunks/color-picker-Bm-gzpsh.js.map +0 -1
  497. package/dist/_chunks/combobox-Da9eq00i.js.map +0 -1
  498. package/dist/_chunks/command-palette-11BieSNq.js.map +0 -1
  499. package/dist/_chunks/date-range-picker-DYgHzMOo.js.map +0 -1
  500. package/dist/_chunks/editable-currency-cell-renderer-Od3Q-Y8J.js.map +0 -1
  501. package/dist/_chunks/file-upload-DxAQprcU.js.map +0 -1
  502. package/dist/_chunks/icon-button-group-DeV3FpNY.js.map +0 -1
  503. package/dist/_chunks/list-BdvDctBz.js.map +0 -1
  504. package/dist/_chunks/message-tray-Bh-0ra-Y.js.map +0 -1
  505. package/dist/_chunks/multi-select-dSe6Xtc4.js.map +0 -1
  506. package/dist/_chunks/notification-tray-Cnum6LwM.js.map +0 -1
  507. package/dist/_chunks/phone-input-DKSHX7NQ.js.map +0 -1
  508. package/dist/_chunks/practice-results-CEKjwsgS.js +0 -1441
  509. package/dist/_chunks/practice-results-CEKjwsgS.js.map +0 -1
  510. package/dist/_chunks/progress-B-PSO5OS.js.map +0 -1
  511. package/dist/_chunks/public-footer.agent-Bc99tE5Z.js.map +0 -1
  512. package/dist/_chunks/recaptcha-widget-BtBNb6tB.js +0 -192
  513. package/dist/_chunks/recaptcha-widget-BtBNb6tB.js.map +0 -1
  514. package/dist/_chunks/registry-C9nwlNyL.js +0 -21
  515. package/dist/_chunks/registry-C9nwlNyL.js.map +0 -1
  516. package/dist/_chunks/resizable-COV-cnth.js.map +0 -1
  517. package/dist/_chunks/search-input-CIA6pPfn.js.map +0 -1
  518. package/dist/_chunks/signature-capture-DjMlFOzS.js.map +0 -1
  519. package/dist/_chunks/smile-BSYLAHy6.js +0 -17
  520. package/dist/_chunks/smile-BSYLAHy6.js.map +0 -1
  521. package/dist/_chunks/stepper-progress-jFY8BSf7.js.map +0 -1
  522. package/dist/_chunks/streaming-text-BgjCTVOw.js +0 -105
  523. package/dist/_chunks/streaming-text-BgjCTVOw.js.map +0 -1
  524. package/dist/_chunks/text-area-D5GAe8pV.js.map +0 -1
  525. package/dist/_chunks/tooltip-ClJd0ciy.js.map +0 -1
  526. package/dist/_chunks/transcript-panel-QUQ9XJmf.js.map +0 -1
  527. package/dist/_chunks/use-direction-D6rvvG9G.js.map +0 -1
  528. package/dist/_chunks/use-scroll-to-first-error-BrK7dKB_.js +0 -55
  529. package/dist/_chunks/use-scroll-to-first-error-BrK7dKB_.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"patient-shell-CYaNkbA1.js","sources":["../../node_modules/lucide-react/dist/esm/icons/maximize-2.js","../../src/patterns/patient-shell/patient-shell.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"m21 3-7 7\", key: \"1l2asr\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M9 21H3v-6\", key: \"wtvkvv\" }]\n];\nconst Maximize2 = createLucideIcon(\"maximize-2\", __iconNode);\n\nexport { __iconNode, Maximize2 as default };\n//# sourceMappingURL=maximize-2.js.map\n","/**\n * Patient Shell — the chrome for AlfaDocs's patient-facing users\n * (patients managing their own appointments and records).\n *\n * Deliberately flatter than the clinician `AppFrame` composition: no\n * command palette, no favourites, no practice/chain affordances, no\n * Alia, no privacy lock. Mirrors the legacy `_header.html.twig`\n * `app.user.type == 'patient'` branch and the `knp_menu_render('pcp')`\n * flat nav menu.\n *\n * Unlike most patterns in this folder, PatientShell exports a runtime\n * component because the consuming patient-portal app mounts it in\n * production — the exports are surfaced via `src/patterns/index.ts`\n * and included in the library bundle.\n */\nimport { forwardRef, useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LogOut, Maximize2, Settings as SettingsIcon } from 'lucide-react';\n\nimport { AppFrame } from '../../components/app-frame';\nimport { IconButton } from '../../components/button';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport {\n Header,\n HeaderBrand,\n HeaderCenter,\n HeaderEnd,\n HeaderMenuButton,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { Logo } from '../../components/logo';\nimport {\n Sidebar,\n SidebarBody,\n SidebarItem,\n SidebarItemBadge,\n SidebarItemIcon,\n SidebarItemLabel,\n type SidebarMode,\n} from '../../components/sidebar';\nimport { ThemeRoot } from '../../components/theme-root';\nimport { TooltipProvider } from '../../components/tooltip';\nimport { useTheme } from '../../hooks/use-theme';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface PatientNavItem {\n id: string;\n /** Pre-translated label — patients' nav labels are emitted already\n * translated by the consuming app's backend (legacy `knp_menu`). */\n label: string;\n href: string;\n /** Optional leading icon. Pass a lucide-react or equivalent element. */\n icon?: ReactNode;\n /** Optional unseen-item count rendered as a pill badge. */\n badgeCount?: number;\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n}\n\nexport interface PatientShellProps {\n /** Patient's display name. Used as the avatar fallback by consumers\n * that read the name through a slot; not rendered inside this shell\n * today because the legacy patient chrome carries no profile pill. */\n userName: string;\n /** Optional avatar URL. Reserved for future profile-pill surfaces;\n * no visible effect today. */\n userAvatarSrc?: string;\n /** Flat nav items rendered in the sidebar, in order. */\n menuItems: PatientNavItem[];\n /** URL the \"Logout\" action navigates to — typically `/logout`. */\n logoutHref: string;\n /** Fires when the user toggles fullscreen from the settings menu. */\n onToggleFullscreen?: () => void;\n /** Optional brand logo. Defaults to\n * `<Logo variant=\"monochrome\" size=\"md\" decorative />`. */\n brandLogo?: ReactNode;\n /** Link target for the brand — typically the patient dashboard. */\n brandHref?: string;\n /** Override the accessible name of the `<main>` landmark. */\n mainAriaLabel?: string;\n /**\n * Force the sidebar into a specific mode. Consuming apps typically\n * flip to `'overlay'` on narrow viewports and leave this undefined\n * elsewhere (the sidebar then defaults to `'expanded'`).\n */\n sidebarState?: SidebarMode;\n /** Children render inside the main content region. */\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internals */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\n/**\n * Guard against `javascript:` and other non-navigation schemes before\n * handing the URL to `window.location.assign`. A consuming app that lets\n * attacker-controlled input reach `logoutHref` would otherwise execute\n * script. Allow only relative paths, hash fragments, and `http(s)` URLs.\n */\nfunction isSafeLogoutHref(href: string): boolean {\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) {\n return true;\n }\n try {\n const url = new URL(href, window.location.origin);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction SettingsMenu({\n logoutHref,\n onToggleFullscreen,\n}: {\n logoutHref: string;\n onToggleFullscreen?: () => void;\n}) {\n const { t } = useTranslation();\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={<SettingsIcon aria-hidden=\"true\" />}\n aria-label={t('patientShell.settings.triggerAria')}\n tooltip={t('patientShell.settings.triggerAria')}\n data-testid=\"patient-shell-settings-trigger\"\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n <DropdownMenu.Item\n startIcon={<Maximize2 aria-hidden=\"true\" />}\n onSelect={onToggleFullscreen}\n data-testid=\"patient-shell-fullscreen\"\n >\n {t('patientShell.settings.fullscreen')}\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<LogOut aria-hidden=\"true\" />}\n onSelect={() => {\n if (typeof window === 'undefined') return;\n if (!isSafeLogoutHref(logoutHref)) return;\n window.location.assign(logoutHref);\n }}\n data-testid=\"patient-shell-logout\"\n >\n {t('patientShell.settings.logout')}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nfunction PatientSidebarNav({ menuItems }: { menuItems: PatientNavItem[] }) {\n return (\n <SidebarBody>\n {menuItems.map((item) => {\n const badge =\n typeof item.badgeCount === 'number' && item.badgeCount > 0\n ? item.badgeCount\n : undefined;\n return (\n <SidebarItem\n key={item.id}\n href={item.href}\n aria-label={item.label}\n isActive={item.isActive}\n >\n {item.icon ? <SidebarItemIcon>{item.icon}</SidebarItemIcon> : null}\n <SidebarItemLabel>{item.label}</SidebarItemLabel>\n {badge !== undefined ? (\n <SidebarItemBadge>{formatBadgeCount(badge)}</SidebarItemBadge>\n ) : null}\n </SidebarItem>\n );\n })}\n </SidebarBody>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const PatientShell = forwardRef<HTMLDivElement, PatientShellProps>(\n (\n {\n menuItems,\n logoutHref,\n onToggleFullscreen,\n brandLogo,\n brandHref = '/',\n mainAriaLabel,\n sidebarState,\n children,\n // `userName` and `userAvatarSrc` are declared on the public API\n // for forward-compatibility (future profile-pill work) — they are\n // intentionally unused today because the legacy patient chrome\n // carries no profile pill.\n userName: _userName,\n userAvatarSrc: _userAvatarSrc,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n // Only wrap children in a nested <ThemeRoot> when the user has\n // explicitly chosen a theme via the hook (e.g., through an in-app\n // toggle). Otherwise we let the outer cascade win — wrapping with\n // the hook's default `resolvedTheme = 'light'` would clobber a\n // consuming app's `<html>` theme class (or Storybook's decorator)\n // for every child rendered inside the shell.\n const { theme: themePref, accessibility, resolvedTheme } = useTheme();\n const hasExplicitOverride =\n themePref !== 'system' || accessibility !== 'system';\n const themeBase = resolvedTheme.startsWith('dark') ? 'dark' : 'light';\n const themeAccessible = resolvedTheme.endsWith('-accessible');\n\n // Narrow-viewport overlay: `HeaderMenuButton` only renders below the\n // `md` breakpoint, and toggling opens the Sidebar's overlay Dialog.\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const resolvedLogo = brandLogo ?? (\n <Logo variant=\"monochrome\" size=\"md\" decorative />\n );\n\n const shell = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n header={\n <Header>\n <HeaderStart>\n <HeaderSkipLink href=\"#main-content\" />\n <HeaderMenuButton onMenuOpen={() => setSidebarOpen(true)} />\n <HeaderBrand\n logo={resolvedLogo}\n href={brandHref}\n aria-label={t('patientShell.brand.homeAria')}\n />\n </HeaderStart>\n <HeaderCenter />\n <HeaderEnd>\n <SettingsMenu\n logoutHref={logoutHref}\n onToggleFullscreen={onToggleFullscreen}\n />\n </HeaderEnd>\n </Header>\n }\n sidebar={\n <Sidebar\n {...(sidebarState !== undefined\n ? { state: sidebarState }\n : { defaultState: 'expanded' as const })}\n open={sidebarOpen}\n onOpenChange={setSidebarOpen}\n aria-label={t('patientShell.sidebar.panelLabel')}\n data-testid=\"patient-shell-sidebar\"\n >\n <PatientSidebarNav menuItems={menuItems} />\n </Sidebar>\n }\n >\n {children}\n </AppFrame>\n </TooltipProvider>\n );\n\n if (!hasExplicitOverride) {\n // Pass-through wrapper preserves the ref contract without altering\n // the token cascade.\n return (\n <div ref={ref as never} className=\"ds:contents\">\n {shell}\n </div>\n );\n }\n\n return (\n <ThemeRoot\n ref={ref}\n theme={themeBase}\n accessible={themeAccessible}\n className=\"ds:contents\"\n >\n {shell}\n </ThemeRoot>\n );\n },\n);\n\nPatientShell.displayName = 'PatientShell';\n"],"names":["__iconNode","Maximize2","createLucideIcon","formatBadgeCount","count","isSafeLogoutHref","href","url","SettingsMenu","logoutHref","onToggleFullscreen","t","useTranslation","jsxs","DropdownMenu","jsx","IconButton","SettingsIcon","LogOut","PatientSidebarNav","menuItems","SidebarBody","item","badge","SidebarItem","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","PatientShell","forwardRef","brandLogo","brandHref","mainAriaLabel","sidebarState","children","_userName","_userAvatarSrc","ref","themePref","accessibility","resolvedTheme","useTheme","hasExplicitOverride","themeBase","themeAccessible","sidebarOpen","setSidebarOpen","useState","shell","TooltipProvider","AppFrame","Header","HeaderStart","HeaderSkipLink","HeaderMenuButton","HeaderBrand","Logo","HeaderCenter","HeaderEnd","Sidebar","ThemeRoot"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"patient-shell-CDvMw_Nk.js","sources":["../../node_modules/lucide-react/dist/esm/icons/maximize-2.js","../../src/patterns/patient-shell/patient-shell.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"m21 3-7 7\", key: \"1l2asr\" }],\n [\"path\", { d: \"m3 21 7-7\", key: \"tjx5ai\" }],\n [\"path\", { d: \"M9 21H3v-6\", key: \"wtvkvv\" }]\n];\nconst Maximize2 = createLucideIcon(\"maximize-2\", __iconNode);\n\nexport { __iconNode, Maximize2 as default };\n//# sourceMappingURL=maximize-2.js.map\n","/**\n * Patient Shell — the chrome for AlfaDocs's patient-facing users\n * (patients managing their own appointments and records).\n *\n * Deliberately flatter than the clinician `AppFrame` composition: no\n * command palette, no favourites, no practice/chain affordances, no\n * Alia, no privacy lock. Mirrors the legacy `_header.html.twig`\n * `app.user.type == 'patient'` branch and the `knp_menu_render('pcp')`\n * flat nav menu.\n *\n * Unlike most patterns in this folder, PatientShell exports a runtime\n * component because the consuming patient-portal app mounts it in\n * production — the exports are surfaced via `src/patterns/index.ts`\n * and included in the library bundle.\n */\nimport { forwardRef, useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LogOut, Maximize2, Settings as SettingsIcon } from 'lucide-react';\n\nimport { AppFrame } from '../../components/app-frame';\nimport { IconButton } from '../../components/button';\nimport { DropdownMenu } from '../../components/dropdown-menu';\nimport {\n Header,\n HeaderBrand,\n HeaderCenter,\n HeaderEnd,\n HeaderMenuButton,\n HeaderSkipLink,\n HeaderStart,\n} from '../../components/header';\nimport { Logo } from '../../components/logo';\nimport {\n Sidebar,\n SidebarBody,\n SidebarItem,\n SidebarItemBadge,\n SidebarItemIcon,\n SidebarItemLabel,\n type SidebarMode,\n} from '../../components/sidebar';\nimport { ThemeRoot } from '../../components/theme-root';\nimport { TooltipProvider } from '../../components/tooltip';\nimport { useTheme } from '../../hooks/use-theme';\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\nexport interface PatientNavItem {\n id: string;\n /** Pre-translated label — patients' nav labels are emitted already\n * translated by the consuming app's backend (legacy `knp_menu`). */\n label: string;\n href: string;\n /** Optional leading icon. Pass a lucide-react or equivalent element. */\n icon?: ReactNode;\n /** Optional unseen-item count rendered as a pill badge. */\n badgeCount?: number;\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n}\n\nexport interface PatientShellProps {\n /** Patient's display name. Used as the avatar fallback by consumers\n * that read the name through a slot; not rendered inside this shell\n * today because the legacy patient chrome carries no profile pill. */\n userName: string;\n /** Optional avatar URL. Reserved for future profile-pill surfaces;\n * no visible effect today. */\n userAvatarSrc?: string;\n /** Flat nav items rendered in the sidebar, in order. */\n menuItems: PatientNavItem[];\n /** URL the \"Logout\" action navigates to — typically `/logout`. */\n logoutHref: string;\n /** Fires when the user toggles fullscreen from the settings menu. */\n onToggleFullscreen?: () => void;\n /** Optional brand logo. Defaults to\n * `<Logo variant=\"monochrome\" size=\"md\" decorative />`. */\n brandLogo?: ReactNode;\n /** Link target for the brand — typically the patient dashboard. */\n brandHref?: string;\n /** Override the accessible name of the `<main>` landmark. */\n mainAriaLabel?: string;\n /**\n * Force the sidebar into a specific mode. Consuming apps typically\n * flip to `'overlay'` on narrow viewports and leave this undefined\n * elsewhere (the sidebar then defaults to `'expanded'`).\n */\n sidebarState?: SidebarMode;\n /** Children render inside the main content region. */\n children: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internals */\n/* ------------------------------------------------------------------ */\n\nfunction formatBadgeCount(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\n/**\n * Guard against `javascript:` and other non-navigation schemes before\n * handing the URL to `window.location.assign`. A consuming app that lets\n * attacker-controlled input reach `logoutHref` would otherwise execute\n * script. Allow only relative paths, hash fragments, and `http(s)` URLs.\n */\nfunction isSafeLogoutHref(href: string): boolean {\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) {\n return true;\n }\n try {\n const url = new URL(href, window.location.origin);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nfunction SettingsMenu({\n logoutHref,\n onToggleFullscreen,\n}: {\n logoutHref: string;\n onToggleFullscreen?: () => void;\n}) {\n const { t } = useTranslation();\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={<SettingsIcon aria-hidden=\"true\" />}\n aria-label={t('patientShell.settings.triggerAria')}\n tooltip={t('patientShell.settings.triggerAria')}\n data-testid=\"patient-shell-settings-trigger\"\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n <DropdownMenu.Item\n startIcon={<Maximize2 aria-hidden=\"true\" />}\n onSelect={onToggleFullscreen}\n data-testid=\"patient-shell-fullscreen\"\n >\n {t('patientShell.settings.fullscreen')}\n </DropdownMenu.Item>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n startIcon={<LogOut aria-hidden=\"true\" />}\n onSelect={() => {\n if (typeof window === 'undefined') return;\n if (!isSafeLogoutHref(logoutHref)) return;\n window.location.assign(logoutHref);\n }}\n data-testid=\"patient-shell-logout\"\n >\n {t('patientShell.settings.logout')}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n}\n\nfunction PatientSidebarNav({ menuItems }: { menuItems: PatientNavItem[] }) {\n return (\n <SidebarBody>\n {menuItems.map((item) => {\n const badge =\n typeof item.badgeCount === 'number' && item.badgeCount > 0\n ? item.badgeCount\n : undefined;\n return (\n <SidebarItem\n key={item.id}\n href={item.href}\n aria-label={item.label}\n isActive={item.isActive}\n >\n {item.icon ? <SidebarItemIcon>{item.icon}</SidebarItemIcon> : null}\n <SidebarItemLabel>{item.label}</SidebarItemLabel>\n {badge !== undefined ? (\n <SidebarItemBadge>{formatBadgeCount(badge)}</SidebarItemBadge>\n ) : null}\n </SidebarItem>\n );\n })}\n </SidebarBody>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const PatientShell = forwardRef<HTMLDivElement, PatientShellProps>(\n (\n {\n menuItems,\n logoutHref,\n onToggleFullscreen,\n brandLogo,\n brandHref = '/',\n mainAriaLabel,\n sidebarState,\n children,\n // `userName` and `userAvatarSrc` are declared on the public API\n // for forward-compatibility (future profile-pill work) — they are\n // intentionally unused today because the legacy patient chrome\n // carries no profile pill.\n userName: _userName,\n userAvatarSrc: _userAvatarSrc,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n // Only wrap children in a nested <ThemeRoot> when the user has\n // explicitly chosen a theme via the hook (e.g., through an in-app\n // toggle). Otherwise we let the outer cascade win — wrapping with\n // the hook's default `resolvedTheme = 'light'` would clobber a\n // consuming app's `<html>` theme class (or Storybook's decorator)\n // for every child rendered inside the shell.\n const { theme: themePref, accessibility, resolvedTheme } = useTheme();\n const hasExplicitOverride =\n themePref !== 'system' || accessibility !== 'system';\n const themeBase = resolvedTheme.startsWith('dark') ? 'dark' : 'light';\n const themeAccessible = resolvedTheme.endsWith('-accessible');\n\n // Narrow-viewport overlay: `HeaderMenuButton` only renders below the\n // `md` breakpoint, and toggling opens the Sidebar's overlay Dialog.\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const resolvedLogo = brandLogo ?? (\n <Logo variant=\"monochrome\" size=\"md\" decorative />\n );\n\n const shell = (\n <TooltipProvider>\n <AppFrame\n mainAriaLabel={mainAriaLabel}\n header={\n <Header>\n <HeaderStart>\n <HeaderSkipLink href=\"#main-content\" />\n <HeaderMenuButton onMenuOpen={() => setSidebarOpen(true)} />\n <HeaderBrand\n logo={resolvedLogo}\n href={brandHref}\n aria-label={t('patientShell.brand.homeAria')}\n />\n </HeaderStart>\n <HeaderCenter />\n <HeaderEnd>\n <SettingsMenu\n logoutHref={logoutHref}\n onToggleFullscreen={onToggleFullscreen}\n />\n </HeaderEnd>\n </Header>\n }\n sidebar={\n <Sidebar\n {...(sidebarState !== undefined\n ? { state: sidebarState }\n : { defaultState: 'expanded' as const })}\n open={sidebarOpen}\n onOpenChange={setSidebarOpen}\n aria-label={t('patientShell.sidebar.panelLabel')}\n data-testid=\"patient-shell-sidebar\"\n >\n <PatientSidebarNav menuItems={menuItems} />\n </Sidebar>\n }\n >\n {children}\n </AppFrame>\n </TooltipProvider>\n );\n\n if (!hasExplicitOverride) {\n // Pass-through wrapper preserves the ref contract without altering\n // the token cascade.\n return (\n <div ref={ref as never} className=\"ds:contents\">\n {shell}\n </div>\n );\n }\n\n return (\n <ThemeRoot\n ref={ref}\n theme={themeBase}\n accessible={themeAccessible}\n className=\"ds:contents\"\n >\n {shell}\n </ThemeRoot>\n );\n },\n);\n\nPatientShell.displayName = 'PatientShell';\n"],"names":["__iconNode","Maximize2","createLucideIcon","formatBadgeCount","count","isSafeLogoutHref","href","url","SettingsMenu","logoutHref","onToggleFullscreen","t","useTranslation","jsxs","DropdownMenu","jsx","IconButton","SettingsIcon","LogOut","PatientSidebarNav","menuItems","SidebarBody","item","badge","SidebarItem","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","PatientShell","forwardRef","brandLogo","brandHref","mainAriaLabel","sidebarState","children","_userName","_userAvatarSrc","ref","themePref","accessibility","resolvedTheme","useTheme","hasExplicitOverride","themeBase","themeAccessible","sidebarOpen","setSidebarOpen","useState","shell","TooltipProvider","AppFrame","Header","HeaderStart","HeaderSkipLink","HeaderMenuButton","HeaderBrand","Logo","HeaderCenter","HeaderEnd","Sidebar","ThemeRoot"],"mappings":"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","x_google_ignoreList":[0]}
@@ -6,7 +6,7 @@ import { S as J } from "./spinner-CCByyvcb.js";
6
6
  import { A as W } from "./alert-ywPR59NE.js";
7
7
  import { loadStripe as de } from "@stripe/stripe-js";
8
8
  import { Elements as ce, useStripe as le, useElements as me, PaymentElement as ue, AddressElement as pe } from "@stripe/react-stripe-js";
9
- import { u as fe } from "./registry-C9nwlNyL.js";
9
+ import { u as fe } from "./registry-nPAVE19X.js";
10
10
  function Y() {
11
11
  return typeof document < "u" && typeof window < "u";
12
12
  }
@@ -587,4 +587,4 @@ export {
587
587
  ye as p,
588
588
  ee as s
589
589
  };
590
- //# sourceMappingURL=payment-form-Ds3rxvad.js.map
590
+ //# sourceMappingURL=payment-form-D5rgnZu7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"payment-form-Ds3rxvad.js","sources":["../../src/tokens/themes/bridges/stripe-appearance.ts","../../src/components/payment-form/payment-form.agent.ts","../../src/components/payment-form/payment-form.tsx"],"sourcesContent":["import type { Appearance } from '@stripe/stripe-js';\n\n/**\n * Reads the current design-system tokens from a theme-root element and maps\n * them to Stripe Elements' Appearance API. `root` defaults to\n * `document.documentElement` but consumers can pass a scoped theme wrapper\n * (e.g. a modal with its own `.theme-accessible` override) so that Stripe\n * iframes pick up the right token set.\n *\n * Tokens referenced: --primary, --background, --foreground, --muted,\n * --muted-foreground, --border, --destructive, --radius-md, --font-sans,\n * --font-size-base, --spacing-sm, --animation-duration, --focus-ring-width,\n * --ring.\n *\n * No hex / rgb / hsl literals — every value flows from the token layer.\n */\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined' && typeof window !== 'undefined';\n}\n\nexport function getStripeAppearance(root?: HTMLElement): Appearance {\n if (!isBrowser()) {\n return { theme: 'stripe' };\n }\n\n const target = root ?? document.documentElement;\n const styles = getComputedStyle(target);\n const read = (token: string) => styles.getPropertyValue(token).trim();\n const isDark = target.classList.contains('theme-dark');\n\n return {\n theme: isDark ? 'night' : 'stripe',\n variables: {\n colorPrimary: read('--primary'),\n colorBackground: read('--background'),\n colorText: read('--foreground'),\n colorDanger: read('--destructive'),\n colorTextSecondary: read('--muted-foreground'),\n colorTextPlaceholder: read('--muted-foreground'),\n borderRadius: read('--radius-md'),\n fontFamily: read('--font-sans'),\n fontSizeBase: read('--font-size-base'),\n // Stripe multiplies spacingUnit throughout every Element; --spacing-sm\n // gives readable density. Keep this in sync with the JSDoc above.\n spacingUnit: read('--spacing-sm'),\n },\n rules: {\n '.Input': {\n backgroundColor: read('--background'),\n border: `1px solid ${read('--border')}`,\n color: read('--foreground'),\n padding: read('--spacing-sm'),\n transition: `border-color ${read('--animation-duration')} ease-out`,\n },\n '.Input:focus': {\n borderColor: read('--primary'),\n boxShadow: `0 0 0 ${read('--focus-ring-width')} ${read('--ring')}`,\n outline: 'none',\n },\n '.Input--invalid': {\n borderColor: read('--destructive'),\n color: read('--foreground'),\n },\n '.Label': {\n color: read('--foreground'),\n fontWeight: read('--font-weight-medium'),\n fontSize: read('--font-size-sm'),\n },\n '.Error': {\n color: read('--destructive'),\n fontSize: read('--font-size-sm'),\n },\n '.Tab': {\n border: `1px solid ${read('--border')}`,\n backgroundColor: read('--background'),\n color: read('--foreground'),\n },\n '.Tab--selected': {\n borderColor: read('--primary'),\n backgroundColor: read('--background'),\n color: read('--primary'),\n },\n },\n };\n}\n\n/**\n * Calls `onChange(getStripeAppearance(root))` whenever the theme root's\n * class list mutates (theme switch) or the user toggles\n * `prefers-color-scheme` / `prefers-reduced-motion`. Returns an\n * unsubscribe function.\n */\nexport function subscribeStripeAppearance(\n onChange: (next: Appearance) => void,\n root?: HTMLElement,\n): () => void {\n if (!isBrowser()) return () => undefined;\n\n const target = root ?? document.documentElement;\n const emit = () => onChange(getStripeAppearance(root));\n\n const observer = new MutationObserver(emit);\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'dir', 'lang'],\n });\n\n const schemeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const motionMql = window.matchMedia('(prefers-reduced-motion: reduce)');\n schemeMql.addEventListener('change', emit);\n motionMql.addEventListener('change', emit);\n\n return () => {\n observer.disconnect();\n schemeMql.removeEventListener('change', emit);\n motionMql.removeEventListener('change', emit);\n };\n}\n","import type { AgentAdapter } from '../../agent/types';\nimport type { PaymentFormHandle } from './payment-form';\n\nexport const paymentFormAgent: AgentAdapter<PaymentFormHandle> = {\n id: 'payment-form',\n capabilities: ['submit'],\n state: {},\n actions: {\n submit: {\n safety: 'destructive',\n description:\n 'Submit the payment. Charges the configured payment method — irreversible.',\n invoke: (handle) => handle.submit(),\n },\n reset: {\n safety: 'destructive',\n description:\n 'Reset the form to its initial state. Loses any in-progress input.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'payment-form' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* PaymentForm — Stripe Elements wrapper (PCI DSS SAQ-A). */\n/* */\n/* - Library: `@stripe/react-stripe-js` + `@stripe/stripe-js` (see */\n/* `src/docs/08-third-party.mdx §Payments`). Card number, expiry, */\n/* CVC, and postal code all live inside Stripe-hosted iframes on */\n/* `js.stripe.com` — raw PAN never touches our origin, keeping us */\n/* inside PCI DSS SAQ-A scope. */\n/* */\n/* - Theming: the `stripe-appearance` bridge snapshots our tokens into */\n/* Stripe's Appearance API (`variables`, `rules`). A */\n/* `MutationObserver` on `<html class>` re-runs the snapshot when */\n/* the user flips theme so the embedded iframes repaint. */\n/* */\n/* - Security invariants enforced in this file: */\n/* 1. No `<input type=\"tel\" name=\"card\">` anywhere. */\n/* 2. Error strings are sanitised via `stripCardLikeDigits` before */\n/* forwarding to `onError` (replaces any `\\b\\d{4,}\\b` with */\n/* `****`). */\n/* 3. Element change events are never logged; any dev-only logging */\n/* is gated behind `import.meta.env.DEV` — never runs in prod. */\n/* */\n/* TODO: */\n/* - Stripe's `direction: 'rtl'` is not part of the current */\n/* `Appearance` TypeScript type; we rely on CSS mirroring of our */\n/* chrome via logical properties and let Stripe lay out the iframe */\n/* ltr for now. Revisit when @stripe/stripe-js publishes the type. */\n/* - No `<CardNumberElement>` / split-fields story — `PaymentElement` */\n/* handles accordion + card-only modes via its own `layout` option.*/\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Spinner } from '../spinner';\nimport { Alert } from '../alert';\nimport {\n loadStripe,\n type Stripe,\n type Appearance,\n type StripeElementLocale,\n} from '@stripe/stripe-js';\nimport {\n Elements,\n PaymentElement,\n AddressElement,\n useElements,\n useStripe,\n} from '@stripe/react-stripe-js';\n\nimport {\n getStripeAppearance,\n subscribeStripeAppearance,\n} from '../../tokens/themes/bridges/stripe-appearance';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { paymentFormAgent } from './payment-form.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type PaymentCurrency = string; // ISO-4217\n\nexport interface PaymentFormProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Required — from your server, created via the PaymentIntents API. */\n clientSecret: string;\n /** Stripe publishable key (`pk_test_…` / `pk_live_…`). */\n publishableKey: string;\n /** ISO-4217 currency code (e.g. 'EUR', 'USD', 'JPY'). */\n currency: PaymentCurrency;\n /** Amount in the currency's smallest unit (cents for EUR/USD, yen for JPY). */\n amount: number;\n /** Called with the PaymentIntent id on successful confirmation. */\n onSuccess?: (paymentIntentId: string) => void;\n /** Called with a sanitised error (no PAN digits, no Stripe English strings). */\n onError?: (error: { code: string; translatedMessage: string }) => void;\n /** Show the billing-address collector below the payment fields. */\n billingAddress?: boolean;\n /** Locale override — defaults to the active i18next locale. */\n locale?: string;\n /** Accessible label for the form. */\n ariaLabel?: string;\n /** URL Stripe redirects to when a payment method requires it. */\n returnUrl?: string;\n /** Pre-injected Stripe instance — used by tests + stories to bypass the network. */\n stripePromise?: Promise<Stripe | null> | null;\n className?: string;\n}\n\nexport interface PaymentFormHandle {\n /** Programmatically submit the form (same flow as the Pay button). */\n submit: () => Promise<void>;\n /** Reset the form to its initial state. */\n reset: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Currency helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Currencies that Stripe bills in their base unit (no decimals). Source:\n * https://stripe.com/docs/currencies#zero-decimal — list pinned per\n * 08-third-party.mdx.\n */\nconst ZERO_DECIMAL_CURRENCIES = new Set<string>([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'IDR',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\n\nexport function formatPaymentAmount(\n amount: number,\n currency: string,\n locale: string,\n): string {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso) ? amount : amount / 100;\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: iso,\n }).format(major);\n } catch {\n // Invalid locale/currency pair — fall back to a safe format so we\n // never leak raw amount integers into the UI.\n return new Intl.NumberFormat('en', {\n style: 'currency',\n currency: iso,\n }).format(major);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Return URL validation */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolve `returnUrl` against the current origin. Accepts:\n * - absolute URLs on the same origin as `window.location`\n * - relative paths (resolved against the current origin)\n * Rejects (returns `null`):\n * - cross-origin URLs — would leak `payment_intent_client_secret`\n * - `javascript:` / `data:` / `file:` / `blob:` schemes\n * - SSR contexts (no `window`) — the submit path requires a browser\n * anyway, so rejecting here is the safer default.\n * See security-hardening.mdx.\n */\nexport function validateReturnUrl(\n returnUrl: string | undefined,\n): string | null {\n if (returnUrl === undefined) return null;\n const raw = returnUrl.trim();\n if (raw === '') return null;\n if (typeof window === 'undefined') return null;\n try {\n const resolved = new URL(raw, window.location.href);\n const allowedSchemes = new Set(['http:', 'https:']);\n if (!allowedSchemes.has(resolved.protocol)) return null;\n if (resolved.origin !== window.location.origin) return null;\n return resolved.toString();\n } catch {\n return null;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Error sanitisation */\n/* ------------------------------------------------------------------ */\n\n/**\n * Replace any run of 4+ consecutive digits with `****`. Called before any\n * error text leaves the wrapper. Defensive: even though Stripe's error\n * strings don't normally contain PANs, a future SDK change could, and we\n * want a hard guarantee that `console` / analytics / Sentry breadcrumbs\n * stay clear of anything that looks like card data.\n */\nexport function stripCardLikeDigits(message: string): string {\n if (!message) return message;\n // Deliberately no word boundaries: a PAN run embedded between word\n // characters (e.g. \"CARD4242424242424242DECLINED\") must still be masked.\n return message.replace(/\\d{4,}/g, '****');\n}\n\n/**\n * Map a Stripe error code (e.g. `card_declined`, `incorrect_number`) to a\n * translation key under `payment.error.*`. Unknown codes fall through to\n * `payment.error.generic`.\n */\nexport function stripeErrorCodeToI18nKey(code: string | undefined): string {\n switch (code) {\n case 'incorrect_number':\n case 'invalid_number':\n return 'payment.error.cardNumber';\n case 'invalid_expiry_month':\n case 'invalid_expiry_year':\n case 'expired_card':\n return 'payment.error.expiry';\n case 'invalid_cvc':\n case 'incorrect_cvc':\n return 'payment.error.cvc';\n case 'incorrect_zip':\n case 'invalid_zip':\n return 'payment.error.postalCode';\n case 'card_declined':\n case 'do_not_honor':\n case 'generic_decline':\n return 'payment.error.declined';\n case 'network_error':\n case 'api_connection_error':\n return 'payment.error.network';\n default:\n return 'payment.error.generic';\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst formVariants = cva(\n [\n 'ds:payment-form-alfadocs ds:flex ds:flex-col',\n 'ds:gap-[var(--spacing-md)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst fieldLabelVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]'].join(' '),\n);\n\nconst labelTextVariants = cva(\n ['type-label', 'ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst amountSummaryVariants = cva(\n [\n 'ds:flex ds:items-baseline ds:justify-between',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:bg-[var(--muted)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)]',\n ].join(' '),\n);\n\nconst submitButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-block-size-[var(--min-target-size)]',\n 'ds:min-inline-size-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n 'ds:aria-busy:cursor-wait',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Inner form — lives inside the <Elements> provider */\n/* ------------------------------------------------------------------ */\n\ninterface InnerPaymentFormProps {\n amount: number;\n currency: string;\n locale: string;\n billingAddress: boolean;\n returnUrl: string | undefined;\n onSuccess: PaymentFormProps['onSuccess'];\n onError: PaymentFormProps['onError'];\n}\n\nfunction InnerPaymentForm(props: InnerPaymentFormProps): JSX.Element {\n const {\n amount,\n currency,\n locale,\n billingAddress,\n returnUrl,\n onSuccess,\n onError,\n } = props;\n\n const { t } = useTranslation();\n const stripe = useStripe();\n const elements = useElements();\n\n const rawId = useId();\n const idSafe = useMemo(\n () => `pay-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const paymentFieldId = `${idSafe}-payment`;\n const addressFieldId = `${idSafe}-address`;\n const errorId = `${idSafe}-error`;\n\n const [processing, setProcessing] = useState(false);\n const [elementComplete, setElementComplete] = useState(false);\n const [errorKey, setErrorKey] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n }, [onSuccess, onError]);\n\n const handleSubmit = useCallback(\n async (event?: FormEvent<HTMLFormElement>): Promise<void> => {\n if (event) event.preventDefault();\n if (!stripe || !elements) return;\n if (processing) return;\n\n setProcessing(true);\n setErrorKey(null);\n setErrorMessage('');\n\n // Validate returnUrl at the boundary so even a careless consumer\n // cannot leak payment_intent_client_secret to a third-party origin.\n const safeReturnUrl = validateReturnUrl(returnUrl);\n if (returnUrl !== undefined && safeReturnUrl === null) {\n setErrorKey('payment.error.invalidReturnUrl');\n setErrorMessage(t('payment.error.invalidReturnUrl'));\n onErrorRef.current?.({\n code: 'invalid_return_url',\n translatedMessage: t('payment.error.invalidReturnUrl'),\n });\n setProcessing(false);\n return;\n }\n try {\n const result = await stripe.confirmPayment({\n elements,\n confirmParams: safeReturnUrl ? { return_url: safeReturnUrl } : {},\n redirect: 'if_required',\n });\n\n if (result.error) {\n const code = result.error.code ?? 'generic';\n const key = stripeErrorCodeToI18nKey(code);\n // CRITICAL: sanitise before storing OR forwarding.\n const safe = stripCardLikeDigits(result.error.message ?? '');\n setErrorKey(key);\n setErrorMessage(t(key));\n onErrorRef.current?.({\n code,\n translatedMessage: safe || t(key),\n });\n return;\n }\n\n // Success path — only the PaymentIntent id leaves the wrapper.\n if (result.paymentIntent) {\n onSuccessRef.current?.(result.paymentIntent.id);\n }\n } catch (err: unknown) {\n const raw = err instanceof Error ? err.message : '';\n const safe = stripCardLikeDigits(raw);\n setErrorKey('payment.error.generic');\n setErrorMessage(t('payment.error.generic'));\n onErrorRef.current?.({\n code: 'unexpected',\n translatedMessage: safe || t('payment.error.generic'),\n });\n } finally {\n setProcessing(false);\n }\n },\n [stripe, elements, processing, returnUrl, t],\n );\n\n // Imperative submit hook used by the outer component's ref handle.\n useEffect(() => {\n const host = document.getElementById(idSafe);\n if (!host) return;\n const submitter = () => {\n void handleSubmit();\n };\n host.addEventListener('payment-form:submit', submitter);\n return () => host.removeEventListener('payment-form:submit', submitter);\n }, [idSafe, handleSubmit]);\n\n const submitDisabled = !stripe || !elements || !elementComplete || processing;\n\n return (\n <form\n id={idSafe}\n onSubmit={handleSubmit}\n aria-label={t('payment.ariaLabel')}\n aria-busy={processing || undefined}\n noValidate\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className={amountSummaryVariants()}>\n <span className={labelTextVariants()}>\n {t('payment.amountLabel')}\n </span>\n <span className=\"type-title-card\" data-testid=\"payment-amount\">\n {formatPaymentAmount(amount, currency, locale)}\n </span>\n </div>\n\n <label\n htmlFor={paymentFieldId}\n className={fieldLabelVariants()}\n data-testid=\"payment-field\"\n >\n <span className={labelTextVariants()}>\n {t('payment.fields.card')}\n </span>\n <PaymentElement\n id={paymentFieldId}\n options={{\n layout: { type: 'accordion', defaultCollapsed: false },\n }}\n onChange={(ev) => {\n // NOTE: never log `ev` — change events may include hints\n // about field contents. Keep only the boolean completeness.\n setElementComplete(ev.complete === true);\n if (ev.complete) {\n setErrorKey(null);\n setErrorMessage('');\n }\n }}\n />\n </label>\n\n {billingAddress ? (\n <label\n htmlFor={addressFieldId}\n className={fieldLabelVariants()}\n data-testid=\"payment-address\"\n >\n <span className={labelTextVariants()}>\n {t('payment.billingAddress')}\n </span>\n <AddressElement id={addressFieldId} options={{ mode: 'billing' }} />\n </label>\n ) : null}\n\n {errorKey ? (\n <Alert\n id={errorId}\n variant=\"error\"\n live=\"polite\"\n data-testid=\"payment-error\"\n >\n <Alert.Description>{errorMessage}</Alert.Description>\n </Alert>\n ) : null}\n\n <button\n type=\"submit\"\n aria-disabled={submitDisabled || undefined}\n aria-busy={processing || undefined}\n aria-describedby={errorKey ? errorId : undefined}\n className={submitButtonVariants()}\n data-testid=\"payment-submit\"\n >\n {processing ? (\n <>\n <Spinner size=\"sm\" label={t('payment.processing')} />\n <span>{t('payment.processing')}</span>\n </>\n ) : (\n <span>\n {t('payment.submit', {\n amount: formatPaymentAmount(amount, currency, locale),\n })}\n </span>\n )}\n </button>\n </div>\n </form>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* PaymentForm — outer wrapper */\n/* ------------------------------------------------------------------ */\n\n/**\n * Stripe ships a closed union of supported locales; anything outside it\n * must fall through to `'auto'` (Stripe picks the best match from the\n * browser). We also normalise the legacy `cn` code to `zh` per\n * `src/docs/06-i18n.mdx`.\n */\nconst STRIPE_LOCALES = new Set<StripeElementLocale>([\n 'auto',\n 'ar',\n 'bg',\n 'cs',\n 'da',\n 'de',\n 'el',\n 'en',\n 'en-AU',\n 'en-CA',\n 'en-NZ',\n 'en-GB',\n 'es',\n 'es-ES',\n 'es-419',\n 'et',\n 'fi',\n 'fil',\n 'fr',\n 'fr-CA',\n 'fr-FR',\n 'he',\n 'hu',\n 'hr',\n 'id',\n 'it',\n 'it-IT',\n 'ja',\n 'ko',\n 'lt',\n 'lv',\n 'ms',\n 'mt',\n 'nb',\n 'nl',\n 'no',\n 'pl',\n 'pt',\n 'pt-BR',\n 'ro',\n 'ru',\n 'sk',\n 'sl',\n 'sv',\n 'th',\n 'tr',\n 'vi',\n 'zh',\n 'zh-HK',\n 'zh-TW',\n]);\n\nfunction normaliseLocale(input: string): StripeElementLocale {\n if (!input) return 'auto';\n const candidate = input === 'cn' ? 'zh' : input;\n if ((STRIPE_LOCALES as Set<string>).has(candidate)) {\n return candidate as StripeElementLocale;\n }\n // Try stripping region (\"en-US\" → \"en\") before giving up.\n const base = candidate.split('-')[0];\n if ((STRIPE_LOCALES as Set<string>).has(base)) {\n return base as StripeElementLocale;\n }\n return 'auto';\n}\n\nexport const PaymentForm = forwardRef<HTMLDivElement, PaymentFormProps>(\n (\n {\n id,\n clientSecret,\n publishableKey,\n currency,\n amount,\n onSuccess,\n onError,\n billingAddress = false,\n locale,\n ariaLabel,\n returnUrl,\n stripePromise: injectedStripe,\n className,\n },\n ref,\n ) => {\n const { i18n } = useTranslation();\n const activeLocale = normaliseLocale(locale ?? i18n.language ?? 'en');\n\n // Stripe instance — pre-injected (tests/stories) or lazily loaded.\n const [stripeInstance, setStripeInstance] =\n useState<Promise<Stripe | null> | null>(injectedStripe ?? null);\n\n useEffect(() => {\n if (injectedStripe !== undefined) {\n setStripeInstance(injectedStripe);\n return;\n }\n if (!publishableKey) {\n setStripeInstance(null);\n return;\n }\n // `loadStripe` is cached by the SDK — safe to call per mount.\n setStripeInstance(loadStripe(publishableKey));\n }, [injectedStripe, publishableKey]);\n\n // Appearance bridge — snapshot + subscribe.\n const [appearance, setAppearance] = useState<Appearance>(() =>\n getStripeAppearance(),\n );\n useEffect(() => {\n setAppearance(getStripeAppearance());\n const unsubscribe = subscribeStripeAppearance(setAppearance);\n return unsubscribe;\n }, []);\n\n // Imperative handle — dispatch a custom event at the inner form so we\n // can trigger the same submit path as the button without leaking refs\n // through the Stripe `<Elements>` provider (which owns its own tree).\n const hostRef = useRef<HTMLDivElement>(null);\n\n const agentHandle = useMemo<PaymentFormHandle>(\n () => ({\n submit: async () => {\n const form = hostRef.current?.querySelector('form');\n if (form) {\n form.dispatchEvent(\n new CustomEvent('payment-form:submit', { bubbles: true }),\n );\n }\n },\n reset: () => {\n const form = hostRef.current?.querySelector('form');\n if (form instanceof HTMLFormElement) {\n form.reset();\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => hostRef.current as HTMLDivElement, []);\n useAgentRegistration(paymentFormAgent, agentHandle, id);\n\n const elementsOptions = useMemo(\n () => ({\n clientSecret,\n appearance,\n locale: activeLocale,\n }),\n [clientSecret, appearance, activeLocale],\n );\n\n return (\n <div\n ref={hostRef}\n aria-label={ariaLabel}\n className={[formVariants(), className].filter(Boolean).join(' ')}\n data-component=\"payment-form\"\n data-component-id={id}\n data-testid=\"payment-form-root\"\n >\n {stripeInstance && clientSecret ? (\n <Elements\n stripe={stripeInstance}\n options={elementsOptions}\n key={clientSecret}\n >\n <InnerPaymentForm\n amount={amount}\n currency={currency}\n locale={activeLocale}\n billingAddress={billingAddress}\n returnUrl={returnUrl}\n onSuccess={onSuccess}\n onError={onError}\n />\n </Elements>\n ) : (\n <PaymentFormSkeleton\n amount={amount}\n currency={currency}\n locale={activeLocale}\n billingAddress={billingAddress}\n />\n )}\n </div>\n );\n },\n);\n\nPaymentForm.displayName = 'PaymentForm';\n\n/* ------------------------------------------------------------------ */\n/* Skeleton — visual chrome when Stripe hasn't loaded yet */\n/* ------------------------------------------------------------------ */\n\ninterface PaymentFormSkeletonProps {\n amount: number;\n currency: string;\n locale: string;\n billingAddress: boolean;\n}\n\nfunction PaymentFormSkeleton(props: PaymentFormSkeletonProps): JSX.Element {\n const { amount, currency, locale, billingAddress } = props;\n const { t } = useTranslation();\n\n return (\n <div\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n data-testid=\"payment-skeleton\"\n aria-busy=\"true\"\n >\n <div className={amountSummaryVariants()}>\n <span className={labelTextVariants()}>{t('payment.amountLabel')}</span>\n <span className=\"type-title-card\">\n {formatPaymentAmount(amount, currency, locale)}\n </span>\n </div>\n <div className={fieldLabelVariants()}>\n <span className={labelTextVariants()}>{t('payment.fields.card')}</span>\n <div\n className=\"ds:min-block-size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n {billingAddress ? (\n <div className={fieldLabelVariants()} data-testid=\"payment-address\">\n <span className={labelTextVariants()}>\n {t('payment.billingAddress')}\n </span>\n <div\n className=\"ds:min-block-size-[calc(var(--min-target-size)*2)] ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n ) : null}\n <button\n type=\"button\"\n aria-disabled=\"true\"\n className={submitButtonVariants()}\n disabled\n >\n <Spinner size=\"sm\" label={t('payment.processing')} />\n <span>{t('payment.processing')}</span>\n </button>\n </div>\n );\n}\n\nexport {\n formVariants as paymentFormVariants,\n submitButtonVariants as paymentSubmitButtonVariants,\n};\n"],"names":["isBrowser","getStripeAppearance","root","target","styles","read","token","subscribeStripeAppearance","onChange","emit","observer","schemeMql","motionMql","paymentFormAgent","handle","ZERO_DECIMAL_CURRENCIES","formatPaymentAmount","amount","currency","locale","iso","major","validateReturnUrl","returnUrl","raw","resolved","stripCardLikeDigits","message","stripeErrorCodeToI18nKey","code","formVariants","cva","fieldLabelVariants","labelTextVariants","amountSummaryVariants","submitButtonVariants","InnerPaymentForm","props","billingAddress","onSuccess","onError","t","useTranslation","stripe","useStripe","elements","useElements","rawId","useId","idSafe","useMemo","paymentFieldId","addressFieldId","errorId","processing","setProcessing","useState","elementComplete","setElementComplete","errorKey","setErrorKey","errorMessage","setErrorMessage","onSuccessRef","useRef","onErrorRef","useEffect","handleSubmit","useCallback","event","safeReturnUrl","_a","result","key","safe","_b","_c","err","_d","host","submitter","submitDisabled","jsx","jsxs","PaymentElement","ev","AddressElement","Alert","Fragment","Spinner","STRIPE_LOCALES","normaliseLocale","input","candidate","base","PaymentForm","forwardRef","id","clientSecret","publishableKey","ariaLabel","injectedStripe","className","ref","i18n","activeLocale","stripeInstance","setStripeInstance","loadStripe","appearance","setAppearance","hostRef","agentHandle","form","useImperativeHandle","useAgentRegistration","elementsOptions","Elements","PaymentFormSkeleton"],"mappings":"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"}
1
+ {"version":3,"file":"payment-form-D5rgnZu7.js","sources":["../../src/tokens/themes/bridges/stripe-appearance.ts","../../src/components/payment-form/payment-form.agent.ts","../../src/components/payment-form/payment-form.tsx"],"sourcesContent":["import type { Appearance } from '@stripe/stripe-js';\n\n/**\n * Reads the current design-system tokens from a theme-root element and maps\n * them to Stripe Elements' Appearance API. `root` defaults to\n * `document.documentElement` but consumers can pass a scoped theme wrapper\n * (e.g. a modal with its own `.theme-accessible` override) so that Stripe\n * iframes pick up the right token set.\n *\n * Tokens referenced: --primary, --background, --foreground, --muted,\n * --muted-foreground, --border, --destructive, --radius-md, --font-sans,\n * --font-size-base, --spacing-sm, --animation-duration, --focus-ring-width,\n * --ring.\n *\n * No hex / rgb / hsl literals — every value flows from the token layer.\n */\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined' && typeof window !== 'undefined';\n}\n\nexport function getStripeAppearance(root?: HTMLElement): Appearance {\n if (!isBrowser()) {\n return { theme: 'stripe' };\n }\n\n const target = root ?? document.documentElement;\n const styles = getComputedStyle(target);\n const read = (token: string) => styles.getPropertyValue(token).trim();\n const isDark = target.classList.contains('theme-dark');\n\n return {\n theme: isDark ? 'night' : 'stripe',\n variables: {\n colorPrimary: read('--primary'),\n colorBackground: read('--background'),\n colorText: read('--foreground'),\n colorDanger: read('--destructive'),\n colorTextSecondary: read('--muted-foreground'),\n colorTextPlaceholder: read('--muted-foreground'),\n borderRadius: read('--radius-md'),\n fontFamily: read('--font-sans'),\n fontSizeBase: read('--font-size-base'),\n // Stripe multiplies spacingUnit throughout every Element; --spacing-sm\n // gives readable density. Keep this in sync with the JSDoc above.\n spacingUnit: read('--spacing-sm'),\n },\n rules: {\n '.Input': {\n backgroundColor: read('--background'),\n border: `1px solid ${read('--border')}`,\n color: read('--foreground'),\n padding: read('--spacing-sm'),\n transition: `border-color ${read('--animation-duration')} ease-out`,\n },\n '.Input:focus': {\n borderColor: read('--primary'),\n boxShadow: `0 0 0 ${read('--focus-ring-width')} ${read('--ring')}`,\n outline: 'none',\n },\n '.Input--invalid': {\n borderColor: read('--destructive'),\n color: read('--foreground'),\n },\n '.Label': {\n color: read('--foreground'),\n fontWeight: read('--font-weight-medium'),\n fontSize: read('--font-size-sm'),\n },\n '.Error': {\n color: read('--destructive'),\n fontSize: read('--font-size-sm'),\n },\n '.Tab': {\n border: `1px solid ${read('--border')}`,\n backgroundColor: read('--background'),\n color: read('--foreground'),\n },\n '.Tab--selected': {\n borderColor: read('--primary'),\n backgroundColor: read('--background'),\n color: read('--primary'),\n },\n },\n };\n}\n\n/**\n * Calls `onChange(getStripeAppearance(root))` whenever the theme root's\n * class list mutates (theme switch) or the user toggles\n * `prefers-color-scheme` / `prefers-reduced-motion`. Returns an\n * unsubscribe function.\n */\nexport function subscribeStripeAppearance(\n onChange: (next: Appearance) => void,\n root?: HTMLElement,\n): () => void {\n if (!isBrowser()) return () => undefined;\n\n const target = root ?? document.documentElement;\n const emit = () => onChange(getStripeAppearance(root));\n\n const observer = new MutationObserver(emit);\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'dir', 'lang'],\n });\n\n const schemeMql = window.matchMedia('(prefers-color-scheme: dark)');\n const motionMql = window.matchMedia('(prefers-reduced-motion: reduce)');\n schemeMql.addEventListener('change', emit);\n motionMql.addEventListener('change', emit);\n\n return () => {\n observer.disconnect();\n schemeMql.removeEventListener('change', emit);\n motionMql.removeEventListener('change', emit);\n };\n}\n","import type { AgentAdapter } from '../../agent/types';\nimport type { PaymentFormHandle } from './payment-form';\n\nexport const paymentFormAgent: AgentAdapter<PaymentFormHandle> = {\n id: 'payment-form',\n capabilities: ['submit'],\n state: {},\n actions: {\n submit: {\n safety: 'destructive',\n description:\n 'Submit the payment. Charges the configured payment method — irreversible.',\n invoke: (handle) => handle.submit(),\n },\n reset: {\n safety: 'destructive',\n description:\n 'Reset the form to its initial state. Loses any in-progress input.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'payment-form' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* PaymentForm — Stripe Elements wrapper (PCI DSS SAQ-A). */\n/* */\n/* - Library: `@stripe/react-stripe-js` + `@stripe/stripe-js` (see */\n/* `src/docs/08-third-party.mdx §Payments`). Card number, expiry, */\n/* CVC, and postal code all live inside Stripe-hosted iframes on */\n/* `js.stripe.com` — raw PAN never touches our origin, keeping us */\n/* inside PCI DSS SAQ-A scope. */\n/* */\n/* - Theming: the `stripe-appearance` bridge snapshots our tokens into */\n/* Stripe's Appearance API (`variables`, `rules`). A */\n/* `MutationObserver` on `<html class>` re-runs the snapshot when */\n/* the user flips theme so the embedded iframes repaint. */\n/* */\n/* - Security invariants enforced in this file: */\n/* 1. No `<input type=\"tel\" name=\"card\">` anywhere. */\n/* 2. Error strings are sanitised via `stripCardLikeDigits` before */\n/* forwarding to `onError` (replaces any `\\b\\d{4,}\\b` with */\n/* `****`). */\n/* 3. Element change events are never logged; any dev-only logging */\n/* is gated behind `import.meta.env.DEV` — never runs in prod. */\n/* */\n/* TODO: */\n/* - Stripe's `direction: 'rtl'` is not part of the current */\n/* `Appearance` TypeScript type; we rely on CSS mirroring of our */\n/* chrome via logical properties and let Stripe lay out the iframe */\n/* ltr for now. Revisit when @stripe/stripe-js publishes the type. */\n/* - No `<CardNumberElement>` / split-fields story — `PaymentElement` */\n/* handles accordion + card-only modes via its own `layout` option.*/\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Spinner } from '../spinner';\nimport { Alert } from '../alert';\nimport {\n loadStripe,\n type Stripe,\n type Appearance,\n type StripeElementLocale,\n} from '@stripe/stripe-js';\nimport {\n Elements,\n PaymentElement,\n AddressElement,\n useElements,\n useStripe,\n} from '@stripe/react-stripe-js';\n\nimport {\n getStripeAppearance,\n subscribeStripeAppearance,\n} from '../../tokens/themes/bridges/stripe-appearance';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { paymentFormAgent } from './payment-form.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type PaymentCurrency = string; // ISO-4217\n\nexport interface PaymentFormProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Required — from your server, created via the PaymentIntents API. */\n clientSecret: string;\n /** Stripe publishable key (`pk_test_…` / `pk_live_…`). */\n publishableKey: string;\n /** ISO-4217 currency code (e.g. 'EUR', 'USD', 'JPY'). */\n currency: PaymentCurrency;\n /** Amount in the currency's smallest unit (cents for EUR/USD, yen for JPY). */\n amount: number;\n /** Called with the PaymentIntent id on successful confirmation. */\n onSuccess?: (paymentIntentId: string) => void;\n /** Called with a sanitised error (no PAN digits, no Stripe English strings). */\n onError?: (error: { code: string; translatedMessage: string }) => void;\n /** Show the billing-address collector below the payment fields. */\n billingAddress?: boolean;\n /** Locale override — defaults to the active i18next locale. */\n locale?: string;\n /** Accessible label for the form. */\n ariaLabel?: string;\n /** URL Stripe redirects to when a payment method requires it. */\n returnUrl?: string;\n /** Pre-injected Stripe instance — used by tests + stories to bypass the network. */\n stripePromise?: Promise<Stripe | null> | null;\n className?: string;\n}\n\nexport interface PaymentFormHandle {\n /** Programmatically submit the form (same flow as the Pay button). */\n submit: () => Promise<void>;\n /** Reset the form to its initial state. */\n reset: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Currency helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Currencies that Stripe bills in their base unit (no decimals). Source:\n * https://stripe.com/docs/currencies#zero-decimal — list pinned per\n * 08-third-party.mdx.\n */\nconst ZERO_DECIMAL_CURRENCIES = new Set<string>([\n 'BIF',\n 'CLP',\n 'DJF',\n 'GNF',\n 'IDR',\n 'JPY',\n 'KMF',\n 'KRW',\n 'MGA',\n 'PYG',\n 'RWF',\n 'UGX',\n 'VND',\n 'VUV',\n 'XAF',\n 'XOF',\n 'XPF',\n]);\n\nexport function formatPaymentAmount(\n amount: number,\n currency: string,\n locale: string,\n): string {\n const iso = currency.toUpperCase();\n const major = ZERO_DECIMAL_CURRENCIES.has(iso) ? amount : amount / 100;\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: iso,\n }).format(major);\n } catch {\n // Invalid locale/currency pair — fall back to a safe format so we\n // never leak raw amount integers into the UI.\n return new Intl.NumberFormat('en', {\n style: 'currency',\n currency: iso,\n }).format(major);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Return URL validation */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolve `returnUrl` against the current origin. Accepts:\n * - absolute URLs on the same origin as `window.location`\n * - relative paths (resolved against the current origin)\n * Rejects (returns `null`):\n * - cross-origin URLs — would leak `payment_intent_client_secret`\n * - `javascript:` / `data:` / `file:` / `blob:` schemes\n * - SSR contexts (no `window`) — the submit path requires a browser\n * anyway, so rejecting here is the safer default.\n * See security-hardening.mdx.\n */\nexport function validateReturnUrl(\n returnUrl: string | undefined,\n): string | null {\n if (returnUrl === undefined) return null;\n const raw = returnUrl.trim();\n if (raw === '') return null;\n if (typeof window === 'undefined') return null;\n try {\n const resolved = new URL(raw, window.location.href);\n const allowedSchemes = new Set(['http:', 'https:']);\n if (!allowedSchemes.has(resolved.protocol)) return null;\n if (resolved.origin !== window.location.origin) return null;\n return resolved.toString();\n } catch {\n return null;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Error sanitisation */\n/* ------------------------------------------------------------------ */\n\n/**\n * Replace any run of 4+ consecutive digits with `****`. Called before any\n * error text leaves the wrapper. Defensive: even though Stripe's error\n * strings don't normally contain PANs, a future SDK change could, and we\n * want a hard guarantee that `console` / analytics / Sentry breadcrumbs\n * stay clear of anything that looks like card data.\n */\nexport function stripCardLikeDigits(message: string): string {\n if (!message) return message;\n // Deliberately no word boundaries: a PAN run embedded between word\n // characters (e.g. \"CARD4242424242424242DECLINED\") must still be masked.\n return message.replace(/\\d{4,}/g, '****');\n}\n\n/**\n * Map a Stripe error code (e.g. `card_declined`, `incorrect_number`) to a\n * translation key under `payment.error.*`. Unknown codes fall through to\n * `payment.error.generic`.\n */\nexport function stripeErrorCodeToI18nKey(code: string | undefined): string {\n switch (code) {\n case 'incorrect_number':\n case 'invalid_number':\n return 'payment.error.cardNumber';\n case 'invalid_expiry_month':\n case 'invalid_expiry_year':\n case 'expired_card':\n return 'payment.error.expiry';\n case 'invalid_cvc':\n case 'incorrect_cvc':\n return 'payment.error.cvc';\n case 'incorrect_zip':\n case 'invalid_zip':\n return 'payment.error.postalCode';\n case 'card_declined':\n case 'do_not_honor':\n case 'generic_decline':\n return 'payment.error.declined';\n case 'network_error':\n case 'api_connection_error':\n return 'payment.error.network';\n default:\n return 'payment.error.generic';\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst formVariants = cva(\n [\n 'ds:payment-form-alfadocs ds:flex ds:flex-col',\n 'ds:gap-[var(--spacing-md)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst fieldLabelVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]'].join(' '),\n);\n\nconst labelTextVariants = cva(\n ['type-label', 'ds:text-[var(--foreground)]'].join(' '),\n);\n\nconst amountSummaryVariants = cva(\n [\n 'ds:flex ds:items-baseline ds:justify-between',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'ds:bg-[var(--muted)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[var(--foreground)]',\n ].join(' '),\n);\n\nconst submitButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-block-size-[var(--min-target-size)]',\n 'ds:min-inline-size-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n 'ds:aria-busy:cursor-wait',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Inner form — lives inside the <Elements> provider */\n/* ------------------------------------------------------------------ */\n\ninterface InnerPaymentFormProps {\n amount: number;\n currency: string;\n locale: string;\n billingAddress: boolean;\n returnUrl: string | undefined;\n onSuccess: PaymentFormProps['onSuccess'];\n onError: PaymentFormProps['onError'];\n}\n\nfunction InnerPaymentForm(props: InnerPaymentFormProps): JSX.Element {\n const {\n amount,\n currency,\n locale,\n billingAddress,\n returnUrl,\n onSuccess,\n onError,\n } = props;\n\n const { t } = useTranslation();\n const stripe = useStripe();\n const elements = useElements();\n\n const rawId = useId();\n const idSafe = useMemo(\n () => `pay-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const paymentFieldId = `${idSafe}-payment`;\n const addressFieldId = `${idSafe}-address`;\n const errorId = `${idSafe}-error`;\n\n const [processing, setProcessing] = useState(false);\n const [elementComplete, setElementComplete] = useState(false);\n const [errorKey, setErrorKey] = useState<string | null>(null);\n const [errorMessage, setErrorMessage] = useState<string>('');\n\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n useEffect(() => {\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n }, [onSuccess, onError]);\n\n const handleSubmit = useCallback(\n async (event?: FormEvent<HTMLFormElement>): Promise<void> => {\n if (event) event.preventDefault();\n if (!stripe || !elements) return;\n if (processing) return;\n\n setProcessing(true);\n setErrorKey(null);\n setErrorMessage('');\n\n // Validate returnUrl at the boundary so even a careless consumer\n // cannot leak payment_intent_client_secret to a third-party origin.\n const safeReturnUrl = validateReturnUrl(returnUrl);\n if (returnUrl !== undefined && safeReturnUrl === null) {\n setErrorKey('payment.error.invalidReturnUrl');\n setErrorMessage(t('payment.error.invalidReturnUrl'));\n onErrorRef.current?.({\n code: 'invalid_return_url',\n translatedMessage: t('payment.error.invalidReturnUrl'),\n });\n setProcessing(false);\n return;\n }\n try {\n const result = await stripe.confirmPayment({\n elements,\n confirmParams: safeReturnUrl ? { return_url: safeReturnUrl } : {},\n redirect: 'if_required',\n });\n\n if (result.error) {\n const code = result.error.code ?? 'generic';\n const key = stripeErrorCodeToI18nKey(code);\n // CRITICAL: sanitise before storing OR forwarding.\n const safe = stripCardLikeDigits(result.error.message ?? '');\n setErrorKey(key);\n setErrorMessage(t(key));\n onErrorRef.current?.({\n code,\n translatedMessage: safe || t(key),\n });\n return;\n }\n\n // Success path — only the PaymentIntent id leaves the wrapper.\n if (result.paymentIntent) {\n onSuccessRef.current?.(result.paymentIntent.id);\n }\n } catch (err: unknown) {\n const raw = err instanceof Error ? err.message : '';\n const safe = stripCardLikeDigits(raw);\n setErrorKey('payment.error.generic');\n setErrorMessage(t('payment.error.generic'));\n onErrorRef.current?.({\n code: 'unexpected',\n translatedMessage: safe || t('payment.error.generic'),\n });\n } finally {\n setProcessing(false);\n }\n },\n [stripe, elements, processing, returnUrl, t],\n );\n\n // Imperative submit hook used by the outer component's ref handle.\n useEffect(() => {\n const host = document.getElementById(idSafe);\n if (!host) return;\n const submitter = () => {\n void handleSubmit();\n };\n host.addEventListener('payment-form:submit', submitter);\n return () => host.removeEventListener('payment-form:submit', submitter);\n }, [idSafe, handleSubmit]);\n\n const submitDisabled = !stripe || !elements || !elementComplete || processing;\n\n return (\n <form\n id={idSafe}\n onSubmit={handleSubmit}\n aria-label={t('payment.ariaLabel')}\n aria-busy={processing || undefined}\n noValidate\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n <div className={amountSummaryVariants()}>\n <span className={labelTextVariants()}>\n {t('payment.amountLabel')}\n </span>\n <span className=\"type-title-card\" data-testid=\"payment-amount\">\n {formatPaymentAmount(amount, currency, locale)}\n </span>\n </div>\n\n <label\n htmlFor={paymentFieldId}\n className={fieldLabelVariants()}\n data-testid=\"payment-field\"\n >\n <span className={labelTextVariants()}>\n {t('payment.fields.card')}\n </span>\n <PaymentElement\n id={paymentFieldId}\n options={{\n layout: { type: 'accordion', defaultCollapsed: false },\n }}\n onChange={(ev) => {\n // NOTE: never log `ev` — change events may include hints\n // about field contents. Keep only the boolean completeness.\n setElementComplete(ev.complete === true);\n if (ev.complete) {\n setErrorKey(null);\n setErrorMessage('');\n }\n }}\n />\n </label>\n\n {billingAddress ? (\n <label\n htmlFor={addressFieldId}\n className={fieldLabelVariants()}\n data-testid=\"payment-address\"\n >\n <span className={labelTextVariants()}>\n {t('payment.billingAddress')}\n </span>\n <AddressElement id={addressFieldId} options={{ mode: 'billing' }} />\n </label>\n ) : null}\n\n {errorKey ? (\n <Alert\n id={errorId}\n variant=\"error\"\n live=\"polite\"\n data-testid=\"payment-error\"\n >\n <Alert.Description>{errorMessage}</Alert.Description>\n </Alert>\n ) : null}\n\n <button\n type=\"submit\"\n aria-disabled={submitDisabled || undefined}\n aria-busy={processing || undefined}\n aria-describedby={errorKey ? errorId : undefined}\n className={submitButtonVariants()}\n data-testid=\"payment-submit\"\n >\n {processing ? (\n <>\n <Spinner size=\"sm\" label={t('payment.processing')} />\n <span>{t('payment.processing')}</span>\n </>\n ) : (\n <span>\n {t('payment.submit', {\n amount: formatPaymentAmount(amount, currency, locale),\n })}\n </span>\n )}\n </button>\n </div>\n </form>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* PaymentForm — outer wrapper */\n/* ------------------------------------------------------------------ */\n\n/**\n * Stripe ships a closed union of supported locales; anything outside it\n * must fall through to `'auto'` (Stripe picks the best match from the\n * browser). We also normalise the legacy `cn` code to `zh` per\n * `src/docs/06-i18n.mdx`.\n */\nconst STRIPE_LOCALES = new Set<StripeElementLocale>([\n 'auto',\n 'ar',\n 'bg',\n 'cs',\n 'da',\n 'de',\n 'el',\n 'en',\n 'en-AU',\n 'en-CA',\n 'en-NZ',\n 'en-GB',\n 'es',\n 'es-ES',\n 'es-419',\n 'et',\n 'fi',\n 'fil',\n 'fr',\n 'fr-CA',\n 'fr-FR',\n 'he',\n 'hu',\n 'hr',\n 'id',\n 'it',\n 'it-IT',\n 'ja',\n 'ko',\n 'lt',\n 'lv',\n 'ms',\n 'mt',\n 'nb',\n 'nl',\n 'no',\n 'pl',\n 'pt',\n 'pt-BR',\n 'ro',\n 'ru',\n 'sk',\n 'sl',\n 'sv',\n 'th',\n 'tr',\n 'vi',\n 'zh',\n 'zh-HK',\n 'zh-TW',\n]);\n\nfunction normaliseLocale(input: string): StripeElementLocale {\n if (!input) return 'auto';\n const candidate = input === 'cn' ? 'zh' : input;\n if ((STRIPE_LOCALES as Set<string>).has(candidate)) {\n return candidate as StripeElementLocale;\n }\n // Try stripping region (\"en-US\" → \"en\") before giving up.\n const base = candidate.split('-')[0];\n if ((STRIPE_LOCALES as Set<string>).has(base)) {\n return base as StripeElementLocale;\n }\n return 'auto';\n}\n\nexport const PaymentForm = forwardRef<HTMLDivElement, PaymentFormProps>(\n (\n {\n id,\n clientSecret,\n publishableKey,\n currency,\n amount,\n onSuccess,\n onError,\n billingAddress = false,\n locale,\n ariaLabel,\n returnUrl,\n stripePromise: injectedStripe,\n className,\n },\n ref,\n ) => {\n const { i18n } = useTranslation();\n const activeLocale = normaliseLocale(locale ?? i18n.language ?? 'en');\n\n // Stripe instance — pre-injected (tests/stories) or lazily loaded.\n const [stripeInstance, setStripeInstance] =\n useState<Promise<Stripe | null> | null>(injectedStripe ?? null);\n\n useEffect(() => {\n if (injectedStripe !== undefined) {\n setStripeInstance(injectedStripe);\n return;\n }\n if (!publishableKey) {\n setStripeInstance(null);\n return;\n }\n // `loadStripe` is cached by the SDK — safe to call per mount.\n setStripeInstance(loadStripe(publishableKey));\n }, [injectedStripe, publishableKey]);\n\n // Appearance bridge — snapshot + subscribe.\n const [appearance, setAppearance] = useState<Appearance>(() =>\n getStripeAppearance(),\n );\n useEffect(() => {\n setAppearance(getStripeAppearance());\n const unsubscribe = subscribeStripeAppearance(setAppearance);\n return unsubscribe;\n }, []);\n\n // Imperative handle — dispatch a custom event at the inner form so we\n // can trigger the same submit path as the button without leaking refs\n // through the Stripe `<Elements>` provider (which owns its own tree).\n const hostRef = useRef<HTMLDivElement>(null);\n\n const agentHandle = useMemo<PaymentFormHandle>(\n () => ({\n submit: async () => {\n const form = hostRef.current?.querySelector('form');\n if (form) {\n form.dispatchEvent(\n new CustomEvent('payment-form:submit', { bubbles: true }),\n );\n }\n },\n reset: () => {\n const form = hostRef.current?.querySelector('form');\n if (form instanceof HTMLFormElement) {\n form.reset();\n }\n },\n }),\n [],\n );\n useImperativeHandle(ref, () => hostRef.current as HTMLDivElement, []);\n useAgentRegistration(paymentFormAgent, agentHandle, id);\n\n const elementsOptions = useMemo(\n () => ({\n clientSecret,\n appearance,\n locale: activeLocale,\n }),\n [clientSecret, appearance, activeLocale],\n );\n\n return (\n <div\n ref={hostRef}\n aria-label={ariaLabel}\n className={[formVariants(), className].filter(Boolean).join(' ')}\n data-component=\"payment-form\"\n data-component-id={id}\n data-testid=\"payment-form-root\"\n >\n {stripeInstance && clientSecret ? (\n <Elements\n stripe={stripeInstance}\n options={elementsOptions}\n key={clientSecret}\n >\n <InnerPaymentForm\n amount={amount}\n currency={currency}\n locale={activeLocale}\n billingAddress={billingAddress}\n returnUrl={returnUrl}\n onSuccess={onSuccess}\n onError={onError}\n />\n </Elements>\n ) : (\n <PaymentFormSkeleton\n amount={amount}\n currency={currency}\n locale={activeLocale}\n billingAddress={billingAddress}\n />\n )}\n </div>\n );\n },\n);\n\nPaymentForm.displayName = 'PaymentForm';\n\n/* ------------------------------------------------------------------ */\n/* Skeleton — visual chrome when Stripe hasn't loaded yet */\n/* ------------------------------------------------------------------ */\n\ninterface PaymentFormSkeletonProps {\n amount: number;\n currency: string;\n locale: string;\n billingAddress: boolean;\n}\n\nfunction PaymentFormSkeleton(props: PaymentFormSkeletonProps): JSX.Element {\n const { amount, currency, locale, billingAddress } = props;\n const { t } = useTranslation();\n\n return (\n <div\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n data-testid=\"payment-skeleton\"\n aria-busy=\"true\"\n >\n <div className={amountSummaryVariants()}>\n <span className={labelTextVariants()}>{t('payment.amountLabel')}</span>\n <span className=\"type-title-card\">\n {formatPaymentAmount(amount, currency, locale)}\n </span>\n </div>\n <div className={fieldLabelVariants()}>\n <span className={labelTextVariants()}>{t('payment.fields.card')}</span>\n <div\n className=\"ds:min-block-size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n {billingAddress ? (\n <div className={fieldLabelVariants()} data-testid=\"payment-address\">\n <span className={labelTextVariants()}>\n {t('payment.billingAddress')}\n </span>\n <div\n className=\"ds:min-block-size-[calc(var(--min-target-size)*2)] ds:rounded-[var(--radius-sm)] ds:border ds:border-[color:var(--border)] ds:bg-[var(--muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n ) : null}\n <button\n type=\"button\"\n aria-disabled=\"true\"\n className={submitButtonVariants()}\n disabled\n >\n <Spinner size=\"sm\" label={t('payment.processing')} />\n <span>{t('payment.processing')}</span>\n </button>\n </div>\n );\n}\n\nexport {\n formVariants as paymentFormVariants,\n submitButtonVariants as paymentSubmitButtonVariants,\n};\n"],"names":["isBrowser","getStripeAppearance","root","target","styles","read","token","subscribeStripeAppearance","onChange","emit","observer","schemeMql","motionMql","paymentFormAgent","handle","ZERO_DECIMAL_CURRENCIES","formatPaymentAmount","amount","currency","locale","iso","major","validateReturnUrl","returnUrl","raw","resolved","stripCardLikeDigits","message","stripeErrorCodeToI18nKey","code","formVariants","cva","fieldLabelVariants","labelTextVariants","amountSummaryVariants","submitButtonVariants","InnerPaymentForm","props","billingAddress","onSuccess","onError","t","useTranslation","stripe","useStripe","elements","useElements","rawId","useId","idSafe","useMemo","paymentFieldId","addressFieldId","errorId","processing","setProcessing","useState","elementComplete","setElementComplete","errorKey","setErrorKey","errorMessage","setErrorMessage","onSuccessRef","useRef","onErrorRef","useEffect","handleSubmit","useCallback","event","safeReturnUrl","_a","result","key","safe","_b","_c","err","_d","host","submitter","submitDisabled","jsx","jsxs","PaymentElement","ev","AddressElement","Alert","Fragment","Spinner","STRIPE_LOCALES","normaliseLocale","input","candidate","base","PaymentForm","forwardRef","id","clientSecret","publishableKey","ariaLabel","injectedStripe","className","ref","i18n","activeLocale","stripeInstance","setStripeInstance","loadStripe","appearance","setAppearance","hostRef","agentHandle","form","useImperativeHandle","useAgentRegistration","elementsOptions","Elements","PaymentFormSkeleton"],"mappings":"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"}