@alfadocs/ui-kit-debug 0.72.2 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/dist/_chunks/{agenda-tray-loL2A3Cx.js → agenda-tray-CVf-jfWU.js} +3 -3
  2. package/dist/_chunks/{agenda-tray-loL2A3Cx.js.map → agenda-tray-CVf-jfWU.js.map} +1 -1
  3. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js → ai-consent-banner-DUhr1yNj.js} +2 -2
  4. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js.map → ai-consent-banner-DUhr1yNj.js.map} +1 -1
  5. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js → ai-prompt-input-DFm58UjY.js} +2 -2
  6. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js.map → ai-prompt-input-DFm58UjY.js.map} +1 -1
  7. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js → alia-sidebar-w6B0TEx7.js} +8 -8
  8. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js.map → alia-sidebar-w6B0TEx7.js.map} +1 -1
  9. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js → anamnesis-card-CJ5MNbkc.js} +2 -2
  10. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js.map → anamnesis-card-CJ5MNbkc.js.map} +1 -1
  11. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js → antenatal-schedule-timeline-BzJZqS-8.js} +3 -3
  12. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js.map → antenatal-schedule-timeline-BzJZqS-8.js.map} +1 -1
  13. package/dist/_chunks/{appointment-card-Cy4FOkGP.js → appointment-card-DgKI5QKD.js} +2 -2
  14. package/dist/_chunks/{appointment-card-Cy4FOkGP.js.map → appointment-card-DgKI5QKD.js.map} +1 -1
  15. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js → appointment-timeline-DQTG0btW.js} +6 -6
  16. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js.map → appointment-timeline-DQTG0btW.js.map} +1 -1
  17. package/dist/_chunks/{appointment-tray-D3mk04TT.js → appointment-tray-ezyCZN8v.js} +4 -4
  18. package/dist/_chunks/{appointment-tray-D3mk04TT.js.map → appointment-tray-ezyCZN8v.js.map} +1 -1
  19. package/dist/_chunks/{ar-BOqyIfoY.js → ar-B1GhtlBP.js} +2 -2
  20. package/dist/_chunks/{ar-BOqyIfoY.js.map → ar-B1GhtlBP.js.map} +1 -1
  21. package/dist/_chunks/arrow-up-right-C2v_MKsK.js +15 -0
  22. package/dist/_chunks/arrow-up-right-C2v_MKsK.js.map +1 -0
  23. package/dist/_chunks/{audio-recorder-BbjG55dP.js → audio-recorder-CjAY0GAc.js} +3 -3
  24. package/dist/_chunks/{audio-recorder-BbjG55dP.js.map → audio-recorder-CjAY0GAc.js.map} +1 -1
  25. package/dist/_chunks/{benefit-card-Xnxj4Gmo.js → benefit-card-DB1Kdrmc.js} +4 -2
  26. package/dist/_chunks/benefit-card-DB1Kdrmc.js.map +1 -0
  27. package/dist/_chunks/{bishop-score-C6eoak_j.js → bishop-score-Bs6t6Zv1.js} +2 -2
  28. package/dist/_chunks/{bishop-score-C6eoak_j.js.map → bishop-score-Bs6t6Zv1.js.map} +1 -1
  29. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js → bmi-calculator-Bk2GAju7.js} +2 -2
  30. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js.map → bmi-calculator-Bk2GAju7.js.map} +1 -1
  31. package/dist/_chunks/{booking-B62CMY5k.js → booking-CWnZhZ5g.js} +8 -8
  32. package/dist/_chunks/{booking-B62CMY5k.js.map → booking-CWnZhZ5g.js.map} +1 -1
  33. package/dist/_chunks/{button-DD_0Xdmr.js → button-CPGiR_bH.js} +56 -35
  34. package/dist/_chunks/button-CPGiR_bH.js.map +1 -0
  35. package/dist/_chunks/button-group-DzV5wgnx.js +289 -0
  36. package/dist/_chunks/button-group-DzV5wgnx.js.map +1 -0
  37. package/dist/_chunks/camera-VSklPDCv.js +21 -0
  38. package/dist/_chunks/camera-VSklPDCv.js.map +1 -0
  39. package/dist/_chunks/{care-plan-card-DhXbfGzE.js → care-plan-card-CfIP3Vc1.js} +3 -3
  40. package/dist/_chunks/{care-plan-card-DhXbfGzE.js.map → care-plan-card-CfIP3Vc1.js.map} +1 -1
  41. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js → care-plan-entry-card-CRbS-G00.js} +3 -3
  42. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js.map → care-plan-entry-card-CRbS-G00.js.map} +1 -1
  43. package/dist/_chunks/{care-plan-header-DtQxyfOb.js → care-plan-header-BXvRpGG8.js} +2 -2
  44. package/dist/_chunks/{care-plan-header-DtQxyfOb.js.map → care-plan-header-BXvRpGG8.js.map} +1 -1
  45. package/dist/_chunks/{carousel.agent-j7hWxJWr.js → carousel.agent-CtAAdsAd.js} +2 -2
  46. package/dist/_chunks/{carousel.agent-j7hWxJWr.js.map → carousel.agent-CtAAdsAd.js.map} +1 -1
  47. package/dist/_chunks/{chat-container-BVCoN06N.js → chat-container-HlFnoEIl.js} +4 -2
  48. package/dist/_chunks/{chat-container-BVCoN06N.js.map → chat-container-HlFnoEIl.js.map} +1 -1
  49. package/dist/_chunks/{chat-input-Btq_uuMZ.js → chat-input-BTCDqUDX.js} +2 -2
  50. package/dist/_chunks/{chat-input-Btq_uuMZ.js.map → chat-input-BTCDqUDX.js.map} +1 -1
  51. package/dist/_chunks/{chat-message-DXjjM8z9.js → chat-message-CdjWqZjo.js} +3 -3
  52. package/dist/_chunks/{chat-message-DXjjM8z9.js.map → chat-message-CdjWqZjo.js.map} +1 -1
  53. package/dist/_chunks/{code-block-Cwi7e3HM.js → code-block-BwanBjRh.js} +2 -2
  54. package/dist/_chunks/{code-block-Cwi7e3HM.js.map → code-block-BwanBjRh.js.map} +1 -1
  55. package/dist/_chunks/{connection-status-0HajXMXM.js → connection-status-oEUyrvev.js} +3 -3
  56. package/dist/_chunks/{connection-status-0HajXMXM.js.map → connection-status-oEUyrvev.js.map} +1 -1
  57. package/dist/_chunks/{contact-profile-card-IggiUVpN.js → contact-profile-card-veMV3W4J.js} +2 -2
  58. package/dist/_chunks/{contact-profile-card-IggiUVpN.js.map → contact-profile-card-veMV3W4J.js.map} +1 -1
  59. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js → control-room-rail-CdfrZ6Vr.js} +3 -3
  60. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js.map → control-room-rail-CdfrZ6Vr.js.map} +1 -1
  61. package/dist/_chunks/{copy-field-PAp0-Wr5.js → copy-field-DBc9QquW.js} +2 -2
  62. package/dist/_chunks/{copy-field-PAp0-Wr5.js.map → copy-field-DBc9QquW.js.map} +1 -1
  63. package/dist/_chunks/{cycle-calculator-BNILyVas.js → cycle-calculator-OQp8Ik5U.js} +4 -4
  64. package/dist/_chunks/{cycle-calculator-BNILyVas.js.map → cycle-calculator-OQp8Ik5U.js.map} +1 -1
  65. package/dist/_chunks/{date-picker-CVkD_lOi.js → date-picker-DzQS8mvt.js} +2 -2
  66. package/dist/_chunks/{date-picker-CVkD_lOi.js.map → date-picker-DzQS8mvt.js.map} +1 -1
  67. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js → date-picker-variants-CYQAm1Gk.js} +116 -115
  68. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js.map → date-picker-variants-CYQAm1Gk.js.map} +1 -1
  69. package/dist/_chunks/{date-range-picker-Dw12DgV8.js → date-range-picker-Cbz1SKhm.js} +3 -3
  70. package/dist/_chunks/{date-range-picker-Dw12DgV8.js.map → date-range-picker-Cbz1SKhm.js.map} +1 -1
  71. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js → date-time-picker-B5IpU-nd.js} +2 -2
  72. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js.map → date-time-picker-B5IpU-nd.js.map} +1 -1
  73. package/dist/_chunks/{de-DFLsUxeV.js → de-DETDHQ0o.js} +2 -2
  74. package/dist/_chunks/{de-DFLsUxeV.js.map → de-DETDHQ0o.js.map} +1 -1
  75. package/dist/_chunks/{description-list-CmBVxIF5.js → description-list-ClNLdRMy.js} +2 -2
  76. package/dist/_chunks/{description-list-CmBVxIF5.js.map → description-list-ClNLdRMy.js.map} +1 -1
  77. package/dist/_chunks/{document-scanner-B23j4w7X.js → document-scanner-BE6Jz4Ob.js} +198 -230
  78. package/dist/_chunks/document-scanner-BE6Jz4Ob.js.map +1 -0
  79. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js → due-date-calculator-DASNRgnH.js} +4 -4
  80. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js.map → due-date-calculator-DASNRgnH.js.map} +1 -1
  81. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js → editable-currency-cell-renderer-GwfA9tTR.js} +3 -3
  82. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js.map → editable-currency-cell-renderer-GwfA9tTR.js.map} +1 -1
  83. package/dist/_chunks/{editor-overlay-BIOzr8v7.js → editor-overlay-DE3esyio.js} +2 -2
  84. package/dist/_chunks/{editor-overlay-BIOzr8v7.js.map → editor-overlay-DE3esyio.js.map} +1 -1
  85. package/dist/_chunks/{el-OVjBKytp.js → el-HV3jOI0z.js} +2 -2
  86. package/dist/_chunks/{el-OVjBKytp.js.map → el-HV3jOI0z.js.map} +1 -1
  87. package/dist/_chunks/{empty-state-BLy7tigq.js → empty-state-CrLsi0XI.js} +2 -2
  88. package/dist/_chunks/{empty-state-BLy7tigq.js.map → empty-state-CrLsi0XI.js.map} +1 -1
  89. package/dist/_chunks/{entity-summary-DpGziDv5.js → entity-summary--vP698Jn.js} +3 -3
  90. package/dist/_chunks/{entity-summary-DpGziDv5.js.map → entity-summary--vP698Jn.js.map} +1 -1
  91. package/dist/_chunks/eraser-CHOGQfVv.js +21 -0
  92. package/dist/_chunks/eraser-CHOGQfVv.js.map +1 -0
  93. package/dist/_chunks/{es-DKDNrHXG.js → es-Dpo7Olwo.js} +2 -2
  94. package/dist/_chunks/{es-DKDNrHXG.js.map → es-Dpo7Olwo.js.map} +1 -1
  95. package/dist/_chunks/face-scheme-C0rk21gg.js +3146 -0
  96. package/dist/_chunks/face-scheme-C0rk21gg.js.map +1 -0
  97. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js → fetal-weight-1F9N4IMx.js} +2 -2
  98. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js.map → fetal-weight-1F9N4IMx.js.map} +1 -1
  99. package/dist/_chunks/{field-array-CDzc3hTM.js → field-array-DH3Mb1i8.js} +3 -3
  100. package/dist/_chunks/{field-array-CDzc3hTM.js.map → field-array-DH3Mb1i8.js.map} +1 -1
  101. package/dist/_chunks/{field-value-Dj3i52H2.js → field-value-DCXJXKab.js} +5 -5
  102. package/dist/_chunks/{field-value-Dj3i52H2.js.map → field-value-DCXJXKab.js.map} +1 -1
  103. package/dist/_chunks/{file-upload-Kw1rdvFw.js → file-upload-B2SXhRiN.js} +104 -111
  104. package/dist/_chunks/file-upload-B2SXhRiN.js.map +1 -0
  105. package/dist/_chunks/{finished-terminal-Di4gtZ50.js → finished-terminal-C0_mefrf.js} +11 -11
  106. package/dist/_chunks/finished-terminal-C0_mefrf.js.map +1 -0
  107. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js → fiscal-code-input-DWA6C8x8.js} +2 -2
  108. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js.map → fiscal-code-input-DWA6C8x8.js.map} +1 -1
  109. package/dist/_chunks/{fr-BfMvQh-v.js → fr-CgD4Jvtq.js} +2 -2
  110. package/dist/_chunks/{fr-BfMvQh-v.js.map → fr-CgD4Jvtq.js.map} +1 -1
  111. package/dist/_chunks/{freemium-paywall-DFoeedwh.js → freemium-paywall-CmV642PA.js} +7 -3
  112. package/dist/_chunks/freemium-paywall-CmV642PA.js.map +1 -0
  113. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js → gestational-age-calculator-C9Dfis4I.js} +6 -6
  114. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js.map → gestational-age-calculator-C9Dfis4I.js.map} +1 -1
  115. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js → hcg-doubling-Dqj-EqMT.js} +3 -3
  116. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js.map → hcg-doubling-Dqj-EqMT.js.map} +1 -1
  117. package/dist/_chunks/{header-DaXWDw0M.js → header-CjwasYnn.js} +88 -79
  118. package/dist/_chunks/header-CjwasYnn.js.map +1 -0
  119. package/dist/_chunks/{header-settings-B0G_u-wV.js → header-settings-CRQDCYgr.js} +4 -4
  120. package/dist/_chunks/{header-settings-B0G_u-wV.js.map → header-settings-CRQDCYgr.js.map} +1 -1
  121. package/dist/_chunks/{hi-C0GEMwlD.js → hi-Bf8CAP6b.js} +2 -2
  122. package/dist/_chunks/{hi-C0GEMwlD.js.map → hi-Bf8CAP6b.js.map} +1 -1
  123. package/dist/_chunks/highlighter-DSkckT2Q.js +15 -0
  124. package/dist/_chunks/highlighter-DSkckT2Q.js.map +1 -0
  125. package/dist/_chunks/{icon-button-LqoiKcUN.js → icon-button-C_kbcd7I.js} +2 -2
  126. package/dist/_chunks/{icon-button-LqoiKcUN.js.map → icon-button-C_kbcd7I.js.map} +1 -1
  127. package/dist/_chunks/icon-button-group-C_lqXTAj.js +391 -0
  128. package/dist/_chunks/icon-button-group-C_lqXTAj.js.map +1 -0
  129. package/dist/_chunks/{icon-picker-Di6uYDG-.js → icon-picker-BePK27S-.js} +3 -3
  130. package/dist/_chunks/{icon-picker-Di6uYDG-.js.map → icon-picker-BePK27S-.js.map} +1 -1
  131. package/dist/_chunks/{image-cropper-CdmWFrMC.js → image-cropper-DKe4AORY.js} +2 -2
  132. package/dist/_chunks/{image-cropper-CdmWFrMC.js.map → image-cropper-DKe4AORY.js.map} +1 -1
  133. package/dist/_chunks/{insert-result-C7xSDb8q.js → insert-result-D074GtHX.js} +58 -68
  134. package/dist/_chunks/insert-result-D074GtHX.js.map +1 -0
  135. package/dist/_chunks/{isSameWeek-HddDAyJG.js → isSameWeek-BYl5poz_.js} +2 -2
  136. package/dist/_chunks/{isSameWeek-HddDAyJG.js.map → isSameWeek-BYl5poz_.js.map} +1 -1
  137. package/dist/_chunks/{it-5f4hiT2e.js → it-mt1V2DFS.js} +3 -3
  138. package/dist/_chunks/{it-5f4hiT2e.js.map → it-mt1V2DFS.js.map} +1 -1
  139. package/dist/_chunks/{ja-U0_2inl_.js → ja-CbOHn2TO.js} +2 -2
  140. package/dist/_chunks/{ja-U0_2inl_.js.map → ja-CbOHn2TO.js.map} +1 -1
  141. package/dist/_chunks/{key-value-pair-Byyyc_9J.js → key-value-pair-LHKfDT_9.js} +2 -2
  142. package/dist/_chunks/{key-value-pair-Byyyc_9J.js.map → key-value-pair-LHKfDT_9.js.map} +1 -1
  143. package/dist/_chunks/{link-cell-renderer-BCppbMec.js → link-cell-renderer-CLI7sBkX.js} +803 -778
  144. package/dist/_chunks/link-cell-renderer-CLI7sBkX.js.map +1 -0
  145. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js → locale-picker-Cbfqc0_N.js} +3 -3
  146. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js.map → locale-picker-Cbfqc0_N.js.map} +1 -1
  147. package/dist/_chunks/{map-view-ByPvWG_9.js → map-view-CsaHfoo6.js} +2 -2
  148. package/dist/_chunks/{map-view-ByPvWG_9.js.map → map-view-CsaHfoo6.js.map} +1 -1
  149. package/dist/_chunks/{marketplace-app-shell-BCYiOvKZ.js → marketplace-app-shell-Dm6S-hun.js} +6 -6
  150. package/dist/_chunks/marketplace-app-shell-Dm6S-hun.js.map +1 -0
  151. package/dist/_chunks/{message-card-BZnnffyB.js → message-card-ievotOFa.js} +3 -3
  152. package/dist/_chunks/{message-card-BZnnffyB.js.map → message-card-ievotOFa.js.map} +1 -1
  153. package/dist/_chunks/{message-tray-cUHOCdU0.js → message-tray-BFlu8clI.js} +4 -4
  154. package/dist/_chunks/{message-tray-cUHOCdU0.js.map → message-tray-BFlu8clI.js.map} +1 -1
  155. package/dist/_chunks/{nl-CDVnnx1U.js → nl-C6Y0QXnm.js} +2 -2
  156. package/dist/_chunks/{nl-CDVnnx1U.js.map → nl-C6Y0QXnm.js.map} +1 -1
  157. package/dist/_chunks/{notes-panel-CMyjUXD4.js → notes-panel-B_8-Mebz.js} +3 -3
  158. package/dist/_chunks/{notes-panel-CMyjUXD4.js.map → notes-panel-B_8-Mebz.js.map} +1 -1
  159. package/dist/_chunks/{notification-card-BHJ07FkH.js → notification-card-D29_sVA1.js} +3 -3
  160. package/dist/_chunks/{notification-card-BHJ07FkH.js.map → notification-card-D29_sVA1.js.map} +1 -1
  161. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js → notification-tray-CzIzz3bX.js} +4 -4
  162. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js.map → notification-tray-CzIzz3bX.js.map} +1 -1
  163. package/dist/_chunks/optical-prescription-BQ75_kf6.js +1260 -0
  164. package/dist/_chunks/optical-prescription-BQ75_kf6.js.map +1 -0
  165. package/dist/_chunks/{patient-details-pU_E5xM2.js → patient-details-JkOI3Ijd.js} +6 -6
  166. package/dist/_chunks/{patient-details-pU_E5xM2.js.map → patient-details-JkOI3Ijd.js.map} +1 -1
  167. package/dist/_chunks/{patient-search-X9SUZGpy.js → patient-search-BaUJ_Y-N.js} +47 -45
  168. package/dist/_chunks/patient-search-BaUJ_Y-N.js.map +1 -0
  169. package/dist/_chunks/{patient-summary-card--t3BjTdU.js → patient-summary-card-CQOLMH3E.js} +4 -4
  170. package/dist/_chunks/{patient-summary-card--t3BjTdU.js.map → patient-summary-card-CQOLMH3E.js.map} +1 -1
  171. package/dist/_chunks/{patient-table-BgWgNIMf.js → patient-table-B_mOe-ZT.js} +2 -2
  172. package/dist/_chunks/{patient-table-BgWgNIMf.js.map → patient-table-B_mOe-ZT.js.map} +1 -1
  173. package/dist/_chunks/{payment-request-card-2ts7ITxd.js → payment-request-card-C0fqlKqO.js} +25 -24
  174. package/dist/_chunks/{payment-request-card-2ts7ITxd.js.map → payment-request-card-C0fqlKqO.js.map} +1 -1
  175. package/dist/_chunks/pen-line-D0De5zdl.js +21 -0
  176. package/dist/_chunks/pen-line-D0De5zdl.js.map +1 -0
  177. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js → periodontal-chart-card-WVjJAheq.js} +2 -2
  178. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js.map → periodontal-chart-card-WVjJAheq.js.map} +1 -1
  179. package/dist/_chunks/{pl-BWNumNrg.js → pl-BdazJAOp.js} +3 -3
  180. package/dist/_chunks/{pl-BWNumNrg.js.map → pl-BdazJAOp.js.map} +1 -1
  181. package/dist/_chunks/{popover-uJ6BvEU3.js → popover-DGTKfLWh.js} +2 -2
  182. package/dist/_chunks/{popover-uJ6BvEU3.js.map → popover-DGTKfLWh.js.map} +1 -1
  183. package/dist/_chunks/{practice-results-CSEHTH2V.js → practice-results-BCr7jMt1.js} +5 -5
  184. package/dist/_chunks/{practice-results-CSEHTH2V.js.map → practice-results-BCr7jMt1.js.map} +1 -1
  185. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js → pregnancy-dating-IsDVfqJX.js} +6 -6
  186. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js.map → pregnancy-dating-IsDVfqJX.js.map} +1 -1
  187. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js → pregnancy-weight-gain-B-CkVYnU.js} +2 -2
  188. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js.map → pregnancy-weight-gain-B-CkVYnU.js.map} +1 -1
  189. package/dist/_chunks/{privacy-lock-DrRmK8C7.js → privacy-lock-YYBiI_bY.js} +3 -3
  190. package/dist/_chunks/{privacy-lock-DrRmK8C7.js.map → privacy-lock-YYBiI_bY.js.map} +1 -1
  191. package/dist/_chunks/{product-hub-panel-CaZqttvm.js → product-hub-panel-CTld1r5V.js} +3 -3
  192. package/dist/_chunks/{product-hub-panel-CaZqttvm.js.map → product-hub-panel-CTld1r5V.js.map} +1 -1
  193. package/dist/_chunks/{pt-zqdQuryr.js → pt-B3UKvhHp.js} +2 -2
  194. package/dist/_chunks/{pt-zqdQuryr.js.map → pt-B3UKvhHp.js.map} +1 -1
  195. package/dist/_chunks/{public-header.agent-C-opZaOw.js → public-header.agent-rX_VA6hd.js} +107 -103
  196. package/dist/_chunks/public-header.agent-rX_VA6hd.js.map +1 -0
  197. package/dist/_chunks/{radiograph-panel.agent-D1x33moc.js → radiograph-panel.agent-e488ooH8.js} +40 -57
  198. package/dist/_chunks/radiograph-panel.agent-e488ooH8.js.map +1 -0
  199. package/dist/_chunks/{reviews-panel-liUj6OPX.js → reviews-panel-DmOjvmyH.js} +4 -4
  200. package/dist/_chunks/{reviews-panel-liUj6OPX.js.map → reviews-panel-DmOjvmyH.js.map} +1 -1
  201. package/dist/_chunks/{rich-text-editor-DUgznqOf.js → rich-text-editor-CgA2bYwi.js} +186 -195
  202. package/dist/_chunks/rich-text-editor-CgA2bYwi.js.map +1 -0
  203. package/dist/_chunks/{ro-CornQr64.js → ro-DVTEQpPK.js} +2 -2
  204. package/dist/_chunks/{ro-CornQr64.js.map → ro-DVTEQpPK.js.map} +1 -1
  205. package/dist/_chunks/{ru-CKAXNYVD.js → ru-C-Mp40SC.js} +3 -3
  206. package/dist/_chunks/{ru-CKAXNYVD.js.map → ru-C-Mp40SC.js.map} +1 -1
  207. package/dist/_chunks/{session-countdown-qr8EO5QY.js → session-countdown-C8AsE072.js} +2 -2
  208. package/dist/_chunks/{session-countdown-qr8EO5QY.js.map → session-countdown-C8AsE072.js.map} +1 -1
  209. package/dist/_chunks/{sheet-B_X54aZo.js → sheet-D5K0LB3q.js} +2 -2
  210. package/dist/_chunks/{sheet-B_X54aZo.js.map → sheet-D5K0LB3q.js.map} +1 -1
  211. package/dist/_chunks/{sidebar-B0OBmJrC.js → sidebar-CtU35PIX.js} +70 -67
  212. package/dist/_chunks/sidebar-CtU35PIX.js.map +1 -0
  213. package/dist/_chunks/{sign-document-nK03S73h.js → sign-document-Bfk0WpWV.js} +2 -2
  214. package/dist/_chunks/{sign-document-nK03S73h.js.map → sign-document-Bfk0WpWV.js.map} +1 -1
  215. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js → sign-in-with-alfadocs-button-UlYefZpI.js} +2 -2
  216. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js.map → sign-in-with-alfadocs-button-UlYefZpI.js.map} +1 -1
  217. package/dist/_chunks/{signature-capture-Ct_4Md4e.js → signature-capture-DN52VNKL.js} +206 -189
  218. package/dist/_chunks/signature-capture-DN52VNKL.js.map +1 -0
  219. package/dist/_chunks/{signature-field-jgwYgUhO.js → signature-field-0rFODJlW.js} +47 -41
  220. package/dist/_chunks/signature-field-0rFODJlW.js.map +1 -0
  221. package/dist/_chunks/{slot-grid-FsqumOaS.js → slot-grid-CQSULZjd.js} +4 -4
  222. package/dist/_chunks/{slot-grid-FsqumOaS.js.map → slot-grid-CQSULZjd.js.map} +1 -1
  223. package/dist/_chunks/{sq-CIIvqXZv.js → sq-DierVlw-.js} +2 -2
  224. package/dist/_chunks/{sq-CIIvqXZv.js.map → sq-DierVlw-.js.map} +1 -1
  225. package/dist/_chunks/{streaming-text-Cedc05ya.js → streaming-text-C5bYz7LL.js} +2 -2
  226. package/dist/_chunks/{streaming-text-Cedc05ya.js.map → streaming-text-C5bYz7LL.js.map} +1 -1
  227. package/dist/_chunks/subDays-DIKRViZm.js +8 -0
  228. package/dist/_chunks/{subDays-DGSOp9d9.js.map → subDays-DIKRViZm.js.map} +1 -1
  229. package/dist/_chunks/{sv-Kpk1pzjz.js → sv-gQWo_19z.js} +2 -2
  230. package/dist/_chunks/{sv-Kpk1pzjz.js.map → sv-gQWo_19z.js.map} +1 -1
  231. package/dist/_chunks/{task-tray-DP5A3Qnc.js → task-tray-Br3vc0O1.js} +3 -3
  232. package/dist/_chunks/{task-tray-DP5A3Qnc.js.map → task-tray-Br3vc0O1.js.map} +1 -1
  233. package/dist/_chunks/{tasks-panel-BuxaYtEF.js → tasks-panel-LCK5ZXvU.js} +5 -5
  234. package/dist/_chunks/{tasks-panel-BuxaYtEF.js.map → tasks-panel-LCK5ZXvU.js.map} +1 -1
  235. package/dist/_chunks/{theme-toggle-dtdy5EaL.js → theme-toggle-BJCz_UOi.js} +3 -3
  236. package/dist/_chunks/{theme-toggle-dtdy5EaL.js.map → theme-toggle-BJCz_UOi.js.map} +1 -1
  237. package/dist/_chunks/{toast.agent-BSxl057x.js → toast.agent-uV8CeAy6.js} +2 -2
  238. package/dist/_chunks/{toast.agent-BSxl057x.js.map → toast.agent-uV8CeAy6.js.map} +1 -1
  239. package/dist/_chunks/{token-insert-menu-Pok4nExI.js → token-insert-menu-BYv6yoZI.js} +2 -2
  240. package/dist/_chunks/{token-insert-menu-Pok4nExI.js.map → token-insert-menu-BYv6yoZI.js.map} +1 -1
  241. package/dist/_chunks/{tool-rail-BZx0-yIr.js → tool-rail-AaTqxkIM.js} +2 -2
  242. package/dist/_chunks/{tool-rail-BZx0-yIr.js.map → tool-rail-AaTqxkIM.js.map} +1 -1
  243. package/dist/_chunks/{tooth-scheme-D_rso4uu.js → tooth-scheme-CX49GycY.js} +3 -3
  244. package/dist/_chunks/{tooth-scheme-D_rso4uu.js.map → tooth-scheme-CX49GycY.js.map} +1 -1
  245. package/dist/_chunks/{tr-DHaeLFxG.js → tr-Btm6M3Km.js} +2 -2
  246. package/dist/_chunks/{tr-DHaeLFxG.js.map → tr-Btm6M3Km.js.map} +1 -1
  247. package/dist/_chunks/{transaction-chip-B6iWoVmU.js → transaction-chip-DJCstquX.js} +41 -51
  248. package/dist/_chunks/transaction-chip-DJCstquX.js.map +1 -0
  249. package/dist/_chunks/type-ggmfVs23.js +16 -0
  250. package/dist/_chunks/type-ggmfVs23.js.map +1 -0
  251. package/dist/_chunks/{unit-converter-fEqluT8b.js → unit-converter-3uL_tMCm.js} +2 -2
  252. package/dist/_chunks/{unit-converter-fEqluT8b.js.map → unit-converter-3uL_tMCm.js.map} +1 -1
  253. package/dist/_chunks/upload-BfT2hzMg.js +16 -0
  254. package/dist/_chunks/upload-BfT2hzMg.js.map +1 -0
  255. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js +101 -0
  256. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js.map +1 -0
  257. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js +31 -0
  258. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js.map +1 -0
  259. package/dist/_chunks/{warning-stack-BaMI7-n7.js → warning-stack-BlG_Ujy3.js} +3 -3
  260. package/dist/_chunks/{warning-stack-BaMI7-n7.js.map → warning-stack-BlG_Ujy3.js.map} +1 -1
  261. package/dist/_chunks/{workflow-map-qWsgCldq.js → workflow-map-C643Q43h.js} +5 -5
  262. package/dist/_chunks/{workflow-map-qWsgCldq.js.map → workflow-map-C643Q43h.js.map} +1 -1
  263. package/dist/_chunks/{zh-CN-BncsTBwM.js → zh-CN-DkVN4vsB.js} +3 -3
  264. package/dist/_chunks/{zh-CN-BncsTBwM.js.map → zh-CN-DkVN4vsB.js.map} +1 -1
  265. package/dist/agent-catalog.json +845 -1034
  266. package/dist/agent-i18n/en.json +42 -69
  267. package/dist/brand/product-lockup/product-lockup.d.ts +1 -1
  268. package/dist/components/_shared/calendar-class-names.d.ts.map +1 -1
  269. package/dist/components/agenda-tray/index.js +1 -1
  270. package/dist/components/ai-consent-banner/index.js +1 -1
  271. package/dist/components/ai-prompt-input/index.js +1 -1
  272. package/dist/components/anamnesis-card/index.js +1 -1
  273. package/dist/components/appointment-card/index.js +2 -2
  274. package/dist/components/appointment-timeline/index.js +1 -1
  275. package/dist/components/audio-recorder/index.js +1 -1
  276. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  277. package/dist/components/benefit-card/index.js +1 -1
  278. package/dist/components/bishop-score/index.js +1 -1
  279. package/dist/components/bmi-calculator/index.js +1 -1
  280. package/dist/components/booking/index.js +1 -1
  281. package/dist/components/button/button.d.ts +8 -1
  282. package/dist/components/button/button.d.ts.map +1 -1
  283. package/dist/components/button/index.js +2 -2
  284. package/dist/components/button-group/button-group.d.ts +16 -0
  285. package/dist/components/button-group/button-group.d.ts.map +1 -1
  286. package/dist/components/button-group/index.js +1 -1
  287. package/dist/components/care-plan-card/index.js +1 -1
  288. package/dist/components/care-plan-entry-card/index.js +1 -1
  289. package/dist/components/care-plan-header/index.js +1 -1
  290. package/dist/components/carousel/index.js +1 -1
  291. package/dist/components/chat-container/chat-container.d.ts.map +1 -1
  292. package/dist/components/chat-container/index.js +1 -1
  293. package/dist/components/chat-input/index.js +1 -1
  294. package/dist/components/chat-message/index.js +1 -1
  295. package/dist/components/connection-status/index.js +1 -1
  296. package/dist/components/contact-profile-card/index.js +1 -1
  297. package/dist/components/control-room-rail/index.js +1 -1
  298. package/dist/components/copy-field/index.js +1 -1
  299. package/dist/components/counter/counter.d.ts +1 -1
  300. package/dist/components/cycle-calculator/index.js +1 -1
  301. package/dist/components/data-table/data-table.d.ts +2 -8
  302. package/dist/components/data-table/data-table.d.ts.map +1 -1
  303. package/dist/components/data-table/index.js +2 -2
  304. package/dist/components/data-table/toolbar.d.ts +4 -10
  305. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  306. package/dist/components/date-picker/index.js +1 -1
  307. package/dist/components/date-range-picker/index.js +1 -1
  308. package/dist/components/date-time-picker/index.js +1 -1
  309. package/dist/components/description-list/index.js +1 -1
  310. package/dist/components/document-scanner/document-scanner.d.ts.map +1 -1
  311. package/dist/components/document-scanner/index.js +1 -1
  312. package/dist/components/due-date-calculator/index.js +2 -2
  313. package/dist/components/editor-overlay/index.js +1 -1
  314. package/dist/components/empty-state/index.js +1 -1
  315. package/dist/components/entity-summary/index.js +1 -1
  316. package/dist/components/face-scheme/face-scheme-data.d.ts +167 -0
  317. package/dist/components/face-scheme/face-scheme-data.d.ts.map +1 -1
  318. package/dist/components/face-scheme/face-scheme.agent.d.ts.map +1 -1
  319. package/dist/components/face-scheme/face-scheme.d.ts +112 -2
  320. package/dist/components/face-scheme/face-scheme.d.ts.map +1 -1
  321. package/dist/components/face-scheme/index.d.ts +2 -2
  322. package/dist/components/face-scheme/index.d.ts.map +1 -1
  323. package/dist/components/face-scheme/index.js +25 -14
  324. package/dist/components/fetal-weight/index.js +1 -1
  325. package/dist/components/field-array/index.js +1 -1
  326. package/dist/components/file-upload/file-upload.d.ts +1 -0
  327. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  328. package/dist/components/file-upload/index.d.ts +1 -1
  329. package/dist/components/file-upload/index.d.ts.map +1 -1
  330. package/dist/components/file-upload/index.js +4 -3
  331. package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -1
  332. package/dist/components/finished-terminal/index.js +1 -1
  333. package/dist/components/fiscal-code-input/index.js +1 -1
  334. package/dist/components/flag/flag.d.ts +1 -1
  335. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  336. package/dist/components/freemium-paywall/index.js +1 -1
  337. package/dist/components/gestational-age-calculator/index.js +1 -1
  338. package/dist/components/hcg-doubling/index.js +1 -1
  339. package/dist/components/header/header.d.ts.map +1 -1
  340. package/dist/components/header/index.js +1 -1
  341. package/dist/components/header-settings/index.js +1 -1
  342. package/dist/components/icon-button/index.js +1 -1
  343. package/dist/components/icon-button-group/icon-button-group.d.ts +6 -0
  344. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  345. package/dist/components/icon-button-group/index.js +1 -1
  346. package/dist/components/icon-picker/index.js +1 -1
  347. package/dist/components/image-cropper/index.js +1 -1
  348. package/dist/components/index.d.ts +0 -1
  349. package/dist/components/index.d.ts.map +1 -1
  350. package/dist/components/key-value-pair/index.js +1 -1
  351. package/dist/components/link/link.d.ts +1 -1
  352. package/dist/components/locale-picker/index.js +1 -1
  353. package/dist/components/map-view/index.js +1 -1
  354. package/dist/components/matrix-rain/matrix-rain.d.ts +1 -1
  355. package/dist/components/message-card/index.js +1 -1
  356. package/dist/components/message-tray/index.js +1 -1
  357. package/dist/components/notes-panel/index.js +1 -1
  358. package/dist/components/notification-card/index.js +1 -1
  359. package/dist/components/notification-tray/index.js +1 -1
  360. package/dist/components/optical-prescription/index.d.ts +4 -2
  361. package/dist/components/optical-prescription/index.d.ts.map +1 -1
  362. package/dist/components/optical-prescription/index.js +29 -26
  363. package/dist/components/optical-prescription/optical-prescription-charts.d.ts +78 -0
  364. package/dist/components/optical-prescription/optical-prescription-charts.d.ts.map +1 -0
  365. package/dist/components/optical-prescription/optical-prescription-data.d.ts +29 -0
  366. package/dist/components/optical-prescription/optical-prescription-data.d.ts.map +1 -1
  367. package/dist/components/optical-prescription/optical-prescription.agent.d.ts.map +1 -1
  368. package/dist/components/optical-prescription/optical-prescription.d.ts +9 -0
  369. package/dist/components/optical-prescription/optical-prescription.d.ts.map +1 -1
  370. package/dist/components/patient-details/index.js +1 -1
  371. package/dist/components/patient-search/index.js +1 -1
  372. package/dist/components/patient-search/patient-search.d.ts.map +1 -1
  373. package/dist/components/patient-summary-card/index.js +1 -1
  374. package/dist/components/patient-table/index.js +1 -1
  375. package/dist/components/payment-card/index.js +1 -1
  376. package/dist/components/periodontal-chart-card/index.js +1 -1
  377. package/dist/components/popover/index.js +1 -1
  378. package/dist/components/practice-results/index.js +1 -1
  379. package/dist/components/pregnancy-dating/index.js +1 -1
  380. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  381. package/dist/components/privacy-lock/index.js +1 -1
  382. package/dist/components/product-hub-tray/index.js +1 -1
  383. package/dist/components/public-header/index.js +1 -1
  384. package/dist/components/public-header/public-header.d.ts +1 -1
  385. package/dist/components/public-header/public-header.d.ts.map +1 -1
  386. package/dist/components/radiograph-panel/index.js +1 -1
  387. package/dist/components/radiograph-panel/radiograph-panel.d.ts +2 -2
  388. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -1
  389. package/dist/components/reviews-panel/index.js +1 -1
  390. package/dist/components/rich-text-editor/index.js +1 -1
  391. package/dist/components/session-countdown/index.js +1 -1
  392. package/dist/components/sheet/index.js +1 -1
  393. package/dist/components/sidebar/index.js +1 -1
  394. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  395. package/dist/components/sign-document/index.js +1 -1
  396. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  397. package/dist/components/signature-capture/index.js +1 -1
  398. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  399. package/dist/components/signature-field/index.js +1 -1
  400. package/dist/components/signature-field/signature-field.d.ts +7 -0
  401. package/dist/components/signature-field/signature-field.d.ts.map +1 -1
  402. package/dist/components/skeleton-scheme/index.js +1194 -0
  403. package/dist/components/skeleton-scheme/index.js.map +1 -0
  404. package/dist/components/slot-grid/index.js +1 -1
  405. package/dist/components/streaming-text/index.js +1 -1
  406. package/dist/components/task-tray/index.js +1 -1
  407. package/dist/components/tasks-panel/index.js +1 -1
  408. package/dist/components/theme-toggle/index.js +1 -1
  409. package/dist/components/toast/index.js +1 -1
  410. package/dist/components/token-insert-menu/index.js +1 -1
  411. package/dist/components/tool-rail/index.js +1 -1
  412. package/dist/components/tooth-scheme/index.js +1 -1
  413. package/dist/components/transaction-chip/index.js +1 -1
  414. package/dist/components/unit-converter/index.js +1 -1
  415. package/dist/components/warning-stack/index.js +1 -1
  416. package/dist/components/workflow/index.js +1 -1
  417. package/dist/hooks/index.d.ts +2 -0
  418. package/dist/hooks/index.d.ts.map +1 -1
  419. package/dist/hooks/index.js +40 -35
  420. package/dist/hooks/index.js.map +1 -1
  421. package/dist/hooks/use-priority-overflow.d.ts +63 -0
  422. package/dist/hooks/use-priority-overflow.d.ts.map +1 -0
  423. package/dist/hooks/use-visual-viewport-pin.d.ts +32 -0
  424. package/dist/hooks/use-visual-viewport-pin.d.ts.map +1 -0
  425. package/dist/i18n/locales/ar.d.ts +170 -9
  426. package/dist/i18n/locales/ar.d.ts.map +1 -1
  427. package/dist/i18n/locales/ar.js +173 -12
  428. package/dist/i18n/locales/ar.js.map +1 -1
  429. package/dist/i18n/locales/de.d.ts +170 -9
  430. package/dist/i18n/locales/de.d.ts.map +1 -1
  431. package/dist/i18n/locales/de.js +173 -12
  432. package/dist/i18n/locales/de.js.map +1 -1
  433. package/dist/i18n/locales/el.d.ts +170 -9
  434. package/dist/i18n/locales/el.d.ts.map +1 -1
  435. package/dist/i18n/locales/el.js +173 -12
  436. package/dist/i18n/locales/el.js.map +1 -1
  437. package/dist/i18n/locales/en.d.ts +170 -9
  438. package/dist/i18n/locales/en.d.ts.map +1 -1
  439. package/dist/i18n/locales/en.js +173 -12
  440. package/dist/i18n/locales/en.js.map +1 -1
  441. package/dist/i18n/locales/es.d.ts +170 -9
  442. package/dist/i18n/locales/es.d.ts.map +1 -1
  443. package/dist/i18n/locales/es.js +173 -12
  444. package/dist/i18n/locales/es.js.map +1 -1
  445. package/dist/i18n/locales/fr.d.ts +170 -9
  446. package/dist/i18n/locales/fr.d.ts.map +1 -1
  447. package/dist/i18n/locales/fr.js +173 -12
  448. package/dist/i18n/locales/fr.js.map +1 -1
  449. package/dist/i18n/locales/hi.d.ts +170 -9
  450. package/dist/i18n/locales/hi.d.ts.map +1 -1
  451. package/dist/i18n/locales/hi.js +173 -12
  452. package/dist/i18n/locales/hi.js.map +1 -1
  453. package/dist/i18n/locales/it.d.ts +170 -9
  454. package/dist/i18n/locales/it.d.ts.map +1 -1
  455. package/dist/i18n/locales/it.js +173 -12
  456. package/dist/i18n/locales/it.js.map +1 -1
  457. package/dist/i18n/locales/ja.d.ts +170 -9
  458. package/dist/i18n/locales/ja.d.ts.map +1 -1
  459. package/dist/i18n/locales/ja.js +173 -12
  460. package/dist/i18n/locales/ja.js.map +1 -1
  461. package/dist/i18n/locales/nl.d.ts +170 -9
  462. package/dist/i18n/locales/nl.d.ts.map +1 -1
  463. package/dist/i18n/locales/nl.js +173 -12
  464. package/dist/i18n/locales/nl.js.map +1 -1
  465. package/dist/i18n/locales/pl.d.ts +170 -9
  466. package/dist/i18n/locales/pl.d.ts.map +1 -1
  467. package/dist/i18n/locales/pl.js +173 -12
  468. package/dist/i18n/locales/pl.js.map +1 -1
  469. package/dist/i18n/locales/pt.d.ts +170 -9
  470. package/dist/i18n/locales/pt.d.ts.map +1 -1
  471. package/dist/i18n/locales/pt.js +173 -12
  472. package/dist/i18n/locales/pt.js.map +1 -1
  473. package/dist/i18n/locales/ro.d.ts +170 -9
  474. package/dist/i18n/locales/ro.d.ts.map +1 -1
  475. package/dist/i18n/locales/ro.js +173 -12
  476. package/dist/i18n/locales/ro.js.map +1 -1
  477. package/dist/i18n/locales/ru.d.ts +170 -9
  478. package/dist/i18n/locales/ru.d.ts.map +1 -1
  479. package/dist/i18n/locales/ru.js +173 -12
  480. package/dist/i18n/locales/ru.js.map +1 -1
  481. package/dist/i18n/locales/sq.d.ts +170 -9
  482. package/dist/i18n/locales/sq.d.ts.map +1 -1
  483. package/dist/i18n/locales/sq.js +173 -12
  484. package/dist/i18n/locales/sq.js.map +1 -1
  485. package/dist/i18n/locales/sv.d.ts +170 -9
  486. package/dist/i18n/locales/sv.d.ts.map +1 -1
  487. package/dist/i18n/locales/sv.js +173 -12
  488. package/dist/i18n/locales/sv.js.map +1 -1
  489. package/dist/i18n/locales/tr.d.ts +170 -9
  490. package/dist/i18n/locales/tr.d.ts.map +1 -1
  491. package/dist/i18n/locales/tr.js +173 -12
  492. package/dist/i18n/locales/tr.js.map +1 -1
  493. package/dist/i18n/locales/zh.d.ts +170 -9
  494. package/dist/i18n/locales/zh.d.ts.map +1 -1
  495. package/dist/i18n/locales/zh.js +173 -12
  496. package/dist/i18n/locales/zh.js.map +1 -1
  497. package/dist/index.js +774 -761
  498. package/dist/index.js.map +1 -1
  499. package/dist/locales/ar.json +173 -12
  500. package/dist/locales/de.json +173 -12
  501. package/dist/locales/el.json +173 -12
  502. package/dist/locales/en.json +173 -12
  503. package/dist/locales/es.json +173 -12
  504. package/dist/locales/fr.json +173 -12
  505. package/dist/locales/hi.json +173 -12
  506. package/dist/locales/it.json +173 -12
  507. package/dist/locales/ja.json +173 -12
  508. package/dist/locales/nl.json +173 -12
  509. package/dist/locales/pl.json +173 -12
  510. package/dist/locales/pt.json +173 -12
  511. package/dist/locales/ro.json +173 -12
  512. package/dist/locales/ru.json +173 -12
  513. package/dist/locales/sq.json +173 -12
  514. package/dist/locales/sv.json +173 -12
  515. package/dist/locales/tr.json +173 -12
  516. package/dist/locales/zh.json +173 -12
  517. package/dist/patterns/alia-assistant/index.js +1 -1
  518. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  519. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +1 -1
  520. package/dist/tokens.css +2 -2
  521. package/package.json +5 -5
  522. package/dist/_chunks/benefit-card-Xnxj4Gmo.js.map +0 -1
  523. package/dist/_chunks/button-DD_0Xdmr.js.map +0 -1
  524. package/dist/_chunks/button-group-CvEnVzY7.js +0 -119
  525. package/dist/_chunks/button-group-CvEnVzY7.js.map +0 -1
  526. package/dist/_chunks/document-scanner-B23j4w7X.js.map +0 -1
  527. package/dist/_chunks/face-scheme-BT9_KdL0.js +0 -1450
  528. package/dist/_chunks/face-scheme-BT9_KdL0.js.map +0 -1
  529. package/dist/_chunks/file-upload-Kw1rdvFw.js.map +0 -1
  530. package/dist/_chunks/finished-terminal-Di4gtZ50.js.map +0 -1
  531. package/dist/_chunks/freemium-paywall-DFoeedwh.js.map +0 -1
  532. package/dist/_chunks/header-DaXWDw0M.js.map +0 -1
  533. package/dist/_chunks/icon-button-group-C48khLE0.js +0 -206
  534. package/dist/_chunks/icon-button-group-C48khLE0.js.map +0 -1
  535. package/dist/_chunks/insert-result-C7xSDb8q.js.map +0 -1
  536. package/dist/_chunks/link-cell-renderer-BCppbMec.js.map +0 -1
  537. package/dist/_chunks/marketplace-app-shell-BCYiOvKZ.js.map +0 -1
  538. package/dist/_chunks/optical-prescription-Bmlbuopi.js +0 -653
  539. package/dist/_chunks/optical-prescription-Bmlbuopi.js.map +0 -1
  540. package/dist/_chunks/patient-search-X9SUZGpy.js.map +0 -1
  541. package/dist/_chunks/patient-shell-oiIRqEAl.js +0 -162
  542. package/dist/_chunks/patient-shell-oiIRqEAl.js.map +0 -1
  543. package/dist/_chunks/public-header.agent-C-opZaOw.js.map +0 -1
  544. package/dist/_chunks/radiograph-panel.agent-D1x33moc.js.map +0 -1
  545. package/dist/_chunks/rich-text-editor-DUgznqOf.js.map +0 -1
  546. package/dist/_chunks/sidebar-B0OBmJrC.js.map +0 -1
  547. package/dist/_chunks/signature-capture-Ct_4Md4e.js.map +0 -1
  548. package/dist/_chunks/signature-field-jgwYgUhO.js.map +0 -1
  549. package/dist/_chunks/subDays-DGSOp9d9.js +0 -8
  550. package/dist/_chunks/transaction-chip-B6iWoVmU.js.map +0 -1
  551. package/dist/patterns/patient-shell/index.d.ts +0 -12
  552. package/dist/patterns/patient-shell/index.d.ts.map +0 -1
  553. package/dist/patterns/patient-shell/index.js +0 -5
  554. package/dist/patterns/patient-shell/index.js.map +0 -1
  555. package/dist/patterns/patient-shell/patient-shell.d.ts +0 -62
  556. package/dist/patterns/patient-shell/patient-shell.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-capture-DN52VNKL.js","sources":["../../src/components/signature-capture/signature-capture.agent.ts","../../src/components/signature-capture/signature-capture.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { SignatureCaptureHandle } from './signature-capture';\n\nexport const signatureCaptureAgent: AgentAdapter<SignatureCaptureHandle> = {\n id: 'signature-capture',\n // Multi-step media lifecycle: draw / type strokes (capture) then commit the\n // serialised signature (submit).\n capabilities: ['capture', 'submit'],\n state: {\n isEmpty: {\n type: 'boolean',\n descriptionKey: 'ui.agent.signatureCapture.state.isEmpty',\n description: 'True when no signature has been drawn or typed.',\n read: (handle) => handle.isEmpty(),\n },\n },\n actions: {\n clear: {\n // Erases all captured strokes — destructive (loses drawn/typed input).\n safety: 'destructive',\n idempotent: true,\n descriptionKey: 'ui.agent.signatureCapture.actions.clear',\n description: 'Erase the current signature. Loses unsaved input.',\n invoke: (handle) => {\n handle.clear();\n },\n },\n undo: {\n // Removes the last stroke — reversible by redrawing.\n safety: 'write',\n descriptionKey: 'ui.agent.signatureCapture.actions.undo',\n description: 'Undo the last stroke.',\n invoke: (handle) => {\n handle.undo();\n },\n },\n confirm: {\n // Commits the captured media and returns its serialised payload.\n safety: 'write',\n returns: 'SignatureConfirmPayload | null',\n returnsSchema: {\n oneOf: [\n {\n type: 'object',\n description: 'The committed signature payload.',\n properties: {\n dataUrl: {\n type: 'string',\n description: 'PNG data URL of the captured signature.',\n },\n capturedAt: {\n type: 'string',\n description: 'ISO-8601 UTC timestamp of the commit.',\n },\n },\n required: ['dataUrl'],\n },\n {\n type: 'null',\n description: 'Returned when the pad is empty.',\n },\n ],\n },\n descriptionKey: 'ui.agent.signatureCapture.actions.confirm',\n description: 'Commit the signature and return its serialised payload.',\n invoke: (handle) => handle.confirm(),\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'signature-capture' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* ------------------------------------------------------------------ */\n/* SignatureCapture — thin React wrapper over signature_pad. */\n/* */\n/* - Library: `signature_pad` (08-third-party §Signature Pad). We */\n/* instantiate one pad per mounted canvas and expose imperative */\n/* clear / undo / isEmpty / confirm verbs to the consumer. */\n/* - Colors: `penColor` / `backgroundColor` default to */\n/* `--foreground` / `--background` via `getComputedStyle()`. Theme */\n/* switches are observed via a MutationObserver on `<html class>` */\n/* so the ink recolours when the theme flips. */\n/* - DPR scaling: canvas attribute `width/height = cssSize * DPR`; the */\n/* 2D context is scaled by the same factor. A `ResizeObserver` */\n/* replays strokes via `fromData()` on re-scale so nothing is lost. */\n/* - Typed fallback: keyboard-only path renders a text input styled in */\n/* italic `var(--font-sans)` (per 23-constraints §10 — serif is */\n/* marketing only). On confirm we render the string to an offscreen */\n/* canvas for the PNG/SVG export. */\n/* - Confirm payload: `{ png, svg, widthMm, heightMm, capturedAt, */\n/* sha256, strokes? }`. `sha256` is the SubtleCrypto digest of the */\n/* PNG bytes — tamper-evident for audit trails. */\n/* - Security: no `fetch` / `XMLHttpRequest` / `localStorage` / */\n/* `sessionStorage` in this file — the consumer owns persistence. */\n/* */\n/* TODO: */\n/* - 3× DPI re-render for print: currently `toDataURL('image/png')` */\n/* exports the live canvas (already at DPR). A proper 300-DPI */\n/* pipeline would create an offscreen canvas at `cssSize × 3` and */\n/* replay strokes via `fromData()` — deferred pending the print */\n/* bridge landing. */\n/* - Typed-fallback canvas font can't read CSS variables directly */\n/* (Canvas2D resolves fonts at paint time and won't expand */\n/* `var(--font-size-2xl)`); we use a fixed `32px italic` + the */\n/* user's font stack, which is visually close but not */\n/* theme-reactive. Will migrate once the typography tokens expose */\n/* a resolved `font` shorthand. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport SignaturePad from 'signature_pad';\nimport type { PointGroup } from 'signature_pad';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Check, Eraser, PenLine, Type } from 'lucide-react';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { signatureCaptureAgent } from './signature-capture.agent';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface SignatureConfirmPayload {\n /** Data URL of the captured signature rendered as PNG. */\n png: string;\n /** SVG string trimmed to the stroke bounding box. */\n svg: string;\n /** Physical width in millimetres, derived from CSS px. */\n widthMm: number;\n /** Physical height in millimetres, derived from CSS px. */\n heightMm: number;\n /** ISO-8601 UTC timestamp for when `confirm()` resolved. */\n capturedAt: string;\n /** Hex-encoded SHA-256 digest of the PNG bytes. */\n sha256: string;\n /** Raw stroke data from `signature_pad.toData()` — optional for replays. */\n strokes?: PointGroup[];\n}\n\nexport interface SignatureCaptureProps {\n /** Opaque instance id — emitted as `data-component-id` for the agent registry. */\n id?: string;\n /** Called with the export payload when the user confirms the signature. */\n onConfirm?: (payload: SignatureConfirmPayload) => void;\n /** Called after the pad is cleared (explicit user action). */\n onClear?: () => void;\n /** Called when the user starts drawing a new stroke. */\n onStart?: () => void;\n /** CSS width of the pad. Default 400. */\n width?: number | string;\n /** CSS height of the pad. Default 200. */\n height?: number | string;\n /** Pen colour override — defaults to `var(--foreground)`. */\n penColor?: string;\n /** Background override — defaults to `var(--background)`. */\n backgroundColor?: string;\n /** Show the typed-name fallback toggle. Default `true`. */\n allowTypedFallback?: boolean;\n /**\n * When set, on confirm() the captured PNG data URL is written into a hidden\n * `<input name={name}>` so consumers can POST the signature declaratively.\n * The PNG data URL satisfies the server's `data:image/png` prefix check.\n * Default off.\n */\n name?: string;\n /** Disable the entire component. */\n disabled?: boolean;\n /** Accessible label for the pad region. */\n ariaLabel?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n}\n\nexport interface SignatureCaptureHandle {\n clear: () => void;\n undo: () => void;\n isEmpty: () => boolean;\n confirm: () => Promise<SignatureConfirmPayload | null>;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva(\n [\n 'ds:signature-capture-alfadocs ds:flex ds:flex-col',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:[.theme-accessible_&]:border-2',\n 'ds:p-[var(--spacing-sm)]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst padFrameVariants = cva(\n [\n 'ds:relative ds:block',\n // Mobile-first: fill the available width but never exceed the configured\n // pad width. Arbitrary-property form because `inline-size-[…]` /\n // `block-size-[…]` named utilities emit no CSS here (see canvasVariants).\n 'ds:[inline-size:100%]',\n 'ds:[max-inline-size:var(--signature-width)]',\n 'ds:[block-size:var(--signature-height)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)]',\n 'ds:overflow-hidden',\n 'ds:touch-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst canvasVariants = cva(\n [\n 'ds:block',\n // Arbitrary-property form, NOT `inline-size-full` / `block-size-full`:\n // the `inline-size-*` / `block-size-*` named utilities generate no CSS in\n // this Tailwind setup, so on a block <div> they silently fall back to auto\n // (harmless) but on a replaced <canvas> the element then sizes to its\n // backing-store `width`/`height` attribute — which scaleCanvas drives up to\n // MAX_CANVAS_PX (4096) in a feedback loop, overflowing the pad on mobile.\n // The `[property:value]` escape hatch always emits, pinning the canvas to\n // the frame so the loop can't run away.\n 'ds:[inline-size:100%]',\n 'ds:[block-size:100%]',\n 'ds:touch-none',\n 'ds:select-none',\n ].join(' '),\n);\n\n// The toolbar is a named container: below 30rem the action captions hide and\n// the buttons fall back to their icons (one compact row instead of wrapped\n// text), so the row works inside a phone-width Dialog. At the default pad\n// width (400px = 25rem) the toolbar stays icon-only; stretched to a desktop\n// dialog (width=\"100%\" in a size=\"lg\" Dialog, ~37rem) the captions appear.\n// aria-labels keep the full names regardless of width.\nconst toolbarVariants = cva(\n [\n 'ds:@container/sigactions',\n 'ds:flex ds:items-stretch ds:flex-wrap ds:gap-[var(--spacing-sm)]',\n ].join(' '),\n);\n\n// Caption span inside each toolbar action — hidden until the toolbar\n// container is wide enough for all three text labels on one row.\nconst actionCaptionVariants = cva('ds:hidden ds:@[30rem]/sigactions:inline');\n\n// Toolbar actions are sized for thumbs: they grow to fill the pad width\n// (`flex-1`), sit above the 44/48px floor, and use base-size text so they read\n// clearly on a phone.\nconst actionButtonVariants = cva(\n [\n 'ds:inline-flex ds:flex-1 ds:items-center ds:justify-center',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:[min-inline-size:var(--min-target-size)]',\n 'ds:gap-[var(--spacing-xs)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-transparent ds:text-[var(--foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--muted)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst confirmButtonVariants = cva(\n [\n 'ds:inline-flex ds:flex-1 ds:items-center ds:justify-center',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:[min-inline-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-base)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:opacity-[var(--opacity-50)] ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst typedInputVariants = cva(\n [\n 'ds:block ds:inline-size-full',\n 'ds:[min-block-size:var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:font-[family-name:var(--font-sans)]',\n 'ds:italic',\n 'ds:tracking-[0.1em]',\n 'ds:text-[length:var(--font-size-lg)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n);\n\nconst typedPreviewVariants = cva(\n [\n 'ds:flex ds:items-center ds:justify-center',\n // Match the pad frame: responsive width capped at the configured size.\n // Arbitrary-property form (the named `*-size-[…]` utilities are no-ops here).\n 'ds:[inline-size:100%]',\n 'ds:[max-inline-size:var(--signature-width)]',\n 'ds:[block-size:var(--signature-height)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:border-[color:var(--card-border)]',\n 'ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:font-[family-name:var(--font-sans)]',\n 'ds:italic',\n 'ds:tracking-[0.1em]',\n 'ds:text-[length:var(--font-size-2xl)]',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\ntype SignatureState = 'empty' | 'drawing' | 'captured' | 'cleared';\n\n/**\n * Resolve a CSS custom property against `document.documentElement`. We\n * can't pass `var(--foreground)` to signature_pad directly — the lib\n * stamps the string straight into `ctx.strokeStyle`, which only accepts\n * concrete colour values. Looking the variable up at runtime keeps the\n * component in tokens-only compliance.\n */\nfunction resolveCssVar(name: string): string {\n if (typeof document === 'undefined') return '';\n const value = getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n return value;\n}\n\nfunction toCssSize(v: number | string | undefined, fallback: string): string {\n if (typeof v === 'number') return `${v}px`;\n if (typeof v === 'string' && v.length > 0) return v;\n return fallback;\n}\n\n/**\n * Parse a pixel value, returning `null` for non-pixel strings (e.g.\n * \"100%\", \"50vw\") so the caller can fall back to the measured rect.\n * parseFloat(\"100%\") would silently return 100 — a 100mm-wide export\n * masquerading as 26mm. Allow only digits, dot, minus, whitespace, \"px\".\n */\nfunction parsePxValue(v: string): number | null {\n if (typeof v === 'string' && /[^0-9.\\s\\-px]/i.test(v)) return null;\n const n = parseFloat(v);\n if (!Number.isFinite(n)) return null;\n return n;\n}\n\n/** Hex-encode a Uint8Array. */\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i += 1) {\n const b = bytes[i];\n out += b.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/** Decode a base64 string into bytes without `atob` polyfills. */\nfunction base64ToBytes(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) bytes[i] = bin.charCodeAt(i);\n return bytes;\n }\n // Fallback — node-style Buffer, gated behind a runtime check.\n const g = globalThis as {\n Buffer?: { from: (s: string, enc: string) => Uint8Array };\n };\n if (g.Buffer) return g.Buffer.from(b64, 'base64');\n return new Uint8Array();\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const g = globalThis as { crypto?: Crypto };\n if (g.crypto?.subtle) {\n // Copy the bytes into a fresh ArrayBuffer so the slice is always an\n // ArrayBuffer (never a SharedArrayBuffer) — SubtleCrypto's BufferSource\n // narrowing doesn't accept the latter.\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n const digest = await g.crypto.subtle.digest('SHA-256', copy.buffer);\n return toHex(new Uint8Array(digest));\n }\n // No subtle crypto — return empty so callers can still use the rest\n // of the payload. Test env is expected to stub crypto.subtle.\n return '';\n}\n\n/**\n * Render the typed fallback string onto an offscreen canvas and return\n * it. Used by the confirm path when the user has typed their name\n * instead of drawing. Size is fixed at `32px italic` because Canvas2D\n * resolves fonts eagerly and can't expand `var(--font-size-*)`.\n */\nfunction renderTypedSignatureToCanvas(\n text: string,\n cssWidth: number,\n cssHeight: number,\n penColor: string,\n backgroundColor: string,\n): HTMLCanvasElement {\n const dpr = Math.max(\n 1,\n typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n );\n const canvas = document.createElement('canvas');\n canvas.width = Math.floor(cssWidth * dpr);\n canvas.height = Math.floor(cssHeight * dpr);\n const ctx = canvas.getContext('2d');\n if (!ctx) return canvas;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // Fill background with the token-resolved colour.\n ctx.fillStyle = backgroundColor || 'transparent';\n ctx.fillRect(0, 0, cssWidth, cssHeight);\n // Draw the typed signature centred.\n ctx.fillStyle = penColor || 'currentColor';\n ctx.font = '32px italic sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, cssWidth / 2, cssHeight / 2, cssWidth - 16);\n return canvas;\n}\n\n/* ------------------------------------------------------------------ */\n/* SignatureCapture */\n/* ------------------------------------------------------------------ */\n\nexport const SignatureCapture = forwardRef<\n SignatureCaptureHandle,\n SignatureCaptureProps\n>(\n (\n {\n id,\n onConfirm,\n onClear,\n onStart,\n width = 400,\n height = 200,\n penColor,\n backgroundColor,\n allowTypedFallback = true,\n name,\n disabled = false,\n ariaLabel,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const rawId = useId();\n const idSafe = useMemo(\n () => `sig-${rawId.replace(/[^a-zA-Z0-9-_]/g, '')}`,\n [rawId],\n );\n const liveRegionId = `${idSafe}-live`;\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const padFrameRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const typedPreviewRef = useRef<HTMLDivElement>(null);\n const signaturePadRef = useRef<SignaturePad | null>(null);\n\n const [mode, setMode] = useState<'draw' | 'typed'>('draw');\n const [typedValue, setTypedValue] = useState('');\n // Mirrors the last confirmed PNG data URL into a hidden form field when\n // `name` is set, so consumers can POST the signature declaratively.\n const [boundValue, setBoundValue] = useState('');\n // Tracks whether the pad has any ink — gates the Confirm button.\n // signature_pad's isEmpty() is a sync ref read and won't trigger\n // re-renders; this state mirrors it so React sees the change.\n const [padHasInk, setPadHasInk] = useState(false);\n // Retained state — consumers may subscribe to the pad's lifecycle via\n // `onConfirm`/`onClear`/`onStart`; we still track the machine internally\n // so the live region + confirm button stay coherent.\n const signatureStateRef = useRef<SignatureState>('empty');\n const [announcement, setAnnouncement] = useState<string>('');\n const [resolvedPen, setResolvedPen] = useState<string>('');\n const [resolvedBg, setResolvedBg] = useState<string>('');\n\n // Stable callback refs so we can wire signature_pad once without\n // re-instantiating on every render.\n const onStartRef = useRef<SignatureCaptureProps['onStart']>(onStart);\n const onClearRef = useRef<SignatureCaptureProps['onClear']>(onClear);\n const onConfirmRef = useRef<SignatureCaptureProps['onConfirm']>(onConfirm);\n useEffect(() => {\n onStartRef.current = onStart;\n onClearRef.current = onClear;\n onConfirmRef.current = onConfirm;\n }, [onStart, onClear, onConfirm]);\n\n /* ---- Announce helper ---------------------------------------- */\n const announce = useCallback(\n (next: SignatureState) => {\n signatureStateRef.current = next;\n setAnnouncement(t(`signature.state.${next}`));\n },\n [t],\n );\n\n /* ---- Resolve tokens ----------------------------------------- */\n useEffect(() => {\n if (typeof document === 'undefined') return undefined;\n function resolveAll(): void {\n const pen = penColor ?? resolveCssVar('--foreground');\n const bg = backgroundColor ?? resolveCssVar('--background');\n // Fall back to `currentColor` / `transparent` — keyword literals\n // are token-neutral and honour the surrounding theme even when\n // the CSS variable is briefly unavailable (SSR, initial paint).\n setResolvedPen(pen || 'currentColor');\n setResolvedBg(bg || 'transparent');\n }\n resolveAll();\n // Watch for theme-class changes on <html>.\n const mo = new MutationObserver(() => {\n resolveAll();\n });\n mo.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => mo.disconnect();\n }, [penColor, backgroundColor]);\n\n /* ---- Apply colour changes to an existing pad ---------------- */\n useEffect(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n if (resolvedPen) pad.penColor = resolvedPen;\n if (resolvedBg) pad.backgroundColor = resolvedBg;\n }, [resolvedPen, resolvedBg]);\n\n /* ---- Instantiate signature_pad ------------------------------ */\n useEffect(() => {\n if (mode !== 'draw') return undefined;\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n\n const pad = new SignaturePad(canvas, {\n penColor: resolvedPen || 'currentColor',\n backgroundColor: resolvedBg || 'transparent',\n minWidth: 0.5,\n maxWidth: 2.5,\n velocityFilterWeight: 0.7,\n });\n signaturePadRef.current = pad;\n\n const handleBegin = (): void => {\n setPadHasInk(true);\n announce('drawing');\n onStartRef.current?.();\n };\n const handleEnd = (): void => {\n // Keep state as 'drawing' — transition to 'captured' on confirm.\n };\n pad.addEventListener('beginStroke', handleBegin);\n pad.addEventListener('endStroke', handleEnd);\n\n // Initial DPR scale + announcement.\n scaleCanvas(canvas);\n announce('empty');\n\n return () => {\n pad.removeEventListener('beginStroke', handleBegin);\n pad.removeEventListener('endStroke', handleEnd);\n // Clear strokes from memory; 08-third-party §Signature Pad.\n pad.clear();\n pad.off();\n signaturePadRef.current = null;\n };\n // We intentionally re-create the pad only when switching between\n // typed and draw modes. Color updates flow through the effect above.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mode]);\n\n /* ---- Disabled state ----------------------------------------- */\n useEffect(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n if (disabled) pad.off();\n else pad.on();\n }, [disabled, mode]);\n\n /* ---- DPR + ResizeObserver ----------------------------------- */\n // Hard-cap backing-store dimensions to bound memory. 4096 px × 4096 px at\n // 4 bytes per pixel is ~67 MB — generous for any realistic signature, but\n // well under the multi-GB allocation a careless or malicious prop could\n // request on a high-DPR display. See security-hardening.mdx.\n const MAX_CANVAS_PX = 4096;\n const scaleCanvas = useCallback(\n (canvas: HTMLCanvasElement) => {\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.max(\n 1,\n typeof window !== 'undefined' ? window.devicePixelRatio : 1,\n );\n const rawWidth = Math.max(1, Math.floor(rect.width * dpr));\n const rawHeight = Math.max(1, Math.floor(rect.height * dpr));\n const targetWidth = Math.min(rawWidth, MAX_CANVAS_PX);\n const targetHeight = Math.min(rawHeight, MAX_CANVAS_PX);\n if (\n import.meta.env.DEV &&\n (rawWidth !== targetWidth || rawHeight !== targetHeight)\n ) {\n // Silent in production; a consumer shipping 10k × 10k probably wants\n // the nudge.\n console.warn(\n `[SignatureCapture] clamped canvas backing store from ${rawWidth}x${rawHeight} to ${targetWidth}x${targetHeight} (cap = ${MAX_CANVAS_PX}px).`,\n );\n }\n if (canvas.width === targetWidth && canvas.height === targetHeight)\n return;\n\n const pad = signaturePadRef.current;\n const prior = pad ? pad.toData() : null;\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n const ctx = canvas.getContext('2d');\n if (ctx) ctx.scale(dpr, dpr);\n if (pad) {\n if (resolvedBg) pad.backgroundColor = resolvedBg;\n if (resolvedPen) pad.penColor = resolvedPen;\n pad.clear();\n if (prior && prior.length > 0) {\n pad.fromData(prior);\n }\n }\n },\n [resolvedBg, resolvedPen],\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n if (typeof ResizeObserver === 'undefined') {\n scaleCanvas(canvas);\n return undefined;\n }\n const ro = new ResizeObserver(() => {\n scaleCanvas(canvas);\n });\n ro.observe(canvas);\n return () => ro.disconnect();\n }, [scaleCanvas]);\n\n /* ---- Imperative handle -------------------------------------- */\n const clear = useCallback(() => {\n const pad = signaturePadRef.current;\n if (pad) pad.clear();\n setTypedValue('');\n setBoundValue('');\n setPadHasInk(false);\n announce('cleared');\n onClearRef.current?.();\n }, [announce]);\n\n const undo = useCallback(() => {\n const pad = signaturePadRef.current;\n if (!pad) return;\n const data = pad.toData();\n if (!data || data.length === 0) return;\n data.pop();\n pad.fromData(data);\n if (data.length === 0) {\n setPadHasInk(false);\n announce('empty');\n }\n }, [announce]);\n\n const isEmpty = useCallback((): boolean => {\n if (mode === 'typed') return typedValue.trim().length === 0;\n const pad = signaturePadRef.current;\n return pad ? pad.isEmpty() : true;\n }, [mode, typedValue]);\n\n const confirm =\n useCallback(async (): Promise<SignatureConfirmPayload | null> => {\n // parsePxValue returns null for \"100%\" / \"50vw\" etc. — fall back\n // to the live rendered rect so widthMm reflects reality, not a\n // mis-parsed parseFloat(\"100%\") = 100.\n const widthParsed = parsePxValue(\n typeof width === 'number' ? `${width}` : String(width),\n );\n const heightParsed = parsePxValue(\n typeof height === 'number' ? `${height}` : String(height),\n );\n const measureEl =\n mode === 'draw'\n ? (canvasRef.current ?? padFrameRef.current ?? wrapperRef.current)\n : (typedPreviewRef.current ?? wrapperRef.current);\n const measuredRect = measureEl?.getBoundingClientRect();\n const cssWidth =\n widthParsed ?? (measuredRect ? measuredRect.width : 400);\n const cssHeight =\n heightParsed ?? (measuredRect ? measuredRect.height : 200);\n\n let pngDataUrl = '';\n let svgString = '';\n let strokes: PointGroup[] | undefined;\n\n if (mode === 'draw') {\n const pad = signaturePadRef.current;\n if (!pad || pad.isEmpty()) return null;\n pngDataUrl = pad.toDataURL('image/png');\n svgString = pad.toSVG();\n strokes = pad.toData();\n } else {\n const value = typedValue.trim();\n if (value.length === 0) return null;\n const offscreen = renderTypedSignatureToCanvas(\n value,\n cssWidth,\n cssHeight,\n resolvedPen || 'currentColor',\n resolvedBg || 'transparent',\n );\n pngDataUrl = offscreen.toDataURL('image/png');\n // Inline SVG — we can't call toSVG() because signature_pad isn't\n // driving the canvas. Build a minimal SVG with the rendered text.\n const safeText = value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n svgString =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${cssWidth} ${cssHeight}\" width=\"${cssWidth}\" height=\"${cssHeight}\">` +\n `<text x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\" font-family=\"sans-serif\" font-style=\"italic\" font-size=\"32\" fill=\"${resolvedPen || 'currentColor'}\" letter-spacing=\"3\">${safeText}</text>` +\n `</svg>`;\n }\n\n // 96 CSS px = 25.4 mm (per W3C CSS absolute length definition).\n const widthMm = (cssWidth * 25.4) / 96;\n const heightMm = (cssHeight * 25.4) / 96;\n const capturedAt = new Date().toISOString();\n\n // Compute SHA-256 of the PNG bytes.\n let sha256 = '';\n if (pngDataUrl) {\n const commaIx = pngDataUrl.indexOf(',');\n const b64 = commaIx >= 0 ? pngDataUrl.slice(commaIx + 1) : '';\n const bytes = base64ToBytes(b64);\n sha256 = await sha256Hex(bytes);\n }\n\n const payload: SignatureConfirmPayload = {\n png: pngDataUrl,\n svg: svgString,\n widthMm,\n heightMm,\n capturedAt,\n sha256,\n strokes,\n };\n\n announce('captured');\n if (name) setBoundValue(payload.png);\n onConfirmRef.current?.(payload);\n return payload;\n }, [\n mode,\n typedValue,\n width,\n height,\n resolvedPen,\n resolvedBg,\n announce,\n name,\n ]);\n\n const agentHandle = useMemo<SignatureCaptureHandle>(\n () => ({\n clear,\n undo,\n isEmpty,\n confirm,\n }),\n [clear, undo, isEmpty, confirm],\n );\n useImperativeHandle(ref, () => agentHandle, [agentHandle]);\n useAgentRegistration(signatureCaptureAgent, agentHandle, id);\n\n /* ---- Derived UI state --------------------------------------- */\n // Gate Confirm on React state, not the signature_pad ref — its\n // isEmpty() doesn't trigger re-renders, leaving the button stale.\n const hasContent =\n mode === 'typed' ? typedValue.trim().length > 0 : padHasInk;\n const confirmDisabled = disabled || !hasContent;\n // Inline style — permitted per 23-constraints §Runtime-computed\n // dimensions (CSS custom property setter for dynamic width/height\n // from consumer props; the width rule lives in Tailwind arbitrary\n // values that read --signature-width / --signature-height).\n const sizeStyle: CSSProperties = {\n ['--signature-width' as unknown as keyof CSSProperties]: toCssSize(\n width,\n 'var(--signature-default-width)',\n ),\n ['--signature-height' as unknown as keyof CSSProperties]: toCssSize(\n height,\n 'var(--signature-default-height)',\n ),\n } as CSSProperties;\n\n /* ---- Render -------------------------------------------------- */\n return (\n <div\n ref={wrapperRef}\n role=\"group\"\n aria-label={ariaLabel ?? t('signature.padLabel')}\n aria-disabled={disabled || undefined}\n className={[wrapperVariants(), className].filter(Boolean).join(' ')}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed pad dimensions\n style={sizeStyle}\n data-component=\"signature-capture\"\n data-component-id={id}\n >\n {name ? (\n <input type=\"hidden\" name={name} value={boundValue} readOnly />\n ) : null}\n {mode === 'draw' ? (\n <div ref={padFrameRef} className={padFrameVariants()}>\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={t('signature.padLabel')}\n className={canvasVariants()}\n data-testid=\"signature-canvas\"\n />\n </div>\n ) : (\n <label className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-body-sm ds:text-[var(--muted-foreground)]\">\n {t('signature.typedFallback.label')}\n </span>\n <input\n type=\"text\"\n value={typedValue}\n onChange={(e) => {\n setTypedValue(e.target.value);\n if (e.target.value.length > 0) announce('drawing');\n else announce('empty');\n }}\n placeholder={t('signature.typedFallback.placeholder')}\n aria-label={t('signature.typedFallback.label')}\n disabled={disabled}\n className={typedInputVariants()}\n data-testid=\"signature-typed-input\"\n />\n {typedValue ? (\n <div\n ref={typedPreviewRef}\n className={typedPreviewVariants()}\n aria-hidden=\"true\"\n >\n {typedValue}\n </div>\n ) : null}\n </label>\n )}\n\n {/* Live region — state transitions (empty, drawing, captured, cleared) */}\n <div\n id={liveRegionId}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n data-testid=\"signature-live\"\n >\n {announcement}\n </div>\n\n <div\n className={toolbarVariants()}\n role=\"group\"\n aria-label={t('signature.padLabel')}\n >\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n clear();\n }}\n aria-disabled={disabled || undefined}\n aria-label={t('signature.clear')}\n className={actionButtonVariants()}\n >\n <Eraser aria-hidden=\"true\" className=\"ds:size-4\" />\n <span className={actionCaptionVariants()}>\n {t('signature.clear')}\n </span>\n </button>\n {allowTypedFallback ? (\n <button\n type=\"button\"\n onClick={() => {\n if (disabled) return;\n setTypedValue('');\n setMode((m) => (m === 'draw' ? 'typed' : 'draw'));\n announce('cleared');\n }}\n aria-disabled={disabled || undefined}\n aria-label={\n mode === 'draw'\n ? t('signature.typedFallback.toggle')\n : t('signature.typedFallback.toggleDraw')\n }\n className={actionButtonVariants()}\n aria-pressed={mode === 'typed'}\n >\n {mode === 'draw' ? (\n <Type aria-hidden=\"true\" className=\"ds:size-4\" />\n ) : (\n <PenLine aria-hidden=\"true\" className=\"ds:size-4\" />\n )}\n <span className={actionCaptionVariants()}>\n {mode === 'draw'\n ? t('signature.typedFallback.toggle')\n : t('signature.typedFallback.toggleDraw')}\n </span>\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => {\n if (confirmDisabled) return;\n void confirm();\n }}\n aria-disabled={confirmDisabled || undefined}\n aria-describedby={liveRegionId}\n aria-label={t('signature.confirm')}\n className={confirmButtonVariants()}\n data-testid=\"signature-confirm\"\n >\n <Check aria-hidden=\"true\" className=\"ds:size-4\" />\n <span className={actionCaptionVariants()}>\n {t('signature.confirm')}\n </span>\n </button>\n </div>\n </div>\n );\n },\n);\n\nSignatureCapture.displayName = 'SignatureCapture';\n\nexport {\n wrapperVariants as signatureWrapperVariants,\n actionButtonVariants as signatureActionButtonVariants,\n confirmButtonVariants as signatureConfirmButtonVariants,\n};\n"],"names":["signatureCaptureAgent","handle","wrapperVariants","cva","padFrameVariants","canvasVariants","toolbarVariants","actionCaptionVariants","actionButtonVariants","confirmButtonVariants","typedInputVariants","typedPreviewVariants","resolveCssVar","name","toCssSize","v","fallback","parsePxValue","toHex","bytes","out","i","b","base64ToBytes","b64","bin","g","sha256Hex","_a","copy","digest","renderTypedSignatureToCanvas","text","cssWidth","cssHeight","penColor","backgroundColor","dpr","canvas","ctx","SignatureCapture","forwardRef","id","onConfirm","onClear","onStart","width","height","allowTypedFallback","disabled","ariaLabel","className","ref","t","useTranslation","rawId","useId","liveRegionId","useMemo","wrapperRef","useRef","padFrameRef","canvasRef","typedPreviewRef","signaturePadRef","mode","setMode","useState","typedValue","setTypedValue","boundValue","setBoundValue","padHasInk","setPadHasInk","signatureStateRef","announcement","setAnnouncement","resolvedPen","setResolvedPen","resolvedBg","setResolvedBg","onStartRef","onClearRef","onConfirmRef","useEffect","announce","useCallback","next","resolveAll","pen","bg","mo","pad","SignaturePad","handleBegin","handleEnd","scaleCanvas","MAX_CANVAS_PX","rect","rawWidth","rawHeight","targetWidth","targetHeight","prior","ro","clear","undo","data","isEmpty","confirm","widthParsed","heightParsed","measureEl","measuredRect","pngDataUrl","svgString","strokes","value","safeText","widthMm","heightMm","capturedAt","sha256","commaIx","payload","agentHandle","useImperativeHandle","useAgentRegistration","hasContent","confirmDisabled","sizeStyle","jsxs","jsx","Eraser","m","Type","PenLine","Check"],"mappings":"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"}
@@ -1,26 +1,27 @@
1
- import { jsx as s, jsxs as f, Fragment as m } from "react/jsx-runtime";
1
+ import { jsx as s, jsxs as m, Fragment as v } from "react/jsx-runtime";
2
2
  import { forwardRef as k } from "react";
3
- import { c as y } from "./index-D2ZczOXr.js";
4
- import { useTranslation as C } from "react-i18next";
5
- import { S as _ } from "./spinner-hbwuKwMf.js";
6
- import { C as T } from "./check-DrFSN__t.js";
7
- import { c as w } from "./createLucideIcon-DhHxpK9K.js";
3
+ import { c as C } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as _ } from "react-i18next";
5
+ import { S as T } from "./spinner-hbwuKwMf.js";
6
+ import { C as w } from "./check-DrFSN__t.js";
7
+ import { c as S } from "./createLucideIcon-DhHxpK9K.js";
8
+ import { P as $ } from "./pen-line-D0De5zdl.js";
8
9
  /**
9
10
  * @license lucide-react v1.22.0 - ISC
10
11
  *
11
12
  * This source code is licensed under the ISC license.
12
13
  * See the LICENSE file in the root directory of this source tree.
13
14
  */
