@alfadocs/ui-kit-debug 1.55.0 → 1.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js → ai-credits-notice-ktklr8fy.js} +2 -2
  2. package/dist/_chunks/{ai-credits-notice-BoNJtOuE.js.map → ai-credits-notice-ktklr8fy.js.map} +1 -1
  3. package/dist/_chunks/ai-permission-notice-DyuEGwAt.js +206 -0
  4. package/dist/_chunks/ai-permission-notice-DyuEGwAt.js.map +1 -0
  5. package/dist/_chunks/alia-sidebar-BBKBJCv6.js +1284 -0
  6. package/dist/_chunks/alia-sidebar-BBKBJCv6.js.map +1 -0
  7. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js → anamnesis-summary-rows-CCQ62mMN.js} +5 -5
  8. package/dist/_chunks/{anamnesis-summary-rows-Dtw5Hpg4.js.map → anamnesis-summary-rows-CCQ62mMN.js.map} +1 -1
  9. package/dist/_chunks/{appointment-peek-BIZaDeCi.js → appointment-peek-WvNbE4JG.js} +2 -2
  10. package/dist/_chunks/{appointment-peek-BIZaDeCi.js.map → appointment-peek-WvNbE4JG.js.map} +1 -1
  11. package/dist/_chunks/{appointment-timeline-DmqYEIT9.js → appointment-timeline-Z0494xO-.js} +2 -2
  12. package/dist/_chunks/{appointment-timeline-DmqYEIT9.js.map → appointment-timeline-Z0494xO-.js.map} +1 -1
  13. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js → balance-badge-cell-CII3SDmR.js} +3 -3
  14. package/dist/_chunks/{balance-badge-cell-zP-iN-Pd.js.map → balance-badge-cell-CII3SDmR.js.map} +1 -1
  15. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js → bmi-calculator-C0UTxB7R.js} +2 -2
  16. package/dist/_chunks/{bmi-calculator-DTZhRhXe.js.map → bmi-calculator-C0UTxB7R.js.map} +1 -1
  17. package/dist/_chunks/{booking-uZO10TLK.js → booking-81WnKDsH.js} +4 -4
  18. package/dist/_chunks/{booking-uZO10TLK.js.map → booking-81WnKDsH.js.map} +1 -1
  19. package/dist/_chunks/{breadcrumb-xgVpPH2H.js → breadcrumb-Boan-5n8.js} +39 -39
  20. package/dist/_chunks/breadcrumb-Boan-5n8.js.map +1 -0
  21. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js → calculator-dialog-CzQv03p0.js} +2 -2
  22. package/dist/_chunks/{calculator-dialog-BRjZMWuE.js.map → calculator-dialog-CzQv03p0.js.map} +1 -1
  23. package/dist/_chunks/{calendar-workspace-DVajSkKA.js → calendar-workspace-D5-k_9zE.js} +15 -15
  24. package/dist/_chunks/{calendar-workspace-DVajSkKA.js.map → calendar-workspace-D5-k_9zE.js.map} +1 -1
  25. package/dist/_chunks/{care-plan-card-Ddjh5Doc.js → care-plan-card-DxrRLRdW.js} +2 -2
  26. package/dist/_chunks/{care-plan-card-Ddjh5Doc.js.map → care-plan-card-DxrRLRdW.js.map} +1 -1
  27. package/dist/_chunks/{care-plan-header-BeMYMiI7.js → care-plan-header-BMwZIgHJ.js} +3 -3
  28. package/dist/_chunks/{care-plan-header-BeMYMiI7.js.map → care-plan-header-BMwZIgHJ.js.map} +1 -1
  29. package/dist/_chunks/chart-DQ5GxqgT.js +906 -0
  30. package/dist/_chunks/chart-DQ5GxqgT.js.map +1 -0
  31. package/dist/_chunks/{clinical-note-card-14JIoUR0.js → clinical-note-card-hx939bvw.js} +2 -2
  32. package/dist/_chunks/{clinical-note-card-14JIoUR0.js.map → clinical-note-card-hx939bvw.js.map} +1 -1
  33. package/dist/_chunks/{color-picker-BRQ4Y9SO.js → color-picker-BsggJovx.js} +128 -123
  34. package/dist/_chunks/color-picker-BsggJovx.js.map +1 -0
  35. package/dist/_chunks/{contact-card-CmK05vNb.js → contact-card-fHBMwEsx.js} +2 -2
  36. package/dist/_chunks/{contact-card-CmK05vNb.js.map → contact-card-fHBMwEsx.js.map} +1 -1
  37. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js → contact-profile-card-CMyBYgRR.js} +3 -3
  38. package/dist/_chunks/{contact-profile-card-C5DbP_X3.js.map → contact-profile-card-CMyBYgRR.js.map} +1 -1
  39. package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js → cycle-calculator-Cww9DzIa.js} +2 -2
  40. package/dist/_chunks/{cycle-calculator-Dgfqr4Q4.js.map → cycle-calculator-Cww9DzIa.js.map} +1 -1
  41. package/dist/_chunks/dashboard-grid-DfEY2qci.js +844 -0
  42. package/dist/_chunks/dashboard-grid-DfEY2qci.js.map +1 -0
  43. package/dist/_chunks/{data-table-C6T31E33.js → data-table-fAMTeAjM.js} +2 -2
  44. package/dist/_chunks/{data-table-C6T31E33.js.map → data-table-fAMTeAjM.js.map} +1 -1
  45. package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js → data-table-tabs-CHYAAeHy.js} +2 -2
  46. package/dist/_chunks/{data-table-tabs-Xhg5G0gU.js.map → data-table-tabs-CHYAAeHy.js.map} +1 -1
  47. package/dist/_chunks/{date-picker-wRAcq2lt.js → date-picker-BSZuKo13.js} +69 -62
  48. package/dist/_chunks/date-picker-BSZuKo13.js.map +1 -0
  49. package/dist/_chunks/{date-range-picker-BOvHwWO5.js → date-range-picker-CFk-5O3R.js} +188 -177
  50. package/dist/_chunks/date-range-picker-CFk-5O3R.js.map +1 -0
  51. package/dist/_chunks/{date-time-picker-CLeLKuv9.js → date-time-picker-CjxTkblD.js} +92 -85
  52. package/dist/_chunks/date-time-picker-CjxTkblD.js.map +1 -0
  53. package/dist/_chunks/{dependent-selector-Bet3XAFj.js → dependent-selector-DgaAQc-c.js} +91 -86
  54. package/dist/_chunks/dependent-selector-DgaAQc-c.js.map +1 -0
  55. package/dist/_chunks/{dialog-D52AI4nF.js → dialog-Dn-iQ0Jp.js} +86 -69
  56. package/dist/_chunks/dialog-Dn-iQ0Jp.js.map +1 -0
  57. package/dist/_chunks/{document-preview-uoTekVR7.js → document-preview-CHGGG0l_.js} +2 -2
  58. package/dist/_chunks/{document-preview-uoTekVR7.js.map → document-preview-CHGGG0l_.js.map} +1 -1
  59. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js → due-date-calculator-D_qFUiHp.js} +3 -3
  60. package/dist/_chunks/{due-date-calculator-DXDJbUzo.js.map → due-date-calculator-D_qFUiHp.js.map} +1 -1
  61. package/dist/_chunks/{entity-summary-DcB0fIiv.js → entity-summary-CWcCSThK.js} +2 -2
  62. package/dist/_chunks/{entity-summary-DcB0fIiv.js.map → entity-summary-CWcCSThK.js.map} +1 -1
  63. package/dist/_chunks/{file-manager-dIJQUZvq.js → file-manager-CFsL1KVt.js} +4 -4
  64. package/dist/_chunks/{file-manager-dIJQUZvq.js.map → file-manager-CFsL1KVt.js.map} +1 -1
  65. package/dist/_chunks/{freemium-paywall-B6ojVXq7.js → freemium-paywall-DIKuhX8b.js} +90 -86
  66. package/dist/_chunks/freemium-paywall-DIKuhX8b.js.map +1 -0
  67. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js → gestational-age-calculator-CZi43xKG.js} +3 -3
  68. package/dist/_chunks/{gestational-age-calculator-BfGpt3du.js.map → gestational-age-calculator-CZi43xKG.js.map} +1 -1
  69. package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js → hcg-doubling-Ccvh7OaU.js} +2 -2
  70. package/dist/_chunks/{hcg-doubling-BIYyI2Yo.js.map → hcg-doubling-Ccvh7OaU.js.map} +1 -1
  71. package/dist/_chunks/{header-settings-ge_3gYEq.js → header-settings-BMcCx2LC.js} +2 -2
  72. package/dist/_chunks/{header-settings-ge_3gYEq.js.map → header-settings-BMcCx2LC.js.map} +1 -1
  73. package/dist/_chunks/{heatmap-BARGZZt2.js → heatmap-BEeOThkW.js} +2 -2
  74. package/dist/_chunks/{heatmap-BARGZZt2.js.map → heatmap-BEeOThkW.js.map} +1 -1
  75. package/dist/_chunks/{help-me-write-templates-B7L3zGsE.js → help-me-write-templates-BUoYGo6f.js} +2 -2
  76. package/dist/_chunks/help-me-write-templates-BUoYGo6f.js.map +1 -0
  77. package/dist/_chunks/{hover-card-BnTueNS2.js → hover-card-U_ZYoh1n.js} +201 -187
  78. package/dist/_chunks/hover-card-U_ZYoh1n.js.map +1 -0
  79. package/dist/_chunks/{icon-picker-DWrqmI1c.js → icon-picker-C86lQTIA.js} +2 -2
  80. package/dist/_chunks/{icon-picker-DWrqmI1c.js.map → icon-picker-C86lQTIA.js.map} +1 -1
  81. package/dist/_chunks/{info-tip-B0jmIt6M.js → info-tip-CJpNpzZe.js} +2 -2
  82. package/dist/_chunks/{info-tip-B0jmIt6M.js.map → info-tip-CJpNpzZe.js.map} +1 -1
  83. package/dist/_chunks/{key-value-pair-Ax8IJr1M.js → key-value-pair-BNNITp6S.js} +25 -19
  84. package/dist/_chunks/key-value-pair-BNNITp6S.js.map +1 -0
  85. package/dist/_chunks/{kit-extensions-C9-v8Dih.js → kit-extensions-DYVxWcqv.js} +5 -5
  86. package/dist/_chunks/{kit-extensions-C9-v8Dih.js.map → kit-extensions-DYVxWcqv.js.map} +1 -1
  87. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js → link-cell-renderer-CxW_oLa5.js} +2 -2
  88. package/dist/_chunks/{link-cell-renderer-DlBVPMTi.js.map → link-cell-renderer-CxW_oLa5.js.map} +1 -1
  89. package/dist/_chunks/link-gRw3NtOt.js +137 -0
  90. package/dist/_chunks/link-gRw3NtOt.js.map +1 -0
  91. package/dist/_chunks/{locale-picker-DfNSdOpy.js → locale-picker-BGfrZyTw.js} +2 -2
  92. package/dist/_chunks/{locale-picker-DfNSdOpy.js.map → locale-picker-BGfrZyTw.js.map} +1 -1
  93. package/dist/_chunks/{marketplace-app-shell-Dcx-JEjg.js → marketplace-app-shell-BZcA9Z06.js} +143 -129
  94. package/dist/_chunks/marketplace-app-shell-BZcA9Z06.js.map +1 -0
  95. package/dist/_chunks/{message-tray-BB95DA82.js → message-tray-QKQutwxj.js} +76 -69
  96. package/dist/_chunks/message-tray-QKQutwxj.js.map +1 -0
  97. package/dist/_chunks/{nav-grid-BqCPH8sm.js → nav-grid-Byx8PxuB.js} +2 -2
  98. package/dist/_chunks/{nav-grid-BqCPH8sm.js.map → nav-grid-Byx8PxuB.js.map} +1 -1
  99. package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js +89 -0
  100. package/dist/_chunks/non-modal-tab-exit-j3CPOuE3.js.map +1 -0
  101. package/dist/_chunks/{note-attachment-I1NLoeRZ.js → note-attachment-Bt2cddsZ.js} +2 -2
  102. package/dist/_chunks/{note-attachment-I1NLoeRZ.js.map → note-attachment-Bt2cddsZ.js.map} +1 -1
  103. package/dist/_chunks/{note-timeline-CsY8YOE7.js → note-timeline-CX9nAgAR.js} +2 -2
  104. package/dist/_chunks/{note-timeline-CsY8YOE7.js.map → note-timeline-CX9nAgAR.js.map} +1 -1
  105. package/dist/_chunks/{notes-panel-I8ntrrUW.js → notes-panel-Cm4pttpl.js} +4 -4
  106. package/dist/_chunks/{notes-panel-I8ntrrUW.js.map → notes-panel-Cm4pttpl.js.map} +1 -1
  107. package/dist/_chunks/{notification-tray-__sJXnsz.js → notification-tray-C5VtbGjd.js} +83 -76
  108. package/dist/_chunks/notification-tray-C5VtbGjd.js.map +1 -0
  109. package/dist/_chunks/{patient-details-DsTtjpuX.js → patient-details-99kEdtc5.js} +2 -2
  110. package/dist/_chunks/{patient-details-DsTtjpuX.js.map → patient-details-99kEdtc5.js.map} +1 -1
  111. package/dist/_chunks/{patient-field-row-BvZ9luz-.js → patient-field-row-DkxY13T6.js} +5 -5
  112. package/dist/_chunks/{patient-field-row-BvZ9luz-.js.map → patient-field-row-DkxY13T6.js.map} +1 -1
  113. package/dist/_chunks/{patient-summary-card-3dspc2tR.js → patient-summary-card-opdyfeW2.js} +10 -6
  114. package/dist/_chunks/{patient-summary-card-3dspc2tR.js.map → patient-summary-card-opdyfeW2.js.map} +1 -1
  115. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js → payment-automation-upsell-DiHovmUL.js} +2 -2
  116. package/dist/_chunks/{payment-automation-upsell-DEUfM7EU.js.map → payment-automation-upsell-DiHovmUL.js.map} +1 -1
  117. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js → payment-request-card-DAniJNLX.js} +3 -3
  118. package/dist/_chunks/{payment-request-card-DAGqh9Yx.js.map → payment-request-card-DAniJNLX.js.map} +1 -1
  119. package/dist/_chunks/{pdf-viewer-C3minW5b.js → pdf-viewer-CNQxa4tv.js} +396 -391
  120. package/dist/_chunks/pdf-viewer-CNQxa4tv.js.map +1 -0
  121. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js → periodontal-chart-DD5C0M3l.js} +2 -2
  122. package/dist/_chunks/{periodontal-chart-BqwLxy2m.js.map → periodontal-chart-DD5C0M3l.js.map} +1 -1
  123. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js → periodontal-chart-card-CxdXvsPU.js} +2 -2
  124. package/dist/_chunks/{periodontal-chart-card-CWZ1YM1h.js.map → periodontal-chart-card-CxdXvsPU.js.map} +1 -1
  125. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js → periodontal-diagnosis-D-PJv7KS.js} +2 -2
  126. package/dist/_chunks/{periodontal-diagnosis-C9IuvLId.js.map → periodontal-diagnosis-D-PJv7KS.js.map} +1 -1
  127. package/dist/_chunks/{phone-input-DxkHMYmu.js → phone-input-O9camxkq.js} +156 -151
  128. package/dist/_chunks/phone-input-O9camxkq.js.map +1 -0
  129. package/dist/_chunks/popover-BG75rYjN.js +367 -0
  130. package/dist/_chunks/popover-BG75rYjN.js.map +1 -0
  131. package/dist/_chunks/{position-grid-D2D5_Tze.js → position-grid-CBB88EaH.js} +38 -36
  132. package/dist/_chunks/position-grid-CBB88EaH.js.map +1 -0
  133. package/dist/_chunks/{practice-results-DxOgbPDy.js → practice-results-CfRkjzsI.js} +2 -2
  134. package/dist/_chunks/{practice-results-DxOgbPDy.js.map → practice-results-CfRkjzsI.js.map} +1 -1
  135. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js → pregnancy-dating-BFzv9g1N.js} +3 -3
  136. package/dist/_chunks/{pregnancy-dating-R3q5n1Wh.js.map → pregnancy-dating-BFzv9g1N.js.map} +1 -1
  137. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js → pregnancy-weight-gain-CUUrBTBo.js} +2 -2
  138. package/dist/_chunks/{pregnancy-weight-gain-DwmNklDU.js.map → pregnancy-weight-gain-CUUrBTBo.js.map} +1 -1
  139. package/dist/_chunks/{product-hub-panel-BSSiGGG4.js → product-hub-panel-DlVRK7Ue.js} +103 -96
  140. package/dist/_chunks/product-hub-panel-DlVRK7Ue.js.map +1 -0
  141. package/dist/_chunks/{public-footer-CxpG6J1M.js → public-footer-ZWTEG1Rq.js} +2 -2
  142. package/dist/_chunks/{public-footer-CxpG6J1M.js.map → public-footer-ZWTEG1Rq.js.map} +1 -1
  143. package/dist/_chunks/{public-header.agent-BWusjxY8.js → public-header.agent-BctevbuY.js} +2 -2
  144. package/dist/_chunks/{public-header.agent-BWusjxY8.js.map → public-header.agent-BctevbuY.js.map} +1 -1
  145. package/dist/_chunks/{radio-group-BT97ty7o.js → radio-group-DicxWJXP.js} +111 -106
  146. package/dist/_chunks/radio-group-DicxWJXP.js.map +1 -0
  147. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js → radiograph-panel.agent-DyqbTECc.js} +4 -4
  148. package/dist/_chunks/{radiograph-panel.agent-BA90I3Mu.js.map → radiograph-panel.agent-DyqbTECc.js.map} +1 -1
  149. package/dist/_chunks/{registration-form-D7iNqMBF.js → registration-form-BlTzYywa.js} +2 -2
  150. package/dist/_chunks/{registration-form-D7iNqMBF.js.map → registration-form-BlTzYywa.js.map} +1 -1
  151. package/dist/_chunks/{rich-text-editor-Blp4smUr.js → rich-text-editor-DTnNZ4Ff.js} +489 -484
  152. package/dist/_chunks/rich-text-editor-DTnNZ4Ff.js.map +1 -0
  153. package/dist/_chunks/{sheet-CNFW8mYZ.js → sheet-8qsiMoUI.js} +95 -79
  154. package/dist/_chunks/sheet-8qsiMoUI.js.map +1 -0
  155. package/dist/_chunks/{sign-document-B6HlyCGV.js → sign-document-D4iHS_Ug.js} +2 -2
  156. package/dist/_chunks/{sign-document-B6HlyCGV.js.map → sign-document-D4iHS_Ug.js.map} +1 -1
  157. package/dist/_chunks/{signature-request-rgMsgo-C.js → signature-request-DRuYAG5I.js} +2 -2
  158. package/dist/_chunks/{signature-request-rgMsgo-C.js.map → signature-request-DRuYAG5I.js.map} +1 -1
  159. package/dist/_chunks/{signed-out-frame-B2GTIeqA.js → signed-out-frame-AhMsNW1r.js} +2 -2
  160. package/dist/_chunks/{signed-out-frame-B2GTIeqA.js.map → signed-out-frame-AhMsNW1r.js.map} +1 -1
  161. package/dist/_chunks/{stat-51CDL4au.js → stat-DmjGfXND.js} +117 -108
  162. package/dist/_chunks/stat-DmjGfXND.js.map +1 -0
  163. package/dist/_chunks/{stepper-accordion-D7lnBGh2.js → stepper-accordion-DDTSOUHc.js} +17 -6
  164. package/dist/_chunks/stepper-accordion-DDTSOUHc.js.map +1 -0
  165. package/dist/_chunks/{task-editor-Ctxsa1BY.js → task-editor-NkcopDna.js} +4 -4
  166. package/dist/_chunks/{task-editor-Ctxsa1BY.js.map → task-editor-NkcopDna.js.map} +1 -1
  167. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js → use-appointment-details-read-CfFQNOF_.js} +5 -5
  168. package/dist/_chunks/{use-appointment-details-read-DinTrRIW.js.map → use-appointment-details-read-CfFQNOF_.js.map} +1 -1
  169. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js +26 -0
  170. package/dist/_chunks/use-select-on-arrow-Cr4iBuW5.js.map +1 -0
  171. package/dist/_chunks/{voice-control-panel-Bg1eklL0.js → voice-control-panel-BKbgb7FM.js} +2 -2
  172. package/dist/_chunks/{voice-control-panel-Bg1eklL0.js.map → voice-control-panel-BKbgb7FM.js.map} +1 -1
  173. package/dist/_chunks/{widget-picker-D8RiWrJd.js → widget-picker-rBA7MR5P.js} +2 -2
  174. package/dist/_chunks/{widget-picker-D8RiWrJd.js.map → widget-picker-rBA7MR5P.js.map} +1 -1
  175. package/dist/_chunks/{workflow-map-D3mezmGB.js → workflow-map-Demlpy39.js} +2 -2
  176. package/dist/_chunks/{workflow-map-D3mezmGB.js.map → workflow-map-Demlpy39.js.map} +1 -1
  177. package/dist/agent-catalog.json +28 -11
  178. package/dist/agent-i18n/en.json +8 -7
  179. package/dist/components/_shared/non-modal-tab-exit.d.ts +19 -0
  180. package/dist/components/_shared/non-modal-tab-exit.d.ts.map +1 -0
  181. package/dist/components/_shared/use-apex-chart-semantics.d.ts +6 -0
  182. package/dist/components/_shared/use-apex-chart-semantics.d.ts.map +1 -0
  183. package/dist/components/_shared/use-select-on-arrow.d.ts +20 -0
  184. package/dist/components/_shared/use-select-on-arrow.d.ts.map +1 -0
  185. package/dist/components/ai-credits-notice/index.js +1 -1
  186. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts +32 -0
  187. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts.map +1 -1
  188. package/dist/components/ai-permission-notice/index.d.ts +1 -1
  189. package/dist/components/ai-permission-notice/index.d.ts.map +1 -1
  190. package/dist/components/ai-permission-notice/index.js +1 -1
  191. package/dist/components/appointment-details-panel/index.js +1 -1
  192. package/dist/components/appointment-peek/index.js +1 -1
  193. package/dist/components/appointment-timeline/index.js +1 -1
  194. package/dist/components/bmi-calculator/index.js +1 -1
  195. package/dist/components/booking/index.js +1 -1
  196. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  197. package/dist/components/breadcrumb/index.js +1 -1
  198. package/dist/components/calculator-dialog/index.js +1 -1
  199. package/dist/components/care-plan-card/index.js +1 -1
  200. package/dist/components/care-plan-header/index.js +1 -1
  201. package/dist/components/chart/chart.d.ts +15 -10
  202. package/dist/components/chart/chart.d.ts.map +1 -1
  203. package/dist/components/chart/index.js +1 -1
  204. package/dist/components/clinical-note-card/index.js +1 -1
  205. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  206. package/dist/components/color-picker/index.js +1 -1
  207. package/dist/components/contact-card/index.js +1 -1
  208. package/dist/components/contact-profile-card/index.js +1 -1
  209. package/dist/components/cycle-calculator/index.js +1 -1
  210. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts +22 -0
  211. package/dist/components/dashboard-grid/dashboard-grid-engine.d.ts.map +1 -1
  212. package/dist/components/dashboard-grid/dashboard-grid.agent.d.ts.map +1 -1
  213. package/dist/components/dashboard-grid/dashboard-grid.d.ts +48 -4
  214. package/dist/components/dashboard-grid/dashboard-grid.d.ts.map +1 -1
  215. package/dist/components/dashboard-grid/index.js +1 -1
  216. package/dist/components/data-table/index.js +2 -2
  217. package/dist/components/data-table-tabs/index.js +1 -1
  218. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  219. package/dist/components/date-picker/index.js +1 -1
  220. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  221. package/dist/components/date-range-picker/index.js +1 -1
  222. package/dist/components/date-time-picker/date-time-picker.d.ts.map +1 -1
  223. package/dist/components/date-time-picker/index.js +1 -1
  224. package/dist/components/dependent-selector/dependent-selector.d.ts.map +1 -1
  225. package/dist/components/dependent-selector/index.js +1 -1
  226. package/dist/components/dialog/dialog.d.ts +2 -2
  227. package/dist/components/dialog/dialog.d.ts.map +1 -1
  228. package/dist/components/dialog/index.js +1 -1
  229. package/dist/components/document-preview/index.js +1 -1
  230. package/dist/components/due-date-calculator/index.js +1 -1
  231. package/dist/components/entity-summary/index.js +1 -1
  232. package/dist/components/file-manager/index.js +1 -1
  233. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  234. package/dist/components/freemium-paywall/index.js +1 -1
  235. package/dist/components/gestational-age-calculator/index.js +1 -1
  236. package/dist/components/hcg-doubling/index.js +1 -1
  237. package/dist/components/header-settings/index.js +1 -1
  238. package/dist/components/heatmap/index.js +1 -1
  239. package/dist/components/hover-card/hover-card.d.ts.map +1 -1
  240. package/dist/components/hover-card/index.js +1 -1
  241. package/dist/components/icon-picker/index.js +1 -1
  242. package/dist/components/info-tip/index.js +1 -1
  243. package/dist/components/key-value-pair/index.js +1 -1
  244. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  245. package/dist/components/link/index.js +1 -1
  246. package/dist/components/link/link.d.ts +5 -3
  247. package/dist/components/link/link.d.ts.map +1 -1
  248. package/dist/components/locale-picker/index.js +1 -1
  249. package/dist/components/message-tray/index.js +1 -1
  250. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  251. package/dist/components/nav-grid/index.js +1 -1
  252. package/dist/components/note-timeline/index.js +1 -1
  253. package/dist/components/notes-panel/index.js +1 -1
  254. package/dist/components/notification-tray/index.js +1 -1
  255. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  256. package/dist/components/patient-details/index.js +1 -1
  257. package/dist/components/patient-summary-card/index.js +1 -1
  258. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  259. package/dist/components/patient-table/index.js +1 -1
  260. package/dist/components/payment-card/index.js +1 -1
  261. package/dist/components/pdf-viewer/index.js +1 -1
  262. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  263. package/dist/components/periodontal-chart/index.js +1 -1
  264. package/dist/components/periodontal-chart-card/index.js +1 -1
  265. package/dist/components/periodontal-diagnosis/index.js +1 -1
  266. package/dist/components/phone-input/index.js +1 -1
  267. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  268. package/dist/components/popover/index.js +1 -1
  269. package/dist/components/popover/popover.d.ts +1 -1
  270. package/dist/components/popover/popover.d.ts.map +1 -1
  271. package/dist/components/position-grid/index.js +1 -1
  272. package/dist/components/position-grid/position-grid.d.ts.map +1 -1
  273. package/dist/components/practice-results/index.js +1 -1
  274. package/dist/components/pregnancy-dating/index.js +1 -1
  275. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  276. package/dist/components/product-hub-tray/index.js +1 -1
  277. package/dist/components/product-hub-tray/product-hub-tray.d.ts.map +1 -1
  278. package/dist/components/public-footer/index.js +1 -1
  279. package/dist/components/public-header/index.js +1 -1
  280. package/dist/components/radio-group/index.js +1 -1
  281. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  282. package/dist/components/radiograph-panel/index.js +1 -1
  283. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  284. package/dist/components/rich-text-editor/index.js +2 -2
  285. package/dist/components/sheet/index.js +1 -1
  286. package/dist/components/sheet/sheet.d.ts +2 -2
  287. package/dist/components/sheet/sheet.d.ts.map +1 -1
  288. package/dist/components/sign-document/index.js +1 -1
  289. package/dist/components/stat/index.d.ts +1 -1
  290. package/dist/components/stat/index.d.ts.map +1 -1
  291. package/dist/components/stat/index.js +1 -1
  292. package/dist/components/stat/stat.d.ts +9 -0
  293. package/dist/components/stat/stat.d.ts.map +1 -1
  294. package/dist/components/stepper-accordion/index.js +1 -1
  295. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
  296. package/dist/components/task-editor/index.js +1 -1
  297. package/dist/components/voice-control-panel/index.js +1 -1
  298. package/dist/components/widget-picker/index.js +1 -1
  299. package/dist/components/workflow/index.js +1 -1
  300. package/dist/host-legacy.css +13 -2
  301. package/dist/i18n/locales/ar.d.ts +17 -2
  302. package/dist/i18n/locales/ar.d.ts.map +1 -1
  303. package/dist/i18n/locales/ar.js +20 -5
  304. package/dist/i18n/locales/ar.js.map +1 -1
  305. package/dist/i18n/locales/de.d.ts +17 -2
  306. package/dist/i18n/locales/de.d.ts.map +1 -1
  307. package/dist/i18n/locales/de.js +20 -5
  308. package/dist/i18n/locales/de.js.map +1 -1
  309. package/dist/i18n/locales/el.d.ts +17 -2
  310. package/dist/i18n/locales/el.d.ts.map +1 -1
  311. package/dist/i18n/locales/el.js +20 -5
  312. package/dist/i18n/locales/el.js.map +1 -1
  313. package/dist/i18n/locales/en.d.ts +17 -2
  314. package/dist/i18n/locales/en.d.ts.map +1 -1
  315. package/dist/i18n/locales/en.js +20 -5
  316. package/dist/i18n/locales/en.js.map +1 -1
  317. package/dist/i18n/locales/es.d.ts +17 -2
  318. package/dist/i18n/locales/es.d.ts.map +1 -1
  319. package/dist/i18n/locales/es.js +20 -5
  320. package/dist/i18n/locales/es.js.map +1 -1
  321. package/dist/i18n/locales/fr.d.ts +17 -2
  322. package/dist/i18n/locales/fr.d.ts.map +1 -1
  323. package/dist/i18n/locales/fr.js +20 -5
  324. package/dist/i18n/locales/fr.js.map +1 -1
  325. package/dist/i18n/locales/hi.d.ts +17 -2
  326. package/dist/i18n/locales/hi.d.ts.map +1 -1
  327. package/dist/i18n/locales/hi.js +20 -5
  328. package/dist/i18n/locales/hi.js.map +1 -1
  329. package/dist/i18n/locales/it.d.ts +17 -2
  330. package/dist/i18n/locales/it.d.ts.map +1 -1
  331. package/dist/i18n/locales/it.js +20 -5
  332. package/dist/i18n/locales/it.js.map +1 -1
  333. package/dist/i18n/locales/ja.d.ts +17 -2
  334. package/dist/i18n/locales/ja.d.ts.map +1 -1
  335. package/dist/i18n/locales/ja.js +20 -5
  336. package/dist/i18n/locales/ja.js.map +1 -1
  337. package/dist/i18n/locales/nl.d.ts +17 -2
  338. package/dist/i18n/locales/nl.d.ts.map +1 -1
  339. package/dist/i18n/locales/nl.js +20 -5
  340. package/dist/i18n/locales/nl.js.map +1 -1
  341. package/dist/i18n/locales/pl.d.ts +17 -2
  342. package/dist/i18n/locales/pl.d.ts.map +1 -1
  343. package/dist/i18n/locales/pl.js +20 -5
  344. package/dist/i18n/locales/pl.js.map +1 -1
  345. package/dist/i18n/locales/pt.d.ts +17 -2
  346. package/dist/i18n/locales/pt.d.ts.map +1 -1
  347. package/dist/i18n/locales/pt.js +20 -5
  348. package/dist/i18n/locales/pt.js.map +1 -1
  349. package/dist/i18n/locales/ro.d.ts +17 -2
  350. package/dist/i18n/locales/ro.d.ts.map +1 -1
  351. package/dist/i18n/locales/ro.js +20 -5
  352. package/dist/i18n/locales/ro.js.map +1 -1
  353. package/dist/i18n/locales/ru.d.ts +17 -2
  354. package/dist/i18n/locales/ru.d.ts.map +1 -1
  355. package/dist/i18n/locales/ru.js +20 -5
  356. package/dist/i18n/locales/ru.js.map +1 -1
  357. package/dist/i18n/locales/sq.d.ts +17 -2
  358. package/dist/i18n/locales/sq.d.ts.map +1 -1
  359. package/dist/i18n/locales/sq.js +20 -5
  360. package/dist/i18n/locales/sq.js.map +1 -1
  361. package/dist/i18n/locales/sv.d.ts +17 -2
  362. package/dist/i18n/locales/sv.d.ts.map +1 -1
  363. package/dist/i18n/locales/sv.js +20 -5
  364. package/dist/i18n/locales/sv.js.map +1 -1
  365. package/dist/i18n/locales/tr.d.ts +17 -2
  366. package/dist/i18n/locales/tr.d.ts.map +1 -1
  367. package/dist/i18n/locales/tr.js +20 -5
  368. package/dist/i18n/locales/tr.js.map +1 -1
  369. package/dist/i18n/locales/zh.d.ts +17 -2
  370. package/dist/i18n/locales/zh.d.ts.map +1 -1
  371. package/dist/i18n/locales/zh.js +20 -5
  372. package/dist/i18n/locales/zh.js.map +1 -1
  373. package/dist/index.js +207 -206
  374. package/dist/locales/ar.json +20 -5
  375. package/dist/locales/de.json +20 -5
  376. package/dist/locales/el.json +20 -5
  377. package/dist/locales/en.json +20 -5
  378. package/dist/locales/es.json +20 -5
  379. package/dist/locales/fr.json +20 -5
  380. package/dist/locales/hi.json +20 -5
  381. package/dist/locales/it.json +20 -5
  382. package/dist/locales/ja.json +20 -5
  383. package/dist/locales/nl.json +20 -5
  384. package/dist/locales/pl.json +20 -5
  385. package/dist/locales/pt.json +20 -5
  386. package/dist/locales/ro.json +20 -5
  387. package/dist/locales/ru.json +20 -5
  388. package/dist/locales/sq.json +20 -5
  389. package/dist/locales/sv.json +20 -5
  390. package/dist/locales/tr.json +20 -5
  391. package/dist/locales/zh.json +20 -5
  392. package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts +10 -13
  393. package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts.map +1 -1
  394. package/dist/patterns/alia-assistant/alia-chat-surface.d.ts.map +1 -1
  395. package/dist/patterns/alia-assistant/alia-popout.d.ts +5 -3
  396. package/dist/patterns/alia-assistant/alia-popout.d.ts.map +1 -1
  397. package/dist/patterns/alia-assistant/index.d.ts +2 -0
  398. package/dist/patterns/alia-assistant/index.d.ts.map +1 -1
  399. package/dist/patterns/alia-assistant/index.js +6 -5
  400. package/dist/patterns/anamnesis/index.js +1 -1
  401. package/dist/patterns/calendar/index.js +1 -1
  402. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +2 -2
  403. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts.map +1 -1
  404. package/dist/patterns/help-me-write-templates/index.js +1 -1
  405. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  406. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +7 -2
  407. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  408. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  409. package/dist/patterns/registration-form/index.js +1 -1
  410. package/dist/patterns/signature-request/index.js +1 -1
  411. package/dist/patterns/signed-out-frame/index.js +1 -1
  412. package/dist/tokens.css +13 -2
  413. package/package.json +1 -1
  414. package/dist/_chunks/ai-permission-notice-5vpblPCx.js +0 -171
  415. package/dist/_chunks/ai-permission-notice-5vpblPCx.js.map +0 -1
  416. package/dist/_chunks/alia-sidebar-DS0b54Mv.js +0 -1183
  417. package/dist/_chunks/alia-sidebar-DS0b54Mv.js.map +0 -1
  418. package/dist/_chunks/breadcrumb-xgVpPH2H.js.map +0 -1
  419. package/dist/_chunks/chart-C2RBJERE.js +0 -705
  420. package/dist/_chunks/chart-C2RBJERE.js.map +0 -1
  421. package/dist/_chunks/color-picker-BRQ4Y9SO.js.map +0 -1
  422. package/dist/_chunks/dashboard-grid-SAGoyCtL.js +0 -691
  423. package/dist/_chunks/dashboard-grid-SAGoyCtL.js.map +0 -1
  424. package/dist/_chunks/date-picker-wRAcq2lt.js.map +0 -1
  425. package/dist/_chunks/date-range-picker-BOvHwWO5.js.map +0 -1
  426. package/dist/_chunks/date-time-picker-CLeLKuv9.js.map +0 -1
  427. package/dist/_chunks/dependent-selector-Bet3XAFj.js.map +0 -1
  428. package/dist/_chunks/dialog-D52AI4nF.js.map +0 -1
  429. package/dist/_chunks/freemium-paywall-B6ojVXq7.js.map +0 -1
  430. package/dist/_chunks/help-me-write-templates-B7L3zGsE.js.map +0 -1
  431. package/dist/_chunks/hover-card-BnTueNS2.js.map +0 -1
  432. package/dist/_chunks/key-value-pair-Ax8IJr1M.js.map +0 -1
  433. package/dist/_chunks/link-2HokYuIi.js +0 -130
  434. package/dist/_chunks/link-2HokYuIi.js.map +0 -1
  435. package/dist/_chunks/marketplace-app-shell-Dcx-JEjg.js.map +0 -1
  436. package/dist/_chunks/message-tray-BB95DA82.js.map +0 -1
  437. package/dist/_chunks/notification-tray-__sJXnsz.js.map +0 -1
  438. package/dist/_chunks/pdf-viewer-C3minW5b.js.map +0 -1
  439. package/dist/_chunks/phone-input-DxkHMYmu.js.map +0 -1
  440. package/dist/_chunks/popover-BI3oV3eY.js +0 -305
  441. package/dist/_chunks/popover-BI3oV3eY.js.map +0 -1
  442. package/dist/_chunks/position-grid-D2D5_Tze.js.map +0 -1
  443. package/dist/_chunks/product-hub-panel-BSSiGGG4.js.map +0 -1
  444. package/dist/_chunks/radio-group-BT97ty7o.js.map +0 -1
  445. package/dist/_chunks/rich-text-editor-Blp4smUr.js.map +0 -1
  446. package/dist/_chunks/sheet-CNFW8mYZ.js.map +0 -1
  447. package/dist/_chunks/stat-51CDL4au.js.map +0 -1
  448. package/dist/_chunks/stepper-accordion-D7lnBGh2.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-card-U_ZYoh1n.js","sources":["../../src/components/hover-card/hover-card.agent.ts","../../src/components/hover-card/hover-card.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — HoverCard. */\n/* */\n/* Unlike Tooltip, a hover card holds interactive content, so an agent */\n/* has a legitimate reason to open one and read its state. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { HoverCardHandle } from './hover-card';\n\nexport const hoverCardAgent: AgentAdapter<HoverCardHandle> = {\n id: 'hover-card',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.hoverCard.state.isOpen',\n description: 'True when the hover card is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.hoverCard.actions.open',\n description: 'Open the hover card without moving focus into it.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.hoverCard.actions.close',\n description: 'Close the hover card.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: { attr: 'data-component', value: 'hover-card' },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on HoverCard.Root.',\n },\n },\n};\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport {\n findPopoverTrigger,\n useNonModalTabExit,\n} from '../_shared/non-modal-tab-exit';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { useAgentRegistration } from '../../agent';\nimport { hoverCardAgent } from './hover-card.agent';\n\n/* -------------------------------------------------------------------- */\n/* Logical → physical side */\n/* -------------------------------------------------------------------- */\n\nexport type HoverCardSide = 'top' | 'end' | 'bottom' | 'start';\n\nfunction resolvePhysicalSide(\n logicalSide: HoverCardSide,\n isRtl: boolean,\n): 'left' | 'top' | 'right' | 'bottom' {\n if (logicalSide === 'top' || logicalSide === 'bottom') return logicalSide;\n if (logicalSide === 'start') return isRtl ? 'right' : 'left';\n /* logicalSide === 'end' */\n return isRtl ? 'left' : 'right';\n}\n\n/* -------------------------------------------------------------------- */\n/* Contexts */\n/* -------------------------------------------------------------------- */\n\ninterface HoverCardA11yContext {\n headingId: string | undefined;\n setHeadingId: (id: string | undefined) => void;\n}\n\nconst A11yContext = createContext<HoverCardA11yContext>({\n headingId: undefined,\n setHeadingId: () => {},\n});\n\ninterface HoverCardRootContext {\n /** Keeps the card open while the pointer or focus is inside the content. */\n cancelClose: () => void;\n closeWithDelay: () => void;\n /** True when this open should move focus into the card. */\n shouldFocusOnOpen: () => boolean;\n /** True when focus was actually moved in, so closing may return it. */\n didMoveFocus: () => boolean;\n noteMovedFocus: () => void;\n /** Called when closing hands focus back, so the trigger's focus handler\n * does not read that return as a fresh Tab and reopen the card. */\n noteFocusReturn: () => void;\n clearMovedFocus: () => void;\n registerContent: (node: HTMLDivElement | null) => void;\n /** The trigger node, used to resolve the reading direction. Content is\n * portalled to body, so only the trigger can see a scoped [dir]. */\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n instanceId: string | undefined;\n}\n\nconst RootContext = createContext<HoverCardRootContext>({\n cancelClose: () => {},\n closeWithDelay: () => {},\n shouldFocusOnOpen: () => false,\n didMoveFocus: () => false,\n noteMovedFocus: () => {},\n noteFocusReturn: () => {},\n clearMovedFocus: () => {},\n registerContent: () => {},\n triggerRef: { current: null },\n instanceId: undefined,\n});\n\n/** `flush` moves padding from the Content onto the inner slots, so Media can\n * bleed to the card's edge. */\nconst PaddingContext = createContext<'default' | 'flush'>('default');\n\n/* -------------------------------------------------------------------- */\n/* CVA — content surface */\n/* -------------------------------------------------------------------- */\n\nconst contentVariants = cva(\n [\n // Same elevated surface as Popover: `--card-border` at 32% alpha reads as\n // a subtle edge in both themes, where the shadow alone lets the card\n // float as an unbounded blob on dark. Forced colours upgrade it to a\n // fully visible `CanvasText` edge.\n 'ds:relative ds:bg-[var(--popover)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:max-w-[calc(100vw-var(--spacing-lg))]',\n 'ds:z-[var(--z-popover)]',\n 'ds:text-[var(--popover-foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:break-words',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=closed]:fade-out-0 ds:data-[state=open]:fade-in-0',\n 'ds:data-[state=closed]:zoom-out-95 ds:data-[state=open]:zoom-in-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2 ds:data-[side=left]:slide-in-from-right-2',\n 'ds:data-[side=right]:slide-in-from-left-2 ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:transition-none ds:motion-reduce:animate-none',\n 'ds:forced-colors:border-[CanvasText]',\n 'ds:focus-visible:outline-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:w-[var(--popover-size-sm)]',\n md: 'ds:w-[var(--popover-size-md)]',\n lg: 'ds:w-[var(--popover-size-lg)]',\n },\n padding: {\n default: 'ds:p-[var(--spacing-md)]',\n // Media bleeds to the edge, so the slots pad themselves instead.\n flush: 'ds:p-[var(--spacing-none)] ds:overflow-hidden',\n },\n },\n defaultVariants: {\n size: 'md',\n padding: 'default',\n },\n },\n);\n\n/* -------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------- */\n\n// Curated agent-readiness handle — see hover-card.agent.ts.\nexport interface HoverCardHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface HoverCardProps {\n children: ReactNode;\n /**\n * How the card opens. `hover-or-click` (the default) opens on pointer hover\n * without taking focus, and on click, tap or Enter with focus moved into the\n * card so the footer actions are reachable. `click` disables hover entirely.\n */\n openOn?: 'hover-or-click' | 'click';\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Delay before a hover opens the card, in ms. Default 300. */\n openDelay?: number;\n /** Grace period before a pointer leaving closes the card, in ms. Default 300. */\n closeDelay?: number;\n /** Opaque instance id — emitted on Content as `data-component-id`. */\n id?: string;\n}\n\nfunction HoverCardRoot({\n children,\n openOn = 'hover-or-click',\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n openDelay = 300,\n closeDelay = 300,\n id,\n}: HoverCardProps) {\n const [internalOpen, setInternalOpen] = useState(defaultOpen ?? false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n useEffect(() => clearTimer, [clearTimer]);\n\n /* Focus bookkeeping. A hover must never pull focus off whatever the user is\n doing; a click or Enter must move focus in, or the footer buttons are\n unreachable. `focusOnOpen` decides which, and `movedFocus` records whether\n closing is allowed to hand focus back to the trigger. */\n const focusOnOpenRef = useRef(false);\n const movedFocusRef = useRef(false);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const openWithDelay = useCallback(() => {\n clearTimer();\n timerRef.current = setTimeout(() => {\n focusOnOpenRef.current = false;\n setOpen(true);\n }, openDelay);\n }, [clearTimer, openDelay, setOpen]);\n\n const closeWithDelay = useCallback(() => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay, setOpen]);\n\n /* Closing hands focus back to the trigger, which fires the trigger's focus\n handler and would reopen the card it just closed — an Escape that does\n nothing. The return is swallowed once, with a timeout as a safety net so\n a suppression can never outlive the interaction that armed it. */\n const suppressFocusOpenRef = useRef(false);\n const suppressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const noteFocusReturn = useCallback(() => {\n suppressFocusOpenRef.current = true;\n if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);\n suppressTimerRef.current = setTimeout(() => {\n suppressFocusOpenRef.current = false;\n }, 100);\n }, []);\n useEffect(\n () => () => {\n if (suppressTimerRef.current) clearTimeout(suppressTimerRef.current);\n },\n [],\n );\n\n /** Tabbing onto the trigger reveals the card at once, but leaves focus on\n * the trigger so a keyboard user can pass by without being pulled in. */\n const openOnFocus = useCallback(() => {\n if (suppressFocusOpenRef.current) {\n suppressFocusOpenRef.current = false;\n return;\n }\n clearTimer();\n focusOnOpenRef.current = false;\n setOpen(true);\n }, [clearTimer, setOpen]);\n\n const focusContent = useCallback(() => {\n movedFocusRef.current = true;\n contentRef.current?.focus();\n }, []);\n\n /* Press bookkeeping. \"Was the card open?\" is the wrong question: hover and\n Tab both reveal it, so by the time Enter or a click arrives it is already\n open and a naive toggle would close what the user is trying to enter.\n The right question is whether focus was already INSIDE the card, which\n separates \"take me in\" from \"I am in, let me out\".\n\n It must be snapshotted at press start, not read at click time, because\n pointerdown moves focus to the trigger and would erase the answer.\n `null` means an orphan press (a programmatic `.click()`, or assistive\n tech dispatching click alone) and is treated as \"take me in\". */\n const focusWasInsideRef = useRef<boolean | null>(null);\n const notePressStart = useCallback(() => {\n const content = contentRef.current;\n focusWasInsideRef.current = Boolean(\n content && content.contains(document.activeElement),\n );\n }, []);\n\n const handleTriggerClick = useCallback(() => {\n const focusWasInside = focusWasInsideRef.current;\n focusWasInsideRef.current = null;\n if (focusWasInside === true) {\n setOpen(false);\n return;\n }\n focusOnOpenRef.current = true;\n if (isOpenRef.current) {\n // Hover or Tab already opened it, so no state change will fire\n // onOpenAutoFocus. Move focus in directly.\n focusContent();\n } else {\n setOpen(true);\n }\n }, [focusContent, setOpen]);\n\n const agentHandle = useMemo<HoverCardHandle>(\n () => ({\n getIsOpen: () => isOpenRef.current,\n open: () => {\n focusOnOpenRef.current = false;\n setOpen(true);\n },\n close: () => setOpen(false),\n }),\n [setOpen],\n );\n useAgentRegistration(hoverCardAgent, agentHandle, id);\n\n const [headingId, setHeadingId] = useState<string | undefined>(undefined);\n\n const isHoverMode = openOn === 'hover-or-click';\n\n const rootValue = useMemo<HoverCardRootContext>(\n () => ({\n cancelClose: clearTimer,\n closeWithDelay: isHoverMode ? closeWithDelay : () => {},\n shouldFocusOnOpen: () => focusOnOpenRef.current,\n didMoveFocus: () => movedFocusRef.current,\n noteMovedFocus: () => {\n movedFocusRef.current = true;\n },\n noteFocusReturn,\n clearMovedFocus: () => {\n movedFocusRef.current = false;\n },\n registerContent: (node) => {\n contentRef.current = node;\n },\n triggerRef,\n instanceId: id,\n }),\n [clearTimer, closeWithDelay, id, isHoverMode, noteFocusReturn],\n );\n\n const triggerValue = useMemo<HoverCardTriggerContext>(\n () => ({\n isHoverMode,\n openOnFocus,\n openWithDelay,\n closeWithDelay,\n cancelClose: clearTimer,\n notePressStart,\n onClick: handleTriggerClick,\n }),\n [\n clearTimer,\n closeWithDelay,\n handleTriggerClick,\n isHoverMode,\n notePressStart,\n openOnFocus,\n openWithDelay,\n ],\n );\n\n return (\n <A11yContext.Provider value={{ headingId, setHeadingId }}>\n <RootContext.Provider value={rootValue}>\n <TriggerContext.Provider value={triggerValue}>\n <RadixPopover.Root open={isOpen} onOpenChange={setOpen}>\n {children}\n </RadixPopover.Root>\n </TriggerContext.Provider>\n </RootContext.Provider>\n </A11yContext.Provider>\n );\n}\nHoverCardRoot.displayName = 'HoverCard.Root';\n\n/* -------------------------------------------------------------------- */\n/* Trigger */\n/* -------------------------------------------------------------------- */\n\ninterface HoverCardTriggerContext {\n isHoverMode: boolean;\n openOnFocus: () => void;\n openWithDelay: () => void;\n closeWithDelay: () => void;\n cancelClose: () => void;\n notePressStart: () => void;\n onClick: () => void;\n}\n\nconst TriggerContext = createContext<HoverCardTriggerContext>({\n isHoverMode: true,\n openOnFocus: () => {},\n openWithDelay: () => {},\n closeWithDelay: () => {},\n cancelClose: () => {},\n notePressStart: () => {},\n onClick: () => {},\n});\n\nexport type HoverCardTriggerProps = ComponentPropsWithoutRef<\n typeof RadixPopover.Trigger\n>;\n\nconst HoverCardTrigger = forwardRef<HTMLButtonElement, HoverCardTriggerProps>(\n (\n {\n children,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onPointerDown,\n onKeyDown,\n onClick,\n ...props\n },\n ref,\n ) => {\n const ctx = useContext(TriggerContext);\n const { triggerRef } = useContext(RootContext);\n\n const setRefs = useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref, triggerRef],\n );\n\n return (\n <RadixPopover.Trigger\n ref={setRefs}\n onMouseEnter={(event) => {\n if (ctx.isHoverMode) ctx.openWithDelay();\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n if (ctx.isHoverMode) ctx.closeWithDelay();\n onMouseLeave?.(event);\n }}\n onFocus={(event) => {\n if (ctx.isHoverMode) ctx.openOnFocus();\n onFocus?.(event);\n }}\n onBlur={(event) => {\n if (ctx.isHoverMode) ctx.closeWithDelay();\n onBlur?.(event);\n }}\n onPointerDown={(event) => {\n ctx.notePressStart();\n onPointerDown?.(event);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') ctx.notePressStart();\n onKeyDown?.(event);\n }}\n onClick={(event) => {\n // Own the toggle outright: Radix's own click toggle would close a\n // card that this very press had just opened via focus.\n event.preventDefault();\n ctx.onClick();\n onClick?.(event);\n }}\n {...props}\n >\n {children}\n </RadixPopover.Trigger>\n );\n },\n);\nHoverCardTrigger.displayName = 'HoverCard.Trigger';\n\nexport type HoverCardAnchorProps = ComponentPropsWithoutRef<\n typeof RadixPopover.Anchor\n>;\n\nconst HoverCardAnchor = forwardRef<\n ElementRef<typeof RadixPopover.Anchor>,\n HoverCardAnchorProps\n>((props, ref) => {\n const { triggerRef } = useContext(RootContext);\n const setRefs = useCallback(\n (node: ElementRef<typeof RadixPopover.Anchor> | null) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref, triggerRef],\n );\n // A virtual anchor renders nothing, so record the element it measures, and\n // forget it when it changes or unmounts, unless something else replaced it.\n const virtual = props.virtualRef?.current;\n useEffect(() => {\n if (!(virtual instanceof HTMLElement)) return;\n triggerRef.current = virtual;\n return () => {\n if (triggerRef.current === virtual) triggerRef.current = null;\n };\n }, [virtual, triggerRef]);\n\n return <RadixPopover.Anchor ref={setRefs} {...props} />;\n});\nHoverCardAnchor.displayName = 'HoverCard.Anchor';\n\n/* -------------------------------------------------------------------- */\n/* Content */\n/* -------------------------------------------------------------------- */\n\nexport interface HoverCardContentProps\n extends\n Omit<\n ComponentPropsWithoutRef<typeof RadixPopover.Content>,\n 'side' | 'align'\n >,\n VariantProps<typeof contentVariants> {\n /** Logical side, resolved against the reading direction. Default `'top'`. */\n side?: HoverCardSide;\n align?: 'start' | 'center' | 'end';\n size?: 'sm' | 'md' | 'lg';\n padding?: 'default' | 'flush';\n /** Render the arrow. Default `true`. */\n showArrow?: boolean;\n /** Render a close button, for touch users on a card with actions. */\n showClose?: boolean;\n /**\n * An action pinned to the top-end corner — the same slot `showClose` uses.\n * For a card whose ANCHOR has a real open action, so the card mirrors it\n * instead of describing it in prose (\"Click to open …\"). Only give a card\n * one when the trigger genuinely opens something; a card that merely points\n * somewhere else should say so in a hint line, because an icon button there\n * promises a click the anchor does not have.\n *\n * A card carrying one must be interactive — the pointer has to be able to\n * travel into it — so do not combine it with a pointer-events-none peek.\n */\n headerAction?: ReactNode;\n className?: string;\n children: ReactNode;\n}\n\nconst HoverCardContent = forwardRef<HTMLDivElement, HoverCardContentProps>(\n (\n {\n side = 'top',\n align = 'center',\n size = 'md',\n padding = 'default',\n showArrow = true,\n showClose = false,\n headerAction,\n dir: providedDirection,\n className,\n children,\n onOpenAutoFocus,\n onCloseAutoFocus,\n onMouseEnter,\n onMouseLeave,\n onFocusCapture,\n onKeyDown,\n ...props\n },\n ref,\n ) => {\n const { headingId } = useContext(A11yContext);\n const root = useContext(RootContext);\n const getAnchor = useCallback(\n (content: HTMLElement) =>\n root.triggerRef.current ?? findPopoverTrigger(content),\n [root.triggerRef],\n );\n // A hover-opened card never holds focus. Shift+Tab back to the trigger\n // leaves the card open, as focus on the trigger shows it anyway.\n const exitOnTab = useNonModalTabExit(true, { getAnchor });\n const { t } = useTranslation('ui');\n const [isRtl, setIsRtl] = useState(false);\n const localRef = useRef<HTMLDivElement | null>(null);\n\n const setRefs = useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n root.registerContent(node);\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref, root],\n );\n\n // Read direction from the TRIGGER, not from this content: the content is\n // portalled to body, where `closest('[dir]')` can only ever find <html>.\n // Reading the trigger lets one RTL region inside an LTR page resolve\n // start/end correctly.\n useEffect(() => {\n const anchor = root.triggerRef.current;\n const scoped = anchor?.closest('[dir]');\n const resolved =\n scoped?.getAttribute('dir') ?? document.documentElement.dir ?? 'ltr';\n setIsRtl(resolved === 'rtl');\n }, [root.triggerRef]);\n\n const contentDirection = providedDirection ?? (isRtl ? 'rtl' : 'ltr');\n const directionIsRtl = contentDirection === 'rtl';\n const physicalSide = resolvePhysicalSide(side, directionIsRtl);\n // Radix resolves `align` physically unless a DirectionProvider is present,\n // which the kit does not mount. On the block axis (a card on the inline\n // start or end) align is unaffected by direction; on the inline axis it\n // must be mirrored by hand so `align=\"start\"` means the reading start.\n const isInlineAxis = physicalSide === 'top' || physicalSide === 'bottom';\n const physicalAlign =\n directionIsRtl && isInlineAxis && align !== 'center'\n ? align === 'start'\n ? 'end'\n : 'start'\n : align;\n\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={setRefs}\n dir={contentDirection}\n side={physicalSide}\n align={physicalAlign}\n sideOffset={8}\n collisionPadding={8}\n aria-labelledby={headingId}\n className={contentVariants({ size, padding, className })}\n data-component=\"hover-card\"\n data-component-id={root.instanceId}\n onOpenAutoFocus={(event) => {\n // A hover-opened card must not take focus; a click- or\n // Enter-opened one must, or the footer actions are unreachable.\n if (root.shouldFocusOnOpen()) root.noteMovedFocus();\n else event.preventDefault();\n onOpenAutoFocus?.(event);\n }}\n onCloseAutoFocus={(event) => {\n // Only hand focus back if we took it in the first place, and warn\n // the trigger that the focus it is about to receive is a return.\n if (root.didMoveFocus()) root.noteFocusReturn();\n else event.preventDefault();\n root.clearMovedFocus();\n onCloseAutoFocus?.(event);\n }}\n onMouseEnter={(event) => {\n root.cancelClose();\n onMouseEnter?.(event);\n }}\n onMouseLeave={(event) => {\n root.closeWithDelay();\n onMouseLeave?.(event);\n }}\n onFocusCapture={(event) => {\n root.cancelClose();\n onFocusCapture?.(event);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n exitOnTab(event);\n }}\n {...props}\n >\n <PaddingContext.Provider value={padding}>\n {children}\n </PaddingContext.Provider>\n {showClose || headerAction ? (\n <div\n className={[\n 'ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]',\n 'ds:z-[1] ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]',\n ].join(' ')}\n >\n {headerAction}\n {showClose ? (\n <RadixPopover.Close asChild>\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('common.close', 'Close')}\n />\n </RadixPopover.Close>\n ) : null}\n </div>\n ) : null}\n {showArrow ? (\n // Radix places the arrow on the resolved side and keeps it over\n // the trigger through collision flip and shift.\n //\n // A custom path, not the default polygon, so the card's OUTLINE\n // carries on around the point instead of stopping dead at it. The\n // path is left open (no `Z`), so the fill closes the triangle\n // while the stroke draws only the two slanted sides — a closed\n // path would rule a line straight across the arrow's base.\n // `-translate-y-px` then tucks that base a hairline under the\n // card, so the card's own border does not show through it. The\n // translate is applied inside Radix's rotation wrapper, so \"up\"\n // means \"towards the card\" on every side.\n <RadixPopover.Arrow asChild width={12} height={6}>\n <svg\n viewBox=\"0 0 12 6\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n className=\"ds:-translate-y-px ds:fill-[var(--popover)] ds:stroke-[color:var(--card-border)]\"\n >\n <path d=\"M0 0 L6 6 L12 0\" strokeLinejoin=\"round\" />\n </svg>\n </RadixPopover.Arrow>\n ) : null}\n </RadixPopover.Content>\n </RadixPopover.Portal>\n );\n },\n);\nHoverCardContent.displayName = 'HoverCard.Content';\n\n/* -------------------------------------------------------------------- */\n/* Slots */\n/* -------------------------------------------------------------------- */\n\n/** The media slot: an avatar row, a thumbnail, or a banner. Under\n * `padding=\"flush\"` it bleeds to the card's edge. */\nconst HoverCardMedia = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"media\"\n className={['ds:flex ds:items-center ds:gap-[var(--spacing-sm)]', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nHoverCardMedia.displayName = 'HoverCard.Media';\n\n/**\n * The card's category line, above the heading: \"Signing\", \"Billing\",\n * \"Anamnesis\". It says WHICH KIND of thing the reader is looking at, so a\n * card that appears under the pointer is self-describing without repeating\n * the chip's own words in the heading.\n *\n * Decorative by role: the heading carries the meaning and the accessible\n * name, so the eyebrow is quiet type and adds no landmark of its own.\n */\nconst HoverCardEyebrow = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"eyebrow\"\n className={[\n 'ds:m-0 type-eyebrow ds:text-[color:var(--muted-foreground)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nHoverCardEyebrow.displayName = 'HoverCard.Eyebrow';\n\nexport interface HoverCardHeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n}\n\nconst HoverCardHeading = forwardRef<HTMLHeadingElement, HoverCardHeadingProps>(\n ({ as: Tag = 'h3', id: providedId, className, ...props }, ref) => {\n const generatedId = useId();\n const headingId = providedId ?? generatedId;\n const { setHeadingId } = useContext(A11yContext);\n const padding = useContext(PaddingContext);\n\n useEffect(() => {\n setHeadingId(headingId);\n return () => setHeadingId(undefined);\n }, [headingId, setHeadingId]);\n\n return (\n <Tag\n ref={ref}\n id={headingId}\n data-slot=\"heading\"\n className={[\n 'type-title-item ds:leading-snug ds:break-words',\n padding === 'flush'\n ? 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-md)]'\n : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n },\n);\nHoverCardHeading.displayName = 'HoverCard.Heading';\n\n/** The body slot. A `div`, not a `p`: a hover card body routinely holds\n * KeyValuePairs and chips, and a `p` may only contain phrasing content. */\nconst HoverCardBody = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const padding = useContext(PaddingContext);\n\n return (\n <div\n ref={ref}\n data-slot=\"body\"\n className={[\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n 'ds:mt-[var(--spacing-xs)]',\n padding === 'flush'\n ? 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pb-[var(--spacing-md)]'\n : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nHoverCardBody.displayName = 'HoverCard.Body';\n\n/** The action row. Actions sit at the inline end; anything that should stay at\n * the inline start (a status badge) gets `ds:me-auto`. */\nconst HoverCardFooter = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const padding = useContext(PaddingContext);\n\n return (\n <div\n ref={ref}\n data-slot=\"footer\"\n className={[\n 'ds:flex ds:flex-wrap ds:items-center ds:justify-end',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:border-t ds:border-[color:var(--card-border)]',\n padding === 'flush'\n ? 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]'\n : 'ds:mt-[var(--spacing-md)] ds:pt-[var(--spacing-md)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n );\n});\nHoverCardFooter.displayName = 'HoverCard.Footer';\n\n/* -------------------------------------------------------------------- */\n/* useHoverCardTiming */\n/* */\n/* Lets a CUSTOM anchored trigger — one that can't use `Trigger asChild` */\n/* because it already spends its one asChild slot elsewhere (a */\n/* DropdownMenu's own trigger, say) — share the SAME close timer */\n/* `Content` itself cancels/re-arms on hover and focus. Without this, */\n/* an anchored trigger that keeps its own separate close timer goes */\n/* stale the moment the pointer or focus moves onto the (portalled) */\n/* content: `Content`'s built-in handlers cancel ROOT's timer, which */\n/* was never the one counting down, so the card closes under the user's */\n/* cursor. Call this from a descendant of `HoverCard` (anywhere inside */\n/* the tree the Root provides context to), drive your own open timing, */\n/* but always close through `closeWithDelay` / `cancelClose` here — */\n/* never a private `setTimeout`. */\n/* -------------------------------------------------------------------- */\nexport function useHoverCardTiming(): {\n cancelClose: () => void;\n closeWithDelay: () => void;\n} {\n const { cancelClose, closeWithDelay } = useContext(RootContext);\n return { cancelClose, closeWithDelay };\n}\n\n/* -------------------------------------------------------------------- */\n\nexport const HoverCard = Object.assign(HoverCardRoot, {\n Root: HoverCardRoot,\n Trigger: HoverCardTrigger,\n // Anchor the card to an arbitrary element when a trigger button is\n // unsuitable, such as a calendar grid cell.\n Anchor: HoverCardAnchor,\n Content: HoverCardContent,\n Media: HoverCardMedia,\n Eyebrow: HoverCardEyebrow,\n Heading: HoverCardHeading,\n Body: HoverCardBody,\n Footer: HoverCardFooter,\n});\n"],"names":["hoverCardAgent","handle","resolvePhysicalSide","logicalSide","isRtl","A11yContext","createContext","RootContext","PaddingContext","contentVariants","cva","HoverCardRoot","children","openOn","controlledOpen","defaultOpen","onOpenChange","openDelay","closeDelay","id","internalOpen","setInternalOpen","useState","isControlled","isOpen","setOpen","useCallback","next","isOpenRef","useRef","useEffect","timerRef","clearTimer","focusOnOpenRef","movedFocusRef","contentRef","triggerRef","openWithDelay","closeWithDelay","suppressFocusOpenRef","suppressTimerRef","noteFocusReturn","openOnFocus","focusContent","_a","focusWasInsideRef","notePressStart","content","handleTriggerClick","focusWasInside","agentHandle","useMemo","useAgentRegistration","headingId","setHeadingId","isHoverMode","rootValue","node","triggerValue","jsx","TriggerContext","RadixPopover","HoverCardTrigger","forwardRef","onMouseEnter","onMouseLeave","onFocus","onBlur","onPointerDown","onKeyDown","onClick","props","ref","ctx","useContext","setRefs","event","HoverCardAnchor","virtual","HoverCardContent","side","align","size","padding","showArrow","showClose","headerAction","providedDirection","className","onOpenAutoFocus","onCloseAutoFocus","onFocusCapture","root","getAnchor","findPopoverTrigger","exitOnTab","useNonModalTabExit","t","useTranslation","setIsRtl","localRef","anchor","scoped","resolved","contentDirection","directionIsRtl","physicalSide","physicalAlign","jsxs","IconButton","X","HoverCardMedia","HoverCardEyebrow","HoverCardHeading","Tag","providedId","generatedId","useId","HoverCardBody","HoverCardFooter","useHoverCardTiming","cancelClose","HoverCard"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as S, 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-BI3oV3eY.js";
5
+ import { P as k } from "./popover-BG75rYjN.js";
6
6
  import { B as D } from "./button-Bn16lcFM.js";
7
7
  import { S as E } from "./state-backed-text-input-DECQy5aA.js";
8
8
  import { u as G } from "./registry-DvAUVLHh.js";
@@ -269,4 +269,4 @@ export {
269
269
  X as I,
270
270
  U as i
271
271
  };
272
- //# sourceMappingURL=icon-picker-DWrqmI1c.js.map
272
+ //# sourceMappingURL=icon-picker-C86lQTIA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"icon-picker-DWrqmI1c.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 { StateBackedTextInput } from '../_shared/state-backed-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('ui');\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 <StateBackedTextInput\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","StateBackedTextInput","event","Search","selected"],"mappings":"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"}
1
+ {"version":3,"file":"icon-picker-C86lQTIA.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 { StateBackedTextInput } from '../_shared/state-backed-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('ui');\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 <StateBackedTextInput\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","StateBackedTextInput","event","Search","selected"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as u, jsx as i } from "react/jsx-runtime";
2
2
  import { forwardRef as I, useState as O, useRef as m, useEffect as k, useMemo as z } from "react";
3
3
  import { c as C } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as D } from "react-i18next";
5
- import { P as o } from "./popover-BI3oV3eY.js";
5
+ import { P as o } from "./popover-BG75rYjN.js";
6
6
  import { u as P } from "./registry-DvAUVLHh.js";
7
7
  import { I as A } from "./info-CGn22peZ.js";
8
8
  const R = {
@@ -163,4 +163,4 @@ export {
163
163
  j as I,
164
164
  R as i
165
165
  };
166
- //# sourceMappingURL=info-tip-B0jmIt6M.js.map
166
+ //# sourceMappingURL=info-tip-CJpNpzZe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"info-tip-B0jmIt6M.js","sources":["../../src/components/info-tip/info-tip.agent.ts","../../src/components/info-tip/info-tip.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { InfoTipHandle } from './info-tip';\n\nexport const infoTipAgent: AgentAdapter<InfoTipHandle> = {\n id: 'info-tip',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.infoTip.state.isOpen',\n description: 'True when the info tip card is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.infoTip.actions.open',\n description: 'Open the info tip card.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.infoTip.actions.close',\n description: 'Close the info tip card.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'info-tip',\n description: 'Marks the InfoTip trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on InfoTip.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { useAgentRegistration } from '../../agent';\nimport { infoTipAgent } from './info-tip.agent';\n\n/* -------------------------------------------------------------------- */\n/* Trigger — a small circular, branded affordance: card surface inside */\n/* the circle, accent ring + accent \"i\" glyph, and a soft drop shadow. */\n/* The accent alias is safe here: `--accent` resolves to magenta-700 in */\n/* light mode (the AA-safe interactive step) and the dark accent on dark */\n/* surfaces — never reference a raw magenta ramp step. */\n/* -------------------------------------------------------------------- */\n\nconst infoTipTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--card)]',\n 'ds:text-[var(--accent)]',\n // Single ring: the Lucide Info glyph draws its own accent circle, so the\n // trigger carries NO CSS border of its own (a border would read as a\n // second, concentric ring). The white circle comes from `bg-card` showing\n // through the glyph, lifted by the drop shadow.\n 'ds:shadow-[var(--shadow-sm)]',\n 'ds:cursor-pointer',\n 'ds:transition-[color,box-shadow] ds:motion-reduce:transition-none',\n 'ds:hover:text-[var(--accent-hover)] ds:hover:shadow-[var(--shadow-md)]',\n 'ds:data-[state=open]:text-[var(--accent-hover)] ds:data-[state=open]:shadow-[var(--shadow-md)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n // Both diameters sit below `--min-target-size` (44/48px), so each\n // re-uses IconButton's invisible `::before` hit-area expansion to a\n // full touch target on touch / small screens. From the `sm:`\n // breakpoint up the pointer is precise, so the expansion relaxes —\n // but the interactive target must never fall below WCAG 2.5.8's 24px:\n // • md (24px visual) already meets the 24px floor, so its `::before`\n // is hidden on desktop and the 24px circle IS the target.\n // • sm (20px visual) would fall to 20px if hidden — below the floor\n // — so instead of hiding, its `::before` shrinks to a persistent\n // `--spacing-lg` (24px) minimum that holds on desktop too.\n sm: 'ds:w-5 ds:h-5 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:inset-x-[calc((var(--spacing-lg)-100%)/-2)] ds:sm:before:inset-y-[calc((var(--spacing-lg)-100%)/-2)]',\n md: 'ds:w-6 ds:h-6 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// Curated agent-readiness handle — see info-tip.agent.ts.\nexport interface InfoTipHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface InfoTipProps {\n /** Body of the tip — explanatory text shown in the floating card. */\n content: ReactNode;\n /** Optional heading rendered above the body. */\n heading?: ReactNode;\n /**\n * Trigger diameter. Also maps the floating card width:\n * `sm` → `--popover-size-sm`, `md` → `--popover-size-md`.\n */\n size?: 'sm' | 'md';\n /** Logical side the card opens on. Default `'top'`. */\n side?: 'start' | 'top' | 'end' | 'bottom';\n /** Alignment along the side axis. Default `'center'`. */\n align?: 'start' | 'center' | 'end';\n /**\n * Accessible name for the trigger. Defaults to the translated\n * \"More information\" chrome string.\n */\n 'aria-label'?: string;\n /**\n * Opaque instance id — emitted as `data-component-id` on the trigger and\n * used to register the instance with the host agent registry.\n */\n id?: string;\n /** Extra classes merged onto the trigger button. */\n className?: string;\n}\n\n/**\n * InfoTip — a deliberate, branded \"more information\" affordance: a small\n * circular trigger that reveals an explanatory card on hover **and** click\n * (click also serves touch devices). Composes the kit Popover in\n * `openOn=\"hover-or-click\"` mode — hover intent, keyboard focus, Escape and\n * focus-return are all handled by the Popover/Radix layer.\n */\nexport const InfoTip = forwardRef<HTMLButtonElement, InfoTipProps>(\n (\n {\n content,\n heading,\n size = 'md',\n side = 'top',\n align = 'center',\n 'aria-label': ariaLabelProp,\n id,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const [open, setOpen] = useState(false);\n\n // Agent handle.\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const agentHandle = useMemo<InfoTipHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [],\n );\n useAgentRegistration(infoTipAgent, agentHandle, id);\n\n // Press bookkeeping. In hover-or-click mode the Popover opens as soon as\n // the trigger receives focus — which happens on pointerdown, BEFORE the\n // click event that Radix uses to toggle. Without intervention every\n // click/tap on a closed tip opens it (focus) and instantly toggles it\n // closed again (click). So each press (pointerdown, or Enter/Space)\n // snapshots the open state and the click handler consumes it: if the\n // press itself opened the card, swallow Radix's toggle so the card stays\n // open; if it was already open, let the toggle close it.\n //\n // `null` means \"no press recorded for this click\" — an orphan click\n // (programmatic .click(), or assistive tech dispatching click with no\n // pointer/key event). Those must fall through to Radix's default toggle\n // rather than read a stale snapshot, so the guard treats `null` as\n // \"don't suppress\" and every click clears the snapshot back to `null`.\n const pressStateRef = useRef<boolean | null>(null);\n const handlePressStart = () => {\n pressStateRef.current = openRef.current;\n };\n\n const ariaLabel =\n ariaLabelProp ?? t('infoTip.triggerLabel', 'More information');\n\n return (\n <Popover openOn=\"hover-or-click\" open={open} onOpenChange={setOpen}>\n <Popover.Trigger\n ref={ref}\n aria-label={ariaLabel}\n className={infoTipTriggerVariants({ size, className })}\n data-component=\"info-tip\"\n data-component-id={id}\n onPointerDown={handlePressStart}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n handlePressStart();\n }\n }}\n onClick={(event) => {\n // Consume this click's press snapshot. A genuine pointer/keyboard\n // press recorded `false`/`true` on press-start; an orphan click\n // with no preceding pointerdown/keydown finds `null` and is left\n // to Radix's default toggle.\n const wasOpenAtPressStart = pressStateRef.current;\n pressStateRef.current = null;\n if (wasOpenAtPressStart === false && openRef.current) {\n // This press opened the card via focus — keep it open and\n // skip Radix's click toggle.\n event.preventDefault();\n }\n }}\n >\n <Info\n aria-hidden=\"true\"\n // Fills the circle so the glyph's own ring IS the trigger's\n // visible edge and the drop shadow hugs it.\n className={size === 'sm' ? 'ds:size-5' : 'ds:size-6'}\n />\n </Popover.Trigger>\n <Popover.Content\n side={side}\n align={align}\n size={size === 'sm' ? 'sm' : 'md'}\n // The card is a Radix `role=\"dialog\"` surface, which axe requires\n // to have an accessible name (aria-dialog-name). With a heading,\n // Popover wires aria-labelledby; without one, fall back to the\n // trigger's label.\n aria-label={heading == null ? ariaLabel : undefined}\n // Toggletip focus contract: the card is explanatory text, never\n // interactive, so focus stays on the trigger for the whole\n // open/close cycle. Preventing the open move also keeps Escape\n // reliable — if Radix pulled focus into the card, closing would\n // refocus the trigger and re-fire the hover-mode focus handler,\n // reopening the card it just closed. Preventing the close move\n // keeps an unhover-close from stealing focus mid-task.\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n >\n {heading != null && <Popover.Heading>{heading}</Popover.Heading>}\n <Popover.Description>{content}</Popover.Description>\n </Popover.Content>\n </Popover>\n );\n },\n);\n\nInfoTip.displayName = 'InfoTip';\n"],"names":["infoTipAgent","handle","infoTipTriggerVariants","cva","InfoTip","forwardRef","content","heading","size","side","align","ariaLabelProp","id","className","ref","t","useTranslation","open","setOpen","useState","openRef","useRef","useEffect","agentHandle","useMemo","useAgentRegistration","pressStateRef","handlePressStart","ariaLabel","Popover","jsx","event","wasOpenAtPressStart","Info","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"info-tip-CJpNpzZe.js","sources":["../../src/components/info-tip/info-tip.agent.ts","../../src/components/info-tip/info-tip.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { InfoTipHandle } from './info-tip';\n\nexport const infoTipAgent: AgentAdapter<InfoTipHandle> = {\n id: 'info-tip',\n capabilities: ['open', 'close'],\n state: {\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.infoTip.state.isOpen',\n description: 'True when the info tip card is currently open.',\n read: (handle) => handle.getIsOpen(),\n },\n },\n actions: {\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.infoTip.actions.open',\n description: 'Open the info tip card.',\n invoke: (handle) => {\n handle.open();\n },\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.infoTip.actions.close',\n description: 'Close the info tip card.',\n invoke: (handle) => {\n handle.close();\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'info-tip',\n description: 'Marks the InfoTip trigger button.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop on InfoTip.',\n },\n },\n};\n","import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info } from 'lucide-react';\nimport { Popover } from '../popover';\nimport { useAgentRegistration } from '../../agent';\nimport { infoTipAgent } from './info-tip.agent';\n\n/* -------------------------------------------------------------------- */\n/* Trigger — a small circular, branded affordance: card surface inside */\n/* the circle, accent ring + accent \"i\" glyph, and a soft drop shadow. */\n/* The accent alias is safe here: `--accent` resolves to magenta-700 in */\n/* light mode (the AA-safe interactive step) and the dark accent on dark */\n/* surfaces — never reference a raw magenta ramp step. */\n/* -------------------------------------------------------------------- */\n\nconst infoTipTriggerVariants = cva(\n [\n 'ds:relative ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--card)]',\n 'ds:text-[var(--accent)]',\n // Single ring: the Lucide Info glyph draws its own accent circle, so the\n // trigger carries NO CSS border of its own (a border would read as a\n // second, concentric ring). The white circle comes from `bg-card` showing\n // through the glyph, lifted by the drop shadow.\n 'ds:shadow-[var(--shadow-sm)]',\n 'ds:cursor-pointer',\n 'ds:transition-[color,box-shadow] ds:motion-reduce:transition-none',\n 'ds:hover:text-[var(--accent-hover)] ds:hover:shadow-[var(--shadow-md)]',\n 'ds:data-[state=open]:text-[var(--accent-hover)] ds:data-[state=open]:shadow-[var(--shadow-md)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid ds:focus-visible:outline-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n size: {\n // Both diameters sit below `--min-target-size` (44/48px), so each\n // re-uses IconButton's invisible `::before` hit-area expansion to a\n // full touch target on touch / small screens. From the `sm:`\n // breakpoint up the pointer is precise, so the expansion relaxes —\n // but the interactive target must never fall below WCAG 2.5.8's 24px:\n // • md (24px visual) already meets the 24px floor, so its `::before`\n // is hidden on desktop and the 24px circle IS the target.\n // • sm (20px visual) would fall to 20px if hidden — below the floor\n // — so instead of hiding, its `::before` shrinks to a persistent\n // `--spacing-lg` (24px) minimum that holds on desktop too.\n sm: 'ds:w-5 ds:h-5 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:inset-x-[calc((var(--spacing-lg)-100%)/-2)] ds:sm:before:inset-y-[calc((var(--spacing-lg)-100%)/-2)]',\n md: 'ds:w-6 ds:h-6 ds:before:absolute ds:before:inset-x-[calc((var(--min-target-size)-100%)/-2)] ds:before:inset-y-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"] ds:sm:before:hidden',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\n// Curated agent-readiness handle — see info-tip.agent.ts.\nexport interface InfoTipHandle {\n getIsOpen: () => boolean;\n open: () => void;\n close: () => void;\n}\n\nexport interface InfoTipProps {\n /** Body of the tip — explanatory text shown in the floating card. */\n content: ReactNode;\n /** Optional heading rendered above the body. */\n heading?: ReactNode;\n /**\n * Trigger diameter. Also maps the floating card width:\n * `sm` → `--popover-size-sm`, `md` → `--popover-size-md`.\n */\n size?: 'sm' | 'md';\n /** Logical side the card opens on. Default `'top'`. */\n side?: 'start' | 'top' | 'end' | 'bottom';\n /** Alignment along the side axis. Default `'center'`. */\n align?: 'start' | 'center' | 'end';\n /**\n * Accessible name for the trigger. Defaults to the translated\n * \"More information\" chrome string.\n */\n 'aria-label'?: string;\n /**\n * Opaque instance id — emitted as `data-component-id` on the trigger and\n * used to register the instance with the host agent registry.\n */\n id?: string;\n /** Extra classes merged onto the trigger button. */\n className?: string;\n}\n\n/**\n * InfoTip — a deliberate, branded \"more information\" affordance: a small\n * circular trigger that reveals an explanatory card on hover **and** click\n * (click also serves touch devices). Composes the kit Popover in\n * `openOn=\"hover-or-click\"` mode — hover intent, keyboard focus, Escape and\n * focus-return are all handled by the Popover/Radix layer.\n */\nexport const InfoTip = forwardRef<HTMLButtonElement, InfoTipProps>(\n (\n {\n content,\n heading,\n size = 'md',\n side = 'top',\n align = 'center',\n 'aria-label': ariaLabelProp,\n id,\n className,\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const [open, setOpen] = useState(false);\n\n // Agent handle.\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const agentHandle = useMemo<InfoTipHandle>(\n () => ({\n getIsOpen: () => openRef.current,\n open: () => setOpen(true),\n close: () => setOpen(false),\n }),\n [],\n );\n useAgentRegistration(infoTipAgent, agentHandle, id);\n\n // Press bookkeeping. In hover-or-click mode the Popover opens as soon as\n // the trigger receives focus — which happens on pointerdown, BEFORE the\n // click event that Radix uses to toggle. Without intervention every\n // click/tap on a closed tip opens it (focus) and instantly toggles it\n // closed again (click). So each press (pointerdown, or Enter/Space)\n // snapshots the open state and the click handler consumes it: if the\n // press itself opened the card, swallow Radix's toggle so the card stays\n // open; if it was already open, let the toggle close it.\n //\n // `null` means \"no press recorded for this click\" — an orphan click\n // (programmatic .click(), or assistive tech dispatching click with no\n // pointer/key event). Those must fall through to Radix's default toggle\n // rather than read a stale snapshot, so the guard treats `null` as\n // \"don't suppress\" and every click clears the snapshot back to `null`.\n const pressStateRef = useRef<boolean | null>(null);\n const handlePressStart = () => {\n pressStateRef.current = openRef.current;\n };\n\n const ariaLabel =\n ariaLabelProp ?? t('infoTip.triggerLabel', 'More information');\n\n return (\n <Popover openOn=\"hover-or-click\" open={open} onOpenChange={setOpen}>\n <Popover.Trigger\n ref={ref}\n aria-label={ariaLabel}\n className={infoTipTriggerVariants({ size, className })}\n data-component=\"info-tip\"\n data-component-id={id}\n onPointerDown={handlePressStart}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n handlePressStart();\n }\n }}\n onClick={(event) => {\n // Consume this click's press snapshot. A genuine pointer/keyboard\n // press recorded `false`/`true` on press-start; an orphan click\n // with no preceding pointerdown/keydown finds `null` and is left\n // to Radix's default toggle.\n const wasOpenAtPressStart = pressStateRef.current;\n pressStateRef.current = null;\n if (wasOpenAtPressStart === false && openRef.current) {\n // This press opened the card via focus — keep it open and\n // skip Radix's click toggle.\n event.preventDefault();\n }\n }}\n >\n <Info\n aria-hidden=\"true\"\n // Fills the circle so the glyph's own ring IS the trigger's\n // visible edge and the drop shadow hugs it.\n className={size === 'sm' ? 'ds:size-5' : 'ds:size-6'}\n />\n </Popover.Trigger>\n <Popover.Content\n side={side}\n align={align}\n size={size === 'sm' ? 'sm' : 'md'}\n // The card is a Radix `role=\"dialog\"` surface, which axe requires\n // to have an accessible name (aria-dialog-name). With a heading,\n // Popover wires aria-labelledby; without one, fall back to the\n // trigger's label.\n aria-label={heading == null ? ariaLabel : undefined}\n // Toggletip focus contract: the card is explanatory text, never\n // interactive, so focus stays on the trigger for the whole\n // open/close cycle. Preventing the open move also keeps Escape\n // reliable — if Radix pulled focus into the card, closing would\n // refocus the trigger and re-fire the hover-mode focus handler,\n // reopening the card it just closed. Preventing the close move\n // keeps an unhover-close from stealing focus mid-task.\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n >\n {heading != null && <Popover.Heading>{heading}</Popover.Heading>}\n <Popover.Description>{content}</Popover.Description>\n </Popover.Content>\n </Popover>\n );\n },\n);\n\nInfoTip.displayName = 'InfoTip';\n"],"names":["infoTipAgent","handle","infoTipTriggerVariants","cva","InfoTip","forwardRef","content","heading","size","side","align","ariaLabelProp","id","className","ref","t","useTranslation","open","setOpen","useState","openRef","useRef","useEffect","agentHandle","useMemo","useAgentRegistration","pressStateRef","handlePressStart","ariaLabel","Popover","jsx","event","wasOpenAtPressStart","Info","jsxs"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { jsx as a, jsxs as i, Fragment as y } from "react/jsx-runtime";
2
- import { forwardRef as g, useState as f, useCallback as K } from "react";
3
- import { c as h } from "./index-D2ZczOXr.js";
1
+ import { jsx as a, jsxs as i, Fragment as f } from "react/jsx-runtime";
2
+ import { forwardRef as h, useState as y, useCallback as K } from "react";
3
+ import { c as v } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as T } from "react-i18next";
5
5
  import { I as j } from "./icon-button-COX76Jdj.js";
6
6
  import { C as _ } from "./check-DrFSN__t.js";
7
7
  import { C as A } from "./copy-vRpqqHtY.js";
8
- const B = h(
8
+ const B = v(
9
9
  "type-body ds:text-foreground ds:min-w-0 ds:[unicode-bidi:isolate]",
10
10
  {
11
11
  variants: {
@@ -47,7 +47,7 @@ const B = h(
47
47
  mono: !1
48
48
  }
49
49
  }
50
- ), L = h("ds:flex", {
50
+ ), L = v("ds:flex", {
51
51
  variants: {
52
52
  layout: {
53
53
  horizontal: "ds:flex-row ds:items-center ds:gap-[var(--spacing-sm)]",
@@ -66,25 +66,25 @@ const B = h(
66
66
  layout: "horizontal",
67
67
  hasIcon: !1
68
68
  }
69
- }), S = g(
69
+ }), S = h(
70
70
  ({
71
71
  label: t,
72
72
  labelNode: l,
73
73
  value: e,
74
74
  layout: s = "horizontal",
75
75
  alignValue: n = "start",
76
- mono: v = !1,
76
+ mono: g = !1,
77
77
  copyable: k = !1,
78
78
  copyText: x,
79
79
  icon: d,
80
80
  className: V,
81
81
  ...C
82
82
  }, z) => {
83
- const { t: o } = T("ui"), [N, p] = f(!1), [b, r] = f(""), c = x ?? (typeof e == "string" ? e : void 0), w = K(async () => {
83
+ const { t: o } = T("ui"), [N, u] = y(!1), [b, r] = y(""), c = x ?? (typeof e == "string" ? e : void 0), w = K(async () => {
84
84
  if (c)
85
85
  try {
86
- await navigator.clipboard.writeText(c), p(!0), r(o("keyValuePair.copied")), setTimeout(() => {
87
- p(!1), r("");
86
+ await navigator.clipboard.writeText(c), u(!0), r(o("keyValuePair.copied")), setTimeout(() => {
87
+ u(!1), r("");
88
88
  }, 2e3);
89
89
  } catch {
90
90
  r(o("keyValuePair.notAvailable")), setTimeout(() => r(""), 3e3);
@@ -92,8 +92,8 @@ const B = h(
92
92
  }, [c, o]), P = B({
93
93
  layout: s,
94
94
  alignValue: n,
95
- mono: v
96
- }), u = d != null, I = "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0 ds:flex-1", m = /* @__PURE__ */ i(y, { children: [
95
+ mono: g
96
+ }), m = d != null, I = "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0 ds:flex-1", p = /* @__PURE__ */ i(f, { children: [
97
97
  /* @__PURE__ */ i("span", { className: "type-label ds:text-muted-foreground ds:shrink-0", children: [
98
98
  l ?? t,
99
99
  /* @__PURE__ */ a("span", { className: "ds:sr-only", children: ": " })
@@ -122,11 +122,12 @@ const B = h(
122
122
  "div",
123
123
  {
124
124
  ref: z,
125
- className: L({ layout: s, hasIcon: u, className: V }),
125
+ className: L({ layout: s, hasIcon: m, className: V }),
126
126
  "data-component": "key-value-pair",
127
+ "data-has-icon": m ? "" : void 0,
127
128
  ...C,
128
129
  children: [
129
- u ? /* @__PURE__ */ i(y, { children: [
130
+ m ? /* @__PURE__ */ i(f, { children: [
130
131
  /* @__PURE__ */ a(
131
132
  "span",
132
133
  {
@@ -135,8 +136,8 @@ const B = h(
135
136
  children: d
136
137
  }
137
138
  ),
138
- s === "horizontal" ? m : /* @__PURE__ */ a("div", { className: I, children: m })
139
- ] }) : m,
139
+ s === "horizontal" ? p : /* @__PURE__ */ a("div", { className: I, children: p })
140
+ ] }) : p,
140
141
  /* @__PURE__ */ a("span", { role: "status", "aria-live": "polite", className: "ds:sr-only", children: b })
141
142
  ]
142
143
  }
@@ -148,14 +149,19 @@ const F = {
148
149
  sm: "ds:gap-y-[var(--spacing-sm)]",
149
150
  md: "ds:gap-y-[var(--spacing-md)]",
150
151
  lg: "ds:gap-y-[var(--spacing-lg)]"
151
- }, G = g(
152
+ }, G = h(
152
153
  ({ children: t, className: l, rowGap: e = "md", ...s }, n) => /* @__PURE__ */ a(
153
154
  "div",
154
155
  {
155
156
  ref: n,
156
157
  "data-component": "key-value-list",
157
158
  className: [
158
- "ds:grid ds:grid-cols-[auto_auto_minmax(0,1fr)]",
159
+ // The label track reads a custom property, and an icon list only
160
+ // sets that property: it never re-declares the template, so a
161
+ // host's own column layout (PatientSummaryCard's two fields per
162
+ // row from 672px) still wins exactly as before.
163
+ "ds:grid ds:grid-cols-[auto_var(--kvl-label-track,auto)_minmax(0,1fr)]",
164
+ "ds:has-[>[data-has-icon]]:[--kvl-label-track:fit-content(40%)]",
159
165
  "ds:gap-x-[var(--spacing-md)]",
160
166
  F[e],
161
167
  // Each direct `data-component="key-value-pair"` child becomes
@@ -186,4 +192,4 @@ export {
186
192
  G as K,
187
193
  S as a
188
194
  };
189
- //# sourceMappingURL=key-value-pair-Ax8IJr1M.js.map
195
+ //# sourceMappingURL=key-value-pair-BNNITp6S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-value-pair-BNNITp6S.js","sources":["../../src/components/key-value-pair/key-value-pair.tsx"],"sourcesContent":["import { forwardRef, useState, useCallback, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Copy, Check } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\n\n/* ------------------------------------------------------------------ */\n/* CVA — root wrapper */\n/* */\n/* The layout variants below describe the LOGICAL flow of label/value. */\n/* When an `icon` prop is supplied, the root flips to `flex-row` and */\n/* renders the icon at the leading edge regardless of the chosen */\n/* layout — the layout then governs the inner label/value stack. Cap- */\n/* height alignment is handled by `items-start` + a small `mt` offset */\n/* on the icon wrapper so a wrapping value doesn't push the icon */\n/* downward. */\n/* ------------------------------------------------------------------ */\n\n/* ------------------------------------------------------------------ */\n/* CVA — value cell */\n/* */\n/* `alignValue` decides whether the value starts beside the label or */\n/* is pinned to the inline-end of the row. Pinning matters when a */\n/* column of rows carries one comparable figure (a price, a count): */\n/* left where it falls, its position shifts with the label width and */\n/* the eye can't run down it. */\n/* */\n/* Standalone, the value is a flex sibling — `start` lets it absorb */\n/* the free space, `end` pushes it over with an auto inline margin. */\n/* Inside a `<KeyValueList>` the value is a grid item in the third */\n/* track (`minmax(0,1fr)`), where the same auto margin pins it to the */\n/* track's end. One pair of classes covers both. */\n/* */\n/* Horizontal only. In `vertical` the value already sits below the */\n/* label with nothing to pin against, so `alignValue` is a documented */\n/* no-op there rather than a surprise. */\n/* ------------------------------------------------------------------ */\n\nconst keyValuePairValueVariants = cva(\n 'type-body ds:text-foreground ds:min-w-0 ds:[unicode-bidi:isolate]',\n {\n variants: {\n layout: {\n horizontal: '',\n vertical: 'ds:shrink',\n },\n alignValue: {\n start: '',\n end: '',\n },\n mono: {\n true: 'ds:font-[family-name:var(--font-mono)]',\n false: '',\n },\n },\n compoundVariants: [\n // `flex-1` lets the value absorb the remaining inline space when\n // the KVP root flexes icon / label / value as direct siblings.\n // Without it the value shrinks to its content width and the row\n // leaves inline-end whitespace.\n {\n layout: 'horizontal',\n alignValue: 'start',\n class: 'ds:flex-1 ds:shrink',\n },\n // Pinned: drop `flex-1` so the cell is content-width, then let an\n // auto inline-start margin eat the slack. `ms-*` is the logical\n // spelling, so this flips correctly in a right-to-left locale.\n {\n layout: 'horizontal',\n alignValue: 'end',\n class: 'ds:ms-auto ds:shrink-0',\n },\n ],\n defaultVariants: {\n layout: 'horizontal',\n alignValue: 'start',\n mono: false,\n },\n },\n);\n\nconst keyValuePairVariants = cva('ds:flex', {\n variants: {\n layout: {\n horizontal: 'ds:flex-row ds:items-center ds:gap-[var(--spacing-sm)]',\n vertical: 'ds:flex-col ds:gap-[var(--spacing-xs)]',\n },\n /** Internal — flips the root to a horizontal flex when an icon\n is present so the icon can sit at the leading edge of both\n horizontal and vertical inner stacks. `items-start` keeps the\n icon anchored to the label row even when the value wraps. */\n hasIcon: {\n true: 'ds:flex-row ds:items-start ds:gap-[var(--spacing-sm)]',\n false: '',\n },\n },\n defaultVariants: {\n layout: 'horizontal',\n hasIcon: false,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* KeyValuePairProps */\n/* ------------------------------------------------------------------ */\n\nexport interface KeyValuePairProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n Omit<VariantProps<typeof keyValuePairVariants>, 'hasIcon'> {\n /** The label (term). Stays a string: it is interpolated into the copy\n * button's accessible name, where a node would render \"[object Object]\". */\n label: string;\n /**\n * Display-only override for the rendered label — a node when the term needs\n * more than text (a PHI lock beside it, a badge). `label` is still required\n * and remains the string every accessible name is built from.\n */\n labelNode?: React.ReactNode;\n /** The value — accepts plain text, Badge, Tag, monospace code, any ReactNode */\n value: React.ReactNode;\n /** Layout direction */\n layout?: 'horizontal' | 'vertical';\n /** Render value in monospace font */\n mono?: boolean;\n /**\n * Where the value sits on the row.\n *\n * `start` (default) keeps the existing behaviour — the value begins\n * immediately after the label and absorbs the remaining width.\n *\n * `end` pins the value to the inline-end of the row, so its position\n * no longer moves with the label's length. Use it for the one\n * comparable figure in a list of rows — a price, a count, a score —\n * where a reader wants to scan down a column rather than read each\n * line. Pinning every row defeats the point.\n *\n * Horizontal layout only: in `vertical` the value already sits below\n * the label, so there is nothing to pin against and this is ignored.\n */\n alignValue?: 'start' | 'end';\n /** Show a copy-to-clipboard IconButton beside the value */\n copyable?: boolean;\n /** The text to copy — defaults to `value` if value is a string */\n copyText?: string;\n /**\n * Optional decorative icon rendered at the leading edge of the pair.\n * Pass a `lucide-react` icon (or any single React element) for\n * visual consistency. The wrapper applies `aria-hidden=\"true\"` and\n * paints the icon with `var(--key-value-pair-icon-color)` (defaults\n * to `--muted-foreground`); consumers can recolour the slot via\n * that token without forking the component.\n *\n * Cap-height alignment with the label is automatic — the wrapper\n * uses `mt-0.5` so the glyph rides the label row, not the\n * geometric centre of a wrapping value.\n *\n * Type is `ReactElement` (not the broader `ReactNode`) so the\n * intent is clear at the call site: this slot is for a single\n * SVG/icon, not arbitrary fragments, strings, or numbers.\n */\n icon?: React.ReactElement | null;\n}\n\n/* ------------------------------------------------------------------ */\n/* KeyValuePair */\n/* ------------------------------------------------------------------ */\n\nexport const KeyValuePair = forwardRef<HTMLDivElement, KeyValuePairProps>(\n (\n {\n label,\n labelNode,\n value,\n layout = 'horizontal',\n alignValue = 'start',\n mono = false,\n copyable = false,\n copyText,\n icon,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation('ui');\n const [copied, setCopied] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n const textToCopy =\n copyText ?? (typeof value === 'string' ? value : undefined);\n\n const handleCopy = useCallback(async () => {\n if (!textToCopy) {\n if (import.meta.env.DEV) {\n console.warn(\n 'KeyValuePair: copyable is true but no copyText was provided and value is not a string. Copy no-op.',\n );\n }\n return;\n }\n\n try {\n await navigator.clipboard.writeText(textToCopy);\n setCopied(true);\n setAnnouncement(t('keyValuePair.copied'));\n setTimeout(() => {\n setCopied(false);\n setAnnouncement('');\n }, 2000);\n } catch {\n setAnnouncement(t('keyValuePair.notAvailable'));\n setTimeout(() => setAnnouncement(''), 3000);\n }\n }, [textToCopy, t]);\n\n const valueClasses = keyValuePairValueVariants({\n layout,\n alignValue,\n mono,\n });\n\n const hasIcon = icon !== undefined && icon !== null;\n\n // Inner stack — used ONLY for `layout=\"vertical\"` when an icon is\n // present (icon on the leading edge, label-on-top-of-value stacked\n // next to it). For `layout=\"horizontal\"` we render the icon /\n // label / value as direct flex children of the root — wrapping\n // them in a single `<div>` would break the KeyValueList subgrid\n // (the subgrid's 3 tracks would collapse to 2: the wrapper +\n // icon). See the conditional below.\n const innerStackClass =\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:min-w-0 ds:flex-1';\n\n const stack = (\n <>\n <span className=\"type-label ds:text-muted-foreground ds:shrink-0\">\n {labelNode ?? label}\n <span className=\"ds:sr-only\">: </span>\n </span>\n <span className={valueClasses}>{value}</span>\n {copyable && (\n <IconButton\n icon={copied ? <Check /> : <Copy />}\n size=\"sm\"\n aria-label={t('keyValuePair.copy', { label })}\n onClick={handleCopy}\n intent=\"ghost\"\n className={\n layout === 'horizontal'\n ? // Only one element on the row may claim the slack. When\n // the value is pinned it has already taken it with its\n // own `ms-auto`; a second auto margin here would split\n // the free space between them and strand the value in\n // the middle of the row instead of at its end.\n alignValue === 'end'\n ? 'ds:shrink-0'\n : 'ds:ms-auto ds:shrink-0'\n : 'ds:self-start'\n }\n />\n )}\n </>\n );\n\n return (\n <div\n ref={ref}\n className={keyValuePairVariants({ layout, hasIcon, className })}\n data-component=\"key-value-pair\"\n data-has-icon={hasIcon ? '' : undefined}\n {...props}\n >\n {hasIcon ? (\n <>\n {/* Decorative icon wrapper. `aria-hidden` so SR users only\n hear \"<label>: <value>\" — the icon is brand polish,\n not semantic content.\n\n `translate-y` shifts the icon down by 2px visually so\n its centre lines up with the label's x-height centre.\n In a baseline-aligned subgrid row, the icon's margin-\n box bottom pins to the label's text baseline — that\n leaves the 16px SVG sitting visually 3-4px above the\n label's centre. `translate-y` adjusts only the paint\n position; the underlying baseline math still holds,\n so multi-line value cells (e.g. address + map link)\n stay correctly aligned with the FIRST line of the\n value. */}\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:shrink-0 ds:translate-y-0.5 ds:text-[color:var(--key-value-pair-icon-color)] ds:[&_svg]:size-4\"\n >\n {icon}\n </span>\n {/* `horizontal` layout: render label / value / copy as\n direct flex children of the root so each piece falls\n into its own track when this KVP is promoted to a\n subgrid row by `<KeyValueList>`. Wrapping them in a\n `<div>` here would collapse the subgrid's 3 tracks\n (icon | label | value) to 2 (icon | wrapper) and labels\n across rows would no longer share a column. The root's\n `flex flex-row` + `gap-sm` keeps the standalone visual\n identical.\n\n `vertical` layout still needs the wrapper because the\n stack is column-flow — label-on-top-of-value next to\n the icon. */}\n {layout === 'horizontal' ? (\n stack\n ) : (\n <div className={innerStackClass}>{stack}</div>\n )}\n </>\n ) : (\n stack\n )}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {announcement}\n </span>\n </div>\n );\n },\n);\n\nKeyValuePair.displayName = 'KeyValuePair';\n\n/* ------------------------------------------------------------------ */\n/* KeyValueList — subgrid alignment for a column of KVP rows */\n/* */\n/* When several `<KeyValuePair>` rows live in the same card (practice */\n/* profile, settings panel, contact card, etc.), the per-row flex */\n/* layout means each row's label column has a different width. The */\n/* values end up zigzagged. Wrapping in `<KeyValueList>` puts all rows */\n/* into a single 3-column CSS subgrid (icon | label | value), so */\n/* labels share a column across rows and values start at the same */\n/* inline-start edge. */\n/* */\n/* Standalone `<KeyValuePair>` instances outside a `<KeyValueList>` */\n/* keep their existing per-row flex layout — no behaviour change for */\n/* consumers that didn't opt in. */\n/* ------------------------------------------------------------------ */\n\nexport interface KeyValueListProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Gap between rows. Maps to spacing tokens — defaults to `md`.\n * Smaller gaps suit dense settings panels; larger gaps suit\n * profile cards.\n */\n rowGap?: 'sm' | 'md' | 'lg';\n}\n\nconst rowGapClassMap: Record<\n NonNullable<KeyValueListProps['rowGap']>,\n string\n> = {\n sm: 'ds:gap-y-[var(--spacing-sm)]',\n md: 'ds:gap-y-[var(--spacing-md)]',\n lg: 'ds:gap-y-[var(--spacing-lg)]',\n};\n\nexport const KeyValueList = forwardRef<HTMLDivElement, KeyValueListProps>(\n ({ children, className, rowGap = 'md', ...props }, ref) => {\n // Three-column subgrid: icon | label | value.\n // - col 1: `auto` — width of the widest icon (or 0 if no rows have icons)\n // - col 2: `auto` — width of the widest label, shared across all rows.\n // When rows have icons the label sits here, beside a `1fr` value,\n // so a long one-line label (Albanian \"Me përvojë me pacientët e\n // ankthshëm\") took the whole width and left the value about 3px\n // on a phone. A list with icon rows caps it at `fit-content(40%)`\n // so the label wraps instead. Without icons the label and value\n // share the two `auto` tracks, which shrink together, so nothing\n // changes there.\n // - col 3: `minmax(0, 1fr)` — value flexes; `minmax` prevents the\n // value from forcing the grid wider than its container when the\n // value contains a long unbroken string (e.g. an email or URL).\n //\n // Each child `<KeyValuePair>` (which renders as a `<div>` with a\n // `data-component=\"key-value-pair\"` marker) is promoted into a\n // subgrid row by the CSS below — the cell boundaries align across\n // every direct child.\n //\n // We render as `<div>` (not `<dl>`): axe enforces \"dl can only\n // contain dt/dd\" and the inner KVP renders as a `<div>`. The KVP's\n // own SR markup (label + `<span class=\"sr-only\">: </span>` + value)\n // already conveys term-value semantics — wrapping in a `<dl>`\n // doesn't add anything the screen reader doesn't already get.\n return (\n <div\n ref={ref}\n data-component=\"key-value-list\"\n className={[\n // The label track reads a custom property, and an icon list only\n // sets that property: it never re-declares the template, so a\n // host's own column layout (PatientSummaryCard's two fields per\n // row from 672px) still wins exactly as before.\n 'ds:grid ds:grid-cols-[auto_var(--kvl-label-track,auto)_minmax(0,1fr)]',\n 'ds:has-[>[data-has-icon]]:[--kvl-label-track:fit-content(40%)]',\n 'ds:gap-x-[var(--spacing-md)]',\n rowGapClassMap[rowGap],\n // Each direct `data-component=\"key-value-pair\"` child becomes\n // a subgrid row spanning all three columns. The KVP's own\n // flex layout still works inside the cell (icon shrinks-0,\n // label shrinks-0, value flexes) — subgrid just aligns the\n // boundaries between siblings.\n 'ds:[&>[data-component=\"key-value-pair\"]]:grid',\n 'ds:[&>[data-component=\"key-value-pair\"]]:grid-cols-subgrid',\n 'ds:[&>[data-component=\"key-value-pair\"]]:col-span-3',\n 'ds:[&>[data-component=\"key-value-pair\"]]:items-baseline',\n // Unset the KVP's intra-row `gap-sm` so the subgrid inherits\n // the parent KeyValueList's `gap-x-md` for every track gap\n // (icon→label and label→value). `gap-0` here would override\n // the parent's gap and crowd the icon against the label;\n // `[gap:normal]` is the subgrid-spec way to defer to the\n // parent.\n 'ds:[&>[data-component=\"key-value-pair\"]]:[gap:normal]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nKeyValueList.displayName = 'KeyValueList';\n"],"names":["keyValuePairValueVariants","cva","keyValuePairVariants","KeyValuePair","forwardRef","label","labelNode","value","layout","alignValue","mono","copyable","copyText","icon","className","props","ref","t","useTranslation","copied","setCopied","useState","announcement","setAnnouncement","textToCopy","handleCopy","useCallback","valueClasses","hasIcon","innerStackClass","stack","jsxs","Fragment","jsx","IconButton","Check","Copy","rowGapClassMap","KeyValueList","children","rowGap"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { createElement as e } from "react";
2
- import { P as i } from "./pregnancy-dating-R3q5n1Wh.js";
3
- import { P as o } from "./pregnancy-weight-gain-DwmNklDU.js";
4
- import { G as r } from "./gestational-age-calculator-BfGpt3du.js";
5
- import { C as c } from "./cycle-calculator-Dgfqr4Q4.js";
2
+ import { P as i } from "./pregnancy-dating-BFzv9g1N.js";
3
+ import { P as o } from "./pregnancy-weight-gain-CUUrBTBo.js";
4
+ import { G as r } from "./gestational-age-calculator-CZi43xKG.js";
5
+ import { C as c } from "./cycle-calculator-Cww9DzIa.js";
6
6
  import { F as s } from "./fetal-weight-BWaqqjea.js";
7
7
  import { c as a } from "./createLucideIcon-DhHxpK9K.js";
8
8
  import { B as n } from "./baby-Dku-Xvg9.js";
@@ -91,4 +91,4 @@ const k = [
91
91
  export {
92
92
  I as k
93
93
  };
94
- //# sourceMappingURL=kit-extensions-C9-v8Dih.js.map
94
+ //# sourceMappingURL=kit-extensions-DYVxWcqv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kit-extensions-C9-v8Dih.js","sources":["../../node_modules/lucide-react/dist/esm/icons/calendar-heart.mjs","../../node_modules/lucide-react/dist/esm/icons/scale.mjs","../../src/components/rich-text-editor/kit-extensions.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M12.127 22H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.125\", key: \"vxdnp4\" }\n ],\n [\n \"path\",\n {\n d: \"M14.62 18.8A2.25 2.25 0 1 1 18 15.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z\",\n key: \"15cy7q\"\n }\n ],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }]\n];\nconst CalendarHeart = createLucideIcon(\"calendar-heart\", __iconNode);\n\nexport { __iconNode, CalendarHeart as default };\n//# sourceMappingURL=calendar-heart.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }],\n [\"path\", { d: \"m19 8 3 8a5 5 0 0 1-6 0zV7\", key: \"zcdpyk\" }],\n [\"path\", { d: \"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1\", key: \"1yorad\" }],\n [\"path\", { d: \"m5 8 3 8a5 5 0 0 1-6 0zV7\", key: \"eua70x\" }],\n [\"path\", { d: \"M7 21h10\", key: \"1b0cd5\" }]\n];\nconst Scale = createLucideIcon(\"scale\", __iconNode);\n\nexport { __iconNode, Scale as default };\n//# sourceMappingURL=scale.mjs.map\n","import { createElement } from 'react';\nimport { Baby, CalendarHeart, Heart, Scale } from 'lucide-react';\nimport { PregnancyDating } from '../pregnancy-dating';\nimport { PregnancyWeightGain } from '../pregnancy-weight-gain';\nimport { GestationalAgeCalculator } from '../gestational-age-calculator';\nimport { CycleCalculator } from '../cycle-calculator';\nimport { FetalWeight } from '../fetal-weight';\nimport type { EditorExtension } from './editor-extensions';\n\n/** Labels are resolved by the editor's useTranslation, including live locale changes. */\nexport const kitEditorExtensions: EditorExtension[] = [\n {\n id: 'pregnancy-dating',\n label: 'insert.title.pregnancyDating',\n icon: createElement(CalendarHeart),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(PregnancyDating, { onInsert: insert }),\n },\n {\n id: 'pregnancy-weight-gain',\n label: 'insert.title.weightGain',\n icon: createElement(Baby),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(PregnancyWeightGain, { onInsert: insert }),\n },\n {\n id: 'gestational-age-calculator',\n label: 'insert.title.gestationalAge',\n icon: createElement(Baby),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(GestationalAgeCalculator, { onInsert: insert }),\n },\n {\n id: 'cycle-calculator',\n label: 'insert.title.cycle',\n icon: createElement(Heart),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(CycleCalculator, { onInsert: insert }),\n },\n {\n id: 'fetal-weight',\n label: 'insert.title.fetalWeight',\n icon: createElement(Scale),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) => createElement(FetalWeight, { onInsert: insert }),\n },\n];\n"],"names":["__iconNode","CalendarHeart","createLucideIcon","Scale","kitEditorExtensions","createElement","insert","PregnancyDating","Baby","PregnancyWeightGain","GestationalAgeCalculator","Heart","CycleCalculator","FetalWeight"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB;AAAA,IACE;AAAA,IACA,EAAE,GAAG,qEAAqE,KAAK,SAAQ;AAAA,EAC3F;AAAA,EACE;AAAA,IACE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAK;AAAA,IACX;AAAA,EACA;AAAA,EACE,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,UAAU,KAAK,SAAQ,CAAE;AACzC,GACMC,IAAgBC,EAAiB,kBAAkBF,CAAU;ACzBnE;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,8BAA8B,KAAK,SAAQ,CAAE;AAAA,EAC3D,CAAC,QAAQ,EAAE,GAAG,4CAA4C,KAAK,SAAQ,CAAE;AAAA,EACzE,CAAC,QAAQ,EAAE,GAAG,6BAA6B,KAAK,SAAQ,CAAE;AAAA,EAC1D,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAC3C,GACMG,IAAQD,EAAiB,SAASF,CAAU,GCNrCI,IAAyC;AAAA,EACpD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMC,EAAcJ,CAAa;AAAA,IACjC,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAK,EAAA,MACTD,EAAcE,GAAiB,EAAE,UAAUD,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcG,CAAI;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAF,EAAA,MACTD,EAAcI,GAAqB,EAAE,UAAUH,EAAA,CAAQ;AAAA,EAAA;AAAA,EAE3D;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcG,CAAI;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAF,EAAA,MACTD,EAAcK,GAA0B,EAAE,UAAUJ,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEhE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcM,CAAK;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAL,EAAA,MACTD,EAAcO,GAAiB,EAAE,UAAUN,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcF,CAAK;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAG,EAAA,MAAaD,EAAcQ,GAAa,EAAE,UAAUP,EAAA,CAAQ;AAAA,EAAA;AAE3E;","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"kit-extensions-DYVxWcqv.js","sources":["../../node_modules/lucide-react/dist/esm/icons/calendar-heart.mjs","../../node_modules/lucide-react/dist/esm/icons/scale.mjs","../../src/components/rich-text-editor/kit-extensions.ts"],"sourcesContent":["/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n { d: \"M12.127 22H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.125\", key: \"vxdnp4\" }\n ],\n [\n \"path\",\n {\n d: \"M14.62 18.8A2.25 2.25 0 1 1 18 15.836a2.25 2.25 0 1 1 3.38 2.966l-2.626 2.856a.998.998 0 0 1-1.507 0z\",\n key: \"15cy7q\"\n }\n ],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M3 10h18\", key: \"8toen8\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }]\n];\nconst CalendarHeart = createLucideIcon(\"calendar-heart\", __iconNode);\n\nexport { __iconNode, CalendarHeart as default };\n//# sourceMappingURL=calendar-heart.mjs.map\n","/**\n * @license lucide-react v1.22.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }],\n [\"path\", { d: \"m19 8 3 8a5 5 0 0 1-6 0zV7\", key: \"zcdpyk\" }],\n [\"path\", { d: \"M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1\", key: \"1yorad\" }],\n [\"path\", { d: \"m5 8 3 8a5 5 0 0 1-6 0zV7\", key: \"eua70x\" }],\n [\"path\", { d: \"M7 21h10\", key: \"1b0cd5\" }]\n];\nconst Scale = createLucideIcon(\"scale\", __iconNode);\n\nexport { __iconNode, Scale as default };\n//# sourceMappingURL=scale.mjs.map\n","import { createElement } from 'react';\nimport { Baby, CalendarHeart, Heart, Scale } from 'lucide-react';\nimport { PregnancyDating } from '../pregnancy-dating';\nimport { PregnancyWeightGain } from '../pregnancy-weight-gain';\nimport { GestationalAgeCalculator } from '../gestational-age-calculator';\nimport { CycleCalculator } from '../cycle-calculator';\nimport { FetalWeight } from '../fetal-weight';\nimport type { EditorExtension } from './editor-extensions';\n\n/** Labels are resolved by the editor's useTranslation, including live locale changes. */\nexport const kitEditorExtensions: EditorExtension[] = [\n {\n id: 'pregnancy-dating',\n label: 'insert.title.pregnancyDating',\n icon: createElement(CalendarHeart),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(PregnancyDating, { onInsert: insert }),\n },\n {\n id: 'pregnancy-weight-gain',\n label: 'insert.title.weightGain',\n icon: createElement(Baby),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(PregnancyWeightGain, { onInsert: insert }),\n },\n {\n id: 'gestational-age-calculator',\n label: 'insert.title.gestationalAge',\n icon: createElement(Baby),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(GestationalAgeCalculator, { onInsert: insert }),\n },\n {\n id: 'cycle-calculator',\n label: 'insert.title.cycle',\n icon: createElement(Heart),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) =>\n createElement(CycleCalculator, { onInsert: insert }),\n },\n {\n id: 'fetal-weight',\n label: 'insert.title.fetalWeight',\n icon: createElement(Scale),\n kind: 'panel',\n contexts: ['note', 'diagnosis'],\n source: { kind: 'kit' },\n render: ({ insert }) => createElement(FetalWeight, { onInsert: insert }),\n },\n];\n"],"names":["__iconNode","CalendarHeart","createLucideIcon","Scale","kitEditorExtensions","createElement","insert","PregnancyDating","Baby","PregnancyWeightGain","GestationalAgeCalculator","Heart","CycleCalculator","FetalWeight"],"mappings":";;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB;AAAA,IACE;AAAA,IACA,EAAE,GAAG,qEAAqE,KAAK,SAAQ;AAAA,EAC3F;AAAA,EACE;AAAA,IACE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAK;AAAA,IACX;AAAA,EACA;AAAA,EACE,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,UAAU,KAAK,SAAQ,CAAE;AACzC,GACMC,IAAgBC,EAAiB,kBAAkBF,CAAU;ACzBnE;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,IAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,8BAA8B,KAAK,SAAQ,CAAE;AAAA,EAC3D,CAAC,QAAQ,EAAE,GAAG,4CAA4C,KAAK,SAAQ,CAAE;AAAA,EACzE,CAAC,QAAQ,EAAE,GAAG,6BAA6B,KAAK,SAAQ,CAAE;AAAA,EAC1D,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAC3C,GACMG,IAAQD,EAAiB,SAASF,CAAU,GCNrCI,IAAyC;AAAA,EACpD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMC,EAAcJ,CAAa;AAAA,IACjC,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAK,EAAA,MACTD,EAAcE,GAAiB,EAAE,UAAUD,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcG,CAAI;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAF,EAAA,MACTD,EAAcI,GAAqB,EAAE,UAAUH,EAAA,CAAQ;AAAA,EAAA;AAAA,EAE3D;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcG,CAAI;AAAA,IACxB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAF,EAAA,MACTD,EAAcK,GAA0B,EAAE,UAAUJ,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEhE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcM,CAAK;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAL,EAAA,MACTD,EAAcO,GAAiB,EAAE,UAAUN,EAAA,CAAQ;AAAA,EAAA;AAAA,EAEvD;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAMD,EAAcF,CAAK;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,CAAC,QAAQ,WAAW;AAAA,IAC9B,QAAQ,EAAE,MAAM,MAAA;AAAA,IAChB,QAAQ,CAAC,EAAE,QAAAG,EAAA,MAAaD,EAAcQ,GAAa,EAAE,UAAUP,EAAA,CAAQ;AAAA,EAAA;AAE3E;","x_google_ignoreList":[0,1]}
@@ -1,7 +1,7 @@
1
1
  import { jsx as u, jsxs as R } from "react/jsx-runtime";
2
2
  import { useState as x, useEffect as w, useCallback as W, useMemo as E, useRef as ee } from "react";
3
3
  import { useGridFilter as V } from "ag-grid-react";
4
- import { D as te } from "./date-range-picker-BOvHwWO5.js";
4
+ import { D as te } from "./date-range-picker-CFk-5O3R.js";
5
5
  import { useTranslation as M } from "react-i18next";
6
6
  import { C as le } from "./checkbox--ndmyokr.js";
7
7
  import { B as j } from "./button-Bn16lcFM.js";
@@ -864,4 +864,4 @@ export {
864
864
  Ke as g,
865
865
  k as h
866
866
  };
867
- //# sourceMappingURL=link-cell-renderer-DlBVPMTi.js.map
867
+ //# sourceMappingURL=link-cell-renderer-CxW_oLa5.js.map