@alfadocs/ui-kit-debug 0.72.2 → 0.75.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 (687) hide show
  1. package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js +1546 -0
  2. package/dist/_chunks/actions-cell-renderer-DLrcSTK_.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-loL2A3Cx.js → agenda-tray-CVf-jfWU.js} +3 -3
  4. package/dist/_chunks/{agenda-tray-loL2A3Cx.js.map → agenda-tray-CVf-jfWU.js.map} +1 -1
  5. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js → ai-consent-banner-DUhr1yNj.js} +2 -2
  6. package/dist/_chunks/{ai-consent-banner-Bke9m8VS.js.map → ai-consent-banner-DUhr1yNj.js.map} +1 -1
  7. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js → ai-prompt-input-DziJCGLe.js} +3 -3
  8. package/dist/_chunks/{ai-prompt-input-TVI95hJD.js.map → ai-prompt-input-DziJCGLe.js.map} +1 -1
  9. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js → alia-sidebar-w6B0TEx7.js} +8 -8
  10. package/dist/_chunks/{alia-sidebar-BV5lBSFR.js.map → alia-sidebar-w6B0TEx7.js.map} +1 -1
  11. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js → anamnesis-card-CJ5MNbkc.js} +2 -2
  12. package/dist/_chunks/{anamnesis-card-CWO4Ui9c.js.map → anamnesis-card-CJ5MNbkc.js.map} +1 -1
  13. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js → antenatal-schedule-timeline-BzJZqS-8.js} +3 -3
  14. package/dist/_chunks/{antenatal-schedule-timeline-CY-VsLok.js.map → antenatal-schedule-timeline-BzJZqS-8.js.map} +1 -1
  15. package/dist/_chunks/{appointment-card-Cy4FOkGP.js → appointment-card-DgKI5QKD.js} +2 -2
  16. package/dist/_chunks/{appointment-card-Cy4FOkGP.js.map → appointment-card-DgKI5QKD.js.map} +1 -1
  17. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js → appointment-timeline-DQTG0btW.js} +6 -6
  18. package/dist/_chunks/{appointment-timeline-BWAPPk8F.js.map → appointment-timeline-DQTG0btW.js.map} +1 -1
  19. package/dist/_chunks/{appointment-tray-D3mk04TT.js → appointment-tray-ezyCZN8v.js} +4 -4
  20. package/dist/_chunks/{appointment-tray-D3mk04TT.js.map → appointment-tray-ezyCZN8v.js.map} +1 -1
  21. package/dist/_chunks/{ar-BOqyIfoY.js → ar-B1GhtlBP.js} +2 -2
  22. package/dist/_chunks/{ar-BOqyIfoY.js.map → ar-B1GhtlBP.js.map} +1 -1
  23. package/dist/_chunks/{columns-2-8lq4-b8e.js → arrow-up-right-C2v_MKsK.js} +5 -5
  24. package/dist/_chunks/arrow-up-right-C2v_MKsK.js.map +1 -0
  25. package/dist/_chunks/{audio-recorder-BbjG55dP.js → audio-recorder-Cc3KuL9y.js} +4 -4
  26. package/dist/_chunks/{audio-recorder-BbjG55dP.js.map → audio-recorder-Cc3KuL9y.js.map} +1 -1
  27. package/dist/_chunks/{benefit-card-Xnxj4Gmo.js → benefit-card-DB1Kdrmc.js} +4 -2
  28. package/dist/_chunks/benefit-card-DB1Kdrmc.js.map +1 -0
  29. package/dist/_chunks/{bishop-score-C6eoak_j.js → bishop-score-DDW5-gb9.js} +3 -3
  30. package/dist/_chunks/{bishop-score-C6eoak_j.js.map → bishop-score-DDW5-gb9.js.map} +1 -1
  31. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js → bmi-calculator-Bk2GAju7.js} +2 -2
  32. package/dist/_chunks/{bmi-calculator-BmQfoEGP.js.map → bmi-calculator-Bk2GAju7.js.map} +1 -1
  33. package/dist/_chunks/{booking-B62CMY5k.js → booking-B1Qkcl3c.js} +9 -9
  34. package/dist/_chunks/{booking-B62CMY5k.js.map → booking-B1Qkcl3c.js.map} +1 -1
  35. package/dist/_chunks/{button-DD_0Xdmr.js → button-CPGiR_bH.js} +56 -35
  36. package/dist/_chunks/button-CPGiR_bH.js.map +1 -0
  37. package/dist/_chunks/button-group-DzV5wgnx.js +289 -0
  38. package/dist/_chunks/button-group-DzV5wgnx.js.map +1 -0
  39. package/dist/_chunks/camera-VSklPDCv.js +21 -0
  40. package/dist/_chunks/camera-VSklPDCv.js.map +1 -0
  41. package/dist/_chunks/{care-plan-card-DhXbfGzE.js → care-plan-card-BrwhyIJI.js} +3 -3
  42. package/dist/_chunks/{care-plan-card-DhXbfGzE.js.map → care-plan-card-BrwhyIJI.js.map} +1 -1
  43. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js → care-plan-entry-card-DWEdCQM3.js} +3 -3
  44. package/dist/_chunks/{care-plan-entry-card-D3YGD6rj.js.map → care-plan-entry-card-DWEdCQM3.js.map} +1 -1
  45. package/dist/_chunks/{care-plan-header-DtQxyfOb.js → care-plan-header-BXvRpGG8.js} +2 -2
  46. package/dist/_chunks/{care-plan-header-DtQxyfOb.js.map → care-plan-header-BXvRpGG8.js.map} +1 -1
  47. package/dist/_chunks/{carousel.agent-j7hWxJWr.js → carousel.agent-CtAAdsAd.js} +2 -2
  48. package/dist/_chunks/{carousel.agent-j7hWxJWr.js.map → carousel.agent-CtAAdsAd.js.map} +1 -1
  49. package/dist/_chunks/{chat-container-BVCoN06N.js → chat-container-HlFnoEIl.js} +4 -2
  50. package/dist/_chunks/{chat-container-BVCoN06N.js.map → chat-container-HlFnoEIl.js.map} +1 -1
  51. package/dist/_chunks/{chat-input-Btq_uuMZ.js → chat-input-BTCDqUDX.js} +2 -2
  52. package/dist/_chunks/{chat-input-Btq_uuMZ.js.map → chat-input-BTCDqUDX.js.map} +1 -1
  53. package/dist/_chunks/{chat-message-DXjjM8z9.js → chat-message-CdjWqZjo.js} +3 -3
  54. package/dist/_chunks/{chat-message-DXjjM8z9.js.map → chat-message-CdjWqZjo.js.map} +1 -1
  55. package/dist/_chunks/{code-block-Cwi7e3HM.js → code-block-BwanBjRh.js} +2 -2
  56. package/dist/_chunks/{code-block-Cwi7e3HM.js.map → code-block-BwanBjRh.js.map} +1 -1
  57. package/dist/_chunks/{connection-status-0HajXMXM.js → connection-status-oEUyrvev.js} +3 -3
  58. package/dist/_chunks/{connection-status-0HajXMXM.js.map → connection-status-oEUyrvev.js.map} +1 -1
  59. package/dist/_chunks/{contact-profile-card-IggiUVpN.js → contact-profile-card-veMV3W4J.js} +2 -2
  60. package/dist/_chunks/{contact-profile-card-IggiUVpN.js.map → contact-profile-card-veMV3W4J.js.map} +1 -1
  61. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js → control-room-rail-CdfrZ6Vr.js} +3 -3
  62. package/dist/_chunks/{control-room-rail-DaGcsdZ6.js.map → control-room-rail-CdfrZ6Vr.js.map} +1 -1
  63. package/dist/_chunks/{copy-field-PAp0-Wr5.js → copy-field-DBc9QquW.js} +2 -2
  64. package/dist/_chunks/{copy-field-PAp0-Wr5.js.map → copy-field-DBc9QquW.js.map} +1 -1
  65. package/dist/_chunks/{cycle-calculator-BNILyVas.js → cycle-calculator-OQp8Ik5U.js} +4 -4
  66. package/dist/_chunks/{cycle-calculator-BNILyVas.js.map → cycle-calculator-OQp8Ik5U.js.map} +1 -1
  67. package/dist/_chunks/data-table-tabs-BEUXiRlu.js +710 -0
  68. package/dist/_chunks/data-table-tabs-BEUXiRlu.js.map +1 -0
  69. package/dist/_chunks/{date-picker-CVkD_lOi.js → date-picker-DzQS8mvt.js} +2 -2
  70. package/dist/_chunks/{date-picker-CVkD_lOi.js.map → date-picker-DzQS8mvt.js.map} +1 -1
  71. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js → date-picker-variants-CYQAm1Gk.js} +116 -115
  72. package/dist/_chunks/{date-picker-variants-DLg-ZrIo.js.map → date-picker-variants-CYQAm1Gk.js.map} +1 -1
  73. package/dist/_chunks/{date-range-picker-Dw12DgV8.js → date-range-picker-Cbz1SKhm.js} +3 -3
  74. package/dist/_chunks/{date-range-picker-Dw12DgV8.js.map → date-range-picker-Cbz1SKhm.js.map} +1 -1
  75. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js → date-time-picker-B5IpU-nd.js} +2 -2
  76. package/dist/_chunks/{date-time-picker-Cd_OJtOy.js.map → date-time-picker-B5IpU-nd.js.map} +1 -1
  77. package/dist/_chunks/{de-DFLsUxeV.js → de-DETDHQ0o.js} +2 -2
  78. package/dist/_chunks/{de-DFLsUxeV.js.map → de-DETDHQ0o.js.map} +1 -1
  79. package/dist/_chunks/{description-list-CmBVxIF5.js → description-list-ClNLdRMy.js} +2 -2
  80. package/dist/_chunks/{description-list-CmBVxIF5.js.map → description-list-ClNLdRMy.js.map} +1 -1
  81. package/dist/_chunks/document-preview-CGSM_au9.js +181 -0
  82. package/dist/_chunks/document-preview-CGSM_au9.js.map +1 -0
  83. package/dist/_chunks/{document-scanner-B23j4w7X.js → document-scanner-B6h1Ir56.js} +198 -230
  84. package/dist/_chunks/document-scanner-B6h1Ir56.js.map +1 -0
  85. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js → due-date-calculator-DASNRgnH.js} +4 -4
  86. package/dist/_chunks/{due-date-calculator-CmdAl_JO.js.map → due-date-calculator-DASNRgnH.js.map} +1 -1
  87. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js → editable-currency-cell-renderer-GwfA9tTR.js} +3 -3
  88. package/dist/_chunks/{editable-currency-cell-renderer-z9fJFw6Z.js.map → editable-currency-cell-renderer-GwfA9tTR.js.map} +1 -1
  89. package/dist/_chunks/{editor-overlay-BIOzr8v7.js → editor-overlay-DE3esyio.js} +2 -2
  90. package/dist/_chunks/{editor-overlay-BIOzr8v7.js.map → editor-overlay-DE3esyio.js.map} +1 -1
  91. package/dist/_chunks/{el-OVjBKytp.js → el-HV3jOI0z.js} +2 -2
  92. package/dist/_chunks/{el-OVjBKytp.js.map → el-HV3jOI0z.js.map} +1 -1
  93. package/dist/_chunks/{empty-state-BLy7tigq.js → empty-state-CrLsi0XI.js} +2 -2
  94. package/dist/_chunks/{empty-state-BLy7tigq.js.map → empty-state-CrLsi0XI.js.map} +1 -1
  95. package/dist/_chunks/{entity-summary-DpGziDv5.js → entity-summary--vP698Jn.js} +3 -3
  96. package/dist/_chunks/{entity-summary-DpGziDv5.js.map → entity-summary--vP698Jn.js.map} +1 -1
  97. package/dist/_chunks/eraser-CHOGQfVv.js +21 -0
  98. package/dist/_chunks/eraser-CHOGQfVv.js.map +1 -0
  99. package/dist/_chunks/{es-DKDNrHXG.js → es-Dpo7Olwo.js} +2 -2
  100. package/dist/_chunks/{es-DKDNrHXG.js.map → es-Dpo7Olwo.js.map} +1 -1
  101. package/dist/_chunks/face-scheme-C0rk21gg.js +3146 -0
  102. package/dist/_chunks/face-scheme-C0rk21gg.js.map +1 -0
  103. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js → fetal-weight-1F9N4IMx.js} +2 -2
  104. package/dist/_chunks/{fetal-weight-CVAH8sJ3.js.map → fetal-weight-1F9N4IMx.js.map} +1 -1
  105. package/dist/_chunks/{field-array-CDzc3hTM.js → field-array-DH3Mb1i8.js} +3 -3
  106. package/dist/_chunks/{field-array-CDzc3hTM.js.map → field-array-DH3Mb1i8.js.map} +1 -1
  107. package/dist/_chunks/{field-value-Dj3i52H2.js → field-value-DHG6gEKS.js} +5 -5
  108. package/dist/_chunks/{field-value-Dj3i52H2.js.map → field-value-DHG6gEKS.js.map} +1 -1
  109. package/dist/_chunks/file-Cwe9VC1A.js +40 -0
  110. package/dist/_chunks/file-Cwe9VC1A.js.map +1 -0
  111. package/dist/_chunks/file-manager-UF8dkQF1.js +1776 -0
  112. package/dist/_chunks/file-manager-UF8dkQF1.js.map +1 -0
  113. package/dist/_chunks/{file-upload-Kw1rdvFw.js → file-upload-DENvuhfs.js} +101 -139
  114. package/dist/_chunks/file-upload-DENvuhfs.js.map +1 -0
  115. package/dist/_chunks/{finished-terminal-Di4gtZ50.js → finished-terminal-C0_mefrf.js} +11 -11
  116. package/dist/_chunks/finished-terminal-C0_mefrf.js.map +1 -0
  117. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js → fiscal-code-input-DWA6C8x8.js} +2 -2
  118. package/dist/_chunks/{fiscal-code-input-DKNXFXs3.js.map → fiscal-code-input-DWA6C8x8.js.map} +1 -1
  119. package/dist/_chunks/{fr-BfMvQh-v.js → fr-CgD4Jvtq.js} +2 -2
  120. package/dist/_chunks/{fr-BfMvQh-v.js.map → fr-CgD4Jvtq.js.map} +1 -1
  121. package/dist/_chunks/{freemium-paywall-DFoeedwh.js → freemium-paywall-CmV642PA.js} +7 -3
  122. package/dist/_chunks/freemium-paywall-CmV642PA.js.map +1 -0
  123. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js → gestational-age-calculator-BpYw-WF-.js} +7 -7
  124. package/dist/_chunks/{gestational-age-calculator-BwCBPAGX.js.map → gestational-age-calculator-BpYw-WF-.js.map} +1 -1
  125. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js → hcg-doubling-Dqj-EqMT.js} +3 -3
  126. package/dist/_chunks/{hcg-doubling-CSsWxEJc.js.map → hcg-doubling-Dqj-EqMT.js.map} +1 -1
  127. package/dist/_chunks/{header-DaXWDw0M.js → header-CjwasYnn.js} +88 -79
  128. package/dist/_chunks/header-CjwasYnn.js.map +1 -0
  129. package/dist/_chunks/{header-settings-B0G_u-wV.js → header-settings-4cwQzeFc.js} +4 -4
  130. package/dist/_chunks/{header-settings-B0G_u-wV.js.map → header-settings-4cwQzeFc.js.map} +1 -1
  131. package/dist/_chunks/{hi-C0GEMwlD.js → hi-Bf8CAP6b.js} +2 -2
  132. package/dist/_chunks/{hi-C0GEMwlD.js.map → hi-Bf8CAP6b.js.map} +1 -1
  133. package/dist/_chunks/highlighter-DSkckT2Q.js +15 -0
  134. package/dist/_chunks/highlighter-DSkckT2Q.js.map +1 -0
  135. package/dist/_chunks/{icon-button-LqoiKcUN.js → icon-button-C_kbcd7I.js} +2 -2
  136. package/dist/_chunks/{icon-button-LqoiKcUN.js.map → icon-button-C_kbcd7I.js.map} +1 -1
  137. package/dist/_chunks/icon-button-group-C_lqXTAj.js +391 -0
  138. package/dist/_chunks/icon-button-group-C_lqXTAj.js.map +1 -0
  139. package/dist/_chunks/{icon-picker-Di6uYDG-.js → icon-picker-CM9ubkew.js} +3 -3
  140. package/dist/_chunks/{icon-picker-Di6uYDG-.js.map → icon-picker-CM9ubkew.js.map} +1 -1
  141. package/dist/_chunks/{image-cropper-CdmWFrMC.js → image-cropper-DKe4AORY.js} +2 -2
  142. package/dist/_chunks/{image-cropper-CdmWFrMC.js.map → image-cropper-DKe4AORY.js.map} +1 -1
  143. package/dist/_chunks/{insert-result-C7xSDb8q.js → insert-result-D074GtHX.js} +58 -68
  144. package/dist/_chunks/insert-result-D074GtHX.js.map +1 -0
  145. package/dist/_chunks/{isSameWeek-HddDAyJG.js → isSameWeek-BYl5poz_.js} +2 -2
  146. package/dist/_chunks/{isSameWeek-HddDAyJG.js.map → isSameWeek-BYl5poz_.js.map} +1 -1
  147. package/dist/_chunks/{it-5f4hiT2e.js → it-mt1V2DFS.js} +3 -3
  148. package/dist/_chunks/{it-5f4hiT2e.js.map → it-mt1V2DFS.js.map} +1 -1
  149. package/dist/_chunks/{ja-U0_2inl_.js → ja-CbOHn2TO.js} +2 -2
  150. package/dist/_chunks/{ja-U0_2inl_.js.map → ja-CbOHn2TO.js.map} +1 -1
  151. package/dist/_chunks/{key-value-pair-Byyyc_9J.js → key-value-pair-LHKfDT_9.js} +2 -2
  152. package/dist/_chunks/{key-value-pair-Byyyc_9J.js.map → key-value-pair-LHKfDT_9.js.map} +1 -1
  153. package/dist/_chunks/link-cell-renderer-BQGUs45d.js +711 -0
  154. package/dist/_chunks/link-cell-renderer-BQGUs45d.js.map +1 -0
  155. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js → locale-picker-GNF3lo8K.js} +3 -3
  156. package/dist/_chunks/{locale-picker-DzF7Q5Y8.js.map → locale-picker-GNF3lo8K.js.map} +1 -1
  157. package/dist/_chunks/{map-view-ByPvWG_9.js → map-view-CsaHfoo6.js} +2 -2
  158. package/dist/_chunks/{map-view-ByPvWG_9.js.map → map-view-CsaHfoo6.js.map} +1 -1
  159. package/dist/_chunks/{marketplace-app-shell-BCYiOvKZ.js → marketplace-app-shell-D_1tF4La.js} +6 -6
  160. package/dist/_chunks/marketplace-app-shell-D_1tF4La.js.map +1 -0
  161. package/dist/_chunks/{message-card-BZnnffyB.js → message-card-ievotOFa.js} +3 -3
  162. package/dist/_chunks/{message-card-BZnnffyB.js.map → message-card-ievotOFa.js.map} +1 -1
  163. package/dist/_chunks/{message-tray-cUHOCdU0.js → message-tray-BFlu8clI.js} +4 -4
  164. package/dist/_chunks/{message-tray-cUHOCdU0.js.map → message-tray-BFlu8clI.js.map} +1 -1
  165. package/dist/_chunks/{muscle-scheme-B9MIkuj0.js → muscle-scheme-CFBE2dme.js} +6 -14
  166. package/dist/_chunks/{muscle-scheme-B9MIkuj0.js.map → muscle-scheme-CFBE2dme.js.map} +1 -1
  167. package/dist/_chunks/{nl-CDVnnx1U.js → nl-C6Y0QXnm.js} +2 -2
  168. package/dist/_chunks/{nl-CDVnnx1U.js.map → nl-C6Y0QXnm.js.map} +1 -1
  169. package/dist/_chunks/{notes-panel-CMyjUXD4.js → notes-panel-Cvdp818a.js} +3 -3
  170. package/dist/_chunks/{notes-panel-CMyjUXD4.js.map → notes-panel-Cvdp818a.js.map} +1 -1
  171. package/dist/_chunks/{notification-card-BHJ07FkH.js → notification-card-D29_sVA1.js} +3 -3
  172. package/dist/_chunks/{notification-card-BHJ07FkH.js.map → notification-card-D29_sVA1.js.map} +1 -1
  173. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js → notification-tray-CzIzz3bX.js} +4 -4
  174. package/dist/_chunks/{notification-tray-Dzm1c3Wy.js.map → notification-tray-CzIzz3bX.js.map} +1 -1
  175. package/dist/_chunks/optical-prescription-BEjYQjiO.js +1260 -0
  176. package/dist/_chunks/optical-prescription-BEjYQjiO.js.map +1 -0
  177. package/dist/_chunks/{patient-details-pU_E5xM2.js → patient-details-DP4wKyq4.js} +7 -7
  178. package/dist/_chunks/{patient-details-pU_E5xM2.js.map → patient-details-DP4wKyq4.js.map} +1 -1
  179. package/dist/_chunks/{patient-search-X9SUZGpy.js → patient-search-BaUJ_Y-N.js} +47 -45
  180. package/dist/_chunks/patient-search-BaUJ_Y-N.js.map +1 -0
  181. package/dist/_chunks/{patient-summary-card--t3BjTdU.js → patient-summary-card-D6kgdTNn.js} +4 -4
  182. package/dist/_chunks/{patient-summary-card--t3BjTdU.js.map → patient-summary-card-D6kgdTNn.js.map} +1 -1
  183. package/dist/_chunks/{patient-table-BgWgNIMf.js → patient-table-DweKjiXg.js} +122 -118
  184. package/dist/_chunks/patient-table-DweKjiXg.js.map +1 -0
  185. package/dist/_chunks/{payment-request-card-2ts7ITxd.js → payment-request-card-C0fqlKqO.js} +25 -24
  186. package/dist/_chunks/{payment-request-card-2ts7ITxd.js.map → payment-request-card-C0fqlKqO.js.map} +1 -1
  187. package/dist/_chunks/pen-line-D0De5zdl.js +21 -0
  188. package/dist/_chunks/pen-line-D0De5zdl.js.map +1 -0
  189. package/dist/_chunks/periodontal-chart-D8hOFmde.js +1173 -0
  190. package/dist/_chunks/periodontal-chart-D8hOFmde.js.map +1 -0
  191. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js → periodontal-chart-card-WVjJAheq.js} +2 -2
  192. package/dist/_chunks/{periodontal-chart-card-6c6Lt4ws.js.map → periodontal-chart-card-WVjJAheq.js.map} +1 -1
  193. package/dist/_chunks/periodontal-diagnosis-cco40xTa.js +345 -0
  194. package/dist/_chunks/periodontal-diagnosis-cco40xTa.js.map +1 -0
  195. package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js +334 -0
  196. package/dist/_chunks/periodontal-risk-chart-bUGkMwDg.js.map +1 -0
  197. package/dist/_chunks/{pl-BWNumNrg.js → pl-BdazJAOp.js} +3 -3
  198. package/dist/_chunks/{pl-BWNumNrg.js.map → pl-BdazJAOp.js.map} +1 -1
  199. package/dist/_chunks/{popover-uJ6BvEU3.js → popover-Cc0a69sw.js} +32 -29
  200. package/dist/_chunks/{popover-uJ6BvEU3.js.map → popover-Cc0a69sw.js.map} +1 -1
  201. package/dist/_chunks/{practice-results-CSEHTH2V.js → practice-results-BCr7jMt1.js} +5 -5
  202. package/dist/_chunks/{practice-results-CSEHTH2V.js.map → practice-results-BCr7jMt1.js.map} +1 -1
  203. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js → pregnancy-dating-msMl_6wz.js} +7 -7
  204. package/dist/_chunks/{pregnancy-dating-CxVAA6_4.js.map → pregnancy-dating-msMl_6wz.js.map} +1 -1
  205. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js → pregnancy-weight-gain-B-CkVYnU.js} +2 -2
  206. package/dist/_chunks/{pregnancy-weight-gain-C7zyrwow.js.map → pregnancy-weight-gain-B-CkVYnU.js.map} +1 -1
  207. package/dist/_chunks/{privacy-lock-DrRmK8C7.js → privacy-lock-YYBiI_bY.js} +3 -3
  208. package/dist/_chunks/{privacy-lock-DrRmK8C7.js.map → privacy-lock-YYBiI_bY.js.map} +1 -1
  209. package/dist/_chunks/{product-hub-panel-CaZqttvm.js → product-hub-panel-CTld1r5V.js} +3 -3
  210. package/dist/_chunks/{product-hub-panel-CaZqttvm.js.map → product-hub-panel-CTld1r5V.js.map} +1 -1
  211. package/dist/_chunks/{pt-zqdQuryr.js → pt-B3UKvhHp.js} +2 -2
  212. package/dist/_chunks/{pt-zqdQuryr.js.map → pt-B3UKvhHp.js.map} +1 -1
  213. package/dist/_chunks/{public-header.agent-C-opZaOw.js → public-header.agent-rX_VA6hd.js} +107 -103
  214. package/dist/_chunks/public-header.agent-rX_VA6hd.js.map +1 -0
  215. package/dist/_chunks/{radiograph-panel.agent-D1x33moc.js → radiograph-panel.agent-CxF9pVxd.js} +40 -57
  216. package/dist/_chunks/radiograph-panel.agent-CxF9pVxd.js.map +1 -0
  217. package/dist/_chunks/{reviews-panel-liUj6OPX.js → reviews-panel-DmOjvmyH.js} +4 -4
  218. package/dist/_chunks/{reviews-panel-liUj6OPX.js.map → reviews-panel-DmOjvmyH.js.map} +1 -1
  219. package/dist/_chunks/{rich-text-editor-DUgznqOf.js → rich-text-editor-CCWjNkbx.js} +26 -26
  220. package/dist/_chunks/rich-text-editor-CCWjNkbx.js.map +1 -0
  221. package/dist/_chunks/{ro-CornQr64.js → ro-DVTEQpPK.js} +2 -2
  222. package/dist/_chunks/{ro-CornQr64.js.map → ro-DVTEQpPK.js.map} +1 -1
  223. package/dist/_chunks/{ru-CKAXNYVD.js → ru-C-Mp40SC.js} +3 -3
  224. package/dist/_chunks/{ru-CKAXNYVD.js.map → ru-C-Mp40SC.js.map} +1 -1
  225. package/dist/_chunks/{select-BmCbJMJS.js → select-BW5ecXlX.js} +13 -13
  226. package/dist/_chunks/{select-BmCbJMJS.js.map → select-BW5ecXlX.js.map} +1 -1
  227. package/dist/_chunks/{session-countdown-qr8EO5QY.js → session-countdown-C8AsE072.js} +2 -2
  228. package/dist/_chunks/{session-countdown-qr8EO5QY.js.map → session-countdown-C8AsE072.js.map} +1 -1
  229. package/dist/_chunks/{sheet-B_X54aZo.js → sheet-D5K0LB3q.js} +2 -2
  230. package/dist/_chunks/{sheet-B_X54aZo.js.map → sheet-D5K0LB3q.js.map} +1 -1
  231. package/dist/_chunks/{sidebar-B0OBmJrC.js → sidebar-C0PbwJBc.js} +375 -335
  232. package/dist/_chunks/sidebar-C0PbwJBc.js.map +1 -0
  233. package/dist/_chunks/{sign-document-nK03S73h.js → sign-document-Bfk0WpWV.js} +2 -2
  234. package/dist/_chunks/{sign-document-nK03S73h.js.map → sign-document-Bfk0WpWV.js.map} +1 -1
  235. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js → sign-in-with-alfadocs-button-UlYefZpI.js} +2 -2
  236. package/dist/_chunks/{sign-in-with-alfadocs-button-LppxjlFt.js.map → sign-in-with-alfadocs-button-UlYefZpI.js.map} +1 -1
  237. package/dist/_chunks/{signature-capture-Ct_4Md4e.js → signature-capture-DN52VNKL.js} +206 -189
  238. package/dist/_chunks/signature-capture-DN52VNKL.js.map +1 -0
  239. package/dist/_chunks/{signature-field-jgwYgUhO.js → signature-field-0rFODJlW.js} +47 -41
  240. package/dist/_chunks/signature-field-0rFODJlW.js.map +1 -0
  241. package/dist/_chunks/signature-request-C-mskXwi.js +318 -0
  242. package/dist/_chunks/signature-request-C-mskXwi.js.map +1 -0
  243. package/dist/_chunks/{slot-grid-FsqumOaS.js → slot-grid-CQSULZjd.js} +4 -4
  244. package/dist/_chunks/{slot-grid-FsqumOaS.js.map → slot-grid-CQSULZjd.js.map} +1 -1
  245. package/dist/_chunks/{sq-CIIvqXZv.js → sq-DierVlw-.js} +2 -2
  246. package/dist/_chunks/{sq-CIIvqXZv.js.map → sq-DierVlw-.js.map} +1 -1
  247. package/dist/_chunks/{streaming-text-Cedc05ya.js → streaming-text-C5bYz7LL.js} +2 -2
  248. package/dist/_chunks/{streaming-text-Cedc05ya.js.map → streaming-text-C5bYz7LL.js.map} +1 -1
  249. package/dist/_chunks/subDays-DIKRViZm.js +8 -0
  250. package/dist/_chunks/{subDays-DGSOp9d9.js.map → subDays-DIKRViZm.js.map} +1 -1
  251. package/dist/_chunks/{sv-Kpk1pzjz.js → sv-gQWo_19z.js} +2 -2
  252. package/dist/_chunks/{sv-Kpk1pzjz.js.map → sv-gQWo_19z.js.map} +1 -1
  253. package/dist/_chunks/{tabs-DVQ941Sj.js → tabs-CVTukWRD.js} +2 -2
  254. package/dist/_chunks/{tabs-DVQ941Sj.js.map → tabs-CVTukWRD.js.map} +1 -1
  255. package/dist/_chunks/{task-tray-DP5A3Qnc.js → task-tray-Br3vc0O1.js} +3 -3
  256. package/dist/_chunks/{task-tray-DP5A3Qnc.js.map → task-tray-Br3vc0O1.js.map} +1 -1
  257. package/dist/_chunks/{tasks-panel-BuxaYtEF.js → tasks-panel-CjGAhIN8.js} +6 -6
  258. package/dist/_chunks/{tasks-panel-BuxaYtEF.js.map → tasks-panel-CjGAhIN8.js.map} +1 -1
  259. package/dist/_chunks/{theme-toggle-dtdy5EaL.js → theme-toggle-BJCz_UOi.js} +3 -3
  260. package/dist/_chunks/{theme-toggle-dtdy5EaL.js.map → theme-toggle-BJCz_UOi.js.map} +1 -1
  261. package/dist/_chunks/{toast.agent-BSxl057x.js → toast.agent-uV8CeAy6.js} +2 -2
  262. package/dist/_chunks/{toast.agent-BSxl057x.js.map → toast.agent-uV8CeAy6.js.map} +1 -1
  263. package/dist/_chunks/{token-insert-menu-Pok4nExI.js → token-insert-menu-BYv6yoZI.js} +2 -2
  264. package/dist/_chunks/{token-insert-menu-Pok4nExI.js.map → token-insert-menu-BYv6yoZI.js.map} +1 -1
  265. package/dist/_chunks/{tool-rail-BZx0-yIr.js → tool-rail-AaTqxkIM.js} +2 -2
  266. package/dist/_chunks/{tool-rail-BZx0-yIr.js.map → tool-rail-AaTqxkIM.js.map} +1 -1
  267. package/dist/_chunks/tooth-data-BwuoKFf4.js +660 -0
  268. package/dist/_chunks/tooth-data-BwuoKFf4.js.map +1 -0
  269. package/dist/_chunks/tooth-scheme-BzJ6rcte.js +1483 -0
  270. package/dist/_chunks/tooth-scheme-BzJ6rcte.js.map +1 -0
  271. package/dist/_chunks/{tr-DHaeLFxG.js → tr-Btm6M3Km.js} +2 -2
  272. package/dist/_chunks/{tr-DHaeLFxG.js.map → tr-Btm6M3Km.js.map} +1 -1
  273. package/dist/_chunks/{transaction-chip-B6iWoVmU.js → transaction-chip-DJCstquX.js} +41 -51
  274. package/dist/_chunks/transaction-chip-DJCstquX.js.map +1 -0
  275. package/dist/_chunks/type-ggmfVs23.js +16 -0
  276. package/dist/_chunks/type-ggmfVs23.js.map +1 -0
  277. package/dist/_chunks/{unit-converter-fEqluT8b.js → unit-converter-CSLWFDQh.js} +3 -3
  278. package/dist/_chunks/{unit-converter-fEqluT8b.js.map → unit-converter-CSLWFDQh.js.map} +1 -1
  279. package/dist/_chunks/upload-BfT2hzMg.js +16 -0
  280. package/dist/_chunks/upload-BfT2hzMg.js.map +1 -0
  281. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js +101 -0
  282. package/dist/_chunks/use-priority-overflow-c9SjxZkZ.js.map +1 -0
  283. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js +31 -0
  284. package/dist/_chunks/use-visual-viewport-pin-ChurOsHM.js.map +1 -0
  285. package/dist/_chunks/{warning-stack-BaMI7-n7.js → warning-stack-BlG_Ujy3.js} +3 -3
  286. package/dist/_chunks/{warning-stack-BaMI7-n7.js.map → warning-stack-BlG_Ujy3.js.map} +1 -1
  287. package/dist/_chunks/{workflow-map-qWsgCldq.js → workflow-map-C643Q43h.js} +5 -5
  288. package/dist/_chunks/{workflow-map-qWsgCldq.js.map → workflow-map-C643Q43h.js.map} +1 -1
  289. package/dist/_chunks/{zh-CN-BncsTBwM.js → zh-CN-DkVN4vsB.js} +3 -3
  290. package/dist/_chunks/{zh-CN-BncsTBwM.js.map → zh-CN-DkVN4vsB.js.map} +1 -1
  291. package/dist/agent-catalog.json +4081 -3201
  292. package/dist/agent-i18n/en.json +121 -69
  293. package/dist/brand/product-lockup/product-lockup.d.ts +1 -1
  294. package/dist/components/_shared/calendar-class-names.d.ts.map +1 -1
  295. package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
  296. package/dist/components/agenda-tray/index.js +1 -1
  297. package/dist/components/ai-consent-banner/index.js +1 -1
  298. package/dist/components/ai-prompt-input/index.js +1 -1
  299. package/dist/components/anamnesis-card/anamnesis-card.d.ts +1 -1
  300. package/dist/components/anamnesis-card/index.js +1 -1
  301. package/dist/components/appointment-card/appointment-card.d.ts +1 -1
  302. package/dist/components/appointment-card/index.js +2 -2
  303. package/dist/components/appointment-timeline/index.js +1 -1
  304. package/dist/components/audio-recorder/index.js +1 -1
  305. package/dist/components/benefit-card/benefit-card.d.ts.map +1 -1
  306. package/dist/components/benefit-card/index.js +1 -1
  307. package/dist/components/bishop-score/index.js +1 -1
  308. package/dist/components/bmi-calculator/index.js +1 -1
  309. package/dist/components/booking/index.js +1 -1
  310. package/dist/components/button/button.d.ts +8 -1
  311. package/dist/components/button/button.d.ts.map +1 -1
  312. package/dist/components/button/index.js +2 -2
  313. package/dist/components/button-group/button-group.d.ts +16 -0
  314. package/dist/components/button-group/button-group.d.ts.map +1 -1
  315. package/dist/components/button-group/index.js +1 -1
  316. package/dist/components/card/card.d.ts +1 -1
  317. package/dist/components/care-plan-card/index.js +1 -1
  318. package/dist/components/care-plan-entry-card/index.js +1 -1
  319. package/dist/components/care-plan-header/index.js +1 -1
  320. package/dist/components/carousel/index.js +1 -1
  321. package/dist/components/chat-container/chat-container.d.ts.map +1 -1
  322. package/dist/components/chat-container/index.js +1 -1
  323. package/dist/components/chat-input/index.js +1 -1
  324. package/dist/components/chat-message/index.js +1 -1
  325. package/dist/components/clinical-note-card/clinical-note-card.d.ts +1 -1
  326. package/dist/components/connection-status/index.js +1 -1
  327. package/dist/components/contact-profile-card/contact-profile-card.d.ts +1 -1
  328. package/dist/components/contact-profile-card/index.js +1 -1
  329. package/dist/components/control-room-rail/index.js +1 -1
  330. package/dist/components/copy-field/index.js +1 -1
  331. package/dist/components/counter/counter.d.ts +1 -1
  332. package/dist/components/cycle-calculator/index.js +1 -1
  333. package/dist/components/data-table/data-table.d.ts +2 -8
  334. package/dist/components/data-table/data-table.d.ts.map +1 -1
  335. package/dist/components/data-table/filters/number-filter.d.ts.map +1 -1
  336. package/dist/components/data-table/index.js +35 -34
  337. package/dist/components/data-table/index.js.map +1 -1
  338. package/dist/components/data-table/toolbar.d.ts +5 -11
  339. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  340. package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts +4 -0
  341. package/dist/components/data-table-tabs/data-table-tabs.agent.d.ts.map +1 -0
  342. package/dist/components/data-table-tabs/data-table-tabs.d.ts +93 -0
  343. package/dist/components/data-table-tabs/data-table-tabs.d.ts.map +1 -0
  344. package/dist/components/data-table-tabs/index.d.ts +5 -0
  345. package/dist/components/data-table-tabs/index.d.ts.map +1 -0
  346. package/dist/components/data-table-tabs/index.js +8 -0
  347. package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts +63 -0
  348. package/dist/components/data-table-tabs/use-data-table-filter-tabs.d.ts.map +1 -0
  349. package/dist/components/date-picker/index.js +1 -1
  350. package/dist/components/date-range-picker/index.js +1 -1
  351. package/dist/components/date-time-picker/index.js +1 -1
  352. package/dist/components/description-list/index.js +1 -1
  353. package/dist/components/document-preview/document-preview.agent.d.ts +4 -0
  354. package/dist/components/document-preview/document-preview.agent.d.ts.map +1 -0
  355. package/dist/components/document-preview/document-preview.d.ts +41 -0
  356. package/dist/components/document-preview/document-preview.d.ts.map +1 -0
  357. package/dist/components/document-preview/index.d.ts +4 -0
  358. package/dist/components/document-preview/index.d.ts.map +1 -0
  359. package/dist/components/document-preview/index.js +6 -0
  360. package/dist/components/document-preview/index.js.map +1 -0
  361. package/dist/components/document-scanner/document-scanner.d.ts.map +1 -1
  362. package/dist/components/document-scanner/index.js +1 -1
  363. package/dist/components/due-date-calculator/index.js +2 -2
  364. package/dist/components/editor-overlay/index.js +1 -1
  365. package/dist/components/empty-state/index.js +1 -1
  366. package/dist/components/entity-summary/index.js +1 -1
  367. package/dist/components/face-scheme/face-scheme-data.d.ts +167 -0
  368. package/dist/components/face-scheme/face-scheme-data.d.ts.map +1 -1
  369. package/dist/components/face-scheme/face-scheme.agent.d.ts.map +1 -1
  370. package/dist/components/face-scheme/face-scheme.d.ts +112 -2
  371. package/dist/components/face-scheme/face-scheme.d.ts.map +1 -1
  372. package/dist/components/face-scheme/index.d.ts +2 -2
  373. package/dist/components/face-scheme/index.d.ts.map +1 -1
  374. package/dist/components/face-scheme/index.js +25 -14
  375. package/dist/components/fetal-weight/index.js +1 -1
  376. package/dist/components/field-array/index.js +1 -1
  377. package/dist/components/file-manager/dialogs.d.ts +48 -0
  378. package/dist/components/file-manager/dialogs.d.ts.map +1 -0
  379. package/dist/components/file-manager/file-manager.agent.d.ts +4 -0
  380. package/dist/components/file-manager/file-manager.agent.d.ts.map +1 -0
  381. package/dist/components/file-manager/file-manager.d.ts +82 -0
  382. package/dist/components/file-manager/file-manager.d.ts.map +1 -0
  383. package/dist/components/file-manager/folder-tree.d.ts +12 -0
  384. package/dist/components/file-manager/folder-tree.d.ts.map +1 -0
  385. package/dist/components/file-manager/index.d.ts +5 -0
  386. package/dist/components/file-manager/index.d.ts.map +1 -0
  387. package/dist/components/file-manager/index.js +6 -0
  388. package/dist/components/file-manager/index.js.map +1 -0
  389. package/dist/components/file-manager/list-view.d.ts +49 -0
  390. package/dist/components/file-manager/list-view.d.ts.map +1 -0
  391. package/dist/components/file-manager/toolbar.d.ts +15 -0
  392. package/dist/components/file-manager/toolbar.d.ts.map +1 -0
  393. package/dist/components/file-manager/types.d.ts +167 -0
  394. package/dist/components/file-manager/types.d.ts.map +1 -0
  395. package/dist/components/file-manager/utils.d.ts +34 -0
  396. package/dist/components/file-manager/utils.d.ts.map +1 -0
  397. package/dist/components/file-upload/file-upload.d.ts +1 -0
  398. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  399. package/dist/components/file-upload/index.d.ts +1 -1
  400. package/dist/components/file-upload/index.d.ts.map +1 -1
  401. package/dist/components/file-upload/index.js +4 -3
  402. package/dist/components/finished-terminal/finished-terminal.d.ts.map +1 -1
  403. package/dist/components/finished-terminal/index.js +1 -1
  404. package/dist/components/fiscal-code-input/index.js +1 -1
  405. package/dist/components/flag/flag.d.ts +1 -1
  406. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  407. package/dist/components/freemium-paywall/index.js +1 -1
  408. package/dist/components/gestational-age-calculator/index.js +1 -1
  409. package/dist/components/hcg-doubling/index.js +1 -1
  410. package/dist/components/header/header.d.ts.map +1 -1
  411. package/dist/components/header/index.js +1 -1
  412. package/dist/components/header-settings/index.js +1 -1
  413. package/dist/components/icon-button/index.js +1 -1
  414. package/dist/components/icon-button-group/icon-button-group.d.ts +6 -0
  415. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  416. package/dist/components/icon-button-group/index.js +1 -1
  417. package/dist/components/icon-picker/index.js +1 -1
  418. package/dist/components/image-cropper/index.js +1 -1
  419. package/dist/components/index.d.ts +7 -1
  420. package/dist/components/index.d.ts.map +1 -1
  421. package/dist/components/key-value-pair/index.js +1 -1
  422. package/dist/components/link/link.d.ts +1 -1
  423. package/dist/components/locale-picker/index.js +1 -1
  424. package/dist/components/map-view/index.js +1 -1
  425. package/dist/components/matrix-rain/matrix-rain.d.ts +1 -1
  426. package/dist/components/message-card/index.js +1 -1
  427. package/dist/components/message-card/message-card.d.ts +1 -1
  428. package/dist/components/message-tray/index.js +1 -1
  429. package/dist/components/muscle-scheme/index.js +1 -1
  430. package/dist/components/muscle-scheme/muscle-scheme.d.ts.map +1 -1
  431. package/dist/components/notes-panel/index.js +1 -1
  432. package/dist/components/notification-card/index.js +1 -1
  433. package/dist/components/notification-card/notification-card.d.ts +1 -1
  434. package/dist/components/notification-tray/index.js +1 -1
  435. package/dist/components/operator-hero/operator-hero.d.ts +1 -1
  436. package/dist/components/optical-prescription/index.d.ts +4 -2
  437. package/dist/components/optical-prescription/index.d.ts.map +1 -1
  438. package/dist/components/optical-prescription/index.js +29 -26
  439. package/dist/components/optical-prescription/optical-prescription-charts.d.ts +78 -0
  440. package/dist/components/optical-prescription/optical-prescription-charts.d.ts.map +1 -0
  441. package/dist/components/optical-prescription/optical-prescription-data.d.ts +29 -0
  442. package/dist/components/optical-prescription/optical-prescription-data.d.ts.map +1 -1
  443. package/dist/components/optical-prescription/optical-prescription.agent.d.ts.map +1 -1
  444. package/dist/components/optical-prescription/optical-prescription.d.ts +9 -0
  445. package/dist/components/optical-prescription/optical-prescription.d.ts.map +1 -1
  446. package/dist/components/patient-details/index.js +1 -1
  447. package/dist/components/patient-search/index.js +1 -1
  448. package/dist/components/patient-search/patient-search.d.ts.map +1 -1
  449. package/dist/components/patient-summary-card/index.js +1 -1
  450. package/dist/components/patient-summary-card/patient-summary-card.d.ts +1 -1
  451. package/dist/components/patient-table/columns.d.ts.map +1 -1
  452. package/dist/components/patient-table/index.js +1 -1
  453. package/dist/components/payment-card/index.js +1 -1
  454. package/dist/components/payment-card/payment-card.d.ts +1 -1
  455. package/dist/components/payment-card/payment-request-card.d.ts +1 -1
  456. package/dist/components/periodontal-chart/index.d.ts +6 -0
  457. package/dist/components/periodontal-chart/index.d.ts.map +1 -0
  458. package/dist/components/periodontal-chart/index.js +22 -0
  459. package/dist/components/periodontal-chart/index.js.map +1 -0
  460. package/dist/components/periodontal-chart/periodontal-chart-data.d.ts +119 -0
  461. package/dist/components/periodontal-chart/periodontal-chart-data.d.ts.map +1 -0
  462. package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts +4 -0
  463. package/dist/components/periodontal-chart/periodontal-chart.agent.d.ts.map +1 -0
  464. package/dist/components/periodontal-chart/periodontal-chart.d.ts +69 -0
  465. package/dist/components/periodontal-chart/periodontal-chart.d.ts.map +1 -0
  466. package/dist/components/periodontal-chart-card/index.js +1 -1
  467. package/dist/components/periodontal-chart-card/periodontal-chart-card.d.ts +1 -1
  468. package/dist/components/periodontal-diagnosis/index.d.ts +6 -0
  469. package/dist/components/periodontal-diagnosis/index.d.ts.map +1 -0
  470. package/dist/components/periodontal-diagnosis/index.js +13 -0
  471. package/dist/components/periodontal-diagnosis/index.js.map +1 -0
  472. package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts +30 -0
  473. package/dist/components/periodontal-diagnosis/periodontal-diagnosis-data.d.ts.map +1 -0
  474. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts +4 -0
  475. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.agent.d.ts.map +1 -0
  476. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts +44 -0
  477. package/dist/components/periodontal-diagnosis/periodontal-diagnosis.d.ts.map +1 -0
  478. package/dist/components/periodontal-risk-chart/index.d.ts +6 -0
  479. package/dist/components/periodontal-risk-chart/index.d.ts.map +1 -0
  480. package/dist/components/periodontal-risk-chart/index.js +9 -0
  481. package/dist/components/periodontal-risk-chart/index.js.map +1 -0
  482. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts +4 -0
  483. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.agent.d.ts.map +1 -0
  484. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts +28 -0
  485. package/dist/components/periodontal-risk-chart/periodontal-risk-chart.d.ts.map +1 -0
  486. package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts +47 -0
  487. package/dist/components/periodontal-risk-chart/periodontal-risk-data.d.ts.map +1 -0
  488. package/dist/components/popover/index.js +1 -1
  489. package/dist/components/popover/popover.d.ts +1 -0
  490. package/dist/components/popover/popover.d.ts.map +1 -1
  491. package/dist/components/practice-results/index.js +1 -1
  492. package/dist/components/pregnancy-dating/index.js +1 -1
  493. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  494. package/dist/components/privacy-lock/index.js +1 -1
  495. package/dist/components/product-hub-tray/index.js +1 -1
  496. package/dist/components/product-hub-tray/product-hub-panel.d.ts +1 -1
  497. package/dist/components/public-header/index.js +1 -1
  498. package/dist/components/public-header/public-header.d.ts +1 -1
  499. package/dist/components/public-header/public-header.d.ts.map +1 -1
  500. package/dist/components/radiograph-panel/index.js +1 -1
  501. package/dist/components/radiograph-panel/radiograph-panel.d.ts +2 -2
  502. package/dist/components/radiograph-panel/radiograph-panel.d.ts.map +1 -1
  503. package/dist/components/reviews-panel/index.js +1 -1
  504. package/dist/components/rich-text-editor/index.js +1 -1
  505. package/dist/components/select/index.js +1 -1
  506. package/dist/components/select/select.d.ts.map +1 -1
  507. package/dist/components/session-countdown/index.js +1 -1
  508. package/dist/components/sheet/index.js +1 -1
  509. package/dist/components/sidebar/index.js +1 -1
  510. package/dist/components/sidebar/sidebar.d.ts +9 -0
  511. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  512. package/dist/components/sign-document/index.js +1 -1
  513. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  514. package/dist/components/signature-capture/index.js +1 -1
  515. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  516. package/dist/components/signature-field/index.js +1 -1
  517. package/dist/components/signature-field/signature-field.d.ts +7 -0
  518. package/dist/components/signature-field/signature-field.d.ts.map +1 -1
  519. package/dist/components/skeleton-scheme/index.js +1186 -0
  520. package/dist/components/skeleton-scheme/index.js.map +1 -0
  521. package/dist/components/slot-grid/index.js +1 -1
  522. package/dist/components/stat/stat.d.ts +1 -1
  523. package/dist/components/streaming-text/index.js +1 -1
  524. package/dist/components/tabs/index.js +1 -1
  525. package/dist/components/task-tray/index.js +1 -1
  526. package/dist/components/tasks-panel/index.js +1 -1
  527. package/dist/components/theme-toggle/index.js +1 -1
  528. package/dist/components/toast/index.js +1 -1
  529. package/dist/components/token-insert-menu/index.js +1 -1
  530. package/dist/components/tool-rail/index.js +1 -1
  531. package/dist/components/tooth-scheme/index.js +29 -28
  532. package/dist/components/tooth-scheme/index.js.map +1 -1
  533. package/dist/components/transaction-chip/index.js +1 -1
  534. package/dist/components/unit-converter/index.js +1 -1
  535. package/dist/components/warning-stack/index.js +1 -1
  536. package/dist/components/workflow/index.js +1 -1
  537. package/dist/hooks/index.d.ts +2 -0
  538. package/dist/hooks/index.d.ts.map +1 -1
  539. package/dist/hooks/index.js +40 -35
  540. package/dist/hooks/index.js.map +1 -1
  541. package/dist/hooks/use-priority-overflow.d.ts +63 -0
  542. package/dist/hooks/use-priority-overflow.d.ts.map +1 -0
  543. package/dist/hooks/use-visual-viewport-pin.d.ts +32 -0
  544. package/dist/hooks/use-visual-viewport-pin.d.ts.map +1 -0
  545. package/dist/i18n/locales/ar.d.ts +490 -9
  546. package/dist/i18n/locales/ar.d.ts.map +1 -1
  547. package/dist/i18n/locales/ar.js +493 -12
  548. package/dist/i18n/locales/ar.js.map +1 -1
  549. package/dist/i18n/locales/de.d.ts +490 -9
  550. package/dist/i18n/locales/de.d.ts.map +1 -1
  551. package/dist/i18n/locales/de.js +493 -12
  552. package/dist/i18n/locales/de.js.map +1 -1
  553. package/dist/i18n/locales/el.d.ts +490 -9
  554. package/dist/i18n/locales/el.d.ts.map +1 -1
  555. package/dist/i18n/locales/el.js +493 -12
  556. package/dist/i18n/locales/el.js.map +1 -1
  557. package/dist/i18n/locales/en.d.ts +490 -9
  558. package/dist/i18n/locales/en.d.ts.map +1 -1
  559. package/dist/i18n/locales/en.js +493 -12
  560. package/dist/i18n/locales/en.js.map +1 -1
  561. package/dist/i18n/locales/es.d.ts +490 -9
  562. package/dist/i18n/locales/es.d.ts.map +1 -1
  563. package/dist/i18n/locales/es.js +493 -12
  564. package/dist/i18n/locales/es.js.map +1 -1
  565. package/dist/i18n/locales/fr.d.ts +490 -9
  566. package/dist/i18n/locales/fr.d.ts.map +1 -1
  567. package/dist/i18n/locales/fr.js +493 -12
  568. package/dist/i18n/locales/fr.js.map +1 -1
  569. package/dist/i18n/locales/hi.d.ts +490 -9
  570. package/dist/i18n/locales/hi.d.ts.map +1 -1
  571. package/dist/i18n/locales/hi.js +493 -12
  572. package/dist/i18n/locales/hi.js.map +1 -1
  573. package/dist/i18n/locales/it.d.ts +490 -9
  574. package/dist/i18n/locales/it.d.ts.map +1 -1
  575. package/dist/i18n/locales/it.js +493 -12
  576. package/dist/i18n/locales/it.js.map +1 -1
  577. package/dist/i18n/locales/ja.d.ts +490 -9
  578. package/dist/i18n/locales/ja.d.ts.map +1 -1
  579. package/dist/i18n/locales/ja.js +493 -12
  580. package/dist/i18n/locales/ja.js.map +1 -1
  581. package/dist/i18n/locales/nl.d.ts +490 -9
  582. package/dist/i18n/locales/nl.d.ts.map +1 -1
  583. package/dist/i18n/locales/nl.js +493 -12
  584. package/dist/i18n/locales/nl.js.map +1 -1
  585. package/dist/i18n/locales/pl.d.ts +490 -9
  586. package/dist/i18n/locales/pl.d.ts.map +1 -1
  587. package/dist/i18n/locales/pl.js +493 -12
  588. package/dist/i18n/locales/pl.js.map +1 -1
  589. package/dist/i18n/locales/pt.d.ts +490 -9
  590. package/dist/i18n/locales/pt.d.ts.map +1 -1
  591. package/dist/i18n/locales/pt.js +493 -12
  592. package/dist/i18n/locales/pt.js.map +1 -1
  593. package/dist/i18n/locales/ro.d.ts +490 -9
  594. package/dist/i18n/locales/ro.d.ts.map +1 -1
  595. package/dist/i18n/locales/ro.js +493 -12
  596. package/dist/i18n/locales/ro.js.map +1 -1
  597. package/dist/i18n/locales/ru.d.ts +490 -9
  598. package/dist/i18n/locales/ru.d.ts.map +1 -1
  599. package/dist/i18n/locales/ru.js +493 -12
  600. package/dist/i18n/locales/ru.js.map +1 -1
  601. package/dist/i18n/locales/sq.d.ts +490 -9
  602. package/dist/i18n/locales/sq.d.ts.map +1 -1
  603. package/dist/i18n/locales/sq.js +493 -12
  604. package/dist/i18n/locales/sq.js.map +1 -1
  605. package/dist/i18n/locales/sv.d.ts +490 -9
  606. package/dist/i18n/locales/sv.d.ts.map +1 -1
  607. package/dist/i18n/locales/sv.js +493 -12
  608. package/dist/i18n/locales/sv.js.map +1 -1
  609. package/dist/i18n/locales/tr.d.ts +490 -9
  610. package/dist/i18n/locales/tr.d.ts.map +1 -1
  611. package/dist/i18n/locales/tr.js +493 -12
  612. package/dist/i18n/locales/tr.js.map +1 -1
  613. package/dist/i18n/locales/zh.d.ts +490 -9
  614. package/dist/i18n/locales/zh.d.ts.map +1 -1
  615. package/dist/i18n/locales/zh.js +493 -12
  616. package/dist/i18n/locales/zh.js.map +1 -1
  617. package/dist/index.js +872 -809
  618. package/dist/index.js.map +1 -1
  619. package/dist/locales/ar.json +493 -12
  620. package/dist/locales/de.json +493 -12
  621. package/dist/locales/el.json +493 -12
  622. package/dist/locales/en.json +493 -12
  623. package/dist/locales/es.json +493 -12
  624. package/dist/locales/fr.json +493 -12
  625. package/dist/locales/hi.json +493 -12
  626. package/dist/locales/it.json +493 -12
  627. package/dist/locales/ja.json +493 -12
  628. package/dist/locales/nl.json +493 -12
  629. package/dist/locales/pl.json +493 -12
  630. package/dist/locales/pt.json +493 -12
  631. package/dist/locales/ro.json +493 -12
  632. package/dist/locales/ru.json +493 -12
  633. package/dist/locales/sq.json +493 -12
  634. package/dist/locales/sv.json +493 -12
  635. package/dist/locales/tr.json +493 -12
  636. package/dist/locales/zh.json +493 -12
  637. package/dist/patterns/alia-assistant/index.js +1 -1
  638. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  639. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +1 -1
  640. package/dist/patterns/signature-request/index.d.ts +3 -0
  641. package/dist/patterns/signature-request/index.d.ts.map +1 -0
  642. package/dist/patterns/signature-request/index.js +5 -0
  643. package/dist/patterns/signature-request/index.js.map +1 -0
  644. package/dist/patterns/signature-request/signature-request.d.ts +81 -0
  645. package/dist/patterns/signature-request/signature-request.d.ts.map +1 -0
  646. package/dist/tokens.css +2 -2
  647. package/package.json +32 -4
  648. package/dist/_chunks/benefit-card-Xnxj4Gmo.js.map +0 -1
  649. package/dist/_chunks/button-DD_0Xdmr.js.map +0 -1
  650. package/dist/_chunks/button-group-CvEnVzY7.js +0 -119
  651. package/dist/_chunks/button-group-CvEnVzY7.js.map +0 -1
  652. package/dist/_chunks/columns-2-8lq4-b8e.js.map +0 -1
  653. package/dist/_chunks/document-scanner-B23j4w7X.js.map +0 -1
  654. package/dist/_chunks/face-scheme-BT9_KdL0.js +0 -1450
  655. package/dist/_chunks/face-scheme-BT9_KdL0.js.map +0 -1
  656. package/dist/_chunks/file-upload-Kw1rdvFw.js.map +0 -1
  657. package/dist/_chunks/finished-terminal-Di4gtZ50.js.map +0 -1
  658. package/dist/_chunks/freemium-paywall-DFoeedwh.js.map +0 -1
  659. package/dist/_chunks/header-DaXWDw0M.js.map +0 -1
  660. package/dist/_chunks/icon-button-group-C48khLE0.js +0 -206
  661. package/dist/_chunks/icon-button-group-C48khLE0.js.map +0 -1
  662. package/dist/_chunks/insert-result-C7xSDb8q.js.map +0 -1
  663. package/dist/_chunks/link-cell-renderer-BCppbMec.js +0 -2185
  664. package/dist/_chunks/link-cell-renderer-BCppbMec.js.map +0 -1
  665. package/dist/_chunks/marketplace-app-shell-BCYiOvKZ.js.map +0 -1
  666. package/dist/_chunks/optical-prescription-Bmlbuopi.js +0 -653
  667. package/dist/_chunks/optical-prescription-Bmlbuopi.js.map +0 -1
  668. package/dist/_chunks/patient-search-X9SUZGpy.js.map +0 -1
  669. package/dist/_chunks/patient-shell-oiIRqEAl.js +0 -162
  670. package/dist/_chunks/patient-shell-oiIRqEAl.js.map +0 -1
  671. package/dist/_chunks/patient-table-BgWgNIMf.js.map +0 -1
  672. package/dist/_chunks/public-header.agent-C-opZaOw.js.map +0 -1
  673. package/dist/_chunks/radiograph-panel.agent-D1x33moc.js.map +0 -1
  674. package/dist/_chunks/rich-text-editor-DUgznqOf.js.map +0 -1
  675. package/dist/_chunks/sidebar-B0OBmJrC.js.map +0 -1
  676. package/dist/_chunks/signature-capture-Ct_4Md4e.js.map +0 -1
  677. package/dist/_chunks/signature-field-jgwYgUhO.js.map +0 -1
  678. package/dist/_chunks/subDays-DGSOp9d9.js +0 -8
  679. package/dist/_chunks/tooth-scheme-D_rso4uu.js +0 -2133
  680. package/dist/_chunks/tooth-scheme-D_rso4uu.js.map +0 -1
  681. package/dist/_chunks/transaction-chip-B6iWoVmU.js.map +0 -1
  682. package/dist/patterns/patient-shell/index.d.ts +0 -12
  683. package/dist/patterns/patient-shell/index.d.ts.map +0 -1
  684. package/dist/patterns/patient-shell/index.js +0 -5
  685. package/dist/patterns/patient-shell/patient-shell.d.ts +0 -62
  686. package/dist/patterns/patient-shell/patient-shell.d.ts.map +0 -1
  687. /package/dist/{patterns/patient-shell → components/data-table-tabs}/index.js.map +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button-group-C_lqXTAj.js","sources":["../../src/components/icon-button-group/icon-button-group.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Ellipsis } from 'lucide-react';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport type { ButtonProps } from '../button/button';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\nimport { usePriorityOverflow } from '../../hooks/use-priority-overflow';\n\ntype ButtonIntent = NonNullable<ButtonProps['intent']>;\n\n// Intentionally does NOT compose `@radix-ui/react-toggle-group`. Radix\n// ToggleGroup's render shape makes it hard to layer shared-border chrome\n// across children (first-child / last-child / internal-divider CSS), and\n// the three-mode + three-role matrix (group / toolbar / radiogroup × momentary\n// / toggle-single / toggle-multi) is broader than Radix's single / multi\n// contract. The roving-tabindex implementation below mirrors Radix's pattern\n// so keyboard semantics stay consistent. See 05-accessibility.mdx for the\n// WAI-ARIA toolbar / radiogroup references.\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst iconButtonGroupVariants = cva(\n [\n 'ds:inline-flex ds:isolate',\n // Hairline border around the group unifies the children into one\n // visual unit. Internal child dividers are drawn via the per-child\n // class list below.\n 'ds:border ds:border-border',\n 'ds:rounded-[var(--radius-md)]',\n // Ensure the focus ring of a pressed child sits above its siblings.\n 'ds:[&>*]:relative ds:[&>*:focus-visible]:z-10',\n ].join(' '),\n {\n variants: {\n orientation: {\n horizontal: [\n 'ds:flex-row',\n // Flatten internal corners on children so the outer radius owns\n // the rounded edges.\n 'ds:[&>*:not(:first-child)]:rounded-s-none',\n 'ds:[&>*:not(:last-child)]:rounded-e-none',\n // Internal divider — logical so it flips in RTL.\n 'ds:[&>*:not(:first-child)]:border-s',\n 'ds:[&>*:not(:first-child)]:border-border',\n // The children already own an outer border (from IconButton's\n // own border in secondary/outline variants). Collapse the doubled\n // border so we don't get a 2px seam.\n 'ds:[&>*]:border-0',\n ].join(' '),\n vertical: [\n 'ds:flex-col',\n // Vertical groups flow block-wise. Reading direction doesn't\n // invert vertical stacks in any locale this DS targets, so the\n // physical `rounded-t/b` is intentional.\n 'ds:[&>*:not(:first-child)]:rounded-t-none',\n 'ds:[&>*:not(:last-child)]:rounded-b-none',\n 'ds:[&>*:not(:first-child)]:border-t',\n 'ds:[&>*:not(:first-child)]:border-border',\n 'ds:[&>*]:border-0',\n ].join(' '),\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n);\n\n// Hidden measurement rows: laid out (so widths are real) but invisible,\n// non-interactive and out of the a11y tree. Never display:none.\nconst MEASURE_ROW_CLASSES =\n 'ds:absolute ds:start-0 ds:top-0 ds:invisible ds:pointer-events-none';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type IconButtonGroupRole = 'group' | 'toolbar' | 'radiogroup';\nexport type IconButtonGroupMode =\n | 'momentary'\n | 'toggle-single'\n | 'toggle-multi';\n\ntype SharedPropsBase = {\n /** Forwarded to every child that does not set its own `size`. */\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /** Disables every child. Uses `aria-disabled` on children (not the HTML\n * attribute) so each child still takes focus — matches WAI-ARIA toolbar\n * guidance. Visual disabled styling picks up the `aria-disabled:*`\n * variant declared on the Button base class. */\n disabled?: boolean;\n /** Intent applied to every child that does not set its own `intent`.\n * Defaults to `outline` — grouped icon buttons are peers, not a row\n * of solid-primary CTAs. */\n intent?: ButtonIntent;\n /** `'menu'` keeps the strip on one line whatever the container width:\n * children that stop fitting move into a dropdown behind an ellipsis\n * trigger, preserving toggle semantics (radio / checkbox items). The\n * group then fills its container's inline size. Horizontal only.\n * Children set `data-overflow-pin` to always stay in the strip. */\n overflow?: 'none' | 'menu';\n children: ReactNode;\n};\n\n// At least one of `aria-label` / `aria-labelledby` must be present. This\n// discriminated pair makes the TypeScript compiler reject a group with\n// neither — see the a11y acceptance criteria in the user story.\ntype AccessibleNameProps =\n | { 'aria-label': string; 'aria-labelledby'?: never }\n | { 'aria-label'?: never; 'aria-labelledby': string };\n\ntype SharedProps = SharedPropsBase & AccessibleNameProps;\n\n// Role + mode combinations are not all valid. Encoded via a discriminated\n// union so the compiler rejects nonsensical pairings (e.g. a multi-select\n// radiogroup).\ntype GroupRoleProps =\n | { role?: 'group'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'toolbar'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'radiogroup'; mode: 'toggle-single' };\n\ntype MomentaryProps = SharedProps & {\n mode?: 'momentary';\n value?: never;\n defaultValue?: never;\n onValueChange?: never;\n};\n\ntype ToggleSingleProps = SharedProps & {\n mode: 'toggle-single';\n value?: string;\n defaultValue?: string;\n onValueChange?: (next: string) => void;\n};\n\ntype ToggleMultiProps = SharedProps & {\n mode: 'toggle-multi';\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (next: string[]) => void;\n};\n\nexport type IconButtonGroupProps = (\n | MomentaryProps\n | ToggleSingleProps\n | ToggleMultiProps\n) &\n GroupRoleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'onChange' | 'children'> &\n VariantProps<typeof iconButtonGroupVariants>;\n\n/* ------------------------------------------------------------------ */\n/* IconButtonGroup */\n/* ------------------------------------------------------------------ */\n\nexport const IconButtonGroup = forwardRef<HTMLDivElement, IconButtonGroupProps>(\n (props, ref) => {\n const {\n size,\n orientation = 'horizontal',\n role = 'group',\n mode = 'momentary',\n disabled = false,\n intent = 'outline',\n overflow = 'none',\n className,\n children,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Controlled-value props are consumed via `props as …` below; strip them\n // here so they never spread onto the root <div> (React would warn that\n // `onValueChange` is an unknown DOM event handler).\n value: _value,\n defaultValue: _defaultValue,\n onValueChange: _onValueChange,\n ...rest\n } = props as IconButtonGroupProps & { className?: string };\n const { t } = useTranslation();\n\n if (import.meta.env.DEV && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n 'IconButtonGroup: `aria-label` or `aria-labelledby` is required for accessibility.',\n );\n }\n if (\n import.meta.env.DEV &&\n overflow === 'menu' &&\n orientation === 'vertical'\n ) {\n console.warn(\n 'IconButtonGroup: overflow=\"menu\" is horizontal-only; falling back to overflow=\"none\".',\n );\n }\n const overflowEnabled = overflow === 'menu' && orientation !== 'vertical';\n\n /* ---- Controlled / uncontrolled value for toggle modes --------- */\n const [internalValue, setInternalValue] = useState<string | string[]>(\n () => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.defaultValue ?? '';\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.defaultValue ?? [];\n }\n return '';\n },\n );\n\n const resolvedValue: string | string[] = (() => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n return '';\n })();\n\n const commitValue = useCallback(\n (next: string | string[]) => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n if (p.value === undefined) setInternalValue(next as string);\n p.onValueChange?.(next as string);\n } else if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n if (p.value === undefined) setInternalValue(next as string[]);\n p.onValueChange?.(next as string[]);\n }\n },\n [mode, props],\n );\n\n /* ---- Roving tabindex state — only active in toolbar / radiogroup - */\n const rovingTabindex = role === 'toolbar' || role === 'radiogroup';\n const buttonsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusIndex, setFocusIndex] = useState(0);\n\n const registerIndex = useCallback(\n (index: number, el: HTMLButtonElement | null) => {\n buttonsRef.current[index] = el;\n },\n [],\n );\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isRTL, setIsRTL] = useState(false);\n // `useLayoutEffect` so the direction is correct BEFORE the first paint\n // (otherwise a user pressing an arrow key on the first frame after mount\n // would hit the default-LTR mapping even in an RTL document).\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const node = rootRef.current;\n if (!node) return;\n // Read the computed direction from the group's own wrapper so a\n // scoped `dir='rtl'` on any ancestor (not just <html>) flips arrow\n // navigation. `getComputedStyle` walks up automatically.\n const dir = window.getComputedStyle(node).direction;\n setIsRTL(dir === 'rtl');\n }, []);\n\n /* ---- Arrow-key navigation for roving tabindex ----------------- */\n const handleRootKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!rovingTabindex) return;\n const count = buttonsRef.current.filter(Boolean).length;\n if (count === 0) return;\n\n const forwardKey =\n orientation === 'vertical'\n ? 'ArrowDown'\n : isRTL\n ? 'ArrowLeft'\n : 'ArrowRight';\n const backwardKey =\n orientation === 'vertical'\n ? 'ArrowUp'\n : isRTL\n ? 'ArrowRight'\n : 'ArrowLeft';\n\n let next: number | null = null;\n if (event.key === forwardKey) next = (focusIndex + 1) % count;\n else if (event.key === backwardKey)\n next = (focusIndex - 1 + count) % count;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = count - 1;\n\n if (next === null) return;\n // Skip over disabled children.\n const maxAttempts = count;\n let attempts = 0;\n let candidate = next;\n while (attempts < maxAttempts) {\n const el = buttonsRef.current[candidate];\n if (\n el &&\n el.getAttribute('aria-disabled') !== 'true' &&\n !el.disabled\n ) {\n break;\n }\n candidate =\n event.key === backwardKey || event.key === 'End'\n ? (candidate - 1 + count) % count\n : (candidate + 1) % count;\n attempts += 1;\n }\n event.preventDefault();\n setFocusIndex(candidate);\n buttonsRef.current[candidate]?.focus();\n // WAI-ARIA radiogroup pattern: arrow keys MOVE focus AND CHANGE\n // the selected radio in one action. toolbar pattern (and plain\n // group) only moves focus.\n if (role === 'radiogroup' && mode === 'toggle-single') {\n const child = childArrayRef.current[candidate];\n if (child && typeof child === 'object' && 'props' in child) {\n const cValue = (child as ReactElement<{ value?: string }>).props\n .value;\n if (cValue) commitValue(cValue);\n }\n }\n },\n [rovingTabindex, orientation, isRTL, focusIndex, role, mode, commitValue],\n );\n\n /* ---- Overflow bookkeeping (menu mode only) --------------------- */\n type OverflowChildProps = IconButtonProps & {\n value?: string;\n 'data-overflow-pin'?: boolean | 'true' | '';\n };\n const allElements = overflowEnabled\n ? (Children.toArray(children).filter(isValidElement) as Array<\n ReactElement<OverflowChildProps>\n >)\n : [];\n const mirrorLabel = (child: ReactElement<OverflowChildProps>) => {\n const aria = child.props['aria-label'];\n if (typeof aria === 'string') return aria;\n return typeof child.props.tooltip === 'string'\n ? child.props.tooltip\n : null;\n };\n const warnedRef = useRef(false);\n const pinnedFlags = allElements.map((child) => {\n const explicit = child.props['data-overflow-pin'] !== undefined;\n const mirrorable = mirrorLabel(child) !== null;\n if (\n import.meta.env.DEV &&\n !explicit &&\n !mirrorable &&\n !warnedRef.current\n ) {\n warnedRef.current = true;\n console.warn(\n 'IconButtonGroup: a child without aria-label / tooltip cannot move into the overflow menu — it stays pinned in the strip.',\n );\n }\n return explicit || !mirrorable;\n });\n\n const { containerRef, fullRowRef, triggerProbeRef, visible, overflowing } =\n usePriorityOverflow({\n enabled: overflowEnabled,\n count: allElements.length,\n pinned: pinnedFlags,\n });\n\n const triggerNodeRef = useRef<HTMLButtonElement | null>(null);\n\n /* ---- Build enhanced children ---------------------------------- */\n const childArray = overflowEnabled\n ? allElements.filter((_, i) => visible[i])\n : Children.toArray(children);\n if (overflowEnabled) {\n buttonsRef.current.length = childArray.length + (overflowing ? 1 : 0);\n }\n // Mirror into a ref so the keydown handler (referenced from Memo deps)\n // can read the latest child list without inflating the dep array.\n const childArrayRef = useRef<ReturnType<typeof Children.toArray>>([]);\n childArrayRef.current = childArray;\n\n const visibleCount = childArray.length;\n // Clamp the roving focus when items move into the menu; hand real focus\n // to the trigger only when the focused node was the one that left.\n useEffect(() => {\n if (!rovingTabindex || !overflowEnabled) return;\n const total = visibleCount + (overflowing ? 1 : 0);\n if (total > 0 && focusIndex >= total) {\n setFocusIndex(total - 1);\n if (document.activeElement === document.body) {\n triggerNodeRef.current?.focus();\n }\n }\n }, [\n rovingTabindex,\n overflowEnabled,\n visibleCount,\n overflowing,\n focusIndex,\n ]);\n\n const enhanced = childArray.map((child, index) => {\n if (!isValidElement(child)) {\n if (import.meta.env.DEV) {\n console.warn(\n 'IconButtonGroup: children should be <IconButton> elements.',\n );\n }\n return child;\n }\n\n const childEl = child as ReactElement<\n IconButtonProps & {\n value?: string;\n asChild?: boolean;\n children?: ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n }\n >;\n\n // DEV-time sanity: warn if we got something that isn't an IconButton.\n // `React.cloneElement` would still work, but IconButton-specific\n // props (::before target size, forwarded tooltip) wouldn't apply.\n // `asChild` wrappers (e.g. DropdownMenu.Trigger) are fine when they\n // Slot-merge the cloned props onto their own IconButton child, as are\n // components that declare a static `rendersIconButton` marker (the\n // DataTable toolbar leaves — each renders one IconButton trigger and\n // forwards ref/tabIndex/onFocus to it).\n if (import.meta.env.DEV && childEl.type !== IconButton) {\n const slotChild =\n childEl.props.asChild === true ? childEl.props.children : null;\n const wrapsIconButton =\n isValidElement(slotChild) && slotChild.type === IconButton;\n const rendersIconButton =\n (childEl.type as { rendersIconButton?: boolean })\n .rendersIconButton === true;\n if (!wrapsIconButton && !rendersIconButton) {\n console.warn(\n 'IconButtonGroup: each child should be a DS <IconButton>. Other elements break target-size + focus-ring contracts.',\n );\n }\n }\n\n const childValue = childEl.props.value;\n\n // Compute aria-pressed / aria-checked for toggle modes.\n const { ariaPressed, ariaChecked } = computeToggleAria(\n mode,\n role,\n childValue,\n resolvedValue,\n );\n\n const groupDisabled = disabled === true;\n const childDisabled = childEl.props.disabled === true;\n\n // Click handling — wrap so aria-disabled (group-level) blocks\n // activation, then forward to the child's own onClick.\n const wrappedOnClick: React.MouseEventHandler<HTMLButtonElement> = (\n event,\n ) => {\n // aria-disabled is advisory; the native click still fires. Block\n // it explicitly when the GROUP (not the child) is disabled.\n if (groupDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n // Forward to the child's own handler first so consumers can run\n // analytics / preventDefault.\n childEl.props.onClick?.(event);\n if (event.defaultPrevented) return;\n if (!childValue) return;\n if (mode === 'toggle-single') {\n // Contract: exactly one pressed. Clicking the pressed one is a\n // no-op. This matches Radix ToggleGroup type='single' and the\n // radiogroup pattern.\n if (resolvedValue === childValue) return;\n commitValue(childValue);\n } else if (mode === 'toggle-multi') {\n const list = resolvedValue as string[];\n const next = list.includes(childValue)\n ? list.filter((v) => v !== childValue)\n : [...list, childValue];\n commitValue(next);\n }\n };\n\n // cloneElement's typed overload rejects `ref` as a prop, so we\n // build the override bag as `unknown` and cast to the element's\n // prop type. React at runtime routes `ref` via its usual channel.\n const setMergedRef = (node: HTMLButtonElement | null) => {\n registerIndex(index, node);\n const originalRef = (\n childEl as unknown as { ref?: React.Ref<HTMLButtonElement> }\n ).ref;\n if (typeof originalRef === 'function') originalRef(node);\n else if (\n originalRef !== null &&\n originalRef !== undefined &&\n typeof originalRef === 'object'\n ) {\n (\n originalRef as React.MutableRefObject<HTMLButtonElement | null>\n ).current = node;\n }\n };\n\n // Per the user story: group-level disabled injects `aria-disabled`\n // so the child stays focusable; child-level `disabled` still uses\n // the HTML attribute (child's own contract). When both are true\n // we leave the HTML disabled in place (strictest cue wins).\n const ariaDisabled = groupDisabled && !childDisabled ? true : undefined;\n\n // If the group is disabled OR we are in a toggle mode, we need the\n // wrapped click handler. In pure momentary mode with no group\n // disable, the child's own onClick is passed through unchanged.\n const needsWrappedClick = mode !== 'momentary' || groupDisabled;\n\n const overrides = {\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n disabled: childDisabled,\n 'aria-disabled': ariaDisabled,\n onClick: needsWrappedClick ? wrappedOnClick : childEl.props.onClick,\n 'aria-pressed': ariaPressed,\n 'aria-checked': ariaChecked,\n // When the group is a radiogroup, children must be `role=\"radio\"`\n // so screen readers announce them as radio buttons and so\n // `getByRole('radio')` works in tests. The button element is\n // re-purposed as a radio; `aria-checked` above carries the state.\n role: role === 'radiogroup' ? 'radio' : undefined,\n tabIndex: rovingTabindex ? (index === focusIndex ? 0 : -1) : undefined,\n onFocus: (ev: React.FocusEvent<HTMLButtonElement>) => {\n if (rovingTabindex) setFocusIndex(index);\n childEl.props.onFocus?.(ev);\n },\n ref: setMergedRef,\n } as unknown as Partial<IconButtonProps>;\n\n return cloneElement(childEl, overrides);\n });\n\n const mergedRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n if (!overflowEnabled) {\n return (\n <div\n ref={mergedRootRef}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={handleRootKeyDown}\n className={iconButtonGroupVariants({ orientation, className })}\n data-component=\"icon-button-group\"\n {...rest}\n >\n {enhanced}\n </div>\n );\n }\n\n /* ---- Menu path: measurement rows + strip + ellipsis trigger ---- */\n const moreLabel = t('buttonGroup.more', 'More options');\n const groupDisabled = disabled === true;\n const overflowItems = allElements\n .map((childEl, i) => ({ childEl, i }))\n .filter(({ i }) => !visible[i]);\n\n let menuContent: ReactNode = null;\n if (mode === 'toggle-single') {\n menuContent = (\n <DropdownMenu.RadioGroup\n value={resolvedValue as string}\n onValueChange={(v) => {\n if (!groupDisabled && v !== resolvedValue) commitValue(v);\n }}\n >\n {overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.RadioItem\n key={childEl.key ?? i}\n value={childEl.props.value ?? ''}\n disabled={groupDisabled || childEl.props.disabled === true}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n );\n } else if (mode === 'toggle-multi') {\n menuContent = overflowItems.map(({ childEl, i }) => {\n const v = childEl.props.value;\n const list = resolvedValue as string[];\n const checked = v ? list.includes(v) : false;\n return (\n <DropdownMenu.CheckboxItem\n key={childEl.key ?? i}\n checked={checked}\n disabled={groupDisabled || childEl.props.disabled === true}\n onCheckedChange={() => {\n if (groupDisabled || !v) return;\n commitValue(checked ? list.filter((x) => x !== v) : [...list, v]);\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.CheckboxItem>\n );\n });\n } else {\n menuContent = overflowItems.map(({ childEl, i }) => (\n <DropdownMenu.Item\n key={childEl.key ?? i}\n startIcon={childEl.props.icon}\n disabled={groupDisabled || childEl.props.disabled === true}\n onSelect={(event) => {\n childEl.props.onClick?.(\n event as unknown as React.MouseEvent<HTMLButtonElement>,\n );\n }}\n >\n {mirrorLabel(childEl)}\n </DropdownMenu.Item>\n ));\n }\n\n const trigger = overflowing ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n ref={(node: HTMLButtonElement | null) => {\n triggerNodeRef.current = node;\n registerIndex(visibleCount, node);\n }}\n tabIndex={\n rovingTabindex\n ? focusIndex === visibleCount\n ? 0\n : -1\n : undefined\n }\n onFocus={\n rovingTabindex ? () => setFocusIndex(visibleCount) : undefined\n }\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">{menuContent}</DropdownMenu.Content>\n </DropdownMenu.Root>\n ) : null;\n\n const stripClasses = iconButtonGroupVariants({ orientation });\n // A radiogroup may own only radios, so its trigger sits beside the strip;\n // toolbar / group keep the trigger inside as the last joined control.\n const triggerInside = role !== 'radiogroup';\n const stripDiv = (\n <div\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={triggerInside ? handleRootKeyDown : undefined}\n className={`${stripClasses} ds:max-w-full`}\n >\n {enhanced}\n {triggerInside ? trigger : null}\n </div>\n );\n\n return (\n <div\n ref={mergedRootRef}\n data-component=\"icon-button-group\"\n className={[\n 'ds:relative ds:block ds:w-full ds:min-w-0 ds:overflow-x-clip',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...rest}\n >\n <div ref={containerRef} className=\"ds:block ds:w-full ds:min-w-0\">\n <div\n ref={fullRowRef}\n aria-hidden=\"true\"\n inert\n className={`${MEASURE_ROW_CLASSES} ${stripClasses}`}\n >\n {allElements.map((childEl, i) =>\n cloneElement(childEl, {\n key: childEl.key ?? i,\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n tabIndex: -1,\n ref: null,\n } as Partial<OverflowChildProps>),\n )}\n </div>\n <span\n ref={triggerProbeRef}\n aria-hidden=\"true\"\n inert\n className={MEASURE_ROW_CLASSES}\n >\n <IconButton\n icon={<Ellipsis />}\n intent={intent}\n size={size}\n aria-label={moreLabel}\n tabIndex={-1}\n />\n </span>\n {triggerInside ? (\n stripDiv\n ) : (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- non-focusable wrapper; arrow-key roving bubbles up from the focusable IconButtons in the strip and the overflow trigger\n <div\n className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleRootKeyDown}\n >\n {stripDiv}\n {trigger}\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nIconButtonGroup.displayName = 'IconButtonGroup';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction computeToggleAria(\n mode: IconButtonGroupMode,\n role: IconButtonGroupRole,\n childValue: string | undefined,\n resolvedValue: string | string[],\n): { ariaPressed?: boolean; ariaChecked?: boolean } {\n if (mode === 'momentary' || !childValue) return {};\n\n const isActive =\n mode === 'toggle-multi'\n ? (resolvedValue as string[]).includes(childValue)\n : resolvedValue === childValue;\n\n // radiogroup uses aria-checked; toolbar/group use aria-pressed.\n if (role === 'radiogroup') {\n return { ariaChecked: isActive };\n }\n return { ariaPressed: isActive };\n}\n"],"names":["iconButtonGroupVariants","cva","MEASURE_ROW_CLASSES","IconButtonGroup","forwardRef","props","ref","size","orientation","role","mode","disabled","intent","overflow","className","children","ariaLabel","ariaLabelledBy","_value","_defaultValue","_onValueChange","rest","t","useTranslation","overflowEnabled","internalValue","setInternalValue","useState","resolvedValue","p","commitValue","useCallback","next","_a","_b","rovingTabindex","buttonsRef","useRef","focusIndex","setFocusIndex","registerIndex","index","el","rootRef","isRTL","setIsRTL","useIsomorphicLayoutEffect","node","dir","handleRootKeyDown","event","count","forwardKey","backwardKey","maxAttempts","attempts","candidate","child","childArrayRef","cValue","allElements","Children","isValidElement","mirrorLabel","aria","pinnedFlags","explicit","mirrorable","containerRef","fullRowRef","triggerProbeRef","visible","overflowing","usePriorityOverflow","triggerNodeRef","childArray","_","i","visibleCount","useEffect","total","enhanced","childEl","childValue","ariaPressed","ariaChecked","computeToggleAria","groupDisabled","childDisabled","wrappedOnClick","list","v","setMergedRef","originalRef","ariaDisabled","needsWrappedClick","overrides","ev","cloneElement","mergedRootRef","jsx","moreLabel","overflowItems","menuContent","DropdownMenu","checked","x","trigger","jsxs","IconButton","Ellipsis","stripClasses","triggerInside","stripDiv","isActive"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { jsxs as N, jsx as r } from "react/jsx-runtime";