14
- const S = [
15
- ["path", { d: "M13 21h8", key: "1jsn5i" }],
15
+ const P = [
16
16
  [
17
17
  "path",
18
18
  {
19
- d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",
20
- key: "1a8usu"
19
+ d: "m21 17-2.156-1.868A.5.5 0 0 0 18 15.5v.5a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1c0-2.545-3.991-3.97-8.5-4a1 1 0 0 0 0 5c4.153 0 4.745-11.295 5.708-13.5a2.5 2.5 0 1 1 3.31 3.284",
20
+ key: "y32ogt"
21
21
  }
22
- ]
23
- ], $ = w("pen-line", S), L = y(
22
+ ],
23
+ ["path", { d: "M3 21h18", key: "itz85i" }]
24
+ ], V = S("signature", P), B = C(
24
25
  [
25
26
  // Overlay fields are always absolutely positioned within the
26
27
  // renderPageOverlay box; the percent geometry rides the inline style.
@@ -99,7 +100,7 @@ const S = [
99
100
  },
100
101
  defaultVariants: { state: "unsigned", active: !1 }
101
102
  }
102
- ), M = k(
103
+ ), D = k(
103
104
  ({
104
105
  state: e = "unsigned",
105
106
  insetInlineStart: o,
@@ -109,18 +110,19 @@ const S = [
109
110
  onActivate: d,
110
111
  signedImageSrc: c,
111
112
  label: r,
112
- disabled: v = !1,
113
- active: u = !1,
114
- id: p,
115
- className: b,
116
- ...h
117
- }, x) => {
118
- const { t: i } = C(), g = v || e === "signing", n = {};
113
+ hideLabel: u = !1,
114
+ disabled: p = !1,
115
+ active: g = !1,
116
+ id: b,
117
+ className: h,
118
+ ...x
119
+ }, z) => {
120
+ const { t: i } = _(), f = p || e === "signing", n = {};
119
121
  o !== void 0 && (n.insetInlineStart = `${o}%`), a !== void 0 && (n.insetBlockStart = `${a}%`), t !== void 0 && (n.inlineSize = `${t}%`), l !== void 0 && (n.blockSize = `${l}%`);
120
- const z = r ?? i("signatureField.prompt"), F = e === "signing" ? r ? i("signatureField.signingNamed", { label: r }) : i("signatureField.signing") : e === "signed" ? r ? i("signatureField.signedNamed", { label: r }) : i("signatureField.signed") : r ?? i("signatureField.unsigned");
121
- function j(N) {
122
- if (g) {
123
- N.preventDefault();
122
+ const F = r ?? i("signatureField.prompt"), N = e === "signing" ? r ? i("signatureField.signingNamed", { label: r }) : i("signatureField.signing") : e === "signed" ? r ? i("signatureField.signedNamed", { label: r }) : i("signatureField.signed") : r ?? i("signatureField.unsigned");
123
+ function j(y) {
124
+ if (f) {
125
+ y.preventDefault();
124
126
  return;
125
127
  }
126
128
  d == null || d();
@@ -128,25 +130,25 @@ const S = [
128
130
  return /* @__PURE__ */ s(
129
131
  "button",
130
132
  {
131
- ref: x,
133
+ ref: z,
132
134
  type: "button",
133
- ...h,
135
+ ...x,
134
136
  "data-component": "signature-field",
135
- "data-component-id": p,
137
+ "data-component-id": b,
136
138
  "data-state": e,
137
- "data-active": u || void 0,
138
- "aria-label": F,
139
- "aria-disabled": g || void 0,
139
+ "data-active": g || void 0,
140
+ "aria-label": N,
141
+ "aria-disabled": f || void 0,
140
142
  "aria-busy": e === "signing" || void 0,
141
143
  onClick: j,
142
- className: [L({ state: e, active: u }), b].filter(Boolean).join(" "),
144
+ className: [B({ state: e, active: g }), h].filter(Boolean).join(" "),
143
145
  style: n,
144
146
  children: e === "signing" ? (
145
147
  // Decorative: the button's aria-label + aria-busy are the single
146
148
  // source of the status announcement, so the Spinner's own
147
149
  // role="status" live region is hidden from assistive tech.
148
150
  /* @__PURE__ */ s("span", { "aria-hidden": "true", children: /* @__PURE__ */ s(
149
- _,
151
+ T,
150
152
  {
151
153
  variant: "pulse",
152
154
  size: "sm",
@@ -166,16 +168,20 @@ const S = [
166
168
  className: "ds:block-size-full ds:inline-size-full ds:object-contain"
167
169
  }
168
170
  ) })
169
- ) : /* @__PURE__ */ f(m, { children: [
171
+ ) : /* @__PURE__ */ m(v, { children: [
170
172
  /* @__PURE__ */ s(
171
- T,
173
+ w,
172
174
  {
173
175
  "aria-hidden": "true",
174
176
  className: "ds:block-size-4 ds:inline-size-4 ds:text-[var(--success)]"
175
177
  }
176
178
  ),
177
- /* @__PURE__ */ s("span", { children: i("signatureField.signed") })
178
- ] }) : /* @__PURE__ */ f(m, { children: [
179
+ u ? null : /* @__PURE__ */ s("span", { children: i("signatureField.signed") })
180
+ ] }) : u ? (
181
+ // Glyph-only unsigned prompt — the Signature squiggle reads as
182
+ // "sign here" on its own, where the pen + caption would overflow.
183
+ /* @__PURE__ */ s(V, { "aria-hidden": "true", className: "ds:size-5" })
184
+ ) : /* @__PURE__ */ m(v, { children: [
179
185
  /* @__PURE__ */ s(
180
186
  $,
181
187
  {
@@ -183,15 +189,15 @@ const S = [
183
189
  className: "ds:block-size-4 ds:inline-size-4"
184
190
  }
185
191
  ),
186
- /* @__PURE__ */ s("span", { children: z })
192
+ /* @__PURE__ */ s("span", { children: F })
187
193
  ] })
188
194
  }
189
195
  );
190
196
  }
191
197
  );
192
- M.displayName = "SignatureField";
198
+ D.displayName = "SignatureField";
193
199
  export {
194
- M as S,
195
- L as s
200
+ D as S,
201
+ B as s
196
202
  };
197
- //# sourceMappingURL=signature-field-jgwYgUhO.js.map
203
+ //# sourceMappingURL=signature-field-0rFODJlW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-field-0rFODJlW.js","sources":["../../node_modules/lucide-react/dist/esm/icons/signature.mjs","../../src/components/signature-field/signature-field.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21 17-2.156-1.868A.5.5 0 0 0 18 15.5v.5a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1c0-2.545-3.991-3.97-8.5-4a1 1 0 0 0 0 5c4.153 0 4.745-11.295 5.708-13.5a2.5 2.5 0 1 1 3.31 3.284\",\n key: \"y32ogt\"\n }\n ],\n [\"path\", { d: \"M3 21h18\", key: \"itz85i\" }]\n];\nconst Signature = createLucideIcon(\"signature\", __iconNode);\n\nexport { __iconNode, Signature as default };\n//# sourceMappingURL=signature.mjs.map\n","/* ------------------------------------------------------------------ */\n/* SignatureField — a single percent-positioned signature placeholder */\n/* rendered inside a PDFViewer page overlay (renderPageOverlay). */\n/* */\n/* Promoted from the story-only field demonstrated in */\n/* pdf-viewer.stories.tsx `WithSignatureFieldOverlays` (HTP-4889): the */\n/* sign.alfadocs.com rebuild needs N of these positioned over each PDF */\n/* page, each a real, keyboard-activatable control whose visual + a11y */\n/* state tracks unsigned → signing → signed. */\n/* */\n/* - Geometry: the consumer supplies percent coordinates */\n/* (insetInlineStart / insetBlockStart / inlineSize / blockSize) */\n/* relative to the overlay box. These are runtime-computed layout */\n/* values driven by consumer data, so they ride an inline `style` */\n/* per 23-constraints §Runtime-computed dimensions — the same */\n/* sanctioned exception PDFViewer/SignatureCapture use. All static */\n/* styling stays in CVA + tokens. Logical properties only, so the */\n/* field mirrors correctly over an RTL document. */\n/* - It IS an interactive control: a real <button>. The accessible name */\n/* reflects state (Sign here / Signing… / Signed); the 44/48px target */\n/* floor is enforced via --min-target-size. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Check, PenLine, Signature } from 'lucide-react';\nimport { Spinner } from '../spinner';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type SignatureFieldState = 'unsigned' | 'signing' | 'signed';\n\nexport interface SignatureFieldProps extends Omit<\n ComponentPropsWithoutRef<'button'>,\n 'onClick' | 'children' | 'aria-label' | 'disabled'\n> {\n /** Lifecycle state. Drives both the visual treatment and the accessible name. */\n state?: SignatureFieldState;\n /**\n * Percent offset of the field's logical start edge within the overlay box.\n * Applied as a runtime-computed `inset-inline-start: {n}%`.\n */\n insetInlineStart?: number;\n /** Percent offset of the field's logical top edge. `inset-block-start: {n}%`. */\n insetBlockStart?: number;\n /** Percent of the overlay's logical inline size — the field width. */\n inlineSize?: number;\n /** Percent of the overlay's logical block size — the field height. */\n blockSize?: number;\n /** Called when an unsigned (or signed) field is activated by click / keyboard. */\n onActivate?: () => void;\n /** Captured signature image (PNG data URL or URL) shown when `state=\"signed\"`. */\n signedImageSrc?: string;\n /**\n * Caption shown in the unsigned prompt and used as the accessible name\n * (e.g. \"Sign here\", \"Date\", \"Initial here\"). Falls back to the\n * translated default prompt.\n */\n label?: string;\n /**\n * Visually hide the caption, leaving only a state glyph (the Signature\n * squiggle unsigned / check signed / spinner signing) — for small or\n * densely placed fields where a long label would overflow the box. The\n * `label` still forms the accessible name.\n */\n hideLabel?: boolean;\n /** Hard-disable the field (non-activatable, dimmed). Distinct from `state=\"signing\"`. */\n disabled?: boolean;\n /**\n * Marks the field as the one currently targeted by field-to-field navigation\n * (Next / Previous signature). Renders a **persistent** selection ring — not\n * the transient `:focus-visible` ring — so the signer can see which field\n * they're on as they step through, even after focus moves or is programmatic.\n */\n active?: boolean;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst signatureFieldVariants = cva(\n [\n // Overlay fields are always absolutely positioned within the\n // renderPageOverlay box; the percent geometry rides the inline style.\n 'ds:absolute',\n 'ds:inline-flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n // The visible box renders at its true percentage geometry. A min-size\n // floor here overstretched short fields past their authored box, so\n // neighbours collided (signed box overlapping the next field). The 44/48px\n // touch target is instead restored via a transparent ::before hit-area\n // expansion — the same pattern Button's `sm` size uses — applied on touch\n // viewports only; on desktop the precise box is the target.\n 'ds:before:absolute ds:before:content-[\"\"]',\n 'ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)]',\n 'ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)]',\n 'ds:sm:before:hidden',\n // Inline padding lives on the per-state variants below (not the base) so\n // the signed state's tighter padding can't collide with a base ps/pe on\n // the same logical side under Tailwind's JIT ordering.\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-medium',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:aria-disabled:cursor-not-allowed',\n ].join(' '),\n {\n variants: {\n state: {\n unsigned: [\n 'ds:cursor-pointer',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:border ds:border-dashed ds:border-[color:var(--ring)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_8%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:hover:bg-[color-mix(in_srgb,var(--info)_16%,transparent)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n signing: [\n 'ds:cursor-progress',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:border ds:border-dashed ds:border-[color:var(--border)]',\n 'ds:bg-[var(--muted)]',\n 'ds:text-[var(--muted-foreground)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n signed: [\n // overflow-hidden is NOT on the button root — it would clip the\n // ::before touch-target expansion. It lives on the inner image\n // wrapper instead (see render).\n 'ds:cursor-pointer',\n 'ds:p-[var(--spacing-xs)]',\n 'ds:border ds:border-solid ds:border-[color:var(--success)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_8%,transparent)]',\n 'ds:text-[var(--foreground)]',\n 'ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n },\n // Persistent selection ring for the nav-targeted field. Uses the same\n // tokens as the focus ring but is NOT gated on :focus-visible, so it\n // stays visible as the signer steps between fields. When the field is\n // also focused, the base focus-visible ring composes over it (same\n // outline property, same value) — no visual clash.\n active: {\n true: [\n 'ds:outline-solid',\n 'ds:outline-[length:var(--focus-ring-width)]',\n 'ds:outline-[var(--ring)]',\n 'ds:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:outline-[Highlight]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: { state: 'unsigned', active: false },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* SignatureField */\n/* ------------------------------------------------------------------ */\n\nexport const SignatureField = forwardRef<\n HTMLButtonElement,\n SignatureFieldProps\n>(\n (\n {\n state = 'unsigned',\n insetInlineStart,\n insetBlockStart,\n inlineSize,\n blockSize,\n onActivate,\n signedImageSrc,\n label,\n hideLabel = false,\n disabled = false,\n active = false,\n id,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n\n const inactive = disabled || state === 'signing';\n\n // Runtime-computed overlay geometry — consumer percent coordinates over\n // the PDF page. Inline style is the sanctioned exception here\n // (23-constraints §Runtime-computed dimensions); logical properties keep\n // the field mirrored over RTL documents.\n const geometry: CSSProperties = {};\n if (insetInlineStart !== undefined) {\n geometry.insetInlineStart = `${insetInlineStart}%`;\n }\n if (insetBlockStart !== undefined) {\n geometry.insetBlockStart = `${insetBlockStart}%`;\n }\n if (inlineSize !== undefined) {\n geometry.inlineSize = `${inlineSize}%`;\n }\n if (blockSize !== undefined) {\n geometry.blockSize = `${blockSize}%`;\n }\n\n // `prompt` is the visible caption fallback; `unsigned` is the\n // accessible-name fallback — intentionally distinct strings.\n const promptText = label ?? t('signatureField.prompt');\n // The signed/signing names compose the field's `label` with the status so\n // several signed fields on one page stay individually identifiable (signed\n // fields remain activatable for re-signing); falls back to the bare status\n // when no label is supplied.\n const accessibleName =\n state === 'signing'\n ? label\n ? t('signatureField.signingNamed', { label })\n : t('signatureField.signing')\n : state === 'signed'\n ? label\n ? t('signatureField.signedNamed', { label })\n : t('signatureField.signed')\n : (label ?? t('signatureField.unsigned'));\n\n function handleClick(event: ReactMouseEvent<HTMLButtonElement>): void {\n if (inactive) {\n event.preventDefault();\n return;\n }\n onActivate?.();\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n {...rest}\n data-component=\"signature-field\"\n data-component-id={id}\n data-state={state}\n data-active={active || undefined}\n aria-label={accessibleName}\n aria-disabled={inactive || undefined}\n aria-busy={state === 'signing' || undefined}\n onClick={handleClick}\n className={[signatureFieldVariants({ state, active }), className]\n .filter(Boolean)\n .join(' ')}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed overlay geometry: consumer percent coordinates over the PDF page (23-constraints §Runtime-computed dimensions)\n style={geometry}\n >\n {state === 'signing' ? (\n // Decorative: the button's aria-label + aria-busy are the single\n // source of the status announcement, so the Spinner's own\n // role=\"status\" live region is hidden from assistive tech.\n <span aria-hidden=\"true\">\n <Spinner\n variant=\"pulse\"\n size=\"sm\"\n label={t('signatureField.signing')}\n />\n </span>\n ) : state === 'signed' ? (\n signedImageSrc ? (\n // overflow-hidden + rounding live on this inner wrapper (not the\n // button root) so the signature is clipped to the box WITHOUT\n // clipping the button's ::before touch-target expansion.\n <span className=\"ds:inline-size-full ds:block-size-full ds:overflow-hidden ds:rounded-[var(--radius-sm)]\">\n <img\n src={signedImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"ds:block-size-full ds:inline-size-full ds:object-contain\"\n />\n </span>\n ) : (\n <>\n <Check\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4 ds:text-[var(--success)]\"\n />\n {hideLabel ? null : <span>{t('signatureField.signed')}</span>}\n </>\n )\n ) : hideLabel ? (\n // Glyph-only unsigned prompt — the Signature squiggle reads as\n // \"sign here\" on its own, where the pen + caption would overflow.\n <Signature aria-hidden=\"true\" className=\"ds:size-5\" />\n ) : (\n <>\n <PenLine\n aria-hidden=\"true\"\n className=\"ds:block-size-4 ds:inline-size-4\"\n />\n <span>{promptText}</span>\n </>\n )}\n </button>\n );\n },\n);\n\nSignatureField.displayName = 'SignatureField';\n\nexport { signatureFieldVariants };\n"],"names":["__iconNode","Signature","createLucideIcon","signatureFieldVariants","cva","SignatureField","forwardRef","state","insetInlineStart","insetBlockStart","inlineSize","blockSize","onActivate","signedImageSrc","label","hideLabel","disabled","active","id","className","rest","ref","t","useTranslation","inactive","geometry","promptText","accessibleName","handleClick","event","jsx","Spinner","jsxs","Fragment","Check","PenLine"],"mappings":"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","x_google_ignoreList":[0]}
@@ -2,9 +2,9 @@ import { jsx as i, jsxs as C } from "react/jsx-runtime";
2
2
  import { forwardRef as pe, useId as he, useState as ve, useCallback as S } from "react";
3
3
  import { c as b } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as be } from "react-i18next";
5
- import { B as Y } from "./button-DD_0Xdmr.js";
6
- import { I as A } from "./icon-button-LqoiKcUN.js";
7
- import { E as xe } from "./empty-state-BLy7tigq.js";
5
+ import { B as Y } from "./button-CPGiR_bH.js";
6
+ import { I as A } from "./icon-button-C_kbcd7I.js";
7
+ import { E as xe } from "./empty-state-CrLsi0XI.js";
8
8
  import { S as B } from "./skeleton-CZbwyJAA.js";
9
9
  import { t as W, c as De, m as K, a as Z, i as ye } from "./isSameDay-DUEiAT0G.js";
10
10
  function Ne(t, e) {
@@ -499,4 +499,4 @@ export {
499
499
  rt as i,
500
500
  Ne as p
501
501
  };
502
- //# sourceMappingURL=slot-grid-FsqumOaS.js.map
502
+ //# sourceMappingURL=slot-grid-CQSULZjd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slot-grid-FsqumOaS.js","sources":["../../node_modules/date-fns/parseISO.js","../../src/components/slot-grid/slot-grid.tsx"],"sourcesContent":["import {\n millisecondsInHour,\n millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const invalidDate = () => constructFrom(options?.in, NaN);\n\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(+date)) return invalidDate();\n\n const timestamp = +date;\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) return invalidDate();\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) return invalidDate();\n } else {\n const tmpDate = new Date(timestamp + time);\n const result = toDate(0, options?.in);\n result.setFullYear(\n tmpDate.getUTCFullYear(),\n tmpDate.getUTCMonth(),\n tmpDate.getUTCDate(),\n );\n result.setHours(\n tmpDate.getUTCHours(),\n tmpDate.getUTCMinutes(),\n tmpDate.getUTCSeconds(),\n tmpDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","/* ------------------------------------------------------------------ */\n/* SlotGrid — multi-day time-slot picker for patient booking. */\n/* */\n/* Renders N day columns side-by-side. Each column shows a day header */\n/* (formatted via `Intl.DateTimeFormat(locale)`) plus a vertical list */\n/* of slot buttons. Long days collapse to `maxInitialSlotsPerDay` and */\n/* reveal the rest via a \"Show more\" button (progressive disclosure). */\n/* */\n/* Navigation arrows (`onPreviousDays` / `onNextDays`) let the consumer */\n/* page the window of days; the optional \"Next available\" CTA jumps to */\n/* the first day with an open slot. */\n/* */\n/* Purely presentational — no business logic, no data fetching. Date */\n/* comparisons use `date-fns` (never moment.js) and the rendered labels */\n/* come exclusively from `Intl.DateTimeFormat` or the `ui.slotGrid` */\n/* namespace via `useTranslation()`. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useId,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { isSameDay, parseISO } from 'date-fns';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { Skeleton } from '../skeleton/skeleton';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type SlotGridState = 'default' | 'loading' | 'disabled' | 'empty';\n\nexport type SlotGridSize = 'sm' | 'md' | 'lg';\n\nexport interface SlotGridSlot {\n /** Stable identity — used by consumers to resolve selection. */\n id: string;\n /** Slot start — ISO string or `Date`. Rendered via `Intl.DateTimeFormat`. */\n start: string | Date;\n /** Optional slot end — if omitted only the start time is announced. */\n end?: string | Date;\n /** Defaults to `true`. Unavailable slots render disabled and are not focusable. */\n available?: boolean;\n /** Override the default `Intl`-formatted time label. */\n label?: string;\n /** Override the accessible name of the slot button. */\n ariaLabel?: string;\n}\n\nexport interface SlotGridDay {\n /** The calendar day the column represents. */\n date: string | Date;\n /** Slots for this day, in chronological order. Empty array ⇒ empty day. */\n slots: SlotGridSlot[];\n /** Override the default `Intl`-formatted day header. */\n label?: string;\n}\n\nexport interface SlotGridProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'aria-label' | 'onSelect'>,\n VariantProps<typeof slotGridVariants> {\n /** Days to render, one column per entry. */\n days: SlotGridDay[];\n /** Visual / interactive state. Defaults to `'default'`. */\n state?: SlotGridState;\n /** Density of the slot buttons and day headers. Defaults to `'md'`. */\n size?: SlotGridSize;\n /** Id of the currently selected slot (controlled). */\n selectedSlotId?: string;\n /**\n * Initial number of slots to render per day before the \"Show more\"\n * progressive-disclosure control collapses the rest. Defaults to `6`.\n */\n maxInitialSlotsPerDay?: number;\n /**\n * BCP-47 locale tag for `Intl.DateTimeFormat`. Defaults to the active\n * i18next language.\n */\n locale?: string;\n /** IANA time zone for `Intl.DateTimeFormat`. Optional. */\n timeZone?: string;\n /** Whether the \"previous days\" navigation arrow should be enabled. */\n hasPrevious?: boolean;\n /** Whether the \"next days\" navigation arrow should be enabled. */\n hasNext?: boolean;\n /**\n * When `true`, renders the \"Next available\" CTA at the end of the\n * toolbar. Only emits a callback — the consumer owns the navigation.\n */\n showNextAvailable?: boolean;\n /** Accessible label for the outer grid region. */\n ariaLabel?: string;\n /** Fires when the user selects an available slot. */\n onSlotSelect?: (slot: SlotGridSlot, day: SlotGridDay) => void;\n /** Fires when the user clicks the \"previous days\" arrow. */\n onPreviousDays?: () => void;\n /** Fires when the user clicks the \"next days\" arrow. */\n onNextDays?: () => void;\n /** Fires when the user clicks a day's \"Show more\" button. */\n onShowMore?: (day: SlotGridDay) => void;\n /** Fires when the user clicks the \"Next available\" CTA. */\n onJumpToNextAvailable?: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst slotGridVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:text-[var(--foreground)]',\n 'ds:w-full',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst toolbarVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:w-full',\n);\n\n/**\n * Column-count is dynamic (1–12), so it is declared as a full CVA variant —\n * this keeps every `grid-cols-N` string statically visible to Tailwind's\n * JIT and keeps the variant table inside CVA rather than hand-rolled.\n */\nconst COLS_MAX = 12;\n\nconst columnsVariants = cva(\n 'ds:grid ds:gap-[var(--spacing-sm)] ds:w-full ds:auto-rows-min ds:items-start',\n {\n variants: {\n cols: {\n 1: 'ds:grid-cols-1',\n 2: 'ds:grid-cols-2',\n 3: 'ds:grid-cols-3',\n 4: 'ds:grid-cols-4',\n 5: 'ds:grid-cols-5',\n 6: 'ds:grid-cols-6',\n 7: 'ds:grid-cols-7',\n 8: 'ds:grid-cols-8',\n 9: 'ds:grid-cols-9',\n 10: 'ds:grid-cols-10',\n 11: 'ds:grid-cols-11',\n 12: 'ds:grid-cols-12',\n },\n },\n defaultVariants: { cols: 1 },\n },\n);\n\ntype ColumnsCount = NonNullable<VariantProps<typeof columnsVariants>['cols']>;\n\nfunction clampCols(count: number): ColumnsCount {\n return Math.max(1, Math.min(count, COLS_MAX)) as ColumnsCount;\n}\n\nconst columnVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:bg-[var(--card)]',\n 'ds:min-w-0',\n ].join(' '),\n);\n\nconst dayHeaderVariants = cva(\n [\n 'ds:font-[var(--font-weight-semibold)]',\n 'ds:text-[var(--foreground)]',\n 'ds:text-start',\n 'ds:truncate',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-xs)]',\n md: 'ds:text-[length:var(--font-size-sm)]',\n lg: 'ds:text-[length:var(--font-size-base)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst slotListVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full ds:m-0 ds:p-0 ds:list-none',\n);\n\nconst slotButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:w-full',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:bg-[var(--secondary)]',\n 'ds:shadow-[var(--shadow-sm)]',\n 'ds:text-[var(--foreground)]',\n 'ds:transition-[background-color,color,box-shadow]',\n 'ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[var(--focus-ring-offset)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:shadow-none',\n 'ds:aria-disabled:opacity-50 ds:aria-disabled:cursor-not-allowed ds:aria-disabled:shadow-none',\n 'ds:hover:enabled:shadow-[var(--shadow-md)]',\n 'ds:aria-pressed:bg-[var(--primary)] ds:aria-pressed:text-[var(--primary-foreground)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-xs)] ds:h-8',\n md: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:h-10',\n lg: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-base)] ds:h-12',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction toDate(value: string | Date): Date {\n return value instanceof Date ? value : parseISO(value);\n}\n\n/** Is `a` the same calendar day as `b`? Uses `date-fns`, locale-agnostic. */\nexport function isSameDate(a: string | Date, b: string | Date): boolean {\n return isSameDay(toDate(a), toDate(b));\n}\n\n/** Find the first day in a list that has at least one available slot. */\nexport function findFirstAvailable(\n days: SlotGridDay[],\n): { day: SlotGridDay; slot: SlotGridSlot } | undefined {\n for (const day of days) {\n const slot = day.slots.find((s) => s.available !== false);\n if (slot) return { day, slot };\n }\n return undefined;\n}\n\nfunction formatDayHeader(\n date: Date,\n locale: string,\n timeZone?: string,\n): string {\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n timeZone,\n }).format(date);\n } catch {\n return new Intl.DateTimeFormat('en', {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n }).format(date);\n }\n}\n\nfunction formatSlotTime(\n slot: SlotGridSlot,\n locale: string,\n timeZone?: string,\n): string {\n if (slot.label !== undefined) return slot.label;\n const start = toDate(slot.start);\n try {\n const fmt = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n minute: '2-digit',\n timeZone,\n });\n if (slot.end) {\n const end = toDate(slot.end);\n if (typeof fmt.formatRange === 'function') {\n try {\n return fmt.formatRange(start, end);\n } catch {\n /* fall through */\n }\n }\n return `${fmt.format(start)} – ${fmt.format(end)}`;\n }\n return fmt.format(start);\n } catch {\n return start.toISOString();\n }\n}\n\nfunction formatSlotAriaLabel(\n slot: SlotGridSlot,\n day: SlotGridDay,\n locale: string,\n timeZone: string | undefined,\n template: (opts: { time: string; day: string }) => string,\n): string {\n if (slot.ariaLabel !== undefined) return slot.ariaLabel;\n const time = formatSlotTime(slot, locale, timeZone);\n const dayLabel =\n day.label !== undefined\n ? day.label\n : formatDayHeader(toDate(day.date), locale, timeZone);\n return template({ time, day: dayLabel });\n}\n\n/* ------------------------------------------------------------------ */\n/* Glyphs — logical-direction arrows */\n/* ------------------------------------------------------------------ */\n\nfunction ChevronStartIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ds:size-4\"\n >\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction ChevronEndIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ds:size-4\"\n >\n <path d=\"M9 6l6 6-6 6\" />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const SlotGrid = forwardRef<HTMLDivElement, SlotGridProps>(\n (\n {\n days,\n state = 'default',\n size = 'md',\n selectedSlotId,\n maxInitialSlotsPerDay = 6,\n locale: localeProp,\n timeZone,\n hasPrevious = false,\n hasNext = false,\n showNextAvailable = false,\n ariaLabel,\n onSlotSelect,\n onPreviousDays,\n onNextDays,\n onShowMore,\n onJumpToNextAvailable,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const locale = localeProp ?? i18n.language ?? 'en';\n const idBase = useId();\n\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const isLoading = state === 'loading';\n const isDisabled = state === 'disabled';\n const isInteractionSuppressed = isLoading || isDisabled;\n const isEmpty =\n state === 'empty' ||\n days.length === 0 ||\n days.every((day) => day.slots.length === 0);\n\n const resolvedAriaLabel = ariaLabel ?? t('slotGrid.ariaLabel');\n\n const handleSlotClick = useCallback(\n (slot: SlotGridSlot, day: SlotGridDay) => {\n if (isInteractionSuppressed) return;\n if (slot.available === false) return;\n onSlotSelect?.(slot, day);\n },\n [isInteractionSuppressed, onSlotSelect],\n );\n\n const handleShowMore = useCallback(\n (day: SlotGridDay, key: string) => {\n setExpanded((prev) => ({ ...prev, [key]: true }));\n onShowMore?.(day);\n },\n [onShowMore],\n );\n\n const handleSlotKeyDown = useCallback(\n (\n event: KeyboardEvent<HTMLButtonElement>,\n slot: SlotGridSlot,\n day: SlotGridDay,\n ) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleSlotClick(slot, day);\n }\n },\n [handleSlotClick],\n );\n\n const columnCount = clampCols(days.length || 1);\n const columnsClass = columnsVariants({ cols: columnCount });\n\n /* ---- Rendered content ------------------------------------------ */\n\n let body: ReactNode;\n if (isLoading) {\n body = (\n <div\n className={columnsClass}\n data-state=\"loading\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('common.loading')}\n >\n {Array.from({ length: columnCount }, (_, colIdx) => (\n <div key={`loading-col-${colIdx}`} className={columnVariants()}>\n <Skeleton variant=\"text\" size={size} width=\"60%\" />\n <div className={slotListVariants()}>\n {Array.from(\n { length: Math.min(maxInitialSlotsPerDay, 4) },\n (_, rowIdx) => (\n <Skeleton\n key={`loading-slot-${colIdx}-${rowIdx}`}\n variant=\"rounded\"\n size={size}\n height=\"40px\"\n />\n ),\n )}\n </div>\n </div>\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div data-state=\"empty\">\n <EmptyState variant=\"no-results\" title={t('slotGrid.noSlots')} />\n </div>\n );\n } else {\n body = (\n <div\n className={columnsClass}\n data-state={isDisabled ? 'disabled' : 'default'}\n >\n {days.map((day, dayIdx) => {\n const dayKey = `${toDate(day.date).toISOString()}-${dayIdx}`;\n const headerLabel =\n day.label ?? formatDayHeader(toDate(day.date), locale, timeZone);\n const headerId = `${idBase}-day-${dayIdx}-header`;\n const isExpanded = expanded[dayKey] ?? false;\n const visibleSlots = isExpanded\n ? day.slots\n : day.slots.slice(0, maxInitialSlotsPerDay);\n const hiddenCount = day.slots.length - visibleSlots.length;\n\n const isDayEmpty = day.slots.length === 0;\n\n return (\n // Use a plain <div role=\"group\"> rather than <section> — a\n // <section> with aria-labelledby is a landmark, and nesting many\n // landmarks inside the outer slot-grid landmark fails axe's\n // landmark-unique rule.\n <div\n key={dayKey}\n role=\"group\"\n className={columnVariants()}\n aria-labelledby={headerId}\n data-empty={isDayEmpty || undefined}\n >\n <h3 id={headerId} className={dayHeaderVariants({ size })}>\n {headerLabel}\n </h3>\n {isDayEmpty ? (\n <p className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:m-0\">\n {t('slotGrid.noSlots')}\n </p>\n ) : null}\n <ul className={slotListVariants()}>\n {visibleSlots.map((slot) => {\n const ariaLabelSlot = formatSlotAriaLabel(\n slot,\n day,\n locale,\n timeZone,\n ({ time, day: dayLabel }) =>\n t('slotGrid.slotLabel', { time, day: dayLabel }),\n );\n const isSelected = selectedSlotId === slot.id;\n const isSlotDisabled =\n slot.available === false || isInteractionSuppressed;\n return (\n <li key={slot.id}>\n <button\n type=\"button\"\n className={slotButtonVariants({ size })}\n aria-label={ariaLabelSlot}\n aria-pressed={isSelected}\n disabled={isSlotDisabled}\n aria-disabled={isSlotDisabled || undefined}\n data-slot-id={slot.id}\n onClick={() => handleSlotClick(slot, day)}\n onKeyDown={(event) =>\n handleSlotKeyDown(event, slot, day)\n }\n >\n {formatSlotTime(slot, locale, timeZone)}\n </button>\n </li>\n );\n })}\n </ul>\n {hiddenCount > 0 ? (\n <Button\n intent=\"ghost\"\n size={size === 'lg' ? 'md' : 'sm'}\n onClick={() => handleShowMore(day, dayKey)}\n disabled={isInteractionSuppressed}\n >\n {t('slotGrid.showMore', { count: hiddenCount })}\n </Button>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n className={slotGridVariants({ size, className })}\n data-component=\"slot-grid\"\n data-state={state}\n {...rest}\n >\n <div className={toolbarVariants()}>\n <IconButton\n icon={<ChevronStartIcon />}\n aria-label={t('slotGrid.previousDays')}\n size={size === 'lg' ? 'md' : 'sm'}\n intent=\"ghost\"\n flipIconInRtl\n disabled={!hasPrevious || isInteractionSuppressed}\n onClick={onPreviousDays}\n />\n {showNextAvailable ? (\n <Button\n intent=\"secondary\"\n size={size === 'lg' ? 'md' : 'sm'}\n disabled={isInteractionSuppressed}\n onClick={onJumpToNextAvailable}\n >\n {t('slotGrid.nextAvailable')}\n </Button>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n <IconButton\n icon={<ChevronEndIcon />}\n aria-label={t('slotGrid.nextDays')}\n size={size === 'lg' ? 'md' : 'sm'}\n intent=\"ghost\"\n flipIconInRtl\n disabled={!hasNext || isInteractionSuppressed}\n onClick={onNextDays}\n />\n </div>\n\n {body}\n </div>\n );\n },\n);\n\nSlotGrid.displayName = 'SlotGrid';\n"],"names":["parseISO","argument","options","invalidDate","constructFrom","dateStrings","splitDateString","date","parseYearResult","parseYear","parseDate","timestamp","time","offset","parseTime","parseTimezone","tmpDate","result","toDate","patterns","dateRegex","timeRegex","timezoneRegex","dateString","array","timeString","token","additionalDigits","regex","captures","year","century","isWeekDate","dayOfYear","parseDateUnit","month","day","week","dayOfWeek","validateWeekDate","dayOfISOWeekYear","validateDate","validateDayOfYearDate","value","hours","parseTimeUnit","minutes","seconds","validateTime","millisecondsInHour","millisecondsInMinute","timezoneString","sign","validateTimezone","isoWeekYear","fourthOfJanuaryDay","diff","daysInMonths","isLeapYearIndex","_year","_hours","slotGridVariants","cva","toolbarVariants","COLS_MAX","columnsVariants","clampCols","count","columnVariants","dayHeaderVariants","slotListVariants","slotButtonVariants","isSameDate","a","b","isSameDay","findFirstAvailable","days","slot","s","formatDayHeader","locale","timeZone","formatSlotTime","start","fmt","end","formatSlotAriaLabel","template","dayLabel","ChevronStartIcon","jsx","ChevronEndIcon","SlotGrid","forwardRef","state","size","selectedSlotId","maxInitialSlotsPerDay","localeProp","hasPrevious","hasNext","showNextAvailable","ariaLabel","onSlotSelect","onPreviousDays","onNextDays","onShowMore","onJumpToNextAvailable","className","rest","ref","t","i18n","useTranslation","idBase","useId","expanded","setExpanded","useState","isLoading","isDisabled","isInteractionSuppressed","isEmpty","resolvedAriaLabel","handleSlotClick","useCallback","handleShowMore","key","prev","handleSlotKeyDown","event","columnCount","columnsClass","body","_","colIdx","jsxs","Skeleton","rowIdx","EmptyState","dayIdx","dayKey","headerLabel","headerId","visibleSlots","hiddenCount","isDayEmpty","ariaLabelSlot","isSelected","isSlotDisabled","Button","IconButton"],"mappings":";;;;;;;;;AA4CO,SAASA,GAASC,GAAUC,GAAS;AAC1C,QAAMC,IAAc,MAAMC,GAAcF,KAAA,gBAAAA,EAAS,IAAI,GAAG,GAGlDG,IAAcC,GAAgBL,CAAQ;AAE5C,MAAIM;AACJ,MAAIF,EAAY,MAAM;AACpB,UAAMG,IAAkBC,GAAUJ,EAAY,MAAM,CAAgB;AACpE,IAAAE,IAAOG,GAAUF,EAAgB,gBAAgBA,EAAgB,IAAI;AAAA,EACvE;AAEA,MAAI,CAACD,KAAQ,MAAM,CAACA,CAAI,EAAG,QAAOJ,EAAW;AAE7C,QAAMQ,IAAY,CAACJ;AACnB,MAAIK,IAAO,GACPC;AAEJ,MAAIR,EAAY,SACdO,IAAOE,GAAUT,EAAY,IAAI,GAC7B,MAAMO,CAAI;AAAG,WAAOT,EAAW;AAGrC,MAAIE,EAAY;AAEd,QADAQ,IAASE,GAAcV,EAAY,QAAQ,GACvC,MAAMQ,CAAM,EAAG,QAAOV,EAAW;AAAA,SAChC;AACL,UAAMa,IAAU,IAAI,KAAKL,IAAYC,CAAI,GACnCK,IAASC,EAAO,GAAGhB,KAAA,gBAAAA,EAAS,EAAE;AACpC,WAAAe,EAAO;AAAA,MACLD,EAAQ,eAAc;AAAA,MACtBA,EAAQ,YAAW;AAAA,MACnBA,EAAQ,WAAU;AAAA,IACxB,GACIC,EAAO;AAAA,MACLD,EAAQ,YAAW;AAAA,MACnBA,EAAQ,cAAa;AAAA,MACrBA,EAAQ,cAAa;AAAA,MACrBA,EAAQ,mBAAkB;AAAA,IAChC,GACWC;AAAA,EACT;AAEA,SAAOC,EAAOP,IAAYC,IAAOC,GAAQX,KAAA,gBAAAA,EAAS,EAAE;AACtD;AAEA,MAAMiB,IAAW;AAAA,EACf,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,UAAU;AACZ,GAEMC,KACJ,iEACIC,KACJ,6EACIC,KAAgB;AAEtB,SAAShB,GAAgBiB,GAAY;AACnC,QAAMlB,IAAc,CAAA,GACdmB,IAAQD,EAAW,MAAMJ,EAAS,iBAAiB;AACzD,MAAIM;AAIJ,MAAID,EAAM,SAAS;AACjB,WAAOnB;AAiBT,MAdI,IAAI,KAAKmB,EAAM,CAAC,CAAC,IACnBC,IAAaD,EAAM,CAAC,KAEpBnB,EAAY,OAAOmB,EAAM,CAAC,GAC1BC,IAAaD,EAAM,CAAC,GAChBL,EAAS,kBAAkB,KAAKd,EAAY,IAAI,MAClDA,EAAY,OAAOkB,EAAW,MAAMJ,EAAS,iBAAiB,EAAE,CAAC,GACjEM,IAAaF,EAAW;AAAA,IACtBlB,EAAY,KAAK;AAAA,IACjBkB,EAAW;AAAA,EACnB,KAIME,GAAY;AACd,UAAMC,IAAQP,EAAS,SAAS,KAAKM,CAAU;AAC/C,IAAIC,KACFrB,EAAY,OAAOoB,EAAW,QAAQC,EAAM,CAAC,GAAG,EAAE,GAClDrB,EAAY,WAAWqB,EAAM,CAAC,KAE9BrB,EAAY,OAAOoB;AAAA,EAEvB;AAEA,SAAOpB;AACT;AAEA,SAASI,GAAUc,GAAYI,GAAkB;AAC/C,QAAMC,IAAQ,IAAI;AAAA,IAChB,0BACG,IAAID,KACL,yBACC,IAAIA,KACL;AAAA,EACN,GAEQE,IAAWN,EAAW,MAAMK,CAAK;AAEvC,MAAI,CAACC,EAAU,QAAO,EAAE,MAAM,KAAK,gBAAgB,GAAE;AAErD,QAAMC,IAAOD,EAAS,CAAC,IAAI,SAASA,EAAS,CAAC,CAAC,IAAI,MAC7CE,IAAUF,EAAS,CAAC,IAAI,SAASA,EAAS,CAAC,CAAC,IAAI;AAGtD,SAAO;AAAA,IACL,MAAME,MAAY,OAAOD,IAAOC,IAAU;AAAA,IAC1C,gBAAgBR,EAAW,OAAOM,EAAS,CAAC,KAAKA,EAAS,CAAC,GAAG,MAAM;AAAA,EACxE;AACA;AAEA,SAASnB,GAAUa,GAAYO,GAAM;AAEnC,MAAIA,MAAS,KAAM,QAAO,oBAAI,KAAK,GAAG;AAEtC,QAAMD,IAAWN,EAAW,MAAMH,EAAS;AAE3C,MAAI,CAACS,EAAU,QAAO,oBAAI,KAAK,GAAG;AAElC,QAAMG,IAAa,CAAC,CAACH,EAAS,CAAC,GACzBI,IAAYC,EAAcL,EAAS,CAAC,CAAC,GACrCM,IAAQD,EAAcL,EAAS,CAAC,CAAC,IAAI,GACrCO,IAAMF,EAAcL,EAAS,CAAC,CAAC,GAC/BQ,IAAOH,EAAcL,EAAS,CAAC,CAAC,GAChCS,IAAYJ,EAAcL,EAAS,CAAC,CAAC,IAAI;AAE/C,MAAIG;AACF,WAAKO,GAAiBT,GAAMO,GAAMC,CAAS,IAGpCE,GAAiBV,GAAMO,GAAMC,CAAS,IAFpC,oBAAI,KAAK,GAAG;AAGhB;AACL,UAAM/B,IAAO,oBAAI,KAAK,CAAC;AACvB,WACE,CAACkC,GAAaX,GAAMK,GAAOC,CAAG,KAC9B,CAACM,GAAsBZ,GAAMG,CAAS,IAE/B,oBAAI,KAAK,GAAG,KAErB1B,EAAK,eAAeuB,GAAMK,GAAO,KAAK,IAAIF,GAAWG,CAAG,CAAC,GAClD7B;AAAA,EACT;AACF;AAEA,SAAS2B,EAAcS,GAAO;AAC5B,SAAOA,IAAQ,SAASA,CAAK,IAAI;AACnC;AAEA,SAAS7B,GAAUW,GAAY;AAC7B,QAAMI,IAAWJ,EAAW,MAAMJ,EAAS;AAC3C,MAAI,CAACQ,EAAU,QAAO;AAEtB,QAAMe,IAAQC,EAAchB,EAAS,CAAC,CAAC,GACjCiB,IAAUD,EAAchB,EAAS,CAAC,CAAC,GACnCkB,IAAUF,EAAchB,EAAS,CAAC,CAAC;AAEzC,SAAKmB,GAAaJ,GAAOE,GAASC,CAAO,IAKvCH,IAAQK,IAAqBH,IAAUI,IAAuBH,IAAU,MAJjE;AAMX;AAEA,SAASF,EAAcF,GAAO;AAC5B,SAAQA,KAAS,WAAWA,EAAM,QAAQ,KAAK,GAAG,CAAC,KAAM;AAC3D;AAEA,SAAS5B,GAAcoC,GAAgB;AACrC,MAAIA,MAAmB,IAAK,QAAO;AAEnC,QAAMtB,IAAWsB,EAAe,MAAM7B,EAAa;AACnD,MAAI,CAACO,EAAU,QAAO;AAEtB,QAAMuB,IAAOvB,EAAS,CAAC,MAAM,MAAM,KAAK,GAClCe,IAAQ,SAASf,EAAS,CAAC,CAAC,GAC5BiB,IAAWjB,EAAS,CAAC,KAAK,SAASA,EAAS,CAAC,CAAC,KAAM;AAE1D,SAAKwB,GAAiBT,GAAOE,CAAO,IAI7BM,KAAQR,IAAQK,IAAqBH,IAAUI,KAH7C;AAIX;AAEA,SAASV,GAAiBc,GAAajB,GAAMD,GAAK;AAChD,QAAM7B,IAAO,oBAAI,KAAK,CAAC;AACvB,EAAAA,EAAK,eAAe+C,GAAa,GAAG,CAAC;AACrC,QAAMC,IAAqBhD,EAAK,UAAS,KAAM,GACzCiD,KAAQnB,IAAO,KAAK,IAAID,IAAM,IAAImB;AACxC,SAAAhD,EAAK,WAAWA,EAAK,WAAU,IAAKiD,CAAI,GACjCjD;AACT;AAKA,MAAMkD,KAAe,CAAC,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAEtE,SAASC,EAAgB5B,GAAM;AAC7B,SAAOA,IAAO,QAAQ,KAAMA,IAAO,MAAM,KAAKA,IAAO,QAAQ;AAC/D;AAEA,SAASW,GAAaX,GAAMK,GAAO5B,GAAM;AACvC,SACE4B,KAAS,KACTA,KAAS,MACT5B,KAAQ,KACRA,MAASkD,GAAatB,CAAK,MAAMuB,EAAgB5B,CAAI,IAAI,KAAK;AAElE;AAEA,SAASY,GAAsBZ,GAAMG,GAAW;AAC9C,SAAOA,KAAa,KAAKA,MAAcyB,EAAgB5B,CAAI,IAAI,MAAM;AACvE;AAEA,SAASS,GAAiBoB,GAAOtB,GAAMD,GAAK;AAC1C,SAAOC,KAAQ,KAAKA,KAAQ,MAAMD,KAAO,KAAKA,KAAO;AACvD;AAEA,SAASY,GAAaJ,GAAOE,GAASC,GAAS;AAC7C,SAAIH,MAAU,KACLE,MAAY,KAAKC,MAAY,IAIpCA,KAAW,KACXA,IAAU,MACVD,KAAW,KACXA,IAAU,MACVF,KAAS,KACTA,IAAQ;AAEZ;AAEA,SAASS,GAAiBO,GAAQd,GAAS;AACzC,SAAOA,KAAW,KAAKA,KAAW;AACpC;AC5KA,MAAMe,KAAmBC;AAAA,EACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,MAAM,KAAA;AAAA,EAAK;AAElC,GAEMC,KAAkBD;AAAA,EACtB;AACF,GAOME,KAAW,IAEXC,KAAkBH;AAAA,EACtB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,MAAM,EAAA;AAAA,EAAE;AAE/B;AAIA,SAASI,GAAUC,GAA6B;AAC9C,SAAO,KAAK,IAAI,GAAG,KAAK,IAAIA,GAAOH,EAAQ,CAAC;AAC9C;AAEA,MAAMI,IAAiBN;AAAA,EACrB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMO,KAAoBP;AAAA,EACxB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,MAAM,KAAA;AAAA,EAAK;AAElC,GAEMQ,IAAmBR;AAAA,EACvB;AACF,GAEMS,KAAqBT;AAAA,EACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,MAAM,KAAA;AAAA,EAAK;AAElC;AAMA,SAAS5C,EAAOyB,GAA4B;AAC1C,SAAOA,aAAiB,OAAOA,IAAQ3C,GAAS2C,CAAK;AACvD;AAGO,SAAS6B,GAAWC,GAAkBC,GAA2B;AACtE,SAAOC,GAAUzD,EAAOuD,CAAC,GAAGvD,EAAOwD,CAAC,CAAC;AACvC;AAGO,SAASE,GACdC,GACsD;AACtD,aAAWzC,KAAOyC,GAAM;AACtB,UAAMC,IAAO1C,EAAI,MAAM,KAAK,CAAC2C,MAAMA,EAAE,cAAc,EAAK;AACxD,QAAID,EAAM,QAAO,EAAE,KAAA1C,GAAK,MAAA0C,EAAA;AAAA,EAC1B;AAEF;AAEA,SAASE,EACPzE,GACA0E,GACAC,GACQ;AACR,MAAI;AACF,WAAO,IAAI,KAAK,eAAeD,GAAQ;AAAA,MACrC,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA,MACL,UAAAC;AAAA,IAAA,CACD,EAAE,OAAO3E,CAAI;AAAA,EAChB,QAAQ;AACN,WAAO,IAAI,KAAK,eAAe,MAAM;AAAA,MACnC,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA,IAAA,CACN,EAAE,OAAOA,CAAI;AAAA,EAChB;AACF;AAEA,SAAS4E,EACPL,GACAG,GACAC,GACQ;AACR,MAAIJ,EAAK,UAAU,OAAW,QAAOA,EAAK;AAC1C,QAAMM,IAAQlE,EAAO4D,EAAK,KAAK;AAC/B,MAAI;AACF,UAAMO,IAAM,IAAI,KAAK,eAAeJ,GAAQ;AAAA,MAC1C,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAAC;AAAA,IAAA,CACD;AACD,QAAIJ,EAAK,KAAK;AACZ,YAAMQ,IAAMpE,EAAO4D,EAAK,GAAG;AAC3B,UAAI,OAAOO,EAAI,eAAgB;AAC7B,YAAI;AACF,iBAAOA,EAAI,YAAYD,GAAOE,CAAG;AAAA,QACnC,QAAQ;AAAA,QAER;AAEF,aAAO,GAAGD,EAAI,OAAOD,CAAK,CAAC,MAAMC,EAAI,OAAOC,CAAG,CAAC;AAAA,IAClD;AACA,WAAOD,EAAI,OAAOD,CAAK;AAAA,EACzB,QAAQ;AACN,WAAOA,EAAM,YAAA;AAAA,EACf;AACF;AAEA,SAASG,GACPT,GACA1C,GACA6C,GACAC,GACAM,GACQ;AACR,MAAIV,EAAK,cAAc,OAAW,QAAOA,EAAK;AAC9C,QAAMlE,IAAOuE,EAAeL,GAAMG,GAAQC,CAAQ,GAC5CO,IACJrD,EAAI,UAAU,SACVA,EAAI,QACJ4C,EAAgB9D,EAAOkB,EAAI,IAAI,GAAG6C,GAAQC,CAAQ;AACxD,SAAOM,EAAS,EAAE,MAAA5E,GAAM,KAAK6E,GAAU;AACzC;AAMA,SAASC,KAAmB;AAC1B,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,kBAAA,CAAkB;AAAA,IAAA;AAAA,EAAA;AAGhC;AAEA,SAASC,KAAiB;AACxB,SACE,gBAAAD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAU;AAAA,MAEV,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,eAAA,CAAe;AAAA,IAAA;AAAA,EAAA;AAG7B;AAMO,MAAME,KAAWC;AAAA,EACtB,CACE;AAAA,IACE,MAAAjB;AAAA,IACA,OAAAkB,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,gBAAAC;AAAA,IACA,uBAAAC,IAAwB;AAAA,IACxB,QAAQC;AAAA,IACR,UAAAjB;AAAA,IACA,aAAAkB,IAAc;AAAA,IACd,SAAAC,IAAU;AAAA,IACV,mBAAAC,IAAoB;AAAA,IACpB,WAAAC;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,OACG;AACH,UAAM,EAAE,GAAAC,GAAG,MAAAC,GAAA,IAASC,GAAA,GACdjC,IAASkB,KAAcc,GAAK,YAAY,MACxCE,KAASC,GAAA,GAET,CAACC,IAAUC,EAAW,IAAIC,GAAkC,CAAA,CAAE,GAE9DC,IAAYzB,MAAU,WACtB0B,IAAa1B,MAAU,YACvB2B,IAA0BF,KAAaC,GACvCE,KACJ5B,MAAU,WACVlB,EAAK,WAAW,KAChBA,EAAK,MAAM,CAACzC,MAAQA,EAAI,MAAM,WAAW,CAAC,GAEtCwF,KAAoBrB,KAAaS,EAAE,oBAAoB,GAEvDa,IAAkBC;AAAA,MACtB,CAAChD,GAAoB1C,MAAqB;AACxC,QAAIsF,KACA5C,EAAK,cAAc,OACvB0B,KAAA,QAAAA,EAAe1B,GAAM1C;AAAA,MACvB;AAAA,MACA,CAACsF,GAAyBlB,CAAY;AAAA,IAAA,GAGlCuB,KAAiBD;AAAA,MACrB,CAAC1F,GAAkB4F,MAAgB;AACjC,QAAAV,GAAY,CAACW,OAAU,EAAE,GAAGA,GAAM,CAACD,CAAG,GAAG,GAAA,EAAO,GAChDrB,KAAA,QAAAA,EAAavE;AAAA,MACf;AAAA,MACA,CAACuE,CAAU;AAAA,IAAA,GAGPuB,KAAoBJ;AAAA,MACxB,CACEK,GACArD,GACA1C,MACG;AACH,SAAI+F,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACzCA,EAAM,eAAA,GACNN,EAAgB/C,GAAM1C,CAAG;AAAA,MAE7B;AAAA,MACA,CAACyF,CAAe;AAAA,IAAA,GAGZO,IAAclE,GAAUW,EAAK,UAAU,CAAC,GACxCwD,IAAepE,GAAgB,EAAE,MAAMmE,GAAa;AAI1D,QAAIE;AACJ,WAAId,IACFc,IACE,gBAAA3C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW0C;AAAA,QACX,cAAW;AAAA,QACX,MAAK;AAAA,QACL,aAAU;AAAA,QACV,cAAYrB,EAAE,gBAAgB;AAAA,QAE7B,UAAA,MAAM,KAAK,EAAE,QAAQoB,EAAA,GAAe,CAACG,GAAGC,MACvC,gBAAAC,EAAC,OAAA,EAAkC,WAAWrE,KAC5C,UAAA;AAAA,UAAA,gBAAAuB,EAAC+C,GAAA,EAAS,SAAQ,QAAO,MAAA1C,GAAY,OAAM,OAAM;AAAA,UACjD,gBAAAL,EAAC,OAAA,EAAI,WAAWrB,EAAA,GACb,UAAA,MAAM;AAAA,YACL,EAAE,QAAQ,KAAK,IAAI4B,GAAuB,CAAC,EAAA;AAAA,YAC3C,CAACqC,GAAGI,MACF,gBAAAhD;AAAA,cAAC+C;AAAA,cAAA;AAAA,gBAEC,SAAQ;AAAA,gBACR,MAAA1C;AAAA,gBACA,QAAO;AAAA,cAAA;AAAA,cAHF,gBAAgBwC,CAAM,IAAIG,CAAM;AAAA,YAAA;AAAA,UAIvC,EAEJ,CACF;AAAA,QAAA,EAAA,GAdQ,eAAeH,CAAM,EAe/B,CACD;AAAA,MAAA;AAAA,IAAA,IAGIb,KACTW,IACE,gBAAA3C,EAAC,OAAA,EAAI,cAAW,SACd,UAAA,gBAAAA,EAACiD,IAAA,EAAW,SAAQ,cAAa,OAAO5B,EAAE,kBAAkB,EAAA,CAAG,GACjE,IAGFsB,IACE,gBAAA3C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW0C;AAAA,QACX,cAAYZ,IAAa,aAAa;AAAA,QAErC,UAAA5C,EAAK,IAAI,CAACzC,GAAKyG,MAAW;AACzB,gBAAMC,IAAS,GAAG5H,EAAOkB,EAAI,IAAI,EAAE,YAAA,CAAa,IAAIyG,CAAM,IACpDE,IACJ3G,EAAI,SAAS4C,EAAgB9D,EAAOkB,EAAI,IAAI,GAAG6C,GAAQC,CAAQ,GAC3D8D,IAAW,GAAG7B,EAAM,QAAQ0B,CAAM,WAElCI,IADa5B,GAASyB,CAAM,KAAK,KAEnC1G,EAAI,QACJA,EAAI,MAAM,MAAM,GAAG8D,CAAqB,GACtCgD,IAAc9G,EAAI,MAAM,SAAS6G,EAAa,QAE9CE,IAAa/G,EAAI,MAAM,WAAW;AAExC;AAAA;AAAA;AAAA;AAAA;AAAA,YAKE,gBAAAqG;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAWrE,EAAA;AAAA,gBACX,mBAAiB4E;AAAA,gBACjB,cAAYG,KAAc;AAAA,gBAE1B,UAAA;AAAA,kBAAA,gBAAAxD,EAAC,MAAA,EAAG,IAAIqD,GAAU,WAAW3E,GAAkB,EAAE,MAAA2B,EAAA,CAAM,GACpD,UAAA+C,EAAA,CACH;AAAA,kBACCI,sBACE,KAAA,EAAE,WAAU,yDACV,UAAAnC,EAAE,kBAAkB,GACvB,IACE;AAAA,kBACJ,gBAAArB,EAAC,QAAG,WAAWrB,EAAA,GACZ,UAAA2E,EAAa,IAAI,CAACnE,MAAS;AAC1B,0BAAMsE,KAAgB7D;AAAA,sBACpBT;AAAA,sBACA1C;AAAA,sBACA6C;AAAA,sBACAC;AAAA,sBACA,CAAC,EAAE,MAAAtE,GAAM,KAAK6E,GAAA,MACZuB,EAAE,sBAAsB,EAAE,MAAApG,GAAM,KAAK6E,GAAA,CAAU;AAAA,oBAAA,GAE7C4D,KAAapD,MAAmBnB,EAAK,IACrCwE,IACJxE,EAAK,cAAc,MAAS4C;AAC9B,6CACG,MAAA,EACC,UAAA,gBAAA/B;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAWpB,GAAmB,EAAE,MAAAyB,GAAM;AAAA,wBACtC,cAAYoD;AAAA,wBACZ,gBAAcC;AAAA,wBACd,UAAUC;AAAA,wBACV,iBAAeA,KAAkB;AAAA,wBACjC,gBAAcxE,EAAK;AAAA,wBACnB,SAAS,MAAM+C,EAAgB/C,GAAM1C,CAAG;AAAA,wBACxC,WAAW,CAAC+F,MACVD,GAAkBC,GAAOrD,GAAM1C,CAAG;AAAA,wBAGnC,UAAA+C,EAAeL,GAAMG,GAAQC,CAAQ;AAAA,sBAAA;AAAA,oBAAA,EACxC,GAfOJ,EAAK,EAgBd;AAAA,kBAEJ,CAAC,EAAA,CACH;AAAA,kBACCoE,IAAc,IACb,gBAAAvD;AAAA,oBAAC4D;AAAA,oBAAA;AAAA,sBACC,QAAO;AAAA,sBACP,MAAMvD,MAAS,OAAO,OAAO;AAAA,sBAC7B,SAAS,MAAM+B,GAAe3F,GAAK0G,CAAM;AAAA,sBACzC,UAAUpB;AAAA,sBAET,UAAAV,EAAE,qBAAqB,EAAE,OAAOkC,GAAa;AAAA,oBAAA;AAAA,kBAAA,IAE9C;AAAA,gBAAA;AAAA,cAAA;AAAA,cAzDCJ;AAAA,YAAA;AAAA;AAAA,QA4DX,CAAC;AAAA,MAAA;AAAA,IAAA,GAML,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAA1B;AAAA,QACA,MAAK;AAAA,QACL,cAAYa;AAAA,QACZ,WAAW/D,GAAiB,EAAE,MAAAmC,GAAM,WAAAa,IAAW;AAAA,QAC/C,kBAAe;AAAA,QACf,cAAYd;AAAA,QACX,GAAGe;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAA2B,EAAC,OAAA,EAAI,WAAW1E,GAAA,GACd,UAAA;AAAA,YAAA,gBAAA4B;AAAA,cAAC6D;AAAA,cAAA;AAAA,gBACC,wBAAO9D,IAAA,EAAiB;AAAA,gBACxB,cAAYsB,EAAE,uBAAuB;AAAA,gBACrC,MAAMhB,MAAS,OAAO,OAAO;AAAA,gBAC7B,QAAO;AAAA,gBACP,eAAa;AAAA,gBACb,UAAU,CAACI,KAAesB;AAAA,gBAC1B,SAASjB;AAAA,cAAA;AAAA,YAAA;AAAA,YAEVH,IACC,gBAAAX;AAAA,cAAC4D;AAAA,cAAA;AAAA,gBACC,QAAO;AAAA,gBACP,MAAMvD,MAAS,OAAO,OAAO;AAAA,gBAC7B,UAAU0B;AAAA,gBACV,SAASd;AAAA,gBAER,YAAE,wBAAwB;AAAA,cAAA;AAAA,YAAA,IAG7B,gBAAAjB,EAAC,QAAA,EAAK,eAAY,OAAA,CAAO;AAAA,YAE3B,gBAAAA;AAAA,cAAC6D;AAAA,cAAA;AAAA,gBACC,wBAAO5D,IAAA,EAAe;AAAA,gBACtB,cAAYoB,EAAE,mBAAmB;AAAA,gBACjC,MAAMhB,MAAS,OAAO,OAAO;AAAA,gBAC7B,QAAO;AAAA,gBACP,eAAa;AAAA,gBACb,UAAU,CAACK,KAAWqB;AAAA,gBACtB,SAAShB;AAAA,cAAA;AAAA,YAAA;AAAA,UACX,GACF;AAAA,UAEC4B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AAEAzC,GAAS,cAAc;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"slot-grid-CQSULZjd.js","sources":["../../node_modules/date-fns/parseISO.js","../../src/components/slot-grid/slot-grid.tsx"],"sourcesContent":["import {\n millisecondsInHour,\n millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const invalidDate = () => constructFrom(options?.in, NaN);\n\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(+date)) return invalidDate();\n\n const timestamp = +date;\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) return invalidDate();\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) return invalidDate();\n } else {\n const tmpDate = new Date(timestamp + time);\n const result = toDate(0, options?.in);\n result.setFullYear(\n tmpDate.getUTCFullYear(),\n tmpDate.getUTCMonth(),\n tmpDate.getUTCDate(),\n );\n result.setHours(\n tmpDate.getUTCHours(),\n tmpDate.getUTCMinutes(),\n tmpDate.getUTCSeconds(),\n tmpDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","/* ------------------------------------------------------------------ */\n/* SlotGrid — multi-day time-slot picker for patient booking. */\n/* */\n/* Renders N day columns side-by-side. Each column shows a day header */\n/* (formatted via `Intl.DateTimeFormat(locale)`) plus a vertical list */\n/* of slot buttons. Long days collapse to `maxInitialSlotsPerDay` and */\n/* reveal the rest via a \"Show more\" button (progressive disclosure). */\n/* */\n/* Navigation arrows (`onPreviousDays` / `onNextDays`) let the consumer */\n/* page the window of days; the optional \"Next available\" CTA jumps to */\n/* the first day with an open slot. */\n/* */\n/* Purely presentational — no business logic, no data fetching. Date */\n/* comparisons use `date-fns` (never moment.js) and the rendered labels */\n/* come exclusively from `Intl.DateTimeFormat` or the `ui.slotGrid` */\n/* namespace via `useTranslation()`. */\n/* ------------------------------------------------------------------ */\n\nimport {\n forwardRef,\n useCallback,\n useId,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { isSameDay, parseISO } from 'date-fns';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { Skeleton } from '../skeleton/skeleton';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type SlotGridState = 'default' | 'loading' | 'disabled' | 'empty';\n\nexport type SlotGridSize = 'sm' | 'md' | 'lg';\n\nexport interface SlotGridSlot {\n /** Stable identity — used by consumers to resolve selection. */\n id: string;\n /** Slot start — ISO string or `Date`. Rendered via `Intl.DateTimeFormat`. */\n start: string | Date;\n /** Optional slot end — if omitted only the start time is announced. */\n end?: string | Date;\n /** Defaults to `true`. Unavailable slots render disabled and are not focusable. */\n available?: boolean;\n /** Override the default `Intl`-formatted time label. */\n label?: string;\n /** Override the accessible name of the slot button. */\n ariaLabel?: string;\n}\n\nexport interface SlotGridDay {\n /** The calendar day the column represents. */\n date: string | Date;\n /** Slots for this day, in chronological order. Empty array ⇒ empty day. */\n slots: SlotGridSlot[];\n /** Override the default `Intl`-formatted day header. */\n label?: string;\n}\n\nexport interface SlotGridProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'aria-label' | 'onSelect'>,\n VariantProps<typeof slotGridVariants> {\n /** Days to render, one column per entry. */\n days: SlotGridDay[];\n /** Visual / interactive state. Defaults to `'default'`. */\n state?: SlotGridState;\n /** Density of the slot buttons and day headers. Defaults to `'md'`. */\n size?: SlotGridSize;\n /** Id of the currently selected slot (controlled). */\n selectedSlotId?: string;\n /**\n * Initial number of slots to render per day before the \"Show more\"\n * progressive-disclosure control collapses the rest. Defaults to `6`.\n */\n maxInitialSlotsPerDay?: number;\n /**\n * BCP-47 locale tag for `Intl.DateTimeFormat`. Defaults to the active\n * i18next language.\n */\n locale?: string;\n /** IANA time zone for `Intl.DateTimeFormat`. Optional. */\n timeZone?: string;\n /** Whether the \"previous days\" navigation arrow should be enabled. */\n hasPrevious?: boolean;\n /** Whether the \"next days\" navigation arrow should be enabled. */\n hasNext?: boolean;\n /**\n * When `true`, renders the \"Next available\" CTA at the end of the\n * toolbar. Only emits a callback — the consumer owns the navigation.\n */\n showNextAvailable?: boolean;\n /** Accessible label for the outer grid region. */\n ariaLabel?: string;\n /** Fires when the user selects an available slot. */\n onSlotSelect?: (slot: SlotGridSlot, day: SlotGridDay) => void;\n /** Fires when the user clicks the \"previous days\" arrow. */\n onPreviousDays?: () => void;\n /** Fires when the user clicks the \"next days\" arrow. */\n onNextDays?: () => void;\n /** Fires when the user clicks a day's \"Show more\" button. */\n onShowMore?: (day: SlotGridDay) => void;\n /** Fires when the user clicks the \"Next available\" CTA. */\n onJumpToNextAvailable?: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst slotGridVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:text-[var(--foreground)]',\n 'ds:w-full',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst toolbarVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:w-full',\n);\n\n/**\n * Column-count is dynamic (1–12), so it is declared as a full CVA variant —\n * this keeps every `grid-cols-N` string statically visible to Tailwind's\n * JIT and keeps the variant table inside CVA rather than hand-rolled.\n */\nconst COLS_MAX = 12;\n\nconst columnsVariants = cva(\n 'ds:grid ds:gap-[var(--spacing-sm)] ds:w-full ds:auto-rows-min ds:items-start',\n {\n variants: {\n cols: {\n 1: 'ds:grid-cols-1',\n 2: 'ds:grid-cols-2',\n 3: 'ds:grid-cols-3',\n 4: 'ds:grid-cols-4',\n 5: 'ds:grid-cols-5',\n 6: 'ds:grid-cols-6',\n 7: 'ds:grid-cols-7',\n 8: 'ds:grid-cols-8',\n 9: 'ds:grid-cols-9',\n 10: 'ds:grid-cols-10',\n 11: 'ds:grid-cols-11',\n 12: 'ds:grid-cols-12',\n },\n },\n defaultVariants: { cols: 1 },\n },\n);\n\ntype ColumnsCount = NonNullable<VariantProps<typeof columnsVariants>['cols']>;\n\nfunction clampCols(count: number): ColumnsCount {\n return Math.max(1, Math.min(count, COLS_MAX)) as ColumnsCount;\n}\n\nconst columnVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:bg-[var(--card)]',\n 'ds:min-w-0',\n ].join(' '),\n);\n\nconst dayHeaderVariants = cva(\n [\n 'ds:font-[var(--font-weight-semibold)]',\n 'ds:text-[var(--foreground)]',\n 'ds:text-start',\n 'ds:truncate',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-xs)]',\n md: 'ds:text-[length:var(--font-size-sm)]',\n lg: 'ds:text-[length:var(--font-size-base)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst slotListVariants = cva(\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:w-full ds:m-0 ds:p-0 ds:list-none',\n);\n\nconst slotButtonVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:w-full',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:font-[var(--font-weight-medium)]',\n 'ds:bg-[var(--secondary)]',\n 'ds:shadow-[var(--shadow-sm)]',\n 'ds:text-[var(--foreground)]',\n 'ds:transition-[background-color,color,box-shadow]',\n 'ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[var(--focus-ring-offset)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:shadow-none',\n 'ds:aria-disabled:opacity-50 ds:aria-disabled:cursor-not-allowed ds:aria-disabled:shadow-none',\n 'ds:hover:enabled:shadow-[var(--shadow-md)]',\n 'ds:aria-pressed:bg-[var(--primary)] ds:aria-pressed:text-[var(--primary-foreground)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:text-[length:var(--font-size-xs)] ds:h-8',\n md: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-sm)] ds:h-10',\n lg: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:text-[length:var(--font-size-base)] ds:h-12',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction toDate(value: string | Date): Date {\n return value instanceof Date ? value : parseISO(value);\n}\n\n/** Is `a` the same calendar day as `b`? Uses `date-fns`, locale-agnostic. */\nexport function isSameDate(a: string | Date, b: string | Date): boolean {\n return isSameDay(toDate(a), toDate(b));\n}\n\n/** Find the first day in a list that has at least one available slot. */\nexport function findFirstAvailable(\n days: SlotGridDay[],\n): { day: SlotGridDay; slot: SlotGridSlot } | undefined {\n for (const day of days) {\n const slot = day.slots.find((s) => s.available !== false);\n if (slot) return { day, slot };\n }\n return undefined;\n}\n\nfunction formatDayHeader(\n date: Date,\n locale: string,\n timeZone?: string,\n): string {\n try {\n return new Intl.DateTimeFormat(locale, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n timeZone,\n }).format(date);\n } catch {\n return new Intl.DateTimeFormat('en', {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n }).format(date);\n }\n}\n\nfunction formatSlotTime(\n slot: SlotGridSlot,\n locale: string,\n timeZone?: string,\n): string {\n if (slot.label !== undefined) return slot.label;\n const start = toDate(slot.start);\n try {\n const fmt = new Intl.DateTimeFormat(locale, {\n hour: 'numeric',\n minute: '2-digit',\n timeZone,\n });\n if (slot.end) {\n const end = toDate(slot.end);\n if (typeof fmt.formatRange === 'function') {\n try {\n return fmt.formatRange(start, end);\n } catch {\n /* fall through */\n }\n }\n return `${fmt.format(start)} – ${fmt.format(end)}`;\n }\n return fmt.format(start);\n } catch {\n return start.toISOString();\n }\n}\n\nfunction formatSlotAriaLabel(\n slot: SlotGridSlot,\n day: SlotGridDay,\n locale: string,\n timeZone: string | undefined,\n template: (opts: { time: string; day: string }) => string,\n): string {\n if (slot.ariaLabel !== undefined) return slot.ariaLabel;\n const time = formatSlotTime(slot, locale, timeZone);\n const dayLabel =\n day.label !== undefined\n ? day.label\n : formatDayHeader(toDate(day.date), locale, timeZone);\n return template({ time, day: dayLabel });\n}\n\n/* ------------------------------------------------------------------ */\n/* Glyphs — logical-direction arrows */\n/* ------------------------------------------------------------------ */\n\nfunction ChevronStartIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ds:size-4\"\n >\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction ChevronEndIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ds:size-4\"\n >\n <path d=\"M9 6l6 6-6 6\" />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const SlotGrid = forwardRef<HTMLDivElement, SlotGridProps>(\n (\n {\n days,\n state = 'default',\n size = 'md',\n selectedSlotId,\n maxInitialSlotsPerDay = 6,\n locale: localeProp,\n timeZone,\n hasPrevious = false,\n hasNext = false,\n showNextAvailable = false,\n ariaLabel,\n onSlotSelect,\n onPreviousDays,\n onNextDays,\n onShowMore,\n onJumpToNextAvailable,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const locale = localeProp ?? i18n.language ?? 'en';\n const idBase = useId();\n\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const isLoading = state === 'loading';\n const isDisabled = state === 'disabled';\n const isInteractionSuppressed = isLoading || isDisabled;\n const isEmpty =\n state === 'empty' ||\n days.length === 0 ||\n days.every((day) => day.slots.length === 0);\n\n const resolvedAriaLabel = ariaLabel ?? t('slotGrid.ariaLabel');\n\n const handleSlotClick = useCallback(\n (slot: SlotGridSlot, day: SlotGridDay) => {\n if (isInteractionSuppressed) return;\n if (slot.available === false) return;\n onSlotSelect?.(slot, day);\n },\n [isInteractionSuppressed, onSlotSelect],\n );\n\n const handleShowMore = useCallback(\n (day: SlotGridDay, key: string) => {\n setExpanded((prev) => ({ ...prev, [key]: true }));\n onShowMore?.(day);\n },\n [onShowMore],\n );\n\n const handleSlotKeyDown = useCallback(\n (\n event: KeyboardEvent<HTMLButtonElement>,\n slot: SlotGridSlot,\n day: SlotGridDay,\n ) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleSlotClick(slot, day);\n }\n },\n [handleSlotClick],\n );\n\n const columnCount = clampCols(days.length || 1);\n const columnsClass = columnsVariants({ cols: columnCount });\n\n /* ---- Rendered content ------------------------------------------ */\n\n let body: ReactNode;\n if (isLoading) {\n body = (\n <div\n className={columnsClass}\n data-state=\"loading\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={t('common.loading')}\n >\n {Array.from({ length: columnCount }, (_, colIdx) => (\n <div key={`loading-col-${colIdx}`} className={columnVariants()}>\n <Skeleton variant=\"text\" size={size} width=\"60%\" />\n <div className={slotListVariants()}>\n {Array.from(\n { length: Math.min(maxInitialSlotsPerDay, 4) },\n (_, rowIdx) => (\n <Skeleton\n key={`loading-slot-${colIdx}-${rowIdx}`}\n variant=\"rounded\"\n size={size}\n height=\"40px\"\n />\n ),\n )}\n </div>\n </div>\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div data-state=\"empty\">\n <EmptyState variant=\"no-results\" title={t('slotGrid.noSlots')} />\n </div>\n );\n } else {\n body = (\n <div\n className={columnsClass}\n data-state={isDisabled ? 'disabled' : 'default'}\n >\n {days.map((day, dayIdx) => {\n const dayKey = `${toDate(day.date).toISOString()}-${dayIdx}`;\n const headerLabel =\n day.label ?? formatDayHeader(toDate(day.date), locale, timeZone);\n const headerId = `${idBase}-day-${dayIdx}-header`;\n const isExpanded = expanded[dayKey] ?? false;\n const visibleSlots = isExpanded\n ? day.slots\n : day.slots.slice(0, maxInitialSlotsPerDay);\n const hiddenCount = day.slots.length - visibleSlots.length;\n\n const isDayEmpty = day.slots.length === 0;\n\n return (\n // Use a plain <div role=\"group\"> rather than <section> — a\n // <section> with aria-labelledby is a landmark, and nesting many\n // landmarks inside the outer slot-grid landmark fails axe's\n // landmark-unique rule.\n <div\n key={dayKey}\n role=\"group\"\n className={columnVariants()}\n aria-labelledby={headerId}\n data-empty={isDayEmpty || undefined}\n >\n <h3 id={headerId} className={dayHeaderVariants({ size })}>\n {headerLabel}\n </h3>\n {isDayEmpty ? (\n <p className=\"type-body-sm ds:text-[var(--muted-foreground)] ds:m-0\">\n {t('slotGrid.noSlots')}\n </p>\n ) : null}\n <ul className={slotListVariants()}>\n {visibleSlots.map((slot) => {\n const ariaLabelSlot = formatSlotAriaLabel(\n slot,\n day,\n locale,\n timeZone,\n ({ time, day: dayLabel }) =>\n t('slotGrid.slotLabel', { time, day: dayLabel }),\n );\n const isSelected = selectedSlotId === slot.id;\n const isSlotDisabled =\n slot.available === false || isInteractionSuppressed;\n return (\n <li key={slot.id}>\n <button\n type=\"button\"\n className={slotButtonVariants({ size })}\n aria-label={ariaLabelSlot}\n aria-pressed={isSelected}\n disabled={isSlotDisabled}\n aria-disabled={isSlotDisabled || undefined}\n data-slot-id={slot.id}\n onClick={() => handleSlotClick(slot, day)}\n onKeyDown={(event) =>\n handleSlotKeyDown(event, slot, day)\n }\n >\n {formatSlotTime(slot, locale, timeZone)}\n </button>\n </li>\n );\n })}\n </ul>\n {hiddenCount > 0 ? (\n <Button\n intent=\"ghost\"\n size={size === 'lg' ? 'md' : 'sm'}\n onClick={() => handleShowMore(day, dayKey)}\n disabled={isInteractionSuppressed}\n >\n {t('slotGrid.showMore', { count: hiddenCount })}\n </Button>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={resolvedAriaLabel}\n className={slotGridVariants({ size, className })}\n data-component=\"slot-grid\"\n data-state={state}\n {...rest}\n >\n <div className={toolbarVariants()}>\n <IconButton\n icon={<ChevronStartIcon />}\n aria-label={t('slotGrid.previousDays')}\n size={size === 'lg' ? 'md' : 'sm'}\n intent=\"ghost\"\n flipIconInRtl\n disabled={!hasPrevious || isInteractionSuppressed}\n onClick={onPreviousDays}\n />\n {showNextAvailable ? (\n <Button\n intent=\"secondary\"\n size={size === 'lg' ? 'md' : 'sm'}\n disabled={isInteractionSuppressed}\n onClick={onJumpToNextAvailable}\n >\n {t('slotGrid.nextAvailable')}\n </Button>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n <IconButton\n icon={<ChevronEndIcon />}\n aria-label={t('slotGrid.nextDays')}\n size={size === 'lg' ? 'md' : 'sm'}\n intent=\"ghost\"\n flipIconInRtl\n disabled={!hasNext || isInteractionSuppressed}\n onClick={onNextDays}\n />\n </div>\n\n {body}\n </div>\n );\n },\n);\n\nSlotGrid.displayName = 'SlotGrid';\n"],"names":["parseISO","argument","options","invalidDate","constructFrom","dateStrings","splitDateString","date","parseYearResult","parseYear","parseDate","timestamp","time","offset","parseTime","parseTimezone","tmpDate","result","toDate","patterns","dateRegex","timeRegex","timezoneRegex","dateString","array","timeString","token","additionalDigits","regex","captures","year","century","isWeekDate","dayOfYear","parseDateUnit","month","day","week","dayOfWeek","validateWeekDate","dayOfISOWeekYear","validateDate","validateDayOfYearDate","value","hours","parseTimeUnit","minutes","seconds","validateTime","millisecondsInHour","millisecondsInMinute","timezoneString","sign","validateTimezone","isoWeekYear","fourthOfJanuaryDay","diff","daysInMonths","isLeapYearIndex","_year","_hours","slotGridVariants","cva","toolbarVariants","COLS_MAX","columnsVariants","clampCols","count","columnVariants","dayHeaderVariants","slotListVariants","slotButtonVariants","isSameDate","a","b","isSameDay","findFirstAvailable","days","slot","s","formatDayHeader","locale","timeZone","formatSlotTime","start","fmt","end","formatSlotAriaLabel","template","dayLabel","ChevronStartIcon","jsx","ChevronEndIcon","SlotGrid","forwardRef","state","size","selectedSlotId","maxInitialSlotsPerDay","localeProp","hasPrevious","hasNext","showNextAvailable","ariaLabel","onSlotSelect","onPreviousDays","onNextDays","onShowMore","onJumpToNextAvailable","className","rest","ref","t","i18n","useTranslation","idBase","useId","expanded","setExpanded","useState","isLoading","isDisabled","isInteractionSuppressed","isEmpty","resolvedAriaLabel","handleSlotClick","useCallback","handleShowMore","key","prev","handleSlotKeyDown","event","columnCount","columnsClass","body","_","colIdx","jsxs","Skeleton","rowIdx","EmptyState","dayIdx","dayKey","headerLabel","headerId","visibleSlots","hiddenCount","isDayEmpty","ariaLabelSlot","isSelected","isSlotDisabled","Button","IconButton"],"mappings":"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","x_google_ignoreList":[0]}