2
2
  import { forwardRef as H, useState as y, useRef as h, useCallback as v, useMemo as b } from "react";
3
3
  import { c as M } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as F } from "react-i18next";
5
- import { P as k } from "./popover-uJ6BvEU3.js";
6
- import { B as D } from "./button-DD_0Xdmr.js";
5
+ import { P as k } from "./popover-Cc0a69sw.js";
6
+ import { B as D } from "./button-CPGiR_bH.js";
7
7
  import { T as E } from "./text-input-CUvCb6ST.js";
8
8
  import { u as G } from "./registry-DvAUVLHh.js";
9
9
  import { S as J } from "./search-QbWPlY5f.js";
@@ -269,4 +269,4 @@ export {
269
269
  X as I,
270
270
  U as i
271
271
  };
272
- //# sourceMappingURL=icon-picker-Di6uYDG-.js.map
272
+ //# sourceMappingURL=icon-picker-CM9ubkew.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"icon-picker-Di6uYDG-.js","sources":["../../src/components/icon-picker/icon-picker.agent.ts","../../src/components/icon-picker/icon-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — IconPicker. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { IconPickerHandle } from './icon-picker';\n\nexport const iconPickerAgent: AgentAdapter<IconPickerHandle> = {\n id: 'icon-picker',\n capabilities: ['pick', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.value',\n description:\n 'Id of the currently selected icon, or an empty string when nothing is picked.',\n read: (handle) => handle.getValue(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.iconPicker.state.isOpen',\n description: 'True when the picker popover is currently open.',\n read: (handle) => handle.isOpen(),\n },\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.query',\n description: 'Current search query filtering the icon grid by label.',\n read: (handle) => handle.getQuery(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Id of an icon in the supplied `icons` set.',\n },\n },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.setValue',\n description: 'Select the icon with the given id.',\n examples: [{ args: { id: 'star' }, note: 'Pick the \"star\" icon.' }],\n invoke: (handle, args: { id: string }) => {\n handle.setValue(args.id);\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.open',\n description: 'Open the picker popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.close',\n description: 'Close the picker popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n filter: {\n safety: 'write',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Case-insensitive substring matched against icon labels.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.filter',\n description: 'Filter the icon grid to labels containing the query.',\n examples: [\n {\n args: { query: 'star' },\n note: 'Show icons whose label contains \"star\".',\n },\n ],\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'icon-picker',\n description: 'Marks the IconPicker trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { Button } from '../button/button';\nimport { TextInput } from '../text-input/text-input';\nimport { useAgentRegistration } from '../../agent';\nimport { iconPickerAgent } from './icon-picker.agent';\n\n/** One selectable glyph. `label` is the accessible name (consumer-localised);\n * `node` is the rendered lucide/SVG element. */\nexport interface IconPickerIcon {\n id: string;\n label: string;\n node: ReactNode;\n}\n\n/** Agent-readiness curated handle for IconPicker. */\nexport interface IconPickerHandle {\n getValue: () => string;\n setValue: (id: string) => void;\n isOpen: () => boolean;\n open: () => void;\n close: () => void;\n getQuery: () => string;\n setQuery: (query: string) => void;\n}\n\nexport interface IconPickerProps {\n /** The glyph set. `label` is each glyph's accessible name. */\n icons: IconPickerIcon[];\n /** Controlled selected icon id. Pair with onChange. */\n value?: string;\n /** Uncontrolled initial selected icon id. */\n defaultValue?: string;\n /** Fires with the chosen icon id when a glyph is picked. */\n onChange?: (id: string) => void;\n /** Shown on the trigger when nothing is selected. */\n placeholder?: ReactNode;\n disabled?: boolean;\n id?: string;\n className?: string;\n /** Trigger accessible name. Defaults to the bundled `iconPicker.trigger`. */\n 'aria-label'?: string;\n}\n\n// Selectable glyph cell. The only variant is selection state — selected cells\n// take a tokenised highlight (primary border + muted fill); `aria-pressed`\n// carries the state non-visually so it never reads by colour alone.\nconst optionVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center',\n 'ds:size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:text-foreground ds:bg-transparent',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:[&_svg]:size-5',\n ].join(' '),\n {\n variants: {\n selected: {\n true: 'ds:border-primary ds:bg-muted',\n false: 'ds:border-transparent',\n },\n },\n defaultVariants: { selected: false },\n },\n);\n\nexport const IconPicker = forwardRef<HTMLButtonElement, IconPickerProps>(\n function IconPicker(\n {\n icons,\n value,\n defaultValue,\n onChange,\n placeholder,\n disabled,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n // Live snapshots for the synchronous agent handle.\n const currentValueRef = useRef(currentValue);\n currentValueRef.current = currentValue;\n const openRef = useRef(open);\n openRef.current = open;\n const queryRef = useRef(query);\n queryRef.current = query;\n\n const handleOpenChange = useCallback((next: boolean) => {\n setOpen(next);\n // Reset the filter when the popover closes so the next open starts fresh.\n if (!next) setQuery('');\n }, []);\n\n const setValueImperative = useCallback(\n (iconId: string) => {\n if (!isControlled) setInternalValue(iconId);\n onChange?.(iconId);\n },\n [isControlled, onChange],\n );\n\n const handleSelect = useCallback(\n (iconId: string) => {\n setValueImperative(iconId);\n handleOpenChange(false);\n },\n [setValueImperative, handleOpenChange],\n );\n\n const agentHandle = useMemo<IconPickerHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (iconId) => setValueImperative(iconId),\n isOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n getQuery: () => queryRef.current,\n setQuery: (next) => setQuery(next),\n }),\n [setValueImperative, handleOpenChange],\n );\n useAgentRegistration(iconPickerAgent, agentHandle, id);\n\n const selectedIcon = useMemo(\n () => icons.find((icon) => icon.id === currentValue),\n [icons, currentValue],\n );\n\n const normalisedQuery = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n normalisedQuery\n ? icons.filter((icon) =>\n icon.label.toLowerCase().includes(normalisedQuery),\n )\n : icons,\n [icons, normalisedQuery],\n );\n\n const triggerLabel = ariaLabel ?? t('iconPicker.trigger');\n const resolvedPlaceholder = placeholder ?? t('iconPicker.trigger');\n\n return (\n <Popover.Root open={open} onOpenChange={handleOpenChange} id={id}>\n <Popover.Trigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n intent=\"outline\"\n disabled={disabled}\n aria-label={triggerLabel}\n className={className}\n data-component=\"icon-picker\"\n data-component-id={id}\n >\n {selectedIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-5\"\n >\n {selectedIcon.node}\n </span>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:text-muted-foreground\">\n {resolvedPlaceholder}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Content\n align=\"start\"\n showArrow={false}\n aria-label={triggerLabel}\n className=\"ds:w-72\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <TextInput\n size=\"sm\"\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setQuery(event.target.value)\n }\n placeholder={t('iconPicker.search')}\n aria-label={t('iconPicker.search')}\n startAdornment={<Search />}\n clearable\n onClear={() => setQuery('')}\n autoComplete=\"off\"\n />\n\n {filtered.length === 0 ? (\n <p\n role=\"status\"\n className=\"type-body-sm ds:text-muted-foreground ds:text-center ds:py-[var(--spacing-sm)]\"\n >\n {t('iconPicker.noResults')}\n </p>\n ) : (\n <div\n role=\"group\"\n aria-label={triggerLabel}\n className=\"ds:grid ds:grid-cols-5 ds:gap-[var(--spacing-xs)] ds:max-h-64 ds:overflow-y-auto\"\n >\n {filtered.map((icon) => {\n const selected = icon.id === currentValue;\n return (\n <button\n key={icon.id}\n type=\"button\"\n aria-label={icon.label}\n aria-pressed={selected}\n onClick={() => handleSelect(icon.id)}\n className={optionVariants({ selected })}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex\">\n {icon.node}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\n\nIconPicker.displayName = 'IconPicker';\n\nexport { optionVariants as iconPickerOptionVariants };\n"],"names":["iconPickerAgent","handle","args","optionVariants","cva","IconPicker","forwardRef","icons","value","defaultValue","onChange","placeholder","disabled","id","className","ariaLabel","ref","t","useTranslation","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","query","setQuery","currentValueRef","useRef","openRef","queryRef","handleOpenChange","useCallback","next","setValueImperative","iconId","handleSelect","agentHandle","useMemo","useAgentRegistration","selectedIcon","icon","normalisedQuery","filtered","triggerLabel","resolvedPlaceholder","Popover","jsx","Button","jsxs","TextInput","event","Search","selected"],"mappings":"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"}
1
+ {"version":3,"file":"icon-picker-CM9ubkew.js","sources":["../../src/components/icon-picker/icon-picker.agent.ts","../../src/components/icon-picker/icon-picker.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — IconPicker. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { IconPickerHandle } from './icon-picker';\n\nexport const iconPickerAgent: AgentAdapter<IconPickerHandle> = {\n id: 'icon-picker',\n capabilities: ['pick', 'filter', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.value',\n description:\n 'Id of the currently selected icon, or an empty string when nothing is picked.',\n read: (handle) => handle.getValue(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.iconPicker.state.isOpen',\n description: 'True when the picker popover is currently open.',\n read: (handle) => handle.isOpen(),\n },\n query: {\n type: 'string',\n descriptionKey: 'ui.agent.iconPicker.state.query',\n description: 'Current search query filtering the icon grid by label.',\n read: (handle) => handle.getQuery(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ id: string }',\n argsSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Id of an icon in the supplied `icons` set.',\n },\n },\n required: ['id'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.setValue',\n description: 'Select the icon with the given id.',\n examples: [{ args: { id: 'star' }, note: 'Pick the \"star\" icon.' }],\n invoke: (handle, args: { id: string }) => {\n handle.setValue(args.id);\n },\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.open',\n description: 'Open the picker popover.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.close',\n description: 'Close the picker popover.',\n invoke: (handle) => {\n handle.close();\n },\n },\n filter: {\n safety: 'write',\n argsType: '{ query: string }',\n argsSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Case-insensitive substring matched against icon labels.',\n },\n },\n required: ['query'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.iconPicker.actions.filter',\n description: 'Filter the icon grid to labels containing the query.',\n examples: [\n {\n args: { query: 'star' },\n note: 'Show icons whose label contains \"star\".',\n },\n ],\n invoke: (handle, args: { query: string }) => {\n handle.setQuery(args.query);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'icon-picker',\n description: 'Marks the IconPicker trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Search } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { Button } from '../button/button';\nimport { TextInput } from '../text-input/text-input';\nimport { useAgentRegistration } from '../../agent';\nimport { iconPickerAgent } from './icon-picker.agent';\n\n/** One selectable glyph. `label` is the accessible name (consumer-localised);\n * `node` is the rendered lucide/SVG element. */\nexport interface IconPickerIcon {\n id: string;\n label: string;\n node: ReactNode;\n}\n\n/** Agent-readiness curated handle for IconPicker. */\nexport interface IconPickerHandle {\n getValue: () => string;\n setValue: (id: string) => void;\n isOpen: () => boolean;\n open: () => void;\n close: () => void;\n getQuery: () => string;\n setQuery: (query: string) => void;\n}\n\nexport interface IconPickerProps {\n /** The glyph set. `label` is each glyph's accessible name. */\n icons: IconPickerIcon[];\n /** Controlled selected icon id. Pair with onChange. */\n value?: string;\n /** Uncontrolled initial selected icon id. */\n defaultValue?: string;\n /** Fires with the chosen icon id when a glyph is picked. */\n onChange?: (id: string) => void;\n /** Shown on the trigger when nothing is selected. */\n placeholder?: ReactNode;\n disabled?: boolean;\n id?: string;\n className?: string;\n /** Trigger accessible name. Defaults to the bundled `iconPicker.trigger`. */\n 'aria-label'?: string;\n}\n\n// Selectable glyph cell. The only variant is selection state — selected cells\n// take a tokenised highlight (primary border + muted fill); `aria-pressed`\n// carries the state non-visually so it never reads by colour alone.\nconst optionVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:items-center ds:justify-center',\n 'ds:size-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:border ds:text-foreground ds:bg-transparent',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:hover:bg-muted/10',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:[&_svg]:size-5',\n ].join(' '),\n {\n variants: {\n selected: {\n true: 'ds:border-primary ds:bg-muted',\n false: 'ds:border-transparent',\n },\n },\n defaultVariants: { selected: false },\n },\n);\n\nexport const IconPicker = forwardRef<HTMLButtonElement, IconPickerProps>(\n function IconPicker(\n {\n icons,\n value,\n defaultValue,\n onChange,\n placeholder,\n disabled,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? '',\n );\n const currentValue = isControlled ? (value ?? '') : internalValue;\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n\n // Live snapshots for the synchronous agent handle.\n const currentValueRef = useRef(currentValue);\n currentValueRef.current = currentValue;\n const openRef = useRef(open);\n openRef.current = open;\n const queryRef = useRef(query);\n queryRef.current = query;\n\n const handleOpenChange = useCallback((next: boolean) => {\n setOpen(next);\n // Reset the filter when the popover closes so the next open starts fresh.\n if (!next) setQuery('');\n }, []);\n\n const setValueImperative = useCallback(\n (iconId: string) => {\n if (!isControlled) setInternalValue(iconId);\n onChange?.(iconId);\n },\n [isControlled, onChange],\n );\n\n const handleSelect = useCallback(\n (iconId: string) => {\n setValueImperative(iconId);\n handleOpenChange(false);\n },\n [setValueImperative, handleOpenChange],\n );\n\n const agentHandle = useMemo<IconPickerHandle>(\n () => ({\n getValue: () => currentValueRef.current,\n setValue: (iconId) => setValueImperative(iconId),\n isOpen: () => openRef.current,\n open: () => handleOpenChange(true),\n close: () => handleOpenChange(false),\n getQuery: () => queryRef.current,\n setQuery: (next) => setQuery(next),\n }),\n [setValueImperative, handleOpenChange],\n );\n useAgentRegistration(iconPickerAgent, agentHandle, id);\n\n const selectedIcon = useMemo(\n () => icons.find((icon) => icon.id === currentValue),\n [icons, currentValue],\n );\n\n const normalisedQuery = query.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n normalisedQuery\n ? icons.filter((icon) =>\n icon.label.toLowerCase().includes(normalisedQuery),\n )\n : icons,\n [icons, normalisedQuery],\n );\n\n const triggerLabel = ariaLabel ?? t('iconPicker.trigger');\n const resolvedPlaceholder = placeholder ?? t('iconPicker.trigger');\n\n return (\n <Popover.Root open={open} onOpenChange={handleOpenChange} id={id}>\n <Popover.Trigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n intent=\"outline\"\n disabled={disabled}\n aria-label={triggerLabel}\n className={className}\n data-component=\"icon-picker\"\n data-component-id={id}\n >\n {selectedIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-5\"\n >\n {selectedIcon.node}\n </span>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:text-muted-foreground\">\n {resolvedPlaceholder}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Content\n align=\"start\"\n showArrow={false}\n aria-label={triggerLabel}\n className=\"ds:w-72\"\n >\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <TextInput\n size=\"sm\"\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setQuery(event.target.value)\n }\n placeholder={t('iconPicker.search')}\n aria-label={t('iconPicker.search')}\n startAdornment={<Search />}\n clearable\n onClear={() => setQuery('')}\n autoComplete=\"off\"\n />\n\n {filtered.length === 0 ? (\n <p\n role=\"status\"\n className=\"type-body-sm ds:text-muted-foreground ds:text-center ds:py-[var(--spacing-sm)]\"\n >\n {t('iconPicker.noResults')}\n </p>\n ) : (\n <div\n role=\"group\"\n aria-label={triggerLabel}\n className=\"ds:grid ds:grid-cols-5 ds:gap-[var(--spacing-xs)] ds:max-h-64 ds:overflow-y-auto\"\n >\n {filtered.map((icon) => {\n const selected = icon.id === currentValue;\n return (\n <button\n key={icon.id}\n type=\"button\"\n aria-label={icon.label}\n aria-pressed={selected}\n onClick={() => handleSelect(icon.id)}\n className={optionVariants({ selected })}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex\">\n {icon.node}\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\n\nIconPicker.displayName = 'IconPicker';\n\nexport { optionVariants as iconPickerOptionVariants };\n"],"names":["iconPickerAgent","handle","args","optionVariants","cva","IconPicker","forwardRef","icons","value","defaultValue","onChange","placeholder","disabled","id","className","ariaLabel","ref","t","useTranslation","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","query","setQuery","currentValueRef","useRef","openRef","queryRef","handleOpenChange","useCallback","next","setValueImperative","iconId","handleSelect","agentHandle","useMemo","useAgentRegistration","selectedIcon","icon","normalisedQuery","filtered","triggerLabel","resolvedPlaceholder","Popover","jsx","Button","jsxs","TextInput","event","Search","selected"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { c as Y } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as se } from "react-i18next";
5
5
  import { c as ne } from "./compose-refs-C0k0tdqF.js";
6
6
  import { u as ae } from "./registry-DvAUVLHh.js";
7
- import { B as ce } from "./button-DD_0Xdmr.js";
7
+ import { B as ce } from "./button-CPGiR_bH.js";
8
8
  import { R as de } from "./rotate-ccw-BBQnIVTr.js";
9
9
  const le = {
10
10
  type: "object",
@@ -364,4 +364,4 @@ export {
364
364
  pe as i,
365
365
  ue as t
366
366
  };
367
- //# sourceMappingURL=image-cropper-CdmWFrMC.js.map
367
+ //# sourceMappingURL=image-cropper-DKe4AORY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-cropper-CdmWFrMC.js","sources":["../../src/components/image-cropper/image-cropper.agent.ts","../../src/components/image-cropper/crop-geometry.ts","../../src/components/image-cropper/image-cropper.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ImageCropper. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. The crop is a */\n/* rectangular region pick, so `range_pick` is the closest capability in */\n/* the closed vocabulary. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ImageCropperHandle } from './image-cropper';\n\nconst RECT_SCHEMA = {\n type: 'object',\n properties: {\n x: { type: 'number', minimum: 0, maximum: 1 },\n y: { type: 'number', minimum: 0, maximum: 1 },\n width: { type: 'number', minimum: 0, maximum: 1 },\n height: { type: 'number', minimum: 0, maximum: 1 },\n },\n required: ['x', 'y', 'width', 'height'],\n} as const;\n\nexport const imageCropperAgent: AgentAdapter<ImageCropperHandle> = {\n id: 'image-cropper',\n capabilities: ['range_pick'],\n state: {\n crop: {\n type: 'object',\n descriptionKey: 'ui.agent.imageCropper.state.crop',\n description:\n 'Current crop rectangle in normalised [0,1] coordinates: { x, y, width, height }.',\n read: (handle) => handle.getCrop(),\n },\n },\n actions: {\n set_crop: {\n safety: 'write',\n argsType: '{ x: number; y: number; width: number; height: number }',\n argsSchema: RECT_SCHEMA,\n idempotent: true,\n descriptionKey: 'ui.agent.imageCropper.actions.setCrop',\n description:\n 'Set the crop rectangle (normalised [0,1]). Values are clamped to the image bounds and the minimum crop size.',\n invoke: (\n handle,\n args: { x: number; y: number; width: number; height: number },\n ) => {\n handle.setCrop(args);\n },\n },\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.imageCropper.actions.reset',\n description:\n 'Reset the crop to the centred default for the current aspect.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'image-cropper',\n description: 'Marks the ImageCropper wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Crop geometry — pure helpers shared by the component + its tests. */\n/* */\n/* A crop is stored in NORMALISED coordinates (0–1) relative to the */\n/* displayed image box, so it survives responsive resizes and is trivial */\n/* for a consumer to map onto the natural-resolution bitmap server-side. */\n/* -------------------------------------------------------------------- */\n\n/** Normalised crop rectangle (each field in the closed interval [0, 1]). */\nexport interface CropRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport const clamp01 = (v: number): number => Math.min(1, Math.max(0, v));\n\n/**\n * Clamp a rectangle so it stays within the unit box and never shrinks below\n * `minSize` on either axis.\n */\nexport function clampRect(rect: CropRect, minSize: number): CropRect {\n const width = Math.min(1, Math.max(minSize, rect.width));\n const height = Math.min(1, Math.max(minSize, rect.height));\n const x = Math.min(1 - width, Math.max(0, rect.x));\n const y = Math.min(1 - height, Math.max(0, rect.y));\n return { x, y, width, height };\n}\n\n/**\n * Coerce a rectangle's height to honour a pixel aspect ratio\n * (`width_px / height_px`), anchored at its top-inline-start corner. `boxW` /\n * `boxH` are the displayed image box's pixel dimensions. A non-positive aspect\n * or unmeasured box returns the rectangle unchanged.\n */\nexport function applyAspect(\n rect: CropRect,\n aspect: number | undefined,\n boxW: number,\n boxH: number,\n): CropRect {\n if (!aspect || aspect <= 0 || boxW <= 0 || boxH <= 0) return rect;\n // height_norm = (width_norm * boxW / aspect) / boxH\n const height = (rect.width * boxW) / aspect / boxH;\n return { ...rect, height };\n}\n\n/** A sensible centred default — an 80% box, aspect-coerced when one is set. */\nexport function defaultCrop(\n aspect: number | undefined,\n boxW: number,\n boxH: number,\n): CropRect {\n const base: CropRect = { x: 0.1, y: 0.1, width: 0.8, height: 0.8 };\n const withAspect = applyAspect(base, aspect, boxW, boxH);\n return clampRect(\n {\n ...withAspect,\n // Re-centre vertically after the aspect coercion.\n y: Math.max(0, (1 - withAspect.height) / 2),\n },\n 0.05,\n );\n}\n\n/** Round each field to whole percentages — used for the live-region readout. */\nexport function toPercent(rect: CropRect): {\n x: number;\n y: number;\n width: number;\n height: number;\n} {\n return {\n x: Math.round(rect.x * 100),\n y: Math.round(rect.y * 100),\n width: Math.round(rect.width * 100),\n height: Math.round(rect.height * 100),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { RotateCcw } from 'lucide-react';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { Button } from '../button';\nimport { imageCropperAgent } from './image-cropper.agent';\nimport {\n applyAspect,\n clampRect,\n defaultCrop,\n toPercent,\n type CropRect,\n} from './crop-geometry';\n\n/** Agent-readiness curated handle for ImageCropper. */\nexport interface ImageCropperHandle {\n getCrop: () => CropRect;\n setCrop: (rect: CropRect) => void;\n reset: () => void;\n focus: () => void;\n}\n\nexport interface ImageCropperProps {\n /** Source of the image to crop (object URL, data URL, or remote src). */\n src: string;\n /** Accessible description of the image being cropped (consumer-supplied). */\n alt: string;\n /** Pixel aspect ratio (width / height) to lock the crop to. Omit for free-form. */\n aspect?: number;\n /** Controlled crop rect in normalised [0,1] coordinates. Pair with onChange. */\n value?: CropRect;\n /** Uncontrolled initial crop rect. */\n defaultValue?: CropRect;\n /** Fires with the new normalised crop rect on every move/resize. */\n onChange?: (rect: CropRect) => void;\n /** Smallest crop edge as a fraction of the image (default 0.1). */\n minSize?: number;\n /** Normalised step applied per arrow-key press (default 0.02). */\n keyboardStep?: number;\n disabled?: boolean;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\ntype Corner = 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';\n\ninterface DragState {\n mode: 'move' | 'resize';\n corner?: Corner;\n pointerX: number;\n pointerY: number;\n start: CropRect;\n boxW: number;\n boxH: number;\n}\n\nconst rootVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]'].join(' '),\n);\n\n// dir=\"ltr\" on the crop surface: the crop rectangle lives in IMAGE-BITMAP\n// space (a physical x/y offset into the picture), never document text flow, so\n// `inset-inline-*` resolves to physical left/top here — the same value-space\n// rationale the kit's numeric inputs use for their `dir=\"ltr\"`. The crop is\n// never mirrored under an RTL UI.\n//\n// The disabled cue dims ONLY the image surface (no text lives here), never the\n// helper/Reset text — dimming text would drop it below the contrast floor.\nconst surfaceVariants = cva(\n 'ds:relative ds:inline-block ds:max-w-full ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:select-none ds:touch-none',\n {\n variants: {\n disabled: {\n true: 'ds:opacity-60 ds:pointer-events-none',\n false: '',\n },\n },\n defaultVariants: { disabled: false },\n },\n);\n\nconst imageClass = 'ds:block ds:max-w-full ds:h-auto ds:pointer-events-none';\n\nconst cropBoxClass = [\n 'ds:absolute ds:box-border ds:cursor-move',\n 'ds:border-2 ds:border-[color:var(--ring)]',\n 'ds:shadow-[var(--shadow-md)]',\n 'ds:[inset-inline-start:var(--ic-x)] ds:[inset-block-start:var(--ic-y)]',\n 'ds:[inline-size:var(--ic-w)] ds:[block-size:var(--ic-h)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n].join(' ');\n\nconst handleBase =\n 'ds:absolute ds:size-[var(--spacing-md)] ds:rounded-full ds:bg-[var(--ring)] ds:border-2 ds:border-[color:var(--background)]';\n\nconst HANDLES: Array<{ corner: Corner; cls: string }> = [\n {\n corner: 'top-start',\n cls: 'ds:[inset-block-start:0] ds:[inset-inline-start:0]',\n },\n {\n corner: 'top-end',\n cls: 'ds:[inset-block-start:0] ds:[inset-inline-end:0]',\n },\n {\n corner: 'bottom-start',\n cls: 'ds:[inset-block-end:0] ds:[inset-inline-start:0]',\n },\n {\n corner: 'bottom-end',\n cls: 'ds:[inset-block-end:0] ds:[inset-inline-end:0]',\n },\n];\n\nfunction resizeByCorner(\n start: CropRect,\n corner: Corner,\n dxN: number,\n dyN: number,\n): CropRect {\n switch (corner) {\n case 'top-start':\n return {\n x: start.x + dxN,\n y: start.y + dyN,\n width: start.width - dxN,\n height: start.height - dyN,\n };\n case 'top-end':\n return {\n x: start.x,\n y: start.y + dyN,\n width: start.width + dxN,\n height: start.height - dyN,\n };\n case 'bottom-start':\n return {\n x: start.x + dxN,\n y: start.y,\n width: start.width - dxN,\n height: start.height + dyN,\n };\n case 'bottom-end':\n default:\n return {\n x: start.x,\n y: start.y,\n width: start.width + dxN,\n height: start.height + dyN,\n };\n }\n}\n\nexport const ImageCropper = forwardRef<HTMLDivElement, ImageCropperProps>(\n function ImageCropper(\n {\n src,\n alt,\n aspect,\n value,\n defaultValue,\n onChange,\n minSize = 0.1,\n keyboardStep = 0.02,\n disabled,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n const reactId = useId();\n const instructionsId = `${reactId}-instructions`;\n const liveId = `${reactId}-live`;\n\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const composedRootRef = composeRefs(ref, rootRef);\n const cropBoxRef = useRef<HTMLDivElement | null>(null);\n const dragRef = useRef<DragState | null>(null);\n const touchedRef = useRef(false);\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<CropRect>(() =>\n clampRect(defaultValue ?? defaultCrop(aspect, 0, 0), minSize),\n );\n const crop = isControlled\n ? clampRect(value as CropRect, minSize)\n : internal;\n\n const commit = useCallback(\n (next: CropRect) => {\n touchedRef.current = true;\n const clamped = clampRect(next, minSize);\n if (!isControlled) setInternal(clamped);\n onChange?.(clamped);\n },\n [isControlled, minSize, onChange],\n );\n\n const surfaceSize = (): { w: number; h: number } => {\n const r = surfaceRef.current?.getBoundingClientRect();\n return { w: r?.width ?? 0, h: r?.height ?? 0 };\n };\n\n // Re-centre / aspect-fit once the image lays out, but only while the crop\n // is still the untouched default in uncontrolled mode.\n const handleImageLoad = () => {\n if (touchedRef.current || isControlled || defaultValue) return;\n const { w, h } = surfaceSize();\n setInternal(defaultCrop(aspect, w, h));\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLElement>) => {\n dragRef.current = null;\n const el = event.currentTarget;\n if (el.hasPointerCapture?.(event.pointerId)) {\n el.releasePointerCapture(event.pointerId);\n }\n };\n\n const startMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n const { w, h } = surfaceSize();\n dragRef.current = {\n mode: 'move',\n pointerX: event.clientX,\n pointerY: event.clientY,\n start: crop,\n boxW: w,\n boxH: h,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const startResize = (\n event: ReactPointerEvent<HTMLSpanElement>,\n corner: Corner,\n ) => {\n if (disabled) return;\n event.stopPropagation();\n const { w, h } = surfaceSize();\n dragRef.current = {\n mode: 'resize',\n corner,\n pointerX: event.clientX,\n pointerY: event.clientY,\n start: crop,\n boxW: w,\n boxH: h,\n };\n // Capture on the crop box so move/up keep flowing while dragging a handle.\n cropBoxRef.current?.setPointerCapture?.(event.pointerId);\n };\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.boxW <= 0 || drag.boxH <= 0) return;\n const dxN = (event.clientX - drag.pointerX) / drag.boxW;\n const dyN = (event.clientY - drag.pointerY) / drag.boxH;\n if (drag.mode === 'move') {\n commit({ ...drag.start, x: drag.start.x + dxN, y: drag.start.y + dyN });\n } else if (drag.corner) {\n const raw = resizeByCorner(drag.start, drag.corner, dxN, dyN);\n commit(applyAspect(raw, aspect, drag.boxW, drag.boxH));\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const step = keyboardStep;\n const { w, h } = surfaceSize();\n let next: CropRect | null = null;\n if (event.shiftKey) {\n // Resize from the top-inline-start anchor.\n if (event.key === 'ArrowRight')\n next = { ...crop, width: crop.width + step };\n else if (event.key === 'ArrowLeft')\n next = { ...crop, width: crop.width - step };\n else if (event.key === 'ArrowDown')\n next = { ...crop, height: crop.height + step };\n else if (event.key === 'ArrowUp')\n next = { ...crop, height: crop.height - step };\n if (next) next = applyAspect(next, aspect, w, h);\n } else {\n if (event.key === 'ArrowRight') next = { ...crop, x: crop.x + step };\n else if (event.key === 'ArrowLeft')\n next = { ...crop, x: crop.x - step };\n else if (event.key === 'ArrowDown')\n next = { ...crop, y: crop.y + step };\n else if (event.key === 'ArrowUp') next = { ...crop, y: crop.y - step };\n }\n if (next) {\n event.preventDefault();\n commit(next);\n }\n };\n\n const reset = useCallback(() => {\n const { w, h } = surfaceSize();\n touchedRef.current = false;\n const next = defaultCrop(aspect, w, h);\n if (!isControlled) setInternal(next);\n onChange?.(next);\n }, [aspect, isControlled, onChange]);\n\n const agentHandle = useMemo<ImageCropperHandle>(\n () => ({\n getCrop: () => crop,\n setCrop: (rect) => commit(rect),\n reset,\n focus: () => cropBoxRef.current?.focus(),\n }),\n [crop, commit, reset],\n );\n useAgentRegistration(imageCropperAgent, agentHandle, id);\n\n const pct = toPercent(crop);\n const cropStyle = {\n // Inline style — permitted per 23-constraints §Runtime-computed dimensions\n // (CSS custom-property setters; the position/size rules live in CVA).\n '--ic-x': `${crop.x * 100}%`,\n '--ic-y': `${crop.y * 100}%`,\n '--ic-w': `${crop.width * 100}%`,\n '--ic-h': `${crop.height * 100}%`,\n } as CSSProperties;\n\n const cropLabel = ariaLabel ?? t('imageCropper.cropRegion');\n\n return (\n <div\n ref={composedRootRef}\n className={rootVariants({ className })}\n data-component=\"image-cropper\"\n data-component-id={id}\n >\n <div\n ref={surfaceRef}\n dir=\"ltr\"\n className={surfaceVariants({ disabled: Boolean(disabled) })}\n >\n <img\n src={src}\n alt={alt}\n className={imageClass}\n onLoad={handleImageLoad}\n />\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- crop box is a keyboard-operable adjustable region (arrows move, Shift+arrows resize) with an accessible name + instructions; pointer/keydown handlers are intentional (cf. resizable separator) */}\n <div\n ref={cropBoxRef}\n role=\"group\"\n tabIndex={disabled ? -1 : 0}\n aria-label={cropLabel}\n aria-describedby={instructionsId}\n aria-disabled={disabled || undefined}\n className={cropBoxClass}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed crop geometry injected via --ic-x/y/w/h CSS variables (23-constraints §Runtime-computed dimensions); the inset/size rules live in the cropBox className\n style={cropStyle}\n onPointerDown={startMove}\n onPointerMove={handlePointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={handleKeyDown}\n >\n {HANDLES.map(({ corner, cls }) => (\n <span\n key={corner}\n aria-hidden=\"true\"\n className={`${handleBase} ${cls}`}\n onPointerDown={(event) => startResize(event, corner)}\n />\n ))}\n </div>\n </div>\n\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <p\n id={instructionsId}\n className=\"type-body-sm ds:text-muted-foreground\"\n >\n {t('imageCropper.instructions')}\n </p>\n <Button\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n disabled={disabled}\n onClick={reset}\n >\n <RotateCcw aria-hidden=\"true\" className=\"ds:size-4\" />\n {t('imageCropper.reset')}\n </Button>\n </div>\n\n {/* Polite live region: announces the crop geometry as text so the\n verdict is never conveyed by the visual box alone. */}\n <p id={liveId} role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {t('imageCropper.announcement', {\n x: pct.x,\n y: pct.y,\n width: pct.width,\n height: pct.height,\n })}\n </p>\n </div>\n );\n },\n);\n\nImageCropper.displayName = 'ImageCropper';\n"],"names":["RECT_SCHEMA","imageCropperAgent","handle","args","clamp01","v","clampRect","rect","minSize","width","height","x","applyAspect","aspect","boxW","boxH","defaultCrop","withAspect","toPercent","rootVariants","cva","surfaceVariants","imageClass","cropBoxClass","handleBase","HANDLES","resizeByCorner","start","corner","dxN","dyN","ImageCropper","forwardRef","src","alt","value","defaultValue","onChange","keyboardStep","disabled","id","className","ariaLabel","ref","t","useTranslation","reactId","useId","instructionsId","liveId","surfaceRef","useRef","rootRef","composedRootRef","composeRefs","cropBoxRef","dragRef","touchedRef","isControlled","internal","setInternal","useState","crop","commit","useCallback","next","clamped","surfaceSize","r","_a","handleImageLoad","w","h","endDrag","event","el","startMove","_b","startResize","handlePointerMove","drag","raw","handleKeyDown","step","reset","agentHandle","useMemo","useAgentRegistration","pct","cropStyle","cropLabel","jsxs","jsx","cls","Button","RotateCcw"],"mappings":"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"}
1
+ {"version":3,"file":"image-cropper-DKe4AORY.js","sources":["../../src/components/image-cropper/image-cropper.agent.ts","../../src/components/image-cropper/crop-geometry.ts","../../src/components/image-cropper/image-cropper.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ImageCropper. */\n/* */\n/* See `src/docs/26-agent-readiness.mdx` for the contract. The crop is a */\n/* rectangular region pick, so `range_pick` is the closest capability in */\n/* the closed vocabulary. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ImageCropperHandle } from './image-cropper';\n\nconst RECT_SCHEMA = {\n type: 'object',\n properties: {\n x: { type: 'number', minimum: 0, maximum: 1 },\n y: { type: 'number', minimum: 0, maximum: 1 },\n width: { type: 'number', minimum: 0, maximum: 1 },\n height: { type: 'number', minimum: 0, maximum: 1 },\n },\n required: ['x', 'y', 'width', 'height'],\n} as const;\n\nexport const imageCropperAgent: AgentAdapter<ImageCropperHandle> = {\n id: 'image-cropper',\n capabilities: ['range_pick'],\n state: {\n crop: {\n type: 'object',\n descriptionKey: 'ui.agent.imageCropper.state.crop',\n description:\n 'Current crop rectangle in normalised [0,1] coordinates: { x, y, width, height }.',\n read: (handle) => handle.getCrop(),\n },\n },\n actions: {\n set_crop: {\n safety: 'write',\n argsType: '{ x: number; y: number; width: number; height: number }',\n argsSchema: RECT_SCHEMA,\n idempotent: true,\n descriptionKey: 'ui.agent.imageCropper.actions.setCrop',\n description:\n 'Set the crop rectangle (normalised [0,1]). Values are clamped to the image bounds and the minimum crop size.',\n invoke: (\n handle,\n args: { x: number; y: number; width: number; height: number },\n ) => {\n handle.setCrop(args);\n },\n },\n reset: {\n safety: 'write',\n idempotent: true,\n descriptionKey: 'ui.agent.imageCropper.actions.reset',\n description:\n 'Reset the crop to the centred default for the current aspect.',\n invoke: (handle) => {\n handle.reset();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'image-cropper',\n description: 'Marks the ImageCropper wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","/* -------------------------------------------------------------------- */\n/* Crop geometry — pure helpers shared by the component + its tests. */\n/* */\n/* A crop is stored in NORMALISED coordinates (0–1) relative to the */\n/* displayed image box, so it survives responsive resizes and is trivial */\n/* for a consumer to map onto the natural-resolution bitmap server-side. */\n/* -------------------------------------------------------------------- */\n\n/** Normalised crop rectangle (each field in the closed interval [0, 1]). */\nexport interface CropRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport const clamp01 = (v: number): number => Math.min(1, Math.max(0, v));\n\n/**\n * Clamp a rectangle so it stays within the unit box and never shrinks below\n * `minSize` on either axis.\n */\nexport function clampRect(rect: CropRect, minSize: number): CropRect {\n const width = Math.min(1, Math.max(minSize, rect.width));\n const height = Math.min(1, Math.max(minSize, rect.height));\n const x = Math.min(1 - width, Math.max(0, rect.x));\n const y = Math.min(1 - height, Math.max(0, rect.y));\n return { x, y, width, height };\n}\n\n/**\n * Coerce a rectangle's height to honour a pixel aspect ratio\n * (`width_px / height_px`), anchored at its top-inline-start corner. `boxW` /\n * `boxH` are the displayed image box's pixel dimensions. A non-positive aspect\n * or unmeasured box returns the rectangle unchanged.\n */\nexport function applyAspect(\n rect: CropRect,\n aspect: number | undefined,\n boxW: number,\n boxH: number,\n): CropRect {\n if (!aspect || aspect <= 0 || boxW <= 0 || boxH <= 0) return rect;\n // height_norm = (width_norm * boxW / aspect) / boxH\n const height = (rect.width * boxW) / aspect / boxH;\n return { ...rect, height };\n}\n\n/** A sensible centred default — an 80% box, aspect-coerced when one is set. */\nexport function defaultCrop(\n aspect: number | undefined,\n boxW: number,\n boxH: number,\n): CropRect {\n const base: CropRect = { x: 0.1, y: 0.1, width: 0.8, height: 0.8 };\n const withAspect = applyAspect(base, aspect, boxW, boxH);\n return clampRect(\n {\n ...withAspect,\n // Re-centre vertically after the aspect coercion.\n y: Math.max(0, (1 - withAspect.height) / 2),\n },\n 0.05,\n );\n}\n\n/** Round each field to whole percentages — used for the live-region readout. */\nexport function toPercent(rect: CropRect): {\n x: number;\n y: number;\n width: number;\n height: number;\n} {\n return {\n x: Math.round(rect.x * 100),\n y: Math.round(rect.y * 100),\n width: Math.round(rect.width * 100),\n height: Math.round(rect.height * 100),\n };\n}\n","import {\n forwardRef,\n useCallback,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { RotateCcw } from 'lucide-react';\nimport { composeRefs } from '../_shared/compose-refs';\nimport { useAgentRegistration } from '../../agent';\nimport { Button } from '../button';\nimport { imageCropperAgent } from './image-cropper.agent';\nimport {\n applyAspect,\n clampRect,\n defaultCrop,\n toPercent,\n type CropRect,\n} from './crop-geometry';\n\n/** Agent-readiness curated handle for ImageCropper. */\nexport interface ImageCropperHandle {\n getCrop: () => CropRect;\n setCrop: (rect: CropRect) => void;\n reset: () => void;\n focus: () => void;\n}\n\nexport interface ImageCropperProps {\n /** Source of the image to crop (object URL, data URL, or remote src). */\n src: string;\n /** Accessible description of the image being cropped (consumer-supplied). */\n alt: string;\n /** Pixel aspect ratio (width / height) to lock the crop to. Omit for free-form. */\n aspect?: number;\n /** Controlled crop rect in normalised [0,1] coordinates. Pair with onChange. */\n value?: CropRect;\n /** Uncontrolled initial crop rect. */\n defaultValue?: CropRect;\n /** Fires with the new normalised crop rect on every move/resize. */\n onChange?: (rect: CropRect) => void;\n /** Smallest crop edge as a fraction of the image (default 0.1). */\n minSize?: number;\n /** Normalised step applied per arrow-key press (default 0.02). */\n keyboardStep?: number;\n disabled?: boolean;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\ntype Corner = 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end';\n\ninterface DragState {\n mode: 'move' | 'resize';\n corner?: Corner;\n pointerX: number;\n pointerY: number;\n start: CropRect;\n boxW: number;\n boxH: number;\n}\n\nconst rootVariants = cva(\n ['ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]'].join(' '),\n);\n\n// dir=\"ltr\" on the crop surface: the crop rectangle lives in IMAGE-BITMAP\n// space (a physical x/y offset into the picture), never document text flow, so\n// `inset-inline-*` resolves to physical left/top here — the same value-space\n// rationale the kit's numeric inputs use for their `dir=\"ltr\"`. The crop is\n// never mirrored under an RTL UI.\n//\n// The disabled cue dims ONLY the image surface (no text lives here), never the\n// helper/Reset text — dimming text would drop it below the contrast floor.\nconst surfaceVariants = cva(\n 'ds:relative ds:inline-block ds:max-w-full ds:overflow-hidden ds:rounded-[var(--radius-md)] ds:bg-[var(--muted)] ds:select-none ds:touch-none',\n {\n variants: {\n disabled: {\n true: 'ds:opacity-60 ds:pointer-events-none',\n false: '',\n },\n },\n defaultVariants: { disabled: false },\n },\n);\n\nconst imageClass = 'ds:block ds:max-w-full ds:h-auto ds:pointer-events-none';\n\nconst cropBoxClass = [\n 'ds:absolute ds:box-border ds:cursor-move',\n 'ds:border-2 ds:border-[color:var(--ring)]',\n 'ds:shadow-[var(--shadow-md)]',\n 'ds:[inset-inline-start:var(--ic-x)] ds:[inset-block-start:var(--ic-y)]',\n 'ds:[inline-size:var(--ic-w)] ds:[block-size:var(--ic-h)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n].join(' ');\n\nconst handleBase =\n 'ds:absolute ds:size-[var(--spacing-md)] ds:rounded-full ds:bg-[var(--ring)] ds:border-2 ds:border-[color:var(--background)]';\n\nconst HANDLES: Array<{ corner: Corner; cls: string }> = [\n {\n corner: 'top-start',\n cls: 'ds:[inset-block-start:0] ds:[inset-inline-start:0]',\n },\n {\n corner: 'top-end',\n cls: 'ds:[inset-block-start:0] ds:[inset-inline-end:0]',\n },\n {\n corner: 'bottom-start',\n cls: 'ds:[inset-block-end:0] ds:[inset-inline-start:0]',\n },\n {\n corner: 'bottom-end',\n cls: 'ds:[inset-block-end:0] ds:[inset-inline-end:0]',\n },\n];\n\nfunction resizeByCorner(\n start: CropRect,\n corner: Corner,\n dxN: number,\n dyN: number,\n): CropRect {\n switch (corner) {\n case 'top-start':\n return {\n x: start.x + dxN,\n y: start.y + dyN,\n width: start.width - dxN,\n height: start.height - dyN,\n };\n case 'top-end':\n return {\n x: start.x,\n y: start.y + dyN,\n width: start.width + dxN,\n height: start.height - dyN,\n };\n case 'bottom-start':\n return {\n x: start.x + dxN,\n y: start.y,\n width: start.width - dxN,\n height: start.height + dyN,\n };\n case 'bottom-end':\n default:\n return {\n x: start.x,\n y: start.y,\n width: start.width + dxN,\n height: start.height + dyN,\n };\n }\n}\n\nexport const ImageCropper = forwardRef<HTMLDivElement, ImageCropperProps>(\n function ImageCropper(\n {\n src,\n alt,\n aspect,\n value,\n defaultValue,\n onChange,\n minSize = 0.1,\n keyboardStep = 0.02,\n disabled,\n id,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t } = useTranslation();\n const reactId = useId();\n const instructionsId = `${reactId}-instructions`;\n const liveId = `${reactId}-live`;\n\n const surfaceRef = useRef<HTMLDivElement | null>(null);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const composedRootRef = composeRefs(ref, rootRef);\n const cropBoxRef = useRef<HTMLDivElement | null>(null);\n const dragRef = useRef<DragState | null>(null);\n const touchedRef = useRef(false);\n\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<CropRect>(() =>\n clampRect(defaultValue ?? defaultCrop(aspect, 0, 0), minSize),\n );\n const crop = isControlled\n ? clampRect(value as CropRect, minSize)\n : internal;\n\n const commit = useCallback(\n (next: CropRect) => {\n touchedRef.current = true;\n const clamped = clampRect(next, minSize);\n if (!isControlled) setInternal(clamped);\n onChange?.(clamped);\n },\n [isControlled, minSize, onChange],\n );\n\n const surfaceSize = (): { w: number; h: number } => {\n const r = surfaceRef.current?.getBoundingClientRect();\n return { w: r?.width ?? 0, h: r?.height ?? 0 };\n };\n\n // Re-centre / aspect-fit once the image lays out, but only while the crop\n // is still the untouched default in uncontrolled mode.\n const handleImageLoad = () => {\n if (touchedRef.current || isControlled || defaultValue) return;\n const { w, h } = surfaceSize();\n setInternal(defaultCrop(aspect, w, h));\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLElement>) => {\n dragRef.current = null;\n const el = event.currentTarget;\n if (el.hasPointerCapture?.(event.pointerId)) {\n el.releasePointerCapture(event.pointerId);\n }\n };\n\n const startMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n const { w, h } = surfaceSize();\n dragRef.current = {\n mode: 'move',\n pointerX: event.clientX,\n pointerY: event.clientY,\n start: crop,\n boxW: w,\n boxH: h,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const startResize = (\n event: ReactPointerEvent<HTMLSpanElement>,\n corner: Corner,\n ) => {\n if (disabled) return;\n event.stopPropagation();\n const { w, h } = surfaceSize();\n dragRef.current = {\n mode: 'resize',\n corner,\n pointerX: event.clientX,\n pointerY: event.clientY,\n start: crop,\n boxW: w,\n boxH: h,\n };\n // Capture on the crop box so move/up keep flowing while dragging a handle.\n cropBoxRef.current?.setPointerCapture?.(event.pointerId);\n };\n\n const handlePointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.boxW <= 0 || drag.boxH <= 0) return;\n const dxN = (event.clientX - drag.pointerX) / drag.boxW;\n const dyN = (event.clientY - drag.pointerY) / drag.boxH;\n if (drag.mode === 'move') {\n commit({ ...drag.start, x: drag.start.x + dxN, y: drag.start.y + dyN });\n } else if (drag.corner) {\n const raw = resizeByCorner(drag.start, drag.corner, dxN, dyN);\n commit(applyAspect(raw, aspect, drag.boxW, drag.boxH));\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const step = keyboardStep;\n const { w, h } = surfaceSize();\n let next: CropRect | null = null;\n if (event.shiftKey) {\n // Resize from the top-inline-start anchor.\n if (event.key === 'ArrowRight')\n next = { ...crop, width: crop.width + step };\n else if (event.key === 'ArrowLeft')\n next = { ...crop, width: crop.width - step };\n else if (event.key === 'ArrowDown')\n next = { ...crop, height: crop.height + step };\n else if (event.key === 'ArrowUp')\n next = { ...crop, height: crop.height - step };\n if (next) next = applyAspect(next, aspect, w, h);\n } else {\n if (event.key === 'ArrowRight') next = { ...crop, x: crop.x + step };\n else if (event.key === 'ArrowLeft')\n next = { ...crop, x: crop.x - step };\n else if (event.key === 'ArrowDown')\n next = { ...crop, y: crop.y + step };\n else if (event.key === 'ArrowUp') next = { ...crop, y: crop.y - step };\n }\n if (next) {\n event.preventDefault();\n commit(next);\n }\n };\n\n const reset = useCallback(() => {\n const { w, h } = surfaceSize();\n touchedRef.current = false;\n const next = defaultCrop(aspect, w, h);\n if (!isControlled) setInternal(next);\n onChange?.(next);\n }, [aspect, isControlled, onChange]);\n\n const agentHandle = useMemo<ImageCropperHandle>(\n () => ({\n getCrop: () => crop,\n setCrop: (rect) => commit(rect),\n reset,\n focus: () => cropBoxRef.current?.focus(),\n }),\n [crop, commit, reset],\n );\n useAgentRegistration(imageCropperAgent, agentHandle, id);\n\n const pct = toPercent(crop);\n const cropStyle = {\n // Inline style — permitted per 23-constraints §Runtime-computed dimensions\n // (CSS custom-property setters; the position/size rules live in CVA).\n '--ic-x': `${crop.x * 100}%`,\n '--ic-y': `${crop.y * 100}%`,\n '--ic-w': `${crop.width * 100}%`,\n '--ic-h': `${crop.height * 100}%`,\n } as CSSProperties;\n\n const cropLabel = ariaLabel ?? t('imageCropper.cropRegion');\n\n return (\n <div\n ref={composedRootRef}\n className={rootVariants({ className })}\n data-component=\"image-cropper\"\n data-component-id={id}\n >\n <div\n ref={surfaceRef}\n dir=\"ltr\"\n className={surfaceVariants({ disabled: Boolean(disabled) })}\n >\n <img\n src={src}\n alt={alt}\n className={imageClass}\n onLoad={handleImageLoad}\n />\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- crop box is a keyboard-operable adjustable region (arrows move, Shift+arrows resize) with an accessible name + instructions; pointer/keydown handlers are intentional (cf. resizable separator) */}\n <div\n ref={cropBoxRef}\n role=\"group\"\n tabIndex={disabled ? -1 : 0}\n aria-label={cropLabel}\n aria-describedby={instructionsId}\n aria-disabled={disabled || undefined}\n className={cropBoxClass}\n // eslint-disable-next-line react/forbid-dom-props -- runtime-computed crop geometry injected via --ic-x/y/w/h CSS variables (23-constraints §Runtime-computed dimensions); the inset/size rules live in the cropBox className\n style={cropStyle}\n onPointerDown={startMove}\n onPointerMove={handlePointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={handleKeyDown}\n >\n {HANDLES.map(({ corner, cls }) => (\n <span\n key={corner}\n aria-hidden=\"true\"\n className={`${handleBase} ${cls}`}\n onPointerDown={(event) => startResize(event, corner)}\n />\n ))}\n </div>\n </div>\n\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <p\n id={instructionsId}\n className=\"type-body-sm ds:text-muted-foreground\"\n >\n {t('imageCropper.instructions')}\n </p>\n <Button\n type=\"button\"\n intent=\"outline\"\n size=\"sm\"\n disabled={disabled}\n onClick={reset}\n >\n <RotateCcw aria-hidden=\"true\" className=\"ds:size-4\" />\n {t('imageCropper.reset')}\n </Button>\n </div>\n\n {/* Polite live region: announces the crop geometry as text so the\n verdict is never conveyed by the visual box alone. */}\n <p id={liveId} role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {t('imageCropper.announcement', {\n x: pct.x,\n y: pct.y,\n width: pct.width,\n height: pct.height,\n })}\n </p>\n </div>\n );\n },\n);\n\nImageCropper.displayName = 'ImageCropper';\n"],"names":["RECT_SCHEMA","imageCropperAgent","handle","args","clamp01","v","clampRect","rect","minSize","width","height","x","applyAspect","aspect","boxW","boxH","defaultCrop","withAspect","toPercent","rootVariants","cva","surfaceVariants","imageClass","cropBoxClass","handleBase","HANDLES","resizeByCorner","start","corner","dxN","dyN","ImageCropper","forwardRef","src","alt","value","defaultValue","onChange","keyboardStep","disabled","id","className","ariaLabel","ref","t","useTranslation","reactId","useId","instructionsId","liveId","surfaceRef","useRef","rootRef","composedRootRef","composeRefs","cropBoxRef","dragRef","touchedRef","isControlled","internal","setInternal","useState","crop","commit","useCallback","next","clamped","surfaceSize","r","_a","handleImageLoad","w","h","endDrag","event","el","startMove","_b","startResize","handlePointerMove","drag","raw","handleKeyDown","step","reset","agentHandle","useMemo","useAgentRegistration","pct","cropStyle","cropLabel","jsxs","jsx","cls","Button","RotateCcw"],"mappings":"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"}